OmniAICreator/Qiita-1.07M huggingface dataset:
C++でヒープを使わないSTL代替ライブラリ2選

# C++でもheaplessが欲しい
Rustを学んでいたら、[heapless](https://github.com/rust-embedded/heapless)というクレートがあるのを知りました。なんでも、メモリの動的確保を行わないデータ構造ライブラリとのこと。
ベアメタルでの組み込みソフト開発歴が長い私は、C++ではnewやstd::vectorなど動的メモリ確保を行う操作を行わないでプログラミングを行うことが多く、固定サイズのメモリを使ったリングバッファクラスなどを自作（車輪の再発明）したりしていました。
Rustにheaplessのようなライブラリがあるなら、C++にも当然あるだろうと思って調べたところ、使えそうなライブラリを2つ見つけたので紹介したいと思います。

# ETL : Embedded Template Library

* [公式サイト(etlcpp.com)](https://www.etlcpp.com/)
* [リポジトリ(GitHub)](https://github.com/ETLCPP/etl)
* ライセンス：MITライセンス

開発の経緯は[スポンサー募集ページ](https://www.etlcpp.com/sponsor.html)に少し書かれています。勤務先を変わるたびに同じようなコードを再開発するのが面倒なので、個人で開発しオープンソースとして公開したそうです。

ちなみに、[Arduinoでも使える](https://github.com/ETLCPP/etl-arduino)ようです。ライブラリマネージャで出てきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70022/34e1253f-84cd-eccc-d7a5-1ceb5dda09de.png)


## etl::vector

std::vectorのテンプレートパラメータに最大サイズを指定することで、メモリ配置をコンパイル時に決定しています。

```c++:etl::vectorの使用例
#include <etl/vector.h>
#include <iostream>

int main()
{
    etl::vector<int, 5> myVector;
	myVector.push_back(1);
	myVector.push_back(2);
    myVector.push_back(3);
    myVector.push_back(4);
    myVector.push_back(5);

    for(int i : myVector)
    {
        std::cout << i << std::endl;
    }
    return 0;
}
```

## その他のETLの機能

[Overview](https://www.etlcpp.com/overview.html)に記載の通り。

* Containers : メモリ動的確保しないコンテナ。vector、map、listなど。
* Patterns : デザインパターン。singleton、observer、visitorなど。
* Maths : 数学系機能。ハッシュ、CRCなど。
* Utilities : 便利機能。iterator、algorithmなど。
* Frameworks : フレームワーク。ステートマシン、メッセージングなど。

注目すべきはFrameworksでしょうか。

# EASTL : Electronic Arts Standard Template Library

* [リポジトリ(GitHub)](https://github.com/electronicarts/EASTL)
* ライセンス：3条項BSDライセンス

Electronic Artsというのをどこかで聞いたことがあると思ったら、「ザ・シムズ」「シムシティ」などのゲームを開発している会社でした。私は初代PlayStationで「テーマパーク」をプレイしていたのが記憶に残っています。

ゲーム開発も組込みソフトウェアと同じように限られたリソースの上で動作させなければいけないことが多く、STLの欠点を補うべく作られたようです。（参考：[EASTL から垣間見るゲームソフトウェア開発現場の現状 その 1](https://i-saint.hatenablog.com/entry/20101012/1286822888)）

## eastl::fixed_vector

etl::vectorと同じく、std::vectorのテンプレートパラメータに最大サイズを指定することで、メモリ配置をコンパイル時に決定しています。違いは3つめのテンプレートパラメータで、ここにfalseを指定するとオーバーフロー時のメモリ拡張をしないようになり、メモリの動的確保を行わなくなります。trueを指定すると、配置new用のメモリアロケータを別途定義する必要があります。

```cpp:eastl::fixed_vectorの使用例
#include <EASTL/fixed_vector.h>
#include <iostream>

int main()
{
    eastl::fixed_vector<int, 5, false> myVector;
    myVector.push_back(1);
    myVector.push_back(2);
    myVector.push_back(3);
    myVector.push_back(4);
    myVector.push_back(5);

    for(int i : myVector)
    {
        std::cout << i << std::endl;
    }

    return 0;
}
```

## その他のEASTLの機能

[Modules.md](https://github.com/electronicarts/EASTL/blob/master/doc/Modules.md)によると、EASTLの機能はコンテナやイテレータに限られているようです。

# おまけ：vcpkgの利用

ETL,EASTLともに、vcpkg（C++のパッケージマネージャ）でインストールできました。C++はこれまでパッケージマネージャが貧弱でしたが、最近はvcpkgがVisual Studioに統合できるようになって便利になってきました。

参考：[C++用パッケージマネージャ「vcpkg」をVisual Studioに統合する - SKSP-TECH](https://sksp-tech.net/archives/544)

# 終わりに

今回のコード(VS2022使用)はこちら https://github.com/ktetsuo/CppHeaplessTrial

車輪の再発明は楽しいですがほどほどに…
【2024冬】大学生エンジニアがチェックしているSNS・メディアまとめ

# はじめに
こんにちは．地方国立大でCS専攻をやっています．魔方猫って名前でやってます．
名前の由来は，ルービックキューブを趣味でやっているのですがそれを中国語表記にすると魔方らしいです．あとは猫を見るのが好きなので合体技で魔法猫です．
今回は2024年冬に僕が見ているエンジニア系SNS・メディアをまとめたいと思います．

# メディア・SNS一覧
## ➀QiitaFM
https://open.spotify.com/show/4E7yCLeCLeQUsNqM4HXFXA?si=600528d8370a45a6

皆さんが今見ているQiita．実はポッドキャストで毎週ラジオが上がってます．ご存知であろうQiitaプロダクトマネージャー清野 隼史さんが進行のもと，様々なエンジニアの方のキャリアの深掘りを行っていく番組です．まだ歴史の浅い番組ですが，ゲストは毎度経歴のすごい方々な気がします．
アジャイルとは，テスト駆動とは，CTOとは，アウトプットし続ける意味などエンジニアキャリアを聞く中で出てくるテーマが毎回とても面白いです．大学生として就活はやっていきますが，就活時はどうしても待遇(給料，休暇，在宅可など)ばかりに目が行きがちですが，実際は入社後にどうキャリアアップしていくかもとても重要だと思っています．キャリアアップしている最中，もしくはし終わった人の話を聞ける機会なんてないので，こういったキャリアについて深掘りする番組を聞くのは有効だなと感じています．正直内容が難しい時もありますが，各回でひとつでも吸収できるものがあればいいなと軽く聞いてみるとけっこうおもしろいものです．
毎週月曜配信です．

## ②ゆるコンピュータ科学ラジオ
https://www.youtube.com/@yurucom

慶應のCS専攻卒のネット芸人こと堀元さん，名古屋大文学部卒のばりばり文系で機械オンチの水野さんの2人でやられているYoutubeラジオです．スピーカーの堀元さんが聞き手水野さんにコンピュータサイエンスについて噛み砕きながらおもしろおかしく話していくような番組となっています．
特に水野さんはトラックパッドが使えなくてマウスがないとパソコン操作ができない(物理的に操作できないのではなく，使いこなせないという意味です笑)ので，本当に機械オンチなんですね．ですが，勘が非常に鋭くて毎回台本ブレイカーと呼ばれるほど後から話そうとしている内容を先取りでどんどん当てていきます．
毎週日曜にアップされて30分～1時間くらいの動画になっています．


## ③TECH WORLD
https://www.youtube.com/@TECHWORLD111

つい最近までLINEヤフーで働かれており，現役メガベンチャーエンジニアとしてYoutube発信をされている方です．メガベンチャーエンジニアの1日Vlogを見ていると本当にモチベーションがアップします．エンジニアとしてのモチベ，フロントバック，おすすめ書籍や技術発信，エンジニアの魅力，プログラミング初学者～メガベンチャー内定まで幅広いロードマップ支援など横動画もあげつつ，縦動画では有名サービスに関する雑学，流行りのプログラミング言語，身の回りの素朴な疑問をITの切り口でひも解く動画，最新技術発信などを上げられています．
メガベンチャーエンジニアとして現役で働きながらこの発信をしていたと考えると恐ろしいですね．キャッチアップのスピードも速すぎますし，動画のクオリティも高いし，アップ頻度もおかしいです．見始めたのが1万弱だったのにいつの間にか10万人行きそうです．
動画を見ていると分かりますが将来こうなりたい未来像があるから逆算して今この行動を取る，1つひとつこの理由があってこう考えるといった思考力が本当に参考になります．

## ④IT菩薩モロー
https://www.youtube.com/@it_bosatsu_moro

エンジニアキャリア系について発信されている方です．上で紹介したTECH WORLDさんのスポンサーをやられているので知っている方もいるかもしれません．
特にキャリアパスや転職についてとても詳しい方かなと思います．キッカケエージェントという転職エージェントをやられており，そこで見ている転職市場でのホットな技術やエンジニアポジション，再現性のあるキャリアパスなどをガンガン紹介してくれています．エンジニアキャリアパスは本当に様々な種類があるので，この方の動画を参考に自分のキャリアについて考え，今必要な行動を取っていくのは賢いエンジニアかなと思います．

## ⑤その他
こちらは最近の投稿頻度は高くないけど内容は非常に面白いYoutubeチャンネルです．
### エンジニアチャンネル
https://www.youtube.com/@engrch

最近はほとんど動画が上がっていませんが，エンジニアYoutuberを開拓した先駆者的な方々かなと思っています．一般人が想像するエンジニアと実際のエンジニアの比較動画，〇〇を開発してみた系の検証動画などが多く上がっています．コロナ禍から1-2年で伸びたチャンネルなのでリモートワークあるあるやデスクツアーなども上がっていて参考になります．
またエンジニアなら分かるよねクイズも好きです．


### 脆弱エンジニアの日常
https://www.youtube.com/@full-weak-engineer

お笑い芸人の方のチャンネルで，セキュリティや脆弱性に関する動画を多くあげられています．脆弱性のフリップネタや，プログラミルクボーイというミルクボーイの「ほな〇〇やないか~，ほな〇〇とちゃうか~」のフォーマットに合わせたIT系のネタ動画が代表例だと思います．学部レベルの知識でもクスっと笑えるネタが多いのでおすすめです！
個人的に好きなのはSlackの通知音だけで音楽作ってみたっていう動画です．

## まとめ
いかがだったでしょうか．
実は下書き段階では秋にリリース予定だった記事なので，若干内容が古い気がするものもありましたが，あまり気にせずに読んでいただけたらと思います．
個人的にまた紹介したいSNSメディアが溜ってきているので，近々第2弾を出せたらと思います．
raspberry pi でWifiアダプタを使用している時に「No wireless interfaces found」になった場合

#### 内蔵WIFIオフをやめる
sudo nano /etc/modprobe.d/raspi-blacklist.conf

#### 各APモード用の設定をOFFにする
dhcpcd.confのwlan0の設定末尾をコメントアウト
```
sudo nano /etc/dhcpcd.conf
```
hostapd.confはAPモードの設定なので、全てコメントアウト
```
sudo nano /etc/hostapd/hostapd.conf
```
dnsmasq.confはIPアドレス関連の設定なので全てコメントアウト
```
sudo nano /etc/dnsmasq.conf
```

#### wpa_supplicant.confを下記の形式にしておく
```
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
        ssid="xxxx"
        psk="xxxx"
        key_mgmt=WPA-PSK
}
```
#### 修正を反映する
```
sudo systemctl restart dnsmasq
sudo systemctl stop hostapd
sudo systemctl restart dhcpcd
sudo service dhcpcd restart
sudo service dnsmasq restart
sudo service hostapd stop
```

#### これで繋がる。

#### 繋がらなかった場合は下記のコマンドを実行する
```
sudo ifconfig wlan0 down
sudo ifconfig wlan0 up
sudo dhcpcd wlan0 sudo killall wpa_supplicant
sudo rm -rf /var/run/wpa_supplicant
sudo wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
sudo iwconfig wlan0 essid "xxxx" key "xxxxxx" 
```
day18 『思考法図鑑』

## はじめに
　思考法を知らない人にとって、それは非常に曖昧な言葉ではないでしょうか。しかし現実には、いくつかのパターンやフレームワークとして役立つものが整理されており、一度学べば一生役立つものです。本書籍も子どもに読んでもらうために、カラフルで読みやすいものとして購入しました。
 

 ![思考法図鑑 目次2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/e07d7348-58a0-bf10-67fd-9903d7e379f2.png)



## ポイント
### 第１章　思考の基礎体力を高める

![思考法図鑑 １章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/06dee03d-52a8-3dac-05a6-4f4d3394a27d.png)

### 第２章　アイディアの発想力を高める
![思考法図鑑 ２章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/824274ca-5294-0e85-0847-c6114512b681.png)


### 第３章　ビジネス思考力を高める
![思考法図鑑 ３章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/b07f5cfd-2811-cb6c-2fb7-25f19d7aafba.png)


### 第４章　プロジェクトの推進力を高める
![思考法図鑑 ４章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/b184b437-c466-fa54-23d0-51db0176790a.png)

### 第５章　分析力を高める

![思考法図鑑 ５章.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/b731e8e3-cbe4-73d5-92d8-ebb3f3c9b69e.png)


## 書誌情報
- 書籍名：思考法図鑑
- 著者：株式会社アンド
- 出版社：翔泳社
- ISBN：978-4-7981-6094-8

## 参考
-
自宅サーバーにUbuntuをインストールする

<!-- 自宅サーバーにUbuntuをインストールする -->

※この記事は[Udon Advent Calendar 2024 - Adventar](https://adventar.org/calendars/10764)の16日目の記事です。

## はじめに

親から古いPCをもらいました。今回はこいつをいじっていこうと思います。

## スペック

- CPU: Intel(R) Core(TM) i5-3470
- メモリ: 4GB(DDR3)
- ストレージ: 80GB HDD

古いので、スペックが非常に低いです。

ただ、何か使い道があるはずなので、今回はこいつにUbuntuをインストールしてみます。

## Ubuntuのインストールメディアの作成

まず、Ubuntuのインストールメディアを作成します。[このページ](https://rtc-fukushima.jp/technical/6671/)が参考になります。

[ここ](https://pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/)からUUIをダウンロードして、インストールするという流れです。

バージョンですが、特にこだわりがない場合は最新版を使うほうがいいと思います。

インストールメディアが作成出来たら、それをサーバとするPCに差し込み、PCを起動します。キーボードやマウス、ディスプレイも繋いでおきましょう。

## Ubuntuのインストール

電源を入れたら、BIOS画面を表示させます。Escを連打！！

次に、F9を押してブートデバイスを選択します。USBとしましょう。

![S__96837641.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/df9d22b6-8a22-ec79-defd-bba7f2022968.jpeg)

そうすると、Ubuntuのインストール画面が表示されます。

![S__96837643.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/66929d65-39f1-e9a5-5fcc-121e16d3f41a.jpeg)

isoファイルを選択し、インストールを実行します。

![S__96837644.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/f5c29795-e9eb-1889-4161-7f85ea23e9fd.jpeg)

![S__96837645.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/d4798e87-64c3-72e0-fa8f-25372c59810a.jpeg)

こういう画面が出てくると、Ubuntuが立ち上がります。

言語の選択やキーボードの設定などを行い、進めていきます。

元々何かOSが入っていた場合はデュアルブートにするか聞かれます。今回は既存のOSを消してUbuntuだけを入れることにしました。

その後、アカウントとコンピュータ名の設定を行います。

![S__96837646.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/11aed391-f461-91e1-0df8-3137b9206e14.jpeg)

最後に、タイムゾーンの設定をすればインストールが始まります。インストール中はなぜかSpotifyの広告などが流れます。

インストールが終わると次のような画面が出てきます。

![S__96837647.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468660/fd43eb20-2b37-339e-0b18-70c8a2b131b9.jpeg)

再起動を促されるので、再起動します。インストールメディアはもう必要ないので抜いておきましょう。

再起動後、ログイン画面が表示され、先ほど設定したアカウントでログインできればインストール完了です。

## おわりに

今回はインストールまでやりました。

今後、このサーバを使ってやっていくことも別の記事にしていきたいと思います。

ざっくりですが、家庭内DNSサーバにでも使おうかなと思っています。

今日の記事は以上です。また明日の記事でお会いしましょう。

## 参考文献

[【2023年版】UbuntuのUSBインストールメディアを作成 | RTC-Library-FUKUSHIMA](https://rtc-fukushima.jp/technical/6671/)
勝率を上げる鍵は？モンティ・ホール問題が示す選択の秘訣

## あなたならどうする？確率に挑む「モンティ・ホール問題」

モンティ・ホール問題は、確率の直感を試す有名なパズルです。この問題はアメリカのゲームショー "Let's Make a Deal" に由来しています。本記事では、問題の内容と解き方を簡単に説明します。

---

### ゲームのルールを理解しよう

あなたは **3つのドア** の中から1つを選びます。そのうち **1つのドアの後ろ** には **車** が隠されており、残り **2つのドア** には **ヤギ** がいます。ルールは次の通りです：

1. あなたは3つのドアから **1つ** を選びます。
2. モンティ・ホール（司会者）は、選ばなかった2つのドアの中から **必ずヤギがいるドア** を1つ開けます。
3. モンティはこう尋ねます：
   - **「最初に選んだドアをそのままにしますか？それとも別のドアに切り替えますか？」**

例えば：
- あなたが最初に **ドア1** を選びます。
- モンティが **ドア2**（ヤギ）を開けます。
- あなたは **ドア1** をそのままにするか、残りの **ドア3** に切り替えるか選べます。

このとき「ドアを切り替えた方が得なのか？」という疑問が生まれます。

### 選択と結果

あなたは **3つのドア** の中から **1つ** を選びます。もし選んだドアの後ろに **車** があれば **車を獲得** できますが、 **ヤギ** ならばヤギを持ち帰ることになります。

ここで問題になるのは次の疑問です：

**「どのようにすれば最も高い確率で車を選べるのか？」**

選んだドアをそのままにするのか、それとも切り替えるのか？どちらが有利なのでしょうか？

---

### 答え：切り替えた方が得

結論としては、「ドアを切り替える」方が車を獲得できる確率が高いです。

- **そのままの場合**：車を獲得する確率は **1/3**。
- **切り替えた場合**：車を獲得する確率は **2/3**。

---

### 理由を簡単に説明

#### 初めの確率
- 最初に車を選ぶ確率は **1/3**。
- 最初にヤギを選ぶ確率は **2/3**。

#### 切り替える場合
- 最初に車を選んだ場合（確率 **1/3**）：切り替えるとヤギになります。
- 最初にヤギを選んだ場合（確率 **2/3**）：モンティがもう一方のヤギのドアを開けるので、切り替えると車になります。

つまり、切り替え戦略では **2/3** の確率で車を獲得できます。

---

### 別の視点：すべてのケースを考える

問題をわかりやすくするために、すべてのケースを考えてみましょう。ドアに **C（車）** と **G（ヤギ）** が隠れているとします。

1. **ケース1: ドア1が車 (C, G, G)**
   - あなたがドア1を選ぶ。
   - モンティはドア2または3を開ける（どちらもヤギ）。
   - **切り替えるとヤギ、切り替えないと車**。

2. **ケース2: ドア2が車 (G, C, G)**
   - あなたがドア1を選ぶ。
   - モンティはドア3を開ける（ヤギ）。
   - **切り替えると車、切り替えないとヤギ**。

3. **ケース3: ドア3が車 (G, G, C)**
   - あなたがドア1を選ぶ。
   - モンティはドア2を開ける（ヤギ）。
   - **切り替えると車、切り替えないとヤギ**。

上の3つのケースを見てみると、
- **切り替えない場合**：車を選ぶ確率は **1/3**。
- **切り替える場合**：車を選ぶ確率は **2/3**。

---

### 実際に試してみよう

以下のPythonコードで、モンティ・ホール問題をシミュレーションできます。

#### シンプルなPythonコード

```python
import random

def monty_hall_simulation(trials=10000):
    switch_wins = 0
    stay_wins = 0

    for _ in range(trials):
        doors = ['goat', 'goat', 'car']
        random.shuffle(doors)

        player_choice = random.randint(0, 2)

        for i in range(3):
            if i != player_choice and doors[i] == 'goat':
                monty_choice = i
                break

        switch_choice = [i for i in range(3) if i != player_choice and i != monty_choice][0]

        if doors[switch_choice] == 'car':
            switch_wins += 1
        if doors[player_choice] == 'car':
            stay_wins += 1

    print(f"切り替えた場合の勝率: {switch_wins / trials * 100:.2f}%")
    print(f"そのままの場合の勝率: {stay_wins / trials * 100:.2f}%")

monty_hall_simulation()
```

このコードを実行すると、切り替えた場合の勝率が約 **66.7%**、そのままの場合の勝率が約 **33.3%** になることがわかります。

---

### 最後に

モンティ・ホール問題は、確率の面白さを教えてくれる問題です。最初は直感と違う結果に驚くかもしれませんが、シミュレーションや数学的な分析を通じて納得できるようになります。

ぜひこの問題を楽しんでみてください！
Github と鍵交換する

## 今回はテンションが乗ってるので雑談を省きます

# Githubで鍵交換するメリット
プライベートリポジトリでも`git`コマンドが使える！！！

# 準備
キーファイルをまだ作ってない人は、下のリンクの**キーファイルの作成**を作ってきてね。

https://qiita.com/Koto0728/items/bdaf5bd179f6d1248384#%E3%82%AD%E3%83%BC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90

できたら、はい次ーーーー

# キーファイルのアップロード
githubを開いて`setting`を押してね。
`SSH and GPG keys`という欄を選択し、`New SSH key`押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802303/3036c4e8-a282-a07b-85c2-6a5ed2b83bb5.png)

押しましたら、以下の画面が出てくると思います。
書く項目に私は以下のように、記述しました。
|Title|わかりやすいタイトルに|
|--|--|
|Key type|Authentication Key|
|Key|id_rsa.pubの中身を|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802303/7bfe9660-9c6c-9430-7b63-822baec159be.png)

記入できましたら、`Add SSH key`を押してください。
最後にテストをしてみましょう！
```zsh
ssh -T git@github.com
```
```
Hi ikotome! You've successfully authenticated, but GitHub does not provide shell access.
```

こんな感じで完成🥳🥳
upLaTeX: 本日の曜日を日本語で自動的に出力する

# やりたいこと
+ `YYYY/MM/DD(曜日)`が欲しい
    + `YYYY`は西暦の年
    + `MM`は西暦の月
    + `DD`は西暦の日
    + `曜日`は日本語版の西暦の曜日（Day Of Week，略してDOW）つまり`月火水木金土日`
+ `BXwareki`は曜日に対応していないらしい
    + https://ctan.org/tex-archive/language/japanese/BX/bxwareki
+ `jsarticle`でとりあえず確認済

# 実装
プリアンブルにこれを入れる

```LaTeX
\usepackage{datetime2}
\usepackage{datetime2-calc}
\makeatletter
\newcommand{\DOWjpn}{%
	\DTMcomputedayofweekindex{\@dtm@currentyear-\@dtm@currentmonth-\@dtm@currentday}{\DOWindex}%
	\ifcase\DOWindex 月\or 火\or 水\or 木\or 金\or 土\or 日\fi%
}
\newcommand{\DTMjpn}{%
	\@dtm@currentyear/\@dtm@currentmonth/\@dtm@currentday(\DOWjpn)%
}
\makeatother
```

例えばタイトルに入れる場合は
```LaTeX
\date{\DTMjpn}
```

# コツ
+ `datetime2`と`datetime2-calc`を流用する
    + https://ctan.org/pkg/datetime2
+ 内部変数の`\@dtm@current`系から年月日を取得できる，しかし**肝心の`@dtm@currentdow`はなにもしないままだと**`-1`のままらしい**
    + `Current day of week defaults to -1 (that is, ignore it).` from p.121
+ 上記を`\DTMcomputedayofweekindex`に入れて曜日の値を取得して（1~7につき月~日）`\DOWindex`に保存する
+ **これを実行するとなぜか`@dtm@currentdow`が曜日の値を取得する（0~6につき月~日）**
    + p.170 あたりに`\dtmMondayIndex`から`\dtmSundayIndex`が定義されており，こっちも0~6につき月~日となっている…しかしLaTeXの`\ifcase`は`1`スタートの方が好都合であり，`\DTMcomputedayofweekindex`はこの使用方法を想定していたのかも？
    + `\pgfcalendardatetojulian`と`\pgfcalendarjuliantoweekday`が裏で動いた結果…ユリウス暦だと思うけど，ドキュメントには実装が未記載だった
+ それを`\ifcase`で分岐させて対応する曜日を表示させたい形式で代入する
    + `\makeatletter`と`\makeatother`間でなので，改行手前に`%`を入れないと改行記号が空白扱いされてレイアウトが崩れる
    + 英語3文字版とかにも応用できそう
AtCoder ABC384 Dが個人的にめっちゃ難しかったので解説(python)

# ABC384 D問題
https://atcoder.jp/contests/abc384/tasks/abc384_d

解説みたけど理解できませんでした...。

なので、私のような数学が苦手な人でも理解できるよう解説します。

### 部分ごとに考える
まず、部分ごとに分けて考えましょう。

入力例１を例に挙げると、以下のように分けられます。

![explain_384d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740708/fb6891b3-e216-1b59-fa9c-fc99aa67ac5d.png)

この繰り返しの部分は今回の場合８から始まっており、8,4,3を繰り返しています。
この部分は、繰り返しの開始の数字が何であっても、

**繰り返した回数×配列Ａの総和になります**

今回は、8,4,3を２回繰り返しているので15 × 2で３０になっています。
もし、3から始まり、これを二回繰り返していたとしても、
3,8,4を二回繰り返すので、15　× 2で30になります。


では、これが何を意味するかと言うと、今回の問題で考えるべきは、
**sとAの総和の余り**
のみということになります。

なぜなら、**繰り返しの部分の値は常に一定になる**からです。
なので、**その値にAの部分和を足し、sの値にすること**に集中できます。


```python
n,s = map(int,input().split())
a = list(map(int,input().split()))

find_num = s % sum(a)
```
**find_numはsとAの総和の余りです。**
今回の問題は、言い換えると「**Aの部分列の総和==find_num**を探す」です。

### 累積和を取ろう
Aの範囲の総和なので累積和を取りましょう。

```python
a *= 2
rui = [0] * (n * 2)
tmp = 0
for i in range(2 * n):
    rui[i] = a[i] + tmp
    tmp += a[i]
```
**累積和を取ったため、rui[j] - rui[i]の値がfind_numかどうか**で判定が出来ます。

では、**なぜ二倍の累積和を取ったか**というと、

入力１ではAの入力は、n = 3 , s = 42 , a = [3,8,4]でしたが、
**もし、sの値が37だとしたら、s%sum(a)=7なので、3と4を選ばなければ答えは出ません**。

無限数列なので、**3と4は、二週目以降4,3の順番で繋がります**。
そのため、その時の判定もするために二倍のサイズで累積和を取りました。

### rui[j] - rui[i]の値を求めまくろう。
ここまで来たら、あとは条件を満たす値を探索するだけです。
求め方はたくさんありますが、私の求め方を紹介します。

```python
ans = "No"
l = 0
r = 0
while(r < 2 * n):
    now = rui[r] - rui[l]
    #小さかったらrを増やして広げる
    if(now < find_num):
        r += 1
    #大きかったらlを増やして縮める
    elif(now > find_num):
        l += 1
    #同じだったら正解だ
    elif(now == find_num):
        ans = "Yes"
        break

```
やっていることは、見ての通りです。

## あとがき
初投稿です。
ここまで見てくださり、ありがとうございました。

拙い部分も多くあったと思います。
コメントなどでご指摘・ご質問などございましたらお気軽にしてください。
【VSCode】エディタで上書きする方法

コマンドパレットで`View: Toggle Overtype/Insert Mode`を実行すると上書きモードに切り替えられます。

上書きモードでは文字を入力すると挿入されるのではなく、置き換えられます。

![overtype.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/50480473-afe4-fd77-0d90-170024d69d5f.gif)

また、`editor.overtypeOnPaste`を`true`に設定すると上書きモードにおいてペーストした際にも上書きされるようになります。
`editor.overtypeCursorStyle`で上書きモードでのカーソルを`underline`などに変更できます。

![スクリーンショット 2024-12-16 0.04.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/eac4ce30-4572-4345-251e-48f182b0063d.png)
su - XXXしたらエラーが出るようになった時の話

# はじめに
とあるユーザに`su`したらエラーメッセージが出るようになってしまった時のメモ
※今回の記載はあくまで例

# 結論
- .bash_profileの定義が間違っていたのが原因
- .bash_profileを直すときはviではなくsedとかで置換するようにしよう
- それか十分に確認した修正済みのファイルと差し替えるようにしよう

# 事象
とある特定のユーザにsuするとエラーメッセージが出るようになった（su自体は出来る）
```
[root@localhost ~]# su - user1
最終ログイン: 2024/12/15 (日) 23:34:40 JST日時 pts/0
-bash: export: `PATH:/home/user1//dir1': 有効な識別子ではありません
[user1@localhost ~]$
```

# 原因
`.bash_profile`の定義が原因
```.bash_profile
（前略）
PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH:$HOME/dirA/dir1
```

- **$** HOME/dirA/dir1の定義のせい
- テキストファイルに書いておいたメモからコピペするときに貼り付けをミスった説がある
YOLOv10とRaspberryPi5で店舗内を推論　店舗内ロボット備忘録その１

みなさんこんにちは。
某小売業でECシステムに関わっています。

こちらの記事はIoTLT Advent Calendar 2024の15日目の記事です。残念ながら、システム自体は完成していませんが、備忘録もかねて書きます。

# 1.店舗内ロボット構想
人手不足により、店舗運営に支障をきたす未来に向けて、私は店舗内へロボットを導入する試みを考えています。
![Designer (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809072/77f242a8-8936-9bea-0a2d-be526b943f98.png)

まずは、費用が掛からないところから調査を進め、技術的に可能であることや効果の見通しがつくレベルまで実施したほうが、導入のハードルが下がると考えています。


# 2.今回の範囲
ロボットの制御としてRaspberryPi5を用いると想定し、店舗内の環境認識を行う。
ただし、今回は追加学習せずに既存モデルにて行う。

店舗内を推論して、ロボットの動作と結びつける例として、人を検出したら停止判断処理をするなどを想定している。ただし、モーターの制御そのものは今回対象外とする。


# 3.使用したツール
・[Raspberry Pi 5](https://www.raspberrypi.com/ "Raspberry Pi")
・動画　[スーパーマーケットってどんな店？](https://www2.nhk.or.jp/school/watch/clip/?das_id=D0005311094_00000)　ＮＨＫからの引用
・YOLOv10
・USBカメラ


![ハード.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809072/882dbd5f-aaeb-6eb2-a82b-843bc5c32640.png)

# 4.開発
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809072/3ed14580-845e-2596-ad1a-254a7d29015f.png)
AzureのIoT Hubを使うことにより、データの連携なども可能になると考えました。点線部分は今回構築したものの、疎通にとどまっていますので、今回説明は省きます。

## 4-1.YOLOv10
物体検出に使用したのはYOLOv10になります。リソースが極端に制限された環境向けのナノバージョンのモデルを選びました。YOLOv10については、以下に詳しくまとめられています。

https://www.issoh.co.jp/column/details/2774/

## 4-2.RaspberryPi5にYOLOv10を実装
以下の記事を参考にしています。

https://note.com/masayuki_abe/n/nb4166851b84e


## 4-3.店舗動画で動作確認
実装モデルを簡易的に実験するため、別のPCで動画を流し、RaspberryPi5のカメラでとらえる手法を考えました。

![スクリーンショット 2024-12-15 230316.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809072/28b725b9-b541-e077-018a-6c766fb63a78.png)
![スクリーンショット 2024-12-16 001103.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809072/43ef62a6-7d69-f1ce-94a8-efaad518eefc.png)



## 4-4.所感
おおよそ認識はできていると感じましたが、リソースが極端に制限された環境向けのナノバージョンを用いたことで、精度は他のバージョンよりも下がっているかもしれません。また、RaspberryPiということもあり、リアルタイムに検知できるものの2秒程度遅れているように感じました。

:::note info
店舗内ロボットに応用するなら・・・
人の認識はできているけれど、何m先なのかなどの情報も実現する上では必要だと感じました。2秒程度遅れも不安要素かなと感じています。
:::




# 5.次は未完成を実施させるぞ！:muscle:
今回は、YOLOv10とRaspberryPi5で店舗内を推論をしました。:boy:

店舗内ロボットに応用するにはもう少し時間がかかりそうですが、できなくもないという感触です。また、途中となっているAzure IoTとの繋ぎを行い、今後も開発していきたいと思います。

最後まで読んでいただき、ありがとうございました！
day17 『職場の問題地図』

## はじめに


 ![職場の問題地図 目次2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/66315cb0-d276-c80c-717b-a25cc94f80ba.png)



## ポイント
### 表紙と帯
- 「で、どこから変える？」残業だらけ・休めない働き方
- 「来月から残業ダメだからね、仕事の量は減らせないけど」
 「えっ、どうすれば？」
 「なんとかして、よろしく」
- 定時で帰っているのは一部の部署だけ。皆、相変わらず遅くまで残業している。
- もっと仕事をしたいのに、無理やり帰らされてモチベーションダウン。
- 仕事の品質が下がり、クレームの嵐。
- やりかけの仕事が気になって、むしろストレスフル。
- 他人に構う余裕がなく、会話がなくなった。
- 「残業するな」と上司がうるさいので、帰ったことにして家で仕事をしている。
- 定時退社日以外の残業が増えた。カンベンしてほしい。
- 残業はすべて管理職が肩代わり、管理職はいつもゲッソリ。
- 裁量労働制……お金にならない残業が増えただけ。

### 「残業だらけ」の職場・「休めない」職場

![職場の問題地図 マップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/a3fb996e-9726-f750-8094-683f3e07d913.png)


### 手戻りが多い
- 目的
- インプット
- 成果物
- 関係者
- 効率
### 上司・部下の意識がズレている
- そもそも、その仕事の目的はなにか？
- インプットはなにか？
- 成果物のイメージは合っているか？
- 本当のお客さんは誰か？
- 進め方を提案しよう！
### 報連相ができていない
- 報連相をする場やルールがない
- 部下の伝えるスキルが低い
- 上司の受け止めるスキルが低い
### 無駄な会議が多い
### 仕事の所要時間を見積もれない
### 属人化
- 属人化はなくならないさ、人間だもの
- 良い属人化と悪い属人化
- 悪い属人化から脱出しよう
- 「優先度」✕「属人度」　マトリックス
### 過剰サービス
- 過剰サービスはなぜ生まれるのか？
- ちょっとした善意や正義感が裏目に出る
### 「何を」「どこまでやればいいのか」が曖昧
### 仕事をしない人がいる
- 仕事をしない人を生む５つの原因
- 仕事をしない人が、新たな仕事をしない人を生む
### だれが何をやっているのかわからない
- 「だれが何をやっているのかわからない状態」が生み出す５つの病
### 実態が上司や経営層に伝わっていない
- 結果「しか」報告していないから…


## 書誌情報
- 書籍名：職場の問題地図
- 著者：沢渡あまね
- 出版社：技術評論社
- ISBN：978-4-7741-8368-8

## 参考
-
Notionでふりかえりをすると良い

この記事は[Hacobu Advent Calendar 2024](https://qiita.com/advent-calendar/2024/hacobu)の15日目の記事です。

こんにちは、Hacobuでバックエンドエンジニアをしている iwag と申します。

今回は、私たちのチームで取り入れてみて「結構いいな！」と思った小ネタをご紹介します。

その方法とは… **Notionのデータベースを活用して**ふりかえり**を行うこと** です。

「え、それだけ？」と思われるかもしれませんが、これが意外と良いんです。以下、具体的にその良さをご説明します！

## Notionでのふりかえり

早速ですが、利用しているNotionでのふりかえりで使っているボードはこんな感じです。

![スクリーンショット 2024-12-12 19.33.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4126/9c05060c-7f21-c38c-cdc1-203b664357c2.png)


KPT（Keep, Problem, Try）のカテゴリ別にカードを表示させるビューを設定します。Sprint(スプリント番号)でフィルタしています

KeepやProblemのカードはページに記録します。タイトルやスプリント番号、KPTのいずれかといった項目があります。

![スクリーンショット 2024-12-12 19.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4126/17b2388d-40d6-daf5-54f0-59c1bcc61921.png)


ふりかえりを始める時は、ふりかえりビューのスプリント番号をインクリメントして、ボード上のカードを見えなくします。

---

## Notionでふりかえりをするメリット

### 1. **書きやすい**

リモートワークの環境だと MiroやCacooといったホワイトボードツールでふりかえりをすることが多いと思います。ホワイトボードツールでのふせん機能ではふせんという性質上次のようなことがよくあります：

- 長文が書きにくい
- コメントや反応が見にくい
- ふせんの配置を整理しないといけない

その点、Notionなら長文でも問題なく書けるため、言葉足らずになる心配がありません。補足が必要ならコメント機能を活用すればOKです。カードは列の下に積み上がっていくだけなので配置を気にする必要もありません。

### 2. **多様な視点で振り返れる**

NotionのDBは、さまざまなフィルタやビューが使えるため、ふりかえりを多角的に分析できます。たとえば：

- 自分が書いたカードだけを全期間で一覧表示してみる。
→ 半期ごとの評価時に、「この時期、こんなことを考えていたのか」といった過去の感情や気づきを簡単に振り返れます。
- **特定の期間やテーマに絞り込んで傾向を掴む**
    
    たとえば、今四半期と前四半期分を比較して「今期の改善傾向」を把握したり、「コミュニケーション」に関するカードのみを表示して、特定分野の課題や進展を深く考察したりできます。これにより、チームが状況把握や、または繰り返し出てくる問題は何か、といった長期的な視点からの分析も簡単になります。これをチームで話し合っても面白いです。

    私たちが活用できてませんが、[Notionにはチャート機能](https://www.notion.com/ja/help/guides/charts-visualize-data-track-progress-in-notion) がありますのでグラフにして示唆出しすることもできますね。

### 3. **カスタマイズ性が抜群**

Notionのデータベース上のカードには必要なフィールドを自由に追加できます。たとえば：

- **「対象」フィールドを追加**
ふりかえりで他のメンバーの行動にFBする際に、その対象となる人を記録しておくフィールドです。
→ これが評価時の360度評価や1on1 のフィードバック時にとても役立ちます。
- 「カテゴリ」フィールドを追加
    
たとえば、Problemをカテゴリでグルーピングして課題の抽出にも使えます。
    

## Notionでふりかえりをするデメリット

### 1. **単純なメソッド向き**

KPT, Fun Done Learn, Start Stop Continue のようなシンプルな方法論に適していますが、スターフィッシュのような象限が多くて視覚的なメソッドには向きません。

### 2. **他のツールとの併用**

たまに気分を入れ替えてMiroでふりかえりをすることがあります。しかし、ふりかえりをふりかえるときに2箇所参照しないと行けなくて面倒です。MiroのふせんはCSVでデータをエクスポートできるので、必要に応じてインポートした方が良いでしょう。

[Notion公式のテンプレート](https://www.notion.com/ja/templates/category/retrospective)があるみたいですが、そこまで難しくないので自作をお勧めします！

## まとめ

いかがでしたか。Notionでふりかえりを行うことは、カスタマイズ性やふりかえりをふりかえれるといった点で非優れています。特に、後から見返したい情報が整理され、簡単にアクセスできる点が大きな魅力です。一方で、単純なメソッドしかできなかったり、他のツールと併用する際の工夫が必要です。

みなさんのチームでも、ぜひ試してみてください！
母になってみてどう環境を整えていくかを考える

息子がもうすぐ2歳になります。
私も母2年生が終わろうとしています。
そしてバックエンドに転向してから1年半ぐらい経ちました。
来年に向けて気合いを入れていくための記事です。
全然技術的な内容はないです、ごめんなさい。

新卒の頃は、勢いよく新しいことに挑戦したり、遅くまで残って勉強したりしていました。
30代も後半に差し掛かり、息子との生活が始まり、お世話の時間もとられるし、
息子と遊びたいし、なかなか自分の成長に時間を作っていくという気が起きない。
ちょっとあってもスマホポチポチしちゃう…
夏頃に社内勉強会のためにWebアプリを作りましたが、
だいぶパートナーに協力してもらって時間を作りました。

これからの私と息子の時間を作るためにいろいろ手をつけました。

・隔週でお掃除に来てもらう
水回りを中心にお掃除してもらっています。
日々気になったところはやっていますが、それだけではすみっこの気になるところはやっぱり残ります。
2週に1回がっつりやってもらうことで気づいたら掃除するのが億劫なほど汚れている状態にはならなさそうです。浴室の鏡とかね…
嬉しいことに息子が触る窓やテレビ、洗濯機のフィルターも掃除してもらえたり、だいぶ心が豊かになりました。

・隔週で食事の外注
定期的にお惣菜が来るサービスを頼んでいます。
これで平日の何を食べようか考える、買い物、調理の時間から解放されました。
私は買い物が下手くそなので、だいぶ無駄買いが減りました。かなりコスパいいのでは？と思います。

これらは好き、得意であれば安く手際良くできるのかもしれませんが、
私にはそんなスキルもモチベーションもないので、自分の趣味を節約してでも外注を選びました。

・実家の近くへ引っ越す
これは全員におすすめできることではないのですが、
子ができたときから極力実家の近くへ引っ越そうと考えていました。
また諸事情2人暮らしが見えていたので、通いが必要な仕事はなかなか選べず、
今までより、働く環境に重きをおいて、違う業界業種に転向しました。
この会社はフルリモートで理解のある方も多く、大変働きやすいです。
もちろん、今までやってきたのも引き続きできないかなぁと模索した時期もありましたが、
今はとても満足しています。
実家が近いのも頼れるので大変ありがたいです。
子育てで必要なものは頼れる手だと思います。
パートナー、自分の親、パートナーの親、友達、兄弟、親戚、行政、民間のサービス。
1人で育てられるっしょ〜と楽観視してましたが、全然違います。喋り相手がいるだけでも全然違います。
利用できるものはする、頼れるものは頼る、これは肝に銘じていきたいなと思います。

今年の後半はこういった生きる環境に重視して動いてきました。
だいぶ心と時間に余裕ができてきましたが、息子の自己主張期に入ろうとしており、白目を剥きそうです。
バックエンドとして1年半程度たちましたが日々コードを書くことに追われ、
それに付随する知識が薄いな〜と感じています。
来年はもう少し自己研鑽に時間を当てたい…！
と小さな宣言をしつつ、息子との時間も大切にしたいです。
【GoogleSite】学校広報用にWebサイトを作成　④雑多

## Googleサイト制作のおまけ編
本編はこちら
雑談的な内容になります。
## 進路選択にどの程度効果があったのか？
サイトへのアクセス数はGoogleアナリティクスを利用することで分析することが可能ですが，実際にそのサイトが進路選択行動にどの程度効果があったのかはわかりません。
そこで，新入生に対してアンケート等を行いサイトを見たのか？何がよかったのか？何が足りなかったのか？を調査することが重要であると考えます。

しかし…

**現実はそう上手く行きません**。
なぜなら，生存者バイアスならぬ入学者バイアスがかかっているからです。よってそれらのアンケートからポジティブな面はわかってもネガティブな面はなかなかわからないのです。
（伝わらなかった人は入学してないのでアンケートが取れないから）
ネガティブな面を知るのは非常に難しいのかもしれません…
現状ネガティブ面はGoogleアナリティクスからしか分析できないかもしれません。

## Googleサイト以外の方法
私の学校の場合はITに不慣れな人もいるので簡単なGoogleサイトを使用しました。しかしながらGoogleサイトは便利さを持つ反面，**自由度が著しく低いです**。（ここはトレードオフなので難しいところです…）
ある程度ITを知っている人があつまる学校の場合はWordPressなどの別ツールを利用することを考えてもいいかもしれません。
Windows11にDocker Desktopをインストールする

Windows11にDocker Desktopをインストールする手順をまとめました。

# インストラーのダウンロード

公式サイトにアクセスします

https://www.docker.com/products/docker-desktop/

↑のURLを開くと↓のような画面が表示されます。
「Download for Windows」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/942c85e4-b79f-61db-5199-0cb8c4f24522.png)

ダウンロード完了後、「Docker Desktop Installer.exe」というインストラーを起動します。

「このアプリが変更を加えることを許可しますか？」というポップアップが表示されたら、「はい」を押下します。

「add shortcut to desktop」と表示されたら、「OK」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/2e3fef5a-1061-849a-e7df-f5b27706db10.png)

インストールされます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/52b7c206-0958-62bf-75c9-2e21e8732721.png)

インストールが終わったら、「Close and restart」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/a297e219-4be1-84fc-cf8d-5fe514426f25.png)

PCの再起動がはしります

# セットアップ

「Accept」を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/253235af-c49a-41c2-d04b-420a6a50149e.png)

「Use recommended settings」を選択し、「Finish」を押下します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/f82f6230-0e5d-ba15-b075-cf0eba93f631.png)

「このアプリが変更を加えることを許可しますか？」とポップアップが表示されたら、「はい」を押下します。

アカウントなしでも使用できるので、「Skip」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/106239e5-76d4-4940-b942-15e9e9514f35.png)

アンケートに答えましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/447bebd1-0a4b-5f44-c4ae-06cd53796a03.png)

アンケートに答えて、「Continue」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/3eedf2a4-e2e6-331f-c8fe-96f35fa8dec4.png)

Sign inしなくても使えるので、「Skip」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/2f78add2-e43f-9d2e-f0a8-941968edcef4.png)

これで使えるようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/419d10ba-7939-6edc-4ce1-4366a3923ca9.png)

# 参考文献
Qiita Masahito Zembutsuさま（2023年）「Windows 11にDocker Desktopを入れる手順（令和5年最新版）」,
https://qiita.com/zembutsu/items/a98f6f25ef47c04893b3 2024年12月15日アクセス.

Zenn Seiyaさま（2023年）「Docker Desktop for Windows インストール」,
https://zenn.dev/seiya0/articles/tech-docker-desktop-for-win-install 2024年12月15日アクセス.
[Delphi][小ネタ] 静的クラスメソッド

# Win32 API のコールバック関数

Delphi では一般的に Win32 API のコールバック関数は、こんな風にグローバルに定義します。

```delphi:EnumWindowsを呼ぶ例
function EnumWindowsProc(AWnd: HWND; AlParam: LPARAM): BOOL; stdcall;
begin
  // 何か処理
  Result := True;
end;

procedure TFoo.CallEnumWindows; // TFoo クラスのメソッド
begin
  EnumWindows(@EnumWindowsProc, 0);
end;
```

でも、グローバル関数を定義すると、なんだか TFoo と分断されてるし、場所をどこに書くか迷っちゃう…

# 静的クラスメソッド

実は、静的クラスメソッドを使うとそんな悩みともおさらばです。

```delphi
type
  TFoo = class
  private
    // class がクラスメソッド、最後の static が静的メソッド、を示しています
    class function EnumWindowsProc(AWnd: HWND; AlParam: LPARAM): BOOL; stdcall; static;
  public
    procedure CallEnumWindows;
  end;

class function TFoo.EnumWindowsProc(AWnd: HWND; AlParam: LPARAM): BOOL;
begin
  // 何か処理
  Result := True;
end;

procedure TFoo.CallEnumWindows; // TFoo クラスのメソッド
begin
  EnumWindows(@EnumWindowsProc, 0);
end;
```

通常の Delphi のメソッドポインタとは違い、静的クラスメソッドはグローバル関数と同じ形式にコンパイルされます。
そのため、グローバル関数が必要な場合は、静的クラスメソッドとして作ると所属がはっきりしたままグローバル関数を使えるというわけです。

これは Win32 に限らず、C/C++ のライブラリを取り込んだ時とかにも使えます。

# まとめ
所属がはっきりするのでコードが見やすくなります。
C/C++ のライブラリを取り込んだ場合などに、良く使っています。
day16 『独学大全』

## はじめに
　驚くべき書籍です。752ページもあり、とても読みきれません。
 驚くべきポイントは、その大量の内容を独自の視点で体系化していることです。
 
![独学大全 目次2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/e0c74b9a-9efa-fe6d-dcf6-72a6dfdaab07.png)


## ポイント

### 背表紙　圧巻の752ページ

![独学大全 背表紙.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/0a6b23f3-5857-e5ed-0f76-af9f1c8ff417.png)



### 無知を、どうにかしたいんです。

![独学大全 無知2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/74ffb069-e29c-401b-f7e4-d022285ed9e4.png)


### 独学の全体像

![独学大全 目次2 ｐ２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/96fc2ab6-dd4f-f2ff-76fa-ecd31dfb7b8a.png)

### 悩みに応じた、索引もあるよ。

![独学大全 索引表.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/b7fcb81e-bab4-5eb3-d7f5-a21dbcf16cb6.png)

![独学大全 索引裏.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533414/cdf1d750-b57c-4b0b-e8f4-1da614b1a3fe.png)


## 書誌情報
- 書籍名：独学大全 
- 著者：読書猿
- 出版社：ダイヤモンド社
- ISBN：978-4-478-10853-6

## 参考
-
【追加版】UiPath開発～開発対象のシステムでつまづく点を挙げてみる～

## はじめに
この記事は、RPA Advent Calendar 2024の15日目の記事です。
寒いですが、頑張っていきましょう。

https://qiita.com/advent-calendar/2024/rpa

:::note info
なお立場上、本件の事象に当てはまる方とそうでない方もいます。
あくまでも「客先に常駐することが多いプロ開発者」の視点で見ていただけると幸いです。
:::
## 実は...

昔、以下のような記事を投稿しました。

https://qiita.com/saosao885/items/6d3d83d45c447234f0c5

おかげさまで、多くの方に見ていただけてとても幸いです。
ありがとうございます。
この記事では、追加でつまづきがちな点を挙げていこうかと思います。

## 追加で説明する点
今回は以下2点について取り上げたいと思います。

①検証と本番等環境に関係なく、システムの文字どころか画面要素が取得できない
②対象のシステムでエラーがあったとしても、そこで中止してよいのか

### ①検証と本番等環境に関係なく、システムの文字どころか画面要素が取得できない
RPAでは、文字の取得や画像の取得も可能ですが中にはそれすらも受け付けづらいシステムが存在します。
実は過去、ボタン取得や一部要素の文字列取得に苦戦したシステムがありました。(某金融系のシステム)
ボタン要素の取得どころか、テキスト取得もままならない...
そんな時に自分は全体の文字列を取得(Get Full Textアクティビティ)して、文字から位置を特定してみるなどで回避しました。
ただ正直無理そうな場合はユーザーに「(このシステムで自動化するのは)無理です！」といって回避するしかないようです。
時には、別の方法を模索するほうが良さそうです。

### ②対象のシステムでエラーがあったとしても、そこで中止してよいのか

対象のシステムでエラーが出れば基本は中止するという選択肢になると思いますが、ユーザーにとっては特に問題ないことかもしれません。

これはヒアリングが不十分で起きたミス？といいますか認識不足で起きたものですが、自分はある実行内容に際しエラー=中止なのかと思っていたら実はそのミスは業務上カバー可能なものであり、ロボットの後続実行に影響がないと判明。結局改修が発生したため、もっと早くに気づけていたらこの改修は発生しなかったと思います。稼働時間は無限でないため非常にもったいないです。

つまり、そのシステムでエラーが出たとしても無意識に中止すべきでなく、 **「これは本当に止めるべきエラーなのか」、「ここで発生するエラーは、業務内で確認できるもののためロボットの動きに影響はないのか」** という点で常に疑問を持ちながらヒアリングや要件定義をまとめていくことが大事だと気付きました。
与えられた情報つまりユーザーから受領する手順書の内容に疑問を持ち、実際に検証環境でわかる範囲まで進め、本当に問題ないことなのかそうでないのかを確認するのが無難と思います。


## まとめ

上記は、今年の業務中に起きたつまづきや気づきに関することです。
①ですが、RPAとの相性が悪めのシステムも存在しますし、無理して続行することは難しいのであれば手順変更やその作業のみスキップして可能な範囲だけ実行するという形で申し出るという選択も一つだと思います。
また、②ですが要件定義の難しさを改めて知ることになった良い経験だと思っています。
**「ユーザーの手順書を完全に鵜呑みにするのでなく、RPAで想定する動きとともにどうするのがベストな選択か」** という点は皆様にも役立てることのできる点ではないでしょうか。
最後までお読みいただきありがとうございました。
VPCエンドポイント経由でECRにイメージをPUSHしようとしたらタイムアウトになった件

### 概要

AWSのECS構築をしようとしていた時のつまずきメモです。

プライベートサブネット内のインスタンスからVPCエンドポイント経由でECRと疎通しようとしたら、コマンド入力後に固まってタイムアウトになってしまう状況に陥りました。

```
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

aws ecr --region ap-northeast-1 get-login-password | docker login --username AWS \
--password-stdin https://${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/[リポジトリ名]

# ... しばらく反応なし ...

# Connect timeout on endpoint URL: "https://api.ecr.ap-northeast-1.amazonaws.com/"
# Error: Cannot perform an interactive login from a non TTY device
 ```

Google検索のサジェストに
「ECR 反応ない」「ECR 返ってこない」
とか出てきたので、同じように困っている人に向けて解決の軌跡を残しておきます。

### 前提

まずプライベートサブネットからECRと通信するためには、インタフェース型のVPCエンドポイント2種類が必要になります。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html

>com.amazonaws.region.ecr.dkr
このエンドポイントは、Docker Registry API に使用されます。push や pull などの Docker クライアントコマンドでは、このエンドポイントが使用されます。

>com.amazonaws.region.ecr.api
このエンドポイントは、Amazon ECR API への呼び出しに使用されます。DescribeImages や CreateRepository などの API アクションは、このエンドポイントに移動します。

加えてEC2インスタンスにECRと疎通するためのポリシーのアタッチが必要になります。

上記は設定済みとして話を進めます。もしまだの方は設定をしてみて下さい。

### 結論

通信をするインスタンスとVPCエンドポイントとの間で、適切なセキュリティグループが設定されていなかったのが原因でした。

インスタンス⇔ECRとの間ではhttpsで通信を行うため、互いのセキュリティグループのインバウンドルールで443番ポートを受け入れるようにしておく必要があります。

この設定を忘れると通信が到達できずに、今回のように原因究明困難なタイムアウトとなってしまいます。

設定後、無事に疎通できるようになりました。

```
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

aws ecr --region ap-northeast-1 get-login-password | docker login --username AWS \
--password-stdin https://${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/[リポジトリ名]

# Login Succeeded
```

### おまけ

パプリックサブネットからECRと通信をする場合はVPCエンドポイントを通る必要はありませんが、
既にエンドポイントがVPC内に作成されている場合はそちらを経由する動きになります。

パブリックサブネットなのにECRと通信ができない！という場合は、VPC内にECRへのエンドポイントが作成済みでないか見直してみるといいでしょう。
ページネーション備忘録

この記事は ServiceNow アドベントカレンダー 2024 の12月16日分（シリーズ2）の記事として執筆しています
[ServiceNow Advent Calendar 2024](https://qiita.com/advent-calendar/2024/servicenow)

おはこんばんにちは、にぼしです。
データのスナップショット、ログの退避をしなきゃならーん！という状況に直面したことはありますでしょうか。たくさんのデータを分割取得するために必要なページネーション処理を入れるときのセルフ備忘録です。

## chooseWindow()

 **chooseWindow()** メソッドは後続のクエリによって返される行の範囲を設定してくれます。
使い方： chooseWindow(Number firstRow, Number lastRow, Boolean forceCount)
参考：https://www.servicenow.com/docs/bundle/xanadu-api-reference/page/app-store/dev_portal/API_reference/glideRecordScoped/concept/c_GlideRecordScopedAPI.html
Chuckによるわかりやすーい動画：https://www.youtube.com/watch?v=6A4H9lhju4s

```javascript:docに記載のサンプルコード
var now_GR = new GlideRecord('incident');
now_GR.orderBy('number');
now_GR.chooseWindow(2, 4);
now_GR.query();
while (now_GR.next()) {
  gs.info(now_GR.getValue('number') + ' is within window');
}
```
↑の結果が↓です。
```javascript:docに記載のサンプルコード
*** Script: INC0000003 is within window
*** Script: INC0000004 is within window
```
わ、わかんねえ～～～！
なんで2行目で始まって４行目で終わるのに取得されているのがINC0000003とINC0000004の2つだけなわけ？となりました。ServiceNowでは1行目は0個目（インデックス0）、さらにlastRowは数えないのです。
つまり、chooseWindow(2, 4)の場合、2個目から4個目まで範囲指定するけど4個目は数えないので、2個目と3個目を返します。
1行目　INC0000001　0個目
2行目　INC0000002　1個目
 **3行目　INC0000003　2個目**
 **4行目　INC0000004　3個目**
5行目　INC0000005　4個目

chooseWindowは **chooseWindow(<取得したい最初の行数-1>,<”ガチで”取得したい最後の行数>)** で使うことができます。


## setLimit()
GlideRecord クエリによって取得されるレコード数の制限を設定します。
使い方：GlideRecord - setLimit(数値 maxNumRecords)
特に難しいこともないと思うので割愛

## :confounded:つまづいたこと:confounded:
<a href="https://www.servicenow.com/docs/ja-JP/bundle/xanadu-integrate-applications/page/administer/exporting-data/task/t_BreakUpALargeExport.html">大規模なエクスポートの分割</a>にもあるように、大量のデータ処理を行う場合はsysid順でソートの上で、エクスポート上限の10000件を超えないようにsysid指定を行って最初の10000件を取得したら次の10000件…というように取得していくのがよいと思います。sysauto_scriptで何度かスクリプトを試すうちに、最初と最後のsysid指定はあっているけれど、レコード数が取得したい件数と合わない…途中でレコードが抜け落ちるという事象に遭遇しました。
sysauto_scriptでの設定だけではなく、インスタンスのタイムゾーン設定（システムプロパティ「glide.sys.default.tz」）の見直しで改善したので、同事象に遭遇している方はチェックしてみるとよいかもです。

MIDサーバー使えない！LES使えない！という制約下で試行錯誤されている方のTipsあったら是非教えてください:baby_tone1::dizzy:
【備忘録】Azure バックボーンネットワーク


# バックボーンネットワークとは？

Microsoftのデータセンタ間の通信は全てMicrosoftの管理しているネットワークを通ります。
Azureにおけるバックボーンネットワークはこの「Microsoftの管理しているネットワーク」を指します。
バックボーン通信と言ったりもします。
※あくまでよく使われる「バックボーンネットワーク」はこういった意味だと思っていますが、人によっては違った用途で使用している場合もあります。

そしてこのバックボーンネットワークは”インターネットではない”と明言されています。
> Microsoft サービス間のあらゆるトラフィックはこのグローバル トラフィック内でルーティングされ、決してパブリック インターネットを経由しません。

https://learn.microsoft.com/ja-jp/azure/networking/microsoft-global-network#get-the-premium-cloud-network

しかし、パブリックなインターネットを経由しませんがパブリックIPアドレスでの通信を行うため、「閉域」ではありません。

# パブリックなインターネットって？

いわゆる「インターネット」のことを指しています。
もう少し詳しく記載すると「盗聴される危険性のある不特定ネットワーク」という意味合いが強いかと思います。

# よくあるQA

Q:「インターネットを使いたくない」
A:バックボーンネットワークを許容するなら、通信先をMS内のサービスに留めることで可能です。

Q：「パブリックIPアドレスを使いたくない」
A：バックボーンネットワークはパブリックIPを使用します。
  クラウドを活用していく上では基本的にあきらめたほうがよいかと思います。メリットが激減します。

Q：「専用線/閉域で接続させたい」
A:バックボーンネットワークはMicrosoftが用意したMSサービス間の通信のみが通る場所です。不特定なネットワークを通るわけではありませんが、閉域ではありません。
  本当に閉域にしたい場合、例えばM365へのアクセスをする際は「Express Route Microsoft　Peering」といったサービスを使うことを検討する必要があります。

# 最後に

バックボーンネットワークについてまとめてみました。
何か間違えている点があれば優しく教えていただけると嬉しいです。
ドロップダウンメニューの作成

-Ruby on Railsのバージョン:7.2.1
-Rubyのバージョン:3.3.5

ポートフォリオ作成をするにあたって、サイトをいろいろと見てみた。その中で入れた方がいい技術を実装してみようということでドロップダウンメニューを実装してみました。

コードを下記に記載します。

```erb
<div class="gnavi_wrap">
    <ul class="gnavi_lists">
      <li class="gnavi_list" >
        <%= link_to "メニュー","#" %>
        <ul class="gnavi_list_menu">
          <li><%= link_to "ゲーム","#" %></li>
          <li><%= link_to "ランキング","#" %></li>
          <li><%= link_to "設定","#" %></li>
        </ul>
      </li>
    </ul>
</div>
```
```css
.gnavi_wrap {
  width: 1200px;
  margin: 0 auto; 
}

.gnavi_lists {
  list-style: none;
  padding: 0;
  display: flex;
}
.gnavi_list {
  position: relative;
  margin-right: 10px;
}

.gnavi_list a {
  text-decoration: none;
  color: #333;
  display: block;
  padding: 5px 10px;
}

.gnavi_list a:hover {
  background-color: #6b5a5a;
}

.gnavi_list_menu {
  display: none; /* 初期状態は非表示 */
  position: absolute;
  top: 100%; /* 親要素の下に表示 */
  left: 0;
  border: 1px solid #ccc;
  list-style: none;
  padding: 0;
  width: 150px;
  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
}

.gnavi_list_menu li a {
  padding: 5px 10px;
  color: #333;
  display: block;
}

.gnavi_list_menu li a:hover {
  background-color: #f0f0f0;
}

.gnavi_list:hover .gnavi_list_menu {
  display: block;
}
```
下記のメニューのところにマウスをホバーすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931580/581a47d2-91a8-dff7-0f3c-f53e33359489.png)

![スクリーンショット 2024-12-15 22.35.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3931580/6321e705-eaaf-b3ea-85cf-9bac2dea63c6.png)
ゲーム、ランキング、設定と詳細な内容がドロップダウンメニューとして出てくるように実装した。


## 躓いた部分
```erb
<li class="gnavi_list" >
        <%= link_to "メニュー","#" %>
        ~
        ~
```
上記liタグをそのまま     
```erb
<li class="gnavi_list" ><%= link_to "メニュー","#" %></li>
```
とそのまま閉じていたことによってうまくcssが適用されておらず、ドロップダウンメニューが出てこなかった。

## ポイント（私が勝手に思ってるポイント）
```css
.gnavi_list_menu {
  display: none; /* 初期状態は非表示 */
```
ここのgnavi_list_menu（ゲーム、ランキング、設定のリンク）が初期状態で非表示に設定してあげて、

```css
.gnavi_list:hover .gnavi_list_menu {
  display: block;
}
```
gnavi_list:hoverでgnavi_list（メニューのリンク）にマウスポインタをホバーした時に
.gnavi_list_menu（ゲーム、ランキング、設定のリンク）をdisplay: block;によって表示する。
また、blockの特性上、縦方向に積み重なるように表示されるので、今回メニューの下にそのまま自然と表示されたのでよかった。

以上になります。
Railsのポートフォリオのためにやってますが、HTMLとcssばっかりしてんな笑
ご指摘などありましたらお願いします。
知っておきたいフォルダ管理術~フォルダ構成のポイント~

# はじめに
フォルダを利用してファイルを管理し、チームメンバーと情報を共有するのは一般的な光景だと思います。
しかしながら適切に整理整頓してフォルダ管理を行うのは意外と難しいのではないでしょうか。
本記事ではプロジェクトを管理していくうえでどのようなフォルダ構成にしていくべきか、
基本と応用に分けて意識すべき点をご紹介します。
初心者の方にも必見です！

# フォルダ構成の基本
プロジェクトが発足されるとまずはプロジェクトフォルダが作成されます。
今回は「20241215_フォルダ構成pjt」というフォルダが切られたとします。
そこからどうフォルダ構成を作っていくかを考えていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2873167/d5223b8f-90f5-033b-e30d-854e3406eea4.png)

### ポイント1．フォルダの先頭に2桁で番号を振る
必ず「01_」「02_」のように2桁を守りましょう。
1桁と2桁が混ざると見づらいですし、プログラムやExcel関数でフォルダ名を触る際に余計な考慮が必要になる場合があります。
桁数は3桁も考えられますが、3桁以上だと1階層に配置されるフォルダの数が増えてしまい可視性が下がると考えています。
特別な事情がなければ2桁でよさそうです。

### ポイント2．管理・共通領域を作る
00～09は管理・共通領域として設定しましょう。
プロジェクトフォルダに限らず、管理用のフォルダや共通事項のフォルダは必要ですね。
管理フォルダの番号は「01_」とする場合が多いです。
「00_」だと何かの必要に迫られてフォルダの先頭にフォルダを配置したい場合に困る可能性があります。

### ポイント3．メインフォルダ領域を作る
10～89はメインフォルダ領域として利用します。
フォルダ構成を決定づける領域です。
この領域はフォルダの目的にそって工程ごとに適切に配置していく必要があります。
プロジェクトフォルダにおいては
###### (3-1)全体スケジュールにそって配置するとよい
でしょう。
ITのプロジェクトなら 要件定義→基本設計→詳細設計→… となります。
ここでさらにポイントなのが、
###### (3-2)基本は10飛ばしでフォルダを作る
ことです。
もし01,02,03と連番を振ってしまうと、間にフォルダ追加した場合に対応が難しいです。
ただし、「11_」「12_」と間にフォルダを入れすぎると1階層に配置されるフォルダが増えて可視性が落ちてしまいます。
###### (3-3)基本は1階層で15フォルダを超えない
ように意識しましょう。

### ポイント4．その他領域を作る
90～99はその他領域として使っていきます。
受領資料を格納するフォルダや、個人フォルダを配置します。
正直この二つがメインの使い道ですね。

### 【図】ポイントをおさえた結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2873167/5e632bae-6f73-27b2-0416-1b6c6f3b73ba.png)


# フォルダ構成の応用
<p>基本を押さえただけではうまくやっていけないのが世の常。
ということで応用編です。</p>

### 工程が決まっていないフォルダ構成
事前調査段階や企画段階など手探りなことが多いときは、あらかじめフォルダ構成を確定することができません。
ポイント1,2,4はよいですが、ポイント3で困ることになります。
そのような場合は以下の方針が考えられます。
###### 順次連番で作業フォルダを作成する。
発生した作業をメインフォルダ領域（10～89）で単純に連番で並べます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2873167/65cad421-c744-77be-e6c2-fbb7a2fda6f9.png)

###### 作業種別フォルダを作る
工程が決まっていなくともおおよその作業種別が分かっている場合は順次作業種別フォルダを作成し、そのにファイルを格納していきます。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2873167/2058c94d-4ba5-05cf-ee21-d447f572f1f8.png)

### 階層の優先度問題
プロジェクトの中で複数システムがあったり複数チームがあったりすると、
それらをどの階層で分けるか迷うことがあります。
大きく2通りの対処方法があるものと思います。

###### 主体優先
1プロジェクトで複数システムに分かれている場合、先にそれらをフォルダ分けしてしまいます。
管理・共通領域（00～09）およびその他領域（90～99）は基本的にはくくりだして上位階層に置きましょう。
ただし、番号は上述のポイント1～4と同様の振り方にしておきます。

###### 工程優先
工程を優先させる場合、各工程フォルダにシステムのフォルダ分けをします。
主体優先か工程優先かはなかなか明確にどちらがいいか判断つかない場合が多いですが、
主体の区切りが強い（チームが全く別で作業しているなどの）場合は主体優先、
工程の区切りが強い（どちらのチームも同じ工程をたどるなどの）場合は工程優先とするといいかもしれません。

### 【図】それぞれの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2873167/55c0f793-13d9-b0ad-e1a6-5c8a1b106dd5.png)


### タイムスタンプを前に付けるか、後ろに付けるか
「yyyymmdd_*」なのか、「*_yyyymmdd」なのか迷うことはないでしょうか。
そんな時はこのような基準で分けるとおさまりが良い気がします。
※この章ではファイルの話も混じります。

###### 保管する物は「yyyymmdd_*」
ある時点で発生して格納しておき、基本的に閲覧しかしないものは「yyyymmdd_*」と前にタイムスタンプをつけます。
例えば議事録やログ関連の資料です。
また、障害調査などは障害発生時点で「yyyymmdd_<障害内容や障害管理ID>」フォルダを作りその中で調査資料を置いて作業するのも有用です。

###### 更新する物は「*_yyyymmdd」
継続的にメンテナンスしたり成長させたりするファイルは「*_yyyymmdd」と後ろにタイムスタンプをつけます。
例えば設計資料や管理系の資料が該当します。
更新中ではタイムスタンプをつけずに管理し、誰かにある時点で共有する場合にファイルをコピーして「*_yyyymmdd」をつけましょう。
もし同日に複数ファイル共有する場合は「*_yyyymmdd_1」「*_yyyymmdd_2」と連番を振ればよいでしょう。

### おわりに
いかがでしたでしょうか。
この記事を読んだ方のフォルダ管理にお役に立てたなら嬉しいです。
【ルール整備】動画素材整理しませんか？-高校部活での素材整理-

## 動画素材の整理をしよう
過去素材というレガシーの活用のために動画素材（ある程度容量があるファイル）をどのように整理し活用するべきか考えます。

こういった素材整理の天敵とはなにか？
ズバリ**永続性・持続可能性の壁**です。

「自分の代ではしっかり整理できても，下の世代にまで繋がらない」こういったことがよく起こります。これらを起こさないようにするためなるべく簡単に伝えることができる方法についてここでは考えます。

今回は私が高校の放送局で大量の動画素材を整理し活用するためにしたルール整備について書きます。

※これは周りの人への伝え方が簡単なだけで，環境構築にはいくらか知識が必要になるかと思います。

## ハード＆ソフト環境
* 部屋
    * 部室
    編集するにはスペックが微妙なPC(Windows)がある
    校内ネットワーク接続（NASはなし）
    　
    * コンピュータ室
    動画編集するPC(Mac)がある
    校内ネットワーク接続（NASあり）
    セキュリティーのためSSDの接続不可

    ※すべてのPCでGoogleドライブ（容量ほぼ青天井）を使用可能

※２つの部屋は１階分離れている

## 素材の出入り環境
各々音声ファイルと動画ファイルが存在し１行事あたり10GB程度の容量
* **入る**
    * 行事素材
    * 大会用動画素材
* **出る**
    * 学校説明会用動画用に素材
    * 書き出した大会用素材

## 素材整理において重要な点
1.「素材がどこにあるか」がわかるようにする
2.検索をかけれるようにする
3.数年単位で素材が集積するので誰でも扱いやすいようにする
以上の3点を重視し，ルール整備及び環境整備を行いました。

## 素材整理において決めた基本指針

**とりあえずNASにぶち込め**

## なぜNASにいれる？
素材整理において重要な点で確認した3点についてNASのメリットを考えます。
1.素材がどこにあるか→確実にNAS上に存在
2.検索をかけれるように→下で説明します。
3.誰でも扱えるように→とりあえずNASにいれるだけなので簡単

## 検索をかけるるようにする工夫
**ファイル名のゆらぎをなくす**
ファイル名・ファルダ名の命名規則の徹底を行います。
ただ「これが面倒くさくなりファイル名が結局揺らぐ」こうなるパターンが多いと思います。
そこでEXCEL上に表を作成しVLLOKUPで検索ができるようにし，簡単にファイル名を統一をできるようにしました。

現在絶賛運用中で問題点が出たら改善を行っていきたいと思います。

以上です。最後までご覧いただきありがとうございます。
自分用メモ：OpenAIのライブラリ使うと「TypeError: Client.__init__() got an unexpected keyword argument 'proxies'」が出る

解決方法はこちら

https://community.openai.com/t/error-with-openai-1-56-0-client-init-got-an-unexpected-keyword-argument-proxies/1040332

httpxのバージョンが上がるとエラーになるという罠らしい。
バージョンを指定することでうまくいく。
```
!pip install httpx==0.27.2 
```

----
[LangChainとLangGraphによるRAG・AIエージェント［実践］入門](https://www.amazon.co.jp/LangChain%E3%81%A8LangGraph%E3%81%AB%E3%82%88%E3%82%8BRAG%E3%83%BBAI%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%EF%BC%BB%E5%AE%9F%E8%B7%B5%EF%BC%BD%E5%85%A5%E9%96%80-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E9%81%B8%E6%9B%B8-%E8%A5%BF%E8%A6%8B-%E5%85%AC%E5%AE%8F/dp/4297145308)を参考にしてたら、タイミング悪かったのかこのエラーに遭遇。。

Google Colab内でやってるせいか、キャッシュかなんか残るのかな？
httpxのダウングレードだけでは解決しない。
```
import os
os.kill(os.getpid(), 9)
```
ここまでやらないとどうもバージョンが更新されないっぽいので注意。
プロセスをキルしてるので、OpenAIのAPIキーまでなかった事にされる。

同じように悩んでる人がいれば。
Reactのプロジェクト作成でエラーが起きた

# 概要
以下のコマンドで、Reactのプロジェクトを作成しようとしたところ、
```
npx create-react-app ./install_test
```
以下のエラーが起きた。
```
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
npm ERR!
npm ERR! While resolving: install_test@0.1.0
npm ERR! Found: react@19.0.0
npm ERR! node_modules/react
npm ERR!   react@"^19.0.0" from the root project
npm ERR!
npm ERR! Could not resolve dependency:
npm ERR! peer react@"^18.0.0" from @testing-library/react@13.4.0
npm ERR! node_modules/@testing-library/react
npm ERR!   @testing-library/react@"^13.0.0" from the root project
npm ERR! node_modules/@testing-library/react
npm ERR! node_modules/@testing-library/react
npm ERR! node_modules/@testing-library/react
npm ERR!   @testing-library/react@"^13.0.0" from the root project
npm ERR!   @testing-library/react@"^13.0.0" from the root project
npm ERR!
npm ERR! Fix the upstream dependency conflict, or retry
npm ERR! this command with --force, or --legacy-peer-deps
npm ERR! to accept an incorrect (and potentially broken) dependency resolution.
```
エラーの内容としては、現状使おうとしている、testing-library のバージョンがReact19に対応していないというもので、Reactのバージョンを18に落とすか、testing-library を、アップグレードするといいらしい。

以下参考：
https://stackoverflow.com/questions/79257068/solution-of-this-error-without-force-or-legacy-peer-deps
 　
しかし、エラーは出ているものの、プロジェクトファイルはできているので、試しに起動してみた。
すると以下のエラーが表示された。
![スクリーンショット 2024-12-15 181100.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/bde74dd4-0ccc-2377-9277-05736abd565b.png)

次は、testing-library とは関係ない？エラーが出てきた。
web-vitalsがないらしいので、以下のコマンドでインストール。
```
npm i web-vitals --save-dev
```
起動しなおすと、無事動いた。
![スクリーンショット 2024-12-15 181701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831969/baef9ab3-a120-d2c9-7741-2297881464ac.png)

そのまま少し触ってみたが、特に問題はなさそうだった。

# なぜ？
色々調べてはみたが、結局、なぜこんな風になっていたのか良く分からなかった。
（自分がまだ、Reactに詳しくないのが原因）
だが、とりあえず動くようにできる方法だけ、自分用にまとめた。