OmniAICreator/Qiita-1.07M huggingface dataset:
奇跡体験！アンビリバボー

# 事の発端

たまたまTwitterでこちらのアカウントを見つけて、実際にどれぐらいの確率で揃うのか疑問に思った。
https://twitter.com/kiseki_unb

仕組みとしては、「奇跡体験」の部分がそれぞれ「奇、跡、体、験」の4通り、アンビリバボーの「ア」「ビ」「リ」「バ」「ボ」の部分がそれぞれ「ア、ビ、リ、バ、ボ」の5通りで、それ以外の「！」「ン」「ー」の部分は固定になっている。
よって、単純計算だと4^4 × 5^5で**800000通り**となる。

実際のアルゴリズムがどうなっているかは不明だが、各文字が出力される確率が同様に確からしいと仮定して検証してみる。

```python:奇跡体験！アンビリバボー

import random

kisekitaiken = ["奇", "跡", "体", "験"]
unbelievable = ["ア", "ビ", "リ", "バ", "ボ"]
count = 0

for _ in range(3000000): #無限ループによるマシンクラッシュを避けるため、ループ上限を300万とする
    k_choice1 = random.choice(kisekitaiken)
    k_choice2 = random.choice(kisekitaiken)
    k_choice3 = random.choice(kisekitaiken)
    k_choice4 = random.choice(kisekitaiken)

    u_choice1 = random.choice(unbelievable)
    u_choice2 = random.choice(unbelievable)
    u_choice3 = random.choice(unbelievable)
    u_choice4 = random.choice(unbelievable)
    u_choice5 = random.choice(unbelievable)

    outputs = "{}{}{}{}!{}ン{}{}{}{}ー".format(k_choice1, k_choice2, k_choice3, k_choice4,
                                              u_choice1, u_choice2, u_choice3, u_choice4, u_choice5)
    print(outputs)
    count += 1
    if outputs == "奇跡体験!アンビリバボー":
        print("{}回目で揃ったよ、やったね。".format(count))
        break
```

適当に10回ほど回していく

```text:1回目
...(略)
跡体跡体!ボンリバババー
験奇験体!リンアバアリー
奇跡体験!アンビリバボー
556973回目で揃ったよ、やったね。
```

```text:2回目
...(略)
体跡験奇!リンアビボアー
験験奇験!バンリアアバー
奇跡体験!アンビリバボー
1564878回目で揃ったよ、やったね。
```

```text:3回目
...(略)
奇験験奇!リンリボバリー
跡験奇体!ボンボリボバー
奇跡体験!アンビリバボー
207178回目で揃ったよ、やったね。
```

```text:4回目
...(略)
体跡奇跡!ビンボバアリー
奇体奇験!アンアビアボー
奇跡体験!アンビリバボー
2561840回目で揃ったよ、やったね。
```

```text:5回目
...(略)
跡験験奇!バンボアアアー
験験跡跡!バンバビリアー
奇跡体験!アンビリバボー
946982回目で揃ったよ、やったね。
```

```text:6回目
...(略)
験体体体!アンバビボボー
験験奇体!ボンアアボバー
奇跡体験!アンビリバボー
333516回目で揃ったよ、やったね。
```

```text:7回目
...(略)
験験跡跡!リンアビリアー
験体験体!バンビボリアー
奇跡体験!アンビリバボー
1569680回目で揃ったよ、やったね。
```

```text:8回目
...(略)
体験験体!リンアリアアー
跡跡奇奇!ボンババアビー
奇跡体験!アンビリバボー
704742回目で揃ったよ、やったね。
```

```text:9回目
...(略)
奇体跡跡!アンバビアバー
奇験奇奇!アンボバアボー
奇跡体験!アンビリバボー
588754回目で揃ったよ、やったね。
```

```text:10回目
...(略)
験跡験奇!バンボボバビー
験跡奇跡!アンリアボアー
奇跡体験!アンビリバボー
1099671回目で揃ったよ、やったね。
```



10回平均で**約1013421回**で揃うことがわかった。
もうちょっと試行回数を増やせばより精密な結果が得られるかも。

当記事執筆時点(2022/11/2)でこのアカウントは**約145万ツイート**しているが、まだ一度も揃っていない模様。
果たして揃う日は来るのだろうか...?
Laravel 9 Eloquent の設定（主キーの UUID への変更・タイムスタンプのミリ秒への変更)

備忘録として、UUID への変更と、タイムスタンプのミリ秒への変更についてまとめています。

※データベースは、MySQL を利用しています。

# 主キーの UUID への変更
## HasUuids トレイト
Laravel9 では、**[HasUuids](https://laravel.com/docs/9.x/eloquent#uuid-and-ulid-keys)** という名前のトレイトが用意されていおり、簡単に UUID へ変更できます。

[goldspecdigital](https://github.com/goldspecdigital/laravel-eloquent-uuid)などのライブラリの使用や、model への独自のコードの追加により、UUID へ変更する方法もありますが、今回は Laravel で用意されている **HasUuids** を使います。

## モデルファイルの変更
**HasUuids** トレイトを利用できるように変更します。
```diff_php:app/models/User.php
+ use Illuminate\Database\Eloquent\Concerns\HasUuids;
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
+   use HasUuids;
}
```
HasUuidsトレイトはデフォルトで、モデルに対し[順序付き(ordered)UUID](https://laravel.com/docs/9.x/helpers#method-str-ordered-uuid)を生成します。
もし、**バージョン4** の UUID を利用したい場合は、以下のコードを追加してください。
```diff_php:app/models/User.php
use Illuminate\Database\Eloquent\Concerns\HasUuids;
+ use Ramsey\Uuid\Uuid;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;
    use HasUuids;

+   public function newUniqueId()
+   {
+       return (string) Uuid::uuid4();
+   }

+   public function uniqueIds()
+   {
+        return ['id'];
+   }

}
```
さらに詳しく知りたい方は、[公式ドキュメント](https://laravel.com/docs/9.x/eloquent#uuid-and-ulid-keys)をご覧ください。

## 主キーを変更
マイグレーションファイルを変更します。
```diff_php:app/database/migrations/2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) {
-   $table->id();
+   $table->uuid('id')->primary();
    $table->string('name');
}
```
以上で、UUID への変更が完了です。

# ミリ秒への対応
Laravel では、時刻を保存する際、`2022-11-02 12:24:31.000` のように 小数点以下が 0 になります。

## $table->timestamps(); を変更
マイグレーションファイルを変更します。

ミリ秒への変更とは話がそれますが、データベースに MySQL を利用している場合、2038 年問題への対応として、timestamp 型から datetime 型に変更しておいた方が安全みたいなので、dateTime 型でミリ秒対応します。

PostgreSQL の場合、`$table->timestamps(3);` のように精度を指定するだけでいいかもしれません。
正直、詳しくないので、ご自身で調べてください。

```diff_php:app/database/migrations/2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) {
-   $table->timestamps();
+   $table->dateTime('created_at', 3)->nullable();
+   $table->dateTime('updated_at', 3)->nullable();
}
```

[$table->dateTime()](https://laravel.com/docs/9.x/migrations#column-method-dateTime) の第二引数に**精度**を指定します。

## モデルファイルの変更
マイグレーションファイルの変更だけでは、モデルを利用してデータベースに保存する際にミリ秒にならないので、モデルファイルも変更します。
```diff_php:app/models/User.php
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The storage format of the model's date columns.
     *
     * @var string
     */
+   protected $dateFormat = 'Y-m-d H:i:s.v';
}
```

以上で、ミリ秒への変更が完了です。
Flask 一覧画面で検索機能実装

Flaskのログイン機能を作ったので、追加機能で
検索機能も作ってみました！
CRUD＋ログイン機能の記事はこちらになります🙇

https://qiita.com/yuuki-h/items/47135ea7a07d0c994275

# コード

```diff_python:app.py
@app.route('/tweets')
def index():
-     tweets = Tweet.query.all()
+     text_input = request.args.get('search')
+     if text_input is None or len(text_input) == 0:
+         tweets = Tweet.query.all()
+     else:
+         tweets = db.session.query(Tweet).filter(or_(Tweet.body.like(text_input), Tweet.title.like(text_input))).all()
    return render_template('index.html', tweets=tweets)
```
変更箇所は以前のものが赤、新しい箇所は緑です！
```diff_html:index.html
{% extends "application.html" %}
{% block content %}
+    <div class="search">
+        <form>
+            <input type="text" name="search">
+            <input type="submit" value="検索">
+        </form>
+    </div>
    <div class="tweets_container">
        <h3>投稿一覧</h3>
        {% for tweet in tweets %}
        <div class="tweet">
            <div class="main_box">
                <div class="left_container">
                    <p><b>{{tweet.title}}</b> {{tweet.body}}</p>
                </div>
                <div class="right_container">
                    <a href="/tweets/{{tweet.id}}">詳細</a>
                    {% if tweet.user_id == current_user.id %}
                        <a href="/tweets/{{tweet.id}}/edit">編集</a>
                        <a href="/tweets/{{tweet.id}}/delete">削除</a>
                    {% endif %}
                </div>
            </div>
            <p class="time">{{ tweet.created_at }}</p>
        </div>
        {% endfor %}
    </div>

{% endblock %}
```

ざっとこんな感じです！
以下に解説を続けます！

## クエリパラメータ
今回の検索機能は、クエリパラメータ（URLのとこに出てくる文字列）を利用して
実装しています。URLの例は`[baseURL]/tweets?search=aaa`の形式で
`request.args.get(パラメータ名)`で取得できます！
htmlでは、name属性にパラメータ名を入れるだけでOKです！
`<input type="text" name="search">`


## 検索のロジック
```python:app.py
if text_input is None or len(text_input) == 0:
    tweets = Tweet.query.all()
else:
    tweets = db.session.query(Tweet).filter(or_(Tweet.body.like(text_input), Tweet.title.like(text_input))).all()
```
### 条件分岐
検索の入力欄が`None`（最初にページ遷移した場合）
or文字が入っていない時（文字列長0）に全ての投稿を取得し、
検索の入力欄に何かしら入っているときは、検索を行います👏

### query
`db.session.query(Tweet).filter(or_(Tweet.body.like(text_input), Tweet.title.like(text_input))).all()`
クエリを請求するステートメントですが、Tweetクラス（Tweetテーブル）に
関するクエリ（`query(Tweet)`）でフィルターをかけます。
filterの条件は、Tweetテーブルのカラム`body`または`title`に
検索する文字が含まれているものを取得するものです🙌

他の条件は以下の記事が参考になると思います！

https://qiita.com/Bashi50/items/7f2214550e80b87fb922


# 参考文献

https://qiita.com/yuuki-h/items/47135ea7a07d0c994275

https://qiita.com/Bashi50/items/7f2214550e80b87fb922
MicroStrategyにおける棒グラフとパレートの違い

# はじめに
こんにちは。
本記事ではMicroStrategyにおける棒グラフとパレートの違いについてご紹介します。

# ケース
例として以下のようなデータがあるとします。
※本データは検証用のデータです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/528ce88c-d217-0edd-d36d-8f3f82d907c2.png)
以下赤枠部分を押下するとグラフ表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/45319282-6cc1-23b5-a438-ee0a72415572.png)
グラフを表示することはできましたが、年月でなく実績降順で並んでしまっています。
レポートと同じようにアトリビュートの昇順で並び替えをしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/9974ae3e-b44f-9cc4-c98f-9df60b1cfbf2.png)
以下のように「データ」＞「並び替え」にて
「年月」アトリビュート昇順で並ぶように設定しましたが変わらないことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/59959f32-0483-c402-1d54-a50ce787082d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/7f6a8056-ebdd-f6a2-7c16-b91cd8b2e704.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/9c8cbc5d-f4ed-5bd0-1526-b110e8e8f6c4.png)

# グラフの種類
上記ケースの原因はグラフの種類です。
以下の通り、こちらのグラフは「パレート」という種類であり、値が大きいものから順（降順）に並べるという特徴のあるグラフです。そのためアトリビュートの並べ替えを実施しても適用されませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/a4cfbd31-8517-5ef0-0e12-6c63edf43375.png)
任意のアトリビュート順に並べる場合は「縦棒」を選択することで任意のアトリビュート順にグラフを表示することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737479/eff0c545-3c71-b79c-7df2-324625d994b8.png)

# さいごに
類似したグラフですが、それぞれの特徴がありますので
こちらの記事が、みなさまの調査・業務のお役にたてれば幸いです。
[WIP] Word2vecで久しぶり遊ぶ

https://ledge.ai/word2vec/

### Word2vec
自然言語処理の初期
- 言語は記号で実数値ではないからそのままの形では深層学習ができない
- One-hotベクトル：ベクトルのすべての要素のうちひとつだけが1であり、残りはすべて0であるベクトル で対応

分散表現の登場
- 「文字・単語をベクトル空間に埋め込み、その空間上のひとつの点として捉える」

例：
markdown難しい...
```math
\begin{align}
女+Royal=女王 ...(a)\\
男+Royal=王様 ...(b)\\
\end{align}
```

```math
\begin{align}
女-男=女王-王様 ...(a)-(b)\\
⇔  王様-男+女=女王
\end{align}
```
One-hot
||男|女|王様|女王|
|-|-|-|-|-|
|男|1|0|0|0
|女|0|1|0|0
|王様|0|0|1|0
|女王|0|0|0|1

男=[1,0,0,0]
女=[0,1,0,0]
王様=[0,0,1,0]
女王=[0,0,0,1]

分散表現
||性別(女である具合)|Royal|
|-|-|-|
|王様|男(0)|Yes(1)|
|女王|女(1)|Yes(1)|

男=[0,0]
女=[1,0]
王様=[0,1]
女王=[1,1]

次元下げに成功（簡易化のため、 0,1で表現している）

### CBoWモデルとskip-gramモデル
https://www.yakupro.info/entry/ml-nlp-word2vec

- CBOWモデル: 周辺語から中心語を予測するモデル
    - 明日は〇〇が降りそうだ→雨、ひょう、あられ


- skip-gramモデル：中心語から周辺語を予測するモデル
     - 雨→は、が

#### skip-gramモデルのロジック
https://www.randpy.tokyo/entry/word2vec_skip_gram_model
One-hot(中心語)からOne-hot(周辺語)の間の隠れ層を vocuburaryの数✖️なんだっけ、、、で作っていく、
最終的に隠れ層のの中心語の、、、
（投げ出す）

#### やりたかったこと
- 宇多田ヒカルの First Loveと初恋における考え方の違いなんかを出したかったので、それぞれのアルバムの歌詞を読み込ませて、どういう差があるか見てみたかったが、アルバムに含まれる十数曲を食わせてもそもそもボキャブラリーリストに「初恋」が出てこないし、それに、読み込ませるデータを見て、ある程度自分でもこのデータじゃ意味ないだろうなということは分かっている。
- けど、「ぱくぱく」の類似語に'kiss'が来るから、例えば「パクチー kiss kiss」って感じで歌詞を書き換えたりして遊べるかもねー。こっちの方やってみようかな。

- おすすめの対談記事：https://www.utadahikaru.jp/zadankai/s1.html

### source code
- まとまったら載せます
MacOS cmd(⌘) + r を使用せずに 復旧システムを起動する

### 環境
Mac mini 2018(Intel Core i7)
macOS Monterey

外部キーボードにて起動時にcmd + rを入力するも復旧モードで起動せず…

### 解決方法
調べてまず初めに出たのがターミナルでの下記コマンド。
```bash
sudo nvram "recovery-boot-mode=unused"
sudo reboot
```
しかし1行目で
`Error setting variable - 'recovery-boot-mode': (iokit/common) not permitted.`
と出力され失敗。

下記のコマンドが正解で無事復旧モードで起動成功
```bash
sudo nvram internet-recovery-mode=RecoveryModeDisk
sudo reboot
```
git cloneしたら"ModuleNotFoundError: No module named 'awscli'"が発生した

# 事象
EC2でCodeCommitに対してgit cloneしたら、エラーになってしまいました。
```bash
[ssm-user@ip-99-99-99-99 ~]$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/xxxxxx
Cloning into 'xxxxxxx'...
Traceback (most recent call last):
  File "/usr/bin/aws", line 19, in <module>
    import awscli.clidriver
ModuleNotFoundError: No module named 'awscli'
Username for 'https://git-codecommit.ap-northeast-1.amazonaws.com/xxxxxx': ^[^C
```

- git cloneなのになぜかawscliがないというエラー
- エラーの後になぜかUsernameを尋ねられる


# 前提
- EC2(Linux2)
- SSMでログイン
- 認証情報ヘルパーを以前にこのEC2で設定している
```bash
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
```
参考：https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-unixes.html#setting-up-https-unixes-credential-helper

# 解決方法
awscliをアンインストール→再度インストールしたら解決しました。

```bash
[ssm-user@ip-99-99-99-99 ~]$ sudo yum remove awscli
[ssm-user@ip-99-99-99-99 ~]$ sudo yum install aws-cli
```
参考：https://docs.aws.amazon.com/ja_jp/cli/v1/userguide/install-linux-al2017.html

# 感想
git cloneするときに、裏で認証情報ヘルパーを使って認証が走っています。
認証情報ヘルパーではaws codecommitコマンドを使っているから、awscliが壊れていると今回のようなエラーが出たのだろうと推測します。
何にせよ、直ってよかった。
What is and How to use SSL and TLS?

## What is SSL?

SSL stands for **Secure Sockets Layer** and it is the standard technology for keeping an internet connection secure and safeguarding any sensitive data that is being sent between two systems.Two systems can be a server and a client.
It uses encryption alogrithms to scramble data in transit.

:::note
**What is scramble data?**
Data scrambling is **the process of obfuscating** or deleting confidential data.
:::

### TLS

TLS stands for **Transport Layer Security**, which is just an updated, more secure version of SSL.

## How SSL Certificates Work

A bit complicated to understand with technical jargon.

:::note
**jargon** is the word used by a profession or group that are difficult for others to understand.
:::

### Verification

When you open the web site, your browser receive its SSL certificate through a public key and verifies it with the certificate authority.

### Handshake

Two systems come to an agreement that everything looks legitimate, and form a connection which is called a handshake.

### Enctyption

Decide on the type of encryption, which makes the connection secure, to transmit data back and forth.


## Cost for Production

A certificate authority provides SSL certificates.
The cost of SSL can range **from free to hundreds dollars**, depending on **the level of required security**.

Here are types of SSL

- Domain Validated Certificates
For sites that do not exchange any customer information
- Organization Validated Certificates
For sites that do not exchange sensitive information
- Extended Validated Certificates
For sites that handle sensitive information

## For Development

Self-signed SSL cerificates can be used in local development.
OpenSSL is usuful took kit.

> OpenSSL is a robust, commercial-grade, full-featured Open Source Toolkit for the Transport Layer Security (TLS) protocol formerly known as the Secure Sockets Layer (SSL) protocol. The protocol implementation is based on a full-strength general purpose cryptographic library, which can also be used stand-alone.

https://github.com/openssl/openssl
Wheel-slip control systems, ボッシュ自動車handbook 11版(99) p.1260

Chassis systems, Wheel-slip control systems , ボッシュ自動車handbook 11版(99)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

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

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
#  BWheel-slip control systems  p.1260
## Function and requirements 
## Control systems 
## ABS/TCS systems for passenger cars 
## ABS/TCS systems for commercial vehicles

# Reference
[1] ECE-R13 UNIFORM PROVISIONS CONCERNING THE APPROVAL OF VEHICLES OF CATEGORIES M, N AND O WITH REGARD TO BRAKING
https://unece.org/DAM/trans/doc/2004/wp29grrf/TRANS-WP29-GRRF-56-inf02e.pdf

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221102
出没する挙動不振なfollowerたち

なぜか、follower数が31人の方からのfollowがまた来た。　

どこかのセミナか、どれかのアプリか、どこかのサイトで推奨しているらしい。　

まずQiitaに登録したら31人followしましょう的ななにか。　

Qiitaが、アクセスを調べて、どこの国の、どの地方から、いつ、何人くらいアドレスを取得して、どういう順番で、どの感覚で、誰をfollowしているかを詳細に分析するとよいでしょう。　

かなりの割合で、最初にQiitaのIDをfollowしています。　
その後、トレンド、いいね数などの上位の人たち３１人をfollowしています。　

以前も、なぜ31人かわからないままでした。　

今回も20人の人もいるなど、多少のばらつきはあるものの、ずばり31人が多いという、　
悪質というよりは、幼稚な教育という感じです。　

これらのIDを取り消したりするのでは意味がありません。　
再発防止になりません。　

かならず、背景を調べて、どこの誰が、どういう教育をしたり、　どういうアプリで操作しているかなどを調べて、それに代わる教育、アプリを提供すれば治るたぐいの事象かもしれません。　

問題の分析をせずに、対策だけ立てるというのは、IT業界でもありがちなことかもしれません。　

その方が、短期的には費用対効果が大きそうにみえるからでしょう。　
長期的には何の対策にもならないことを、強制する人たちの方が、存在としては問題かもしれません。


# 対策

ある一定数のfollowerがいると、活動している風に見える。　

何かの投票の時に、動員をかける。

そのため、いいね数、ストック数、follower 数で、商品のかかった当選者を決めるのは辞める。　

ランキングをいろいろやる前に、挙動不審なIDの挙動を分析し、　
背景のいくつかをつきとめて、対策を考えるとよい。　

IDを抹消するだけでは対策にはなっていない。　



# 事例　
## 31 
https://qiita.com/UniLabDAO/following_users

https://qiita.com/Bordeau/following_users

https://qiita.com/kojiqiita/following_users


## 30

最初は31で、後から減った場合あり。

https://qiita.com/choicebit/following_users

https://qiita.com/hotrocoviec/following_users

https://qiita.com/bytecipher01/following_users

## 9

https://qiita.com/stormouse/following_users


## 4
https://qiita.com/k3tsx1lv/following_users
Python の conda のバージョンが 4.14.0 から 22.9.0 になった話

## `conda` のバージョンが飛んだ

Python ver.3.11 がリリースされたので初心者向けになんかいい感じの環境構築資料作ろうかなと思っていた折、
`pip` と `conda` それぞれの環境について書くか？
最近は `mamba` を使うと `conda` より速いのか
`mamba` はちょうどver.1.0.0になったのか！
Mambaforgeを試してみようかなどと調べていたら気づいてしまったんですね。

`conda` のバージョンが `4.14.0` から `22.9.0` へアップデートされてる！

https://github.com/conda/conda/blob/main/CHANGELOG.md#2290-2022-09-14

***

## Versioning の変更

最初は Miniforge のリリースが4.14.0から22.9.0に変わったので何事かと思ったのですが、condaのリリースノートに書いてありました。

今まで `conda` のバージョニングはセマンティックバージョニングでしたが、これからはカレンダーバージョニングに移行するみたいですね。

* `conda` のメインバージョンを `4` から `5` へアップデートする際に、現状バージョン5でリリース予定の機能すべてを一度に安全に実装するのは容易ではないため、カレンダーバージョニングにすることで（おそらく）順次実装していく予定である。
* `4` から `22` ならセマンティックバージョニングとして扱ってもバージョンの順序が崩れないから大丈夫だよね。

ということみたいです。
バージョンからいつリリースされた物なのかもわかりやすくなりました。
これからは機能の強化が活発化したり、割と早いスパンでちょこちょこ新機能が追加されるのでしょうか？
`conda` だけでなく `mamba` の動向も気になりますね！
OpenID Connectの定義をわかりやすく解説

こんにちは。[rendaman0215](https://twitter.com/rendaman0215)です。

先日、社内で新しいOpenID Connectに準拠した認証基盤を導入しました。
反響もあり色々なプロダクトで使ってもらえるようになっている一方で、でなにしたらいいのって話がよく出ます。
そこで関係者がOpenID Connectを利用するうえで気になりそうなポイントをまとめてみました。


## 概要
OpenID Connectとは、認可に特化したOAuth2.0を拡張したもので、**認証に関する仕様**を策定しています。
OAuth2.0は「RFC6749」で定義されているものの、OpenID ConnectはRFCで定義されていません。

## 登場人物
- Relying Party
    - OAuthでいうところのClient。
    - 認証機能を導入したいアプリケーション。
    - OpenID Providerに対してEnd-Userの認証とIDトークンを要求する。
- OpenID Provider
    - OAuthでいうところのAuthorization Server。
    - 認証機能を提供し、リクエストに対してIDトークンを返却する。
- End-User
    - OAuthでいうところのリソースオーナー。
    - アプリケーションを利用するユーザ。


## 処理概要
OpenID Connectは、大まかに以下の流れで行います。
```
1. RelyingParty が OpenID Provider (OP) にリクエストを送る。
2. OP は End-User を認証し, 認可を受ける。
3. OP は ID Token および (通常は) Access Token を返す。
4. RP は Access Token を添えて UserInfo Endpoint にリクエストを送る。
5. UserInfo Endpoint は End-User の Claim を返す。
```

## IDトークン
OpenID Connectの肝となる部分です。
OAuthとの最大の違いは、このIDトークンが払い出されることです。
IDトークンとは、**OPが払出しRPがEnd-Userを認証するために使うもの**です。
IDトークンは、JWT形式で提供されます。

なおネイティブアプリなどではない限り、極力IDトークンはサーバサイドで管理するのがセキュリティ的に望ましいです。

### JWT
JWT（JSON Web Token）は、はRFC7519で定義されている表現形式で、ヘッダ・ペイロード・署名の3部構成となっています。
Base64URLエンコードされているため、Base64URLデコードすることで読むことができます。
- ヘッダ部：暗号化アルゴリズムやトークンの種類を記載
- ペイロード部：IDトークンに関わる各トークンを記載
- 署名部：秘密鍵とヘッダ部のアルゴリズムにより署名を作成し、改ざんを検知できる仕組みのために記載

### クレーム
ペイロードに含まれるデータ。
OpenID Connectでは、以下のクレームを定義しています。
|  クレーム名  |  意味  |
| ---- | ---- |
|  iss  |  IDトークンの発行者（通常はURL形式で表す）  |
|  aud  |  IDトークンを利用するRPのクライアントID  |
|  sub  |  End-Userの識別子  |
|  iat  |  いつ発行されてか  |
|  exp  |  いつまで利用できるか  |
|  nonce  |  リプレイアタック防止のためのランダム文字列 |

## 認証フロー
OpenID Connectには、以下の3つのフローがあります。
- 認可コードフロー
- インプリシットフロー
- ハイブリッドフロー
この中でOpenID Connectを使う上で基本的に選ばれる認可コードフローについて解説します。

### 認可コードフロー
![codeflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264373/e9744d02-31e5-769f-fe1e-740b2dfd2bdc.png)


## RPが実装すべき機能
- ログインを試みているエンドユーザをOPへ遷移させる
- OPから認可コードを受け取り、OPのトークンエンドポイントへリクエストし、IDトークンを取得
- IDトークンの検証
- IDトークンとエンドユーザを紐付ける機能（IDトークンをサーバサイドで管理する場合）

## OIDCを提供しているサービス
Auth0などのIDaaSを用いることで、OPの機能を自前で実装せずに認証基盤を作成することができます。
OIDCのOP機能を自前で実装するとなかなかにセキュリティリスクや開発個数がかかるので、金銭面的に選択肢に入るなら検討されてもいいかもです。
また、これらのサービスでは、RPの機能もSDKなどで提供されていることが多いので使いやすいです。

## （補足）OAuth2.0との違い
OAuthでの認証では、Authサーバがアクセストークン（認可を表す）をクライアントに払出し、認可内容から逆算して認証を行なっていました。
OIDCでは、OPが認証を表すIDトークンを払出すため、認証においてはよりセキュアです。
大きな違いは、ペイロード部の`aud`クレームでRPを記載しており、RP以外では使用できないようになっていることですね。

## 参考資料
今回の記事は公式の資料をもとに作成しています。
https://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html
SConsからpythonなど外部のコマンドを呼び出す方法

# はじめに

GitHubに具体例のリポジトリを上げてあります：[ishioka0222/scons-execute-python-example](https://github.com/ishioka0222/scons-execute-python-example)

# 背景

SConsにはCommandという機能があり、ビルド時にコマンドを呼び出すことができます。
例えば、SConstructファイルに以下のように記述して`scons`コマンドを実行すると、`echo hello, world! > output.txt`が実行されます：
```python:SConstruct
Command(
    target="output.txt",
    source=None,
    action="echo hello, world! > $TARGET"
)
```
しかし、デフォルトの設定では、`action`の中でどのコマンドでも呼び出せるわけではないようです。
例えば、Pythonがインストール済みでPATHを通していても、以下のように`action`の中で`python`コマンドを実行しようとするとエラーが出ます：
```python:SConstruct
Command(
    target="output.txt",
    source=None,
    action="python script.py --out $TARGET"
)
```
```python:script.py
import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--out')
    args = parser.parse_args()

    with open(args.out, 'w') as f:
        f.write('hello, world!')

if __name__ == "__main__":
    main()
```
```text:実行結果（日本語環境の場合）
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
python script.py --out output.txt
'python' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
scons: *** [output.txt] Error 1
scons: building terminated because of errors.
```
```text:実行結果（英語環境の場合）
> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
python script.py --out output.txt
'python' is not recognized as an internal or external command,
operable program or batch file
scons: *** [output.txt] Error 1
scons: building terminated because of errors.
```

このようなエラーが出る理由ですが、デフォルトではSConsはシステム環境変数の値（PATHなど）を読み込まず、`python`コマンドを見つけることができないためのようです。
なぜこうなっているかという理由については、[公式ドキュメント内のENVの項目](https://scons.org/doc/production/HTML/scons-man.html#cv-ENV)に詳しく書かれています。
要約すると、SConsの実行時に設定されている環境変数と関係なく、ビルドの再現性が保証されるようにするためだそうです。

# SConsからpythonなど外部のコマンドを呼び出す方法

`python`コマンドはシステム環境変数のPATHに定義されているので、SConstructファイルの中で、以下のようにしてPATHの値を明示的にSConsに読み込ませる必要があります。

```python:SConstruct
import os
env = Environment(ENV={'PATH': os.environ['PATH']})

env.Command(
    ...
)
```

公式ドキュメントには "it is usually not recommended" と前置きしたうえで、以下のように、PATH以外の環境変数もすべて読み込ませる方法も紹介されています：

```python:SConstruct
import os
env = Environment(ENV=os.environ.copy())

env.Command(
    ...
)
```
git stashコマンドの違い

以下のようにgitで管理されてる`hoge.txt`と`fuga.txt`があるとしよう！
`hoge.txt`は`git add`済、`fuga.txt`はまだだ
![スクリーンショット 0004-11-02 21.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155341/3bbacc21-0bbe-ecc7-a7c6-b778da43ba6e.png)

### パターン1: 全部stashに保存したいんだ！
それなら話は簡単だ。`git stash`と打つだけで良い。
```
❯ git stash
Saved working directory and index state WIP on main: b4930c8 (commit message)
```

### パターン2: addしたやつだけstashに保存したいんだ！
今回の話のメイン。
[git-2.35](https://github.blog/2022-01-24-highlights-from-git-2-35/)で登場した新機能の`--staged`オプションを使おう

以下スクショの通りなのだが、add済のもののみに絞ってstashすることが出来るのが`git stash [push] --staged`になる。（-Sでも同じ）![スクリーンショット 0004-11-02 21.52.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155341/4a0379d8-1317-2af4-9eaa-8d6610d075d7.png)

### パターン3: addしてないやつだけstashに保存したいんだ！
このケースの場合は、`--keep-index`オプションを使おう！（`-k`でも可）
![スクリーンショット 0004-11-02 22.58.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155341/6d49493a-2a2f-639c-1a06-92a5d8872548.png)
WinDbg をインストールしてとりあえず使えるところまで設定する方法

# はじめに
Microsoft が提供するデバッガーである、WinDbg をセットアップして、とりあえず使えるところまで準備する方法の備忘録です。（自分が久しぶりに使う必要に迫られて、初期設定とかすっかり忘れてたので。）

# WinDbg で出来ること
多目的デバッガーなので色々できるようなのですが、自分は主にユーザーモードのアプリケーションの解析しか使っていないので、めちゃくちゃ雑に列挙します。

- クラッシュダンプの解析
- アプリケーションのライブデバッグ
- OS そのものの動作のライブデバッグ

# WinDbg のインストール方法
Windows SDK のインストーラーに含まれています。

https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/

上記サイトより、「インストーラーをダウンロードする」のリンクをクリックし、Windows SDK のインストーラーを入手しましょう。

インストーラーを起動すると、"Select the features you want to change" というチェックボックスが沢山あるダイアログが出てきますので、そのダイアログ内で "Debugging Tools for Windows" の項目のチェックを入れましょう。他の項目はデフォルトではチェックが入っていますが、WinDbg の利用には関係ないので、チェックを外してしまっても差し支えありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199379/c4532328-b8c5-909c-e0be-c4395daf6a66.png)

その後インストーラーを最後まで完了させたら、WinDbg のセットアップは完了です。
スタートメニューで "WinDbg" と検索すれば、その検索結果から起動できるはずです。

# WinDbg の初期設定
Windows アプリケーションのデバッグをするためには、少なくとも Microsoft が公開するデバッグシンボルの設定が必要になりますが、玄人向けツールである WinDbg のデフォルト設定ではシンボルをどこから持ってくるかとかそういう設定はされていません。

そこで、デバッグシンボルの取得先とローカルキャッシュ先の設定をしなければいけないわけですが、これはコマンド一発で完了できるようになっています。

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/-symfix--set-symbol-store-path-

## シンボルパスを設定するところまでのステップバイステップ
1. C ドライブ直下に適当にフォルダを作る （例）"C:\Symbols" など
1. WinDbg を起動
1. アタッチ先のプロセスが必要なので適当に notepad.exe とか起動
1. WinDbg の "File" メニューから、"Attach to a Process" を選択
1. 開いたダイアログで "Notepad.exe" を選択
1. "Command" ウィンドウが開くので、一番下のテキストボックス（コマンド入力用の場所）に以下のコマンドを入力
    ``` cmd
    .symfix c:\Symbols
    ```
1. コマンド実行後、ちょっと BUSY 状態で待たされるかもしれませんが、ちょっと待っているとプロンプトが戻ってくるはず
1. 更にコマンドで以下を実行
    ```cmd
    .reload
    .sympath
    ```
1. 上記コマンドの実行結果として、以下のような応答が返ってきたら OK
    ```cmd
    Symbol search path is: srv*
    Expanded Symbol search path is: SRV*c:\Symbols*https://msdl.microsoft.com/download/symbols
    ```
1. ここまでの設定が終わっていたら、"C:\Symbols" フォルダの下に何やら勝手にフォルダーが出来てシンボルがキャッシュされていくはずです。

あとはもう煮るなり焼くなりガンガンデバッグしちゃいましょう！

# このあと出来ること
例えばあるアプリケーションがよくクラッシュしたりするとして、クラッシュした瞬間のダンプをとって解析して、どの DLL が悪さをしているのかを特定してみたりとか…。
あとはあるアプリが読み込んでいる DLL のリストなんかも簡単にリストで取ることが出来たりも…。

知れば知るほど Windows アプリのトラブル調査の強者になれるのは間違いないので、クラウド全盛のこの時代ですけど、覚えておいて損はないと思ってます。

例えば、クラッシュダンプを入手した時、またよくクラッシュするアプリにデバッガーをアタッチして動作させておいて、運よくクラッシュした場合に使えそうな自動分析の機能とかもあったりしますよ。

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/using-the--analyze-extension

# 学習リソース
https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/symbol-path

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/debugging-techniques

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/debugger-operation-win8

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/debugger-commands

https://learn.microsoft.com/ja-jp/windows-hardware/drivers/debugger/crash-dump-files
クラスフュージョン

# はじめに
関数分割リファクタリングにハマってるおっさんエンジニアのポエムです。
ま、その程度の信憑性だと思って読んでもらえれば。

# 最適な関数の長さ
事の発端は、「長すぎる関数をどうにかしたい」でした。
こんなのは、探せばqiitaにもありますね。
https://qiita.com/kamykn/items/d827c17c849bd111d272
大体、「適切な長さ、関心の分離（そして適切な関数名とか）」ってオチがつきますが、それでも、「出来るだけ短くしよう」という話はたまに見かけます。
でも、だったら、関数を本気で短くしたら、何が起きるのか？
そこまで踏み込んだ話は実は余り見かけないです。

関数を短くすると、クラスの関数がむっちゃ増えます。当然、読みにくいですね？
でも、そうすると、自然にこう考えるはずです。
「じゃあ、（クラスを）分割すればいいじゃん？」

# クラスの長さ（大きさ）の決め方
まあ、でかすぎるクラスを分割しよう、というのはよくある話ですが、でも関数みたいに「なるみじ」みたいな話は余り出てきません。
なんでかって言うと……クラスって、担う役割で決めるべきで、抽象的に分割するのは悪手だって話になるんですよね。
https://qiita.com/alt_yamamoto/items/25eda376e6b947208996
https://zenn.dev/rinia/articles/da7e26d72ad84f
ちょっと適当に引用しましたが、大体「ほどほどに分割」って話になります。

# そもそもクラスとは？
でも、これっておかしくないですか？
関数は、（実験的にでも）短く分割して書いてみよう、って話が出てくるのに、クラスにはまるで聖域のように誰も触れない。

今時は「関数とクラスって何が違うの？」ってgoogle検索のトップに出てくるくらいなのに（おっちゃんだと、この発想自体がカルチャーショック）だったら、「同様に実験しましょう」って発想は出てこないのか？

え？　そう言うならおまえがやれ？
って事でやってみました。

# 短いクラスは正義？
クラスを分割するのは、ちょっと面倒ですが……ある意味関数の分割より楽しいです。
というのは、クラス変数がグループに分かれていって、機能の抽象化が見えてくるんですね。で、関数が一行レベルで分割してあれば、ほぼ、クラスの関数は、「クラスの変数を触ってなんか作用するもの」に収束するわけです。
で、（おそらく、どんなクラスでも）極限までやれば、「（だいたい）２つのクラス変数を触って作用を返す関数」の集合体、になるわけです。
（一変数、ならその関数は分離できます（１変数１関数のクラスになるかもですが）し、三変数は大体（心を鬼にすれば）分割できます。まあ、その規模なら無理にしなくてもいいけど……）

ここまで分解を繰り返すと、実はただの配列を取り込んでるだけのクラスだったり、同じ機能のクラスが繰り返し出てきたりします。
そして、クラスとクラスを合成すると、大体細かい関数の挙動を考えずに全体の挙動が見えてきたりします。（それこそ、適切な関数名を決めればなおさら）
あたらしい開発メソッドの構築か！？ってなるのですが……残念ながら、ここにちょっと壁が出てきます。

# 関数にあってクラスにないもの
一つは、今回c#使ったのですが……そもそも、今時の言語ってクラスの多重継承は許されないんですね。
上の話で解ると思いますが、クラスを分割しまくる場合、多重継承が出来ると出来ないでは結構記述に差が出ます。
じゃあ、出来るc++でいいじゃん……となるかというと……
c++はインターフェースとか無いしなぁ、とか、そもそも黒魔術過ぎて書くの辛い、とかなるわけで……
（c++はお世話になったし、嫌いじゃないですが、今回みたいな実験的記述には辛いかなぁ……）

それともう一つ。クラスは、分割した場合、ほぼパフォーマンス低下が確定的ですよね。（どうしてもメモリ参照が入るので）
今時、関数分割でパフォーマンスが低下するから（インライン）関数は使わない、って人はいないと思いますが、
（でも、自分は20……いや、15年前までは分解してましたね。パフォーマンス差が出るので。今はナンセンスでしょうね……）
クラスを17分割とかしてたら、今時のweb系の人でもしかめっ面をするともいます。（ゲーム系なら……お察しって事で）
ちょっとこれでは、IDEがあれば開発効率に支障は無い！って言っても普及は無理かなぁ……
かといって、設計で分割記述して、実用時に手で統合って言うのも苦行に過ぎます。

# 結論
まあ、何が言いたいかと言えば、
コンパイラがクラスを統合して、速度最適化するような仕組みを積極的に入れてくれれば、クラス分割しまくりメソッドが成立するのではないか！？と、そんな時代が来ることを期待してこのポエムは終わるわけです。
paizaラーニング レベルアップ問題集 線形探索メニュー応用編 JavaScript 二次元データの区間探索

二次元データの区間探索 (paizaランク B 相当)

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

# 解答例
レジャーシート左上基準で、区画を順に調べていきます。
レジャーシートを敷く区画がxを超過していたら敷けません。
敷けるならカウントします。

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, m, k, x] = lines[0].split(" ").map(Number);
const field = lines.slice(1).map(line => line.split(" ").map(Number));

let count = 0;//何通りあるか
//レジャーシート左上基準で、区画を順に調べていく
for (let i = 0; i <= n - k; i++) {
  for (let j = 0; j <= m - k; j++) {
    //敷けるか調べる
    let flag = true;//敷けるか判定
    for (let p = i; p < i + k; p++) {
      for (let q = j; q < j + k; q++) {
        //区画の番号がx超過なら
        if (field[p][q] > x) {
          flag = false;//敷けない
          break;
        }
      }
    }
    //敷けるなら
    if (flag) {
      count += 1;
    }
    
  }
}
console.log(count);
```
Arubaの製品

# Master ControllerとMobility Masterの比較

| Master Controller(6.x) | Mobility Master(8.x) |
| --- | --- |
| 物理機器 | 物理機器と仮想機器 |
| APをシャットダウンできる | APをシャットダウンできない |
| 部分的な設定をローカルコントローラにプッシュできる | 完全な設定をローカルコントローラ(MC/MD)にプッシュする |
| 設定ファイルのバグ発見ができない | 設定ファイルのバグ発見はプッシュされる前にわかる |

# Local ControllerとManaged Node(Mobility Controller)の比較

| Local Controller(6.x) | Managed Node(8.x) |
| --- | --- |
| 物理機器 | 物理機器と仮想機器 |
| 部分的な設定をMCから受け取る | 完全な設定をMMから受け取る |

## Aruba OS 6.xのアーキテクチャは以下

- Master Controller(物理)
    - Local Controller(物理)
        - AP

## Aruba OS 8.xのアーキテクチャは以下

- Mobility Master(物理or仮想)
    - Managed Node(Mobility Controller)(物理or仮想)
        - AP

# 製品の種類

## AP

- 100 シリーズのAPは802.11nをサポートしています。
- 200 シリーズのAPは802.11acをサポートします。
- 300 シリーズのAPは802.11ac + BLE + MU-MIMOをサポートしています。
- 510 シリーズのAPは802.11ax + AIを使って電力調整(接続を保証) + WPA3のセキュリティ + MU-MIMO + BLE + Zigbeeをサポートしています。
- 175/254/275 APは外に設置するAPです

## Controller

- 7005コントローラは16個のAPと1000ユーザーをサポートします。
- 7240コントローラは2048個のAPと3200ユーザーをサポートします。
- 72xxシリーズコントローラは最大8のコアを使用します（32個の仮想CPUを持っているようなものです）。最大32000台のモバイルデバイスをサポートします。ファイヤーウォールポリシーの適用を実行します。

## NaaS

- AirWaveは、ネットワーク管理するクラウドサービスです。AirWaveは無線周波数の可視化、ログの発見、通知を行ます。また、他のベンダーの製品にも対応しています。
- Aruba Centralは管理システム
- ClearPassは、セキュリティ用のクラウドサービスです。アクスセス制限、Captive Portalの設置、ゲストログインを行います。
- Meridianは、ビーコン技術を使ってユーザーの位置や物の位置の特定を行います。
- Aruba NetInsightは、ネットワークに問題がないか診断します。また、ネットワークの最適化を行います。
- Aruba SD-WANは、おそらくIT企業ではない会社（小売店、病院など）にわかりやすい形でネットワークの管理をできるようにする
paizaラーニング レベルアップ問題集 線形探索メニュー応用編 JavaScript 三次元データ

三次元データ (paizaランク B 相当)

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

# 解答例
三次元データですが、求めたい答えは二次元配列で求まります。
メソッドを駆使して解いてみました。

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");
//奥行きn、幅m、高さh,色x
const [n, m, h, x] = lines[0].split(" ").map(Number);
console.log(
  lines.slice(1)
    .map(line => line.split(" ").filter(v => Number(v) === x).length)
    .reduce((a, b) => a + b)
);
```
少しずつconsole.logしながら書いていくとわかりやすいと思います。
```javascript:補足
//入力linesの2行目以降をslice(1)で配列にする
console.log(
  lines.slice(1)
);
//linesの要素1行1行をlineとしてsplitする
console.log(
  lines.slice(1)
    .map(line => line.split(" "))
);
//lineの要素を数値にして、xだけ残したいのでfilterする
console.log(
  lines.slice(1)
    .map(line => line.split(" ").filter(v => Number(v) === x)
);
//残ったxがいくつあるかlengthで求める
console.log(
  lines.slice(1)
    .map(line => line.split(" ").filter(v => Number(v) === x).length)
);
//「x何個あるか」の配列になったので、reduceで合計する
console.log(
  lines.slice(1)
    .map(line => line.split(" ").filter(v => Number(v) === x).length)
    .reduce((a, b) => a + b)
);
//以上で完成
```
Wheel brakes , ボッシュ自動車handbook 11版(98) p.1250

Chassis systems, Wheel brakes, ボッシュ自動車handbook 11版(96)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

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

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
#  Wheel brakes p.1250

## Disk brakes for passenger cars 
## Disk brakes for commercial vehicles 
## Drum brakes 

# Reference
[1] $41 Strabenverkehrs Zulassungsordnung, Road traffic licensing regulations Germany, Bremsen und Unterlegkelle(Brake and wheel chocks



# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221102
Brake systems for commercial vehicles,  ボッシュ自動車handbook 11版(97) p.1230

Chassis systems, BBrake systems for commercial vehicles, ボッシュ自動車handbook 11版(97)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

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

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
#  Brake systems for commercial vehicles p.1230
## System overview 
## Components of commercial-vehicle brake systems 
## Electronically controlled brake system 
## Continuous-operation brake systems 
# Reference
[1] E. Hoepke, S. Breuer(Editors) Nutzfahrzeugtechnik, 8th Edition, Verlag Springer Vieweg, 2016

https://link.springer.com/book/10.1007/978-3-658-09537-6

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221102
カタカナ語で選手権 日本語(17)

１行に２つ以上カタカナ語があると、意味がわからなくなる確率が上がるという仮説があるらしい。

外来語にカタカナ語を充てると、すばやく外来語を流行らせることができるらしい。

ある用語を、原語で表記するより、カタカナ語で書く方が、意味がわかっているかわかっていないかにかかわらすに流行らせることができるらしい。

アルファベットはローマ字読みすればよいかもしれないが、アルファベット以外の表記は、読める人の割合が１割を切るかもしれない。例えば、сценарий кирури、한글 문자、حروف فارسیと書いてあって、読み下す人がいるだろうか。カタカナを使ってで、キルリ文字、ハングル文字、ペルシャ文字と書いてあれば、読み上げることはできるし、何か知らないものであっても、そのまま会話を続けることができるだろう。

例えば、
сценарий кирури(キルリ文字)、한글 문자(ハングル文字)、حروف فارسی(ペルシャ文字)
と書いてあるのがいいか、
キルリ文字(сценарий кирури)、ハングル文字(한글 문자)、ペルシャ文字(حروف فارسی)
と書いてあるのがいいかは、分野、対象によるかもしれない。

1. カタカナ語だけ
2. 原語だけ
3. 原語（カタカナ語）
4. カタカナ語(原語）

ここまでに４つの表現が可能である。

それ以外に、漢語表記がある場合には、次の６つの表記から１つを選んでいることになる。

1. カタカナ語だけ
2. 原語だけ
3. 原語（カタカナ語）
4. カタカナ語(原語）
5. 原語（漢字表記）
6. 漢字表記(原語)

短縮名と原語とが同じ綴りの場合は、原語だからOKというわけではない。場合によっては

7. 原語：full spelling(漢字表記）

というのもありえる。

# 1. カタカナ語だけ
例：
ライト: light, rightどっちかわからない。　lite, writeもライトって呼んでる。 

# 2. 原語だけ
例：　
車を止めるのはbrakeです。　

# 3. 原語（カタカナ語）　

例：　
車を止めるのはbrake（ブレーキ）です。　

読みを示していると思えば、腹は立たないかも。　
 
# 4. カタカナ語(原語）


例：　
車を止めるのはブレーキ(brake）です。　

ちょっど間延びした漢字。　


# 5. 原語（漢字表記）


例：　
車を止めるのはbrake（制動器）です。　

少しは勉強になるかもしれない。　

#  6. 漢字表記(原語)



例：　
車を止めるのは制動器(brake）です。　

漢字表現になじんでいないと読みに時間がかかるかもしれない。　

# 7. 原語：full spelling(漢字表記）

例：　
車を止めようとして雨の日にABS(Anti Lock Brake System:対制動固着防止器)が効いた。

<!--
ライト
カルタ
多対多

データ　複数　語源 -->
# 参考資料
なぜ計画者(programmer)はカタカナ語を使わない方がよいのか　日本語（２２）
https://qiita.com/kaizen_nagoya/items/d09e5ee549c4d9a17912

カタカナ語で選手権 日本語(17)
https://qiita.com/kaizen_nagoya/items/f1c0384a13dd13c5e7f1

プログラマが心がける文章の書き方 日本語（１８）
https://qiita.com/kaizen_nagoya/items/af1e6207ccaa063dafb8

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

C++ Support(0)　
https://qiita.com/kaizen_nagoya/items/8720d26f762369a80514

Coding Rules(0) C Secure , MISRA and so on
https://qiita.com/kaizen_nagoya/items/400725644a8a0e90fbb0

Autosar Guidelines C++14 example code compile list(1-169)
https://qiita.com/kaizen_nagoya/items/8ccbf6675c3494d57a76

Error一覧(C/C++, python, bash...) Error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

なぜdockerで機械学習するか 書籍・ソース一覧作成中 (目標100)
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

言語処理100本ノックをdockerで。python覚えるのに最適。:10+12
https://qiita.com/kaizen_nagoya/items/7e7eb7c543e0c18438c4

プログラムちょい替え（0）一覧:4件
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
### 文書履歴(document history)
ver. 0.01 初稿 　 20230526
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
paizaラーニング レベルアップ問題集 線形探索メニュー応用編 JavaScript ピクニック 2

ピクニック 2 (paizaランク B 相当)

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

# 解答例
最大値変数を用意し、区画を二次元配列にします。
レジャーシート左上基準で、区画を順に調べます。
レジャーシートに覆われた区画の価値の合計を求めて、最大値を超えるか比較します。
(小さな注意点：問題文のシートの大きさで変数にkを使うならば、ループで使う変数に、kを使わないようにします。地味にハマることがあります。const kとしておけば、気づけるので安全です)

```javascript
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin", "utf-8").trim();
const lines = input.split("\n");

const [n, m, k] = lines[0].split(" ").map(Number);

let max = 0;//区画の価値の合計の最大値
//区画を二次元配列に
const field = lines.slice(1).map(line => line.split(" ").map(Number));
//レジャーシート左上基準で、区画を順に調べていく
for (let i = 0; i <= n - k; i++) {
  for (let j = 0; j <= m - k; j++) {
    //区画の価値の合計を求める
    let sum = 0;
    //縦p(ループの変数にkを使わない)
    for (let p = i; p < i + k && p < n; p++) { 
      //横q
      for (let q = j; q < j + k && q < m; q++) {
        sum += field[p][q];
      }
    }
    //価値合計と今までの最大値比較
    max = Math.max(max, sum);
  }
}
console.log(max);
```
RPACommunityの企画のすゝめ

# 2022年12月27日！市民開発者トーク開催決定！！

https://rpacommunity.connpass.com/event/266033/

RPACommunity様、ソントレーゾ様のおかげで、
`市民開発者について考えよう！`
というテーマでイベントが決定しました🥳🥳

先日noteを書かせていただき、市民開発者ってこれからどうなるんだ・・・という
漫然とした不安からnoteを書かせていただきました！

https://note.com/bonito_vba_gas/n/n586cd22f4b0b

私が非常にお世話になっている方から「せっかくだし、イベントにしてみたら！」とアドバイスをいただき、
[百合宮桜さん](https://twitter.com/yurimiyasakura)の手腕であっという間に企画が実施決定になりました！

ご都合つく方は是非お越しください！

詳しくは👆のページをチェック！！

ということで、Qiitaはテクニカルなことを載せるイメージですので、RPACommunity様のように企画を実現するうえで
考えるべき項目リストをまとめてみました！

大変ありがたいことと同時に、何を考えたらスムーズにいくのか、どなたかの参考になれば幸いです！
***
# 何を決めるのか！

## 1. 開催時間
Communityが定期的に開催されているイベントに合わせましょう！
RPACommunity様では下記の枠で考えられましたが、
原則的な時間に合わせることが礼儀かとも思いました（個人の意見です）

今回の例だと
 - **候補1：19:30~** 
 - 候補2：21:00~

:::note info
インフォメーション
ゲストの予定もあるので、しっかりと調整をすることが大切です!!
:::

## 定期的なイベントになるには
 - Communityの定期イベントにしたい！と思う場合は
     - あらかじめ定期的に出来そうな時間帯を選択する
     - 良い企画にすること、運営任せにせず、真剣にイベントを良くする方法を考える

**この点を熱意をもって考えましょう！**

## 2. 登壇者
 - 公募
    or
 - 直接オファー

思い入れがあるイベントであれば、あなたにも参加してほしい方がいるはず・・
**情熱や企画、想いを共感できる人を推薦する形が、主体性がより高まると感じます！**

# __条件__
 - RPACommunityのSlackでのやり取りに対応可能な方
 - 個人での登壇がOKな方（RPACommunityパートナー企業は企業登壇×）

## 3. 日程
 - 遅くとも開催日2週間前くらいにはConnpass立ち上げ
     - 原稿の返信や依頼の準備は迅速に実施すること！
 - 集客、その他トラブルに柔軟に対応するためには1か月前に固まっていることが妥当

## 4. 関係者事前ミーティング
登壇者の顔合わせ、認識合わせなど
`チャットのテキスト`以上の情報交換ができるので、絶対にやった方が良い
 - テキストのみのコミュニケーションでは考えをまとめるという意味で足りなくなってしまう恐れがあります
 - 音声でも対話し、キックオフをして短期間でもチームとして動ける姿勢が必要かと感じました！

### 日時決め
 - 参加者・運営を尊重し、自分が合わせる姿勢が大切

### __テーマ決め__

 - example
    https://connpass.com/event/250517/

実際の内容を考える・・・となると熟慮が必要になります。
主体的に、どういうイベントにしたいか、またどういったイベントが盛り上がると思うか、
関係者で話し合うこと、また持ち込みする側は**特にどうしたいか、達成したいGoalを思い描くこと**
これが大切だと思います！

## 5. Connpass立ち上げ
RPACommunityのグループでの立ち上げになるので基本は運営側にしていただきます
- おおよそ開催日2週間前までの公開

## 6. 登壇者への動画公開/顔出しなどの可否確認
 - 録画公開があるので顔出しの有無の確認
 - 認識のズレが無いよう、個々人の希望はもれなく共有しておくこと

## 7. あとは・・・
 - SNSでの宣伝活動
***

### イベント後のToDo! After!!
 - 当日に答え切らなかったQA回答
 - 動画がアップされたときの宣伝


# 最後に
本当にありがたい場を頂戴しております！
良いイベントにしたいと思いますので、改めて気合入れますね！

是非お時間ある方はいらしてください！！

https://rpacommunity.connpass.com/event/266033/
M1 Mac届いたのでセッティングの備忘録を残す

 -  来月（今2022/10）M2 Proチップの発売がされたらProの値段上がりそうだよと旦那に言われて買う
 -  整備品で買ったから５万くらい安く済んだ
 -  けど、キーボード配列が選べない。久しぶりの日本語配列。(貧乏人は黙って日本語配列)

### トラックパッドの設定

### インストール
- Chrome
- 1Password
- PyCharm
- Visual Studio Code

### homebrew
- https://brew.sh/index_ja
- install command叩く
```shell
==> Next steps:
- Run these three commands in your terminal to add Homebrew to your PATH:
    echo '# Set PATH, MANPATH, etc., for Homebrew.' >> /Users/nakarun/.zprofile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/nakarun/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh

% echo '# Set PATH, MANPATH, etc., for Homebrew.' >> /Users/nakarun/.zprofile
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/nakarun/.zprofile
% eval "$(/opt/homebrew/bin/brew shellenv)"

% brew --version
Homebrew 3.6.8
Homebrew/homebrew-core (git revision e233c36c6c6; last commit 2022-11-02)
```
### brew doctor
```shell
% brew doctor
Warning: Git could not be found in your PATH.
Homebrew uses Git for several internal functions, and some formulae use Git
checkouts instead of stable tarballs. You may want to install Git:
  brew install git

Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install
% xcode-select --install
% brew install git
```

### pyenv
```shell
% brew install pyenv
% echo 'eval "$(pyenv init --path)"' >> ~/.zshrc
% pyenv install --list
% pyenv install 3.10.7
WARNING: The Python lzma extension was not compiled. Missing the lzma lib?
Installed Python-3.10.7 to /Users/nakarun/.pyenv/versions/3.10.7
```

### JetBrains ToolBox
- https://www.jetbrains.com/ja-jp/toolbox-app/download/download-thanks.html?platform=macM1

### PyCharm
- https://pleiades.io/help/pycharm/pipenv.html#47ac621b
```
% pip3 install pipenv
% echo 'export PATH="$PATH:/Users/nakarun/Library/Python/3.9/bin"' >> ~/.zshrc
% source ~/.zshrc
```
- Pipenv executorの指定が必要なくなる

- Tool bar > Help > Edit Custom VM options
    - ヒープサイズ 2048mb に設定
- Extentions
    - EnvFile : https://plugins.jetbrains.com/plugin/7861-envfile
### Visual Studio Code


### Chromeの拡張機能
#### Amazon

引き続き更新する
Brake systems for passenger cars and light utility vehicles, ボッシュ自動車handbook 11版(96) p.1216

Chassis systems, Brake systems for passenger cars and light utility vehicles, ボッシュ自動車handbook 11版(96)

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊

http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

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

ボッシュ自動車handbook(英語)11版(0-1) 課題と記事一覧new

https://qiita.com/kaizen_nagoya/items/a9d2887bf2a7598dc8e5

# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
Management for diesel engines, 906
Electrification of the drive, 970
Emission-control and diagnosis legislation, 1042
Chassis systems, 1108
#  Brake systems for passenger cars and light utility vehicles p.1216
## Subdivision of passenger-car brake systems 
## Components of the passenger-car brake system 
## Electrohydraulic brake 
## Integrated power brake

# Reference
[1] EC Directive 71/320/EEC of 26 July 1971 on the approximation of the laws of the Member States relating to the braking devices of certain categories of motor vehicles and of their trailers 

https://www.legislation.gov.uk/eudr/1971/320/pdfs/eudr_19710320_adopted_en.pdf


# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 20221102
【Linux】readコマンドのpオプションはシェルによって挙動が異なる

## Bashの場合

以下のようにすることで入力を要求する際にメッセージを表示できる。  

```bash
$ read -p 'What is your project named? > ' PROJECT_NAME
What is your project named? > 
```

* Bashのread

https://linuxcommand.org/lc3_man_pages/readh.html

## Zshの場合

Zshで上記と同じコマンドを実行すると以下のようにエラーとなる。  

```zsh
$ read -p 'What is your project named? > ' PROJECT_NAME
zsh:read:1: -p: no coprocess
```

これは`p`オプションの挙動が異なることから生じている。  

* Zshのread

https://zsh.sourceforge.io/Doc/Release/Shell-Builtin-Commands.html#index-read

## 解決策

ZshでBashと同様のことを実現するには以下のように記述する。  

```zsh
$ read PROJECT_NAME'?What is your project named? > '
What is your project named? > 
```

またZshとBash両方で動作させるには以下のようにする。  

* 条件分岐

```zsh
if [ -n "$ZSH_VERSION" ]; then
  read PROJECT_NAME'?What is your project named? > '
else
  read -p 'What is your project named? > ' PROJECT_NAME
fi

echo $PROJECT_NAME
```

```zsh
if [[ $ZSH_EVAL_CONTEXT = toplevel ]]; then
  read PROJECT_NAME'?What is your project named? > '
else
  read -p 'What is your project named? > ' PROJECT_NAME
fi

echo $PROJECT_NAME
```

* 別のコマンドでプロンプトを出力

```zsh
echo -n 'What is your project named? > '
read PROJECT_NAME
echo $PROJECT_NAME
```
paizaラーニング レベルアップ問題集 線形探索メニュー応用編 JavaScript ピクニック

ピクニック (paizaランク B 相当)

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

# 解答例
レジャーシートを敷ける場所の数countを用意します。
山を二次元配列にします。
レジャーシート左上を基準に、山の区画を順に、平行か調べます。
```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);

let count = 0;//敷ける場所の数
//山を二次元配列に
const mountain = lines.slice(1).map(line => line.split(" ").map(Number));

//レジャーシート左上を基準に、山の区画を順に、平行か調べる。
for (let i = 0; i < n - 1; i++) { //レジャーシートは2mなのでn-1
  for (let j = 0; j < m - 1; j++) { //同様にmー１
    //平行ならば
    if (mountain[i][j] === mountain[i + 1][j] &&
        mountain[i + 1][j] === mountain[i][j + 1] &&
        mountain[i][j + 1] === mountain[i + 1][j + 1] ) 
    {
      count += 1;//カウントする
    }
  }
}
console.log(count);
```