OmniAICreator/Qiita-1.07M huggingface dataset:
【小ネタ】Copilot in Outlookでスケジュール調整ができるようになっている

Copilot in Outlook（Web版OR新しいOutlook）にて、メールからスケジュール調整ができるようになっていたので共有

https://prod.support.services.microsoft.com/ja-jp/office/quickly-create-a-meeting-invitation-from-an-email-discussion-in-outlook-31a44dfa-62bb-4751-82c4-14327a26759f#:~:text=Copilot%20%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%8B%E3%82%89%E4%BC%9A%E8%AD%B0%E5%87%BA%E5%B8%AD%E4%BE%9D%E9%A0%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%201%20Outlook%20%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%AE%E4%BC%9A%E8%A9%B1%E3%82%92%E9%96%8B%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%202%20%E3%83%84%E3%83%BC%E3%83%AB%20%E3%83%90%E3%83%BC%E3%81%A7,%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%80%81Copilot%20%E3%81%8C%E6%8F%90%E6%A1%88%E3%81%97%E3%81%9F%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E5%8F%97%E3%81%91%E5%85%A5%E3%82%8C%E3%81%BE%E3%81%99%20%28%E5%BF%85%E8%A6%81%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E3%80%81%E6%AC%A1%E3%81%AE%E6%89%8B%E9%A0%86%E3%81%A7%E7%B7%A8%E9%9B%86%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%29%E3%80%82%204%20%E4%BC%9A%E8%AD%B0%E5%87%BA%E5%B8%AD%E4%BE%9D%E9%A0%BC%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%80%81%E5%A4%89%E6%9B%B4%E3%82%92%E5%8A%A0%E3%81%88%E3%81%BE%E3%81%99%E3%80%82%20%E6%BA%96%E5%82%99%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%9F%E3%82%89%E3%80%81%20%5B%E9%80%81%E4%BF%A1%5D%20%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

メールを開いた後上部のメニューに「Copilot を使用してスケジュールする」というアイコンが増えています。
あんまりCopilotだと気づきにくいですが、要約機能と区別するためにAIを示す✨で示しているのかな…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/c398a705-46a7-164c-0e7b-9dd99a822d16.png)


押してみると、ポップアップが表示され、メールに入っているメンバーのスケジュール情報（閲覧できる範囲まで）から候補を出してくれます。ん、これってスケジュールアシスタントがちょっと提案してくれるようになっただけかな。
下の部分には
・元ネタのメール
・メールから抽出されたアジェンダ「予定一覧」
・メールの要約「これまでの会議の要約」
がでてきます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/fd660293-cc53-54aa-d86a-358f8b218c61.png)

提案された日程が合わなかった場合は、時間の検索をぽちするとほかの候補日程も出してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/b41e7733-6a90-d4cb-a65f-277f7132e72c.png)

スケジュールアシスタントじゃん、という感じではありますが2－3分かかっていた日程調整が3クリックくらいでできるようになるのは便利ですね。これ、メール起点になってるけど、予定表にも展開してくれないかなぁ～。
rex0220 グリッド表示プラグイン 日付項目の書式設定例

kintone グリッド一覧表示プラグインで、日付項目の書式設定例です。
日付が未入力の場合、背景を赤にします。

# 概要

背景を赤く表示する場合、形式を設定せずに書式を指定してください。
※形式を指定した場合は、書式の指定が無効になります。
また、計算式で日付形式に変換が必要です。

計算式：DATE_FORMAT(日付)
形式：なし
書式：IF(NOT(日付),"{'background-color':'red'}")


![2024-09-10_09h58_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/f9a0589c-c034-1a28-7f67-9c092ec84242.png)


# グリッド一覧表示プラグイン設定

![2024-09-10_10h57_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2335adcc-4bbf-a7c9-ab91-b1bc5ce86ee2.png)

![2024-09-10_10h57_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d8bace76-8b08-0334-875a-1ad5c96cceb5.png)
Android端末（Pixel）でLineモバイルが使えなくなった時の対処方法

### iPhoneが壊れてサブ機のPixel8がメイン機に格上げしたと同時に、Android13では使えていたはず（Pixel7のとき）のLineモバイルでSIMは認識するが、通信回線が使えない状態になって困っていた。
### APNを見返しても公式サイトの様にしているし、なぜかと思いググってみると同じ様に急に使えなくなった人は多いみたい。

:::note info
APNタイプ
iaを追加
:::

これだけで通信できるようになった。
どっかのサイトでまとまっているとわかりやすいと思いQiitaに残そうと思い記事を作成
テストリードL9300(HIOKI)をレビュー

## はじめに
こんにちは、テストリードなんて超久しぶりに購入したbockringです。ずっとHIOKIのテストリード欲しかったのですが、そのL9207シリーズって絶縁キャップが嵌め込み式なんです。**絶対紛失します**。ということでFLUKEの回転式絶縁カバーのが欲しかったのですが、それはEU向けモデルで、日本でも入手できるものの値段が5000円です。テストリードの値段でまともなテスター1台買えてしまうというのは屈辱です。そこらへんのことも含めてぜひ最後まで^_^

https://amzn.to/4b3iqJg

## 経緯
L9300になった理由は先ほども述べた通り**使い勝手が非常に良さそうだから**です。L9207でも高く評価されているコードのしなやかさに、絶縁キャップを失くさない安心感がプラスされています。そして、先端アクセサリーが取り付けられます(公式より)。

私はSANWAのワニ口アダプタを使用していますけど、根本が太いと嵌まらないもんで、L9300は細いので使用できそうだったというのも有ります。

## 到着
**マジで精密機器の置き配はやめてくれんかな(怒)**
テスターでも容赦なく置き配してきますが、本当にやめてほしいです。過去にAmazonで購入したKEWMATE 2012RA(愛用テスター)が置き配で来て驚きましたよ。2万円もするんですし。HIOKI公式ショップで購入すれば良かった…

:::note alert
残念ながら、HIOKIの公式ECサイトは2024年8月31日を以って販売終了となっています。

ミスミやAmazon、そして店頭などで購入する必要があります。

Amazonで買う際は箱破壊は覚悟で購入しましょう。
:::

## 実使用
とりあえず開封。
　**あっ♡ ケーブルの触り心地が最高♡**
これ、ケーブル良いの使ってますね。最高です。永遠に触ってられます。一生のお供にしても良いくらい良さげなテストリードです。

とりあえず0.01Ω単位で抵抗測定が可能なOW18Dに接続して計測してみます(短絡抵抗値)。

本体付属のテストリードは短絡時0.38Ω**ですが、** HIOKI L9300は0.11Ωです。ここら辺は多接点バナナジャックや金メッキが功を奏している雰囲気です。

ちなみに、OW18Dは導通チェックのレスポンスが非常に高速です(HIOKIには敵わんが)。そして僕は思いました。
**「ん、これもしかして接触いいからカチカチ触れさせたらブザー連打できるか？」**
と。
<font color = red>**↓**</font>
できた。

前のテストリードでは、ICクリップを引っ掛けるところより根本側の接触が非常に悪くてその窪みより先でしか抵抗測定はできない印象でした。

しかし、金メッキのお陰もあってかどの部分でも接触は良好(すぎる)ようです。

肝心の変換ですが、嵌り過ぎて間が出来てしまいます(笑) めっちゃ細いやん

## おわりに
画像挿入してから書きます()
Google-gravity本当に検索できるようにした話

どうもお久しぶりですAtsu1209です。
今回はGooglegrabityというサイトで実際にGoogle検索ができるようにしたいと思います。

# Google grabityとは
Google grabityとは検索欄やロゴが重力を帯びて落っこちてくるお遊びサイトです。

サイトURL

https://mrdoob.com/projects/chromeexperiments/google-gravity/

# 今回やりたいこと
もちろんこのサイトはお遊びサイトなので実際には検索できません。
なので、実際に検索できるようにして 重力要素 + 検索ができるとても面白いサイトにしていきます。

:::note warn
##### 注意
たとえお遊びでもコードを書き換えたものを実際に公開してしまうと、
著作権に引っかかってしまう可能性があるので気をつけましょう。
私はローカルで楽しむ前提で作りました。
:::

# 方法
方法は至って簡単です。
Google検索はURLに仕掛けがあって、
`https://www.google.com/search?q=`の`q=`の後ろに検索したいワードを入れるだけなので
`input`の情報をJavaScript側で指定して、`open.window`を使ってウィンドウを開けば簡単。

# 実際に作る
全部で2000行以上あるので、エディターで`<input>`を検索して探す。
```html:index.html
  <form id="form">
  <input id="q" value="" title="Search" autocomplete="off" type="text" maxlength="2048" class="box2d"><br />
  </form>
```
あった

ここにJavaScriptを追加します。

```HTML:index.html
<script>
const form = document.getElementById("form");

form.addEventListener("submit", function (event) {
    event.preventDefault(); 
    const val = document.getElementById("q").value;
    window.open("https://www.google.com/search?q=" + encodeURIComponent(val));
});
</script>
````


# 動作チェック
保存して開いてみた
するとしっかりボタンとかが落っこちてきたが検索欄に`クソコード 大好き`と入力してEnter
するとしっかりGoogleの検索結果が表示されました!

**おわり**
生成AIの比較（Gemini Copilot）

よく使うGeminiとCopilotを比較してみました。

### 質問1
「javascriptを使って何かサンプルコードを書いてください」

* Copilot
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/2e1ddad2-4214-424e-a9b1-bf94eb2fae28.png)

* Gemini
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/c3dd780b-3903-6421-499c-a9bbb569f192.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/395c8de7-482a-5fba-a7e5-765c8acb2f2c.png)

Copilotはコードを1つ提示してくれました。
Geminiは順序立てて説明をしてくれました。また、「さらに学びたい方へ」のような提示もしてくれました。

### 質問2
「株式会社Aに謝罪するメールを考えてください」

* Copilot
```
もちろんです。以下に株式会社Aに対する謝罪メールの例を示します。

件名: 【重要】お詫びと訂正のご連絡

株式会社A [担当者名] 様

平素より大変お世話になっております。株式会社[あなたの会社名]の[あなたの名前]です。

この度は、[具体的な問題やミスの内容]に関しまして、多大なるご迷惑をおかけしましたことを深くお詫び申し上げます。

今回の問題は、[問題の詳細や原因]に起因するものであり、弊社の不手際により貴社にご不便をおかけしましたことを心よりお詫び申し上げます。

現在、再発防止に向けて以下の対策を講じております。

[対策1]
[対策2]
[対策3]
今後このようなことが二度と起こらないよう、社員一同努めてまいりますので、何卒ご容赦賜りますようお願い申し上げます。

改めまして、この度の件に関しまして深くお詫び申し上げますとともに、今後とも変わらぬご愛顧を賜りますようお願い申し上げます。

何かご不明点やご質問がございましたら、どうぞお気軽にご連絡ください。

敬具

[あなたの名前]
[あなたの役職]
[あなたの連絡先]

このような形で、具体的な問題点や対策を明示し、誠意を持って謝罪することが大切です。何か他にお手伝いできることがあれば教えてください。
```

* Gemini
```
株式会社Aへの謝罪メールですね。どのような状況で謝罪したいのか、もう少し詳しく教えていただけますでしょうか？

謝罪メールを作成する上で、以下の情報があるとより適切な文章を作成できます。

どのようなミスを犯してしまったのか: 具体的な内容（例えば、納期遅延、商品の誤配送、連絡ミスなど）
誰に対して謝罪したいのか: 特定の担当者、部署、それとも会社全体か
どのような迷惑をかけてしまったのか: ミスによって発生した具体的な損害や不都合
どのように対応していくのか: 今後の対策や再発防止策
謝罪メールの基本的な構成

件名:
例：〇〇件についてのお詫び
冒頭:
相手への敬称と、自分の会社名、部署名、氏名を記載
今回の件についてお詫びの旨を伝える
本論:
具体的にどのようなミスがあったのかを簡潔に説明
相手に与えた影響や迷惑について深くお詫びする
ミスの原因を簡潔に説明（必要に応じて）
今後の対応策や再発防止策を具体的に示す
結語:
再度お詫びの言葉を述べ、今後の関係維持を願う
連絡先を記載し、何かあれば連絡してほしい旨を伝える
例文

件名：〇〇案件納期遅延についてのお詫び

〇〇株式会社 〇〇様

平素は格別のご高配を賜り、誠にありがとうございます。
株式会社□□の□□と申します。

この度は、〇〇案件の納品を期日通りに行えず、多大なるご迷惑をおかけいたしましたこと、深くお詫び申し上げます。

弊社では、〇〇という理由により、納期遅延が発生してしまいました。
貴社の業務に支障をきたしてしまったこと、誠に申し訳ございません。

つきましては、〇〇（具体的な対応策）を実施し、〇〇日までに納品を完了させていただきたく存じます。
今回の件につきましては、〇〇（責任者の氏名）が責任を持ち、今後の業務に万全を期してまいります。

重ねて、この度は多大なるご迷惑をおかけいたしましたこと、心よりお詫び申し上げます。
今後とも変わらぬご指導ご鞭撻を賜りますようお願い申し上げます。

敬具

株式会社□□
□□部
□□
電話番号：〇〇
メールアドレス：〇〇

上記はあくまで一例です。

あなたの状況に合わせて、内容を修正・追加してください。

ポイント

誠意を込めて: 謝罪の言葉は具体的に、そして心から謝っていることが伝わるようにしましょう。
簡潔に: 長文になると読む気が失せてしまうため、簡潔にまとめることが大切です。
具体的に: いつ、どこで、誰が、何を間違えたのかを具体的に説明することで、誠意が伝わります。
今後の対応策: 具体的な対策を示すことで、再発防止への取り組みが伝わります。
その他

相手側の立場に立って: 相手の気持ちを考え、何が一番伝えたいことなのかを明確にしましょう。
丁寧な言葉遣い: ビジネスシーンでは丁寧な言葉遣いを心がけましょう。
相手の会社名や役職を正しく: 間違えると失礼にあたります。
もしよろしければ、もう少し詳しく状況を教えていただけますでしょうか？
より適切な謝罪メールを作成させていただきます。

例：

どんなミスを犯したか（例：納期が遅れた、商品が間違っていたなど）
どの程度の影響が出たか（例：顧客からのクレーム、業務の遅延など）
いつまでに謝罪メールを送りたいか
普段どのような言葉遣いをされているか（例：丁寧な言葉遣い、カジュアルな言葉遣いなど）
これらの情報に基づいて、あなたにぴったりの謝罪メールを作成します
```

こちらもGeminiがかなり詳しく出してくれました。

### 普段使っていて感じること
* 回数制限
Copilotは30回の回数制限があって途中で切れてしまうこともあります。30回が終わると4回になってしまいます。
Geminiは回数制限はない？と思います。

* 回答スピード
Copilotはそこそこ生成に時間がかかります。
Geminiはかなり早いです。

* 回答の詳しさ
Copilotはある程度返してくれます。
GeminiはCopilot以上に詳しく返してくれます。

自分はこれまでCopilotを使っていましたが、Geminiを使っていこうと思います。
【C#】アプリ内の処理からdllを動的に読み込むサンプルコード【初心者向け】

# 概要
ライブラリ内の処理から、指定されたパスのdll群をまとめて読み込むサンプルコードをつくりました。

# コード
```C#
        /// <summary>
        /// 指定したパスのdllを読み込む
        /// </summary>
        /// <param name="paths">dllのパスのコレクション (ファイル名もしくはフォルダ名を指定可能)</param>
        private void LoadDlls(IReadOnlyCollection<string> paths)
        {
            if (paths == null) return;
            foreach (string path in paths)
            {
                try
                {
                    if (path.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) && File.Exists(path))
                    {
                        // dllファイルを読み込む
                        Assembly.LoadFrom(path);
                    }
                    else if (Directory.Exists(path))
                    {
                        // フォルダ配下のdllファイルを全て読み込む
                        var dllPaths = Directory.GetFiles(path, "*.dll");
                        foreach (string dllPath in dllPaths)
                        {
                            Assembly.LoadFrom(dllPath);
                        }
                    }
                    else
                    {
                        // 読込失敗のためログ出力
                    }
                }
                catch (Exception ex)
                {
                    // エラー処理

                    // 処理は継続
                    continue;
                }
            }
        }
```

# 使い方等
### 仕様
dllファイルもしくはdllファイルが格納されたフォルダまでの絶対パスをもとに、dllファイルを読み込む

### 引数
引数には下記のパスのコレクションが渡される
- dllファイルを指定する場合
    - 「hoge.dll」「huga.dll」のように、拡張子「.dll」まで含んだ絶対パス
- フォルダを指定する場合
    - 「piyo」のように、拡張子を含まずフォルダ名で終わる絶対パス
    - `C:\Sample\piyo`や`C:\Sample\piyo\`のように、パスの末尾の「\」有無はどちらでも可

### その他
- Windowsではファイルの拡張子の小文字、大文字は区別されないため (ファイル・フォルダ名自体もだが) 、`StringComparison.OrdinalIgnoreCase`を指定し区別しない比較を行う

### 使い方のサンプルコード
```C#
    var importDllPath = new String[3]
    {
        @"C:\Sample1\Hoge",
        @"C:\Sample2\Fuga\Fuga.dll",
        @"D:\Sample\piyo"
    };

    LoadDlls(importDllPath);     
```
サンプルコードは記載するまでもないですが、本来は外部ファイル等にパスを定義しておき、プログラムで読み込んでからロードする形が良いと思います。`IReadOnlyCollection`で受けているので、当たり前ですがListや配列どちらでも渡せます。
Docker + Postgres - ユーザー名 ( POSTGRES_USER ) やパスワード ( POSTGRES_PASSWORD ) を変更しても反映されない場合

# 問題

- Docker + Postgres 構成でユーザー名・パスワードを変更しても反映されない
- 最初に設定したユーザー・パスワードが使われ続けてしまう

DB接続のエラー例

```sh
psql -h localhost -p 5432 -U postgres
```

```sh
Password for user postgres:
psql: error: FATAL:  password authentication failed for user "postgres"
```

# 結論

volume でDBを永続化していると、初回に作られたユーザー・パスワードがそのまま使われ続けてしまう

解決策としては、次のような手段が考えられる


- 永続化しないようにして試す 
- docker volume を削除する ( `docker volume ls` `docker volume rm <ボリューム名>` )
- Postgres のユーザー名・パスワードを直接変更する (未検証)


# docker-compose.yml 

問題が起きた `docker-compose.yml` の例

永続化をしないようにすれば毎回、設定が反映される

```diff
services:
  db:
    image: postgres:15
    container_name: postgres
    ports:
      - 5432:5432
-    volumes:
-      - db-store:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
-volumes:
-  db-store:
```


なお docker-compose の設定を変えたらコンテナは再起動させること

`docker-compose down`
`docker-compose up`



# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
windowsでiverilog その154

# 概要　
windowsでiverilogやってみた。
RP2040な、verilog見つけたので、テストベンチ書いてみた。

# 投入したpioasm

```
set pins 1
set pins 0


```

# サンプルコード

```
module test();
	localparam NONE = 0;
	localparam INSTR = 1;
	localparam PEND = 2;
	localparam PULL = 3;
	localparam PUSH = 4;
	localparam GRPS = 5;
	localparam EN = 6;
	localparam DIV = 7;
	localparam SIDES = 8;
	localparam IMM = 9;
	localparam SHIFT = 10;
	reg clk;
	reg reset;
	reg [31:0] din;
	reg [4:0] index;
	reg [3:0] action;
	reg [1:0] mindex;
	reg [31:0] gpio_in = 0;
	reg [15:0] program[0:31];
	wire [31:0] gpio_out;
	wire [31:0] gpio_dir;
	wire [31:0] dout;
	wire [3:0] tx_full;
	wire [3:0] rx_empty;
	wire [5:0] plen = 2;
	wire [23:0] div = 24'h0280;
	wire [31:0] pin_grps = 32'h04000000;
	wire [31:0] exec_ctrl = 32'h00001000;
	task act(input [3:0] a, input [31:0] d);
		begin
			@(negedge clk);
			action = a;
			din = d;
			@(posedge clk);
		end
	endtask
	pio pio_1(.clk(clk), .reset(reset), .action(action), .index(index), .mindex(mindex), .din(din), .dout(dout), .gpio_in(gpio_in), .gpio_out(gpio_out), .gpio_dir(gpio_dir), .tx_full(tx_full), .rx_empty(rx_empty));
	integer i;
	initial
	begin
		clk = 1'b0;
	end
	initial
		$readmemh("./test.mem", program);
	initial
	begin
		reset = 1'b1;
		repeat(2) @(posedge clk);
		reset = 1'b0;
		for (i = 0; i < plen; i++)
		begin
			index = i;
			act(INSTR, program[i]);
		end
		mindex = 0;
		act(PEND, exec_ctrl);
		act(DIV, div);
		act(GRPS, pin_grps);
		act(EN, 1);
		act(NONE, 0);
		repeat(100) @(posedge clk);
		$finish;
	end
	always
	begin
		#20 clk = !clk;
	end
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, test);
		$display(" ac  din  out ");
		$monitor(" %h  %h  %h ", action, din, gpio_out);
	end
endmodule





```

# 実行結果

```
>vvp a.out
WARNING: pio0.v:873: $readmemh(./test.mem): Not enough words in the file for the requested range [0:31].
VCD info: dumpfile test.vcd opened for output.
 ac  din  out
 x  xxxxxxxx  xxxxxxxx
 x  xxxxxxxx  00000000
 1  0000e101  00000000
 1  0000e100  00000000
 2  00001000  00000000
 7  00000280  00000000
 5  04000000  00000000
 6  00000001  00000000
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
 0  00000000  00000001
 0  00000000  00000000
pio0.v:891: $finish called at 4340 (1s)

```

以上。
OBIEE/OASでの tnsnames.ora の場所

# はじめに
OBIEE（**Oracle BI Enterprise Edition**）やOAS（**Oracle Analytics Server**）からOracle Databaseへ接続するにあたり、tnsnames.ora を編集したいのにファイルがどこにあるかわからない、ということがあるかもしれません。
以下は、Linux版を題材にした tnsnames.ora の場所です。

:::note
tnsnames.oraの場所は、構成変更によりデフォルトから変更されている可能性もあります。
また、OBIEEやOASのバージョンによって違いがある場合もあります。
:::

# OBIEE 12.2.1.4
/u01/app/bieeディレクトリにインストールしてあります。

## 探してみる
```shell
$ find /u01/app/biee -name tnsnames.ora
/u01/app/biee/bi/modules/oracle.bi.servicelcm/templates/tnsnames.ora
/u01/app/biee/user_projects/domains/bi/bidata/components/core/serviceinstances/ssi/oracledb/tnsnames.ora
```

2箇所にありました。
どちらも中身は空っぽでした。

```shell
$ cat /u01/app/biee/bi/modules/oracle.bi.servicelcm/templates/tnsnames.ora
# Add TNS entries to be loaded by Oracle Business Intelligence Enterprise Edition here.
$
$ cat /u01/app/biee/user_projects/domains/bi/bidata/components/core/serviceinstances/ssi/oracledb/tnsnames.ora
# Add TNS entries to be loaded by Oracle Business Intelligence Enterprise Edition here.
$
```
実際に OBIEEに読み込まれるのは、こちらです。
*$BI_DOMAIN*/bidata/components/core/serviceinstances/ssi/oracledb/tnsnames.ora

# OAS 2024
/u01/app/oasディレクトリにインストールしてあります。

## 探してみる
```shell
$ find /u01/app/oas -name tnsnames.ora
/u01/app/oas/bi/modules/oracle.bi.servicelcm/oracledb/tnsnames.ora
/u01/app/oas/network/admin/samples/tnsnames.ora
```

こちらも2箇所にありました。
*$OAS_HOME*/bi/modules/oracle.bi.servicelcm/oracledb/tnsnames.oraの中身を確認してみます。

```shell
$ cat /u01/app/oas/bi/modules/oracle.bi.servicelcm/oracledb/tnsnames.ora
# Add TNS entries to be loaded by Oracle Business Intelligence Enterprise Edition here.
```

ここに必要なエントリを記入します。

# 参考情報
- [Where Are The Directory Locations For 'tnsnames.ora' or 'sqlnet.ora' Files In Oracle Business Intelligence or Oracle Analytics Server? (Doc ID 2068474.1)](https://support.oracle.com/knowledge/Enterprise%20Performance%20Management%20and%20Business%20Intelligence/2068474_1.html)
Ruby gem 開発！中国語（簡体字・繁体字）と日本語を判別するgemを作ってみた（中編）

こんにちは、九兵衛です。前回の記事 (https://qiita.com/kyubey1228/items/e1ade213a04daad6713e) では、Ruby gemの基本的な構造と設定について説明しました。
今回は、実際にgemの中身を実装していく過程を共有したいと思います。
正直なところ、この過程は予想以上に複雑で、多くの発見と驚きがありました。

**1. データファイルの準備と驚きの発見**

まず最初に、中国語の文字を判別するためのデータファイルを用意しました。主に2つのファイルを使用しています：

1. `Unihan_Variants.txt`: Unicode consortiumが提供する中国語変体字のデータ
2. `traditional_chinese_list.txt`: 追加の繁体字リスト

これらのファイルを詳しく調べていく中で、私は中国語の文字の複雑さに圧倒されました。例えば、「門」という字は日本語でも使いますが、中国語では簡体字で「门」と書きます。しかし、「門」自体も繁体字として使われているのです。このような複雑な関係が無数にあることを知り、言語の奥深さを実感しました。

また、`Unihan_Variants.txt`ファイルの巨大さに驚きました。このファイルは約20MBもあり、単純に全てをメモリに読み込むのは非効率だと気づきました。ここで、ファイルの効率的な読み込み方法を考える必要があることを学びました。

**2. ChineseProcessorクラスの実装と性能の壁**

中国語の文字を処理するための`ChineseProcessor`クラスを実装する際、最初は単純に全てのデータをハッシュに格納しようと考えていました。しかし、実際に実装してみると、メモリ使用量が膨大になり、処理速度も遅くなってしまいました。

ここで、Rubyの`Set`クラスの存在を思い出しました。`Set`は重複を許さないコレクションで、要素の存在確認が高速です。これを使うことで、メモリ使用量を抑えつつ、高速な処理を実現できました。この発見は大きな breakthrough でした！

```ruby
module UnihanLang
  class ChineseProcessor
    def initialize
      @zh_tw = Set.new
      @zh_cn = Set.new
      @common = Set.new
      load_chinese_characters
    end

    # ... (その他のメソッド)
  end
end
```

また、データの読み込みを初期化時に一度だけ行うことで、パフォーマンスを大幅に向上させることができました。これは、「遅延評価」と「事前計算」のトレードオフを考える良い機会となりました。

**3. 言語判定ロジックの難しさ**

`Unihan`クラスを実装する際、最も頭を悩ませたのは言語判定のロジックでした。単純に繁体字と簡体字の数を数えるだけでは不十分で、共通字の扱いや、テキスト全体が中国語でない場合の処理なども考慮する必要がありました。

特に、以下のような場合の処理に悩みました：

1. 繁体字と簡体字が混在している場合
2. ほとんどが共通字で構成されているテキスト
3. 中国語以外の文字（例：英語や日本語）が混ざっている場合

これらの問題に対処するため、最終的に以下のようなロジックを実装しました：

```ruby
def language_ratio(text)
  only_tw_chars = text.chars.count { |char| @chinese_processor.only_zh_tw?(char) }
  only_cn_chars = text.chars.count { |char| @chinese_processor.only_zh_cn?(char) }
  chinese_chars = text.chars.count { |char| @chinese_processor.chinese?(char) }

  return :unknown unless chinese_chars == text.length
  return :tw if only_tw_chars > only_cn_chars
  return :cn if only_cn_chars >= only_tw_chars

  :unknown
end
```

このロジックを考案する過程で、言語判定の難しさと面白さを実感しました。
また、エッジケースを考慮することの重要性も学びました。

**4. テスト駆動開発の威力**

gem開発を進める中で、テスト駆動開発（TDD）の重要性を強く感じました。最初はテストを書くのが面倒に感じていましたが、複雑な言語判定ロジックを実装する際、テストがあることで自信を持ってリファクタリングできました。

特に、以下のようなエッジケースのテストが役立ちました：

```ruby
describe '#determine_language' do
  it '繁体字と簡体字が混在するテキストを正しく判定する' do
    expect(unihan.determine_language('這是簡体字和繁體字的混合')).to eq('ZH_TW')
  end

  it '全て共通字で構成されたテキストを正しく判定する' do
    expect(unihan.determine_language('中文')).to eq('ZH_CN')  # デフォルトで簡体字と判定
  end

  it '中国語と英語が混在するテキストを正しく判定する' do
    expect(unihan.determine_language('This is 中文 mixed with English')).to eq('Unknown')
  end
end
```

これらのテストを書くことで、自分のロジックの欠陥を早期に発見し、修正することができました。TDDの素晴らしさを実感した瞬間でした。

**まとめと次回予告**

今回のgem開発を通じて、当初は単純な作業だと思っていましたが、実際に取り組んでみると、予想以上に奥が深く、多くの学びがありました。

次回の完結編では、gemのパッケージング、公開の過程、そして開発中に直面した更なる課題とその解決方法について詳しく説明します。また、このgemを実際に使用する例も紹介し、将来の展望についても触れる予定です。

言語処理の世界はまだまだ探求の余地がありそうです。次回もお楽しみに！
Databricks にて 1899-12-31 01:18:00.0000000 のような小数点以下の秒を含む日時をフォーマット指定して CAST する方法

## 概要

Databricks にて 1899-12-31 01:18:00.0000000 のような小数点以下の日時をフォーマット指定して CAST する方法を共有します。

## 実行方法

### `yyyy-MM-dd HH:mm:ss.SSSSSSS`と指定する方法

```sql
%sql
SELECT
  CAST('1899-12-31 01:18:00.0000000' AS timestamp),
  to_timestamp('1899-12-31 01:18:00.0000000', 'yyyy-MM-dd HH:mm:ss.SSSSSSS')
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3cc043f3-42d9-af11-7797-3bb4b0c3369c.png)
paiza.ioでelixir その323

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。

# 練習問題
RP2040のpioasmのアセンブラを書け。

# 投入したソース

```
set pins 1
set pins 0

```

# 期待するコード

```
E001
E000
```

# サンプルコード

```

defmodule Asm do
	def set(s, v) do
	    {v, _} = Integer.parse(v)
	    cond do
	    s == "pins" ->
	        <<7::3, 0::5, 0::3, v::5>>
	    s == "pindirs" ->
	        <<7::3, 0::5, 4::3, v::5>>
	    s == "x" ->
	        <<7::3, 0::5, 1::3, v::5>>
	    s == "y" ->
	        <<7::3, 0::5, 2::3, v::5>>
	    end
	    |> Base.encode16
	    |> IO.puts
	end
    def enc(str) do
        s = String.split(str, " ")
        cond do
        Enum.at(s, 0) == "set" ->
	        set(Enum.at(s, 1), Enum.at(s, 2))
	    true ->
            IO.puts("ng")
        end
    end
end

Asm.enc("set pins 1")
Asm.enc("set pins 0")


```

# 成果物


https://paiza.io/projects/T01ICZIo915aGnd5T2Hv_A


以上。
Amazon CloudWatch の概要と基本

### モニタリングとオブザーバビリティ

「モニタリング」という言葉はよく聞くかと思いますが、「オブザーバビリティ」はまだ耳慣れない方もいるかもしれません。  
**オブザーバビリティ**は、日本語では「可観測性」とも呼ばれ、システムで何が起こっているかを把握できる状態を指します。システムを計測して、**メトリクス**、**ログ**、**トレース**などのテレメトリーデータを収集し、システムの動作を理解し改善を行います。

### モニタリングとオブザーバビリティの違い

- **モニタリング**は、システムが正常に動作しているかを監視し、エラー対応を目的とします
- **オブザーバビリティ**は、システムの計測項目を継続的に増やし、新しいインサイトを得ることで、未知の障害やシステム全体の改善に役立ちます

### オブザーバビリティを支える3つの要素

1. **メトリクス**：システム状態を数値で表し、傾向の把握に役立ちます
2. **ログ**：イベント情報をタイムスタンプと共に記録し、システムの解析に使います
3. **トレース**：分散システム内のトランザクションを追跡し、問題箇所を特定します

AWSでは、これらをネイティブにサポートするサービスを提供しています。

- **メトリクス**：Amazon CloudWatch Metrics
- **ログ**：Amazon CloudWatch Logs
- **トレース**：AWS X-Ray

### クラウドウォッチの全体像

Amazon CloudWatchは、AWSのオブザーバビリティの中心的なサービスです。CloudWatchでは、以下の機能を活用して監視を行います。

- **ダッシュボード**：システムのパフォーマンスを視覚化
- **アラーム**：異常を検知して通知
- **ロググループ**：ログの管理と分析
- **メトリクス**：システム状態の傾向を把握

また、**Amazon EventBridge**を使用することで、特定のイベントに応じた自動アクションも設定可能です。

### オープンソースとの連携

AWSネイティブのサービスを使用するだけでなく、オープンソースツールとも連携が可能です。例えば、**Amazon Distro for OpenTelemetry**を利用して、CloudWatchやX-Rayにデータを送信することができます。

### クラウドウォッチの操作

まずは、AWSのマネジメントコンソールで「CloudWatch」と検索し、左側のメニューから以下の機能にアクセスできます。

- **メトリクス**：現在のシステム状態を表示
- **ロググループ**：システムログの管理
- **アラーム**：異常検知時の通知設定

各機能を使いこなすことで、システムの健全性を保つ監視体制を構築できます。

### CloudWatchの活用例

メトリクスの活用方法として、EC2インスタンスの標準メトリクスがあります。デフォルトで5分間隔のデータを取得しますが、詳細モニタリングを有効化することで1分間隔のデータ取得が可能です。

また、メトリクスデータの保持期間にも注意が必要です。短い期間のデータポイントは短期間しか保存されないため、適切な設定が求められます。

### まとめ

Amazon CloudWatchを活用することで、AWS上のシステムの可観測性を高め、ビジネス目標の達成にも役立てることが可能です。まずは基本的な使い方を理解し、実際の運用に活かしてみてください。
MIMEに関するメモ

# MIMEとは
Multipurpose Internet Mail Extensionsタイプの略称

インターネット上で送受信されるファイルの種類を識別するための標準的なフォーマット

MIMEタイプは、ブラウザやサーバーがファイルを正しく処理できるように、ファイルの内容を伝えるために使用されます

これにより、画像、テキスト、ビデオ、音声など、さまざまなファイルが正しく表示・再生されます

```
タイプ/サブタイプ
```
MIMEタイプはHTTPヘッダーの一部として、またはメールの送受信時に使用され、サーバーやクライアントが正しいアクション（表示、ダウンロード、実行など）を取れるようにする役割を果たします。

# Content-Typeの例

### htmlのレスポンス
```
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 138
Connection: keep-alive

<html>
  <head>
    <title>Example</title>
  </head>
  <body>
    <h1>Hello, World!</h1>
  </body>
</html>
```
### jsonのレスポンス
```
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 47
Connection: keep-alive

{
  "name": "John Doe",
  "age": 30
}
```
### pdfのレスポンス
```
HTTP/1.1 200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="example.pdf"
Content-Length: 102400
Connection: keep-alive

(binary PDF data)
```



# よくあるMIMEの書き方

### テキスト形式ファイル
text/plain : プレーンテキストファイル
text/html : HTMLファイル

### 画像形式ファイル
image/jpeg : JPEG形式の画像
image/png : PNG形式の画像
image/gif : GIF形式の画像

### 動画形式ファイル
video/mp4 : MP4形式の動画
video/webm : WebM形式の動画

### 音声形式ファイル
audio/mpeg : MP3形式の音声
audio/ogg : OGG形式の音声

### アプリケーション形式ファイル
application/json : JSONデータ
application/pdf : PDFファイル
application/zip : ZIP形式のアーカイブ

# 参考サイト

https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types

MIMEの書き方が多すぎて、全部覚える必要がないと思う～

https://www.iana.org/assignments/media-types/media-types.xhtml#font
SQLAlchemyでの一括更新の実装方法

今日は、SQLAlchemyを使って一括更新を行う方法についてご紹介します。具体的には、複数のレコードを一度に更新するためのコードと、そのロジックについて解説します。

## 一括更新の要件
データベースに対して一括でレコードを更新する場合、通常は以下のような操作が必要です

### 対象のレコードを指定
更新したいレコードを特定する条件を設定します。
### 更新内容の指定
各レコードに適用する更新内容を定義します。
### 効率的な処理
大量のデータに対して効率的に更新処理を行います。

今回は、SQLAlchemyを用いて一括更新を行う方法をご紹介します。以下に示すのは、指定した条件に基づいてレコードを一括更新するクラスメソッドです。

コード例
```python
from sqlalchemy import update
from sqlalchemy.orm import Session
import datetime

class MyModel:
    @classmethod
    def update_all(cls, update_target_list):
        stmt = (
            update(cls)
            .where(cls.del_flg == False)
            .values(
                {
                    "status": "1",
                    "update_date": datetime.datetime.now(),
                    "update_id": "system",
                }
            )
        )
        db.session.execute(
            stmt, update_target_list, execution_options={"synchronize_session": False}
        )
```
### コードの解説
### update_all メソッド

このメソッドは、MyModel クラスの全てのインスタンスを一括で更新するクラスメソッドです。メソッドの引数 update_target_list には、更新対象のレコードに関する情報が渡されます。
#### update_target_listのフォーマット
update_target_list には、更新対象のレコードを特定する情報が含まれた辞書のリストを指定する必要があります。具体的には、以下のようなフォーマットである必要があります
```python
update_target_list = [
    {"card": "1"},
    {"card": "2"}
]
```
### update ステートメントの作成

update(cls) を使って、cls で指定されたモデルクラスに対する更新ステートメントを作成します。
where(cls.del_flg == False) により、削除フラグが False であるレコードだけを対象にします。
### values メソッドでの更新内容の指定

.values(...) を使って、更新内容を指定します。この例では、status フィールドを "1" に、update_date を現在の日付に、update_id を "system" に設定します。
### db.session.execute での実行

stmt により作成された更新ステートメントを、db.session.execute で実行します。
update_target_list は、特定のレコードに関連する情報を含むリストです。
execution_options={"synchronize_session": False} オプションを使用して、セッションの同期処理を無効化し、大規模な更新処理を効率的に行います。
一括更新の利点と注意点
### 効率性

一度のクエリで複数のレコードを更新できるため、データベースのトランザクション数を減少させ、パフォーマンスが向上します。
### 一貫性

更新内容が全ての対象レコードに一貫して適用されるため、データの整合性が保たれます。
### 注意点

大規模な一括更新は、データベースの負荷を増大させる可能性があります。そのため、必要に応じて適切なインデックスの作成や、トランザクションの分割を検討してください。
### まとめ
SQLAlchemyを使った一括更新は、データベースの効率的な操作において非常に強力なツールです。適切に設計されたクエリとメソッドにより、大量のデータを迅速に更新することができます。是非、自身のプロジェクトに合わせてカスタマイズしてみてください！
Lambdaからタイムアウト時間を取得する

### Lambdaからタイムアウト時間を取得する
以前実装した内容でLambdaからとあるAPIを呼び出すというものがありました。
そのAPIは返答に時間がかかる場合があり、Lambdaのタイムアウト時間を超過してしまうこともあり、対策を打ちました。
対策としてはLambdaのタイムアウト時間に到達する前にカスタムのエラーを出力するようにしました。ここでLambdaのfunction内でタイムアウト時間を取得する必要があったので共有します。

### 実際のコード
* 呼び出される側
`LambdaClient`と`GetFunctionCommand `を使用してLambdaの情報の詳細を取得していきます。
※`rccApiError`はカスタムのエラーなので気にしないでください
`getLambdaDetails`関数でLambda関数の詳細を取得しますが、取得する際にLambdaの関数名を与えます。
後は`send`コマンドを使った結果をreturnします。
```javascript
const { LambdaClient, GetFunctionCommand } = require('@aws-sdk/client-lambda')
const rccApiError = require('customerror')

const REGION = process.env.AWS_REGION || ''

const client = new LambdaClient({ region: REGION })

/**
 * 指定したLambda関数の詳細情報を取得
 * @param {string} functionName 取得対象のLambda関数の名前
 * @returns {Promise<Object>} Lambda関数の詳細情報を含むオブジェクト
 * @throws {rccApiError} Lambda関数が見つからない場合、その他のエラーが発生した場合にスロー
 */
exports.getLambdaDetails = async (functionName) => {
    try {
        const command = new GetFunctionCommand({ FunctionName: functionName })
        const response = await client.send(command)

        return response
    } catch (error) {
        throw new rccApiError(400, error)
    }
}
```

* 呼び出す側
`getLambdaDetails`にLambda関数名を与えて取得します。
詳細が取得できるので、その中から`lambdaDetails.Configuration.Timeout`でタイムアウトを取得できます。
```javascript
const sharedLambdaDetails = require('sharedLambdaDetails')

const lambdaDetails = await sharedLambdaDetails.getLambdaDetails(SYNCHRONIZE_FUNC_NAME)
const lambdaTimeout = lambdaDetails.Configuration.Timeout
```
paizaラーニング問題集「ドーナツ」を解いてみた

▼感想：

生地に含まれるチョコの数の累積和から、
生地の穴に含まれるチョコの数の累積和を減算しました。
累積和の計算方法のやりかたを踏まえて、本問を解くことができました。

▼コード：

    ########## 処理0(準備) インプット,リスト定義など ###########

    H,W,N = map(int,input().split())

    # sumC: チョコの数の累積和格納用リスト
    C = [[0 for j in range(W)] for i in range(H)]
    sumC = C

    ########## 処理1 チョコの数の累積和格納 ##########

    for i in range(H):

        C[i] = list(map(int,input().split()))
        sumC[i][0] = C[i][0]
        for j in range(1,W):
            sumC[i][j] = sumC[i][j-1] + C[i][j]

    ########## 処理2 生地に含まれるチョコの数算出 ##########
    
    for _ in range(N):
    
        y,x,B,S = map(int,input().split())
    
        # 生地の中心座標
        yc = y - 1
        xc = x - 1
    
        # 生地の穴の開始位置
        y_hs = yc - S//2
        x_hs = xc - S//2

        # 生地の開始位置
        y_s = yc - B//2
        x_s = xc - B//2

        # ctotal_tmp: 生地y_i行目に存在するチョコの数格納用変数
        # ctotal: 生地に存在するチョコの数格納用変数
        ctotal = 0
        ctotal_tmp = 0
    
        for i in range(y_s,y_s+B):

            # y_i行目に生地の穴が存在しない
            if y_hs > i or i > y_hs+S-1:
                if x_s == 0:
                    ctotal_tmp = sumC[i][x_s+B-1]
                else:
                    ctotal_tmp = (sumC[i][x_s+B-1] - sumC[i][x_s-1])

            # y_i行目に生地の穴が存在する
            else:

                #anasum: 生地の穴の部分に存在するチョコの数格納用変数
                anasum = sumC[i][x_hs+S-1] - sumC[i][x_hs-1]
                
                if x_s == 0:
                    ctotal_tmp = sumC[i][x_s+B-1] - anasum
                else:
                    ctotal_tmp = (sumC[i][x_s+B-1] - sumC[i][x_s-1]) - anasum
        
        ctotal += ctotal_tmp
                
    print(ctotal)
MySQLで期間の重複をグループ化するクエリの解説

今日は、MySQLを使って期間の重複をグループ化する方法について解説します。具体的には、利用開始日 (PERIOD_STT) と利用終了日 (PERIOD_END) が重複する期間を統合し、一意のグループとして扱う方法をご紹介します。

# テーブルの構成
まず、以下のようなテーブル tbl を例にして考えます：

```
NUMBER	PERIOD_STT	PERIOD_END
1	2024-01-01	2024-03-01
2	2024-02-01	2024-03-01
3	2024-03-01	2024-06-01
```

このテーブルには、利用開始日と利用終了日が記録されています。これらの期間が重複している場合には、それらを統合して1つのグループとしてまとめたいと考えています。

## クエリの構成
以下に示すクエリでは、期間が重複するデータをグループ化し、最終的に統合した期間を取得する方法を説明します。

```sql
WITH t1 AS (
    SELECT
        tbl.NUMBER AS number,
        tbl.PERIOD_STT AS period_stt,
        tbl.PERIOD_END AS period_end,
        LAG(tbl.PERIOD_STT) OVER (PARTITION BY tbl.NUMBER ORDER BY tbl.PERIOD_STT, tbl.PERIOD_END) AS lag_STT,
        LAG(tbl.PERIOD_END) OVER (PARTITION BY tbl.NUMBER ORDER BY tbl.PERIOD_STT, tbl.PERIOD_END) AS lag_END
    FROM
        tbl
),
t2 AS (
    SELECT
        number,
        period_stt,
        period_end,
        MIN(lag_STT) OVER (PARTITION BY number ORDER BY period_stt, period_end) AS min_lag_STT,
        MAX(lag_END) OVER (PARTITION BY number ORDER BY period_stt, period_end) AS max_lag_END
    FROM
        t1
),
t3 AS (
    SELECT
        number,
        period_stt,
        period_end,
        SUM(
            CASE
                WHEN period_stt <= max_lag_END AND period_end >= min_lag_STT THEN 0
                ELSE 1
            END
        ) OVER (PARTITION BY number ORDER BY period_stt, period_end) AS grp_key
    FROM
        t2
),
t4 AS (
    SELECT
        MAX(number) AS number,
        MIN(period_stt) AS period_stt,
        MAX(period_end) AS period_end
    FROM
        t3
    GROUP BY
        grp_key
),
t5 AS (
    SELECT
        t4.number,
        t4.period_stt,
        t4.period_end
    FROM
        t4
    INNER JOIN
        t1
    ON  t4.number = t1.number
)
SELECT
    t1.*
FROM
    t1
    LEFT OUTER JOIN
        t5
    ON  t5.number = t1.number
WHERE
    t5.number IS NULL;
```
## クエリの解説
### t1サブクエリ

各行に対して、前の行の利用開始日 (lag_STT) と利用終了日 (lag_END) を取得します。これにより、重複する期間を検出する準備をします。
### t2サブクエリ

各行に対して、グループ化の基準となる最小の利用開始日 (min_lag_STT) と最大の利用終了日 (max_lag_END) を計算します。
### t3サブクエリ

period_stt が max_lag_END 以下で、かつ period_end が min_lag_STT 以上の場合には、同じグループに属するものとしてカウントします。重複がある場合には grp_key が同じになります。
### t4サブクエリ

grp_key でグループ化し、各グループの最小の利用開始日と最大の利用終了日を取得します。
### t5サブクエリ

t4 の結果と t1 を内部結合し、最終的なグループ化された結果を取得します。
### 最終クエリ

t1 と t5 を左外部結合し、t5 に含まれていない行を抽出します。これにより、グループ化されなかった（つまり、重複がなかった）元の期間データが取得されます。
## 結果
例えば、以下のようにデータがあった場合：

```
NUMBER	PERIOD_STT	PERIOD_END
1	2024-01-01	2024-03-01
2	2024-02-01	2024-03-01
3	2024-03-01	2024-06-01
```
このクエリの結果、以下のように重複した期間が統合された結果が得られます：

```
NUMBER	PERIOD_STT	PERIOD_END
1	2024-01-01	2024-03-01
3	2024-03-01	2024-06-01
```
このようにして、利用開始日と利用終了日が重複しているデータを一つのグループとして統合することができます。クエリの各ステップを理解し、適切な集約処理を行うことで、重複を適切に処理できます。
Copilot のまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)



+ [Einstein Copilot Actions (Beta)](https://qiita.com/Keiji_otsubo/items/498f9effeeffaa8396d9)
+ [Outlook の Copilot for Sales](https://qiita.com/Keiji_otsubo/items/efae69b0db0ae52d5ed0)

# トレイルヘッド

+ [Einstein Copilot のトレイルヘッド](https://qiita.com/Keiji_otsubo/items/0db043d2fa23ecdf058a)
+ [Module : Einstein Copilot](https://qiita.com/Keiji_otsubo/items/7885b4cb4587b01c8119)
+ [Quick Start: Einstein Copilot Connect Your Flows to Einstein Copilot](https://qiita.com/Keiji_otsubo/items/8e9407ef77b01a0c5b30)
+ [Connect Data Cloud to Copilot and Prompt Builder](https://qiita.com/Keiji_otsubo/items/78b1fead573b317f8b61)


# エラー

+ [Unable to Assign Custom action to Copilot](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erMD9SAM)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/224e24a9-e2fe-2cc2-3f0d-8265420a6767.png)

:::note
If anyone still have the old version of Copilot, simply Toggle Copilot Off and then back On again. This is different from deactivating/activating Copilot in the Builder.

This action will help resolve issues that is caused by an outdated version of Copilot.

古いバージョンの Copilot をまだお持ちの場合は、Copilot をオフにしてから、再度オンに切り替えてください。これは、ビルダーで Copilot を非アクティブ化/アクティブ化することとは異なります。

このアクションは、Copilot の古いバージョンによって発生する問題を解決するのに役立ちます。
:::

+ [I cant find Einstein Copilots in Search](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007erRgg)

:::note
search for Agents under Einstein Generative AI>Agent Studio; there you can find the Einstein Copilot for Salesforce toggle
:::

+ [Einstein Copilot を使用したリクエストに対して、次の応答が返されます: ケース番号 '00646655' の概要を提供してください - 応答 申し訳ありませんが、リクエストに対応できません。他にご質問がある場合や、他のサポートが必要な場合は、お知らせください。(S](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000o6fd)

:::note alert
Provide summary of Case number '00646655' -response Sorry, I cannot handle your request. If you have any other questions or need assistance with something else, please let me know. (S
:::

:::note
ログインしたユーザーにはそのレコードへのアクセス権がないため、Einstein Copilot は要求されたケースを取得できません。ログインしたユーザーにアクセス権がある場合は、Einstein Copilot のケース フィールドが有効になっていないことを確認してください。 
:::


# 未解決

+ [Copilot / Agents - Why can I not add an action to a topic?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifno4)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f4a32d61-b99c-4f9d-37c0-387b439fdd9c.png)
Arduino UNO 3でソート(並び替え)して遊ぶ




目的
おりる順で並び替えをする


いろいろ
直線探索で大きいのを見つけていく
ドラクエ1的には、ちょつと違うけどえんでんぐが流れるレベル
(クイックソートとかもあるけど)


![o_coq380.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/065b3592-8346-d9eb-065e-e6a29c84c42e.jpeg)




```c++


#include <Arduino.h>

//max_wo_sagasu_UNO_1


//初期化
// the setup routine runs once when you press reset:
void setup() {

  //シリアルポートの初期化
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

}//setup


//配列の個数
#define n 20

//メインループ
// the loop routine runs over and over again forever:
void loop() {

  //配列の定義
  int a[n] = {
    67, 36, 69, 73, 51, 55, 40, 43, 29, 35,
    70, 49, 34, 01, 41, 41, 53, 67, 34, 03
  };

  int t = 0; //テンポラリー(一時領域)
  for (int j = 0; j < (n - 1); j++) { //大きい順をひとつづつ決める
    for (int i = (j + 1); i < n; i++) { //直線探索
      if (a[i] > a[j]) { //大きいときは、入れ替える
        t = a[i];
        a[i] = a[j];
        a[j] = t;
      }//endif
    }//for i
  }//for j

  //結果の表示
  // print out the value you a[]:
  for (int i = 0; i < n; i++) {
    Serial.print(a[i]);
    Serial.print(',');
  }//for
  Serial.println();
  delay(1000);        // delay in between reads for stability

}//loop


```
paiza.ioでelixir その322

# 概要
paiza.ioでelixirやってみた。
練習問題、やってみた。
実装編

# 練習問題
RP2040のpioasmのディスアセンブラを書け。

# 投入するコード

```
E001
E000
```

# 期待する結果

```
set pins 1
set pins 0

```

# サンプルコード

setを実装
```


defmodule Dasm do
    def dt(v) do
        cond do
        v == 0 ->
            IO.write("pins ")
        v == 1 ->
            IO.write("x ")
        v == 2 ->
            IO.write("y ")
        v == 4 ->
            IO.write("pindirs ")
        true ->
            IO.write("non ")
        end
    end
    def da(v) do
        IO.write(v)
        IO.write(" ")
    end
    def ds(v) do
        if v == 0 do
            IO.puts("")
        else
            IO.puts("[#{v}]")
        end
    end
    def decode(<<>>) do
    
    end
    def decode(<<0::3, a::13 >>) do
        IO.puts("ok0")
    end 
    def decode(<<1::3, a::13 >>) do
        IO.puts("ok1")
    end 
    def decode(<<2::3, a::13 >>) do
        IO.puts("ok2")
    end 
    def decode(<<3::3, a::13 >>) do
        IO.puts("ok3")
    end 
    def decode(<<4::3, a::13 >>) do
        IO.puts("ok4")
    end 
    def decode(<<5::3, a::13 >>) do
        IO.puts("ok5")
    end 
    def decode(<<6::3, a::13 >>) do
        IO.puts("ok6")
    end 
    def decode(<<7::3, ds::5, dt::3, da::5>>) do
        IO.write("set ")
        dt(dt)
        da(da)
        ds(ds)
    end 
end

a = Base.decode16!("E001")
Dasm.decode(a)
a = Base.decode16!("E000")
Dasm.decode(a)




```

# 成果物

https://paiza.io/projects/Hqj-23Oh62TK0afXOvisKQ


以上。
はじめてのパターン認識 5章補足

# 次元の呪いについて
## ETL1とビマ・インディアンデータ
ビマ・インディアンデータ次元数が7と少ない. 一方でETLは16×16の256次元？
![CcWMR7ih.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/6f8d5766-ab08-62ca-6567-d1edaa9ad613.jpeg)
次元数が少ないと、kを増加させた際に誤り率が低下し、knnが有効となる


# 例題5.1
定義より、$(\bar{\boldsymbol{x}}-\boldsymbol{x})\boldsymbol{n}=0$となる$\boldsymbol{x}=(x,y)$がボロノイ境界となる.
$\bar{\boldsymbol{x}}=(\frac{1}{2},\frac{1}{2})^T$, $\boldsymbol{n}=(1,-1)$より, 上式に当てはめて
$(\frac{1}{2}-x)-(\frac{1}{2}-y)=0$

よって$-x+y=0$

# knnと次元の呪い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/dd8f7238-848d-dae0-71ac-41f44467c2c0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/f443660d-bdd7-2b29-9b15-6763b97157c0.png)
引用：https://qiita.com/oirom/items/49009c8903ece81fd7cf
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/ee1625e7-bb05-2352-505c-8edd8ceb1051.png)

引用；https://qiita.com/FukuharaYohei/items/0314f73cebb471deb515

## knn誤り率とベイズ誤り率の関係について
![ADw7JvZy.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/8662b39a-73d1-acbf-e2ee-bc93b49d9cb2.jpeg)
![dQiQ1EAf.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/2acd29d8-1e2b-1210-c49f-c375de42a86b.jpeg)

## 漸近仮定
![dQiQ1EAf.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/e887fda0-d04b-efc8-c815-325bc4044e99.jpeg)
![QKtRGKVs.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/0ccff217-a6fa-44f7-3a5d-50696daae3dd.jpeg)




# 章末問題
## 例題5.1
・|・|・|・|・|・|・|・|・|・|・

↑こんなかんじになる（・が鋳型、|がボロノイ境界）
## 例題5.2
(1)
水平線$y=y_0$と鋳型(x_1,y_1)までの距離が等しくなる$\boldsymbol{x}=(x,y)$を求める。
$y-y_0=\sqrt{((x_1-x)^2+(y_1-y)^2)}$
$y^2-2yy_0+{y_0}^2=(x_1-x)^2+(y_1-y)^2)$
...
$y=\frac{1}{2(y_1-y_0)}(x-x_1)^2+\frac{1}{2}(y_1+y_0)$

(2)
p204の解図を参照。実線がp1, 点線がp2の軌跡を表す。
これらの交点は、p1, p2からの距離が等しい点となる
![NSAIsynR.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/a6388339-b7f4-80c6-b422-1b99a61f3c93.jpeg)

## 例題5.3
![oQCM8KO9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/acd3c63b-1431-aaff-6c41-663dc5c5ff21.jpeg)
![aimOLafw.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/da17d023-312a-7e34-634d-1e26468de8f2.jpeg)
![blHocW0O.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/3c3d9763-5b2a-2baf-4f95-6bf53859bb38.jpeg)
![f1jTlEKV.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567074/ba103c5e-90ac-0e90-70a0-449bf2117f71.jpeg)


# knnの計算量削減手法について
こちらがよくまとまっている
https://www.slideshare.net/slideshow/5-kknn/26165132#57
DockerコンテナのEntrypointを修正する方法

# はじめに

　DockerコンテナでEntrypointを修正する方法を紹介する。Entrypointが誤っておりコンテナが起動しなくなった場合などに有用。

# 動作環境
* Ubuntu 22.04
* Docker version 27.1.2, build d01f264

# 方法

1. 修正したいコンテナが起動中の場合は停止
1. 修正したいコンテナIDの確認
    ```bash
    docker ps -a
    ```
    一番左の列に表示されるのが、コンテナID(CONTAINER ID)。
1. コンテナの設定ファイルを編集（管理者権限が必要）
    1. 管理者権限取得
        ```bash
        sudo su
        ```
    1. コンテナの設定ファイルの場所に移動
        ```bash
        cd /var/lib/docker/containers/{CONTAINER_ID}
        ```
        * {CONTAINER_ID} : 上記で確認したコンテナID
    1. 現状の設定ファイルをバックアップ
        ```back
        cp config.v2.json config.v2.json.back
        ```
    1. 設定ファイルを修正
        ```bash
        vi config.v2.json
        ```
    1. EntrypointとArgsを以下に変更
        ```json
        "Path":"/bin/bash", "Args":[]
        ```
        * 上記にすることで、デフォルト設定に戻る(```/bin/bash```のEntrypoint設定)。
    1. 「Ctrl-D」で管理者権限の終了

1. Dockerを再起動
    ```bash
    sudo service docker restart
    ```
    * 起動中のコンテナは終了してしまうので注意
1. コンテナを起動
    ```bash
    docker start -i {CONTAINER_ID}
    ```
    * Entrypointが変更されて正常に起動することを確認

:::note warn
```sudo service docker restart```をしないで、```docker start -i {CONTAINER_ID}```などでコンテナを起動すると、変更した設定が元に戻ってしまうので注意する。
:::

# まとめ
　DockerコンテナのEntrypointを修正する方法を紹介した。コンテナ内のEntrypointが誤っており、コンテナが正常に起動しなくなった場合に、コンテナを破棄することなくEntrypointを修正できた。Entrypointのエラーでコンテナが起動しなくなった場合に有用。

# 参考

https://stackoverflow.com/questions/32353055/how-to-start-a-stopped-docker-container-with-a-different-command
【Kaggle】コード読み込むだけで関連データセットを自動設定

ローカルで実装したものをkaggle notebookへimportする場合、importするごとにコンペデータセットやローカルで学習させたモデルなど別途 Add import や Upload を設定する必要があります。何か効率化する方法はないかと考えて調べました。  

  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/e3fdbc84-e0e7-3cc9-2422-6e0f2d7dbf43.png">

## 結論: metadataにdataSourceの情報を追加する
notebookにmetadataのkeyがあるのでそこに情報を入れればOKです。

### 前提
ipynbデータでの作業

### 作業
metadataの情報を取得するため、Kaggle notebook内で利用するデータを追加してDownload Notebookでnotebookをdownloadをします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/6986221b-5bfb-f969-7a4a-8b44f4ba33fa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/a6501529-4b42-fac5-9263-2ffdda08d33b.png)

ダウンロードをしたデータをテキストエディットで開くと一番上にmetadataの内容があります。以下xxx部分にIdが含まれています。今回のケースで言うと2行目がCOMPETITIONSの情報で3行目がDATASETSの情報です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/73d79c2b-b8a3-0c04-2002-5f3ca0e9ddab.png)


この情報を取得し、今度はローカル実装したipynbをテキストエディットで開きます。どの環境で開発しているかによるようなのですが私の場合は一番下の方にmetadataがありました。ここに上記で調べた情報を転記します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/3f2e2753-347e-8b25-5880-37a405adff4f.png)

あとはこのnotebookをベースに開発していけばOKです。
実験追加の際は本notebookをコピペすればずっとメタ情報は引き継がれます。
最初の一手間はありますが一度やれば必要データ自動追加になるので楽になりました。

設定の本質部分は上記の説明の通りなのですが、GitHubの連携でも同様のことができます。そのため、実際私がやる際は
kaggle環境でコンペデータセットを紐付けたnotebookを作成 → GitHubへpush → ローカルでpull
の流れでやってます。
npxで実行できるオリジナルコマンドラインツールを簡単に作ってみた！


## はじめに

Node.jsとTypeScriptを使って、`npx`コマンドで実行可能なコマンドラインインターフェース（CLI）ツールを作成する方法を紹介します。この記事では、プロジェクトのセットアップから、簡単なCliツールの作成までの手順をとりあえず作れることを目的にざっくり解説します。

## 前提条件

- Node.js（バージョン12以上）がインストールされていること
- npm（Node.jsに付属）がインストールされていること

## 手順

### 1. プロジェクトの初期化

まず、新しいディレクトリを作成し、プロジェクトを初期化します。

```bash
mkdir my-cli-tool
cd my-cli-tool
npm init -y
```

### 2. 必要な依存関係のインストール

TypeScriptと、コマンドライン引数を解析するためのライブラリ（例：commander）をインストールします。

```bash
npm install -D typescript @types/node
npm install commander
```

### 3. TypeScriptの設定

TypeScriptの設定ファイル（tsconfig.json）を作成します。

```bash
npx tsc --init
```

### 4. ソースコードの作成

`src/index.ts`ファイルを作成し、CLIツールのコードを書きます。

```typescript
import { Command } from 'commander';

const program = new Command();

program
  .version('1.0.0')
  .description('A CLI for managing Zenn and Qiita articles')
  .option('-d, --debug', 'output extra debugging')
  .action((options) => {
    if (options.debug) console.log(options);
    console.log('Hello from gane CLI!');
  });

program.parse(process.argv);
```

### 5. package.jsonの更新

`package.json`ファイルを編集して、ビルドスクリプトと`bin`設定を追加します。

```json
{
  "name": "my-cli-tool",
  "version": "1.0.0",
  "description": "A simple CLI tool",
  "main": "src/index.js",
  "bin": {
    "my-cli-tool": "src/index.js"
  },
  "scripts": {
    "build": "tsc",
    "start": "node src/index.js"
  },
  // ... その他の設定
}
```

### 6. ビルドとローカルテスト

TypeScriptをコンパイルし、ローカルでツールをリンクします。

```bash
npm run build
npm link
```

これで、ローカル環境で以下のようにツールを実行できるようになります：

```bash
npx my-cli-tool -f test.txt
```
**実際の実行結果**    
```
Hello from gane CLI!
```



## まとめ

以上の手順で、Node.jsとTypeScriptを使って`npx`で実行可能なCLIツールを作成できます。このアプローチを使えば、さまざまな用途のCLIツールを簡単に開発し、配布することができます！！！！！！

## 参考リンク

- [Node.js 公式サイト](https://nodejs.org/)
- [TypeScript 公式サイト](https://www.typescriptlang.org/)
- [Commander.js](https://github.com/tj/commander.js/)
- [npm ドキュメント](https://docs.npmjs.com/)
2024/9/10主にITとかセキュリティの記事

WordPressの人気のプラグインに脆弱性、600万超のWebサイトに影響(9/8)
https://news.mynavi.jp/techplus/article/20240908-3020068/

フィッシング攻撃に悪用されるEV充電スタンド、シール貼りしたQRコードに注意(9/8)
https://news.mynavi.jp/techplus/article/20240908-3020072/

サイバー犯罪から身を守る！不正アクセスの手口と効果的な対策法とは？
https://cybersecurity-park.com/2895/

打ち間違いから最悪の詐欺に誘導する「タイポスクワッティング」を3分解説！(9/8)
https://ascii.jp/elem/000/004/220/4220382/?rss

相談相手＝ChatGPT、という人が増えているらしい(9/7)
https://tabi-labo.com/310001/wt-people-using-chat-gpt-for-therapy

見えない犯罪を耳で調査──フォレンジック・アーキテクチャーは世界を聞いている(9/8)
https://wired.jp/article/sz-how-lawrence-abu-hamdan-hears-the-world/

サーバー仮想化ソフトウェアの世界市場(9/8)
https://japan.zdnet.com/release/31023083/

「トロイの木馬のスパイウェアに感染」PC画面に表示⇒連絡すると“ジャック”を名乗る男らカタコトの日本語を話す２人「データが消えるおそれ」言葉巧みに800万円詐取(9/8)
https://news.infoseek.co.jp/article/hbc_1205376238642069637/?tpgnr=poli-soci

米海軍上層部が秘密裏に軍艦にWi-Fiネットワークを導入していたことが判明(9/8)
https://karapaia.com/archives/451798.html

「大統領逃走」「原発占領」…半島有事の際フェイクニュースで混乱狙う北朝鮮(9/8)
https://www.chosunonline.com/site/data/html_dir/2024/09/02/2024090280070.html
Spring起動処理に、DB接続を前提とした処理を組み込んだら痛い目見た話〜DB接続に依存しない起動処理への移行〜

### 1. はじめに
- #### 問題の背景
　AWS上でECS(Springアプリケーション)とRDSを使用したシステムを運用しており、ECS, RDSともに毎日決まった時刻に停止、起動させていました。
 ECS上のSpringアプリケーションは、起動時にDB接続を前提とした処理が組み込まれていたのですが、この定時起動によるSpringアプリケーションの起動時にデータベース接続に失敗し、必要な起動処理ができていないままアプリケーションが立ち上がってしまうことが稀に起こっていたことが発覚しました。
 
### 2. 発生した問題
- #### 具体的な問題点
　ECS上でSpringアプリケーションがRDSに接続できず、アプリケーション起動処理にてエラーが発生。
　ECSとRDSは同時刻に起動するようにしていましたが、RDSの起動の方が遅くなった場合に、DBに接続できず、必要な処理ができていない状態でSpringアプリケーションが起動してしまっていました。
　ECS, RDSの運用担当者は、Springアプリケーションの実装自体には関わっていないため、起動順序によっては正常な稼働ができない、ということを把握できていなかった。

- #### 本質的な問題
##### Springの起動処理の設計ミス
　DB接続を前提とした初期化処理が含まれており、起動タイミングが少しずれただけで正常な稼働ができないリスクを抱えてしまっていた。
　また、DBが立ち上がった状態であっても、なんらかの原因で接続に失敗した場合は同様の事象が発生してしまう設計になっていました。

##### 起動処理にてDB接続に失敗した場合の考慮不足
　起動処理にてDB接続に失敗し、必要な処理ができていない状態でもアプリケーションの起動自体は成功してしまっており、ログも出していなかったため、特定のリクエストの処理でたまにエラーが出るが、再起動したら解消し、再現条件も根本原因も不明、という状況になってしまいました。

### 3. 対応
- #### DB接続に依存した起動処理を行わない
基本的にはこれが一番かと思います。今回の問題以外でも、さまざまな問題の原因となるリスクがあるため、できるだけ避けるのがベストかと思います。

 - #### どうしても行う場合は工夫が必要

##### リトライロジック
DB接続が確立できるまで、一定時間ごとにリトライする仕組みを設ける。
##### イベント駆動の処理
DBが準備できたことをイベントで受け取り、そのタイミングでDB依存の処理を開始する。
##### DB接続に失敗した場合の考慮
DB接続に失敗した場合でも正常な稼働ができる仕組みにする or 起動自体失敗するようにする。失敗が起きたことを確実に検知できる仕組みを作る。など


### 4. まとめ
#### 失敗の教訓
　DB接続に依存した起動時処理は、サービス全体の安定性に悪影響を与えるリスクがあります。特に、インフラの起動順序に左右される場合は危険。
　DB接続に依存しないようにすることで、より柔軟で信頼性の高いアプリケーション起動が可能となり、将来的なトラブルを回避できます。
　どうしても設計上難しい場合は、DB接続に失敗した場合の考慮をしっかり行うべき
【Spring Data MongoDB】Document用のクラスにenumのプロパティを設定してみる

## 概要
Spring Data MongoDBでは、[MongoDBでデータアクセス](https://spring.pleiades.io/guides/gs/accessing-data-mongodb)のドキュメントで紹介されている通り、Documentの保存・取得用にPOJOのクラスを使用してRepositoryを通してDBの操作が行えます。ではこのクラスにenumのプロパティを設定した場合、どういう動作になるかというメモ書きです。

## 前提
* 今回使用したSpring Boot Starter Data MongoDBのバージョンは`3.3.3`です。

## 動作確認用のクラス（Java）

以下のようにenumのプロパティを設定したクラスを、Repository経由で保存・取得した場合の動作を確認しました。

```java:UrlDocument.java
@Document(collection = "url")
public record UrlDocument(
        @Field("url_id")
        String urlId,
        String url,
        @Field("url_type")
        UrlTypeEnum urlType, // enumのプロパティ
) {
}
```

```java:UrlTypeEnum.java
public enum UrlTypeEnum {
    X,
    Instagram,
    Threads,
    Web
}

```

## 確認した結果
結果としてenumの値が文字列としてDBに保存され、取得する際もenumの値に変換されました。
[spring-boot-starter-data-mongodb Map enum to String in the entity](https://stackoverflow.com/a/64394440)のstackoverflowでの回答にある通り、enumから文字列の変換はSpring Data MongoDBはよしなにやってくれるようです。今回は試してないですが、enumに数値の値を別途持たせたい場合は[MongoDb - Spring Boot - Enum Type](https://stackoverflow.com/a/77133755)のstackoverflowでの回答にある通り、`@Field(targetType = FieldType.INT32)`のアノテーションを付与すれば動くそうです。
【デュアルブート】ubuntuインストール後、windowsしか立ち上がらない。

## 症状
linuxを勉強するために、ミニPCを購入。そしてwindowsのパーティションをリサイズして、ubuntuをインストール。再起動して、ブートローダーが立ち上がるはずだったけど、直接windowsが起動。なんどやってもブートローダーは立ち上がらず。

## 苦肉の対処法
1) 余っていた外付けHDDにubuntuをまた別にインストールして、BIOSで外部機器優先に変更したら、新たにインストールしたubuntuから立ち上げることができた。でも起動かなり遅い。起動した後は、そこそこ速くてまあなんとか使える。

2) 次にターミナルで sudo update-grub を実行。そして再起動。

3) するとブートローダーが起動し、新たにインストールしたubuntu、windows、先にインストールしたubuntuが選択できた。先にインストールしたubuntuを選択して起動。今度は、スイスイ立ち上がり、問題なく使用可能。ubuntuを立ち上げるために、外付けHDDが必要となったが、とりあえずはこれで良し。また勉強してスマートにデュアルブート出来るようにしたい。

また@michi_takaさんの情報を参考にさせていただきました。ありがとうございます。
https://qiita.com/michi_taka/items/323c0475e41f700a0fd8