OmniAICreator/Qiita-1.07M huggingface dataset:
Error memo: ○○ cannot be loaded because running scripts is disabled on this system.



Atcoder-CLI

http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/

をWindowsにインストールしたら、こんなエラーが。


エラーの内容：
```
acc.ps1 cannot be loaded because running scripts is disabled on this system. For more 
information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170.
```

これを検索したら、このサイトが引っかかりました。

https://answers.microsoft.com/en-us/windows/forum/all/cannot-get-powershell-script-to-run/900edc39-35e8-4896-92d0-05aad75eac87

According to this article, I should excute this command.

```
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser
```
これをしたら、```acc -h```のコマンドをターミナルが聞いてくれるようになりました。以上終わり。
InDesignドキュメントのカラープロファイルとポリシーを、（とりあえず）アプリ側に合わせるjsx

# コード

```javascript
//アプリ側のカラー設定を取得
var myApp = app.colorSettings;

var myAppCMYK = myApp.workingSpaceCMYK;
var myAppRGB = myApp.workingSpaceRGB;
var myAppCMYKPolicy = myApp.cmykPolicy;
var myAppRGBPolicy = myApp.rgbPolicy;

//ドキュメントの設定をアプリ側に合わせる
var myDoc = app.activeDocument;

myDoc.cmykProfile = myAppCMYK;
myDoc.rgbProfile = myAppRGB;
myDoc.cmykPolicy = myAppCMYKPolicy;
myDoc.rgbPolicy = myAppRGBPolicy;

//表示用にポリシーを日本語に
function getPolicyDescription(docPolicy) {
    var policies = {
        "COLOR_POLICY_OFF": "✅オフ（作業用を使用）",
        "COMBINATION_OF_PRESERVE_AND_SAFE_CMYK": "✅CMYK値保持（画像プロファイル破棄）",
        "CONVERT_TO_WORKING_SPACE": "⚠️作業用に全変換",
        "PRESERVE_EMBEDDED_PROFILES": "➡️埋め込みを保持"
    };
    return policies[docPolicy] || docPolicy;
}

alert("埋め込みプロファイルを\nRGB："+myAppRGB+"\nCMYK："+myAppCMYK+"\n\nドキュメントのポリシーを\nRGB："+getPolicyDescription(myAppRGBPolicy)+"\nCMYK："+getPolicyDescription(myAppCMYKPolicy)+"\nに変更しました。")
```

# なんのために作ったか

InDesignドキュメントには、作成時のカラー設定の

+ RGBとCMYK両方のカラープロファイル
+ RGBとCMYK両方のカラーマネジメントポリシー

が埋め込まれます。
このうち、カラープロファイルは後から変更が可能です。

:::note info
編集メニュー＞プロファイルの指定や、プロファイル変換を使用
:::
:::note info
Illustratorはドキュメントモードのプロファイルのみ埋め込み可能で、その他は開いている時のカラー設定内容に依存します
:::

**ですが、ドキュメントに埋め込まれたカラーマネジメントポリシーを変更する機能、メニューは、InDesignには用意されていません。** このため作成時のカラー設定内容が不適切なカラーマネジメントポリシーであった場合はずっとそのまま不適切な変換が行われることになり、また確認する術が（標準では）存在しないため沼にハマることになります。

## カラーマネジメントポリシーとは
**作業用として指定したカラープロファイル**と、**画像等に埋め込まれたプロファイル**が異なる場合、どのように処理するか、を指定する項目です。

例えば、通常はこのようになっています（一般用 - 日本2でも同じ）
![SS_CleanShot_20240904-165812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/8ead99fb-b172-ec02-c9f1-609849aed852.png)

+ RGB：埋め込まれたプロファイルを保持
+ CMYK：カラー値を保持（リンクされたプロファイルを無視）

## 選択できる項目の説明
プルダウンすると次のような内容が選択できます（CMYKの場合）

![SS_CleanShot_20240904-173345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/a21cea91-bb0a-6e0e-62d6-eaf8178c6b2b.png)

| 項目 | 動作 |
|-:|:-|
|オフ|プロファイルが埋まっていようがいまいが**無視して、作業用に指定したプロファイルを使用して表示**する。作成時のプロファイルと違う場合色が変わる（数値は変わらない）|
|カラー値を保持|（※CMYKのみ）プロファイルを無視し、作業用プロファイルで表示する。**オフと同じ**|
|埋め込まれたプロファイルを保持|プロファイルが埋め込まれていればそれを使って表示する。無ければ作業用を使って表示する|
|作業用スペースに変換|プロファイルが埋め込まれていれば、作業用プロファイルにプロファイル変換を行う。色は変わらないが値が変わる。無ければ作業用を使って表示する|

もし、CMYKポリシーが「作業用スペースに変換」だったとすると、

+ 作業用がJapan Color 2011 Coated
+ 埋め込みプロファイルがJapan Color 2001 Coated

と異なる場合、プロファイル変換が行われてCMYK値が変わってしまいます。
K100のみで作った画像が、プロファイルが異なる場合に片方がK100ではなくなる、といったことが起きます。

▼上がドキュメントプロファイルと異なるプロファイルを埋め込んだCMYKデータ。4c割れしています。PDF出力してもこうなります。
![SS_InDesign_20240904-174635.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/bc5a4624-dadc-c977-6229-68df0df6f6f6.png)

## ポリシーだけは後から変更できない
正確には、後から変更する機能が標準で用意されていません。
script経由での変更は可能です。

もし、
[InDesignドキュメントのカラープロファイルを表示するjsx](https://qiita.com/yamo74/items/d05a105c1be24311436a)
で
![SS_Google Chrome_20240904-175617.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35477/77725bee-e1af-689e-70e7-3692f5885037.png)

CMYKポリシーが全変換、となっていた場合、とりあえず本スクリプトを使って現在のアプリ側カラー設定にプロファイル、ポリシー両方を合わせてやることで、ポリシーも変更が可能になります。
UI付きを最初考えましたが、面倒になって単にカラー設定内容を引っ張ってくるだけにしました。

初期設定のカラー設定プロファイルではCMYKポリシーはカラー値を保持になっているので、よっぽど変なことをしなければ使うことはないスクリプトですが、一応念のため。
＃44　GoogleFormの回答をGoogleChatに通知したい

## はじめに
今回はGoogleFormからの回答をGoogleChatにリアルタイムで送信してみます。
GoogleChatに通知を送ることで、GoogleFormから送られてきた問い合わせに迅速に対応できたり、アンケートなどの回答内容がすぐに確認できるようになります。
※今回の記事の手順を行うには、GoogleWorkspaceの利用が必要ですのでご注意ください。

## 手順
### 前回の記事を参考に手順を実行する
[GoogleFormの回答が条件に当てはまる場合にメールで通知を送りたい](https://qiita.com/nxted_sapporo/items/5d466abb9e84619a2faf)

前回の記事を参考に以下の手順を行います。
  
**1.GoogleFormを作成する**
↓
**2.GoogleAppsScriptを開く**
↓
（※今回、3.「appsscript.json」の修正を行う は設定不要ですのでスキップします。)
↓
**4.「コード.gs」ファイル修正**
#### 「コード.gs」に入力するコード
前回は回答内容によって通知するしないの条件を付けましたが、
今回はすべての回答を通知させます。

```js
function onFormSubmit(e) {
  // フォームの回答を取得する
  var formResponses = e.response.getItemResponses();

  // メッセージを設定する
  var message = 'GoogleFormへの回答がありました\n';

  // メッセージにフォームの回答を追加する
  for (var i = 0; i < formResponses.length; i++) {
    message += formResponses[i].getItem().getTitle() + ': ' + formResponses[i].getResponse() + '\n';
  }

  // Google Chat にメッセージを送信する
  sendToChat(message);
}

function sendToChat(message) {
  // Google ChatのWebhook URL
  var webhookUrl = 'Webhook URLを指定する';
  var payload = {
    'text': message
  };
  
  // HTTPリクエストのオプションを定義する
  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };
  
  // POSTリクエストを送信する
  UrlFetchApp.fetch(webhookUrl, options);
}
```
↓
**5.トリガーの設定**
前回の記事と同様、以下の内容で設定を行います。
```
実行する関数：onFormSubmit
実行するデプロイ：Head
イベントのソース：フォームから
イベントの種類：フォーム送信時
エラー通知設定：お好みで
```
トリガーの保存時にポップアップでアクセス権限を求められますので許可します。

<img alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/89ebb7aa-4e99-461d-7202-fa036c172672.png" width="50%">

### 追加手順
#### Google Chatの設定

[【Google Chat の Webhook URLを発行】 - Google ChatにSlackのリマインダーを転送してみた](https://qiita.com/nxted_sapporo/items/96ec1ddeb3da6fc4e7b6#google-chat-%E3%81%AE-webhook-url%E3%82%92%E7%99%BA%E8%A1%8C)

上記記事を参考にWebhookURLを発行し、URLをコピーします。
**4.「コード.gs」ファイル修正** のコードの「Webhook URLを指定する」の部分にURLを上書きします。
```js
function sendToChat(message) {
// Google ChatのWebhook URL
var webhookUrl = 'Webhook URLを指定する';
```

### 実際にフォームを送信してみる
作成したフォームで回答してみるとメッセージが送信されます。
<img alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/3b9820a2-d04c-ec3a-6787-929dd8a24065.png" width="65%">

## 最後に
今回はGoogleFormの回答をGoogleChatに通知する方法を紹介しました。
ご覧いただきありがとうございました！

参考：https://www.one-walker.net/gas-chat-message/
【Amazon Connect Customer Profiles】 顧客情報を表示させてみた

## 本記事の内容
- Customer Profilesの概要
- Customer Profilesの有効化設定
- 実際の挙動
    - 顧客情報がない場合
    - 顧客情報が1件ある場合
    - 顧客情報が複数件ある場合
- Customer Profilesの料金
- まとめ

## はじめに
Customer Profilesは、Amazon Connect（コールセンターサービス）で使用できる顧客情報の集約サービスです。
例えば、顧客の電話番号や氏名、性別、過去の問い合わせ履歴などの情報を顧客からの着信時に表示することができます。個人的にはAmazon ConnectのCRM（顧客関係管理）だと思っています。
本記事ではCustomer Profilesの使用方法と実際の挙動例を挙げています。

## 本記事の注意点
本記事では以下のように使い分けをしています。
- Customer Profiles：サービスの名称
- 顧客情報：Customer Profilesに登録する顧客データ

## Customer Profilesの有効化設定

1. AWSのAmazon Connectコンソールに遷移する
1. 該当のインスタンスの名前をクリックする
1. 左側サイドバーの「お客様のプロフィール」をクリックする
1. 中央の「Customer Profilesを有効化」をクリックする
![スクリーンショット 2024-04-30 150108.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/888652dd-a209-004e-926c-55502f91904c.png)

5. ドメイン名を入力する（適切な名前を入力）
5. プロファイルの作成と自動関連付けで「プロファイルの自動関連付けのみ」を選択
※細かい仕様については別の記事で記載予定です。
![スクリーンショット 2024-04-30 151518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/a34fc530-ea93-3a60-4f89-596bfa3ec1d4.png)

## 挙動の事前説明
Customer Profilesの顧客情報は顧客の電話番号を基に検索しています。
つまり、090-1111-1111から電話があった場合、顧客情報の電話番号に090-1111-1111がなければ検索されません。

## 実際の挙動（顧客情報がない場合）
前提：Amazon Connectのエージェントワークスペースを使用しています。
実際に動かしてみましょう！
初めに、電話番号が一致する顧客情報がない場合で試します！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/e0f7e339-b8cb-da3b-c337-18a68f5463bc.png)

電話番号が一致する顧客情報がないため、エージェントワークスペースには何も表示されません。
顧客情報がない場合は、「＋プロファイル」をクリックし、作成するか、自動作成することもできます。
詳細は以下の記事に記載しています。

https://qiita.com/oho-kiyotaka/items/83e25273ed72aa029edd


## 実際の挙動（顧客情報が1件ある場合）
続いて、電話番号が一致する顧客情報が1件ある場合を試します！
事前に顧客情報を登録していることが前提です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/2cac44c4-631c-64c3-dc05-191e8e76fbb3.png)

こちらのパターンでは、電話番号が一致する顧客情報が1件のみのため、着信時に顧客情報が表示されます。
氏名や電話番号、住所、過去の対応履歴等を確認することができます。
※こちらのUIはカスタマイズで作成することも可能です。
詳細は別記事として投稿予定です。

## 実際の挙動（顧客情報が複数件ある場合）
最後に、電話番号が一致する顧客情報が複数件ある場合を試してみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3717693/0c35a5c3-4878-6f59-b0d2-501c4e9bde7a.png)

電話番号が一致する顧客情報が複数件あるため、ヒットした顧客情報が一覧として表示されます。
この場合、オペレーターは顧客に名前を伺って、該当の顧客情報を選択する必要があります。

## まとめ
Amazon Connectの標準機能として、顧客情報が集約できる機能は便利だと思います。
受電時に顧客の情報が分かれば、会話をスムーズに始めることができ、顧客体験の向上にもつながると考えています。
また、本記事には記載していませんが、顧客情報がある場合に、自動音声で「○○さま、いつもありがとうございます。」などをアナウンスすることも可能です。
Amazon Connectに顧客情報があることで、AIとの組み合わせも広がると考えています。
LangChain Meetup Tokyo勉強会に参加した

# 概要

* 日時
    * 2024年09月02日
* 場所
    * 株式会社メルカリ
* 主催者
    * LangChain Community(JP)
* 参加情報
    * https://langchain.connpass.com/event/329185/


# 内容
### LangChainの現在とv0.3にむけて
* 0.3からdeprecatedだったいくつかの機能がv0.3で削除予定
* LCEL進める
* AgentTypeをLangGraphに移行
* 単純なエージェントは、LangGraphに移行


### LangChainでWebサイトの内容取得やGitHubソースコード取得
* LangChainでWebサイトの内容取得
    * ライブラリ
        * https://www.npmjs.com/package/cheerio
    * やり方
        * https://js.langchain.com/v0.2/docs/integrations/document_loaders/web_loaders/web_cheerio/#instantiation
    * 注意点
        * bodyタグ内のscriptやstyleを外す

* LangChainでソースコード取得
    * ライブラリ
        * https://www.npmjs.com/package/cheerio
    * やり方
        * https://github.com/shu-kob/langchain-sample-code/blob/main/cheerioWebBaseLoader.ts


### LangGraphで実装する！エージェントデザインパターン
* 以下の論文より、AIエージェントの設計に役立つ18のデザインパターンを紹介される
    * https://arxiv.org/abs/2405.10467v1
    * https://arxiv.org/pdf/2405.10467v1
* 日本語で読みやすいサイトもある
    * https://blog.elcamy.com/posts/20431baf/#3.1%20%E5%8F%97%E5%8B%95%E7%9A%84%E3%81%AA%E3%82%B4%E3%83%BC%E3%83%AB%E3%82%AF%E3%83%AA%E3%82%A8%E3%83%BC%E3%82%BF%E3%83%BC%20(Passive%20goal%20creator)
Event Monitoring Analytics アプリケーションの設定



+ [CRM analytics(Event Monitoring Analytics アプリケーション)について](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifkLT)
+ [Event Monitoring Analytics App](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000BrXTOSA3)

View Event Log Data in Analytics Appsの有効化設定がない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8e10bacd-c41e-7398-86f5-24ebeb06c844.png)

以下のDE環境を使えば、設定がある

https://trailhead.salesforce.com/en/promo/orgs/analytics-de?
---------------------

以下を参考に設定してみます

https://base.terrasky.co.jp/articles/T2zxx

# View Event Log Data in Analytics Appsの有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a19d1659-e61f-37fb-f246-80c208838aa6.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/01042484-10c0-7ee0-6f89-e14bb9460ac0.png)


# CRM Analyticsを有効化

特別版だからなのか、有効化されているみたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c91a4897-bcc4-20f9-50bd-3815fea1d184.png)

# 権限セットをユーザへ付与

Event Monitoring Analytics 管理者 を自分に設定してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c743a864-c644-ea4c-ca79-8f2589ae516f.png)

既に設定されている感じですね。ボタンがグレイアウトになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6d0734bb-5e83-b775-5ccf-21f52c480bca.png)

# Event Monitoring Analytics アプリケーションを作成

+ アプリケーションランチャーで、[Analytics Studio] を選択します。
+ メニューの「ホーム」を選択。右上の「作成」ボタンを押下し「アプリケーション」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/558909b7-a217-d953-468b-8f252781222c.png)

+ 「Event Monitoring Analytics App」を選択してから、「次へ」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/dac66576-530e-28e5-77e3-ec47d20a3141.png)

+ データセットの設定を行います。

対象のデータセットを「Yes」、データ保管期間の日数を設定します。
今回は、全てのデータセットを「Yes」、データ保管期間を「30」にします。

カテゴリーごとに７ページ分あるようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cb94c810-1ef8-3caa-b1db-6f5a39b23d1a.png)


完成したようです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1b66fa8c-3ed2-15e9-1fd9-9c591f94468f.png)
レビューアイで 叙々苑 品川プリンスホテル店 のレビュー分析をしてみた


弊社リテジーリンクではレビュー分析AI[レビューアイ](https://reviewai.next-seed.work/)の無料デモを公開中です。
レビューアイ (英語表記 ReviewAI) は、商品・サービスのレビューを分析し、
観点ごとに強みと改善点を明らかにする、レビュー分析AIです。

本記事では、叙々苑 品川プリンスホテル店 のレビューを例に
レビューアイで明らかになった強みと改善点を1つずつ紹介します。

## 強み

レビューアイでレビュー分析すると、**焼き肉**、**肉** が強みのようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/af7fac0e-d167-44eb-981d-57b7d80449db.png)

**焼き肉** の詳細を確認すると、**叙々苑** が一番上にきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/7cd68789-e219-706f-0050-ddc4216df9db.png)


**焼き肉**、**叙々苑** に関連するレビューを見ると、
焼き肉といえば叙々苑、というブランドが浸透している様子が伺えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/38c9a587-4ff4-7863-c8ec-2ddd1a70a984.png)


## 改善点

レビュー分析で見つかる観点を改善順で見ると、**値段** にはネガティブ意見があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/138a60cf-ad61-113e-743b-9dc7bb22e03c.png)

**値段** の詳細を確認すると、**質** に関してネガティブな意見が多いようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/f625a4ce-11df-3b96-baa5-bd065ac538c9.png)


**質** のレビューを見ると、質だけでなく雰囲気込みの値段という印象を受けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776808/d7b81725-e6ac-deb2-e721-0f4a999efb2c.png)


## まとめ

レビューアイで 叙々苑 品川プリンスホテル店 のレビュー分析をしました。
結果として
- 焼き肉といえば叙々苑
- 雰囲気込みの値段
ということが判明しました。

今回は紹介できていませんが、
- 特別な席
- 最後のサービス
などについても貴重な知見があります。

[レビューアイ](https://reviewai.next-seed.work/)の無料デモを公開中です。
ぜひ[こちら](https://reviewai.next-seed.work/)からお申込みください。
Azureでとりあえずで使えるWindwsVM作成してみた

# Azureでとりあえず使えるWindows VMを作成してみた

Azureで踏み台、OS検証、疎通確認用、、、など何かしらに使えそうなWindows Virtual Machine（VM）を簡単に作成して、リモートデスクトップ経由で操作できるようにする手順をまとめてみました。
初心者でも分かりやすく、最小限の構成でサクッとVMを作りたい方に向けたガイドです。

---

## 1. Azure Portalへのログイン

まず、Azureアカウントを持っていない場合は、[Azureの公式サイト](https://azure.microsoft.com/)で無料アカウントを作成しください。アカウントを作成後、Azure Portalにログインします。

1. [Azure Portal](https://portal.azure.com/) にアクセスし、登録したアカウント情報でログインします。
2. ログインに成功すると、Azure Portalのホーム画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3877782/26611fb9-591a-4374-3894-714440ee5a0e.png)

Azure Portalはクラウドリソースを管理できるダッシュボードで、仮想マシン、ストレージ、ネットワークなどの様々なリソースを一元管理できます。

---

## 2. Virtual Machineの作成

1. Azure Portalのメニューから「Virtual Machines」を選択し、「+ 作成」- 「仮想マシンの作成」ボタンをクリックします。
2. 「仮想マシンの作成」ウィザードが開きますので、以下の項目を設定します。
   - **サブスクリプション**: 利用するサブスクリプションを選択します。
   - **リソースグループ**: 既存のものを選ぶか、新規作成します（例: `testrg01`）。
   - **仮想マシン名**: 任意のVM名を入力（例: `testvm01`）します。
   - **地域**: リージョンを選択します（例: `Japan East`）。
   - **可用性オプション**: 可用性を選択します（例: `インフラストラクチャの冗長性は必要ありません`）。
   - **セキュリティの種類**: 仮想マシンのセキュリティ性を選択します（推奨: `Standard`）。
   - **イメージ**: Windowsイメージを選択します（推奨:  `Windows Server 2022 Datacenter`）。
   - **VMアーキテクチャ**: CPUアーキテクチャを選択します（推奨: `x64`）。
   - **サイズ**: 予算に応じてサイズを選びます（推奨: `B2ms`）。
   - **ユーザ名**: OSログインのユーザ名を入力します。
   - **パスワード**: OSログインのパスワードを入力します。
   - パブリック受信ポート: VMにインターネットからアクセスする際のポートを選びます（推奨: `なし`）

3. 次に「ディスク」タブで、以下の項目を設定します。
   - **OS ディスクの種類**: ディスクの可用性と性能を選択します。（推奨: `Standard HDD（ローカル冗長ストレージ）`）。

4. 次に「ディスク」タブで、以下の項目を設定します。
   - **VM が削除されたときにパブリック IP と NIC を削除する**：削除する際にゴミリソースが残らないようにチェックをつけておきましょう。


4. 管理・監視・詳細・タグのメニューは無視で大丈夫です。

4. 最後に、「確認と作成」ボタンをクリックして、内容を確認し「作成」をクリックします。これで仮想マシンのデプロイが開始され、数分後に仮想マシンが作成されます。

---

## 3. リモートデスクトップでリモートログイン

仮想マシンが作成されたら、リモートデスクトップ（RDP）を使ってVMにアクセスします。

1. 作成したVMのページに移動し、「接続」ボタンをクリックします。
2. 「RDP」を選択し、RDPファイルをダウンロードします。
3. ダウンロードしたRDPファイルを実行し、先ほど設定したユーザー名とパスワードを入力して接続します。

この手順で、ローカルPCからAzureのWindows仮想マシンにリモートデスクトップでログインできます。

---

## 4. OSへの基本設定

初めてWindowsにログインしたら、最初に行う基本的な設定をいくつか行います。

1. **Windows Update**: 最新のセキュリティパッチを適用するために、Windows Updateを実行します。
2. **ロケール設定**: 日本語キーボードを使う場合は、ロケールやキーボードレイアウトを日本語に変更します。
3. **セキュリティ設定**: リモートデスクトップのポート（3389番）がインターネットからアクセス可能な状態ですので、NSG（ネットワークセキュリティグループ）を設定してアクセス制限を強化します。

---

## 5. 所感

AzureでWindows VMを作成してリモート接続するまでの手順は、非常に簡単でスムーズに行えました。今回作成したVMは最低限の構成ですが、将来的にはVMスケールやバックアップなども試してみたいと思います。Azureの柔軟性とスケーラビリティは、インフラを管理する際の大きな助けになると感じました。
AWS memo


## 用語

### AWS Elastic Container Registry (ECR)

container registoryを管理するツール

#### 使い方

login

`aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com`

push docker image
```
docker tag <IMAGE_ID> aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:tag
docker push aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:tag
```

pull docker image

`docker pull aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:tag`
Packet Tracer 超基本！

# PC同士の通信（LAN内）
２点間の超基本的なネットワークをつくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/1d8f2a4b-ddd8-5fa5-6cff-feb05893afbc.png)


## 設置
下のバーから以下の機器をクリックで設置
1. スイッチ
1. PC２台

## 接続
下のバーからコネクションを選んで接続
今回の場合はストレートケーブル（黒い実線）
※スイッチとPCを接続するときはストレートケーブル


## IPアドレスの設定
PCをクリック
Desctop > IP Configuration > IPv4 Address

PC0:192.168.1.1
PC1:192.168.1.2

エンターを押したら、サブネットマスクが自動で入力される
そのままバッテン

## 疎通確認

PCをクリック
Desctop > Command Pronpt

PC0からPC1へpingを打つ：
ping 192.168.1.2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780454/6d417c0c-6ce3-bdac-a001-2672420a875b.png)

成功！！
MySQLのパスワードポリシーについて

## アジェンダ

MySQLには、セキュリティ強化のためのパスワードポリシーがデフォルトで設定されています。これにより、ユーザーが強力なパスワードを使用するよう促す仕組みが提供されています。ただ、特定の状況下ではパスワードポリシーを緩和したり、一時的に無効化する必要がある場合があったりします。(ポリシーを一時的に緩和した場合でも、セキュリティの観点から元に戻さなくてはいけなかったりしますが。)
本記事では、MySQLのパスワードポリシーの詳細と、その変更方法について簡単にまとめます。

## パスワードポリシーの確認

MySQLにはパスワードの強度を制御するために、`validate_password` プラグインが使用されています。デフォルトで有効になっているこのプラグインは、パスワードの長さや複雑さなどの要件を設定します。

### 現在のポリシーを確認する方法

MySQLにログインした後、次のコマンドを実行することで現在のパスワードポリシーを確認できます。

```sql
SHOW VARIABLES LIKE 'validate_password%';
```

次のような設定が表示されます:

- `validate_password.policy`: ポリシーの強度レベル（LOW, MEDIUM, STRONG）
- `validate_password.length`: パスワードの最小長
- `validate_password.mixed_case_count`: 大文字と小文字の組み合わせの必要数
- `validate_password.number_count`: 数字の必要数
- `validate_password.special_char_count`: 特殊文字の必要数

## パスワードポリシーの強度設定

### ポリシーレベル

MySQLのパスワードポリシーは、次の3つのレベルに設定できます。

- `LOW`: パスワードの長さのみが制約（デフォルトは4文字以上）
- `MEDIUM`: パスワードの長さに加え、数字、特殊文字、大文字・小文字が必要（デフォルト）
- `STRONG`: より厳しいルールが適用され、パスワードには辞書攻撃防止のチェックも含まれます

### 例: ポリシーレベルの変更

例えば、パスワードの強度を緩和するために、次のコマンドでポリシーを`LOW`に設定できます。

```sql
SET GLOBAL validate_password.policy = LOW;
```

## パスワードの長さや要件を変更する

ポリシーに加えて、パスワードの長さや文字の要件も設定できます。以下のコマンドでこれらの設定を変更できます。

### パスワードの最小長の設定

```sql
SET GLOBAL validate_password.length = 6;
```

### 特殊文字や数字の要件を変更

```sql
SET GLOBAL validate_password.special_char_count = 1;
SET GLOBAL validate_password.number_count = 1;
```

これらの設定を変更すると、MySQLユーザーが作成する新しいパスワードに対して要件が適用されます。

## パスワードのリセット

もし`root`ユーザーのパスワードが分からない場合は、次の手順でパスワードをリセットできます。なお、この操作にはMySQLをセーフモードで起動し、認証をスキップする必要があります。

### パスワードリセット手順

1. **MySQLを停止**

```bash
sudo systemctl stop mysql
```

2. **セーフモードで起動**

```bash
sudo mysqld_safe --skip-grant-tables &
```

3. **MySQLに接続**

```bash
mysql -u root
```

4. **`root`ユーザーのパスワードリセット**

セーフモードでログイン後、次のコマンドでパスワードをリセットします。

```sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';
```

5. **MySQLを再起動**

```bash
sudo systemctl start mysql
```

### パスワードポリシーを元に戻す

パスワードをリセットした後は、セキュリティを保つためにポリシーを元に戻すことをお勧めします。

```sql
SET GLOBAL validate_password.policy = MEDIUM;
```

## パスワードポリシーを無効にする

特定の環境では、パスワードポリシーを完全に無効化する必要がある場合もあります。これを行うには、次のコマンドで`validate_password`プラグインを無効化します。

```sql
UNINSTALL PLUGIN validate_password;
```

無効化すると、今後パスワードの強度に関する制約がなくなります。
git upstrreamnit


# upstrreamとは
ローカルブランチが関連付けられたリモートブランチのことを指します。
具体的には、ローカルブランチに対するデフォルトのリモートブランチとして機能し、`git push`や`git pull`の操作で使用されるブランチです。
この設定により、Gitはどのリモートブランチに対して変更を送るべきか、またはどこから変更を取得すべきかを理解します。


# upstreamの役割
**デフォルトの同期先:**
ローカルブランチに対する操作（特にプッシュやプル）を実行する際、upstreamブランチはデフォルトの同期先として機能します。

**データの整合性:**
upstreamブランチの設定により、ローカルブランチとリモートブランチ間のデータ整合性を維持することが容易になります。

# エラー内容
```
fatal: The current branch <feature_1> has no upstream branch.
To push the current branch and set the remote as upstream, use        

git push --set-upstream origin <feature_1>

To have this happen automatically for branches without a tracking     
upstream, see 'push.autoSetupRemote' in 'git help config'.
```

# 解決策
基本的にはローカルブランチと同じブランチ名を関連付けるでよい。

* 明示的に上流ブランチを設定（２つは同義）

```
$ git branch <ローカルブランチ名> -u <リモートブランチ名>
$ git branch <ローカルブランチ名> --set-upstream-to=<リモートブランチ名>
```
* ローカルブランチ名を省略すると、自動的に現在のブランチを設定
```
$ git branch -u <リモートブランチ名>
$ git branch --set-upstream-to=<リモートブランチ名>
```

* 自動化する
新しいローカルブランチをプッシュする際に自動的にupstreamブランチを設定するオプションがあります。

```
git config --global push.default current
```

これにより、新しいローカルブランチをリモートにプッシュするときに、
同名のリモートブランチが自動的にupstreamとして設定されます。
ソーシャルメディアを活用したリード獲得のポイントと実践方法

ご存知でしたか？世界のソーシャルメディアユーザー数は現在49.5億人に達し、2024年末には51.7億人に増加すると予測されています。ユーザーは1日平均2時間24分をソーシャルメディアで過ごし、興味や日常、感情を共有しています。これは、潜在的なリードを見つける情報源となっています。

今回は、ソーシャルメディアからリードを生み出す簡単な方法をご紹介します。

<h2>リード獲得に最適な3つのソーシャルメディアプラットフォーム</h2>

<h3>X（Twitter）</h3>
世界中で4.5億人のユーザーを持つX（Twitter）は、ニュースや時事問題に関心の高いプラットフォームです。ユーザーの75%以上がX（Twitter）での情報を基に購買を行うという報告もあり、ビジネスリードの発見に役立ちます。

<h3>TikTok</h3>
2016年のローンチ以来、約16.7億人のグローバルユーザーを獲得したTikTok。若くアクティブな層へのアプローチに適しています。急速に拡散するトレンド（バイラルトレンド）を通じて、ターゲット層の人気トピックやインフルエンサーを見つけることもできます。

<h3>YouTube</h3>
約27億人のユーザーを持つ動画共有プラットフォーム、YouTube。様々なトピックに関する洞察やソリューションが共有され、つながりを生み出しています。製品やサービスに関心のある見込み客を見つけやすいのが特徴です。


<h2>ソーシャルメディアから収集できる情報</h2>

ソーシャルメディアデータを活用すれば、多角的なユーザー情報を収集できます。プロフィール詳細はもちろん、興味・関心、ネットワーク、エンゲージメントレベルなど、リードを特定するのに役立つ情報が含まれています。

<ul>
<li>プロフィール情報：名前、職位、会社、業界、所在地など</li>
<li>連絡先情報：メールアドレスや電話番号（プライバシー設定により制限あり）</li>
<li>コンタクトとネットワーク：フォロワーやフォロー先から新たなリードを発見</li>
<li>興味・趣味：ユーザーの投稿から好みや意見、関心事を分析</li>
</ul>

さらに、ウェビナーやカンファレンスなどのイベント、特定のハッシュタグからもリードを見つけることができます。

<h2>Octoparseを使ったソーシャルメディアリードの収集方法</h2>

Octoparseは、ソーシャルメディアからのデータ抽出を簡単にする強力なツールです。以下の手順で、簡単にリードを収集できます。

<h3>1. 新しいタスクの作成</h3>

スクレイピングしたいページのURLをOctoparseの検索バーに貼り付け、「スタート」をクリックします。

![octoparse screenshot-20240904-121646.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/8dbb11c2-f73b-032e-30cb-00d2d9550a31.png)


<h3>2. 自動検出機能の活用</h3>
ページが読み込まれたら、「ウェブデータの自動検出」をクリックします。Octoparseが自動的にデータを検出し、ハイライト表示します。

![octoparse screenshot-20240904-122225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/62412d04-3029-9a59-70f4-d4f2f8fc849e.png)


<h3>3. ワークフローのカスタマイズ</h3>
必要なデータを選択し、「ワークフローの作成」をクリックします。右側に表示されるフローチャートで、スクレイパーの動作を確認し、必要に応じて調整します。

<h3>4. タスクの実行とデータのエクスポート</h3>
設定が完了したら、「実行」ボタンをクリックします。Octoparseのクラウドサーバーを使えば、24時間365日最新のデータを抽出できます。スクレイピングが完了したら、データをExcel、CSV、JSONなどの形式でエクスポートし、さらなる分析に活用しましょう。

![op3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/d31df3a9-13b6-9d73-759c-2afb0cb2401a.png)


<h2>Octoparseのプリセットテンプレート：簡単なリード獲得方法</h2>

Octoparseは、簡単で効率的なデータ抽出ソリューションを提供しています。自分でスクレイパーを構築する以外に、プリセットテンプレートを使用してソーシャルメディアからリードを収集することもできます。

テンプレートライブラリの「ソーシャルメディア」カテゴリーをチェックするか、「連絡先情報スクレイパー」という一般的なテンプレートを使用して、任意のソーシャルメディアページとそのサブページから連絡先情報を抽出できます。

[連絡先情報クローラー](https://www.octoparse.jp/template/contact-details-scraper)

<h2>まとめ</h2>

ソーシャルメディアは、リード獲得に活用できるプラットフォームです。世界中の人々とつながるだけでなく、彼らの出身地、好み、ニーズについての情報も提供してくれます。これにより、ビジネスに適したリードを見つけ、ターゲットを絞ったマーケティングキャンペーンを実行することができます。
Octoparseを使えば、ソーシャルメディアページを構造化されたファイルに変換し、効率的にリードを生成できます。Octoparseを試して、あなたのリードデータベースの構築を始めてみてはいかがでしょうか。

[Octoparse公式サイト](https://markdown.com.cn)
LinuC102合格した

# LinuC102

## ​受験場所
ピアソンVUEオンライン受験した。

証明書を
101の時はマイナンバーカードの後ろの個人番号の写真撮ってあげてしまってたから
項目は、パスポートで表面だけ取り直して時間がかかった経験から

今後は運転免許にした！表面、裏面上げて(upして)スムーズに終わった！
ただ15分はかかった。開始時間前に試験始まったような気がする。

今回は、パソコンもってPCの周り(前後ろかな？)のみを見せた。手首は見せなかった。

## 感想
自信あったけど600点だった。落ちたと思った。

次の目標は
AWS Certified Solutions Architect – Associate［試験番号：SAA-C03］！
試験合格するぞ！
EC2 on Ubuntu にマインクラフトサーバをインストールする

## 概要

AWS 上に Minecraft サーバを構築する手順について記述する。

## 解説しない事

- AWS アカウントの用意
- AWS アカウントの day 1 対応
- AWS 上への具体的なインスタンスの立て方

## 環境

- Ubuntu: 24.04
- Minecraft: 1.21.1

## 手順全体像

- セキュリティグループの設定
- 依存関係のインストール
- Minecraft プロセスを動かす為のユーザ作成
- サーバインストール
- 自動起動設定

## 解説

### セキュリティグループの設定

いわゆる「ポート開放」にあたる作業。
セキュリティグループのインバウンドルールで 0.0.0.0/0 -> 25565 を許可する。

### 依存関係のインストール

Minecraft サーバの本体は、以下 URL から DL 出来る server.jar ファイル。

https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar

これを実行する為に必要な様々なプログラムを予め用意する必要がある。

``` sh

#!/bin/bash

apt update

## install

apt install openjdk-21-jdk-headless screen collectd -y

```

### Minecraft プロセスを動かす為のユーザ作成

Minecraft サーバは、server.jar を実行している間だけ機能する。
セキュリティの観点から、この server.jar を実行する為の専用ユーザを作成しておく。
→ もし server.jar を管理者で実行していた場合、サーバを攻撃されて権限を盗まれたら、何でも出来てしまう為。

``` sh

## pre-setup

useradd -m -s /bin/bash mcuser
echo "mcuser:P@ssw0rd" | chpasswd
cd /home/mcuser
mkdir minecraft
cd minecraft

```

### サーバインストール

Minecraft 本体のインストール。
本体の実行には、以下コマンドを入力する。

> java -Xmx1024M -Xms1024M -jar server.jar --nogui

``` sh

## install server

wget https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar
java -Xmx1024M -Xms1024M -jar server.jar --nogui
echo "eula=true" > eula.txt

```

### 自動起動設定

前述の通り、Minecraft サーバは、server.jar を実行している間だけ機能する。
当然、サーバを停止するとプロセスも停止する為、そのままだと、次に遊ぶ時に手動でプロセスを起動しなければならない。
Linux サーバには用意したプログラムを起動・停止時に自動実行する機能がある為、それを設定する。

1. 複数行のコマンド実行に対応する為や、メンテナンスを簡単にする為、起動・停止をシェルスクリプト化する
2. daemon 化する (serviceファイルを作成する)
3. 自動起動設定を行う

``` sh

## create start.sh

cat <<EOF > start.sh
#!/bin/bash
screen -S minecraft -U -d -m java -Xmx1024M -Xms${MaxMemorySize}M -jar server.jar --nogui
EOF
chmod 755 start.sh

## create stop.sh

cat <<EOF > stop.sh
#!/bin/bash
screen -p 0 -S minecraft -X eval 'stuff "stop\015"'
EOF

chmod 755 stop.sh
chown -R mcuser:mcuser ../minecraft/

## create daemon
sudo cat <<EOF > /etc/systemd/system/minecraft.service
[Unit]
Description=Minecraft Server
After=network.target

[Service]
ExecStart=/home/mcuser/minecraft/start.sh
ExecStop=/home/mcuser/minecraft/stop.sh
Restart=always
Type=forking
WorkingDirectory=/home/mcuser/minecraft/
User=mcuser
Group=mcuser

[Install]
WantedBy=multi-user.target
EOF

### enable process

sudo systemctl daemon-reload
sudo systemctl enable minecraft.service

## start process
sudo systemctl start minecraft.service

```

Minecraft から本サーバの IP を指定して、ワールドに入れたら構築完了。

## 参考

https://minecraft.wiki/w/Tutorials/Setting_up_a_server

https://www.liquidweb.com/help-docs/hosting-a-minecraft-server-linux/
エルメスバッグの偽造品を見分ける真贋モデルの開発でAmazon SageMakerを使ってみた

# はじめに
高級品市場、特にエルメスのような高級ブランドにとって、偽造品は重大な問題であります。偽造品の検出は、偽造者が使用する洗練された手法のため、困難な場合が結構あります。この問題に対処するため、エルメスのバッグの偽造品認証モデルを開発しておりますが、そこでAmazon SageMakerを使ってみました。この記事では、SageMaker を使用した経験について詳しく説明し、SageMaker が開発プロセスを最初から最後までどのように促進したかを紹介します。

### 課題
エルメスのバッグの精度が高い真贋モデルを作成するには、ロバストな検出モデルを構築する必要があります。このモデルは、本物と偽造品を正確に区別する必要があり、主な課題として以下が考えられます：
  1. データ収集と前処理： 本物と偽造品のエルメスバッグの包括的なデータセットを収集し、分析の準備をする
  2. 探索的データ分析（EDA）： データセットの特徴を理解し、真正バッグと偽造バッグを区別する主な特徴を特定する
  3. モデルの開発とトレーニング： バッグを正確に分類できる高度な機械学習モデルを構築する
  4. モデルの解釈と説明可能性： モデルの予測が解釈可能で、説明可能であることを保証する

### なぜAmazon SageMaker？
Amazon SageMaker を選んだ理由として、このプロジェクトに理想的なプラットフォームとなるいくつかの利点がありました：

- Built-in ML と Python パッケージ： SageMaker には、最新の機械学習と Python のパッケージが付属しており、環境のセットアップを心配することなく、すぐに始めることができました
- 使いやすさ: このプラットフォームは開発プロセスを効率化するように設計されており、迅速なプロトタイピングと反復が可能です
- 拡張性： SageMaker のマネージドインフラストラクチャはシームレスに拡張でき、データセットと計算ニーズの増大に対応できる
- AWSサービスとの統合： SageMakerは、S3、Lambda、CloudWatchなどの他のAWSサービスとの統合により、データストレージ、デプロイメント、モニタリングのための強固なエコシステムを提供していることです
- EDAおよび可視化ツール： SageMakerのノートブックインスタンス環境は、データセットを理解するために重要な、包括的な探索的データ分析と可視化を容易にしました
- 説明可能なAI: SageMakerのモデル解釈用ビルトインツールは、モデルの予測が説明可能で透明であることを保証するのに役立ちました

### 開発プロセス

#### SageMaker ノートブックインスタンスの構築
最初のステップは、SageMaker ノートブックインスタンスの構築することでした。この環境には、機械学習開発に必要なすべてのツールとライブラリが用意されていた。Jupyterノートブックがあらかじめ設定されているため、環境のセットアップに時間をかけることなく、すぐに使い始めることができました。

#### データ収集と前処理
データは、自社データや協力会社などからエルメスのバッグの画像などを収集した。データセットには、バッグの画像、説明、メタデータなどが含まれてました。SageMakerの組み込みライブラリとAWS S3との統合により、このデータのアップロード、保存、前処理が容易にできました。

#### 探索的データ分析（EDA）
データを読み込んだ後、綿密な探索的データ分析を行った。SageMakerのJupyterノートブックは、データの分布を視覚化し、外れ値を特定し、特徴の相関関係を理解するためのインタラクティブな環境を提供しました。

#### モデルの開発とトレーニング
SageMakerの組み込みアルゴリズムとカスタムモデルのトレーニングスクリプトを使用して、偽造品検出モデルの開発とトレーニングを行いました。このプラットフォームのマネージドトレーニング環境は、GPUリソースへの容易なアクセスを可能にし、効率的なモデルトレーニングを可能にしました。訓練プロセスでは、200エポックにわたる訓練損失と検証損失をプロットすることで、モデルのパフォーマンスを監視しました。以下図に示すプロットでは、訓練損失と検証損失の両方が一貫して減少しており、モデルが効果的に学習し、未知のデータに対してうまく汎化していることを示しています。

![2b3ac1db-90fc-4b64-988b-1958f7500c1c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821499/5cdf467e-8924-017d-1616-850332f2cf1d.jpeg)


## 結論
Amazon SageMaker は、エルメスバッグの偽造品認証モデルを開発する上で非常に貴重なツールであることが証明されました。その包括的な一連の機能、使いやすさ、そして他の AWS サービスとのシームレスな統合は、開発プロセスを大幅に加速しました。EDAの実行、モデルの構築とトレーニング、結果の解釈を単一のプラットフォームで行えるSageMakerは、このプロジェクトにとって理想的な選択でした。

SageMaker を活用することで、ロバストで説明可能なバイナリ分類モデルを作成することができ、偽造高級品との戦いに貴重なツールを提供することができました。この経験は、複雑な機械学習の課題に取り組む上での SageMaker の可能性を強調するものであり、データサイエンティストや機械学習の実務家にとって、SageMaker は頼りになるソリューションとなっています。
簡単にHTTPS通信ができるTHTTPClient

# はじめに
DelphiでHTTP通信をするときにIndyを使っていた人は多いと思います
ですがDelphiXE8あたりからもっと便利なTHTTPClientクラスが用意されていますので是非使ってみましょう

# なにが違うの？
外部DLLなしでHTTPS通信に対応
http2に対応
難しい設定が不要

# 使う前の準備
usesに System.Net.HttpClientを追加します
```delphi.pas
use System.Net.HttpCliet
```
# getメソッドのサンプル
urlを指定してgetメソッドを実行して返信を返すソースはたったこれだけ
```delphi.pas
function HttpGet(const Url: string): string;
var
  http: THTTPClient;
  res: IHTTPResponse;
  stream: TSTringStream;
  ts : TStringList;
begin
  result := '';
  http := THTTPClient.Create;
  stream := TStringStream.Create;
  ts := TStringList.Create;
  try
    res := http.Get(Url, stream);
    ts.LoadFromStream((res).ContentStream, TEncoding.UTF8);
    result := ts.Text;
  finally
    ts.Free;
    stream.Free;
    http.Free;
  end;
end;
```

# getメソッドで画像などのバイナリデータを取得
返り値はストリーム型なので必要に応じたクラスで読み込めば完成します
```delphi.pas
function HttpPicture.Get(const Url, aFilename: string): Boolean;
var
  http: THTTPClient;
  res: IHTTPResponse;
  stream: TSTringStream;
  ts : TStringList;
  png : TPngImage;
  jpg : TJPEGImage;
  bmp : TBitmap;
  s : string;
begin
  result := False;
  http := THTTPClient.Create;
  ts := TStringList.Create;
  png := TPngImage.Create;
  jpg := TJPEGImage.Create;
  bmp := TBitmap.Create;
  try
    res := http.Get(Url); 
    if res.StatusCode = 200 then begin
      s := res.MimeType;
      try
      if Pos('jp',s) <> 0 then begin
        jpg.LoadFromStream( res.ContentStream);
        jpg.SaveToFile(aFilename);
      end;
      if Pos('png',s) <> 0 then begin
        png.LoadFromStream( res.ContentStream);
        png.SaveToFile(aFilename);
      end;
      if Pos('bmp',s) <> 0 then begin
        bmp.LoadFromStream( res.ContentStream);
        bmp.SaveToFile(aFilename);
      end;
      result := True;
      except
      result := False;
      end;
    end;
  finally
    bmp.Free;
    jpg.Free;
    png.Free;
    ts.Free;
    http.Free;
  end;
end;
```

# postメソッドの罠
簡素化を目指したが故にpostの仕様はやっかいですが
下記の3種類だけ覚えましょう、覚えれば簡単です
```delphi.pas
var
  http: THTTPClient;
  res: IHTTPResponse;
  str : string
  stream: TSTringStream;
  ts : TStringList;
begin
  res := http.Post(Url,ts);     // フォームの内容を送る形式
  res := http.Post(url,stream); // JSONや画像ファイルを送る形式
  res := http.Post(url,str);    // strで指定したファイルを送る形式？
end;
```

# postメソッドのサンプル
JSONをpostで送信するサンプルです
```delphi.pas
function THttp2.Post(const Url: string;Param: string): string;
var
  http: THTTPClient;
  res: IHTTPResponse;
  stream: TSTringStream;
  ts : TStringList;
begin
  result := '';
  http := THTTPClient.Create;
  stream := TStringStream.Create;
  ts := TStringList.Create;
  try
    http.ContentType := 'application/json;charset=utf-8';
    stream.WriteString(Param);
    stream.Position := 0;
    res := http.Post(Url,stream);
    ts.LoadFromStream((res).ContentStream, TEncoding.UTF8);
    result := ts.Text;
  finally
    ts.Free;
    stream.Free;
    http.Free;
  end;
end;
```
# 最後に
いかがでしょうか？
やっかいなhttps通信も簡単に行う事が出来ますので是非使ってみましょう
actions/upload-artifactで隠しファイルをアップロードしている場合は気をつけよう

2024年の9月2日から`actions/upload-artifact`のv3とv4で隠しファイル・フォルダがアップロードに含まれなくなりました。

メジャーバージョンを変更しない破壊的な変更ですので、突然動かなくなった人も多かったと思います(実際に`actions/upload-artifact`の[issue](https://github.com/actions/upload-artifact/issues/602)ではそのような声が多く上がっていました)。

引き続き隠しファイルをアップロードファイル・フォルダに含めたい場合は、`include-hidden-files`を利用します。

```yaml
- uses: actions/upload-artifact@v4
  with:
    path: .env
    include-hidden-files: true
```

この変更は隠しファイル等に存在する秘匿情報をアップロードすることを防ぐために行われました。


私は隠しフォルダごとアップロードしていため、以下のメッセージが出たことで早期に気付けました。
```
No files were found with the provided path: xxx No artifacts will be uploaded.
```

しかし、アップロードするフォルダ内に隠しファイル・フォルダがある場合は原因の特定が難しいだろうな...と思いました。

困っているどなたかに届けば幸いです。

## 参考

https://github.blog/changelog/2024-08-19-notice-of-upcoming-deprecations-and-breaking-changes-in-github-actions-runners/
yoomを使ってSalesforceの取引先を取得してみる


ライセンスがグレードアップしないとデータベース操作はできないと思っていましたが、選択してみると使えるみたい。データベースの操作ではIdでなくても、項目を指定して対象を選択できるみたい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8cf51fdc-99da-7bf5-aecd-fe3b86861e7e.png)

テストは成功しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b40fc99d-616c-01f5-e02c-edbdc69cca1a.png)


実行でできないのか...


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ca915a48-f99c-9eeb-210d-4a0071fe64f0.png)
新卒機械学習エンジニアが入社５ヶ月目までに読んだ本2024

# はじめに
こんにちは！2024年4月に機械学習エンジニアとして新卒入社したRyuです！
今回は僕が4月〜8月にかけて読んだ本を紹介しようと思います。
「機械学習エンジニアが」読んだ本とタイトルにありますが、業務上必要な書籍やマインド系の書籍もあり、必ずしも機械学習エンジニア向けの書籍ではないのでご了承ください。
また、本記事は僕が先輩や上司の方、ネット記事を参考にして購入した書籍の紹介であり、PRではない点にご注意ください。

それではさっそく紹介していきます！

# 読んだ本

### 現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法

https://gihyo.jp/book/2017/978-4-7741-9087-7

こちらはシステム設計に関する書籍です。
チームの先輩におすすめされて購入し、現在でも設計や実装時に大変役立っています。
クラス設計の際の考え方や可読性の高い実装方法など、業務プログラミングを行ったことのない新人にはかなりおすすめの１冊となっています。

特に「複雑さを閉じ込める」という節では複雑なロジックを他の関数に閉じ込め、いかにメイン関数の可読性を上げ、変更箇所を減らすかという点について説明されており、業務プログラミングに必須な知識が学べました。

### 検索システム 実務者のための開発改善ガイドブック

https://www.lambdanote.com/products/ir-system

こちらは検索システムの入門本です。
僕の部署が検索システムを扱っている部署のため、輪読会用に購入しました。

かなり丁寧に検索システムについて解説しており、検索システムのためのアルゴリズムやUI面、評価についても体系的に学ぶことができる良書です。
検索に興味がある初学者の方にはおすすめかもしれません。


>第1章 イントロダクション
第2章 検索エンジンのしくみ
第3章 テキスト解析
第4章 ポスティングリストの走査とランキングのアルゴリズム
第5章 検索エンジンへのデータ登録
第6章 検索インターフェースと検索クエリの処理
第7章 よい検索とは
第8章 検索システムプロジェクトの始め方
第9章 検索システムの評価と課題の発見
第10章 クエリ提案とドメイン理解の支援
第11章 検索を成功させるための支援
第12章 検索結果のランキング


### エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド

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

こちらは技術書というよりかはマインド系、マネジメント系の書籍になります。
社内でマネジメントに興味があるという話をしたところ、先輩におすすめされて購入しました。

エンジニアに特化したマネジメント術やテックリードの心構えなどが紹介されており、そもそもテックリードについて知らなかった自分にとって非常に有益な情報が詰まっていました。
マネージャー職を目指す方以外にも、マネジメントされる側の心構えについても学べるため、新卒社員は読んでおくといいかもしれません。


### 読み手につたわる文章 - テクニカルライティング

https://techbookfest.org/product/3t8AGqtB65jsPtPhx6m5fr?productVariantID=7t4mAfhZzS41FktjgmBGjT

こちらは[技術書典](https://techbookfest.org/)という技術書のコミケのようなイベントに参加して購入した本になります。
イベントは終了してしまいましたが、上記URLにある別サイトのリンクから現在でも購入することができます。
イベント当初はかなり話題になっていた本で、僕も同期や上司におすすめしまくっていました（笑）

その文書は誰に向けているのか、人の時間を奪っていないかなど一般的な文章術からそうでないものまで丁寧に言語化されており、読みやすかったです。
現在でもこの本で学んだライティング術を使ってミーティング資料などを作成していますが、簡潔でわかりやすいという評価をいただけています。
本自体も薄い分、値段も1000円とお手軽なので、ぜひ一度手に取ってみてはいかがでしょうか。


### 徹底攻略 Google Cloud認定資格 Associate Cloud Engineer教科書

https://book.impress.co.jp/books/1122101107

Google Cloudの認定資格であるAssociate Cloud Engineerを取得するための参考書として購入しました。
Google Cloudの各サービスについての解説があり、その後に演習問題がそれぞれ用意されている構成になっています。
また、本書の公式サイトで模擬試験のPDFが手に入るため、実際に試験を受ける前の準備もばっちりできます。

ちなみに筆者はこの本を読破してAssociate Cloud Engineer認定試験に合格することができました！
ただ、実際の試験は本書の模擬試験よりも少し複雑な設問が多いため、模擬試験を解くだけでなく、各Google Cloudサービスの特徴を理解しておく必要があると思いました。

# おわりに
いいねやストック追加が記事投稿のモチベーションとなるので、最後までご覧いただいた方はぜひよろしくお願いします！
Wordpressをローカル環境でDockerを使って一瞬で動かす備忘録

普段Wodpress関連をローカルで開発するときには、WSL2環境でApacheを使って行っています。
しかし、訳あってdockerで動かす必要があったのでその時の備忘録です。

正直、難しいんだろうな・・・
呪文の書(dcoker-compose.yml)かけるかな・・・
と不安だったのですが、 **一瞬でした。**
`docker-compose.yml`の書き方は後で覚える！今は開発環境作るのが先やで！という方はコピペ爆速でいけるはずです。
是非どうぞ！

# 環境
- WSL2
- Docker Desktop for Windows
- Wordpress最新
- MySQL

# 爆速を求めてるあなたに
何も気にせず次の通りにしてください。
1. Dockerを起動(私はDocker Desktop for Windowsを使ってます)
1. プロジェクトを置きたいディレクトリに`dcoker-compose.yml`ファイルを作成
1. `docker-compose.yml`に以下をコピペ
    ``` docker-compose.yml
    version: '3'
    
    services:
      wordpress:
        image: wordpress:latest
        ports:
          - "8080:80"
        environment:
          WORDPRESS_DB_HOST: db
          WORDPRESS_DB_USER: wordpressuser
          WORDPRESS_DB_PASSWORD: wordpassword
          WORDPRESS_DB_NAME: wordpress
        volumes:
          - ./wordpress:/var/www/html
        depends_on:
          - db
        networks:
          - wordpress-network
    
      db:
        image: mysql:5.7
        environment:
          MYSQL_DATABASE: wordpress
          MYSQL_USER: wordpressuser
          MYSQL_PASSWORD: wordpassword
          MYSQL_RANDOM_ROOT_PASSWORD: '1'
        volumes:
          - wordpress_db_data:/var/lib/mysql
        networks:
          - wordpress-network
    
    volumes:
      wordpress_files:
        name: wordpress_files
      wordpress_db_data:
        name: wordpress_db_data
    
    networks:
      wordpress-network:
        driver: bridge
      my-app-network:
        external: true
    ```
1. `docker-compose up -d`を実行
1. [http:localhost:8080]()を開く
1. おしまい。

# docker-compose.ymlの中身について
今回は、WordpressとMySQLの環境を作るために呪文を書いています。
大きなポイントとしては2つです。

docker-compose.ymlの詳しいことに関してはいつか記事を書きます・・・多分。

## Wordpressの設定について
`image`という箇所に`image: wordpress:latest`というのがあります。
これはwordpressの公式の最新のDockerイメージを使うよという意味になります。
これが優れもので爆速が実現しています。
たとえば、ローカルで開発を行う時に
- Apache(webサーバー)
- PHP
- MySQL(データベース)
というようなLAMPの環境を用意することがよくあると思います。
しかし、このイメージはこれらがもうすでに入っているんですね！
もう頭が上がらないです、超便利。
wordpressを動かすのに必要なものが最初からパッケージになっている感じなので、これ一つで解決しています。


## `post max size、upload max size、memory limit`の設定を変えたい時
普段は.htaccessを変えたりすると思いますが、これも簡単にできちゃいます。
1. docker-compose.ymlと同じ階層に`php.ini`を作成し次の内容を記述
    ``` php.ini
    upload_max_filesize = 1G
    post_max_size = 1G
    memory_limit = 1G
    max_execution_time = 300
    max_input_time = 300
    ```


1. docker-compose.ymlの設定を`volumes`に追加する
    ``` docker-compose.yml
        volumes:
      - ./wordpress:/var/www/html
      - ./php.ini:/usr/local/etc/php/conf.d/custom.ini
    ```
    
1. コンテナを再起動する
    ```
    docker-compose down
    docker-compose up -d
    ```
    
1. 設定がきちんとされているか次のコマンドで確認できる
    ```
    docker-compose exec wordpress php -i | grep -E "upload_max_filesize|post_max_size|memory_limit"
    ```

これだけでいけます！
テーマのインポートなどでリミットを上げることはよくあると思うので、結構大事ですね

# 終わりに
今回は爆速でDockerでWordpressを動かすというのをやってみました。
`docker-compose.yml`側にちょっとした工夫(wordpressをローカルに設置する)などもあるので、このファイルの説明はまた別記事で書こうと思います！
Windows でも UTF-8 な Makefile を使いたい

2024-09-04 時点の [GNU Make](https://www.gnu.org/software/make/) の最新リリースの [4.4.1](https://git.savannah.gnu.org/cgit/make.git/tag/?h=4.4.1) では [Windows 上での UTF-8 に対応したパッチ](https://git.savannah.gnu.org/cgit/make.git/commit/?id=b2bf660abc4611677670b01fcbb0dc94ce2c35f7) が未適用だった。

じゃあ自分でビルドしよう！

## 前提条件

* PowerShell の文字コードを UTF-8 に設定
    * `$profile` に `chcp 65001` を追記
* [Scoop](https://scoop.sh/)
    * `scoop install main/msys2`
* msys2-ucrt64 に gcc
    * `pacman -S mingw-w64-ucrt-x86_64-toolchain`

## 手順

```powershell:PowerShell
git clone --filter=blob:none https://git.savannah.gnu.org/git/make.git
cd make
ucrt64
```

```bash:bash
./bootstrap.bat
./build_w32.bat --without-guile gcc
```

これで `GccRel/gnumake.exe` ができる。
`make.exe` に名前を変更した上でPATHを通してもいいが、scoop の shim が便利だった。

```pwsh:Powershell
scoop shim add make GccRel/gnumake.exe
```
The Essential Guide to Medical Billing Services in the USA

Introduction:

Medical billing services are an integral part of the healthcare industry in the USA, ensuring that healthcare providers receive timely payments for their services. This guide will delve into the importance of professional medical billing services, the common challenges faced by healthcare providers, and how to overcome them.

What Are Medical Billing Services?

Medical billing services involve the process of submitting and following up on claims with health insurance companies to receive payment for services provided by a healthcare provider. This process can be complex, requiring expertise to navigate various regulations and insurance protocols effectively.

The Importance of Professional Medical Billing

Accurate and efficient medical billing is crucial for maintaining a healthy cash flow in any medical practice. By outsourcing these services to professionals, healthcare providers can focus more on patient care rather than administrative tasks. Professional medical billing services help reduce errors, minimize claim denials, and improve revenue cycle management.

Challenges in Medical Billing

Complex Coding Requirements: The ever-changing landscape of medical codes can make it difficult to ensure accurate billing. Incorrect coding often leads to claim denials or delays.

Regulatory Compliance: Staying compliant with regulations like HIPAA is crucial but can be challenging, especially when managing large volumes of data.

Claims Denial Management: Handling denied claims requires time and expertise. Without proper follow-up, these denials can lead to significant revenue loss.

How to Choose the Right Medical Billing Service

When selecting a medical billing service, consider the following factors:

Experience: Look for a service provider with extensive experience in handling medical billing for various specialties.
Technology: The use of advanced billing software and technology is essential for efficiency and accuracy.
Compliance: Ensure that the service provider is well-versed in the latest healthcare regulations and standards.
Customer Support: Reliable customer support is vital for addressing any issues promptly.
Conclusion

Investing in professional medical billing services is essential for the smooth operation of any healthcare practice. It not only ensures accurate billing but also frees up valuable time for healthcare providers to focus on patient care.

For more information on how our expert team can assist with your medical billing needs, visit UMBS Billing Services.
Composerコマンドで解決する不具合の理由と仕組み

**・参考サイト：** https://getcomposer.org/
# **【これを書くに至った経緯】**
<br>
ある日を境に、

**ReferenceError: livewire is not defined**

このようなエラーで急にlivewireが動作しなくなり、元々livewireが動作していた環境と動作しなくなった環境の差分を確認してもvendor内での差分がありませんでした。composer install で依存関係を再インストールしなおしたところ、
解決。

また、

**ReferenceError: PhpDebugBar is not defined**

このようなエラーで急にlaravelのデバッグバーも表示されなくなり、上記同様にcomposer install で依存関係を再インストールを試みましたが解決せず、composer dump-autoload をしたところ解決しました。

**上記２つに共通しているのは、問題のない環境のvendor内(同じプロジェクトのテンプレートで依存関係は同じ)と当環境のvendor内で差分がなかったことです。なぜ差分が無いのにも関わらず、**

`composer install`

`composer dump-autoload`



**これらでなぜ解決できたのかが疑問すぎたため、そもそものcomposerとはなんなのかまとめようと思ったことが経緯です。**
<br>

# **【Composer installの役割】**

`composer install`は、`composer.json`と`composer.lock`ファイルをもとに、必要な依存パッケージを`vendor`ディレクトリにインストールします。このプロセスでは、次のことが行われます：

#### **依存関係の再インストール**：

`vendor`ディレクトリ内に存在する依存パッケージが、`composer.lock`に記録されたバージョンと一致していない場合、それらが再インストールされる。

#### **オートローダーの再生成**：

依存パッケージがインストールされた後、オートローダーファイルが生成され、このオートローダーは、プロジェクト内で使用されるクラスを自動的にロードする役割を持っている。

### - composer installのオートローダー再生成の特徴

依存関係のインストール後にオートローダーが再生成されるが、既存のオートローダーキャッシュが残っている場合、再生成されたオートローダーが正しく反映されないことがある。

##

**このプロセスで、Livewireが動作するようになったのは、ファイルの内容そのものに問題があったわけではなく、オートローダーの依存関係の再解決が必要だったためと考えられます。**

# **【Composer dump-autoloadの役割】**

`composer dump-autoload`は、オートローダーファイルを再生成するためのコマンドです。

このコマンドを実行すると、次のことが行われます：

#### **オートローダーの再生成**：

プロジェクト内のすべてのクラスがオートローダーによって認識されるように、最新の状態でオートローダーが再生成される。これは、新しいクラスが追加されたり、ファイルが移動されたりした場合に特に重要。

### - composer dump-autoload のオートローダー再生成の特徴 

オートローダーのみを完全に再生成し、古いキャッシュをクリアする

##

**PhpDebugBarのエラーが`composer install`で解決せず、`composer dump-autoload`で解決したのは、オートローダーのキャッシュやメタデータが正しく更新されていなかった可能性があり、それが再生成されたことでクラスやファイルが正しく読み込まれるようになったためと考えられます。**

# **【差分がないのに問題が発生する理由】**

`vendor`ディレクトリの中身が同じでも問題が発生する理由はいくつかあります：

#### **キャッシュの問題**：

オートローダーや他のキャッシュが古い状態のままで、最新のコードや依存パッケージの変更が反映されないことがある。

#### **ファイルシステムの不整合**：

ファイルのパーミッションやシンボリックリンクの問題などで、同じファイルでも読み込まれ方が異なることがある。


#### **環境設定の違い**：

PHPの設定や環境変数の違いが原因で、同じコードでも動作が異なることがある。

## 

上記のことから今回のケースで、これらのコマンドを実行することで問題が解消されたのは、依存関係やオートローダーに何らかの不整合があったためと考えられます。
[GCP]Spannerエミュレータ

# 概要
- ローカルで利用できるCloud Spannerのインメモリのエミュレータ。
    - エミュレータを再起動するとスキーマ定義含めてすべての状態がリセットされる。
- GCPのプロジェクト不要で、無料でSpannerを利用した開発を進めることができる。
- Spannerの本番サービスと同じAPIを提供してくれる([制限事項あり](https://github.com/GoogleCloudPlatform/cloud-spanner-emulator/blob/master/README.md#features-and-limitations))。
- ローカルでの開発とテスト向け。

# インストールと起動
gcloud CLIで直接ローカルマシンにインストール・起動する方法と、Dockerイメージからエミュレータのコンテナを起動する方法の2種類がある。

例として、Dockerコンテナとして起動する手順を示す。

```
# Dockerイメージをpull
docker pull gcr.io/cloud-spanner-emulator/emulator

# Dockerコンテナを起動
docker run -p 9010:9010 -p 9020:9020 gcr.io/cloud-spanner-emulator/emulator
```
エミュレータには、gRPCリクエスト用のポート9010, RESTリクエスト用のポート9020が用意されているとのこと。
実際に起動すると、以下のようにログが流れ、エミュレータ自身がコンテナでそれぞれの通信を受けるために、9010, 9020のポートをリスンしていることが伺える。

```
2024/07/22 12:24:38 gateway.go:144: Cloud Spanner emulator running.
2024/07/22 12:24:38 gateway.go:145: REST server listening at 0.0.0.0:9020
2024/07/22 12:24:38 gateway.go:146: gRPC server listening at 0.0.0.0:9010
```


# インスタンスとデータベースの作成
例として、gcloud CLIでSpannerエミュレータ上に以下のデータベースを作成する手順を示す。
- プロジェクトID: `local-project`
- インスタンスID: `test-instance`
- データベースID: `test-db`

```
# 1. Spannerエミュレータ向けの configuration の設定
## 1.1. 任意の名前(ここではspanner-emulator)のconfigurationを作成して有効化する
gcloud config configurations create spanner-emulator

## 1.2. 現在有効化しているconfigurationに対する設定
### 認証処理をしなくする
gcloud config set auth/disable_credentials true

### GCPプロジェクトIDの設定
gcloud config set project local-project

### gcloud spannerコマンドグループ実行時のエンドポイントを上書きする
gcloud config set api_endpoint_overrides/spanner http://localhost:9020/

# 2. Spannerエミュレータ上にインスタンスを作成
gcloud spanner instances create test-instance --config=emulator-config --description="Test Instance" --nodes=1

# 確認
gcloud spanner instances list

# 3. Spanner エミュレータのインスタンス上にデータベースを作成
gcloud spanner databases create test-db --instance=test-instance
# 確認
gcloud spanner databases list --instance=test-instance
```



# 環境変数

GCP公式の各言語のクライアントライブラリ(例. Goだと[googleapis/google-cloud-go](https://github.com/googleapis/google-cloud-go/releases))を使用すると、アプリケーション内で環境変数 `SPANNER_EMULATOR_HOST` をチェックして、そのエミュレータが実行されている場合は自動で接続してくれる。

Goの場合、ORM[GORM](https://github.com/googleapis/go-gorm-spanner?tab=readme-ov-file#emulator) でも、同様の仕組みがあることを確認している。


# 参考

https://cloud.google.com/spanner/docs/emulator
onMounted直後に処理を呼び出す方法

# まとめ
setTimeoutで処理をタイマー設定しておき、onMounted内での処理は全て終わったように見せることで対応した。
```typescript
onMounted(() => {
    setTimeout(() => {
        isOpen.value = true; // ここにmounted直後に呼び出す処理を記述
    }, 0);
});
```

### 追記：コメントでアドバイスいただきました

#### 1. queueMicrotask
> マイクロタスク (microtask) とは、現在のタスクが完了し実行コンテキストの制御がブラウザーのイベントループへ戻る前、他に保留中のコードがなくなった時点で走る短い関数です。

現在のイベントループ内でのタスク完了後に自動で処理を走らせてくれる。
setTimeoutよりも軽量。

```typescript
onMounted(() => {
    queueMicroTask(() => {
        isOpen.value = true; // ここにmounted直後に呼び出す処理を記述
    });
});
```

#### 2. nextTick

```typescript
onMounted(async () => {
    await nextTick();
    isOpen.value = true; // ここにmounted直後に呼び出す処理を記述
});
```

#### 3. Promise.resolve
```typescript
onMounted(async () => {
    await Promise.resolve();
    isOpen.value = true; // ここにmounted直後に呼び出す処理を記述
});
```

# 経緯
vuetifyのv-navigation-drawerを使用し動的に増えるドロワーを実装していた際、ドロワー表示アニメーションを呼び出そうとしていた。
```vue: 親コンポーネント
<template>
    <SampleDrawer
        v-for="drawer in drawers" 
        :item="drawer.item"
        @open-new-drawer="openDrawer" 
        @close-drawer="closeDrawer">
    </SampleDrawer>
</template>
<script setup lang="ts">
    const drawers = ref<any[]>([]); // リストにドロワーを追加する度ドロワーが増える
</script>
```

```html: Sample.vue
<v-navigation-drawer v-model="isOpen"></v-navigation-drawer>   
```

### 1. mounted時に呼び出し
create時にはfalseで、mounted時にtrueへ切り替えることによりアニメーションを表示させようとした。
```typescript
isOpen = ref(false);

onMounted(() => {
    isOpen.value = true; // false状態で生成後、マウント時にtrueに変更
});
```
しかし、表示アニメーションはmounted時には呼び出されず更新時に呼び出される様で、結果としてアニメーション無しで表示されることとなってしまった。

### 2. mounted直後に呼び出し
そこで、mounted後に呼び出されるフックがあるかと思い(afterMount的な？)探したが残念ながら見つからず、下記の方法を試すこととした。
```typescript
onMounted(() => {
    setTimeout(() => {
        isOpen.value = true; // onMounted自体はsetTimeoutの実行が完了した段階で完了し、
    }, 0);                   // onMounted完了直後にタイマー設定しておいたフラグ変更処理が走る
});
```
結果として無事アニメーションを表示することに成功した。

# おまけ
ちなみに閉じるアニメーションについては分かりやすく、Unmountedでアニメーションが再生開始してから閉じるまで待った後に親からコンポーネントを削除する、といった形で解決した。
```typescript
const closeDrawer = () => {
    setTimeout(() => {
        drawers.value.pop(); // アニメーション再生終了を待ってコンポーネント削除
    }, 500);
};
```


# 感想
明らかに外法な気がするので正しい方法があるならそちらを使いたい…

# 参考
- https://developer.mozilla.org/ja/docs/Web/API/queueMicrotask
- https://ja.vuejs.org/api/general#nexttick
-