OmniAICreator/Qiita-1.07M huggingface dataset:
ネットワーク内の他PCの外付けHDDに対してシンボリックリンクを貼る方法

## 目的
Ubuntuで、ホームネットワーク内の別のパソコンに接続された外付けHDDのフォルダへのシンボリックリンクを作成することが可能である。以下にその手順を示す。

## 手順
### 1. ネットワーク共有の設定（別のパソコン側）
まず、外付けHDDが接続されているパソコンでネットワーク共有を設定する。

** Sambaのインストール（まだインストールされていない場合）**

```
$ sudo apt update
$ sudo apt install samba
```

**共有したいフォルダを設定**
smb.confファイルを編集する。
```
$ sudo nano /etc/samba/smb.conf
```

ファイルの最後に以下を追加する。
```
[14GB_HDD]
path = /path/to/your/external/14GB_HDD
available = yes
valid users = yourusername
read only = no
browsable = yes
public = yes
writable = yes
force create mode = 0666
force directory mode = 0777
```

設定を保存して、Sambaを再起動する。
```
$ sudo systemctl restart smbd
```

### 2. ネットワーク共有のマウント（Ubuntu側）
別のパソコンで共有フォルダをマウントする。

**マウントポイントの作成**
```
sudo mkdir -p /mnt/shared_folder
```

**ネットワーク共有のマウント**
```
sudo mount -t cifs //ip-address-of-other-pc/shared_folder /mnt/shared_folder -o username=yourusername,password=yourpassword
Ex) sudo mount -t cifs //[ip]/14GB_HDD /home/initial/14GB_HDD -o username=initial,password=initial
```

### 3. シンボリックリンクの作成
ネットワーク共有がマウントされた後、シンボリックリンクを作成する。
```
ln -s /mnt/shared_folder /path/to/your/symlink
```

これで、ホームネットワーク内の別のパソコンに接続された外付けHDDのフォルダへのシンボリックリンクを作成できます。

## 注意点
**自動マウント：**
再起動後も自動でマウントしたい場合は、/etc/fstabにエントリを追加する。
```
//ip-address-of-other-pc/shared_folder /mnt/shared_folder cifs username=yourusername,password=yourpassword 0 0
```
ファイアウォール：必要に応じて、ファイアウォールの設定を調整し、ネットワーク共有がブロックされないようにする。


**ユーザー名とパスワードの確認：**
Sambaサーバー上で、initialユーザーが正しく設定されていることを確認する。
```
$ sudo smbpasswd -a initial
```
これにより、Sambaユーザーinitialのパスワードを設定する。
HTMLにProcessingで作ったものを見る方法

# はじめに
みなさん！！Proccesingという言語は知っていますでしょうか？Proccesigとは，アートやデザイン，グラフィックスやアニメーションに使われるJavaベースの言語です．私の大学では，プログラミングに慣れ親しむために，登竜門としてProcessingを学びます．そして，私はその時にかなりの力作ゲームを作成したので，せっかくならポートフォリオで遊べる状態のものを載せたいと思い．webでProcessingを見られるようにしてみました．

# 手順
２種類あります．やり方としてはJavaScriptと似ています．
そのまま同じファイルに書き出すのと，別ファイルで作って呼び出すという２種類です．
短いコードは同じファイルに，長いコードは別ファイルを作ることをおすすめします．
では，，，
### HTMLファイルに直接書く方法
以下のコードのように`<script></script>`で囲んで，直接書き込みます．
実際にコピペしてみてください．円がカーソルをついてくるようなものが出てくると思います．
コードを変えて色々遊んでみてください．
``` index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Processing in HTML</title>
    <!-- Processing.jsライブラリを読み込む -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/processing.js/1.6.6/processing.min.js"></script>
</head>
<body>
    <!-- Processingスケッチ用のキャンバス -->
    <canvas id="mySketch"></canvas>

    <!-- Processingスケッチを読み込むスクリプト -->
    <script type="text/processing" data-processing-target="mySketch">
        // ここにProcessingのコードを直接書く
        void setup() {
            size(400, 400);
            background(200);
        }

        void draw() {
            background(200);
            ellipse(mouseX, mouseY, 50, 50);
        }
    </script>

</body>
</html>
```
### 別ファイルで作って呼び出す方法
本来はProcessingで作ったコードが長い時などで別ファイルで管理したい時にもちいますが，今回はわかりやすいように先ほどと同じコードを別ファイルに書き，それを呼び出す方法をお伝えします．私は，これくらいのコードなら，直接書く方を選びますね．．．
という，ことは置いといてファイル構造は以下の感じで，htmlファイルやProcessingのファイルも真似してもらうといいです！簡単ですね!!

``` tree.
.
├── index.html
└── mySketch.pde
```

``` index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Processing in HTML</title>
    <!-- Processing.jsライブラリを読み込む -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/processing.js/1.6.6/processing.min.js"></script>
</head>
<body>
    <!-- Processingスケッチ用のキャンバス -->
    <canvas id="mySketch"></canvas>

    <!-- 外部の.pdeファイルを読み込む -->
    <script type="text/processing" data-processing-target="mySketch" src="mySketch.pde"></script>
</body>
</html>
```

``` mySketch.pde
void setup() {
    size(400, 400);
    background(200);
}

void draw() {
    background(200);
    ellipse(mouseX, mouseY, 50, 50);
}
```

:::note alert
headにライブラリの記述は絶対必要です！！！
`<script src="https://cdnjs.cloudflare.com/ajax/libs/processing.js/1.6.6/processing.min.js"></script>`
:::

:::note warn
canvasのidとdata-processing-targetの値は同じですか？
:::

# 最後に
Demo or Die という言葉がありますが，私もそう思っています．色々な制作物を作って，必ず動ける状態にしていきたいですよね．そして，それを実際にいろんな人に触ってもらいたい!!!そんな気持ちから過去の力作（汚作）を公開しようと思い，今回にいたりました．Processingは簡単で綺麗なアートなどを作れるのでみなさんもぜひ作って，ポートフォリオに飾っていきましょう．
それではみなさん，良いエンジニアライフを〜👋
【備忘録】C++のメモリアクセス

C++で以下の例の様に、値をそのままFunctionに渡した場合、

```cpp
void modVal(int a){
    a = 10;
}
```

これを以下のように使った場合でも、xの値は変更されずに5のままとなります。

```cpp
int main(){
    int x = 5;
    modVal(x);
    printf("%d\n", x);  // 5のまま
}
```

これは、modVal内で、xはコピーとして扱われているためです。
Func内でxを上書きしたい場合には、xのメモリアドレスを渡すことで、意図する機能となります。
&aはaの値のメモリアドレスを表し、modValの*aは、aのアドレスにある値を直接参照します。

```cpp
void modVal(int *a){
    *a = 10;
}

int main(){
    int x = 5;
    modVal(&x);
    printf("%d\n", x);  // 10にアップデートされる。
}
```

一方で、Arrayを渡す場合には対応が異なります。C++では、Arrayを渡した場合にはArray内のIndex-0のポインターを渡していることになるようです。したがって、Func内で渡したArrayに加えられた変更は、オリジナルのArrayへの変更をもたらすようです。
言語化の重要性

# はじめに
よくエンジニアは言語化することが重要と言われますが、何故重要なのかを自分なりに解釈したことを記載していこうと思います。

※時間がなくて言語化するためにはどうすれば良いのよ？ってところまでは記載出来てません。。
　これはどこかでまとめようかと。
 　今回は、言語化の重要性にフォーカスを当てた記事となります。

# 説明する場で必要な言語化
対面レビューやMTGの中で、"アレ"とか"コレ"という抽象的な表現をする人見かけませんか？
単純な説明や仕様の話であれば問題無いかもしれませんが、複雑な説明になってくると一体なんのことを話しているのか途端に分かりにくくなるかと思います。

開発を進めていく上で全部自分一人で進めていくのであれば良いかもしれません。
ただし、多くの場合は仕様を決める担当者、デザイナー。アプリ側、サーバ側、インフラ側と多数の人間が関わってきます。

**それぞれ専門分野が異なるため、技術レベルが一定ではありません。**

この状態でどの担当者にでも同じ説明内容だと、おそらく相手にとっては理解し難い状況になることは容易に想像できるかと思います。
これは、前提とする知識に差異がある為です。
　例）
　　デザイナーにアプリ側の技術的なことを説明しても理解しづらいのと同様に、
　　逆にアプリ側のエンジニアにデザイン的な深い説明をしても理解しづらいでしょう。

その為、どの担当者に説明するかによって話す内容や話し方が変わっていきます。
どの担当者向けに話すかによって内容が変える必要

ここで重要になってくるのが言語化です。

相手の立場や役割を理解した上で、相手が理解しやすいように説明の筋道や言葉を選んで説明する必要があるため、言語化が重要になってくる部分だと思います。

これマネージャー層に必要な話と言うわけではなく、
１エンジニアが説明する場面もたくさんあるので全エンジニアに必要なスキルだと考えられます。

※根本的なことを言うと、客や上長に開発にGOを出してもらう為には仕様や目的、売上など明確に言語化して伝える必要があります。
　そうじゃないとそもそも開発が始まらないっていうね。

# コーディングする上でも必要な言語化
次に、コーディングの観点で言語化が必要かについて考えていきます。
結論から言えば、勿論コーディングする上でも言語化は必要です。

言語化できない場合、何が起こるかというと品質が悪くなります。
例を挙げると以下のようなことが起こるかと。。
・曖昧な仕様のまま作業を進めることになる可能性がある
　（違和感を感じつつ言語化できないのでそのまま進める人とかいるんですよ。。）
・コードのコメントやメソッド名が適当
・仕様書が分かりづらい

つまり、コーディングする上でも言語化は必須となります。

また、コーディングする上で他の担当者と同じ認識で開発を進めないと後々問題になります、必ず。

異なる認識を持っていることに気がついた場合何をするかと言うと、パッと思い浮かぶだけでも以下タスクが必要となってきます。
・原因特定
・修正案の検討
・修正案の提案内容の整理と影響範囲の洗い出し
・各担当者と同じ認識を持つためのコミュニケーション

これらのタスクを実行していくために必要なのスキルの一つとして、言語化が挙げられます。
特に原因特定や修正案の検討時に言語化できていなかったとしたら、原因特定や修正案の検討が不十分だとも言えます（仕様を深く理解していない、とも言えるかも）

# まとめ
言語化することによって得られるメリットとしては、以下が挙げられるかと思います。
・問題の整理(問題点、期待値、原因の整理)
・エンジニアではない人に伝える能力
・仕様の明確化
・実装時のコメント、メソッド名やクラス名や変数名などの単語の明確化

また、今後は生成AIを使用すると気にもこの言語化のスキルは役に立ってくるでしょうし、
目線を変えると
エンジニアとしての中長期の目標設定などにも必要となってくるかと思います。

様々なところで役に立つ言語化。
もし他の人に説明する場で言葉に詰まりやすかったり、具体的な言葉で説明できないときは言語化できていない証拠かもしれません。

言語化を意識し、より良きエンジニアライフを。

以上
RustとWebAssemblyでSvgコンバーター作ってみた




# はじめに

前回FaviconGenerator作成した時にIcon繋がりでSvgのコンバーターも作りたいと思ったので

学習用にRustとWebAssembly使ってSvgコンバーター的なのを作成しようと思います。

前回FaviconGeneratorについて

https://qiita.com/shisojuice/items/2ce43d25ec48c2c36486


# プロジェクトの作成

wasmで画像dataと閾値を受け取り、グレースケール変換と256x256にリサイズする。

ピクセルを走査し、閾値よりも暗い場合は、Pathに描画していく。

最後に、出力結果のSvgのFormatの文字列を返す。

```rust:lib.rs
// 省略

#[wasm_bindgen]
pub fn image_to_path(image_data: &[u8], threshold: u8) -> String {
    let img = image::load_from_memory(image_data).unwrap();
    let img = img.grayscale();
    let img = img.resize(256, 256, FilterType::Nearest);

    let mut path_data = String::new();
    for y in 0..img.height() {
        for x in 0..img.width() {
            let pixel = img.get_pixel(x, y);
            if pixel[0] < threshold {
                path_data.push_str(&format!("M{} {}h1v1h-1z", x, y));
            }
        }
    }

    format!("<svg width=\"{}\" height=\"{}\"><path d=\"{}\" /></svg>", img.width(), img.height(), path_data)
}

// 省略

```

あとは、Javascript側で上記関数を利用するだけで実装完了！！


# 今回の成果物

デモURL

https://shisojuice.github.io/Rust_SvgConverter/


デモ画像

・元画像

![RustとWebAssemblyでSvgコンバーター作ってみた_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777149/c9fcd775-862f-bb41-3a37-3cf390cf6e3b.png)

・変換後

![RustとWebAssemblyでSvgコンバーター作ってみた_002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777149/7ec381ce-96d8-5ee2-3363-d6361044a7ad.jpeg)


ソース

https://github.com/shisojuice/Rust_SvgConverter


# まとめ

今回は画像をSvgに変換してみた。📚

Svgへの変換部分の処理はほぼAIに聞いたが、

ただ質問をなげるだけでなく知識も着実に身につけていきたい。💪

※間違い等ありましたら、ご指摘いただけると助かります。
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（62/100）

≪問題62≫
計画作成方針に有限計画（反転あり）を使用して、過去の日程計画を許可しようとしています。方針プロファイルでは、これをどのようにパラメータ化しますか。
□マイナス（負）のオフセットタイムを指定する。
□プラス（正）の計画期間を指定する。
□マイナス（負）の計画期間を指定する。
□プラス（正）のオフセットタイムを指定する。

≪解答≫
■マイナス（負）のオフセットタイムを指定する。
□プラス（正）の計画期間を指定する。
□マイナス（負）の計画期間を指定する。
□プラス（正）のオフセットタイムを指定する。

≪解説≫
◆ 計画作成方針に「有限計画（反転あり）」を使用する場合、希望利用可能日時から開始して、リソースがまだ割り当てられていない計画作成日付後の作業または指図の最後の活動（逆計画方向）または最初の活動（順計画方向）に対して設定された計画方向で、計画作成日付が検索されます。
◆ 作業を計画の過去の日付に開始できるようにするためには、方針プロファイルでマイナスのオフセットタイムを指定する必要があります。プラスのオフセットタイムでは、本日以降の一定期間後にのみ日程計画を許可することが可能です。
PythonでMarkdownテキストをPDF出力 in Google Colaboratory

ChatGPTのAPIを叩くと、結構な確率でMarkdownテキストが返ってきます。

エンジニアさんならこれで何も問題ないのですが

一般の事務の方や、営業の方が使うような生成AIアプリで
このフォーマットが返ってくると、ちょっと見た目がとっつきにくくて...という方が多かったりしませんか？

そんな経緯でMarkdownテキストをPDFにする方法を調べてみました。

---

# 方法

* pythonでMarkdown to HTMLは簡単にできる
* HTML to PDFというアプリを使って変換する。Pythonでもこれをインストールすれば呼べる

というかんじで、Python経由でMarkdownを一度HTML経由して、PDF出力することとしました。

---

# 実装

今回少しだけ環境依存があるので、
環境が比較的安定しているGoogle Colaboratoryで実現しています。

(1) wkhtmltopdfのインストール

https://wkhtmltopdf.org/


    !sudo apt-get install wkhtmltopdf


winやmacのローカル環境なら、上のURLからインストーラ経由でインストールすれば良さそうなんですが、
すみません、動作未確認です。

(2) pipしてwkhtmltopdfを呼べるようにします。


    pip install pdfkit


(3) 日本語フォントのインストール

これをしないと日本語が表示されない。

    !sudo apt-get install -y fonts-noto-cjk

MarkdownテキストをwPDF変換するpython Google Colaboratory用コード。

```python
import markdown
import pdfkit
from google.colab import files

MARKDONW_STRING = "# Markdown Text"
OUT_FILEPATH = "/path/to/出力先/hoge.pdf"

# Markdownを一旦HTMLに変換します。
html_text = markdown.markdown(MARKDONW_STRING)

# HTMLからPDFに変換して保存します。
options = {
    'page-size': 'A4',
    'margin-top': '0.4in',
    'margin-right': '0.4in',
    'margin-bottom': '0.4in',
    'margin-left': '0.4in',
    'encoding': "UTF-8",   # UTF-8大事。これがないと日本語が文字化けする。
    'no-outline': None,
    'disable-smart-shrinking': '',
}
pdfkit.from_string(html_text, OUT_FILEPATH, options=options)

# 生成されたPDFをブラウザからダウンロード。
files.download(OUT_FILEPATH)
```

これでPDF出力できるようになりました。
MarkdownのテキストでDXが進まないときは、さくっとPDFにしてみると良いかもしれません。
さくらエディタ（個人的）よく使う操作

# 概要
個人的によく使うさくらエディタの操作まとめ。
正規表現なんてちゃんと勉強する気はないけど便利な置換したいなって人へ。
※随時更新

# 操作系
| 操作 | 効果 | 使い道 | 備考 |
|:-:|:-:|:-:|:-:|
|alt + マウスドラッグor十字キー|矩形選択||Outlookなど他のソフトでも使えることがある操作|
|検索＞grep置換|grep置換||ショートカットがないので忘れがち|

# 置換系
| 置換前 | 置換後 | 効果 | 備考 |
|:-:|:-:|:-:|:-:|
| \t  | (空白）  | Excelから貼り付けたときなどに入るタブの一括削除  |
| \r\n  | \n  | Windowsで作ったファイルをLinux向けの改行コードに変更する  |
|\r\n|\r\n\r\n|空行を1行入れる|置換後の\r\nの数を調整すると挟む行間を増やせる|
|^|・|列挙した項目の先頭にとりあえず中黒打ちたいとき|rm -fにして削除コマンド生成、とかに応用可
|(/.*/)([^/]+)$|find ¥1 -name ¥2|フルパスの一覧からfindコマンドを生成したいとき|

# 検索系
| 検索ワード | 効果 | 備考 |
|:-:|:-:|:-:|
|^.*[任意の１文字]|行頭から任意の１文字まで（任意の１文字を含む）||
|\[任意の１文字](.+)|任意の１文字から行末まで（任意の１文字を含む）||
|^.*[キーワード]|キーワードを含む行||



# 参考
https://sakura-editor.github.io/help/HLP000089.html
UIの基礎(2)

# 1. はじめに
引き続き、意図したUI設計ができるようにデザイン部分の基礎を学んでいます。

前回　
[UIの基礎](https://qiita.com/saburo555/items/d4871ad805fdd70be966)

お次
[UIの基礎(2)](https://qiita.com/saburo555/items/c773cf0e92bd93206b95)
[UIの基礎(3)](https://qiita.com/saburo555/items/2d993e25179f85aba2e3)
[UIの基礎(4)](https://qiita.com/saburo555/items/8426c243d14efca1f5a5)

# 2. 色・形・動き
## 2.1. 色
色があると、人は同じようなものから、何かを見つけ出す行為が格段と早くできるようになる。
しかし、色の種類が増えすぎると、見つけ出す時間は長くなってしまう。
また、デザインをする上で、色を増やしていくことは簡単だが、減らすのはむず悪しい。
そのため、色を無闇に増やさないようにする必要がある。

## 2.2. 形
ホバーやフォーカスに対して、色や形を変化させることによって、ユーザーがどこを操作しているのか、何ができるのかを認識することができる。
また、視覚に障害を持つ方にも、形で表現することができていれば、認識することができる。

## 2.3. 動き
動きの種類は、注目のため、理解のため（画面のどこにいるのか、何が起こったのかなど）、装飾のため（極論なくても大丈夫なものではある）の3つがある。

# 3. インタラクションコスト
## 3.1. 概念
インタラクション*コストは、精神的な負荷と身体的な負荷の2種類。
精神的な負荷とは、ユーザが考えたり、判断したりする際に発生する。
小さい文字であったり、文章が長すぎるものは、負荷が増大する。
「読みやすい」と感じるものは、負荷が軽減する。
（例） 見ただけで押せるとわかるリンクなどは負荷が軽い。

身体的な負荷とは、クリック数やステップの多さなどによって、負荷が増大する。

*インタラクション：アクションが起こったことがわかるような状態（ユーザーの操作の結果）。

:::note info
簡単で、楽で、使いやすいものはインタラクションコストがかからない！
「今までよくある動きで、サッとできて、パッと理解しやすい」みたいなニュアンス。
:::

## 3.2. インタラクションコストを下げる方法
インタラクションコストを下げる方法（アプローチ）のキーワードは以下である。
- 一貫性（ユーザーが予測できる、安心できる、また、機能追加が容易になる。）
- シンプルさ
- 共通概念

:::note warn
一貫性の反対は柔軟性！
ここは反比例の関係。しっかり一貫性を整えた後に、ある程度の柔軟性を持たせる作りを考えると良い。
逆は難しい！
:::

# 直感的とは
直感的とは、ユーザーの予想とその結果が完全に一致すること、いわば、学習コストが0で使えるということ。
シンプルとは、別の概念。
ユーザーのそれまでの経験によって、「直感」は違ってくる。
様々なユーザーの共通的な認識を見つけ、そこからインタラクションコストを下げ切った状態が直感的なデザインと言える。

# 4. 階層と構造（サイトマップをイメージする）
## 4.1. 階層
階層は、「浅く、広く」の方が使いやすいと感じられる傾向がある。
階層を上下する方が労力がかかる。

階層が広いほど、ラベリング（ページに名前をつけること）が具体的になるので、探しやすくなる。

:::note info
ラベリングは、重複する意味がないようかつ、具体的に付けていく必要がある！
:::

## 4.2. 現在地がわかるように差別化
ユーザーに階層のどこにいるかをわかるようにする必要がある。
手法としては、パンくずリストが挙げられるが、文字で表現するため、デザインに影響が出たり、認知の負荷がかかる。
別の方法として、ナビゲーションなどで、「太さ、いろ、大きさ、背景、目印」などを組み合わせることで、他の表示と差別化して、表現する手法が挙げられる。

注意点としては、「現在地」と「フォーカス」の表現を被らないようにする必要がある。
（例）現在地：太さ、色と目印、　フォーカス:色と背景色 で表現する　など（GmailのPC）

## 4.3. 構造（一部）
### 4.3.1. 一覧画面の操作
一覧画面の操作は、「抽出」「並び替え」「切り替え」がある。
上記で画面表示に影響を与えた場合は、「何で絞っているか」や「何で並び替えているのか」、「何に切り替わっているか」などを表現する必要がある。

:::note info
上記の状態がわからないのは、結構困る。
当たり前のように表示されているけど、なかったら、状態が把握できないから、何をしているかを忘れてしまったら、一から操作の必要があって非常に不便。
:::

### 4.3.2. ユーザーの「わからない」とは
ユーザーの「わからない」という言葉には、「自分がどこにいるのかわからない」「操作方法がわからない」の2種類がある。
この2種類のわからないを解決する方法は、構造と操作方法において、一貫性のあるデザイン、UIである。
ある程度ユーザーが操作する方法を予測できることがデザインにおいて、わかりやすさを高める。


# 5. まとめ
今回から、記事に知識のアウトプットだけではなく、感想などの思ったことを書いてみました。
そうすることで、自分ごととして捉えて学習できそうだなと思いました！
続けてみます。

## シリーズ
[UIの基礎](https://qiita.com/saburo555/items/d4871ad805fdd70be966)
今：[UIの基礎(2)](https://qiita.com/saburo555/items/c773cf0e92bd93206b95)
[UIの基礎(3)](https://qiita.com/saburo555/items/2d993e25179f85aba2e3)
[UIの基礎(4)](https://qiita.com/saburo555/items/8426c243d14efca1f5a5)
Kubuntu 24.04　にWordPressの開発環境のLocalをインストール



Local
https://localwp.com/

から、debianのファイルをダウンロード


普通にインストールしようとすると、
```
sudo dpkg -i local-9.0.5-linux.deb

```
libaio1とibncurses5がなくてエラーが出る。


```
wget http://ftp.de.debian.org/debian/pool/main/n/ncurses/libtinfo5_6.1+20181013-2+deb10u2_amd64.deb
sudo dpkg -i libtinfo5_6.1+20181013-2+deb10u2_amd64.deb

wget http://ftp.de.debian.org/debian/pool/main/n/ncurses/libncurses5_6.1+20181013-2+deb10u2_amd64.deb
sudo dpkg -i libncurses5_6.1+20181013-2+deb10u2_amd64.deb

sudo apt install libnss3-tools

wget http://mirrors.kernel.org/ubuntu/pool/main/liba/libaio/libaio1_0.3.110-5_amd64.deb
sudo dpkg -i libaio1_0.3.110-5_amd64.deb 

sudo dpkg -i local-9.0.5-linux.deb

```


インストールできたら、権限変更
```
sudo chmod 644 /etc/hosts
```
背景が伸びる見出し

お疲れ様です。

投稿は2日ぶりですが、タイトルの内容の勉強をちまちまとしておりました。
そのまとめです。

```diff_css
#about-main {
  line-height: 70px;
  background: linear-gradient(90deg, #ffe4c4, #ffe4c4 50%, #fff 50%, #fff);
  background-size: 200% 100%;
  padding: .1rem 1rem;
  color: #ff8c00;
}
```
```diff_javascript
// 自己紹介のアニメ
const aboutMain = document.querySelector('#about-main');

const keys = {
  color: ['transparent', '#fff'],
  backgroundPosition: ['100% 0', '0 0'],
};

const op = {
  duration: 1000,
  // アニメが変化する速度、タイミング（開始と終了を緩やかに）
  easing: 'ease',
};

aboutMain.animate(keys, op);
```
上のコードで、背景の位置を動かして、まるで左からぐーんと伸びているようにするアニメーションができました。
今回参考にしたのは、いつもの「1冊ですべて身につく入門講座」の本です。
cssの linear-gradient は2色以上の色が段階的に変化する、いわゆるグラデーションと、角度の指定（90degの部分）を書きます。

そして、jsの backgroundPosition で背景画像の位置を指定します。
最初の'100% 0'の数値は水平で、後ろの'0 0'は垂直を表します。
このコードだと、左から右へぐーんと伸びていくようなアニメーションになり、-100% 0 とすれば逆に右から左にぐーんと伸びるように変化しました。

せっかく実装して、うまく動作してくれましたので、これも自己紹介ページの見出しに実装してきました:relaxed:
Rで地理情報データを描く――県別保育所充足率の描写

```
# 準備 ----------------------------------------------------------------------
##パッケージの読みこみ
library(pacman)
pacman::p_load(tidyverse,ggplot2,sf)
##データの準備
df_23<-read.csv("hoikujo_2023.csv")
###保育所充足率についての列を作成
df_23<-df_23 %>% mutate(jusokuritsu=riyoujidou/riyouteiin)
###データの確認
head(df_23)
###サイズの確認
dim(df_23)


# 地図データの準備 ----------------------------------------------------------------

library(sf)
states01 <- sf::read_sf("ne_10m_admin_1_states_provinces.shp")
###日本のデータのみを抽出
japan01 <- states01 %>%
  dplyr::filter(adm0_a3 == 'JPN')
japan01

iso_pref<-read.csv("iso_code.csv")
iso_pref

df_23_joined <- df_23 |> 
  inner_join(iso_pref,by="todoufuken")
df_23_joined

japan02<-japan01%>%
  inner_join(df_23_joined,by="iso_3166_2")
japan02

# 描写 ----------------------------------------------------------------------

japan02 <- japan02 %>%
  mutate(jusokuritsu_cat = cut(jusokuritsu,
                                  breaks = c(-Inf, 0.85, 0.9, 0.95, 1.00, Inf),
                                  labels = c("85%未満", "85~90%", "90~95%", "95~100%", "100%以上")))

# 色の設定
color_palette <- colorRampPalette(c("Blue","White", "Red"))
colors <- color_palette(5) # 5段階の色を生成

# ggplot2 を使用して地図を描画
ggplot(data = japan02) + 
  geom_sf(aes(fill = jusokuritsu_cat)) + 
  scale_fill_manual(values = colors) +
  theme_void() +
  labs(fill = "値の範囲", title = "2023年度における保育所定員充足率") +
  theme(plot.title = element_text(hjust = 0.5), text = element_text(size = 20))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736314/088ad188-18d0-7ec7-e4f7-945b66fe7436.png)
バグが起きたら自動でJiraにチケット作成してほしい…

## はじめに
こんにちは!! 
Firebase Functionsを使っていると、時々エラーが発生しますよね。そんな時、手動でエラーログを確認し、Jiraにバグのチケットを作成するのは手間がかかります。
そこで、Firebase Functionsでエラーが発生した際に、Jiraに自動でチケットを作成する方法をご紹介します。使用する言語はTypeScript、Node.js、そしてHTTPリクエストにはaxiosを使用します。

## 何を書いたか
この記事では、Firebase Functionsでエラーが発生した際に、自動でJiraにバグのチケットを作成する方法について詳しく説明します。

## なぜ書いたか
エラー発生時に迅速に対応するためには、エラーログを確認し、バグのチケットを作成することが重要です。しかし、手動でこれを行うのは非効率です。そこで、自動化することでエラー対応を迅速かつ効率的に行えるようにこの記事を書きました。

対象読者は、Firebase Functionsを使用しているエンジニアや、エラー処理を自動化したいと考えている方々です。

## 本題
### 必要なもの
- Firebase Functions
- Jiraアカウント
- axiosライブラリ
- TypeScript

### 手順

1. axiosのインストール
HTTPリクエストを送信するためのaxiosライブラリをインストールします。

```sh
npm install axios
```

2. Jira APIトークンの取得
JiraのAPIトークンを取得します。Jiraのアカウント設定からAPIトークンを生成します。

3. 関数の作成
エラーが発生した際にJiraにチケットを作成する関数を作成します。

``` typescript
import axios from 'axios'

const JIRA_API_TOKEN = 'YOUR_JIRA_API_TOKEN'
const JIRA_HOST = 'your-domain.atlassian.net'
const JIRA_ISSUE_TYPE = '10010' // BugのID
const JIRA_PROJECT_KEY = 'YOUR_PROJECT_KEY'
const JIRA_USERNAME = 'your-email@example.com'

const createJiraIssue = async (funcName: string, message: string): Promise<void> => {
  const jiraIssueData = {
    fields: {
      summary: `${funcName}関数でエラーが発生しました`,
      description: {
        version: 1,
        type: 'doc',
        content: [
          {
            type: 'paragraph',
            content: [
              {
                type: 'text',
                text: message
              }
            ]
          }
        ]
      },
      assignee: null,
      issuetype: {
        id: JIRA_ISSUE_TYPE
      },
      project: {
        key: JIRA_PROJECT_KEY
      }
    }
  }

  try {
    await axios.post(`https://${JIRA_HOST}/rest/api/3/issue`, jiraIssueData, {
      auth: {
        username: JIRA_USERNAME,
        password: JIRA_API_TOKEN
      },
      headers: {
        'Content-Type': 'application/json'
      }
    })
    console.log('Jiraチケットを正常に作成しました')
  } catch (err) {
    console.error('Jiraチケットの作成に失敗しました:', JSON.stringify(err))
  }
}

```

## 参考文献
[公式ドキュメント](https://developer.atlassian.com/cloud/jira/platform/rest/v3/api-group-issues/#api-rest-api-3-issue-post)

## 最後に
最後まで読んでいただきありがとうございます。
質問やフィードバックがあれば、ぜひコメントしてください。
【Git】イニシャルコミットを取り消す方法

## 取り消し方法

以下のコマンドを実行すると初回コミットを取り消せます。

```terminal
git update-ref -d HEAD
```

2回目以降のコミットの含めて削除されます。  

すでに`push`済みの場合には`git push -f`する必要があります。  

## 参考

https://git-scm.com/docs/git-update-ref/2.46.0
【R】引用情報を表示する

# はじめに

Rを論文などで使用した場合、引用文献としてRの情報を記載する必要があります。
つい先日にこの引用情報を取得できる関数があると知ったので、備忘録として記事をまとめてみました。

# R本体の引用情報の表示

* `citation`関数を実行するだけで、R本体の引用情報を表示することが可能です。
* 単純なテキスト形式に加えて、引用文献の一覧の整形に使われるBibTeX形式も表示されます。

```r:R本体の引用情報
> citation()

To cite R in publications use:

  R Core Team (2020). R: A language and environment for statistical
  computing. R Foundation for Statistical Computing, Vienna,
  Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2020},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite
it when using it for data analysis. See also ‘citation("pkgname")’
for citing R packages.
```

# パッケージの引用情報の表示

* パッケージの引用情報を表示する方法は、`citation`関数の引数としてパッケージ名を渡すだけです。

```r:パッケージの用情報
> citation("MASS")

To cite the MASS package in publications use:

  Venables, W. N. & Ripley, B. D. (2002) Modern Applied Statistics
  with S. Fourth Edition. Springer, New York. ISBN 0-387-95457-0

A BibTeX entry for LaTeX users is

  @Book{,
    title = {Modern Applied Statistics with S},
    author = {W. N. Venables and B. D. Ripley},
    publisher = {Springer},
    edition = {Fourth},
    address = {New York},
    year = {2002},
    note = {ISBN 0-387-95457-0},
    url = {https://www.stats.ox.ac.uk/pub/MASS4/},
  }
```

# 補足

* 上記の`citation`関数については、Rを起動した際に表示されるメッセージにも書かれていました。
  * 散々Rを使ってきたのに、起動時のメッセージは全く見ていなかったので気が付きませんでした...
  * @WolfMoon さん、ご指摘ありがとうございました。

```text:R起動時のメッセージの一部分
R は多くの貢献者による共同プロジェクトです。 
詳しくは 'contributors()' と入力してください。 
また、R や R のパッケージを出版物で引用する際の形式については 
'citation()' と入力してください。 
```

# 参考URL

* [How to Cite R and R Packages](https://ropensci.org/blog/2021/11/16/how-to-cite-r-and-r-packages/)
書評「AWSではじめる生成AI」

ありがたいことに、「AWSではじめる生成AI」を献本いただきました。

https://www.oreilly.co.jp/books/9784814400720/

> AWSではじめる生成AI
> ―RAGアプリケーション開発から、基盤モデルの微調整、マルチモーダルAI活用までを試して学ぶ
> 
> Chris Fregly、Antje Barth、Shelbee Eigenbrode　著、久富木 隆一　訳、本橋 和貴、久保 隆宏　技術監修

発売日に合わせて書評をと思ったのですが、サラッと読んで理解できる本ではなかったので、読んだところまでで、ご紹介させていただきたいと思います。

## まえがき

まえがきでは、6月開催のAWS Summit Japan 2024に触れられています。原著を単純に翻訳するだけでなく、できるだけ最新の情報を盛り込んでくれています。

原著では、「Pythonや深層学習の基本要素についてはすでに知識があるもの」を想定されていますが、日本語版では概念についての解説が訳注として追加されています。このあたりも嬉しい点だなと思いました。

## １章　生成AIのユースケース、基礎、プロジェクトライフサイクル

生成AIのユースケースから基盤モデルとはなにかといった解説だけでなく、「生成AIプロジェクトのライフサイクル」に触れられているのがポイントです。

生成AIモデルの学習とデプロイ以外にも、様々なステップについて解説されており、また、それぞれのステップが２章以降のどこに関連するかが示されており、読み進める指針にもなります。

章の後半は、AWSが提供するサービスや、なぜAWSなのかといった内容が解説されています。

## ２章　プロンプトエンジニアリングとコンテキスト内学習

この章ではプロンプトエンジニアリング手法について解説しています。プロンプトの記述が英語の原文と日本語訳が併記されており、とても見やすく理解が進みます。

Top P、Top K、Temperatureといった推論パラメーターについても、どういった仕組みで作用して出力結果がかわるのかというところが詳細に解説されており、とても勉強になりました。

## ３章　大規模言語モデル

このあたりから、本書のメインコンテンツです。ヘビーです。その分学びが多いと感じました。（サラッと読んで理解できる人はおそらく事前に色々勉強していた人でしょう。）

トークナイザーや埋め込みの解説に始まり、Transformerアーキテクチャの詳細解説が続きます。その後、Transformerを使った基盤モデルの種類が解説されます。一口に大規模言語モデルと言っても、タスクに合わせたアーキテクチャがあることを、初めて知りました。

## ４章　メモリーと計算リソースの最適化

「大規模」言語モデルなのでたくさんの資源が必要そうですが、この章では、なぜメモリーがたくさん必要なのかの解説から、精度をできるだけ落とさずにメモリー消費量を減らす方法が解説されます。メモリー消費量を減らしたとしても、１つのGPUでは学習ができないため、分散コンピューティングについての解説が続きます。分散の方法も色々あり、性能向上の手法も解説があります。

392個のml.p4d.24xlargeで学習させるという、とても個人では試せそうにない数字にワクワクしました。

## ５章　微調整と評価

この章では、まず指示による微調整（instruction fine-tuning）の解説から、具体的なモデル、データセットの詳細解説があります。データセットの解説ではsamsumというデータセットを用いて具体的な解説があります。ここももちろん英語の原文と日本語訳が併記されており、とてもわかり易い！

解説の後は微調整をSageMakerで行う方法が複数解説されています。微調整したモデルの評価についても解説があり、様々なメトリクス指標について解説されています。

---

ということで、私は５章まで読みました。ここから先がさらにディープになりそうな予感がします。楽しみです。

書籍中では解説がメインで、コードの出番は少ないですが、GitHubでノートブックが大量に公開されていますので、実際に手を動かして、理解を深めることもできると思います。
Teamcenter11の複製について

# 経緯
Teamcenterというプロジェクト管理ソフトのサーバ間移植をしています。
Teamcenterは局所で覇権らしいのですが、これまで見たことも聞いたこともないソフトで、情報を探すのにとても苦労したのでメモを残しておきたいと思います。

# 注意
手元に資料があるわけではないため正確な情報ではありません。参考する程度でお願いします。
移植元のTC_DATAやTC_volumeをそのまま持ってこれる環境で作業をしています。

# 目次
●DBのTC用アカウントについて
●TC_DATA内のtc_profilevar.batについて
●fmsmasterのxmlについて
●移植完了後の起動後の操作
●移植したTeamcenterが起動しない

# OracleのTC用アカウントについて
Teamcenterをインストールする人はDB（私の場合はOracle）にinfodbaユーザを作成すると思います。
きっとほかのアカウントでもいいんでしょうけど、フォーラムなどを見ているとinfodbaが管理者ユーザ？であることはマストみたいな空気を感じるのでそうしたほうがいいと思います。

ちなみに理由がわかる人いたら教えてください。

# ●TC_DATA内のtc_profilevar.batについて
１，ライセンスサーバが変わっていたらlisense_serverを修正する
２，ホスト名が変わるはずなので、新しいホスト名に修正する
３，合わせてDBも変更になる場合は、tnsnames.oraファイル内のDBホスト名も修正する必要がある

# ●fmsmasterのxmlについて
１，multisite構成になっていたTeamcenterからそうでないTeamcenterへの移植の場合は、該当部分を削除する必要がある。
　→関連するサービスはservice.mscで停止しておく
２，volume idは変更しない
３，transitvolume id？（忘れた）は変更しない
４，root（TC_VOLUMEのパス）は基本的に修正しないが、\\（バックスラッシュ2つ）にする
　→設置するTC_VOLUMEはrootと同じフォルダ構成にする
５，enterprise idは修正しない
６，ホスト名の箇所のみを修正する
　→間違っていたら訂正してください

 # ●移植完了後の起動後の操作
 １，service.mscからFSC_teamcenterナンチャカ？みたいなサービスを再起動する
 ２，tcのcmdからinstall -aytを実施する
 　→site is invaildみたいなのが出たらDBとの疎通は問題ないらしい（正確な文言については検索してください）

# ●移植したTeamcenterが起動しない
　１，[The enquiry ID is invalid](https://community.sw.siemens.com/s/question/0D54O00006JMYlISAX/the-enquiry-id-is-invalid)が出た場合
　　DBと通信できているかを確認する
  　　　```install -ayt```
  　　fmsmasterのxmlを確認する
    　　FSCサービスのログを確認する
 　　```%TC_ROOT%/fsc/log/FSC_%HOSTNAME%_infodba....log```

　２，POM has not started
　 　DBのサービスが走っていることを確認すること

　３，[The Shared Metadata Cache cannot be updated...](https://community.sw.siemens.com/s/question/0D54O000061xwWiSAI/teamcenterthe-shared-metadata-cache-cannot-be-updated)
 　　%temp%内のV1000？で始まるフォルダを削除する


# ●まとめ
Teamcenterわけわからな過ぎていやです。対戦ありがとうございました。
Go | errgroup.Group に至るまで

雑めも
- `errgroup.Group` を使っているけど、より原理的に書くとどうなるか整理
- 逆にいうと原理的に書くスタイルから、どうブラッシュアップされていくかみてみる

## `sync.WaitGroup`

- [Playgound](https://goplay.tools/snippet/BkUvjnk4s2S)
- 実行完了の制御として `sync.WaitGroup` を使う

```go
package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup // 実行完了の制御用

	for i := range 5 { // 非同期N回実行
		wg.Add(1) // increment
		go func() {
			defer wg.Done() // decrement
			fmt.Printf("i is %s\n", i)
		}()
	}

	wg.Wait() // wait
}
```

## `sync.WaitGroup` + `chan` を使った最大数制御

- [Playground](https://goplay.tools/snippet/vfwZXn7_La2)
- 自前で実行最大数を制御するためのchan を使う

```diff_go
package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	var wg sync.WaitGroup //実行完了の制御

+	// 最大数の制御
+	const max = 2
+	sem := make(chan bool, max)

	for i := range 5 { // 非同期N回実行
		wg.Add(1)   // increment
		go func() {
+      		sem <- true // channelの長さに空きがないと値を送れなくて、channel に入れられるまでwaitできる.
			defer wg.Done()          // decrement
+			defer func() { <-sem }() // 実行後に値を破棄する
			fmt.Printf("i is %s\n", i)
		}()
	}
	wg.Wait()
}
```

## `sync.WaitGroup` + `semaphore` を使った最大数制御

- [Playgound](https://goplay.tools/snippet/FoV6VXI9yZD)
- 最大数の制御を自前のchanから、抽象化されたsemaphore に差し替え

```diff_go
package main

import (
+	"context"
	"fmt"
	"sync"
	"time"

+	"golang.org/x/sync/semaphore"
)

func main() {
	ctx := context.TODO()
	var wg sync.WaitGroup //実行完了の制御

	// 最大数の制御
	const max = 2
-    sem := make(chan bool, max)
+    sem := semaphore.NewWeighted(max)

	for i := range 5 { // 非同期N回実行
		wg.Add(1) // increment
		go func() {
-           sem <- true // channelの長さに空きがないと値を送れなくて、channel に入れられるまでwaitできる.	
+			if err := sem.Acquire(ctx, 1); err != nil { // 1つ分の領域確保
+				fmt.Println("something wrong with sem.Acquire")
+				return
+			}
			defer wg.Done()      // decrement
-           defer func() { <-sem }() // 実行後に値を破棄する	
+			defer sem.Release(1) // １つ分の領域解放
			fmt.Printf("i is %s\n", i)
		}()
	}
	wg.Wait()
}
```


## `errgroup.Group`

- [Playground](https://goplay.tools/snippet/kblGtccfsAi)
- 実行完了の制御、最大数の制御、エラーハンドリングをまとめて `errgroup.Group` にて行う

```diff_go
package main

import (
	"context"
	"fmt"

	"golang.org/x/sync/errgroup"
)

func main() {
	ctx := context.TODO()

	eg, _ := errgroup.WithContext(ctx)
	eg.SetLimit(2) // 最大数の制御

	for i := range 5 { // 非同期N回実行
		eg.Go(func() error {
			fmt.Printf("i is %s\n", i)
			return nil
		})
	}
	if err := eg.Wait(); err != nil {
		panic(err)
	}
}


```
【超簡単】ER図をDBeaverで自動生成する手順を解説！

ER図を手動でチマチマ作成するのは人間のやることではないと思っている泉（[@izumin_0401](https://twitter.com/izumin_0401)）です。

# ブログ記事はこちら

https://traveler0401.com/dbeaver-er/

# ER図の作成ってめんどいよね？
ER図の作成ってめんどくさいですよね。

手動で作成すると必ず漏れが発生するし、そもそもあまり見ることもない...

じゃあ必要ないかって言うと、地味に確認したい時がある...

# データベース管理ツールを使おう
僕は普段Laravelを触っているので、Laravelで自動生成できるツールでも作ろうかなと思っていたんですが、そんなことしなくてもデータベース管理ツールを使えばいいわけです。

ということで、ER図をパパッと自動作成できるDBeaverを使ってみました。

:::note info
A5も使ってみましたが、テーブル（エンティティ）が被ったりして見にくかったのでDBeaverの方が良さそうです。
:::

# ER図をDBeaverで自動生成する手順
## 1. DBに接続し、ER図を開く
![er-dbeaver-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/d937f338-6293-122c-859e-50addfb69976.png)
データベース（もしくはスキーマ）を選択し、ER図を選択します。

:::note info
この時点でER図の全体像を確認できます。スギョイ。
:::

## 2. 保存
![er-dbeaver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565129/4be1a7ff-2bb9-13e3-335d-49c2ca6d1e4b.png)
右クリックして「Save diagram as ...」をクリックすればpng形式で保存できます。

# まとめ
今までチマチマ作成していた時間を返してくれ。

というか、ER図うんぬんの前にA5よりもDBeaverの方が使いやすい。

チッキショーーーーーーー！！！

# 最後に
暇つぶしに[Twitter](https://twitter.com/izumin_0401)と[ブログ](https://traveler0401.com/)もやってるので見てね。
Kubutu 24.04　日本語入力


fcitx5のインストール
'''
sudo apt install fcitx5 fcitx-mozc
reboot
'''


管理画面で設定

入力メソッドにMozcを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595849/c96df079-8c28-58bf-bf3d-367716a87a7b.png)
NeoPixel制御ボードのサンプルプログラム④

- ## 商品概要
RP2040マイコンを使って、NeoPixelを制御して楽しもうというコンセプトです。
右のコネクタは、電池をつないでパソコンから離れても動くようにしています。
左のジャックから音声信号を入力してADコンバータに入力可能です。
ボタンが1つ　or　2つ搭載しているので、外部入力または切り替えなどで使えます。

- ## プログラム環境
ArduinoIDE バージョン：2.3.2
Adafruit NeoPixel Library 1.12.2（2024.8.1時点の最新版は1.12.3）

- ## ハードウェアの主な仕様
　①マイコン:PR2040-ZERO（RaspberryPiPico系）
　②NeoPixel接続ピン　 GPI08（R1でショート）
　③プッシュスイッチ１：GPI07
　④プッシュスイッチ２：GPI06（2個搭載しているボードのみ）
　⑤音声入力：GP26

- ## メインプログラム（ArduinoIDEのスケッチ）

カラーで徐々に色を変えてLEDを光らせるプログラムです。
カラーLEDでぱっと見映えるプログラムです。
動作チェックにも良いですね。

```c++
// カラーで徐々に色を変えてLEDを光らせるサンプルプログラム

#include <Adafruit_NeoPixel.h>  // NeoPixel制御用ライブラリのインクルード

// 定数の定義
#define LED_PIN      8          // NeoPixelの信号接続端子
#define LED_COUNT_X  6          // ドットマトリックスの横のLED数
#define LED_COUNT_Y  6          // ドットマトリックスの縦のLED数
#define BRIGHTNESS   24         // 明るさを24に設定

// NeoPixelオブジェクトの作成
Adafruit_NeoPixel strip(LED_COUNT_X * LED_COUNT_Y, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();                // NeoPixelの初期化
  strip.setBrightness(BRIGHTNESS); // 明るさを24に設定
  strip.show();                 // 全てのピクセルをオフに初期化
}

void loop() {
  // レインボーサイクルを全体に表示
  rainbowCycle(15);             // レインボーサイクルを表示する関数を呼び出し
}

// レインボーサイクルを表示する関数
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  // すべての色を5サイクル表示
  for(j = 0; j < 256 * 5; j++) {
    for(i = 0; i < strip.numPixels(); i++) {
      // 各ピクセルに色を設定
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();               // LEDマトリックスを更新
    delay(wait);                // 指定した時間待機
  }
}

// Wheel関数: 色相を取得
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); // 赤から緑へのグラデーション
  } else if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); // 緑から青へのグラデーション
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); // 青から赤へのグラデーション
  }
}

```

- ## このプログラムを作成した時の考え方。
カラーLEDを光らせて一番見栄えがする光らせ方をさせたい！と思って光らせてみました。

- ## 実行結果
スマホの動画だとスミアが出まくって見づらいですね。
実際のLEDはかなりきれいなんですけどね。

![VID20240801_cnv2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/01081351-5c42-6fe4-44e6-e1258219bc7e.gif)
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（82/100）

【82日目】
トピック 8：SAPS/4HANAの製造指図（14/15）

≪問題82≫
製造指図に対して能力利用可能確認を使用します。このために必要な設定はどれですか。
（２つ選択）
□有限日程計画関連区分を設定する。
□確認管理で全体プロファイルを割り当てる。
□確認範囲を作業区に割り当てる。
□チェックの範囲をカスタマイジングで定義する。

≪解答≫
■有限日程計画関連区分を設定する。
■確認管理で全体プロファイルを割り当てる。
□確認範囲を作業区に割り当てる。
□チェックの範囲をカスタマイジングで定義する。

≪解説≫
◆能力利用可能確認を使用することで、製造指図の活動に必要な能力所要量を決定することができます。能力所要量は、作業区で提供される能力について、他の指図の所要量に照らして確認されます。
◆このためには、以下の設定が必要です。
（1）作業区に有限日程計画関連区分が設定されている必要があります。
（2）カスタマイジングの確認管理で、全体プロファイルを割り当てる必要があります。
論文よみよみ : Self-Distillation

今回は、[Self-Distillation: Towards Efficient and Compact Neural Networks](https://ieeexplore.ieee.org/document/9381661) という論文を読んでみた。機械学習の1つであるニューラルネットワークについて、精度を向上させる新たなモデルである。

# Self-Distillationとは？
"Distillation"とは、日本語で"蒸留"を意味する。
今回のこの"Self-Distillation"は、日本語にすると"自己蒸留"となる。
今回のSelf-Distillationは、既にあるアプローチであるKnowledge Distillationを基にしたものとなっている。まずはこれについて触れていこうと思う。

# Knowledge Distillationとは？
"Knowledge Distillation"とは、日本語で"知識蒸留"を意味する。これは、まずパラメータが過剰になってしまったニューラルネットワークを教師とする。次に、この教師モデルの出力を模倣する小さな生徒モデルを訓練する。これにより、生徒モデルは教師の知識を継承しているため、パラメータが過剰となった教師モデルを置き換えていると言え、モデルの圧縮と高速な推論が可能になるというものである。

しかし、従来の知識蒸留は以下の2点が問題とされてきた。

1. **教師モデルの選択**
    生徒モデルの精度は、教師モデルに大きく依存していることが分かってきた。しかも、最も高精度なモデルが必ずしも知識蒸留の教師モデルにふさわしいというわけではないことも明らかになった。そのため、適切な教師モデルを探索するためにかなりの試行が必要となり、非常に時間がかかることが問題となっていた。
1. **知識伝達の効率**
    生徒モデルが教師モデルほどの精度を達成できるとは限らず、知識蒸留によって許容できないほど大幅に精度が下がる可能性もあることが分かった。知識蒸留によって、正確・効率的・コンパクトな生徒モデルを得ることは難しいとされる。

これらを解決した新しい知識蒸留法が、"Self-Distillation(自己蒸留)"である。

# Self-Distillationの仕組み
Self-Distillation(自己蒸留)は、ニューラルネットワークの中間層の後に、深さが異なるAttentionベースの分類器を複数取り付けることで実現する。それぞれの分類器について、より深い分類器を教師モデルとし、生徒モデルを学習するために利用する。推論するときは、浅い分類器を無視して推論を行うためパラメータや計算の追加はない。
また、従来の知識蒸留とは異なり、教師モデルも生徒モデルも同じニューラルネットワークの分類器であるため、教師モデルの探索が必要なくなる。加えて、従来の知識蒸留は教師モデルの学習と生徒モデルの学習の2段階の学習が必要であったが、この自己蒸留は1段階で教師モデルと生徒モデルを同時に訓練することができる。

![Self-Distillation](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849476/62391b87-9887-4190-e35c-8f0cce55f8fe.png)
(自己蒸留を用いたResNet18のアーキテクチャ)

# Self-Distillationのメリット

1. **高精度**
    モデルに自己蒸留を導入することで、精度を向上することができる。CIFAR100というデータセットを用いた時は平均で3.47%、ImageNetというデータセットを用いたときは平均で2.84%の精度向上が実現した。

    ![ImageNet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3849476/e6148001-769b-4ddd-7c79-acc90030ef4b.png)
(ImageNetを用いた推論と正答率 オレンジ色が自己蒸留を用いたもの)

1. **高速化**
    自己蒸留を用いることで最終的なパラメータ数を減らすことができるため、演算量を減らすことができ結果として高速化が実現できる。

1. **圧縮**
    自己蒸留で最終的に学習される分類器は、元の教師モデルより浅いネットワークとなっているため、パラメータを削減し圧縮したモデルとすることができる。

# 結論
Self-Distillation(自己蒸留)によって、モデルの精度向上・高速化・圧縮を同時に実現することができる。自己蒸留によって浅い分類器の精度を向上することができたため、他の推論法を大きく上回る学習ができると期待される。
初心者でも使いやすいUIコンポーネントライブラリ「CSS Materials」の紹介

[![](https://storage.googleapis.com/zenn-user-upload/feadc9be6542-20240801.png)](https://css-materials.vercel.app)

## はじめに
はじめまして。フロントエンドの開発を初めて約半年の[hono](https://x.com/m_hono_104)です。
元々、私は様々なUIコンポーネントライブラリ（例えばshadcn/uiやAnt Designなど）を使うのが好きで、自分好みのコンポーネントを作ってみたいという考えを持っていました。
今回、そんな私がReactのUIコンポーネントライブラリをリリースしたので、基本的な使い方と使うメリットなどについて紹介していきたいと思います。

## CSS Materialsとは
CSS Materialsは、「初心者でも使いやすくカスタマイズ性が高い」をテーマにしたUIコンポーネントを提供するライブラリです。現在使われている主流のUIコンポーネントライブラリはカスタマイズ性が高い分、初心者にはハードルが高く感じられるかもしれません。CSS Materialsでは、あえて基本的なカスタマイズとUIコンポーネントのみを提供し、初心者にも使いやすく、自ら進んでカスタマイズできるようなライブラリにしました。

## 使い方
では実際にCSS Materialsを使う方法を解説していきます。

### 初期設定
CSS Materialsの初期設定は非常に簡単です。以下のコマンドをで実行するだけで完了します。
（今後themeを追加したいと考えております。）
```
npm install css-materials
```
### 基本的な使い方
コンポーネントをインポートし、プロジェクトで使用することができます。
```tsx
// コンポーネントをインポートする
import { Button } from "css-materials"

export default function Home() {
 return (
  <div>
   {/* コンポーネントを使用する */}
   <Button colorScheme="blue" onClick={() => alert('Button Clicked!')}>Button</blue>
  </div>
 )
}
```
### スタイリング
きっと、CSS Materialsのコンポーネントをインポートして使用した際、見た目が何も変わらないことに違和感を抱くでしょう。しかし、このCSSファイルをインポートすれば、見た目が一瞬でCSS Materialsのスタイルに変わります。
```tsx
import 'css-materials/dist/styles.css';
```

## コミュニティと貢献
CSS Materialsはコミュニティの力で成り立っています。新しいコンポーネントの提案やバグ報告は大歓迎です。
- 新しいコンポーネントの提案: 新しいアイデアや改善点を提案するために、[Issueを提出](https://github.com/hn-104/css-materials/issues/new)してください。
- バグ報告: バグを見つけた場合は、[Issueを提出](https://github.com/hn-104/css-materials/issues/new)して報告してください。

## まとめ
CSS Materialsは、「初心者でも使いやすくカスタマイズ性が高い」をテーマにした"使いやすさ"を重視したUIコンポーネントライブラリです。これを機に、あなたも「CSS Materials」を使ってみませんか？
- 公式サイト: [CSS Materials 公式サイト](https://css-materials.vercel.app)
- ドキュメント: [CSS Materials ドキュメント](https://css-materials.vercel.app/docs/getting-started)
- GitHub リポジトリ: [CSS Materials GitHub](https://github.com/hn-104/css-materials)
Unity Chinemachine Collider（カメラの衝突判定）の追加方法

## UnityでChinemachine Colliderの追加方法が変わっていた

カメラが障害物を避けるようにしたいのでChinemachine Colliderを追加したかった
色んなサイトにAdd Componentから追加するとあったけど、見当たらない・・

バーチャルカメラのAdd Extensionにありました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/ad1f9ffc-fe53-d3e2-a0cc-e8da74e65215.png)

<br>
以上！
wsl2向けarchlinuxインストール

## はじめに
wslが入っていない状態からarchlinuxのwslをインストール、初期設定するまでに必要な最低限のコマンドをまとめました。

## インストール
管理者権限でPowershellを起動し、wsl2をインストールします。
```
wsl --install
```
PCを再起動し、スタートメニューからubuntuを開きます。

archのbootstrapをwgetします。定期的に更新されるので、適宜[arch](https://mirrors.edge.kernel.org/archlinux/iso/latest/)で最新バージョンのファイル名を確認します。
```
wget https://mirrors.edge.kernel.org/archlinux/iso/latest/archlinux-bootstrap-2024.07.01-x86_64.tar.zst
```
展開し、ミラーリストを編集(Japan付近をコメントアウト)してから`root.x86_64`内のファイルを圧縮し、わかりやすいところに移動します。
```
apt install zstd
tar -Izstd -xvf archlinux-bootstrap-2024.07.01-x86_64.tar.zst
cd root.x86_64/
vim etc/pacman.d/mirrorlist
tar -Izstd -cvf root.tar.zst *
mv root.tar.zst /mnt/c/Users/Utyujin/root.tar.zst
```
再び管理者権限でPowershellを起動し、インポートします。この例では、`$User\Documents\wsl`下にディスクファイルがおかれます。
```
wsl --import Archlinux C:\Users\Utyujin\Documents\wsl C:\Users\Utyujin\root.tar.zst
```
これでArchlinuxが利用できるようになりました。お疲れ様でした。

## 設定
PowershellにてArchlinuxをデタッチします。
```
wsl -d Archlinux
```
起動するので、初期設定を行っていきます。
```
pacman-key --init
pacman-key --populate archlinux
useradd -m -g wheel -G users username
passwd
passwd username
sudo pacman -S vi sudo vim
visudo
```
このままだとデフォルトで起動時に`root`ユーザとなってしまうため、`/etc/wsl.conf`に設定を追加します。
```
vim /etc/wsl.conf
[user]
default=username
```
`wsl`を再起動すると、一般ユーザでログインできます。
```
wsl -t Archlinux
wsl -d Archlinux
```
## Ubuntuの削除
Archを入れたらもうUbuntuはいりませんよね？削除しましょう。
まず、Powershellにて、登録を解除します。
```
wsl --shutdown
wsl --unregister ubuntu
```
その後、設定アプリからアンインストールを選択することで、完全に削除できます。
## 参考文献
- [WSL2 のインストールとアンインストール](https://qiita.com/zakoken/items/61141df6aeae9e3f8e36#3-wsl2-%E3%81%AE%E3%82%A2%E3%83%B3%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95)
- [Arch on WSL 2](https://github.com/badgumby/arch-wsl?tab=readme-ov-file)
- [サクッとUbuntu (WSL)でzstd(ZStandard)を使う方法](https://qiita.com/tatsubey/items/7ec828d72659aeae8c34)
- [WSL で デフォルトユーザ を変更する方法](https://devlights.hatenablog.com/entry/2021/05/29/070000)
- [Arch on WSLを構築する](https://zenn.dev/kyoh86/articles/4bf6513aabe517)
NeoPixel制御ボードのサンプルプログラム③

- ## 商品概要
RP2040マイコンを使って、NeoPixelを制御して楽しもうというコンセプトです。
右のコネクタは、電池をつないでパソコンから離れても動くようにしています。
左のジャックから音声信号を入力してADコンバータに入力可能です。
ボタンが1つ　or　2つ搭載しているので、外部入力または切り替えなどで使えます。

- ## プログラム環境
ArduinoIDE バージョン：2.3.2
Adafruit NeoPixel Library 1.12.2（2024.8.1時点の最新版は1.12.3）

- ## ハードウェアの主な仕様
　①マイコン:PR2040-ZERO（RaspberryPiPico系）
　②NeoPixel接続ピン　 GPI08（R1でショート）
　③プッシュスイッチ１：GPI07
　④プッシュスイッチ２：GPI06（2個搭載しているボードのみ）
　⑤音声入力：GP26

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/368170b1-bb30-f546-cbf7-a7c1bcc26bcd.png)

- ## メインプログラム（ArduinoIDEのスケッチ）

ランダムにLEDを徐々に明るくして、暗くなるプログラムです。
どちらかというと見て癒されるガジェット的なプログラムです。

```c++
//ランダムでLEDを光らせるサンプルプログラム

#include <Adafruit_NeoPixel.h>

#define LED_PIN 8
#define NUM_LEDS 36
#define NUM_FLASHING_LEDS 24
#define BRIGHTNESS 16 // LEDの明るさを設定 (0～255)

// NeoPixelの設定
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.setBrightness(BRIGHTNESS); // 明るさを設定
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // ランダムに選択されたLEDのインデックスを生成
  int flashingIndices[NUM_FLASHING_LEDS];
  for (int i = 0; i < NUM_FLASHING_LEDS; i++) {
    flashingIndices[i] = random(NUM_LEDS);
  }

  // LEDをゆっくりと明るくする
  for (int brightness = 0; brightness <= 128; brightness++) {
    for (int i = 0; i < NUM_FLASHING_LEDS; i++) {
      strip.setPixelColor(flashingIndices[i], strip.Color(0, brightness, brightness));
      //strip.setPixelColor(flashingIndices[i], strip.Color(0, 0, brightness));
    }
    strip.show();
    delay(10); // 明るさの変化速度を調整するための遅延
  }

  delay(500); // 最大の明るさに達した後の待機時間

  // LEDをゆっくりと暗くする
  for (int brightness = 128; brightness >= 0; brightness--) {
    for (int i = 0; i < NUM_FLASHING_LEDS; i++) {
      strip.setPixelColor(flashingIndices[i], strip.Color(0, brightness, brightness));
    }
    strip.show();
    delay(10); // 明るさの変化速度を調整するための遅延
  }

  delay(500); // 最小の明るさに達した後の待機時間
}

```

- ## このプログラムを作成した時の考え方。

LEDをほわんほわんと光らせてみたいなと思ってプログラミングしてみました。
思ったより見ていて癒される感じかと思います。

折角のカラーLEDなので、色を変えられると気分も変わって良いかもしれませんね。

- ## 実行結果

水色でほわんほわんと光っている感じです。
gifに変換してアップをやってみましたが調整は慣れが必要そうですね。

![Vid20240801_cnv.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782127/c20bd1e4-8199-1246-ce1f-b34a0866dc1c.gif)
【セッションレポート】「"menu"のデータ基盤戦略 ~TiDBとGoogle Cloud~」に参加しました

# はじめに
本記事はGoogle Cloud Next 2024 Day1(2024/8/1)において menu の 窪田氏 が講演された「"menu"のデータ基盤戦略 ~TiDBとGoogle Cloud~」のレポートです(レポートではデータベース選定にフォーカスしてます)。

# 公式セッション紹介
> フードデリバリーサービス「menu」はモノリスなアーキテクチャーで構成されていましたが、現在はマイクロサービス化がすすめられており、このマイクロサービス化に合わせてデータ基盤全体の見直しも行っています。活用するDBの選択は、成長するサービスにおける学習コストと先々想定される運用負荷の観点で大きな悩みどころでした。本セッションでは、menuがマイクロサービスの中でDBをどのように使い分けているか、データ基盤周りの選択や活用方法について、その中でTiDBをどのように使っているのかなどをご紹介します。

# 発表資料
- 現時点では未公開

# 概要／おすすめポイント
menuでは Cloud SQL for MySQLを利用しているが、システム全体としてモノリシックなアーキテクチャでリリースや追加開発の辛さを感じており、TiDBを採用して移行を行っているとのことでした。
具体的に Cloud SQLでの課題感と何故TiDBを採用するに至ったのかが述べられていたため、同じような課題を抱えている方の参考になるかと思いました。

# セッション内容の紹介

前提としては、Cloud SQL for MySQL Enterprise を利用しており、HA構成＆ほぼ上限値のCPU・メモリ設定で利用していました。([Cloud SQLの上限](https://cloud.google.com/sql/docs/mysql/editions-intro?hl=ja#edition-features)は 96vCPU、624 GBになります)

現状の課題として以下三点を挙げられていました。
1. レプリケーション遅延
    - 商品情報更新の際の大量の insert, update, delete が実行され、レプリカラグが発生する (リードが多くリードレプリカを多用しているため遅延の影響が大きい)
1. メンテナンス時の課題
    - 数十秒のメンテ時間が発生する(Enterprise Plusでは1秒未満になったので解決されるかも？)
1. ピークへの対応
    - プロモーション時の負荷対策、お昼時や夕飯時のピーク負荷対策、商品情報更新時の負荷対策、などが実施し辛い

それぞれ、TiDBで以下のように解決されるとのことでした。
1. レプリケーション遅延
    - writeのスケールが可能となるため、大量のwriteへの対応が可能
1. メンテナンス時の課題
    - フルマネージド・無停止(ただし接続は瞬断)
1. ピークへの対応
    - スケールアウトが可能(ただし現在はそこまでの性能は不要で最低構成)

また、若干レイテンシは増加するものの、menuさんの要件にはほぼ影響がなく、またこちらもmenuさんのシステムではMySQLからTiDBへの切替による非互換もほぼ発生せずそのまま利用できた、という話でした。

#### Spannerとの比較

Google CloudのSpannerと比較した結果、以下の理由によりTiDBを利用することになったとのことでした。とはいえ、Google Cloudのサービスとしては洗練されていると評価されてはいました。
- Spannerの学習コストが高い
- MySQL互換ではない(ORMが対応していない)

#### Cloud SQL Enterprise Plusとの比較

元々検討時においては、Cloud SQL Enterprise Plusが発表されていなかったため、今回改めて比較されたとのことです。
- 既にCloud SQLの限界近くになっているため、Plusを採用しても上限が見えている
- 負荷の波への対応やwriteのスケールはできない

# まとめ

現時点ではCloud SQLとTiDBを併用することで、新しいサービス開発時に選択肢を持たせることができている、特に開発者側からはどちらもMySQLとして利用することができるため、純粋なアプリ要件で決めることができるのことが良いところとの話でした。

先日のDB Tech ShowcaseでもTiDBのセッションでは利用者側の学習コストが不要で、かつフルマネージドで利用負荷が小さいという事をいろいろなセッションで聞きましたが、同じところがやはり効いてくるのだな、と感じました。
その他にもTTLやTiUPなどの小ネタがありましたので、興味ある方は資料公開されたら見てみるかTiDBのドキュメントを参照ください。
Azure OpenAI Whisper API を Python から2通りの方法で叩く

## はじめに

どうしてこんなチュートリアルみたい記事を...!?
↓ 公式の curl コマンドが動かないから...!!

https://learn.microsoft.com/ja-jp/azure/ai-services/openai/whisper-quickstart?tabs=bash%2Cpython-new&pivots=rest-api#rest-api

## 事前準備

.env に以下のようなファイルを作ってください

```
AZURE_OPENAI_ENDPOINT="https://*****.openai.azure.com/"
AZURE_OPENAI_API_KEY="*****"
```

## requests を使う方法

```py
import requests
import os
from dotenv import load_dotenv

load_dotenv()

deployment_id = os.getenv("AZURE_DEPLOYMENT_ID", "whisper")

url = os.getenv("AZURE_OPENAI_ENDPOINT") + f"/openai/deployments/{deployment_id}/audio/transcriptions?api-version=2023-09-01-preview"

FILE="*****.mp3"
with open(FILE, 'rb') as f:
    file = {'file': (FILE, f)}
    response = requests.post(
      url, 
      headers={
        "api-key": os.getenv("AZURE_OPENAI_API_KEY"),
      }, 
      files=file
    )

print(response.json())
```

## openai を使う方法

```py
import openai
import os
from dotenv import load_dotenv

load_dotenv()

deployment_id = os.getenv("AZURE_DEPLOYMENT_ID", "whisper")

client = openai.AzureOpenAI(
    azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
    api_key=os.getenv("AZURE_OPENAI_API_KEY"),
    api_version=os.getenv("OPENAI_API_VERSION", "2023-09-01-preview")
)

FILE="*****.m4a"
with open(FILE, "rb") as audio_file:
    transcript = client.audio.transcriptions.create(
        model=deployment_id,
        file=audio_file
    )
    print(transcript)
```
Text File Archiving with Bash

gitリポジトリからテキストファイルだけを抜き出して単一のテキストとして出力するbashスクリプトです。

[stat](https://atmarkit.itmedia.co.jp/ait/articles/1706/29/news027.html) ではなく [gstat](https://www.gnu.org/software/coreutils/manual/html_node/stat-invocation.html) を使っているところに注意してください。
```archive_and_process.bash
#!/bin/bash

current_dir=$PWD

# 一時ディレクトリの作成
temp_dir=$(mktemp -d)

# リポジトリ名の取得
repo_name=$(basename `git rev-parse --show-toplevel`)

# 現在のリポジトリをtar形式でアーカイブ
git archive -o "$temp_dir/repo_archive.tar" HEAD

# アーカイブを展開
mkdir -p "$temp_dir/$repo_name"
tar -xf "$temp_dir/repo_archive.tar" -C "$temp_dir/$repo_name"

# 展開したディレクトリに移動
cd "$temp_dir/$repo_name"

# バイナリファイルかどうかを判定する関数
is_binary_file() {
  local file="$1"
  local file_output
  file_output=$(file "$file")

  if [[ "$file_output" == *"text"* ]]; then
    return 1  # テキストファイルの場合
  else
    return 0  # バイナリファイルの場合
  fi
}

# フォルダ名の取得
folder_name=$(basename "$PWD")

# 出力ファイル名を設定
output_file="${folder_name}.txt"

# 出力ファイルを新規作成または上書き
> "$output_file"

# find コマンドの出力を取得し、ファイルに保存
echo "## Find Output" | tee -a "$output_file"
find . -type f -exec ls -lh {} \; | tee -a "$output_file"

# ソースコードセクションの開始
echo "## Source Code" | tee -a "$output_file"

# find コマンドを使用してすべてのファイルを取得
find_output=$(find . -type f)

while IFS= read -r line; do
  if [[ $line != "./$output_file" ]] && ! is_binary_file "$line"; then
    file_size=$(gstat -c%s "$line")
    if (( file_size <= 10240 )); then
      {
        echo "\`\`\`file:$line"
        cat "$line"
        echo "\`\`\`"
        echo
      } | tee -a "$output_file"
      echo "Processed: $line"
    else
      echo "Ignored (file too large): $line"
    fi
  else
    [[ $line == "./$output_file" ]] && echo "Ignored (output file): $line" || echo "Ignored (binary file): $line"
  fi
done <<< "$find_output"

# 出力ファイルサイズのセクション
output_file_size=$(gstat -c%s "$output_file")
echo "## Output File Size" | tee -a "$output_file"
echo "Output file size: $output_file_size bytes" | tee -a "$output_file"

# 標準出力への出力ではなくファイルを生成したい場合はこの行を使ってください。
# mv $output_file $current_dir

# 一時ディレクトリの削除
rm -rf "$temp_dir"
```

元ネタは [ChatGPTにgitのリポジトリ渡すと全ソースコード.txtをダウンロードさせてくれるやつ〜〜〜〜（AIに食わせるコード一覧が欲しい時用）](https://zenn.dev/kazuph/articles/10ce8f068f449d) です。 `git archive` してるとこを除けばほとんどそのまままです。kazuphさんありがとうございます。

[「ほぼ手動でやるなら.sh実行もローカルでやって、.txtだけAIに食わせれば良いだけのような……。」](https://b.hatena.ne.jp/entry/4754926148419262304/comment/asiamoth)というブックマークコメントを見て「もっともだ」と思ったので作りました。

あと `archive_and_process.bash` という名前はChatGPT-4oに考えさせたんですけど、いかにもダサいので良い名前があったらご教示ください:bow_tone1:
AccessのVBAでフォームにpublic関数を作るのはフォームの二重起動を招く恐れがあるので避けたほうが良い

# フォームの二重起動が起きてしまう例

下記のようなフォーム達。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8a56f074-de48-4013-22b7-7315ea0454bc.png)

f_1にはpublic関数があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/98a27e9d-f805-15cd-a8c4-810fa7bc7506.png)

f_2はこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ba481d0a-0f52-21a2-27f8-6f28eab4a260.png)

**f_2だけが表示された状態から** スタートします。
f_2の ```コマンド0_Click()``` を実行。
そのあと ```コマンド2_Click()``` を実行すると下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/8b8719d4-2179-ba77-59e1-b6488e7e1b99.png)

開いているフォームは **2つだけのように見えます** 。

ですがイミディエイトウィンドウで ```?Forms.Count``` すると2ではなく **3** ！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/2fdedfe5-3395-bedf-2024-dd4310dfa5ce.png)

3の内訳を確認してみると下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/37bb3976-4ac5-ac5b-0031-9d01bc1811cd.png)

f_2内でf_1のpublic関数を実行した段階で、 **f_1が非表示状態でこっそり開かれていた** のでした。

# やっかいなバグの温床になる可能性あり

フォームの二重起動は『予期しない二重処理』や『フォーム内のプライベート変数の予期しない上書き』の原因になったりします。

これのやっかいなところは **二重起動しているうちの片方は非表示状態** ということです。
目に見えていないため「二重起動が原因かな？」という発想になりにくいです。
なので、発覚しにくいバグになったり、バグの原因を特定するのが困難になります。

# 参考サイトさん

https://okwave.jp/qa/q7888223/a21881119.html

# バージョン

Microsoft Windows [Version 10.0.22631.3958]
Microsoft Access for Microsoft 365 MSO (バージョン 2406 ビルド 16.0.17726.20078) 32 ビット