OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTの活用例　〜アドベントカレンダーのネタを相談してみた〜

こんにちは。

[CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 2日目担当の@koronekoです。
初日は@garyumaruさんの「ChatRWKVを使ってみた」でした。自分のPCで手軽にAIを試せるのは嬉しいですね。

## まずは、自己紹介
エンジニア歴十数年以上、お仕事に合わせて言語を変えるスタイルのエンジニアです。
サイバードでは、複数タイトルの進行管理を行う業務に携わっているため、実作業からは少々遠のいております。
アドベントカレンダーに参加させていただくのは今年で3回目、昨年に引き続き気軽に読める記事を目指します。


## はじめに
皆さんは記事を書く際「ネタ」に困ったことはありませんか？
私はよく困っております。もっと気軽に「ネタ」が降ってきたら良いのにと感じることが多々あります。
そこで、ChatGPTが「ネタ」を出すのにとても便利という記事をみかけましたので、今流行りのAIを利用した「ネタ」出しの検証をしつつ記事を書いてみようと思います。


## 使用するもの
- ChatGPTの無料版
- ChatGPT URL
    - https://chat.openai.com/

※ChatGPT自体の説明や利用するためのアカウント登録などは、SNSやネット記事など、多くの方が説明してくださってますので、この記事では省かせていただきます。


## ChatGPTを使ったネタだしを試してみよう
早速ですが、ChatGPTに「何かネタを出して？」という内容で、とてもふわっとした相談を投げてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395867/0e06b6aa-964f-b313-2658-ad849e1d0730.png)

...
....
......

なんということでしょう....。
私のふんわりとした質問に対して、人間味溢れる応援付きの回答をいただきました。
記事を書くモチベーションが上がりますね。

では、実際にChatGPTから提案されたアイデアを見てみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395867/1ba5afb0-6bb3-8d5b-f457-adf8add5d06f.png)

質問してから、待つことわずか数秒....爆速で「ネタ」が出来ておりました....！
小技集というタイトルが唆られます。

これで詳細を盛り込めば、記事を完成させることができてしまいますね。

## まとめ
1時間以内に書ける記事を提案してくれているかは少し微妙ですが、**きっかけ** としては十分と感じました。
「別の提案をして欲しい」・「別のネタも欲しい。5パターンほどだしてくれない？」という質問を投げることで、追加のアイデアも回答してくれます。

今回、複数のアイデアをChatGPTに出してもらいましたが、かかった時間はわずか5分程度でした。
ChatGPTが「ネタ」出しに便利ということに納得できた検証結果です。

:::note warn
注意
ChatGPTの結果は正確でない場合もあります。
誤った結果を出してくることもありますので、正確かの判断は個別に必要です。
:::



## 最後に
ChatGPTは有料版と無料版がありますが、無料版は導入のハードルも低く簡単にAIを試すことができます。
とても便利で、業務への活用も期待できますが、AIに学習されて不特定多数の人に情報公開をされる恐れもありますので、社内の情報などは決して相談しないようにしましょう。

さて、 [CYBIRD Advent Calendar 2023](https://qiita.com/advent-calendar/2023/cybird) 3日目は@suzu_ayaさんの「YouTubeでよく見る動くグラフをローカル環境で作成した」です。
楽しみですね！




## おまけ 〜ChatGPTと心が通じ合えなかった瞬間〜
この記事自体をChatGPTに書いてもらえれば、時間短縮にも繋がるし更に面白いのでは？と思い、試してみました。

### ChatGPTに記事の草案をお願いしてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395867/155871a7-e64a-c2bd-4b2d-d59c49c487df.png)

### ChatGPTが実際に作った草案がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395867/07eefda3-5eae-20c0-f3c5-9d8942645f69.png)

私の思いは通じませんでしたが、見出しに沿った内容にはなってましたw
自分の意図通りの回答を得るのは、なかなか難しいですね。
ROSが動作するラズパイのクローンを作成する

Turtlebot3を動かしているラズパイを数増しするときのメモ。
新しいSDカードに環境を丸ごとコピーしました。

- 元の環境：Turtlebot3を動かしてるラズパイ
    - Raspberry Pi 4B 4GB
    - micro SD 32GB
    - Ubuntu mate 20.04.4 LTS

- コピー先（全く同じつもり）
    - Raspberry Pi 4B 4GB
    - micro SD 32GB (Rasbianが入っていたものをフォーマット）

# 参考にさせていただいたページ
https://ossyaritoori.hatenablog.com/entry/2017/06/24/Raspberry_Pi%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92SD%E3%82%AB%E3%83%BC%E3%83%89%E3%81%94%E3%81%A8%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97

https://qiita.com/kiki0817/items/aab3d177ad83cf964641

# ディスクの認識・確認

ハード・ディスクのパーティションを設定するfdiskコマンドで、デバイスのパーティション情報を表示確認する。

``` bash
$ sudo fdisk -l
~~~
デバイス       起動 開始位置 最後から   セクタ サイズ Id タイプ
/dev/mmcblk0p1 *        2048   526335   524288   256M  c W95 FAT32 (LBA)
/dev/mmcblk0p2        526336 62929886 62403551  29.8G 83 Linux
```
上記の場合、コピー元のSDカードは`/dev/mmcblk0`です。（SDカードを指した状態の結果をコピーし忘れました。）

私の場合、SDカードは'/dev/sda'でした。

## ddコマンドでブロックごとコピーする

ddコマンドについて：[【 dd 】コマンド――ブロック単位でファイルをコピー、変換する：Linux基本コマンドTips（163） - ＠IT (itmedia.co.jp)](https://atmarkit.itmedia.co.jp/ait/articles/1711/30/news027.html)
>「dd」コマンドはファイルをブロック単位で読み出し、指定通り変換して出力します ※1。入力と出力にデバイスを指定できるため、HDDのパーティションをコピーする、USBメモリやCD-ROMのバックアップを取る、といった使い方が可能です。

下記コマンドでコピーします。

```bash
$ sudo dd if=/dev/(コピー元のSDカード) of=/dev/(ターゲットカード) bs=10M
```

私の場合は下記コマンドでした。
```bash
$$ sudo dd if=/dev/ mmcblk0 of=/dev/sda bs=10M
```

30分くらい待ったら完了しました。
新しいSDカードを別のラズパイにさして起動すると、無事コピー環境が立ち上がりました。

# おまけ

古いラズパイの時と同じIPアドレスで、新しいOSを立ち上げてssh接続しようとしたら怒られました。

https://qiita.com/hnw/items/0eeee62ce403b8d6a23c

> SSHでは初回接続時に接続先ホストの公開鍵を保存しておき、次回接続時にホスト鍵を比較して前回と同じホストに接続したかを確認するような仕組みになっています。そのため、IPアドレスの振り直しやOS再インストールなどでホスト鍵が変わってしまった場合、次のようなエラーメッセージが出てSSH接続が失敗してしまいます。

known_hostsファイルからホスト鍵を削除してから、接続しました。
```bash
ssh-keygen -R [接続先IPアドレス]
```
なぜ単体テストを行うのか？


## はじめに
社員の皆さんはこんな奴が最近エンジニアになって頑張ってるんだなと暖かい目で読んでいただければと思います。

社外の方やエンジニアを目指している方は少しでも学習の参考や、コネクター・ジャパンに興味を持っていただければと思います。

さて初めに、皆さんは単体テストについてどれだけ知っていますか？
単体テストはソフトウェア開発の重要な部分であり、品質を維持し、持続可能な開発を可能にするためのキーとなります。この記事では、「Manning Publishing: Unit Testing Principles, Practices, and Patterns」の翻訳書である「単体テストの考え方/使い方」という本を読んで「単体テスト」に着目して学んだことを記事にしました。

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

単体テストの重要性、その構造、そして良いテストを作成するための方法について深く掘り下げます。

## 自己紹介
未経験から独学でプログラミング学習し5ヶ月でLaravelでポートフォリオを作成しました。そして現在は自社開発企業に入社し、WEBエンジニアとしてプロダクト開発に携わっています。エンジニアになって早いもので4ヶ月経ちました。

## この記事を書いた理由

この本から得た知識をアウトプットしたいと思いました。また、単体テストに関する理解を深めることで、開発プロジェクトの成長を促進させることを目指しています。

## 記事の流れ

1. 単体テストとは何か
2. 単体テストの重要性
3. 単体テストの3つの手法
4. じゃあどの単体テストを優先するべきか

---

## 1. 単体テストとは何か

単体テストは、小さなコード片（「単体」と呼ばれる）の振る舞いを検証するテストで、実行時間が短く、隔離された状態で実行されます。これにより、個々のコンポーネントが仕様通りに機能していることを確認することができます。

なぜ単体テストを行うのか？

単体テストの目標は、

「ソフトウェア開発プロジェクトの成長を持続可能なものにすること」

です。

逆に考えると、テストコードを書かないプロジェクトは持続出来ずいずれ修復不可能な状況になりかねないとも言えます。実際にこの書籍では、立ち上げ時期はコード数が少ないためテストコードを書く恩恵が少ないが、コードの量が増えると複雑化していくので、テストコードを書かなければプロジェクトの持続は不可能とされています。

それだけ重要です。

ソフトウェアテストの目的や対象ごとに複数のテストケースを良質にまとめたものにより、プロダクションコードに変更を加えた際に退行が発生しないことを保証し、機能追加やリファクタリングを容易にします。

## 2. 良い単体テストを構成する4つの柱

良い単体テストは、以下の4つの重要な要素で構成されます。これらはテストの価値を決定する際に重要な役割を果たします。

### 退行に対する保護
これはテストがどれだけ効果的にバグを検出できるかを示します。実行されるプロダクションコードが多ければ多いほど、発見されるバグの数も増えます。特にビジネス上重要な機能の場合、バグが大きな影響を及ぼすため、コードの複雑さやドメインの重要性を考慮することが必須です。

### リファクタリングへの耐性
これは偽陽性を出さずにどれだけリファクタリングが可能かを示す指標です。偽陽性は誤った警告を意味し、テスト対象のコードが実際には正しく機能しているにもかかわらず、テストが失敗する状況を指します。これにより、テストの信頼性が低下し、本番環境に問題があるコードが導入されたり、リファクタリングが避けられるようになります。重要なのは、テストの検証内容が実装の詳細ではなく、最終的な結果に焦点を当てることです。

### 迅速なフィードバック
これはテストの実行時間がどれだけ短いかに関連します。テストが迅速に実行されるほど、より多くのテストケースを頻繁に実施できるようになり、結果的にバグの検出が早まり、バグ修正のコストが削減されます。

### 保守のしやすさ
テストケースの理解と実行の難易度を示します。テストケースが分かりやすく、実行が容易であれば、保守性は向上します。

これらの要素を完全に実現することは難しいです。そのため、「リファクタリングへの耐性」と「保守のしやすさ」に最大限取り組むことが重要であり、残りの要素はプロジェクトの全体バランスを考慮して管理する必要があります。


## 3. 単体テストの3つの手法

単体テストには、主に以下の3つの手法があります。

- 出力値ベーステスト
この手法は、プログラムが返す結果だけをチェックします。ここでは、テスト対象のコードが副作用を生じさせず、単に呼び出し元に戻り値を返すだけという前提があります。

- 状態ベーステスト
処理後のプログラムの状態をチェックします。これは、システムやデータベースなど、プログラムの外部状態も含めて検証します。

- コミュニケーションベーステスト
モック（仮のオブジェクト）を使って、プログラムの部品間のやり取りを検証します。

出力値ベーステストは、簡単なコードに最適で、リファクタリング（コードの改善）に強いです。また、小さくて簡潔なテストケースになるため、保守もしやすくなります。しかし、この手法はすべてのテストには向いてません。すべてのテストケースをこの手法で実施する必要はないが、可能な限り多くのテストケースをこの手法で行うことが望ましいとされています。


## 4. じゃあどの単体テストを優先するべきか

単体テストを行う価値が最も高いコードは、「複雑なコード」もしくは「ドメインにおける重要性が高いコード」になります。なぜなら、そのようなコードをテストすることで、退行に対する保護が備わるようになるからです。DDD(ドメイン駆動設計)のような開発手法であれば役割に対する分割がしやすいので、テストがしやすい開発手法と言われています。

## まとめ
この本は単体テストの重要性がこれでもかというほど教えてくれる本でした。
テストをする目的、何を優先してテストするべき、どうテストするべきかということを体系的に学ぶことができた。
C#ですが、サンプルコードがあって実際にリファクタリングしながらの説明や図がたくさん乗っていて全体的に読みやすい本でした。プロジェクトの成長を持続可能に出来るように、実践で実行していきます。

## 一緒に働く仲間を募集しています！
株式会社コネクター・ジャパンでは一緒に働いてくれる仲間を募集しています！

事業拡大に伴い、エンジニアさんを大募集しています。
興味のある方は下記リンクから弊社のことをぜひ知っていただき応募してもらえると嬉しいです。
▼会社について
https://www.wantedly.com/companies/cnctor/about
▼代表メッセージ
https://cnctor.jp/10years-anniversary/
▼応募はこちら
https://www.wantedly.com/projects/1522201

「ご質問があれば、Xまで気軽にDMをお送りください！」
IPアドレスとクラス

# IPアドレスにはクラスがある
枯渇するとか言われているIPアドレスにはクラスがあります。
## IPアドレス
まずIPアドレス。
IPv4では
00000000.00000000.00000000.00000000
から
11111111.11111111.11111111.11111111
まであり、10進数にすると
0.0.0.0
から
255.255.255.255
まであります。

## クラスで分ける
そして、これらいい感じに分けたものがクラスです。
具体的には
書き方
クラスA	0.0.0.0~127.255.255.255
クラスB	128.0.0.0~191.255.255.255
クラスC	192.0.0.0~223.255.255.255
クラスD	224.0.0.0~239.255.255.255
クラスE	240.0.0.0~255.255.255.255
です。
これらの頭の部分について
|クラス|2進数|10進数|
|:-----------|------------:|:------------:|
|A|00000000~01111111|0~127|
|B|10000000~10111111|128~191|
|C|11000000~11011111|192~223|
|D|11100000~11101111|224~239|
|E|11110000~11111111|240~255|

でクラス分けすることができます。

## ネットマスク（クラスの意味）
クラスでネットマスクを判断できます。
|クラス|ネットワーク部|ホスト部|
|:-----------|------------:|:------------:|
|A|255|255.255.255|
|B|255.255|255.255|
|C|255.255.255|255|

D,Eは複雑というか...

## ネットマスクの意味
クラスAよりもクラスCのほうが一つのネットワーク内でで多くのアドレスを割り当てることができます。ISPとかのイメージ...
【Xcode】runtime profile not found using "System" match policy Download the com.apple.CoreSimulator.SimRuntime.iOS-x-x simulator runtime from the Xcode Settings.

# はじめに
シュミレーターが使えなくなる問題に遭遇したので記録しておきます。

https://x.com/SNQ2001/status/1730123989975171171?s=20

# 状況
シュミレーターで実行すると以下のようなエラーが出る

![スクリーンショット 2023-11-30 16.17.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/f56c699a-0723-d3e3-9f0d-1b6c080b99bc.png)

全てのシュミレーターで発生するわけではない

# それっぽい記事
ただ、あんまり情報がなかった
https://developer.apple.com/forums/thread/708544

# 解決方法
① 「Manage Run Destinations...」を選択します。
![スクリーンショット 2023-11-30 22.02.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5e6c256a-8f81-2206-7dfa-0426acd70922.png)

② 「Simulators」を選択します。
![スクリーンショット 2023-11-30 22.04.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/96f5ceff-4db4-d305-a977-3254886f99eb.png)

③ 問題のあるシュミレーターを選択して、右クリックします。
④ 「Delete」を選択します。
![スクリーンショット 2023-11-30 22.05.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a3c54182-ce54-da5f-2784-eb813600b106.png)

⑤ 左下の「+」を選択します。
![スクリーンショット 2023-11-30 22.08.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/54cc8d59-f2e1-1097-9500-ba118a726a43.png)

⑥ 同じ条件で再度シュミレーターを設定します。
⑦ 「Create」を選択します。
![スクリーンショット 2023-11-30 22.09.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9c901878-b91e-3ea6-55f9-6bb9a8274b82.png)

# おわり
私は上記の手順でシュミレーターを起動する事ができるようになりました。
【PowerShell】スクリプトブロックを利用する

# はじめに

最近職場で以下のようなコードを見かけたのですが、恥ずかしながら最初は意味が全く分かりませんでした。
コードを書いた本人に聞いてみたところ「スクリプトブロックという機能を利用している」とのことだったので、今回はスクリプトブロックについて調べた結果をまとめてみました。

```powershell:test.ps1
function SayHello ($param) {
    Invoke-Command $param
    Write-Host "Hello, world!"
}

SayHello {
    Write-Host "A"
    Write-Host "B"
    Write-Host "C"
}
```

```text:test.ps1の実行結果
A
B
C
Hello, world!
```

# 学習環境

今回はWindows PowerShell ISEとVS Codeを使いました。

# スクリプトブロックとは

* [Microsoftのリファレンス](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_script_blocks?view=powershell-7.4)を見ると、以下のように書かれていました。

> PowerShell プログラミング言語では、スクリプト ブロックは、1 つのユニットとして使用できるステートメントまたは式のコレクションです。 ステートメントのコレクションは、中かっこ ({}) で囲んだり、関数として定義したり、スクリプト ファイルに保存したりできます。 スクリプト ブロックは値を返し、パラメーターと引数を受け取ることができます。

つまり、最小のスクリプトブロックは以下のように定義されることになると思います。

```powershell:test2.ps1
{
    Write-Host "test"
}
```

```text:test2.ps1の実行結果
test
```

# スクリプトブロックを変数に入れる

* スクリプトブロックという処理のまとまりを変数に入れることで、見かけはJavascriptの無名関数のような感じです。
* 普通の関数のように呼び出せないので、`Invoke-Command`か`&`を使って実行します。

```powershell:test3.ps1
$func = {
    Write-Host "test"
}

Write-Host "Start test..."
& $func
```

```text:test3.ps1の実行結果
Start test...
test
```

# スクリプトブロックに変数を渡す

* さらに一歩進んで、「スクリプトブロックを変数に入れる」だけでなく「スクリプトブロックに変数を渡す」という処理を入れてみました。
* `$func`の定義部分は、引数ありの普通の関数みたいな感じです。

```powershell:test4.ps1
$message = "Hello, world!"
$myName = "nkojima"

$func = { param($msg, $name)
    Write-Host "${msg} from ${name}"
}

& $func -msg $message -name $myName
```

```text:test4.ps1の実行結果
test
```

# 最初のコードについて

* ここまで理解すると、「はじめに」に書いたコードは、SayHello関数の引数として直接スクリプトブロックを渡していることが分かります。
* そのため、以下のように書き換えることが可能です。

```powershell:test.ps1の修正版
function SayHello ($param) {
    Invoke-Command $param
    Write-Host "Hello, world!"
}

$func = {
    Write-Host "A"
    Write-Host "B"
    Write-Host "C"
}

SayHello $func
```

```text:test.ps1の修正版の実行結果
A
B
C
Hello, world!
```

# まとめ

* 古典的なコードの書き方しか知らないと戸惑うと思いますが、少し書いている内に慣れてくると思います。
* スクリプトブロックを引数として使うと、例えば以下のように**メイン処理の前後に必ず入れたい処理を確実に入れることができる**というような使い方ができると思います。
  * 例えば前処理に「コネクションの作成」、後処理に「コネクションのクローズ」などを入れると、メインの処理を（スクリプトブロック内に）書くことに注力できるようになります。
  * ただしこの使い方はパッと思いついたものなので、もしかすると不適切かもしれませんが...

```powershell:test5.ps1
function SayHello ($param) {
    Write-Host "ここで前処理を行う"
    Invoke-Command $param
    Write-Host "ここで後処理を行う"
}

SayHello {
    Write-Host "メインの処理を行う"
}

Write-Host "処理終了"
```

```text:test5.ps1
ここで前処理を行う
メインの処理を行う
ここで後処理を行う
処理終了
```

# 参考URL

* [about_Script_Blocks - Microsoft Learn](https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_script_blocks?view=powershell-7.4)
「MEC」って何？？？

# ユーザの近くにコンピュータ配置したらいいことあるかも？
私の研究テーマの **MEC(Multi-access Edge Computing)** は、一言でいうとこんな感じの技術です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532897/6d0bf9db-8833-599f-a6e8-bc418f2ba9f3.png)
引用元：NEC [エッジコンピューティングとは？IoTの活用事例も解説](https://www.nec-solutioninnovators.co.jp/sp/contents/column/20220225_edge-computing.html)

これだけ聞いても、そもそもの **エッジコンピューティング** というのはなんなんだという話だと思います。

5Gネットワークが普及しつつある現代では、デスクトップコンピュータだけでなくスマホやタブレット、車、果ては家電まで様々なものがインターネットに接続できるようになっています。

これが何を意味するかというと、一つの通信網が取り扱う通信の量が増えるということを示しているわけです。

例えば皆さんがYoutubeで動画を見るときには、Youtubeのサーバにリクエストを送って動画のデータを取ってくるわけですが、ご存じの通り動画データというのは、内容にもよりますが一般的に文書ファイルなどより容量が大きくなります。

これに対処するため、現在はたいていの場合において動画のデータはエンコード(≒圧縮)してインターネット上に送信されます。

みなさんのスマホにYoutubeの動画が届くと、こんどは動画データのデコード(≒解凍)を行います。

しかし、このときスマホのスペックが十分でなかったとするとどうでしょう？

動画のデコードに時間がかかり、結果としてユーザがイライラすることにつながるわけです。

「だったらわざわざインターネット上まで取りに行かなければいいじゃん」というのがエッジコンピューティングでの考え方です。

上の図でいうと、上のクラウド部分から予めデータを受け取っておくための十分なスペックのあるサーバを、ユーザの(ネットワーク的に)近くにおいておくことで、事前に動画のデコードを行うことができ、あとはユーザがこれを受け取ってみるだけというわけです。

これをさまざまなネットワークの入口(e.g. イーサネット、WiFi、LTE、5G etc)につないでみよう、というのがMECの考え方です。

# MECって何ができるの？
これに関しては、MECは発展途上の技術であるため未だ不明な点が多いですが、よく言われているMECで実現できることとしては
 - 低遅延通信
 - ネットワーク負荷の軽減
 - セキュリティの向上

などが挙げられています。

現在日本でMECに関するサービスを提供しているキャリアとしては
 - docomo：[docomo MEC](https://www.mec.docomo.ne.jp/index.html?utm_source=google&utm_medium=cpc&utm_campaign=docomomec_001_pssm_g_search&argument=pEDirdeN&dmai=a645b08f78284c&gclid=Cj0KCQiAgqGrBhDtARIsAM5s0_l5I2D_osyOaP9YB7zCEd8FdEYHioV0AP4AIopTHN5hQrB1b4dxi9QaAnH4EALw_wcB)
 - KDDI & AWS：[AWS Wavelength](https://biz.kddi.com/5g/aws_wavelength/)
 - softbank：[5G MEC](https://www.softbank.jp/corp/news/press/sbkk/2022/20220526_01/)

が商用のMEC技術の提供を行っています。

# 意外といろいろできるかも
主な活用先としては
 - 自動運転
 - VR・AR
 - 通信経路最適化
 - ゲーム
 - 映像配信
 - 遠隔操縦

 などに活用できると考えられています。夢がひろがりんぐですね。

 # 最後に
 先ほども言ったようにMECはまだ発展途上の技術であり、[ETSI](https://www.etsi.org/)という団体が主に規格の標準化を行っています。

 ここの標準化仕様書を読むと、魔境に迷い込めるのでお勧めです。皆さんぜひモバイルネットワークの魔境に来ましょう。

 ### 筆者
 神奈川県藤沢市の僻地でネットワークの研究をしている慶應の2年生です。
 血を吐くぐらいまでは我慢できるので、私にモバイルネットワークの運用のできるインターンを教えてください。
開発時のエラー箇所発見のお手伝い、"ErrorHandler"

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の5日目の記事です。

## 開発時のエラー箇所発見のお手伝い、"ErrorHandler"

`ErrorHandler`は、開発時にエラー箇所の特定を容易にするコンポーネントです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9882/131e0018-e795-0abb-07fb-5daa1dcb2303.png)

Symfonyを使っている人であれば、見たことあるエラー画面だと思います。この画面の出力のお手伝いをしているコンポーネントです。Symfony以外でも動作します。

### インストール

```
composer require symfony/error-handler
```

### 使い方

Symfonyにはすでに仕込まれているので、意識することないとは思いますが、使うこと自体はとても簡単です。

```php
use Symfony\Component\ErrorHandler\ErrorHandler;

ErrorHandler::register(); // ErrorHandlerの登録

throw new \LogicException('error'); // わざとException
```

ErrorHandlerを利用しない場合、PHPをコンソールで実行するとこんな感じになります。

```shell
PHP Fatal error:  Uncaught LogicException: error in /path/to/error.php:9
Stack trace:
#0 {main}
  thrown in /path/to/error.php on line 9

Fatal error: Uncaught LogicException: error in /path/to/error.php:9
Stack trace:
#0 {main}
  thrown in /path/to/error.php on line 9
```

これが`ErrorHandler::register()`を仕込んでおくだけで

```shell
LogicException {#6
  #message: "error"
  #code: 0
  #file: "./error.php"
  #line: 9
}
```

こうなります。見やすい。


## デバッグモード

上記のような記述で、Web上で例外が起こると、

![スクリーンショット 2023-11-30 22.00.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9882/1ab63ed2-f852-09d0-604a-1e4a3fde004f.png)

こうなります。これだと開発中はどんなエラーがでたのかがちょっとわかりません。そこで利用するのが`Debug`です。

```php
use Symfony\Component\ErrorHandler\Debug;

Debug::enable(); // デバッグ用のErrorHandlerの登録

throw new \LogicException('error'); // わざとException
```

こうすると

![スクリーンショット 2023-11-30 22.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9882/8a3e38e9-6ff7-c022-d1c3-c5352de75aa4.png)

こうなります。いつもの画面です。

## まとめ
今回は`ErrorHandler`でした。やってることはシンプルなコンポーネントですが、開発時の強い味方です！
thisについて/JavaScript

JavaScriptの学習ででつまづいた所をアウトプット。
thisってどこを参照してるの？？という事で学習した事をまとめてみます。


参考：Udemy（【JS】ガチで学びたい人のためのJavaScriptメカニズム）


## そもそも「this」とは？
呼び出し元のオブジェクトへの参照を保持するキーワードの事。
どういう事かというと…。
下記の記述の場合だと、thisの参照先はpeopleでありnameプロパティを参照している事になる。

```
const people = {
    name: 'John'
    hello: function() {
        console.log('Hello' + this.name);
    }
}

people.hello();
```

しかも「this」は実行コンテキスト（コードがどのような状況で実行されているかという事）によって参照先が変わる！！！
ここがややこしかった…。

★実行コンテキストの種類★
・グローバルコンテキスト：JavaScriptファイル内直下の実行環境。グローバルスコープであり、ウィンドウ全体で共有される変数や関数を定義可能に。
・関数コンテキスト：関数の宣言の{ }で囲っている際のコードの実行環境。



## グローバルコンテキストを参照する場合
```
window.name = 'Taro';
const people = {
    name: 'Tom'
    hello: function() {
        console.log('Hello ' + this.name);
    }
}
const ref = person.hello;
ref();
```
関数として実行する場合。
上記の記述だと、'Hello Taro'と出力される。


## 関数コンテキストを参照する場合
```
window.name = 'Taro';
const people = {
    name: 'Tom'
    hello: function() {
        console.log('Hello ' + this.name);
    }
}
person.hello();
```
オブジェクトのメソッドとして呼び出す場合。
上記の記述だと'Hello Tom'と出力される。
軽深演習 #1 BL33XU 軽深（かるしん）なんちゃって圏論

### 軽深（かるしん　なんちゃって圏論） Advent Calendar 2023 第一日目の記事です。

演習形式をとっているので、ぜひ　回答を試みてください。
6/2 20:00-21:00 イベント（オンライン　勿論無料）やります。
[圏論（けんろん）とTRIZの面白い話 2024/6/2](https://setk.connpass.com/event/317353/)
この軽深演習 #1 BL33XU　が難しいと思われた方はぜひご参加ください。

### 前提知識　数学とは違うものを同じものとみなす技術である　ポアンカレ
圏論は、数学の基礎理論なので、数学を理解する必要があります。一瞬で数学を理解するために、ポアンカレの言葉を覚えましょう。簡単に覚えられますよね。

### なぜ圏論のアドベントカレンダーを始めたか？　圏論の勉強始めてから自分が賢くなったと感じたので、みんなにも賢くなってもらいたいなと思って圏論の記事を書いて読んでもらおうと思いました。

### 体験的理解を基本とします。知識として圏論を理解するのは大変難しいです。

# 演習 BL33XU
では、上記ポアンカレの言葉に関連する演習です。制限時間 15分
**この演習は、ほとんど知識のない領域のことについて、重要性を判断するものです。**

Spring-8 という放射光というX線をつかい高度の分析を行う国の大規模施設が兵庫県にあります。放射光の利用は、ビームラインと呼ばれるSpring-8内に複数設置された施設によって各種団体に提供されています。[豊田中央研究所](https://www.tytlabs.co.jp/)（以下、トヨタと略）は、[専用のビームライン BL33XU](https://user.spring8.or.jp/sp8info/?p=3002)をもっています。一企業が、専用のビームラインをもつことは、注目を集めることだと思います（私はそう思います。）　BL33XU と同じように、注目を集めるようなビームラインに気づいたら、指摘してください。注目を集めるかどうかは、あなたの判断でお願いします。
対象となるビームラインは、BL10からBL20 の間にします。[ビームライン一覧はこれです。](http://www.spring8.or.jp/ja/about_us/whats_sp8/facilities/bl/list/)

### 同様の演習はなんどか行ったのですが、誰もできませんでした。
ただ、これまでは、気づいたことを回答してください　だったので非常に難しかったようです。ビームライン一覧を見て気づいたことを述べよ　というものだったので回答ができなかったようです。なんでもいいから気づいたことをどうぞ　という問いかけは、私の想像以上に難しいものだったようです。そこでこの演習はポアンカレの言葉と関連付けて、回答しやすくしてあります。もちろん正解があるものではないので、何でも自由に回答してください。回答はコメントでお願いします。但し、ああ、このビームラインのことだなと即座に分かった人は固有名詞をコメントには書かないでください。
seleniumを使ったスクレイピング

## 初めに
最近スクレイピングに興味を持ったので作ってみました。
まだまだ初心者なのでコードが汚い部分もあるかもしれません。

今回はスクレイピング練習サイトとして公開されているこちら↓
https://scraping-for-beginner.herokuapp.com
を使用させていただきました。

## ライブラリのインストール
pipでインストールしました
```
pip install selenium
```

## コード
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from time import sleep

USERNAME = "imanishi"
PASSWORD= "kohei"

#headlessモードにする
options = Options()
options.add_argument('--headless')

driver = webdriver.Chrome(options=options)

#特定のURLへ移動
driver.get('https://scraping-for-beginner.herokuapp.com/login_page')
sleep(0.5)

#最大待機時間を5秒にセット
driver.implicitly_wait(5)

#usernameを入力
elme_username = driver.find_element(By.NAME,"username")
elme_username.send_keys(USERNAME)
sleep(0.5)

#passwordを入力
elme_password = driver.find_element(By.NAME,"password")
elme_password.send_keys(PASSWORD)
sleep(0.5)

#loginボタンをクリック
elem_login = driver.find_element(By.NAME,"btn_login")
elem_login.click()
sleep(0.5)

#項目名を取得
th = []
get_th = driver.find_elements(By.TAG_NAME,"th")
for s in get_th:
    th.append(s.text)
sleep(0.5)

#値を取得
td = []
get_td = driver.find_elements(By.TAG_NAME,"td")
for s in get_td:
    #改行コードがあった場合「,」に置き換える
    set_text = s.text.replace('\n', ',')
    td.append(set_text)
sleep(0.5)

#出力
for i in range(len(get_th)):
    print("{0}\t{1}".format(th[i],td[i]))
```
## 出力結果
![無題6_20231130212641.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624520/a787e50f-907d-16c8-9eec-768138cc5992.png)

## 最後に
今回はデータを取得しただけだったので次はExcelなどに保存できるようにしようと思っています。
MapLibreのこれまでとソフトウェア群の紹介

# はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/a6c4f182-ae85-9f7d-007e-acd05217137e.png)


[MapLibre User Group Japan](https://dayjournal.notion.site/MapLibre-User-Group-Japan-Official-Web-Site-4ecb7ea313f945f39ccc2ca8dfbaad4f)の@Kanahiroです。

MapLibreとは、モダンなWeb地図にまつわるOSSを傘下に収める開発者コミュニティです。本記事では、MapLibreとはなんなのか・設立経緯・主要なソフトウェア群を紹介します。

# MapLibreとは

https://maplibre.org/

「モダンなWeb地図にまつわるOSSを傘下に収める開発者コミュニティ」と述べましたが、GitHub Organizationがあり、そこで活動する団体です。法的な根拠があるのかよくわからないですが、立候補・投票制の理事会（Governing board）、投票者（Voting Member）からなる、それなりにしっかりした組織です。主に欧州のメンバーが中心となって開発が進んでいます。2022年ごろからAWSやMetaといった大企業からのスポンサーも受けており、それなりに安定した活動をしている印象です。

## 設立の経緯

2020年12月に、Mapbox GL JSのv2.0.0がリリースされた際に、それまでのBSDライセンスからプロプライエタリへと移行しました。これに伴いフォークされて生まれたのがMapLibre GL JSです。このときに、MapLibreというOrganizationも同時に出来ました。これが設立の経緯で、この時点では現在までの展開はそこまで意識されていなかったと思います。実際、しばらくの間はGL JSのメンテナンスが主たる活動でした。

# MapLibreの主なソフトウェア

当初はMapboxのOSSのフォークという位置付けでしたが、3年を経て独自路線へシフトし、ベクトルタイルを中心としたWeb地図のエコシステムを担うようになっています。これは、MapLibreのリポジトリをチェックすれば、現代のWeb地図に必要な基礎技術を利用できるということを意味します。
以下ではMapLibreの主要なソフトウェアを紹介します。

## MapLibre GL JS

https://github.com/maplibre/maplibre-gl-js

![Screenshot 2023-11-27 at 11.08.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/4b04e173-731f-d335-a6bf-8a018f0ba0b0.png)

- ブラウザ向けの高パフォーマンスな地図ライブラリ
- 豊富な地図デザイン機能
- 地形表現
- TypeScriptで書き直されている

## MapLibre Native

https://github.com/maplibre/maplibre-native

- Mapbox GL Nativeのフォーク
- C++で書かれている
- Node.js, iOS, Android, Qtなどのネイティブ向けの実装
- iOSではOpenGLからMetalへの移行を進んでいる

## Martin

https://github.com/maplibre/martin

- PostGISバックエンドなベクトルタイルサーバー
- Rust/Actixで書かれていて高速
- glyph/spriteの動的配信に対応

:::note
2023年11月9日に開催した[MapLibre Meetup Japan #01](https://mug-jp.connpass.com/event/293158/)の筆者発表にてMartinの紹介をしました。詳しくは下記のスライドをご覧ください。
https://docs.google.com/presentation/d/1BKaVgIV1jO2rudI0UJHccs8RVLGotQpYdlWj1iVROMQ/edit?usp=sharing
:::

## maplibre-rs

https://github.com/maplibre/maplibre-rs

- Rust/wgpuで書かれている
- WebGPUのPoCのための実験的リポジトリ

その他にも多数のリポジトリがあるので、ぜひ[Organization](https://github.com/maplibre)を覗いてみましょう。

# 終わりに

AWSなどのビッグテックのスポンサーも継続しており、今後も安定した運営が期待できます。

## MapLibre User Group Japan(MUG-JP)

https://github.com/mug-jp

MUG-JPは、MapLibreソフトウェアの日本での普及を応援しています！
インフラエンジニアあるある（その１）

みなさんこんにちは！

IT業界は、開発エンジニア、インフラエンジニアのどちらも大事ですね。
最近はクラウドの発達によって開発エンジニアもインフラ領域に入ったりしてますが、やはり餅は餅屋。
インフラエンジニアの専門知識は凄いです。

私も一時期インフラエンジニアだったので、開発エンジニアとの比較も交えて、ご紹介したいと思います。（私の主観です）

# インフラエンジニアあるある
### サーバーが動くのが当たり前だと思われている
みなさんが使うサービスは、全てサーバーで動いています。クラウドも裏はサーバーです。
このQiitaもそうですが、普通に使えますよね？全然アクセスできない、なんてことは滅多に起こりませんね。

でもこれは、普通ではないんです。

今ではある程度自動制御になっている部分もありますが、サーバーは不死身ではありません。なんらかのトリガーにより不具合が発生したり、落ちたりします。

通常は冗長化構成になっていてダウンタイムを最小限に抑えてますが、何かあれば、インフラエンジニアが動きます。被害を最小限にするために、昼夜問わず対応します。

いつも快適にサービスを使えていたら、褒めてあげてください。

### 夜勤が多い
内容にもよりますが、サーバーのメンテナンスは、夜間が多いです。
何かあったときに、被害を最小限にするため、利用者が一番少ない曜日や時間帯で作業します。

日勤の作業と夜勤の作業を比較すると、夜勤のヒューマンエラーは圧倒的に多いです。
判断力が1/3くらいに低下しているため、昼間だったら絶対にミスしない作業でも、なぜかミスをすることがあります。昼間にたっぷり寝ても、あまり変わりません。

そのため、手順書をこれでもかと言わんばかりに丁寧に書きます。
それでもリスクがあるので、シェルで徹底的に注意事項を表示して、「y」とか「yes」ではなく、わざわざ面倒な「Yes」を入力しないと先に進めないようにしたりします。

### 体育会系が多い
職業柄か、開発エンジニアよりも体育会系の方が多い印象です。
規律に厳しく、競争心が激しく、向上心が高いです。

例えば私も、ログから何かを集計する作業において、いかにワンライナーかつ短時間で集計できるか、というのを先輩方と競っていたりしました。

しかしそのおかげで、スキルアップのスピードが速く、チームワークは素晴らしいものがあります。

### 冷静に分析する人が多い
サーバーで何か発生すると、すべて発生している事象から判断します。
ストレージの使用量、CPUやメモリの使用率、システムログなど、限られた情報から判断します。
そのため、熱いものを持っている反面、冷静に分析する人が多いです。

# まとめ
今回は過去の経験から、簡単にインフラエンジニアの紹介をしました。
開発エンジニアとインフラエンジニアは、全くタイプが違います。

それぞれ別の視点を持っているので、どちらも経験した方が、他のエンジニアとの差別化を図れるかもしれませんね。

何かに特化するのもいいですが、興味があれば、色んな分野を経験して、様々な視点や知識を身につけてみてはいかがでしょうか。

私もまだまだこれからなので、みなさん一緒にがんばりましょう！
GmailAppの送信制限回避策

GmailApp.sendEmail()は、1日あたりのメール送信数に制限が設けられています。
これを回避する方法です。

<h1>回避方法</h1>

手順
1. 下書きを作成
2. 下書きを送信

ソースコード
```js
  const draftId = GmailApp.createDraft("email","subject","body").getId();
  GmailApp.getDraft(draftId).send();
```

尚、getDraft(draftId)を介さないと、普通に制限にカウントされます。
```js
  GmailApp.createDraft("email","subject","body").send();
  ```

実際にテストしてみました。

ソースコード

```js
function myFunction() {
  const { email } = env;
  console.log("初期値 : " + MailApp.getRemainingDailyQuota());

  GmailApp.sendEmail(email,"current time","The time is:" + new Date().toString());
  console.log("通常のメール送信 : " + MailApp.getRemainingDailyQuota());

  const draftId = GmailApp.createDraft(email,"current time","The time is:" + new Date().toString()).getId();
  GmailApp.getDraft(draftId).send();
  console.log("下書き経由1 : " + MailApp.getRemainingDailyQuota());

  GmailApp.createDraft(email,"current time","The time is:" + new Date().toString()).send();
  console.log("下書き経由2 : " + MailApp.getRemainingDailyQuota());

}

const env = (() =>  new Proxy({e : PropertiesService.getScriptProperties()}, {
      get: (t, p) => t.e ? t.e.getProperty(p) : void 0,
      set: (t, k, v) => t.e ? t.e.setProperty(k, v) : void 0
  }))();
```

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953722/d44e434e-c72b-96a4-6275-60cf04b8fa8e.png)
for が速い場合もある

モンテカルロ法による円周率を求めるプログラムは，練習問題として言語を問わずよく取り上げられる。

言語によっては以下のようなプログラムを「まずいプログラム」とみなす場合があるが，Julia の場合は，実行効率が非常に高い。


```Julia:julia
function estimate_pi(n::Int)
    count = 0
    for i = 1:n
        x, y = rand(), rand()
        if x^2 + y^2 < 1
            count += 1
        end
    end
    return 4count/n
end;

@time pi_est = estimate_pi(100000000)
println("Estimated pi: ", pi_est)
```

      0.263574 seconds (1 allocation: 16 bytes)
    Estimated pi: 3.14143436


実行所要時間は平均的に 0.25 秒ほどである。

プログラマによっては以下のようにベクトル化するのを好む場合がある。しかし，Julia では上のプログラムに比べて，遅い!！


```Julia:julia
function estimate_pi2(n::Int)
    xs, ys = rand(n), rand(n)
    count0 = count(xs.^2 + ys.^2 .< 1)
    return 4count0/n
end;

@time pi_est = estimate_pi2(100000000)
println("Estimated pi: ", pi_est)
```

      2.448459 seconds (15 allocations: 3.737 GiB, 1.84% gc time)
    Estimated pi: 3.14149128


実行所要時間はばらつきがあるがたいていは 2.5 秒ほどである。ときどき 0.6 秒ほどのときもあるが，そういうのは少ない。

ちなみに，ベクトル化といえば R の十八番であるが，R でも 1.4 秒台である。


```R:R
system.time({n = 100000000;print(mean(runif(n)^2+runif(n)^2 < 1)*4)})
```

    [1] 3.141426



       ユーザ   システム       経過  
         1.489      0.151      1.650 


考察するに，Julia の場合，ベクトル化を意識して書かれたプログラムは面倒くさい処理をするために複雑なコードを生成しているが，for ループで単純に書かれたプログラムは簡潔なコードを生成しているのであろうか。

一概にはいえないだろうが，まずは単純なプログラムを書いて，効果を見ながらブラッシュアップしていくというのがよい戦略ではないだろうか。
ISUCON13に参加しました

# ISUCON初参加

ISUCONの存在は前々から知っていたが、[ISUCON夏祭り](https://isucon.connpass.com/event/288820/)に参加してISUCON参加意欲が沸々と湧き上がり、初参加するに至る。
方々に声を掛け、現職と前職のメンバーでチームを組むことになった。

# ISUCON 0次予選

**ISUCON13は予選なし**と聞いていてすっかり油断していたが、予選はあった。
そう**申し込み予選**。
"1次申し込み100組まで"とあったので、申し込み開始時間から1時間後、「そろそろ申し込んでおくか〜」と思ったら**受付終了**のお知らせ。開始1分で受付終了したもよう・・・。

そんな激戦区とは知らなかったので、2次申し込みは開始10分前から待機。
**チーム名をクリップボードに入れ**いつでも申し込める体制に。
1分前から定期リロードをし、フォームが開いた瞬間に一気に登録！！！
無事参加登録できた。

# ISUCON準備

事前準備は[ISUCON夏祭りのハンズオン](https://speakerdeck.com/rosylilly/isucon-xia-ji-ri-2023-hanzuonzi-liao)でも教わった通り[private-isu](https://github.com/catatsuy/private-isu)で学習。
チームで集まって練習会とか開いた。
ただ、ベンチマーカ含め全部ローカルPC内で動かすと、ベンチマーカがリソースをもって良すぎて全然スコアが伸びない・・・。ec2などクラウドを使ってベンチマーカとアプリは別のインスタンスに分けるのが吉。

# 本番

1日貸し会議室を借りて参戦。
Youtubeのオープニング配信でローディングがぐるぐる回り、「この会議室のWiFi弱い！？！？！？」とめっちゃ焦りましたが、そう言うネタだったと知って安心（でももうやめて欲しい）。

# レギュレーション違反

与えられたCloudFormationは同じAMIのEC2が3つで、ベンチマーカが向いているのは一つだけ。
今思うと、「３台のインスタンスを3人の開発環境として使えるようにしたよ」って配慮だったと思うのだけど、早々に「とりあえずDBをRDSにしよう！」とインフラ構成変更に。

が、RDSにデータは移行できたもののなぜかアプリからはつながらず。
試しに新たにMySQL専用EC2を立ち上げて、それにデータ移行してアプリからつなげたら無事に繋がった。

と、ここで**あれ？勝手にインスタンス増やしたりしたりしていいんだっけ？**と思い直し、これがまかり通るなら**札束で殴れるじゃん**と思ってレギュレーションを見直す。
「別に[禁止事項](https://isucon.net/archives/57768216.html#:~:text=%E5%A4%B1%E6%A0%BC%E3%81%A8%E3%81%99%E3%82%8B%E3%80%82-,%E7%A6%81%E6%AD%A2%E4%BA%8B%E9%A0%85,-%E4%BB%A5%E4%B8%8B%E3%81%AE%E8%A1%8C%E7%82%BA)」にはインスタンス勝手に増やしちゃダメって書いてないなあ、と思ったら

> 主催者の指示以外で利用が認められたサーバー以外の外部リソースを使用する行為(他のインスタンスに処理を委譲するなど) は禁止する

としっかり[レギュレーション](https://isucon.net/archives/57768216.html)に書いており、思いっきりレギュレーション違反していたことに気がつく。
ここまで2時間無駄な時間を過ごす。

# EC2の役割変更

結局、EC2の２台をアプリケーションサーバ、１台をDBサーバに構成変更することに。
構成変更する間に、DBのindex貼りやアプリの改修を同時に進める。

で、ここで思ったのが、インフラ構成変更を真っ先に始めてしまったので、その作業が完了するまでテストをしたりやベンチマーカが動かせないことに気がつく。なので、行った改修が問題ないか、パフォーマンス改善できたのか調べる手段がないことに気がつく。
結局そういう確認はインフラ構成変更まで待つことになった。

# 終盤の追い込み

インフラ構成変更とDBチューニングは功を奏してとりあえずそれだけで1万点は超えた。
DNS水責め対策は何をしたら良いかわからなかったので、とりあえずPowerDNSのコンフィグをいじってみたが、点数はあまり変わらなかった。今思うとPoweDNSで使ってるMySqlも適当にindex貼っておけばもっとスコア上がったかもと思った。

そして、アプリの改善はというと・・・いざ動かしてみるとエラー発生。インフラ構成変更完了まで動作確認できずひたすら改修を進めていたので、どこまでがまっとうに動いているコードかもわからず、全体的に見直すことに。

直前まで目視デバッグを行いエラーは出なくなったものの、出力結果が明らかにおかしい・・・。終了30分前であきらめ、アプリの改善は全て捨てることに。

# 結果

アプリの改善は全く無しになってしまったが、それでも16000点を超えて130位に。アプリの改善も適用できてたら3万点超えて100位以内に入れたかなあと後悔。その後の打ち上げも盛り上がらずなんだか暗い空気に。

それでも初参加にしてはまあまあやれたんじゃないかと思う。

# 次回こそ

最初からインフラ構成変更に着手したのは間違いだった気がする。
最初はそれぞれ単独で分析を行い、あとから誰が何をするかを取りまとめた方が、上手くできた気がする。初心者は特に。
開発環境というものがないので、一発本番環境を修正するという状況も事前にもっと練習しておけば良かった。慌ててソースをgitにあげたものの。結局全然使われず、手動でソースを同期していた。

来年あれば、もっと上手くやれる気がする。
**ISUCON14も開催して欲しい！！！**
ターミナルに雪を降らせたい。

# ジョークコマンドって面白い
下記のLinuxのジョークコマンド紹介を見て、面白いから私も作ってみようと思いました。
雪を降らせるコマンドがあったので、私なりにbashで似たようなスクリプトを書いてみようと思います。

他にも、スタウォーズの映画を見れるコマンドや電車が走るコマンドがあって、結構面白いです。
仕事の合間に見ると、いい暇つぶしになりますよ。

```:紹介されてた雪降らせるコマンド
ruby -e 'C=`stty size`.scan(/\d+/)[1].to_i;S=["2743".to_i(16)].pack("U*");a={};puts "\033[2J";loop{a[rand(C)]=0;a.each{|x,o|;a[x]+=1;print "\033[#{o};#{x}H \033[#{a[x]};#{x}H#{S} \033[0;0H"};$stdout.flush;sleep 0.1}'
```

https://www.engilaboo.com/linux-joke-commands/#rtoc-13

# bashで頑張って、雪降らせる。
下記スクリプトを作成致しました。
上で紹介されてた`ruby`コマンド程は上手く雪を降らせる事が出来なかったですが、雪降ってるなーとは分かるので、ちょっと達成感。

時間が許せば、もう少し工夫して書きたかったです。
改行を変数に格納出来なかったりで苦戦しました。大した事してないんですけどね。


```bash:降らせようとした結果
#!/bin/bash

col=`tput cols`
line=`tput lines`
array=()

clear

for ((i=1; i<$line; i++)); do

        newline=$newline"\n"

done

while true

do

        for ((i=0; i<$line; i++)); do

                for ((j=0; j<=$i; j++)); do

                        rand=`echo $(($RANDOM % $col))`
                        array+=($rand)

                        if [ $j -ge 0 ] ; then
                        
                                lf=$'\n'
                                blank=`yes " " | head -n ${array[$(($i-$j))]} | tr -d '\n'`
                                output=""$output" "$lf" "$blank"*"
                        fi
                done

                echo "$output" ; sleep 0.3 ; echo -e $newline ; clear
                output=""

        done

done
```

path通して、コマンド叩くと雪が降りますよ。
shで降らしても、OKです。

```shell_session:リンク
[root@localhost ~]# ll /usr/local/bin/snow_fall
-rwxrwxrwx 1 root root 749 Nov 30 20:22 /usr/local/bin/snow_fall
[root@localhost ~]# snow_fall
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621650/9bcbf002-5671-04af-6997-ae72e6017fe3.png)




書くのは楽しかったですが、仕事中に雪を降らせると少し悲しい気持ちになりました。
雪降らせてる場合じゃないと、ふと感じてしまったんですよね。
仕事に戻る事とします。

一瞬でも、癒しをくれてありがとう、、雪。
第一世代　バッテリーをカプラに改造する

「aibo ers-11x/210で遊ぶ Advent Calendar 2023」の1日目です。

aiboのERS-111をメルカリから入手しましたが、バッテリーは放電しきっており機能しない状態でした。

今回はバッテリーを分解、中身のセルを取り出し、ACアダプタの出力を接続することで動作確認できましたことを記します。

:::note alert
警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::

:::note
業務外の個人的な検討活動です。
:::

#### バッテリーパックの分解
先人の記事があったので、そちらを参照しました。
https://qiita.com/ABK28/items/68143f632133f07084cf

#### バッテリーをカプラーに改造
上記の記事を読むと、電源を入れ替えるだけで動作する様でした。
個人的にLiPoバッテリーは取り扱いが難しいと感じていたので、外部電源を使用することにしました。
極性に気を付けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/c09250dc-55dd-6eab-8f07-1ea0efbabf5c.png)

もともと速く動く機体ではないですし、目を離すこともあまりないので、ケーブル捌きにだけは気を付けるようにします。

#### 動作確認
無事に動きました。2時間ほど動かしても問題ありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/b9de765a-2dc1-bebc-515c-f5ae7496b180.png)

10年くらいが長期信頼性の想定目安だとすると、四半世紀近く経っても楽しめることには驚きました。

:::note alert
再度警告
この記事について作者はいかなる責任も負いません。
バッテリーの分解、改造は非常に危険な行為です。
:::

#### 備考
電流は3Aは必要なようです。2Aの場合、起動時や大きな動作をしたときにフリーズしてしまうことがありました。
PHP memory_get_usage() の引数 $real_usage とは？

# 序文
PHP で開発をしていると一度はこんなメッセージを見たことがあるかと思います。

```log
Fatal error : Allowed memory size of xxx bytes exhausted ...
```

上記エラーは許容されているメモリサイズを超えてしまった場合に発生するものです。
このエラーの対処法を調べると、主に以下のような方法がヒットすると思います。

- 許容メモリ量を増やす( [memory_limit](https://www.php.net/manual/ja/ini.core.php#ini.memory-limit) を変更する)
    - php.ini で設定を変更する
    - .htaccess で設定を変更する
    - ini_set() で一時的に設定を変更する
- コードをチューニングする(不要なメモリ使用を減らす)
    - unset() で明示的に変数を解放する
    - [gc_collect_cycles](https://www.php.net/manual/ja/function.gc-collect-cycles.php) でGCを強制実行する
    - 大容量の配列操作時は [Generator](https://www.php.net/manual/ja/language.generators.php) を使う
    - メモリ使用量を監視して許容メモリサイズを超えないように制御する

**メモリ使用量を監視して許容メモリサイズを超えないように制御する** 方法で対処しようとした際に [memory_get_usage](https://www.php.net/manual/ja/function.memory-get-usage.php) を使ってメモリ使用量を監視しようと試みたのですが、このメソッドの引数 `$real_usage` に `true/false` どちらを指定すべきなのかがいまいち分からなかったため調べてみました。

# 本題

## $real_usage とは？

公式のマニュアルには以下のように記載されています。

https://www.php.net/manual/ja/function.memory-get-usage.php
> **real_usage**
これを true に設定すると、システムが割り当てた実際のメモリの大きさ (未使用のページも含むもの) を取得します。 省略したり false を設定したりすると、使用したメモリのみを報告します。
>
> 注意:
PHP は、emalloc() が割り当てたメモリ以外のメモリは追跡しません。

なるほど。よく分かりません。

ググってみたところ Stack Overflow で参考になりそうなものをいくつか見つけました。

https://stackoverflow.com/questions/17566569/php-memory-get-usagefalse-vs-memory-get-usagetrue

https://stackoverflow.com/questions/2290611/tracking-memory-usage-in-php

特に [この回答](https://stackoverflow.com/a/2290965) が参考になりました。

PHP のメモリマネージャー(Zend エンジン)は、メモリが必要になる度に `malloc()` を使用するわけではなく、大きなブロック(環境変数 `ZEND_MM_SEG_SIZE` で設定されている単位でデフォルトは 256KB)でメモリを確保しておき、それを内部で管理しているそうです。
したがって、メモリ使用量には以下の2種類があるそうです。

1. メモリマネージャーが確保したメモリ量( *real usage* )
=> `$real_usage = true`
2. アプリケーションが実際に使用したメモリ量( *internal usage* )
=> `$real_usage = false`

上記を見て、`$real_usage` という引数名とその説明文がやっと理解できました。

## $real_usage = true or false ？

引数の用途が理解できたところで、当初の目的だった **メモリ使用量を監視して許容メモリサイズを超えないように制御する** には `true/false` どちらを指定すべきなのかという話なのですが、「許容メモリサイズ([memory_limit](https://www.php.net/manual/ja/ini.core.php#ini.memory-limit))」の設定値は「1. メモリマネージャーが確保したメモリ量」の方を制限するものなので、この場合は `memory_get_usage(true)` で監視するのが適していると思います。

特定のロジックにおけるメモリ使用量を測定したりする場合には `memory_get_usage(false)` を使うのが良いのかなと思いました。

# おまけ

環境変数 `USE_ZEND_ALLOC=0` を設定すると「メモリマネージャーが大きなブロックでメモリを確保する」メカニズムが無効になり、メモリが必要になる度に `malloc()` を使用する動きになるそうです。
パフォーマンスは大幅に落ちるようですが、外部のメモリトラッキングツールを使用する場合等にはこの設定が必要になりそうでした。
ILI9163V(ST7735のような)で遊ぶ1(2週間から2か月の長期記事)(購入編)ATM0177B3A


ILI9163V(ST7735のような)で遊ぶ1(2週間から2か月の長期記事)(購入編)


目的
秋月で売っている(ST7735のような)ILI9163V
で遊ぶ
目標は、仮想VRAM方式
Adafruit_を都合よく改造
ILI9163

１．７７インチ　カラーグラフィックＴＦＴ　ＬＣＤ（１２８×（ＲＧＢ）×１６０ドット）　ＡＴＭ０１７７Ｂ３Ａ
[ATM0177B3A]
通販コード　P-13618
発売日　2020/11/30
メーカーカテゴリ　Xiamen Zettler Electronics Co., Ltd.



フレキコネクタＤＩＰ化キット（０．５ｍｍ１０Ｐ）
[AE-CNCONV-10P-0.5]
通販コード　K-07253
発売日　2014/04/30
メーカーカテゴリ　株式会社秋月電子通商

![o_cop820.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/455c2e51-25f1-6629-6b99-3b16cd81cb39.jpeg)

![o_cop821.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c52ab5d2-2e22-2d54-2b8a-0d914cc6a921.jpeg)
PhysiKyuについて

⚠記事の内容は学生個人の見解であり、所属する学科組織を代表するものではありません。
# はじめに
AdventCalender 1日目です。今回は九州大学物理自主ゼミサークルPhysiKyuについて紹介していきます。

# PhysiKyuとは
PhysiKyuとは九州大学の学生が学部学年を超えて，物理の自主ゼミを行なっている非公認サークルです。

# PhysiKyuの設立経緯
始まりは，有志の学部1年生が自主ゼミを行なっていた際に，分からないことを自力では解決できない事が多々あり，学年を超えた物理のコミュニティが欲しいと思ったことからでした。幸運にも上級生の協力をいただき，今年の3月に非公認サークルとしてPhysiKyuは始動しました。

# 自主ゼミのすすめ
PhysiKyuは自主ゼミを主な活動としていますが，そもそも自主ゼミとは何でしょうか？自主ゼミとは簡単に言えば「勉強会」のことです。自主ゼミでは，ある特定の分野の専門書をゼミの参加者で分担して各自が発表していき，お互いに学び合います。理系では研究室配属後に，教授の監修のもとでゼミを行う事が一般的ですが，自主ゼミには大きなメリットがあります。以下にその利点をいくつか挙げてみます。

- 好きなテーマを勉強できる
- 難しい本でも仲間と分担して読めば継続できる
- 興味の近い友人ができる

特に難しい本を読み通すことは容易ではなく，この記事を読まれている方の中にも，途中で読み通すのを諦めてしまった経験がある方もいらっしゃるのではないでしょうか。やる気はあるのに専門書を読み通せないというもどかしい経験がある方は，是非，自主ゼミを行うことを検討されてみてはいかがでしょうか！しかし，自主ゼミを始めるにも一筋縄には行かないと思います。それらの主な原因は，

- 人数が集まらない
- どの参考書でゼミを行えばいいのか分からない
- ゼミの参加者の間でも解決できない問題に直面した

が考えられます。ここで出番になるのがPhysiKyuのようなコミュニティーの存在です。PhysiKyuには2023年12月現在，物理に興味を持つ40人以上の会員がいます。会員には院生の方もいらっしゃるため，ゼミの募集がスムーズに行えるだけでなく，自主ゼミで使う本やゼミ中に解決できなかった問題まで，気軽に相談する事ができます！九大生で物理に興味を持つ方は，是非，PhysiKyuへの入会を検討してみてはいかがでしょうか！？入会のご相談はX(旧Twitter)@PhysiKyuのDMにて随時受付中です！


# PhysiKyuの今までの活動
PhysiKyuの設立(2023年3月)から今(2023年12月)まで行ってきた活動を紹介します。
- 自主ゼミ一覧
  - JJサクライ量子力学(上)
  - ランダウ・リフシッツ場の古典論
  - 力学
  - 解析力学
  - 固体物理学
  - 夏の微分形式
- サークル説明会
→ 4月下旬にサークル説明会を行い、たくさんの方が来てくれました！
- 第1回講演会
→ 5月末に2人の大学院生の方に最近の研究内容を紹介していただきました！
- プチ発表会
→ 夏休み明けに３日間に渡り、希望者がオンラインで最近学んでいることや興味を持っている物理など、さまざまなトピックについて発表しました！

# PhysiKyuの現在の活動
- 現在進行中の自主ゼミ一覧
  - 場の古典論
  - 力学
  - 解析力学
  - 軌道力学
  - 情報熱力学（これから初回）
  - トポロジー（冬休み期間を予定)
   
- Xのアカウント運営  
 → それぞれのゼミの実施後に簡単な活動報告を行っています！是非見てみてください！

- サークルTシャツ作成
- サークルWebページ作成

# このカレンダーについて
さて、PhysiKyuでは新たな取り組みとして、アドベントカレンダー2023を実施します。今日から12/22のクリスマス直前まで、サークルのメンバーが物理の話や、個々人の趣味の話を毎日投稿していきます。一連のアドベントカレンダーの記事の中で興味の持てる話題があるといいですね！
そしてなんと、、、最後の3日間(12/23,24,25)は特別なゲストに記事を書いていただけることになりました！:santa:グランドフィナーレは楽しみに待っていてくださいね！

# 終わりに:christmas_tree:
1日目、お付き合いいただきありがとうございました。明日以降の記事をぜひお楽しみください。
Next.js 13で Type error: Type 'typeof import("...")' does not satisfy the constraint と怒られるとき

- 前提
    - Next.js 13系
    - App Router使用

ビルドしようとするとエラー
```
Type error: Type 'typeof import("...")' does not satisfy the constraint
```

→ layoutファイルやpageファイルでexportを忘れていないか確認する。
二作目のポートフォリオを作る話 計画の計画編

# ポートフォリオの2作目を作る計画の話
38歳の未経験のおじさんがエンジニア転職するためにポートフォリオ二作目を徹底的に作る様をお伝えしていきます。
今すぐ手を動かしたいものの、1作目の反省をする前に作り出してしまったらまた同じことの繰り返し。今回は自身の戒めを込めて、カッコつけずに正直に書いて行こうと思います。


## 結論
■ 開発手法: アジャイル
■ 進行計画: しっかり作る
■ 使用技術:（要検討） フロントエンドはReact/Typescript、バックエンドは未定。
■ デプロイ環境: 未定（安く抑える手段を模索中）
■ 設計と要件定義: しっかり作る
■ アウトプット: qiitaに残す
■ TypeScript: 知識深める

## ポートフォリオ1作目の反省点
### ■開発方法について
前回のポートフォリオ作成は以下の手順で作成しました。
　①フロントエンド側(React)のログインページを作成
　②バックエンド側(RailsAPI)で機能実装
　③フロントエンド側でログアウトページを作成
　④バックエンド側で（略
　これを繰り返しに繰り返し、一通り作成したらAWSへデプロイ、テストを作成。

上記の何がだめだったのか。シンプルに言うとテスト作成時に「飽きる」。

何やら消化試合をしているようでテンションが上がらないし、そもそも数週間もテストを書いていて
急にReact側を修正しよう！とか、コントローラーのアクションを修正しよう！となると、そもそも「どのように実装したのか」について、記憶が曖昧になっていて、修正にかなり時間をかけてしまった。

開発手法を調べていると、開発工程を段階的に分けて進める手法を「ウォーターフォール開発」というですね。
このウォーターフォール開発の利点は「予算やチームメンバーのアサイン計画が立てやすい」らしいです。

私の場合、二作目は「飽き防止」のため、「アジャイル開発」にチャレンジしてみようと思います！

アジャイル開発とは？というところは、調べればたくさん出てくると思うので割愛。簡単に言えば「計画→設計→実装→テスト」を細かく回していく、ということらしいです。

### ■進行計画について
そもそも、進行計画なんて1作目のときは作っていなかったのです・・・。プログラミングスクールの方は「ポートフォリオは2ヶ月が目安」と仰っていましたが、私の場合、スクール卒業後のReactやTypeScriptの習得だけでそのくらい掛かってしまいました。

するとどうなるか、そう、めちゃくちゃ焦りだす。やばい、早く作らなきゃ、早く作らなきゃ、と徹夜に近い状態になったことも。まさに1人ブラック開発。イライラするし、精神衛生上良くない。

今回は前回とは異なり、使用技術については基礎は抑えており計画を立てやすい。（ほんとに？）
そのため、今回は細かく計画を建てようと思う。
日中は仕事、帰ってきてから転職活動とアプリ制作。うーん！余裕がほしいところですが甘いことは言ってられない。

### ■目的の明確化
このアプリケーション制作を通じて何を得たいのかをはっきりさせておきたい。
前回は無計画に開発を進めた挙げ句、途中でモダンな開発技術が皆無なことに気づき1ヶ月間掛けて書いたコードをすべて放棄する、という無駄なことをしてしまいました・・・。時間は貴重。

ということで、今回はここをはっきりさせておく必要がある。
現在の学習した技術は以下のとおり。
・Reacｔ
・TypeScript
・Ruby and RailsAPI
・SQL(中途半端)

同じ構成で挑むか、フロントエンドを変えるかバックエンドを変えるか、すべて変えるか。正直すべて変えるのは、どの技術も中途半端で理解が浅くなるので避けたい。迷う。要検討。
ただ、転職活動をしていると、RubyやRailsを求める案件は相当少ない。分かってはいたものの相当少ない。逆にPHPはPythonは無茶苦茶多い。実務経験は無いのだから、出来ると言えることは多いに越したことはないのだから、バックエンドを変えるのはあり。



### ■デプロイ環境
これはどうするべきかまだ悩み中。前回は以下の内容で構築。何に悩んでいるかというと、端的に言えば「お金」。月額掛かっちゃうんです。そっとmanagement consoleを開いてみました。今月のコスト「$107」、今日のレートで15,802.94円。いや、きっつ。
今は転職活動のためにこのコストは目をつぶるとして、さすがに新しく同じ構成で挑むとすると単純に倍くらいの金額になりそう。いや、それはちょっと・・・。要検討です。CI/CDはマストでトライしたい。

![kouseizu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3167575/de414ded-c818-9f51-b02d-fc01676ea3e8.png)

### ■設計と要件定義
よく聞く「要件定義」。前作では本当に簡単なものしか作りませんでした。今回はしっかり作っていこうと思います。実務レベル、とまでは行かないまでも、知識としてどんなものか知っておいて損はない。ちゃんとやります。

### ■アウトプットした結果を残しておく
qiitaなどに知識を書きとどめておき、学習の成果を残しておくことで採用企業様側へのアピールになる。ただ、実はそんなことどうでも良くて、色々な人から意見をもらうことが重要。
1人で開発をしていると、間違った思い込みにも気づけず、そのままそれが自分の中でスタンダードになってしまう。もしかしたら間違った知識がもうすでにあるかもしれない。。。
そういったことを防ぐためにも、今回は少しずつ学習結果を残していこうと思います。

### ■TypeScriptについて
Reactですら分けの分からない状態で作り始めた前作。そこに畳み掛けるように分けの分からないTypeScriptさん。溢れ出るエラー。まさに地獄の状態を1ヶ月くらいさまよった後が克明にコードに現れている。
要はぐちゃぐちゃ。

今回は前回よりも理解している（つもり）なので、より前回よりも理解が深まるようにしたい。Udemyで一本くらい動画を見よう・・・！
Pythonの関数を生成してくれるGPTsを作ったら生産性が上がった

## はじめに

　タイトルのとおりPythonの関数を作ってくれるGPTsを作りました。もし良かったら使ってみてください。

 　https://chat.openai.com/g/g-KegA77zUX-python-function-generator

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/329d3d4b-6776-61a5-a73e-48b4f182021e.png)


## 使い方

　使い方はとても簡単です。入力、出力、処理内容を書くだけです。TDDで作成してくれるので、テストが通らない場合は作成した関数やテストコードを勝手に修正してくれます。

 ## デモ

　それでは早速、動作を見てみましょう。
 
　今回作る関数は、入力した文字列から数字を抜き出しintで返す処理で、プロンプトは以下になります。

　入力：文字列
　出力：数値
　処理内容：入力された文字列がら数字のみを抜き出しintで出力する。数字がなければ0を出力する。


　実行結果
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/fe051d9f-619a-52d5-2fac-20be25bb480a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/1b409496-ba71-2a8b-ac01-5e0805258ae0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/42361c5d-e545-9da9-1f58-615b12a78be4.png)


　対象の関数とテストコードが生成されたので、このままテストも実施して必要であれば修正してもらいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350321/7427eb81-0c84-6d2e-3809-e1ce596ef945.png)

　テストも正常に終了したようなので、無事に関数の生成が終了しました。

　上記の例では成功しましたが、テストがNGだった場合は状況に応じて生成した関数やテストコードを修正してくれます。

## 最後に
　今回は簡単な関数でしたが、もう少し複雑な処理でもプロンプトをちゃんと書ければちゃんと生成してくれます。
　さらに、github copilotを使っていれば、生成した関数をコードに貼り付けるとgithub copilotが「どうせお前はこの関数をここで呼び出すんだろ」って感じの提案をしてくれるので、とても便利です。
RubyのCSV作成時に undefined method 'collect' for nil:NilClass エラーが出たときの対処

みんな大好き Ruby にてSQLでデータベースからとってきた結果をもとに素朴にCSVをつくろうと、検索した記事を参考に書いてみると・・・・

```ruby
require 'csv'
CSV.generate do |csv|
  @query_result.each{|row|  
    csv << row
  }
end
```

`csv << row` の箇所でこんなエラーが出ました。インスタンス変数 `@query_result` は [ActiveRecord::Result](https://api.rubyonrails.org/classes/ActiveRecord/Result.html) クラスです。

```
NoMethodError - undefined method 'collect' for nil:NilClass:
```

 `@query_result` をそのまま each するとブロック変数は Hash になるので values でとってくる必要があります

```ruby
require 'csv'
CSV.generate do |csv|
  @query_result.each{|row|  
    csv << row.values
  }
end
```

あるいは、 `@query_result.rows` で配列としてとってくるか。

```ruby
CSV.generate do |csv|
  csv << @query_result.columns

  @query_result.rows.each{|row|  
    csv << row
  }
end
```

エラーメッセージから直接にわかりにくい問題と感じたのと、検索しても同じ問題にぶつかった日本語記事がなかったので書いてみました。classを確認してドキュメントをみてみるのが近道ですね
https://api.rubyonrails.org/classes/ActiveRecord/Result.html

（大きな誤解をしていたため大幅に更新しました @scivola さんありがとうございます！）
外部からMQTTブローカに接続する


# はじめに
- Windows 10 上にMQTTブローカを構築したが、クライアント側からブローカに接続できなったため、本書にて解消手順を示す。
- mosquitto の導入手順は省略する。

https://qiita.com/koichi_baseball/items/8fa9e0bdbe6d0aebe57d

- デフォルトではローカルオンリーモードで起動するため、オプションをいれる必要がある。
（mosquittoを起動した時のログに、ローカルオンリーモード...みたいに表示される。）

https://roadto-engineer.com/mosquitto_poweron/

# 動作環境
- ブローカ：Windows10
- クライアント：Windows10
- ブローカ-クライアント間でping は通る。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/685097/482b6280-3c02-6811-f5b8-3894f2d246e8.png)


# 設定ファイルの書き換え

環境に応じてパスは変えてください。
```
C:\ProgramFiles\mosquitto\mosquitto.conf
```

最下段に記入する。


```
listener 1883
allow_anonymous true
```

listener 1883　-> ブローカが使用するポート
allow_anonymous true -> 誰でもブローカに接続できる。認証を入れる場合は他記事参照してください。

# mosquitto の起動

コマンドプロンプトで、mosquitto の保存先に移動し以下入力する。
（このオプションの与え方がなかなか見つからなかったのです...）
```
mosquitto.exe -v -c mosquitto.conf
```
mosquitto.conf を参照できていれば、ログに.conf ファイルが読めました、と表記される。

https://techinfoofmicrosofttech.osscons.jp/index.php?Mosquitto

ここに全てが書いてある。。

https://tech-and-investment.com/raspberrypi-picow-7-mosquitto/

# ポートの開放

ファイアウォールで受信規則と送信規則に1883(ブローカがデフォルトで使用するポート)のルールを追加する。
私の環境ではパブリックまで許可する必要があった、、
詳細な設定は割愛。

https://qiita.com/yomori/items/74a9af05a8ccdda12e2f


以上
『60点でいいすぐにやれ』と言う事がどれだけ凄いことか

# ご挨拶
こんにちは。たいちゃんです。
12月ももう半ばになってきました。
今回は仕事のある格言?について自分なりに考えてみました。
# 『60点でいいすぐにやれ』
多分ビジネス関係のコラムを見た時だと思いますが、いつどこでみたのかよく覚えていません。なんとなくですがQC活動がらみで出ていたような気もします。
60点であれば100点や90点に比べればハードルはかなり下がります。
ある時、「まず、60点を取って、残り40点分の60点(要は40×60=24点)を取ってと繰り返していけば、理屈の上ではいい線いけるんじゃないかな。」
「この考えだと60点が難しくて仮に40点の場合になっても、その分回数を重ねればいい線いけるかも。」
と思いました。そこでこれを数学上の問題として考察してみることにしました。
# 今回の条件
1) まず、全体の内で1回目の作業にどのくらいの出来栄えにするかパーセンテージで表します。例えば、60点の場合は全体の中の60%が1回目で出来ればいいとします。
2) 次に、残りのものに対して1回目と同じパーセントテージの出来栄えで作業をするとします。1. の例で言えば残りの40%に対して60%の出来ですから0.4×0.6=0.24=24%となります。
3) その後、1回目に2回目の結果を足して積算します。今回の例ですと60+24=84%となります。
4) 更に、3回目、4回目・・・と続けていきます。
5) 今回は10回目迄実施しました。
6) また、考察に用いたパーセンテージは60%、50%、40%、30%の4種類としました。
# それでは考察を始めます。
## 計算結果
### 60点のとき(60%)
![20231214_60点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/cd73b902-39c4-9137-7566-321b8f1481b4.png)
### 50点のとき(50%)
![20231214_50点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/1f2a9ef6-043e-ae73-f062-ff907a1f1b5c.png)
### 40点のとき(40%)
![20231214_40点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/f054d606-2ba0-7146-c34c-b23e066f9a7a.png)
### 30点のとき(30%)
![20231214_30点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319826/84075f93-7b0b-bbda-dc27-f6e5b75f40fc.png)
## 結果の解説
・出来栄え60点で進めた場合、2回目には既に出来栄え80%(80点)を超え、3回目には90%を超えています。パーセンテージで表した場合、小数点以下を四捨五入すると6回目には100%となります。
・出来栄え50点で進めた場合、2回目は70%超え、3回目は80%超えとなり、4回目に90%を超えます。パーセンテージで表した場合、小数点以下を四捨五入すると8回目で100%となります。
・出来栄え40点で進めた場合、2回目は60%超え、以下3回目、4回目、5回目と進むうち、それぞれ70%超え、80%超え、90%超えとなります。パーセンテージで表した場合、小数点以下を四捨五入しても10回目迄では100%にはなりません。
・出来栄え30点で進めた場合、2回目は50%超え、3回目は60%超えとなり、90%を超えるのは7回目となります。10回目になっても99%にはなりませんでした。
## 考察と感想
出来栄え60点の場合、2回このプロセスを繰り返せば80%超えの出来栄えを得ることが出来ました。更に磨きをかけるなら3回目のプロセスを行えば、90%超えの出来を得られました。3回同じプロセスを繰り返せば完璧な出来栄えの90%を得ることが出来るのであれば、かなり有用な方法だと思います。また、世間一般の多くの試験では合格点にはならないでしょうが、50%でも4回目には90%を超える出来栄えを得ることが出来ました。試験では60点と50点では合格と不合格で天と地程の差がありますが、完璧な出来栄えの90%を得ることについは今回のプロセスでは回数について1回しか違いません。60点を取るのが難しければ50点を一先ず取って、あとはその分スピード勝負で50点を積み重ねていくというのも考え方としてありかもしれません。
40点、30点については完璧な出来栄えの90%が得られるのはそれぞれ5回目、7回目とゆっくりしたペースでした。しかし、どうしても無理なら一度に30点でもとって、その後残りについて30点を積み重ねていくという考え方もしなくてはならないかもしれません。当たり前の事なのかもしれませんが、出来るときに出来ることを出来る限りやるというのがとても大事だと再認識しました。
只、例えばこれを学習法に応用して考えるとすると結構大変です。60点の場合最初に身に付けた事柄を60点分定着させていなくてはなりません。その後、残りの40%分から2回目は24点分で全体で84点分学習したことになります。ただ丸暗記すればいいものでもないと伺ったこともありますが、英単語を覚えるとき等は例え30%ずつの繰り返しでも今迄に覚えた事をずっと定着させなくてはならず、私には至難の業です。学生時代の試験前の付け焼刃なら何とかなっていたこともありますが・・・。

以上オチもついたところで今回はここ迄です。最後迄お付き合い下さり、有難うございました。
過去にさかのぼって git のフォルダ階層を変更する

複数のレポジトリを1つにまとめるなどで、
- ディレクトリを移動したい
- 特定のディレクトリを削除したい
- リネームしたい
など

## 特定のディレクトリをルートにしたい

~~~:app ディレクトリの内容を
root
+ app
  + include
  + src
~~~
を
~~~:ルートに持っていきたい
root
+ include
+ src
~~~
にしたい。

~~~shell:Git コマンド
> git filter-branch -f --subdirectory-filter app/ -- --all
~~~

## ディレクトリを掘って一階層 下にしたい

~~~:親ディレクトリの内容を
root
+ include
+ src
~~~
を
~~~:app フォルダを作成して、そこに置きたい
root
+ app
  + include
  + src
~~~
にしたい。

~~~shell:Git コマンド
> git filter-branch -f --tree-filter "mkdir app && git mv -k * app/"
~~~

## 特定ディレクトリを削除したい

~~~:temp ディレクトリを
root
+ include
+ src
+ temp
~~~
を
~~~:削除したい
root
+ include
+ src
~~~
にしたい。

~~~shell:Git コマンド
> git filter-branch -f --tree-filter "rm -f -r temp" HEAD
~~~

## ディレクトリ名を変更したい
~~~:from ディレクトリを
root
+ from
  + include
  + src
~~~
を
~~~:to ディレクトリに変更したい
root
+ to
  + include
  + src
~~~
にしたい。

Windows コマンド プロンプト上の git-filter-branch ではうまいやり方を思いつかず。
~~~shell:Git の警告
> git filter-branch
WARNING: git-filter-branch has a glut of gotchas generating mangled history
         rewrites.  Hit Ctrl-C before proceeding to abort, then use an
         alternative filtering tool such as 'git filter-repo'
         (https://github.com/newren/git-filter-repo/) instead.  See the
         filter-branch manual page for more details; to squelch this warning,
         set FILTER_BRANCH_SQUELCH_WARNING=1.
~~~
また filter-repo を使えと言われるので、git-filter-repo をインストールした。

~~~shell:git-filter-repo をインストール
> python -m pip install git-filter-repo
~~~

Python\version\Scripts にインストールされてしまったのでパスを通す。
~~~:パス
> PATH=%USERPROFILE%\AppData\Roaming\Python\Python310\Scripts;%PATH%
~~~

~~~shell:Git コマンド
> git filter-repo --force --path-rename-match from:to
~~~