OmniAICreator/Qiita-1.07M huggingface dataset:
【PHP備忘録】 WordPress関数：”Undefined function”エラー対処法

## 最初に
私はWordPressを使って既存の静的サイトを動的サイトに改修する学習をしていました。
その過程で遭遇したエラーについて、対処法を備忘録として残したいと思います。

## ツール・言語
ツール：VSCode（拡張機能”intelephense”）
環境：Local
言語：PHP

## 事象
WordPress標準関数`wp_head()` を入力後、以下のエラーが表示されました。
※`wp_head()` ⇒HTMLのheaderを部品化する関数

▼エラー
```
Undefined function 'wp_head'.intelephense(P1010)
```

▼意味

`wp_head()` は未定義の関数

## 調べた結果
**”PHP拡張機能”intelephense”はWordPressオリジナル関数をサポートしていない。”**
”intelephense”はコード補完やエラーチェックなどをしてくれるPHP拡張機能。
”intelephense”の初期設定では、WordPress関数をサポートしていないとの事。それが原因でエラーチェックに引っ掛かり、”`wp_head()` は未定義の関数ですよ”とエラーが発生していました。

## 対処法
**”intelephenseがWordPress関連の機能やライブラリをサポートできるように設定する”**

▼手順
１．intelephense拡張機能を開く
VSCode左の拡張機能アイコンを押下

![拡張機能ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/05c1b59c-afb9-19da-8937-9fe5b951644b.png)

２．拡張機能の検索
左側の拡張機能検索フォームに”Intelephense”と入力して、表示されたIntelephenseの設定を開く

![拡張機能検索フォーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/49292ed5-29d2-19b1-8b54-595a94d8d9f3.png)

![Intelephense設定ボタン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/ff7e42be-9596-b1ce-d834-ddb06df6c972.png)

３．設定項目を検索
設定画面検索フォームで”Environment:Include Paths”と入力して検索
”項目の追加”ボタン押下

![項目の追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/a77a733a-82ab-6523-7835-fb6f4d7781cf.png)

４．設定の追加
”項目の追加”ボタンを押下して、ワードプレスの関数が格納されているフォルダパスを入力。問題なければ”OK”ボタン押下
※”wp-includes”フォルダに関数が格納されている

筆者の場合、ローカル環境で”Local ”を使って作業していたので以下のようなパスになりました。
C:\Users\○○○○\Local Sites\作業中フォルダ\app\public\wp-includes

![パス入力フォーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148670/5f6ee922-dab8-0b54-4465-df3dc185ee3d.png)

５．完了
パスを追加後、エラーが消えていれば成功です。

## 最後に
今回のエラーは、拡張機能”Intelephense”がWordPress関数をサポートしていないために起きたエラーになります。
`wp_head()` 関数で発生しましたが、他のWordPress関数を使っても発生します。
ですが、実際の所は”Intelephense”がエラーを出しているだけで、プログラムに影響はありません。そのまま使おうと思えば使えます。筆者も最初は無視して書いていましたが、最終的に10件以上のエラーが表示されてとても見ずらい状況になっていました。
これは良くないですね。
関係ないエラーが表示されていると、本来気づかないといけないエラーに気づけないこともあると思いますのでしっかり直しましょう。
”Intelephense”を使って快適にコードを書きたい方は是非こちらの記事を参考にしてみてください。
nginx+php-fpmのパフォーマンスチューニング格闘記

## 環境
- ubuntu 22
- nginx
- php-fpm 8.3
- さくらのVPS 1G スワップは2G

## 事象発生
＞　nginxが504エラー投げてます！
＞　なにーっ

## とりあえず復旧
nginx のエラーログをみてみる
```bash:Ubuntu
tail -n 10 /var/log/nginx/error.log
```
```/var/log/nginx/error.log
2024/07/12 14:48:46 [error] 2900603#2900603: *8358 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 122.210.79.154, server: hoge.jp, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.3-fpm.sock", host: "hoge.jp"
```

php-fpmがまた落ちてるなー

とりあえず再起動で復活するからなおしちゃお

```bash:Ubuntu
systemctl restart php8.3-fpm
systemctl restart nginx
```

## 原因調査
php-fpmのエラーログってどこにあるんだっけな
```bash:Ubuntu
vi /etc/php/8.3/fpm/php-fpm.conf
```
```/etc/php/8.3/fpm/php-fpm.conf
error_log = /var/log/php8.3-fpm.log
```
あったあった

のぞいてみる

```bash:Ubuntu
tail -n 100 /var/log/php8.3-fpm.log
```
```/var/log/php8.3-fpm.log
[08-Jul-2024 11:12:00] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
[10-Jul-2024 13:16:08] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
[11-Jul-2024 09:08:50] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
[12-Jul-2024 15:03:46] NOTICE: Terminating ...
[12-Jul-2024 15:03:46] NOTICE: exiting, bye-bye!
[12-Jul-2024 15:03:46] NOTICE: fpm is running, pid 3170323
[12-Jul-2024 15:03:46] NOTICE: ready to handle connections
[12-Jul-2024 15:03:46] NOTICE: systemd monitor interval set to 10000ms
```

`server reached pm.max_children setting (5), consider raising it`

これかなあ。

とりあえず和訳してみる

> サーバーが pm.max_children 設定 (5) に達したため、値を上げることを検討してください

わかったようなわからないような

## 恒久対策

php-fpmが確保している平均メモリ量を調べる

```bash:Ubuntu
ps -ylC php-fpm8.3 --sort:rss
# 出力結果
# RSSがメモリ使用率でKBで表示されているらしい
# 36156は36156KB
S   UID     PID    PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S     0 3536299       1  0  80   0 36156 66629 -      ?        00:00:00 php-fpm8.3
S   114 3536318 3536299  0  80   0 49800 67068 -      ?        00:00:00 php-fpm8.3
S   114 3536307 3536299  0  80   0 50316 67155 -      ?        00:00:00 php-fpm8.3
# ...以下省略
```

平均を算出

```bash:Ubuntu
ps --no-headers -o "rss,cmd" -C php-fpm8.3 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
# 出力結果
52M
```

私の場合は、１子プロセスにつき平均して52MBを使っているらしい

で、全体で使える1G（物理メモリ）+2GB（swap領域）の3GBなので値をこんなかんじにしてみた

```
pm.max_children = 40
pm.start_servers = 15
pm.min_spare_servers = 5
pm.max_spare_servers = 25
pm.max_requests = 1500
```

## 再起動して反映

```bash
systemctl restart php8.3-fpm
systemctl restart nginx
```

とりあえずこれで様子見

また繰り返すようであれば更新します～

## 参考

ありがとうございます。

https://ex1.m-yabe.com/archives/4237

https://hackers-high.com/linux/php-fpm-config/
素数を求める小さいプログラム

python3で、108バイトです。code golfトップの45バイトにはかないませんが、善戦したと思います。
エラトステネスの篩を使っています。
`python3 prime6.py`として実行してください。
rangeの第2引数未満最大の素数まで出力します。

```prime6.py
def s(n):
 for p in m:
  if n%p==0:return 0 
 return 1
m=[]
for i in range(2,100):
 if s(i):m+=[i];print(i)
```
煩悩の108バイトプログラム　公太郎

# AI

ついでに、Microsoft bing chatのcopilotが出してきた「エラトステネスの篩で、素数を出力する世界最小のコード」を、更に人力で短縮したものを載せておきます。

```prime9.py
print([x for x in range(2,101) if all(x%y for y in range(2,x))])
```
これは64バイトです。

元のコードは、
```prime10.py
print([x for x in range(2, 1000) if all(x % y != 0 for y in range(2, int(x**0.5) + 1))])
```
のような感じで、88bytesでした。

pythonインタプリタは、値を与えるとプリントしてくれるので、以下のような記述でも良いのなら。
```python
[x for x in range(2,100) if all(x%y for y in range(2,x))]
```
これは、58bytesです。

code golfで、具体的な数字として、1000000までの素数を出力せよというのがありました。
```python
[x for x in range(2,10**6)if all(x%y for y in range(2,x))]
```
これは、59バイトです。

# Code Golf
すごい人がいるなあ。

https://codegolf.stackexchange.com/questions/5977/list-of-primes-under-a-million
Web版GitHubで5000行以上のPRのコードレビューを快適に行う方法

## はじめに

開発する中で、5000行を超えるPRのレビューをすることが多くあり、その中で以下にかなりストレスを感じました。

- チェックマークにチェックをつけたが、チェックがつくまで<ins>数十秒</ins>かかる
- 差分を見るために、Load Diffボタンを押したが、表示されるまで<ins>数十秒</ins>かかる

そこで、JavascriptのスクリプトコードをGoogle Developer Console上で書くと、このストレスを解消できそうだったので、共有＆備忘録のために記事を書きました🗒️

## この記事を読んだ後にできること

- スクリプトを実行して、PR内の全てのチェックマークにチェックを入れることができるようになる
- スクリプトを実行して、PR内の全てのLoad Diffボタンをクリックし、全ての差分を一画面で見ることができるようになる

## 💻 前提としている環境

OS: MacOS Sonoma
ブラウザ: Google Chrome Version 126.0.6478.127 (Official Build) (arm64)


## ✅ 解決策

### 1. GitHubの該当のPRのFiles Changedセクションを開く

![Screenshot 2024-07-12 at 9.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491398/03d5f6bf-c6ac-a511-121a-eaa4a665cce1.png)

### 2. [Google Developer Console]("https://console.cloud.google.com/cloud-resource-manager?pli=1")を開く

Macの場合、`Cmd + Option + I`で表示できます。

### 3. 右端に表示されたウィンドウの一番下のGoogle Consoleセクション > consoleに以下のコマンドを順に入力

![Screenshot 2024-07-12 at 9.51.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491398/bb127206-ded5-abfd-8b3d-c00a15814630.png)

1. `allow pasting`と入力して、実行

 Google Consoleでコピペを許可するようにするための設定のためです。(**初回以外不要**)
 これを忘れると、[こちら]("https://stackoverflow.com/questions/77671024/how-to-re-enable-paste-protection-in-chrome-console')に記載のエラーなどが出てきます。


2. 必要に応じて以下のスクリプトを書く

**※注意: git上のチェックボックスおよび、LoadDiffボタンが実装されているクラス名をハードコーディングしているため、クラス名が変更されたら、スクリプトが効かなくなる可能性があります。念の為、実行前に、クラス名が正しいかどうか、必ずチェックするようにしてください。(方法は[一番下のセクション]("https://qiita.com/drafts/85ca1432b2a669178b2f/edit#%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AFloaddiff%E3%82%AF%E3%83%A9%E3%82%B9%E5%90%8D%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95")を参照)**


- 全てのチェックマークにチェックを入れるスクリプト

```
// js-reviewed-checkboxはチェックボックスが実装されているクラス名
// チェックがついていないチェックボックスをクリックして、チェックをつける

document.querySelectorAll('.js-reviewed-checkbox').forEach(checkbox => {
    if (!checkbox.checked) {
        checkbox.click();
    }
});
```

- 全てのLoadDiffボタンを押すスクリプト([こちら]("https://gist.github.com/juanca/5fd799c5b094e3e4f8b709cd101d7403")を参照しました)

```
// load-diff-buttonはLoadDiffボタンが実装されているクラス名
// 画面内全てのLoadDiffボタンをクリックして、差分を表示する

document.querySelectorAll('.load-diff-button').forEach(node => node.click())
```

## 📝 チェックマーク、LoadDiffが実装されているクラス名をチェックする方法

1. 画面右端のGoogle Developer Consoleウィンドウの一番上に表示されている左端のボタンをクリック

![Screenshot 2024-07-12 at 10.14.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491398/c1292858-7501-e2d1-2ade-41fe81a857b2.png)

2. 画面内のチェックボックスをタップして、該当のソースコードをConsole上に表示

```
// 以下のようなソースコードがハイライトされる
// js-reviewed-toggleと表示されていれば、今回のスクリプトをそのまま使用できる

<label class="js-reviewed-toggle ml-2 mr-1 px-2 py-1 rounded-2 f6 text-normal d-flex flex-items-center border color-fg-muted color-border-muted" style="cursor:pointer;">
...        
</label>
```

## おわりに

いかがでしたでしょうか。これを機に、少しずつアウトプットを増やしていこうと思っておりますので、皆様の温かい目で見守ってくだされば幸いです！「ここ違うよ！」など、ご意見もございましたら、是非是非お待ちしております！
remote: Write access to repository not granted.が出た際の対処法

# はじめに
この記事は以下の記事を参考に作成した Linuxバージョンです．
https://qiita.com/hitomi2022/items/687d64cd44b2973a6eee
# エラー内容
`git push`を実行したら，以下のエラーが出た．
```
remote: Write access to repository not granted.
fatal: unable to access 'https://github.com/〇〇/××.git/': The requested URL returned error: 403
```

**環境**
OS: **Linux**
Git: 2.27.0
# 解決策
1. [SSHキーの作成](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)
    ```
    ssh-keygen -t ed25519 -C "your_email@example.com"
    ```
    * passphraseを設定
    * 他は全てEnter

2. SSHキーをssh-agentに登録
    ```
    $ eval "$(ssh-agent -s)"
    > Agent pid 59566
    ```

3. `config`ファイルの設定
    ```
    vim ~/.ssh/config
    ```
    * 以下の内容を書き込む
    ```
    Host github.com
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_ed25519
    ```
4. GitHubにSSHキーを登録
    ```
    vim ~/.ssh/id_ed25519.pub
    ```
   * コピーしたキーを以下の手順に則り，貼り付ける．
    ![スクリーンショット 2024-07-12 15.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997830/44da580b-b182-0026-df81-bfa34d24abc9.png)

5. SSH接続ができているかチェック
    ```
    ssh -T git@github.com
    ```
    * 無事アクセスに成功した場合，以下の出力を得る．
    ![スクリーンショット 2024-07-12 15.26.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997830/c4a655eb-2c73-8288-3016-6efdaac8613a.png)
生成AIのプロンプト参考まとめ

生成AIを使うにあたりどんなプロンプト書こうか悩む時があるのでプロンプト参考サイトのまとめ
代表サイトいくつかまとめています！
他にもいいところあるよ！ってある方、ご教授いただけるとありがたいです✨

# デジタル庁

[2023年度 デジタル庁・行政における生成AIの適切な利活用に向けた技術検証を実施しました](https://www.digital.go.jp/news/19c125e9-35c5-48ba-a63f-f817bce95715)

https://www.digital.go.jp/news/19c125e9-35c5-48ba-a63f-f817bce95715

最終更新日は2024年5月17日

LLM別、用途別に様々なプロンプトが提案されたテンプレートをCSVファイルでダウンロードできる。
技術検証した結果も載っているので興味本位で見る分にもおすすめ

難点はCSVファイルなのでちょっと見にくい...

# Google
[Welcome to Beyond the prompt: Our new series on getting the most out of Gemini for Workspace](https://workspace.google.com/blog/ai-and-machine-learning/welcome-to-beyond-the-prompt?hl=en)

https://workspace.google.com/blog/ai-and-machine-learning/welcome-to-beyond-the-prompt?hl=en

最終更新日は2024年4月19日

こちらGeminiでのプロンプトについての提案ブログ。
プロンプトを書くのであればこういう風な支持を出せばうまくいくといった内容も書かれている。
ブログ内容はなかなかにボリューミーなので時間を作って読むべし。

# 生成AIプロンプト研究所
[生成AIプロンプト研究所](https://exp-p.com/)

https://exp-p.com/

誰かが作ったプロンプトを共有できるサイト。
画像・動画生成やブログ作成、コード生成といった種々様々な内容のプロンプトを検索し使うことができる。
無料で使えることがありがたい...!

# Anthropic
[プロンプトライブラリ](https://docs.anthropic.com/ja/prompt-library/library)

https://docs.anthropic.com/ja/prompt-library/library

以前より有名だったものがCloud 3.5 Sonetの発表でさらに有名になった。
そんなAnthropicがCloud向けのプロンプトとして公開しているのがこのライブラリ。
プロンプトに対する出力結果もまとめられているためわかりやすく、すぐ実践できるのもポイント！
様々なライブラリが公開されているので目的によってどう書けばいいか悩まずできる。
AccessのVBAでリンクテーブル一覧を動的に取得してリンク切れしているか判定

# 前提

『ODBC経由のリンクテーブル』
『別Accessファイルのリンクテーブル』
の2種類のリンクテーブルを網羅。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f39165c6-6077-f644-a8ec-16a34afb39f3.png)

また、Access上のテーブル名 ≠ 本来のテーブル名 となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/85c5238d-bde3-95a8-83a3-b1223980bb7e.png)


# サンプルコード

参照設定に下記を追加。
Microsoft ActiveX Data Objects 2.8 Library
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/669d7cdb-6e0c-3338-6848-2e0ea4fd60ea.png)


```vb
Option Compare Database
Option Explicit


'フォームに『コマンド0』という名前のボタンがあって、それをクリックした時というサンプル。
Private Sub コマンド0_Click()

    Dim table_def_ As TableDef
    For Each table_def_ In CurrentDb.TableDefs
    
        'ODBC経由のリンクテーブルと別Accessファイルのリンクテーブルが対象。
        If (table_def_.Attributes And dbAttachedODBC) Or (table_def_.Attributes And dbAttachedTable) Then

            Debug.Print "テーブル名 " & table_def_.Name
            Debug.Print "接続確認結果 " & CheckLinkTableConnected(table_def_.Name)
            Debug.Print "---"
            
        End If
        
    Next
    
End Sub


'テーブル名をもらって接続できるかどうかを返すヘルパー関数。
'
'下記のような確認方法だと『テーブル名が変更された』という場合を検知できないため、『テーブルに接続できるか』を確認する。
'『ODBC接続しているデータベースサーバーのIPアドレスにping通るか』
'『ODBC接続しているデータベースに接続できるか』
'『リンク先の別Accessファイルが存在しているか』
Private Function CheckLinkTableConnected(ByVal table_name As String) As Boolean

On Error GoTo Exception

    Dim rst_ As New ADODB.Recordset
    rst_.Open _
        table_name, _
        CurrentProject.Connection, _
        adOpenForwardOnly, _
        adLockReadOnly
    rst_.Close
    
    CheckLinkTableConnected = True
    
    Exit Function

Exception:
    
    Const CONNECTION_ERROR_CODE_ As Long = -2147217900
    If Err.Number = CONNECTION_ERROR_CODE_ Then
        CheckLinkTableConnected = False
    Else
        Err.Raise (Err.Number)
    End If

End Function
```

# 実行結果

リンクに問題無ければ下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/637e633d-68f4-39cf-498d-d122dd7bb84a.png)

リンク切れしていれば下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/44bd9f80-2569-80e7-b26e-d552cf92a281.png)

# バージョン

Microsoft Windows [Version 10.0.22631.3880]
Microsoft Access for Microsoft 365 MSO (バージョン 2406 ビルド 16.0.17726.20078) 32 ビット
HerokuのPostgresで日本語のソートがおかしい

## 日本語のソートしたいカラムに照合順序をつける
### 書式：
``` sql
ALTER TABLE テーブル名 ALTER COLUMN カラム TYPE タイプ名 COLLATE "ja-x-icu"; 
```
### 例：
``` sql
ALTER TABLE users ALTER COLUMN name TYPE VARCHAR COLLATE "ja-x-icu";
```
---
#### ○ ちなみに、　テーブル情報を変えたくない人はSQL文でも、　日本語ソートできます
``` sql
select * from users order by name COLLATE "ja-x-icu";
```
memo2

#If VBA7 Then
    Private Declare PtrSafe Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _
        (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, _
        ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
        ByVal nHeight As Long, ByVal hWndParent As LongPtr, ByVal hMenu As LongPtr, _
        ByVal hInstance As LongPtr, lpParam As Any) As LongPtr

    Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
#Else
    Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _
        (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, _
        ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
        ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, _
        ByVal hInstance As Long, lpParam As Any) As Long

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
#End If

Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const DTM_GETSYSTEMTIME = (DTM_FIRST + 1)
Private Const GDT_ERROR = -1
Private Const GDT_VALID = 0
Private Const DTM_FIRST = &H1000

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Private hWndDate As LongPtr

Private Sub UserForm_Initialize()
    ' Date Pickerコントロールの作成
    hWndDate = CreateWindowEx(0, "SysDateTimePick32", "", WS_CHILD Or WS_VISIBLE, _
                              10, 10, 200, 20, Me.hWnd, 0, 0, ByVal 0&)
End Sub

Private Sub CommandButtonSelectDate_Click()
    Dim tSysTime As SYSTEMTIME
    ' Date Pickerから日付を取得
    SendMessage hWndDate, DTM_GETSYSTEMTIME, 0, tSysTime
    ' 取得した日付を表示
    Me.TextBoxSelectedDate.Value = tSysTime.wYear & "/" & tSysTime.wMonth & "/" & tSysTime.wDay
End Sub
C#で別スレッドからTextBoxに書き込む

# はじめに

C#の別スレッドからUIスレッドに書き込ませるためのクラス。
サンプルは.NetFrameworkのTextBox（複数行）を想定。
個人的にはUiRefresherと呼んでいる。

# C#ソース

```C#

//クラス

//判別面倒なので全部コピペ。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Net.WebSockets;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

    //Class
    public class TextBoxDelegate
    {
        public TextBoxDelegate(TextBox ctr1, Color color1, Color color2)
        {
            this.ctr1 = ctr1;
            this.color1 = color1;
            this.color2 = color2;
        }
        private TextBox ctr1;

        private Color color1 = Color.Black;
        private Color color2 = Color.Black;

        private delegate void Delegate_Refresh(String txt, bool isColor1);

        public void AppendText(String txt, bool isColor1 = true)
        {
            if (ctr1 == null) { return; }

            if (ctr1.InvokeRequired)
            {
                try
                {
                    ctr1.Invoke(new Delegate_Refresh(this.AppendText), txt, isColor1);
                    return;
                } catch (Exception ex)
                {
                    //握りつぶす
                }
            }
            ctr1.AppendText(DateTime.Now.ToString("HH:mm:ss:fff") + ":" + txt + "\r\n");
            ctr1.ForeColor = (isColor1 ? color1 : color2);
        }

    }

```
```C#

//使いかた

    //宣言
    TextBoxDelegate _txtLog;

    Public Main(){
        //初期化 txtLogはTextBox
        _txtLog = new TextBoxDelegate(txtLog, Color.Black, Color.Black); 

        //別スレッドからも使用可能
        _txtLog.AppendText("call.");
    }

```
Accessで特定の手順を踏むと~TMPCLP※※のようなテーブルのゴミデータができてしまう

# 概要

VBAでAccessのテーブル情報一覧をループすると『~TMPCLP※※』のような名前のテーブル情報が出てくることがたまにあります。

これはゴミデータで『データベースの最適化/修復』をすると消えます。
（『~TMPCLP※※』という名前のテーブルは存在しない）

『この手順を踏むとこのゴミデータができてしまう』というのを1つ見つけました。

# 特定の手順

1. 別Accessファイルのリンクテーブルが張られている状態。
1. VBEでVBAのコードに何か変更を加える。
この時はまだ **Ctrl + sで保存はしない** 。
1. リンクテーブルを解除。

要は…
**ソースコードの編集を確定していない中途半端な状態で、リンクテーブルに対する操作をする**
ことが条件のようです。

# バージョン

Microsoft Windows [Version 10.0.22631.3880]
Microsoft Access for Microsoft 365 MSO (バージョン 2406 ビルド 16.0.17726.20078) 32 ビット
33業種×エンジニア：水産・農林業

## はじめに
未経験からのエンジニア転職を模索中。33業種それぞれでエンジニアはどのような働き方をしているのかが気になったので調べたことをまとめてみます。実際に現場で働いている方から見たらぬけ等あるかと思いますが、あたたかいめで見守ってください

## 水産・農林業×エンジニアの働き方の例
![suisann.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/58f74acf-0cfc-878c-1431-05737e02e2ba.jpeg)

### 精密農業（スマートファーミング）エンジニア
- 役割: ドローンやセンサーを用いたデータ収集、GPSを利用したトラクターの自動運転、IoTデバイスを活用した土壌のモニタリングなどを担当。
- 具体例: ドローンを飛ばして作物の健康状態を空からモニタリングし、病気や害虫の早期発見を行う。
- 該当企業：クボタ株式会社、株式会社ウプシロン

https://www.kubota.co.jp/



### 水産養殖エンジニア
- 役割: 水質モニタリングシステムの開発、魚の成長管理システムの構築、自動給餌システムの導入など。
- 具体例: センサーを使って水中の酸素濃度や温度をリアルタイムで監視し、適切な環境を維持するためのアラートを出すシステムを構築。
- 該当企業：マルハニチロ株式会社、株式会社eFishery

https://www.maruha-nichiro.co.jp/

https://efishery.com/id/


### 森林管理システムエンジニア
- 役割: 森林のデジタル地図作成、リモートセンシング技術を使った森林資源のモニタリング、災害予測システムの開発。
- 具体例: 衛星画像を分析して森林の健康状態や植生の変化を監視し、伐採や病害虫の影響を評価する。
- 該当企業：株式会社JForest（日本森林技術協会）、株式会社グリーンシステム

https://www.jafta.or.jp/contents/home/


### 農業機械エンジニア
- 役割: トラクターやコンバインなどの農業機械の設計・改良、スマート農機具の開発、機械の自動化システムの構築。
- 具体例: 自動運転機能を備えたトラクターの開発に従事し、GPSやAIを使って正確な耕作を実現。
- 該当企業：ヤンマー株式会社、ジョン・ディア（John Deere）

https://www.yanmar.com/jp/

https://www.deere.asia/ja/our-company/


### アグリビジネスITエンジニア
- 役割: 農業経営のためのソフトウェアやアプリの開発、データ分析を通じた収益管理システムの構築、Eコマースプラットフォームの運営。
- 具体例: 農家向けのアプリを開発し、収穫スケジュールの管理や市場価格のリアルタイム表示を提供。
- 該当企業：株式会社アグリノート、株式会社データドック

https://www.agri-note.jp/



## 水産・農林業における課題
- 自然環境の変化
気候変動や天候の急激な変化が作物や水産物に大きな影響を与えるため、これらを予測し対応する技術が求められる。

- データの信頼性と量
センサーやドローンから得られるデータの信頼性と量が多いため、データの精度を保ちながら効果的に分析する必要がある。

- インフラの整備
農村部や沿岸部などインフラが整っていない地域での技術導入には、ネットワーク環境や電力供給などの問題がある。

- 高額な初期投資
最新技術の導入には高額な初期投資が必要なため、小規模農家や漁師にとっては経済的な負担が大きい。

- 技術の普及と教育
新しい技術やシステムの操作方法を農家や漁師に理解してもらうための教育やトレーニングが必要。

## 向いている人
![torakuta-.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/e3e885e4-7529-28cd-305e-90f04b6afe36.jpeg)

- 自然に興味がある人
自然環境や生態系に対する関心が高く、現場でのフィールドワークを厭わない人。
- 問題解決能力が高い人
環境や生産条件の変化に柔軟に対応し、新しい解決策を見つける能力が求められる。
- 技術に強い関心がある人
IoT、AI、機械学習などの最新技術に興味があり、それらを活用して問題解決に取り組む意欲がある人。
- コミュニケーション能力が高い人
農家や漁師との連携が必要なため、現場のニーズを理解し、技術をわかりやすく伝える能力が求められる。
- 持続可能な発展に関心がある人
環境保護や持続可能な農業・漁業に対する意識が高く、エコロジカルな技術の導入に関心がある人。

## さいごに
![えんじにあ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/b8374536-05ad-28aa-51d8-840bad7c9085.jpeg)

水産・農林業におけるエンジニアの役割がこんなにもあることは知りませんでした。食の問題も騒がれている昨今、水産・農林業のエンジニアとして食の未来を救えたらかっこいいな、なんて思っています。
ほかの業種についても記事を書いていきたいと思います。
【たられば】後悔から始まる自分の理想のエンジニアキャリアプラン

## はじめに
以前、このような記事を書きました

https://qiita.com/t1k2a/items/939ef558ea08c0ff4216

人生初めての転職で失敗した話ですね
あれから転々として今はフリーランスに落ち着いていますが、そんな自分が今、あの時を振り返りながらキャリアプランを考えてみるという記事を書きます

## 転職はしない
まあ、失敗してるからそう考えてしまいますよね
新卒で入った企業をせめて3年は続けるを目標に`とりあえず在籍しとく`を意識します
チームの足を引っ張っても良い、ミスっても良い、環境壊しても良い３年は続けます
`石の上にも三年`は本当にあると思います
まあ、同じ環境で３年もいたことないんですけど

## 社内イベント、個人開発で知識を蓄える
順番で言えば
1. 社内イベント
1. 個人開発

ですね　
外部要因からインスパイアされて個人開発に落とし込み、
その過程で知識を蓄え、業務に生かすのが理想のフローだと思います

## ３年経ったら転職活動をする
３年間在籍して４年目に入ったタイミングですね
このころに転職を考えます
バックエンドエンジニアとして`どのような課題`を`どのような業界`で`どういったサービス`で解決`したい`のかを転職エージェントと詰めていきます

## toB自社開発に入社して社会の不安を取り除く
どんな企業になるかはわかりませんが、社会の不安を取り除くような働きをしたいです
ここで３年働けばちょうど今年に追いつきます
技術面では`RDMS`はもちろん`Laravel`の精通した知識や技術力、また`AWS`などの`クラウドインフラ`の管理をしていると理想です
自分の担当領域にレバレッジを利かせることで市場価値の高いエンジニアを目指し、社会課題にも向き合います
また、リーダー的な立場も経験できたらこの後のキャリアで大きく役立つと思うので
`怖がらず`にやってほしいですね

## 実はもうなってます。フリーランスになる
現実世界で私はフリーランスになっていますが、理想政界の私にもフリーランスになってもらいます
とは言っても現実世界とは違って開発経験の濃いエンジニアになっていると思いますので相当な戦力になるはずです
そしてクラウドインフラとWebアプリケーション開発を兼任できたら良いですね
ここはWebアプリケーション開発だけでも良いと思います

## 書いてて思った「今の自分、理想に近いのでは・・・？」
結果的には今の自分に近いのですが、自分は過程の踏み方に後悔しているようですね
ただの`コンプレックス`ですｗ
自分は自他共に認める`フリーランス向き性格`なのでどんな過程を踏んでも今に至りそうですｗ

## フリーランス、良いですよ
リモートワークが可能な場合に限りますが自分からしてみれば理想です
しがらみやルールが少なく、人間関係で悩むことは無いし気を使わなくても良くなる
隣の席でため息つくような人に質問ができない自分からしてみれば理想の環境です

逆に雑談チャンネルとかそういうのには入れないので寂しいと感じる人は寂しいです
正直、`みんなで仲良く仕事したい人には向かない`と思います

自分は`一人で色々やっちゃう`ので逆に向いてるのだと思います

## もし、家族を授かるのなら
比較的自由に時間を使うことができる`フリーランス`が良いのかなと思います
具体的なものは省略しますが、仕事や勉強以外で必要になる時間が多くなるイメージですので時間に融通を利かせたいと考えています

そのころには、このように記事を書くことも少なくなるでしょうねぇ・・・
## おわりに
たどり着く未来は同じでもたどり着く方法が違うだけで芝生が青く見えてしまいます
とはいえ過去には戻れないので`今を楽しむ`しかないですね
ただ、このような`コンプレックスを発散するのはたまには良い`かもしれません
役立つ技術や共有できる知識を記事にするのはすごく良いことですが、たまにはこういうのもアリかなと思いました
論文読み：WALT: Watch And Learn 2D amodal representation from Time-lapse imagery

# WALT: Watch And Learn 2D amodal representation from Time-lapse imagery

- [元論文](https://openaccess.thecvf.com/content/CVPR2022/papers/Reddy_WALT_Watch_and_Learn_2D_Amodal_Representation_From_Time-Lapse_Imagery_CVPR_2022_paper.pdf)
- [github](https://github.com/dineshreddy91/WALT)

## 概要
- 物体の遮蔽状況下で精度の高い検出とセグメンテーションできる手法を提案
- 人がいない背景画像に対して、人や車を貼り付けてセグメンテーションする
- 人がいない画像は、固定カメラで撮影したタイムラプス画像を使用し、全てのピクセルに対して中央値を取ることで作成する
- 同様にタイムラプス画像を使って、遮蔽がない物体を自動的に収集し、合成的に遮蔽データを作成する
:::note info
人によるアノテーションが不要
人間が作成するよりも安定して正確な遮蔽データセットが作れる
:::


## 従来手法との比較
従来の物体検出やセグメンテーション手法は、遮蔽が発生する場面での性能が低下しやすいという問題があった。特に、COCOやImageNetのような大規模データセットでも、遮蔽された物体のラベル付けが十分に行われておらず、その結果、遮蔽に対するロバスト性が学習されにくいという課題が存在した。また、合成データを用いた手法では、リアルなデータとのドメインギャップが問題となり、現実のシナリオに適用する際の精度が低下していた。

## 新規性
WALTの新規性は、長期間にわたる固定カメラのタイムラプス画像を利用して、遮蔽が発生しない物体を自動的に収集し、これを用いて遮蔽シナリオを合成的に生成する点にある。この手法により、リアルなデータに近い形で大量の遮蔽データを生成することが可能となり、遮蔽に対するロバスト性を大幅に向上させることができる。また、時間をかけて収集された無遮蔽の物体データを利用することで、遮蔽された物体の学習を効率化し、短期間での学習が可能となっている。

## 方法論
1. **無遮蔽物体の収集**: 固定カメラのタイムラプス画像から、長期間にわたり無遮蔽の物体を検出・収集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/c941d836-1282-5013-9010-5e05a86bc43d.png)
図のように物体検出したBBoxの底辺が他のBBoxと重なっているものは遮蔽されている物体で、底辺以外が重なっているもの・どのBBoxとも重なっていないものは遮蔽されていない物体として認識．物体の画像を収集する．

2. **合成的な遮蔽シナリオの生成**: 収集された無遮蔽の物体を用いて、同じシーン内で重ね合わせることで、現実に近い形の遮蔽シナリオを生成する。この合成データは、ディープラーニングネットワークのトレーニングに利用される
3. **Amodalセグメンテーションの学習**: 合成データを用いて、物体の遮蔽状況下でも正確に検出・セグメンテーションができるAmodalネットワークを学習する。これにより、物体の全体的な表現を学習し、遮蔽が発生している場合でも正確なセグメンテーションが可能となる

## 結果と評価
この手法を用いることで、歩行者や車両の検出・セグメンテーション精度が大幅に向上し、遮蔽が増加しても性能の低下が緩やかであることが確認された。特に、遮蔽が発生する場面でのトラッキング性能が向上し、実際の交通監視などのアプリケーションでの有用性が示された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2323577/e449553b-404f-4771-5b51-ea0f153d3540.png)
比較画像を確認．確かに従来手法が2人の人間を1人と見なしていたり、オクルージョンを境目に1台の車を2台と判断するケースが合う一方で、WALTは正しく判断できている．

## 結論
WALTは、固定カメラからのタイムラプス画像を利用して、物体の遮蔽状況下でも高精度な検出・セグメンテーションを実現する新しい手法を提案している．
この手法により、従来の手法では難しかった遮蔽に対するロバスト性を大幅に向上させることができる。今後は、この手法を自動運転などの新しい応用分野に展開することが期待される．
GitHub Actionsでビルドする際に環境変数を渡すタイミング

SupaBaseのDBにアクセスするアプリをGithubActionsを用いてbuild後deployした際に
真っ白のページが表示されてしまった時のメモです。
※SecrertsにはSUPABASE_URLとSUPABASE_ANON_KEYを保存してあります

原因：.envの環境変数から SUPABASE_URL と SUPABASE_ANON_KEY を取り出すことができない

```　:失敗例#デプロイの時に渡そうとしてる

name: Push deploy

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
    
    ...
    
      - name: Run build
        run: npm run build
        
    ...
    
  deploy:
    name: Deploy to Firebase Hosting
    runs-on: ubuntu-latest
    needs: build
    steps:
    
    ...
    
      - name: Deploy to Firebase Hosting
        run: |
          ./node_modules/.bin/firebase deploy --only hosting
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
          FIREBASE_CLI_EXPERIMENTS: webframeworks
          VITE_SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
          VITE_SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
          
    ...

```

```　:成功例#npm run build の時に渡す

name: Push deploy

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
    
    ...
    
      - name: Run build
        env:
          VITE_SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
          VITE_SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
        run: npm run build
        
    ...
    
  deploy:
    name: Deploy to Firebase Hosting
    runs-on: ubuntu-latest
    needs: build
    steps:
    
    ...
    
      - name: Deploy to Firebase Hosting
        run: |
          ./node_modules/.bin/firebase deploy --only hosting
        env:
          FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
          FIREBASE_CLI_EXPERIMENTS: webframeworks
          
    ...

```

無事にgit pushでdeploy出来ました
LibXLでExcelにドロップダウンリストを設定する

開発でLibXLを使用していますが、Excelにドロップダウンリストを動的に埋め込みたくなったので方法がないか探しました。
公式サイトの[FAQ](https://www.libxl.com/faq.html#:~:text=How%20to%20add%20a%20drop%2Ddown%20list%20to%20a%20cell%20%3F)にそれらしい記述を見つけました。

> How to add a drop-down list to a cell ?
> Please use the Sheet::addDataValidation() method with VALIDATION_TYPE_LIST type of data validation.
You can use cell references as list here:

~~~
  sheet->addDataValidation(VALIDATION_TYPE_LIST, VALIDATION_OP_EQUAL,
  5, 5, 5, 5, L"A2:A5");
  ~~~
 
> Or specify a list of values in quotes here:
 ~~~
  sheet->addDataValidation(VALIDATION_TYPE_LIST, VALIDATION_OP_EQUAL,
  6, 6, 6, 6, L"\"first,second,third\"");
  ~~~

  addDataValidation()という関数を使うみたいです。
  ただ、これだけだとよくわからないので更に検索してみると、同じく公式サイトの[Sheet Class Reference](https://www.libxl.com/spreadsheet.html?lang=cs#:~:text=Validation%20rules%20specified.-,public%20void%20addDataValidation,-(DataValidationType%20type))というページに関数の説明がありました。

定数名は、私の環境で(?)使おうとするとエラーが出てしまったので、データがないか探しました。[ありました。](https://osmijanko.fri.uniza.sk/slawfik/Log_viewer/-/blob/master/include/enum.h)

メモ程度ですが参考になったら嬉しいです！
rex0220 ちょっと便利なプラグイン PDFビューア

[rex0220 ちょっと便利なプラグイン](https://qiita.com/rex0220/items/45883f15ccd34a68b8af)で、PDFビューア機能をご紹介します。
kintone の少し使いにくいところをちょっとだけ便利にするプラグインです。

# 概要

[rex0220 ちょっと便利なプラグイン](https://qiita.com/rex0220/items/45883f15ccd34a68b8af)で、PDFファイルをブラウザーのビューア表示します。
※ Ver.24 で機能追加

「PDF表示」ボタンをクリックすると別タブでビューア表示します。

- 「F72 詳細画面でPDFをビューア表示」
　テーブル内項目、関連レコードに対応

 ![2024-07-12_14h50_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/872ef56b-8734-fe65-51e8-902a5688c6ff.png)

関連レコード表示 
![2024-07-12_14h41_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/a5c665b9-5dda-c317-b637-6678bde9bdd8.png)

- 「F73 一覧画面でPDFをビューア表示」
　テーブル内項目に対応

![2024-07-12_14h39_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/047a36fd-33de-8cd0-79dd-1cd3cb172b0c.png)

# 操作例

![2024-07-12_22h11_32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/8b9fcd26-954b-2fa7-234a-6c77c88ac243.gif)


# ちょっと便利なプラグイン設定

F72とF73をチェックします。

![2024-07-12_14h38_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/08d71d25-3530-59d6-c7fd-4535ee3832dc.png)
JSで大文字or小文字のローマ数字を全角アラビア数字に変換した

■前提条件
jsで実装する。

■要件
大文字or小文字のローマ数字を、全角アラビア数字に変換したい。
ただし、文章中の一部に含まれているものも変換対象とする。
（例）てすとタワーⅡhoge

■課題
ライブラリを使用して変換しようとしたが、先頭文字が変換対象となるためエラーになってしまう。
→使用予定のライブラリ：https://www.npmjs.com/package/numeric-quantity

■解決策
ライブラリを使用せず、自力で実装。
今回の設計では10までの値を変換対象としているが、50(Ⅼ)、100(Ⅽ)なども対象とする場合は追記が必要。

■コード
```
/**
 * 全角or半角ローマ数字を全角アラビア数字に変換
 */
const romanToArabic = (str) => {
  const romanMap = {
    Ⅰ: "１",
    Ⅱ: "２",
    Ⅲ: "３",
    Ⅳ: "４",
    Ⅴ: "５",
    Ⅵ: "６",
    Ⅶ: "７",
    Ⅷ: "８",
    Ⅸ: "９",
    Ⅹ: "１０",
    ⅰ: "１",
    ⅱ: "２",
    ⅲ: "３",
    ⅳ: "４",
    ⅴ: "５",
    ⅵ: "６",
    ⅶ: "７",
    ⅷ: "８",
    ⅸ: "９",
    ⅹ: "１０",
  };
  return str.replace(
    /Ⅰ|Ⅱ|Ⅲ|Ⅳ|Ⅴ|Ⅵ|Ⅶ|Ⅷ|Ⅸ|Ⅹ|ⅰ|ⅱ|ⅲ|ⅳ|ⅴ|ⅵ|ⅶ|ⅷ|ⅸ|ⅹ/g,
    (match) => romanMap[match]
  );
};
```

■備考
自分のライブラリの使い方が誤りの可能性を捨てきれないため、再度ライブラリを使用しての実装を試みる。
また、他のライブラリを使用できないかも検討する。
【Rails】バリデーションのエラーメッセージが表示されない時

# controllerにstatus: :unprocessable_entityを追加
```ruby:post_controller
  def update
    @post = Post.find_by(id: params[:id])
    @post.content = params[:content]
    if @post.save
      redirect_to("/posts/index")
    else
      render("posts/edit", status: :unprocessable_entity)
      # rails7系でバリデーションエラー文を表示させるには、 ,status: :unprocessable_entityの追記が必要）
    end
  end
```
Rails7.0からデフォルトでTurboが導入されており、バリデーションのエラーメッセージを表示させるためには`status: :unprocessable_entity`の記述を追加する必要がある。

```ruby:edit.html.erb
<div class="main posts-new">
  <div class="container">
    <h1 class="form-heading">編集する</h1>
    <%= form_tag("/posts/#{@post.id}/update") do %>
     <div class="form">
       <div class="form-body">
          <% @post.errors.full_messages.each do |message| %>
            <div class="form-error">
              <%= message %>
            </div>
          <% end %>
         <textarea name="content"><%= @post.content %></textarea>
         <input type="submit" value="保存">
       </div>
     </div>
    <% end %>
  </div>
</div>
```
memo

```
' 標準モジュールのコード
Private Declare PtrSafe Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" _
    (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, _
     ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _
     ByVal nHeight As Long, ByVal hWndParent As LongPtr, ByVal hMenu As LongPtr, _
     ByVal hInstance As LongPtr, lpParam As Any) As LongPtr

Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr

Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000
Private Const DTM_GETSYSTEMTIME = (DTM_FIRST + 1)
Private Const GDT_ERROR = -1
Private Const GDT_VALID = 0
Private Const DTM_FIRST = &H1000


' ユーザーフォームのコード
Private hWndDate As LongPtr

Private Sub UserForm_Initialize()
    ' Date Pickerコントロールの作成
    hWndDate = CreateWindowEx(0, "SysDateTimePick32", "", WS_CHILD Or WS_VISIBLE, _
                              10, 10, 200, 20, Me.hWnd, 0, 0, ByVal 0&)
End Sub

Private Sub CommandButton1_Click()
    Dim tSysTime As SYSTEMTIME
    ' Date Pickerから日付を取得
    SendMessage hWndDate, DTM_GETSYSTEMTIME, 0, tSysTime
    ' 取得した日付を表示
    Me.TextBox1.Value = tSysTime.wYear & "/" & tSysTime.wMonth & "/" & tSysTime.wDay
End Sub

```
雑談が生み出すメンタリング

# 1. はじめに

　メンターって何なのかググってみたことありますか？言葉の起源はギリシャ神話です。オデッセウスがトロイ戦争に参戦する前、自分の息子の世話をお願いした友人の名前がメンターだったそうです。えっ、メンターって先生みたいなもんじゃないんだ、って思っちゃいますよね。

　メンターは自分を導いてくれる人を意味しています。なので、同い年の友人、あるいは自分より年下の人もメンターになれます。今年、皆さんも誰かにとってそのような存在になれたのでしょうか。ここでは約半年間、自分がメンタリングで経験したことを共有したいと思います。

# 2. メンタリングは難しい

メンターとメンティーには根本的な困難があります。

#### ①人間的な相性
　人には相性があります。業務だけではなく、人間的な相性もチームワークの重要な要素です。結局私たちも人間なので性格が合わない人と仕事をするのは難しいです。そしてこれは成長にも影響します。


　私は幸いにも素晴らしいメンターに会って多くのことを学べましたが、一方では自分のメンティに対しては課題を感じたこともあります。接点がなくてなかなか会話が続かない、のような経験は誰にでもあることですよね。

#### ②目標達成までの長いサイクル
わからないことをその場で相談できる点ではフィードバックが早いと言えます。しかし、究極のゴールは長期的な成果です。今日の会話が明日の私の飛躍的な成長を生み出すことはなかなかありません。そのため、この方向が正しいかどうかを判断することは困難です。数ヶ月が経過した後、結果論的な観点から評価することになります。

# 3. 良いメンター/メンティーになるために意識したこと

### ～興味を持たせる - 雑談の力～

　関係構築の鍵は雑談だと思います。他人と共有できる範囲の個人的な話、それを知ることで私たちはさらに仲良くなれます。会社の先輩と後輩としての関係だけではなく、人間ソン・テフンとしての柄を見せることによって関係は深まります。そこから以前よりお互いの言葉は頭の中に長く残り、ヘルシーなフィードバックが行われるのです。


　多様な方面でお互いを知らないと、相手をお動かすようなアクションは生まれません。表面的なところから内部の些細な部分まで理解することで、二人の学びがより速くなると感じました。そしてそのような日々の積み重ねが成長に繋がります。まさに長期的な成果ですね。

# 4. 結論

メンタリングに正解はないです。すべてを教える必要もありません。メンターとして自分に足りない部分がある場合は、他の人の助けを受けることも重要です。さまざまな人々の意見を聞いてそれを活用することは、メンタリングという長期レースで失敗する確率を減らす良い方法です。相手が頼れるようにメンタル的なサポートとして、時にはただ良いリスナーになることも大事です。

色々と書きすぎました。前期のメンタリングは楽しかったです。今期も楽しみです。
GROWI 7.0.12リリースノート

[オープンソースのWikiであるGROWI](https://growi.org/ja/)の最新版、7.0.12がリリースされました。大きな変更点はありませんが、リリースノートとして主な変更点を紹介します。

## 主な変更点

### 10文字以上の本文がある場合、Elasticsearch にインデックスされなくなりました

長大な本文があるページは検索に引っかからなくなります。メリットとして、インデックス再作成処理が高速化されます。

この閾値は環境変数の `ELASTICSEARCH_MAX_BODY_LENGTH_TO_INDEX` にて指定できます。デフォルトは `100000` です。

### 絵文字一覧（絵文字マート）がダークモードに対応しました

ダークモード必須のエンジニアは嬉しい変更です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/23b8dd40-41c6-46e3-b81c-a12ac14b657a.png)


### ロゴが新しくなりました

GROWIの開発がWESEEKから、子会社の株式会社GROWIに移管されたことに伴い、ロゴが新しくなりました。

[【重要】株式会社GROWI の設立および GROWI.cloud における運営会社の移管について|情報共有ツールのGROWI.cloud](https://growi.cloud/v2/news/158)

こちら、新しいロゴです！

![スクリーンショット 2024-07-12 14.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/80fbcdfc-a2aa-3032-8d45-18eaee338737.png)


## その他の変更点

その他、細かな修正点です。

- HTML要素のlang属性を正しく反映するようになりました
- アーカイブのインポートとエクスポート
- TableWithEditButton と DrawioViewerWithEditButton のボタンの不透明度変更

また、不具合修正と各種メンテナンスも行われています。詳細は[Release v7.0.12 · weseek/growi](https://github.com/weseek/growi/releases/tag/v7.0.12)を参照してください。

## まとめ

GROWIはオープンソース、かつDocker composeなどで手軽に導入できます。ぜひ社内・研究室・自宅などで利用してみてください。

[OSS開発wikiツールのGROWI | 快適な情報共有を、全ての人へ](https://growi.org/ja/)
StateListDrawalbe の state_pressed で表示を切り替える xml を Jetpack Compose に書き換える

## 概要　

Android View の時に以下のような [StateListDrawalbe](https://developer.android.com/guide/topics/resources/drawable-resource#StateList) xml の state_pressed で表示を切り替えて表示することがよくあった。

これを Jetpack Compose に書き換える方法のメモ。

```xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="true" android:state_pressed="true" android:drawable="@drawable/sugoi_button_pressed" />
    <item android:state_enabled="true" android:state_pressed="false" android:drawable="@drawable/sugoi_button" />
</selector>
```

## こうする
```kotlin

val interactionSource = remember { MutableInteractionSource() }
val pressed by interactionSource.collectIsPressedAsState()

Image(
    painter = painterResource(if (pressed) R.drawable.sugoi_button_pressed else R.drawable.sugoi_button),
    contentDescription = null,
    modifier = Modifier
        .clickable(interactionSource = interactionSource, indication = null) {
            // 何か処理
        }
)

```

## 参考
* https://stackoverflow.com/questions/70717310/how-to-detect-that-a-button-is-pressed-in-jetpack-compose
改めてApache Solrについて少しだけ解説


## Apache Solrとは

Apache Solr（以下、Solrと言います）は、Apache Luceneを基盤とした、人気があり、非常に高速な**オープンソース**のエンタープライズ検索プラットフォームです。

Solrは一般的にはソーラーと読みますが、ソラーやソーラと呼ぶ人もいます。

Solrは非常に信頼性が高く、スケーラブルでフォールトトレラント性（障害耐性）があり、分散インデックス作成、レプリケーション、負荷分散されたクエリ、自動フェイルオーバーとリカバリー、中央集中的な設定管理などを提供します。

Solrは世界最大級のインターネットサイトの多くで、検索およびナビゲーション機能を支えています。
https://solr.apache.org/

上記のサイトから、誰もが自由にダウンロードでき、無料で利用できます。

## Apache Solrの特徴

Apache Solrの特徴は次の通りです。

#### 1. 検索機能
Solrは、ウェブサイトやアプリケーションに強力な検索機能を追加するためのツールです。大量のデータから瞬時に必要な情報を見つけ出すことができます。

#### 2. 高速性
Solrは非常に高速で、リアルタイムに近い速度で検索結果を返します。大規模なデータセットに対しても効率的に動作します。

#### 3. スケーラビリティ
Solrは拡張性が高く（スケーラブルであり）、データ量やアクセス量が増えてもシステムを簡単に拡張できます。複数のサーバーに分散して処理を行うことで、快適なパフォーマンスを維持します。

#### 4. 信頼性とフォールトトレラント
Solrは信頼性が高く、システム障害に対してもとても強いです。データのレプリケーション（複製）や自動フェイルオーバー（障害時の自動切替）機能があり、データの一貫性と可用性を確保します。

#### 5. 柔軟な設定
集中的な設定管理により、システム全体の設定を一元管理できます。これにより、複雑なシステムの管理が容易になります。

#### 6. 活用例
Solrは、世界中の大規模なウェブサイトで検索機能を提供しています。
例えば、オンラインショップの製品検索や、ニュースサイトのコンテンツ検索、企業内のデータベース検索など、多岐にわたる用途で利用されています。

#### 7. 機能の豊富さ
Solrは、分かりやすい検索クエリの作成、ファセット検索（カテゴリ別に絞り込む機能）、ハイライト表示、地理空間検索など、多彩な検索機能を備えています。

#### 8. 豊富なドキュメントとコミュニティによるサポート
Solrのチュートリアルや詳細なドキュメントが豊富にあります。
[https://solr.apache.org/resources.html](https://solr.apache.org/resources.html)
また、SolrにはSolrコミュニティという、とても活発で役に立つコミュニティがあります。
[https://solr.apache.org/community.html](https://solr.apache.org/community.html)
ユーザーはメーリングリストやSlackを利用してサポートを受けたり、開発者と交流したりできます。また、JIRAを使って問題報告やバグ修正に参加できます。

#### 9. 無料で使える
Solrは無料で利用できます。コミュニティによるサポートも無料で受けられます。

#### 10. セマンティック検索が使える
セマンティック検索（ベクトル検索とも言います）とは、検索エンジンが人間のようにクエリと検索対象オブジェクト（テキスト・画像・動画・音声データなど）の「意味」を理解して行われる情報検索です。Solrは、バージョン9.0以降でセマンティック検索をサポートしています。

Solrは、強力で柔軟性があり、高速かつ信頼性の高い検索ソリューションを提供するため、多くの企業や開発者に選ばれています。

## 充実したサポート

「豊富なドキュメントとコミュニティによるサポート」のサポートに関する補足です。
本家のサイトには、英語ではありますが、とても充実したコミュニティがあります。
[https://solr.apache.org/community.html](https://solr.apache.org/community.html)
問題が起きたときの相談やわからないことがあれば、世界中のエンジニアが、素早く助けてくれるでしょう。

また、インターネット上には日本語のナリッジも豊富に存在し、日本語の書籍も出版されていますので、出だしで大きくつまづくことはないでしょう。

KandaSearchの公式サイトには、コミュニティ・サポート・フォーラムという技術サポートフォーラムがあります。
[https://kandasearch.com/forum](https://kandasearch.com/forum)
Apache SolrやKandaSearchのユーザー同士が助け合えるように、当社が提供している、いわゆる電子掲示板です。
こちらは、日本語で投稿できます。
Apache Solrを使っているうちに困ったことが起きたら、ぜひ、こちらフォーラムで相談してみてください。
CVPR2024の量子化論文

# 概要

この記事では、[CVPR2024](https://cvpr.thecvf.com/Conferences/2024)の量子化論文を紹介します。[^1]

[^1]: 画像や数式は論文から引用しています。

# Reg-PTQ: Regression-specialized Post-training Quantization for Fully Quantized Object Detector

- https://openaccess.thecvf.com/content/CVPR2024/papers/Ding_Reg-PTQ_Regression-specialized_Post-training_Quantization_for_Fully_Quantized_Object_Detector_CVPR_2024_paper.pdf

- 概要：Regressionの精度が悪い問題の改善
- 新規性：Toy problemでClassificationとRegressionの違いを分析し、量子化の改善方法を提案した。
- キモ
  - ClassifierよりRegressorの方がロス大、Regressorは一様ノイズにsensititive
      ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/3dfcb4b9-fe62-3725-5769-7997664502b7.png)
  - Regressorだと、量子化時の誤差最小店が最適解とずれてしまう。Classifierだとロバスト。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/e20e8122-012a-43be-b208-46abd0a5e61d.png)
  - Classifierは一様分布に近い。Regressorは非一様、中心が多い
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/c0386c87-10ca-3ef3-df28-dd4ed373a10e.png)


# Enhancing Post-training Quantization Calibration through Contrastive Learning

- https://openaccess.thecvf.com/content/CVPR2024/papers/Shang_Enhancing_Post-training_Quantization_Calibration_through_Contrastive_Learning_CVPR_2024_paper.pdf

- 概要：PTQのキャリブ画像の選び方
- 新規性：量子化で情報量が落ちないように、Contrastive learningで似た画像を取らないようにキャリブ画像を選ぶ。
- キモ：ロス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/b62d1b1c-1d38-56e1-f2c0-f36926c790c4.png)
評価値を計算する時、DNN(g)は既存の重みを使って計算させることでgの学習は不要とする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/adfc0ee3-eea0-f5fc-cf1c-7f0f92bbebfa.png)
htmlで表の上を固定

HTMLとCSSを使用して、表の上2行だけを固定し、残りの行を上下にスクロールできるようにする方法を以下に示します。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>固定ヘッダーテーブル</title>
    <style>
        .table-container {
            height: 300px; /* 表全体の高さを指定 */
            overflow-y: auto; /* 垂直スクロールを有効にする */
            border: 1px solid #ddd;
        }

        table {
            width: 100%;
            border-collapse: collapse;
        }

        th, td {
            padding: 8px 16px;
            border: 1px solid #ddd;
            text-align: left;
        }

        thead {
            position: sticky;
            top: 0;
            background-color: #f9f9f9;
        }

        /* 2行目も固定 */
        thead tr:nth-child(2) {
            position: sticky;
            top: 40px; /* 行の高さを指定 */
            background-color: #f1f1f1;
        }
    </style>
</head>
<body>
    <div class="table-container">
        <table>
            <thead>
                <tr>
                    <th>ヘッダー1</th>
                    <th>ヘッダー2</th>
                    <th>ヘッダー3</th>
                </tr>
                <tr>
                    <th>サブヘッダー1</th>
                    <th>サブヘッダー2</th>
                    <th>サブヘッダー3</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>データ1</td>
                    <td>データ2</td>
                    <td>データ3</td>
                </tr>
                <tr>
                    <td>データ4</td>
                    <td>データ5</td>
                    <td>データ6</td>
                </tr>
                <tr>
                    <td>データ7</td>
                    <td>データ8</td>
                    <td>データ9</td>
                </tr>
                <!-- さらにデータ行を追加 -->
            </tbody>
        </table>
    </div>
</body>
</html>
```

このコードでは、CSSの `position: sticky;` を使用して、表の上2行を固定しています。また、 `table-container` クラスに `overflow-y: auto;` を設定して、垂直スクロールを有効にしています。表の高さ（ここでは300px）は必要に応じて調整してください。
ITパスポート 基数変換

・10進数
０から９までの10種類の数字を使って、９の次が桁上がりする
・２進数
０と１の２種類の数字を使って、１の次が桁上がりする
・16進数
０から９までの数字とA,B,C,D,E,Fの英字の16種類を使って、Fの次が桁上がりする

・10進数と２進数と16進数の関係
10進数,２進数,16進数
0,0,0
1,1,1
2,10,2
3,11,3
4,100,4
5,101,5
6,110,6
7,111,7
8,1000,8
9,1001,9
10,1010,A
11,1011,B
12,1100,C
13,1101,D
14,1110,E
15,1111,F
16,10000,10

・10進数から２進数への基数変換
1. 10進数の値を２で割って、商が０になるまでこれを繰り返す
2. 最後に余りを、計算とは逆順（上位桁から）並べる
10進数の「５」は、２進数に基数変換すると「101」となる

・２進数から10進数への基数変換
1. ２進数の各桁に２進数の重みを掛けていく
2. 最後に足す
1x2^2+0x2^1+1x2^0=5

・10進数から16進数への基数変換
1. 10進数の値を16で割って、商が０になるまでこれを繰り返す
2. 最後に余りを、計算とは逆順に並べる
10進数の「47」は、16進数に基数変換すると「2F」となる

・16進数から10進数への基数変換
1. 16進数の各桁に16進数の重みを掛けていく
2. 最後に足す
2x16^1+F(15)x16^0=47
ネストとは？

## はじめに
課題を進めていく中で「？」の用語だった「ネスト」について調べたのでアウトプットしたいと思います。少しでも参考になれば幸いです。

## ネストについて
### ネストの語源
![torinosu.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/2ccfab59-4ea0-5584-61ef-ba5842bb94f7.jpeg)

「ネスト」という言葉は、英語の「nest」から来ています。「nest」は鳥の巣を意味し、そこから転じて「入れ子構造」や「何かの中に何かを入れる」という意味で使われるようになっているそうです。
英語では「nest」や「nesting」と表記されます。

### ネスト使用場面
- プログラミング
プログラミングにおいて、ある構造の中に同じ種類の構造を持つ場合に使用されます。
　例: ネストされたループ（ループの中に別のループ）、ネストされた関数（関数の中に別の関数）、ネストされた条件文（if文の中に別のif文）など。

- HTML/CSS
HTMLやCSSでは、タグやセレクタの入れ子構造を指します。
　例: `<div>`タグの中に`<p>`タグを入れる、CSSで複数のセレクタをネストして書く。

- ファイルシステム
ディレクトリ（フォルダ）構造において、フォルダの中にさらにフォルダを作成すること

- 数式やデータ構造
数学やコンピュータサイエンスにおいて、関数やデータ構造が入れ子になっている場合に使われます。
　例: ネストされた配列やオブジェクト。

### 似たような言葉
- 入れ子（いれこ）
この言葉も同様の意味で使われ、特に物理的な物体の入れ子構造を指すことが多い

- 階層構造（かいそうこうぞう）
ネスト構造と似ていますが、より広義に使われることがあります。階層構造は一般に、階層的に組織されたデータや情報の構造を指します。

- 埋め込み（うめこみ）
似たような意味で使われることがありますが、これは主に何かを別のものの中に入れることを強調します。


## 例
### プログラミング
```java
for i in range(5):  # 外側のループ
    for j in range(3):  # 内側のループ（ネストされたループ）
        print(i, j)
```
- for i in range(5):は、外側のループで、iが0から4までの値を取ります
- for j in range(3):は、内側のループで、外側のループの各反復に対して実行されます。jは0から2までの値を取ります
- print(i, j)は、iとjの現在の値を出力します

```java
# 実行結果
0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2
3 0
3 1
3 2
4 0
4 1
4 2
```
- 外側のループがiの値を0から4に変化させる間、内側のループがそのたびにjの値を0から2に変化させることで、すべての組み合わせが出力されることとなる


### HTML
```java
<div>  <!-- 外側の要素 -->
    <p>ネストされた段落</p>  <!-- 内側の要素 -->
</div>
```
- `<div>`は、外側のHTML要素で、一般的に他の要素をグループ化するために使われます
- `<p>`は、内側のHTML要素で段落を示します。この場合、`<p>`タグは`<div>`タグの内部にあります
- ブラウザ上では「ネストされた段落」というテキストが段落として表示されることとなります


##　さいごに
「ネスト」について簡単にまとめてみました。何気なくコードを入力していてもその行動？構造について言葉で説明する際、やはり用語の理解は必要不可欠なんだなと感じています。
用語全集みたいなのほしい
20240711_送信処理

```
@startuml
skinparam StateFontSize 12
skinparam StateFontName Arial
skinparam ArrowFontSize 11
skinparam ArrowFontName Arial
top to bottom direction
skinparam ranksep 50
skinparam nodesep 50

[*] -down-> CSV作成処理中

state CSV作成処理中 #lightblue {
    [*] --> データ抽出
    データ抽出 -right-> CSVフォーマット変換 : データ抽出完了
    CSVフォーマット変換 -right-> CSV出力 : dataframe⇒csv変換完了
    CSVフォーマット変換 -down-> CNT出力 : レコード数カウント完了
    CSV出力 -down-> [*] : CSV格納完了
    CNT出力 -down-> [*] : CNT格納完了

    state データ抽出 {
        [*] -down-> csv定義ファイル読み込み
        csv定義ファイル読み込み -down-> カラム抽出 : 読み込み完了
        カラム抽出 -down-> [*]  : 出力csv単位で\nカラム抽出完了
    }
}

state データ整合性チェック_validation処理中 #lightgreen {
    [*] --> データ整合性チェック
    データ整合性チェック -down-> validation
    validation -down-> [*]

    state データ整合性チェック {
        [*] --> 出力CSVチェック
        出力CSVチェック -right-> レコードの一意性チェック
        レコードの一意性チェック -right-> 反映処理チェック
        反映処理チェック -right-> 一括処理チェック
        一括処理チェック -right-> 他チェック項目
        他チェック項目 -down-> [*]
    }

    state 出力CSVチェック {
        [*] -down-> ファイル名_ファイル数確認
        ファイル名_ファイル数確認 -down-> レコード数確認 : 定義ファイルと\n一致することを確認
        レコード数確認 -down-> [*]  : 出力CSV単位で\nCNTの値と比較完了
    }

    state レコードの一意性チェック {
        [*] -down-> keyキー重複チェック
        keyキー重複チェック -down-> ポータルキー重複チェック
        ポータルキー重複チェック -down-> [*]
    }

    state 反映処理チェック {
        [*] -down-> DB更新TBLのレコード抽出
        DB更新TBLのレコード抽出 -down-> 出力CSVとの比較
        出力CSVとの比較 -down-> [*]
    }

    state 一括処理チェック {
        [*] -down-> 休職本部詰めチェック
        休職本部詰めチェック -down-> 常駐部店チェック
        常駐部店チェック -down-> [*]
    }

    state 他チェック項目 #pink{
        [*] -down-> 受付処理の整合性チェック項目
        受付処理の整合性チェック項目 -down-> 受付_パターン処理関連
        受付_パターン処理関連 -down-> ダミー課Gr情報チェック
        ダミー課Gr情報チェック -down-> [*]

        note right of 受付処理の整合性チェック項目
            ファイル送信前でも実施すべき
            項目を確認する
        end note

        note right of 受付_パターン処理関連
            受付パターン処理結果に対して
            チェックすべき項目があるか確認する
        end note

        note right of ダミー課Gr情報チェック
            ダミー課Grテーブル情報との
            整合性チェック
        end note
    }

    note right of validation
            validation項目:
              BPR部店名_課Gr名_64文字チェック
              データ型
              レコードサイズ
              空白の許容
              全角半角
              文字コード
        end note
}

state 送信処理中 #lightyellow {
    [*] --> 送信定義ファイル取得 
    送信定義ファイル取得 -right-> 送信前準備 : 送信先情報取得
    送信前準備 -right-> ファイル送信_SFTP : 送信先へSSH疎通確認\nフォルダ状況確認
    ファイル送信_SFTP -right-> 送信結果確認 : 送信完了
    送信結果確認 -down-> [*] : 送信先へCSVの存在確認
}

CSV作成処理中 -down-> データ整合性チェック_validation処理中 : CSV作成完了
データ整合性チェック_validation処理中 -down-> 送信処理中 : validation成功
送信処理中 -down-> [*] : 送信完了

@enduml

```

![送信処理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782003/60e1a007-0484-96e7-ceb2-0f672c35aa4a.png)
20240711_一括処理

```
@startuml
skinparam StateFontSize 12
skinparam StateFontName Arial
skinparam ArrowFontSize 11
skinparam ArrowFontName Arial
top to bottom direction
skinparam ranksep 50
skinparam nodesep 50

[*] -down-> 休職本部詰め処理中

note top of 休職本部詰め処理中
  一括処理：
  リファレンスDBの一括更新処理を行い、
  履歴を保存して差分を確認する処理
end note

state 休職本部詰め処理中 #lightblue {
    [*] --> 対象部店抽出
    対象部店抽出 -down-> 追加対象処理 : 追加対象あり
    対象部店抽出 -down-> 削除対象処理 : 削除対象あり
    対象部店抽出 -down-> [*] : 対象なし
    
    state 追加対象処理 {
        [*] --> 休職本部詰め文書生成
        休職本部詰め文書生成 -down-> [*]: 自動生成完了
    }
    
    state 削除対象処理 {
        [*] --> 休職本部詰め文書削除
        休職本部詰め文書削除 -down-> [*]: 自動削除完了
    }
    
    追加対象処理 -right-> 削除対象処理 : 追加処理完了
    削除対象処理 -right-> [*] : 削除処理完了
}

state 常駐部店_名称変更_自動更新処理中 #lightgreen {
    [*] --> 常駐元_部店取得
    常駐元_部店取得 -down-> 常駐先_部店取得 : 常駐店番_取得完了
    常駐先_部店取得 -down-> 常駐先常駐元_部店名比較 : 常駐部店_取得完了
    常駐先常駐元_部店名比較 -down-> [*] : 常駐先/元の名称一致
    常駐先常駐元_部店名比較 -down-> 常駐元_名称変更 : 不一致 
    常駐元_名称変更 -down-> [*] : 常駐元_名称変更完了
}

state 履歴DB処理中 #lightyellow {
    [*] --> リファレンスDBの断面保存
    リファレンスDBの断面保存 -down-> 当日前日差分取得 : 履歴DB保存先へ格納完了
    当日前日差分取得 -down-> 差分情報格納 : 更新差分取得完了
    差分情報格納 -down-> [*]
    差分情報格納 -down-> 統合ツール_差分確認 : 差分情報格納完了
    統合ツール_差分確認 -down> [*] : 統合ツールでのチェック完了

    state 統合ツール_差分確認 #pink {
        [*] --> 差分確認中
        差分確認中 --> [*]
        note right of 差分確認中
            手動処理：
            運用者による
            目視チェック
        end note
    }
}

休職本部詰め処理中 -down-> 常駐部店_名称変更_自動更新処理中 : 休職本部詰め処理完了
常駐部店_名称変更_自動更新処理中 -down-> 履歴DB処理中 : 常駐部店_名称変更_自動更新処理中完了
履歴DB処理中 -down-> [*] : 一括処理完了

note right of 常駐部店_名称変更_自動更新処理中
  用語説明:
  常駐店番: 常駐先を示す識別子
  常駐元: 他の部店に常駐する部店
  常駐先: 常駐元が常駐する部店
end note

@enduml
```

![一括処理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782003/edaec5e7-09fa-11f7-112f-8b992f03c407.png)