OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelでVSCodeがよしなにメソッドを読み込んでくれない

VSCodeも万能じゃない。

## 背景
### なぜか読み込んでくれないからエラーになることがある
ある日、Laravelで外部サービスログイン機能を実装するために、Socialiteをインストールしたら事件は起こった。
**書き方は正しいのにVSCodeが「そんなメソッドはない」と言ってくる！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747518/dbd040fc-3c20-05c7-a50f-a2450ea3834b.png)
(socialiteのドライバーで読み込んだstatelessメソッドが存在しない警告エラー)

でも、動かすとちゃんと想定通りに動く。
そりゃちゃんと公式リファレンスの仕様通りに書いてるからね…。

原因を調べると、どうやら読みはあっていたようで、
**動的なインスタンスにはIDEがうまいこと動いてくれていない**らしい。
[~IDEとは~](https://www.redhat.com/ja/topics/middleware/what-is-ide)

解消法を調べていたところ、明示的にクラスパスを指定できる記法なるものがあるらしいので、適用してみる。

## 解決法
### 呼び出したクラスを明示的に宣言する
書き方はこれ。
```php
/** @var Laravel\Socialite\Two\GoogleProvider  $driver */
$driver = Socialite::driver('google');
```
呼び出したDriverがどのクラスの内容で生成されるのかを`/** */`で定義している。

今回の例でいうと、`Socialite::driver('google')`で呼び出したものは`Laravel\Socialite\Two\GoogleProvider`というクラスのモノが使えるはずとなる。

`/** @var Laravel\Socialite\Two\GoogleProvider  $driver */`が記載されることで、IDEは「$driverという変数にはLaravel\Socialite\Two\GoogleProviderクラスが入ってくるらしい」という認識がされるため、内部のメソッドまで正常に読み込んでくれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747518/79f6c9f5-b127-9bfe-1948-76a22913c5d1.png)

:::note alert
ただし、以下のような書き方は駄目です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3747518/a34c097e-ae4d-7e74-37ba-1eb2576be1db.png)

一気に書いてしまいたいところですが、まずはDriver単体をしっかり読み込ませる必要があるため、ワンクッションおきましょう。
:::

今後も何故か読み込んでくれないという事象が発生したら、上記を試してみましょう。

## 参考
https://stackoverflow.com/questions/74338713/vs-code-intelephense-shows-incorrect-error-undefined-method-save?newreg=635cc32e38ec40b18e3d6f136f36f1a6

LINEオープンチャット「Laravel初心者勉強会」の皆様
[Laravel初心者勉強会](https://line.me/ti/g2/FZsFxomFhhxmUJstqAq0puXOqcfmXeAfnGDGxg?utm_source=invitation&utm_medium=link_copy&utm_campaign=default)
ドメイン駆動設計（DDD）入門 - 基本概念と実践の初歩

## 1. はじめに
この記事ではドメイン駆動設計(DDD)の基本概念と実践の初歩について、学習したことのアウトプットとして説明してみようと思います。私がドメイン駆動設計（DDD）に興味を持ったきっかけは以下です。

1. 担当するプロダクトでDDDを採用していたから
1. ドメイン知識の欠如により苦労したから

## 2. DDDの基本概念
DDDは、ソフトウェア開発においてドメイン知識を中心に設計を進める手法です。以下に主要な概念を示します。

### 2.1 ドメイン
ドメインとは、システムが扱う領域を指します。例えばECサイトで言うと、商品、購入履歴、注文などが含まれます。

### 2.2 境界づけられたコンテキスト
境界づけられたコンテキスト（Bounded Contexts）は、ドメインの一部を分割して一つのまとまりにする概念です。例えばECサイトの「在庫管理」と「販売管理」を別々のコンテキストとして分けることが考えられます。コンテキストを分けることで、異なる部分の設計を独立させることができ、コードの見通しが良くなります。

### 2.3 DDDにおける主要なパターン
- **Entity**は、ドメイン内で一位に識別できるオブジェクトです。例えば、ECサイトの「顧客」はエンティティであり、IDで一意に識別されます。
- **ValueObject**は、エンティティとは異なり、一意に識別されません。不変性があり、住所や価格などがこれに該当します。
- **Service**は、ドメインのビジネスロジックを担当するオブジェクトで、複数のエンティティや集約を操作します。サービスは2種類に分けられます。
  - **ドメインサービス**は、複数のエンティティや集約にまたがるビジネスロジックを提供し、ドメイン内でのビジネスルルーの一貫性を維持します。例えば「注文サービス」は、注文に関するビジネスロジックを担当します。
  - **アプリケーションサービス**は、ユーザーのユースケースに基づいたシステム全体のビジネスプロセスを実現するために、ドメインサービスやリポジトリと連携して全体的なビジネスロジックを担当します。 例えば「注文処理アプリケーションサービス」は、注文に関する一連のプロセス(注文の作成・確認、在庫の確保、支払いの処理、配送の手配等)をまとめて調整します。
- **Repository**は、エンティティや集約のデータの保存と再構築を担当するオブジェクトです。例えば「顧客リポジトリ」は顧客エンティティを保存し、必要な時に取り出せるようにします。
- **Factory**は、オブジェクトの生成を専門に扱います。特に複雑なオブジェクトや条件によって生成過程が異なるオブジェクトの生成に役立ちます。ファクトリを使用することで、生成の詳細を隠蔽し、コードの再利用性とテストの容易性を高めることが出来ます。
- **Aggregate**は、エンティティやバリューオブジェクトをグループ化(集約)したもので、一連の操作やルールを持つ単位です。例えば「注文集約」では、顧客エンティティと商品バリューオブジェクトが含まれ、注文に関する操作を提供します。

これらのパターンは以下のように分類出来ます。

1. 知識を表現する
    - エンティティ
    - バリューオブジェクト
    - ドメインサービス
    - 集約
1. アプリケーションを実現する
    - リポジトリ
    - アプリケーションサービス
    - ファクトリ

## 3. DDDの実践例
ドメインモデリングは、ビジネスロジックを整理し、ビジネスルールを実装するための設計プロセスです。まず、ドメイン全体を境界づけられたコンテキストに分け、それぞれの領域でエンティティ、バリューオブジェクト、エンティティ間の関係を定義します。これにより、システム全体の整合性と再利用性を高め、特定のビジネスルールを効率的に適用できます。ドメインモデリングの例を以下に示します。

### 3.1 顧客コンテキストのモデリング
「顧客」コンテキストでは、「顧客」エンティティと「氏名」バリューオブジェクトを定義します。顧客エンティティには氏名、メールアドレス、住所などの属性が含まれ、氏名バリューオブジェクトには姓と名の属性が含まれます。

### 3.2 価格変動への対応
ECサイトでは、セールなどにより商品価格が変動します。商品エンティティに「通常価格」と「割引価格」「割引率」の属性を持たせることで、セール期間中の割引価格などを正確に管理できます。価格変更サービスは特定条件（セール期間、特定顧客のプロモーションなど）に基づいて価格の切り替えを実施します。

### 3.3 注文の返品
注文の返品に対応するためには、ドメインサービスやリポジトリを活用して返品処理を実装します。注文サービスに「返品」機能を追加し、返品が発生した場合にどのように商品を返すのか、そのビジネスロジックを定義します。以下は返品プロセスの例です。
1. 返品理由と商品情報の保存
返品リクエストには返品理由を含め、返品対象となる商品の情報（商品名、価格、数量など）をリポジトリに保存します。これにより、どの商品がどの理由で返品されたかを追跡し、後で分析や改善に役立てます。
2. 在庫の更新
返品された商品は在庫に戻されるため、返品処理の一部として在庫を更新します。これにより最新の在庫情報を保ち、他の注文や在庫管理システムで正確な在庫数が把握できます。
3. 顧客への通知
返品処理の完了後、顧客へ通知します。返品承認の連絡、返品商品の受領確認、返金手続きの進行状況など、顧客が自分の返品がどの段階にあるかを理解できるようにします。

## 4. まとめ
DDDを学ぶことで、複雑なビジネスロジックを整理し再利用性の高い設計ができると感じました。特に境界づけられたコンテキストの考え方は、システム全体を明確に分割し、ドメインに集中した設計を行う上で非常に重要だと思いました。実践にはまだ多くのことを学ぶ必要がありますが、今回の学習を通じてシステム設計におけるドメイン知識の重要性を再認識しました。今後のプロジェクトでDDDの概念を活用し、より価値あるソフトウェアを作るために引き続き学んでいきたいと思います。
C#でCOM DLLを作る

# 環境
Windows 11 Pro (64bit)
Visual Studio Community 2022

# 手順
## DLLの作成

```dev.bat
@echo off
path %path%;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
prompt $e[33m$p$g$e[m
cmd
```

```comtest.cs
using System;
using System.Runtime.InteropServices;

namespace Sample {
	[ComVisible(true)]
	[Guid("502B2BA6-D4DC-449C-BC1A-A3169CE1B267")]
	[InterfaceType(ComInterfaceType.InterfaceIsDual)]
	public interface ITest {
		int MyBeep(int dwFreq, int dwDuration);
	}

	[ComVisible(true)]
	[Guid("FB3CB74C-E0F1-4ADD-BEEF-B60C6D78ADE8")]
	[ProgId("Sample.Test")]
	[ClassInterface(ClassInterfaceType.None)]
	public class Test : ITest {
		[DllImport("kernel32")]
		public static extern int Beep(int dwFreq, int dwDuration);

		public int MyBeep(int dwFreq, int dwDuration) {
			return Beep(dwFreq, dwDuration);
		}
	}
}
```

GUIDは`"C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\guidgen.exe"`で作成できる。


```
csc /t:library comtest.cs
```

## レジストリへの登録
スタートメニューをクリックし`cmd`と入力。
コマンドプロンプトを「管理者として実行」する。

COM DLLを作成したディレクトリに移動。

```
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm comtest.dll /codebase
```

`RegAsm : warning RA0000 : 署名されていないアセンブリを /codebase を使用して登録すると、同じコンピューターにインストール されるその他のアプリケーションとの競合が生じる可能性があります。/codebase スイッチは署名されたアセンブリのみに使用できます。アセンブリに厳密な名前を付けて、再登録してください。`
という警告は出るが正常に登録される。（署名については後述）

```
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm comtest.dll /u
```

で登録が解除される。

## テスト

```comtest.js
// cscript comtest.js
var test = WScript.CreateObject("Sample.Test");
test.MyBeep(440, 1000);
```

## 署名
コマンドプロンプトを「管理者として実行」する。

```
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\sn.exe" -k sgKey.snk
```

```
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc /t:library comtest.cs /keyfile:sgKey.snk
```
(java silver)演算子

## JavaSilverでメモしたところ備忘録として残しておこうと思います。
# 三項演算子
```java
条件式？式1：式2
```
* 条件式がtrueの場合は式1を評価した値を返す、falseの場合は式2を評価した値を返す
```java
//(num = 6,num = 6, result = 6)

String str = num == count? num < result?"ARG":"Bol":"CHL";//"BOL"が出力される
```
::::note
()をつけるとわかりやすい
::::

```java
//(num = 6,num = 6, result = 6)

String str = num == count? (num < result?"ARG":"Bol"):"CHL";//"BOL"が出力される

//numがtrueならnum < result?"ARG":"Bol"が評価
//numがfalseなら"CHL"
```

# ビット演算子
* 整数値の値に対してビット単位で処理を行うために用意されているもの

| 1 | 2 | 3 |
|:-:|:-:|:-:|
|&|1 & 2|1と2の論理積(//0)|
|\||1 \| 2|1と2の論理和(//3)|
|^|1 ^ 2|1と2の排他的論理和(//3)|
|~|~1|1のビット反転(//-9)|
|<<|1 << 2|1を左へ2ビットシフト(//4)|
|>>|1 >> 2|1を右へ2ビットシフト(符号あり)(//0)|
|>>>|z >>> 2|zを右へ2ビットシフト(符号なし)(//)|
【図解】初心者向け、Gitで開発を行うときに最低限必要になるGitコマンドとその操作フロー

GithubやGitlab等を使って開発を行うときにローカル側での操作で、最低限必要になるGitコマンドとその操作順をフロー図を加えて説明します。


# はじめに

一般的にGithubやGitlab等をリポジトリとして利用する場合、開発フローとしては「git-flow」か「Github Flow」を採用することが多いです。これらのフローの詳細についてはここでは省略するので、以下のリンクなどを参照してください。

- https://atmarkit.itmedia.co.jp/ait/articles/1708/01/news015.html

基本的にはどちらもmain or developブランチから開発する機能やissueごとにフィーチャーブランチを切って開発を進め、リモートリポジトリにプッシュしてプルリクエストを作成し、レビューを受けてマージするという流れになります。

今回は、これらのフローを実践する場合に最低限ローカルで必要になるGitコマンドを解説します。


# ローカルでの操作と使用するGitコマンド

開発はリモートのリポジトリをクローンしてローカルに持ってくるところからはじまります。その後フィーチャーブランチを切って開発し、コードをリモートリポジトリにプッシュするところで終わります。そして次の機能開発に移るというサイクルの繰り返しです。以下はこのサイクルの中で実行されるGitコマンドとその操作フローです。

![git初心者.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/62ceea40-ba13-969d-fdb2-3f2a430174cc.png)

**① git clone <リポジトリ>**

開発をはじめたら、リモートリポジトリをローカルに持ってくるためにclone操作を実行します。これは最初に1回だけ行い、次の開発に移るときも同じリポジトリを使う場合は行いません。リポジトリのURLはリモートリポジトリのページから取得できます。

```bash
$ git clone <リポジトリ>
```

**② git pull origin main**

フィーチャーブランチでの開発を始める前にmainブランチ(or master or developブランチ)に最新のリモートリポジトリの状態をローカルに反映させるためにpull操作を行います。リポジトリをcloneした後、他の人がリモートリポジトリに変更を加えた場合に必要になります。チームの開発フローによっては、mainブランチではなくmasterやdevelopブランチを指定することもあります。

```bash
$ git pull origin main
```

**③ git checkout -b <フィーチャーブランチ名>**

担当している機能やissueごとにフィーチャーブランチを切ります。このブランチで開発を進めます。ブランチ名は機能名やissue番号を含めるとわかりやすいです。

```bash
$ git checkout -b <フィーチャーブランチ名>
```

**④ 開発作業/コード修正**

担当している機能やissueに対応するコードを開発します。この作業はエディタやIDEを使って行います。

**⑤ git status / git status -uall**

開発中のファイルの状態を確認するためにstatus操作を行います。これは予期せぬ変更を加えていないかの確認のために実行していて、このコマンド実行でファイルやローカル・リモートリポジトリに何らかの変更が実行されることはありません。-uallオプションをつけると、詳細に表示されます。

```bash
$ git status
$ git status -uall
```

**⑥ git add <変更したファイル>**

④で開発したコードをステージングエリアに追加します。変更したファイルを指定してadd操作を行います。

```bash
$ git add <変更したファイル>
```

**⑦ git commit -m "コミットメッセージ"**

ステージングエリアに追加したコードをローカルリポジトリにコミットします。コミットメッセージの書き方は開発チームのルールがあることが多いです。

```bash
$ git commit -m "コミットメッセージ"
```

**⑧ mainの変更を取り込む**

ローカルでの開発中にリモートのmainブランチに変更が取り込まれた場合、現在作業中のローカルフィーチャーブランチにその変更を取り込む必要があります。この場合⑨の操作を実行します。

**⑨ git pull origin main**

②と同様にリモートの変更を取り込みます。ただし②はmainブランチに対し取り込みましたが、今回はフィーチャーブランチに取り込んでいる点で異なります。この時、フィーチャーブランチで行った変更がリモートの変更と競合した場合conflictが発生することがあります。conflictの解消手順はここでは省略します。

```bash
$ git pull origin main
```

**⑩ git push origin <フィーチャーブランチ名>**

ここまでの変更をリモートリポジトリに保存するためpush操作を実行します。リモートにフィーチャーブランチが存在しない場合はこのタイミングで作成されます。ローカル環境の故障等による開発物の消失のリスク回避のためにもこまめにpush操作を実施することを推奨します。

```bash
$ git push origin <フィーチャーブランチ名>
```

**⑪ 開発終了**

担当している機能やissueの開発が終了していない場合は④に戻って引き続き開発を実施します。終了している場合は使用しているGitLab/GitHub等のリポジトリマネージャー上でのマージリクエスト等の操作になり、ローカルでのgit操作は終了です。

リモートリポジトリ上でのマージ操作については[こちら](https://qiita.com/ko-he-8/items/94e872f2154829c868df)を参照ください。

https://qiita.com/ko-he-8/items/94e872f2154829c868df

**⑫ 次の開発の開始**

新しい機能やissueの開発に移っていきます。引き続き同じローカルリポジトリを使用します。

**⑬ git checkout main**

新しくフィーチャーブランチを作成する前に一度mainブランチに戻ります。この後は②に移り`git pull origin main`で最新の状態に同期後に開発を再開していきます。

```bash
$ git checkout main
```

# まとめ
Gitを使用した開発を行う際に最低限必要なローカルでの操作フローとそのGitコマンドを解説しました。実際に使い始めると様々なトラブルシューティングの必要性が出てくるかと思いますが、まずはこれらの操作を習得することで、リモートリポジトリとの同期を取りながら開発を進めることができます。
LAN分割機能でRTX830のLANを分割

○やりたいこと
LAN分割機能でRTX830のLANを分割

○結果
lan type lan1 port-based-ks8995m=divide-network　→LAN分割
vlan port mapping lan1.1 vlan1　→lan1.1をVLAN1割り当て
vlan port mapping lan1.4 vlan4　→lan1.4をVLAN4割り当て
ip vlan1 address 192.168.1.1/24
ip vlan4 address 192.168.100.1/24
dhcp scope 2 192.168.1.100-192.168.1.200/24
httpd host vlan1 vlan4　"httpd host vlan1"から変更
dns host vlan1 vlan4　"DNS host lan1"から変更
ローカルNW内のアクセス制限はなし



LAN分割したら既存設定どうなるのかと思った。変更前
ip lan1 address 192.168.100.1/24

変更後　消えた
show config | grep ^ip lan1
エラー: パラメータのキーワードが認識できません
↓これが追加されていた
ip vlan1 address 192.168.1.1/24
ip vlan4 address 192.168.100.1/24

l2tp/ipsecの接続、GUIが開けた、既存NW問題なし。


参考
部門ごとに社内ネットワークを構成する(LAN1ポートをポート別に分ける)
https://network.yamaha.com/setting/router_firewall/security/lan_side/divide_network-rtx1200/
LAN分割機能　6. 設定例
https://www.rtpro.yamaha.co.jp/RT/docs/lan-divide/index.html

○その他
↓これやったけどNW接続できなくなった。良くわからんけども、vlan割当したらできたので深掘りせず
6. 設定例
LAN分割機能の基本機能と拡張機能、それぞれを用いた設定例を解説します。

基本機能を用いた設定
基本機能を用いて以下のような設定を行います

インタフェース	IPアドレス
lan1.3	192.168.3.1/24
lan1.4	192.168.4.1/24
lan1インタフェースに対してLAN分割機能を有効にします。
# lan type lan1 port-based-ks8995m=divide-network
スイッチングハブの各ポートが個別のLANインタフェースとなります。

各LANインタフェースに対して、IPアドレスを割り当てます。
# ip lan1.3 address 192.168.3.1/24
# ip lan1.4 address 192.168.4.1/24

↓これやったらできた
拡張機能を用いた設定
拡張機能を用いて以下のような設定を行います。

インタフェース	所属するスイッチポート	IPアドレス
vlan1	lan1.1 lan1.2	192.168.10.1/24
vlan2	lan1.3 lan1.4 lan1.7	192.168.20.1/24
vlan3	lan1.5 lan1.6 lan1.8	192.168.30.1/24
lan1インタフェースに対してLAN分割機能を有効にします。
# lan type lan1 port-based-option=divide-network
スイッチングハブのポート毎に所属するVLANインタフェースを指定します。設定値が初期値と同様の場合は入力しなくても構いません。
# vlan port mapping lan1.1 vlan1
# vlan port mapping lan1.2 vlan1
# vlan port mapping lan1.3 vlan2
# vlan port mapping lan1.4 vlan2
# vlan port mapping lan1.5 vlan3
# vlan port mapping lan1.6 vlan3
# vlan port mapping lan1.7 vlan2
# vlan port mapping lan1.8 vlan3
各VLANインタフェースに対して、IPアドレスを割り当てます。
# ip vlan1 address 192.168.10.1/24
# ip vlan2 address 192.168.20.1/24
# ip vlan3 address 192.168.30.1/24
AWS Builder Cards体験会に参加してみた

# はじめに

AWS Builder Cards(非売品)を持っている先輩がtimes(※)で、体験会の参加者を募集したので参加してみました。

一緒に参加したam_i-12さんの記事は以下からどうぞ！

https://qiita.com/am_i-12/items/a5b90db2ba372418f163

※社内個人チャンネルのことで、X(旧Twitter)のようなもの。弊社のtimes文化についての詳細はこちら！

https://qiita.com/satomihoya/items/b125e1eaf44c4a643e6e

https://qiita.com/autotaker1984/items/79576581e239244772f1


# AWS Builer Cardsについて
AWSのサービスのアーキテクチャを学べる、2~4人の対戦型カードゲームです。
AWSの公式サイトでは以下の魅力を謳っています。

> Play your deck like you draw your AWS Architecture diagrams
理想のアーキテクチャ図のデッキを作って遊んでみましょう

> Made to fit into your work schedule
あなたの仕事の予定に合わせて作られています

> Strenghten social bonds with your coworkers
同僚との社交的な結びつきを強化します

非売品なのでAWSのイベントに参加するか、譲ってもらうか、、しか入手方法はなさそうです。


https://aws.amazon.com/jp/gametech/buildercards/

遊び方については以下をご覧ください！

https://aws.amazon.com/jp/builders-flash/202405/japanese-builder-cards/

https://qiita.com/yuskesuzki/items/97316cd3d0fb5f75fbc0


# 体験会の記録
- 参加人数: 6人(4人までしか遊べないため、Builder Cards経験者の先輩がファシリテーター、1組のみ2人ペアで実施。)
- 参加者について: 全員SAA以上を取得しており、他にもAWS Top EngineersやAWS Jr.Championsなどの歴代選出者や、re:Invent参加者、AWS実務経験が豊富な方などAWSについて詳しい方が集まりました。(私が一番下っ端でゲームを進められるか不安もありましたが、ちゃんとたのしめました！)
- 所要時間: ゲーム開始からは1時間、はじめる準備などで40分ほど
![IMG_9504.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3516746/ce27e246-0703-72d4-53f6-d4da9b721ee6.jpeg)

# どんな人におすすめ？
AWSに興味がある人には誰にでも！と言いたいところですが、**最低でもCLFを取得**していないと、ゲームをスムーズに進められない&楽しいと思えないかもしれません。
お気に入りのサービスや、一般的に良いといわれるアーキテクチャのカードを引いたときにゲームが盛り上がるので、最低限のサービスとアーキテクチャの知識(SNS+SQS+Lambdaいいよねとか、EC2にはAutoScalingあったらいいよねとか)を持っていないと、少し厳しい気がしました。

個人的には、**CLFを取得→SAA勉強中の方**にはゲーム感覚でアーキテクチャの知識を学べるので特におすすめです。
また、サービスやアーキテクチャの知識があればあるほど楽しめるので、AWSの実務経験が豊富な方や、多くのAWS資格を持っている方がいるとより一層盛り上がると思います。

# ゲームから学んだこと
ゲームから学んだことは以下の3つです。
1. アーキテクチャの勉強になる
1. AWSのサービスの分類に意識が向く
1. AWSイチオシのサービスがわかる


## 1. アーキテクチャの勉強になる
AWS Builder Cardsは良いアーキテクチャを作ると有利にゲームを進められるため、良いアーキテクチャとは何かがわかるようになるのは良いなと思いました。
(EC2とAutoScalingでポイント4アップ！ELB持ってたらさらに1枚カードを山札から引けるよ！等)

## 2. AWSのサービスの分類に意識が向く
アーキテクチャを作る際に、compute/containersならポイントが増える、analyticsなら1枚カードを引ける、などの指示が頻出するため、自然とサービスの分類に意識が向くのを感じました。
ゲームでは、EC2やLambdaの需要が高かったです。

## 3. AWSイチオシのサービスがわかる
ゲームの中でほしいサービスをポイントで買っていくシーンがあるのですが、購入ポイントが高いものがAWSのイチオシサービスなのかなぁということがなんとなくわかるのが面白かったです。
(CloudFormationよりCDKの方が購入ポイントが高い→CDKの方がAWSとしてはおすすめなのかな。。等)

# おわりに
今回初めてAWS Builder Cardsを実施してみましたが、なぜ市販されないのだろう、、レクリエーションとして取り組めるのに！と思うぐらい、楽しいかつ勉強になるカードゲームでした。
ゲームの中でわからないサービスが出てきても、カードの左下にサービスのQRコードがあるので、読み取って確認できるところもよかったです。
また、一緒に参加メンバーたちがAWSに詳しかったため、小話などでさらに知識を深めることもできて楽しかったです。
ただ、ゲームをやったからといって、そのサービスについて詳しくなれるわけではないので、当たり前だけど別途座学＋実践が必要だなと思いました。ただ、AWSの勉強のモチベーションはゲームを通してとても上がったので、いまいち勉強のモチベーションが上がらないという方にはおすすめです！
最後までご覧いただきありがとうございました！
(QA) IBM i にSMB(CIFS)でネットワークドライブ接続できない

## あらためてネットサーバーとは
[こちらの記事](https://qiita.com/gomAnomalocaris/items/7e5a3e9e20264cbaaa88)で紹介したようにIBM i はSMB/CIFSプロトコルをサポートしておりIBM i のファイルシステムの一部（または全部）をWindowsほかとネットワークドライブ共有ができます。この機能をネットサーバーと呼んでいます。ネットサーバーの歴史は古くたしかOS/400 V4頃からあったと思います。（ので25年以上前からある。）

先週、そのネットサーバーに接続できない、という問い合わせをいただきました。
fyi.ネットサーバーセットアップについては上記リンク以外に下記も参考になると思います。
■【できるIBM i 7.4解剖】第11回 「IBM i のネットワークファイル共有機能 NetServer」
https://www.i-cafe.info/column/serials/dekiruibmi_no11

## ネットサーバー IBM i の検索方法（接続方法）
新しいNavigator for i (2002ポートで接続）では、下記のメニューからネットサーバーで共有するIBM i IFSディレクトリを追加・削除・設定ができます。
***ファイルシステム　→　ファイル共有
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/0f87f232-5997-a4ee-2020-c7e210f0857f.png)
上記の画面では2つのIBM i IFSフォルダーが共用設定されています。***ここではPCMLという共用名のフォルダーを使います。*** このPCMLフォルダーのIBM i OS上の実際のパスは /PCML/WESBDEMO です。

細かいセットアップ手順は上記2つの記事にゆずりまして、以下、この記事ではWindowsからネットサーバーIBM i の検索の仕方だけご紹介します。

### 方法① Windowsのネットワークの検索から
ネットーワークのウィンドウの検索窓から探すのが一般的だと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/e89b4df7-1889-899b-41d8-89d122105723.png)
ここに下記のようにIBM i のTCP/IPホスト名かIPアドレスを入れて検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9cfa96c8-355a-63e4-93a6-1ae7727b742c.png)

ただしこの方法ではネットワーク環境によってはネットサーバーIBM i が検索できない場合があるようです。

### 方法② コマンドラインから NET USEコマンドを使用する
方法①で検索できない場合は、コマンドプロンプトを開いてNET USEコマンドを使用します。

``` 
NET USE Z: \\IBM i ホスト名またはIP\PCML 
``` 
※すみません、私のPC設定がノーマルでなく、バックスラッシュになっていますが、通常日本語環境WINDOWSですと円マークになります。
以下サンプル画面もバックスラッシュー＞円マークに読み替えてください。
上記コマンドをプロンプトから入力すると、下記のようにIBM i ユーザーIDとパスワードを聞かれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4020e80d-12cd-f8bc-4086-25e671593e2a.png)
正しいIDとパスワードを入力すると正常接続できた旨メッセージがでます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/4f0fd5fb-e1f7-697f-00c8-b489840f3afe.png)
ここで、Zドライブを確認すると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/48fd8633-6a3e-b0f6-b7cc-de3c297459f9.png)
ちゃんと見えてますね。念のためIBM i のIFSをACSから確認すると、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/071b0d4c-c21c-dd6c-6b5d-6607a0abfe63.png)
はい、同じものが見えていました。

GUIでも当然見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/98965a45-4616-a26a-ec37-3c5377c84908.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/1b588714-c9e8-aa44-2ac5-2316bb018659.png)

### 最後にネットワークドライブZ:を切断する際のコマンドもご紹介すると、
```
NET USE Z: /DELETE
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a0dfe368-d6d4-cdce-70b0-24c314e51a6e.png)
もちろんGUIから右クリックで切断もできます。
GUIだとしばらくXマークがついてIBM i IFSフォルダーが残りますがアクセスはできません。時間をおいて消えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9fade024-711c-ff8a-4d06-d035d87aec19.png)
ナレッジ記事をエクスポートする





+ [Salesforce Lightning でナレッジ記事をエクスポートする方法](https://www.codekiat.com/2020/04/export-knowledge-articles-salesforce.html)

+ [how to import external data into knowledge component](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clMZs)

:::note
Import External Content into Salesforce Knowledge
https://help.salesforce.com/s/articleView?id=sf.knowledge_article_importer.htm&type=5
:::
Metechoのまとめ

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



Metecho を使用すると、共有可能な Salesforce プロジェクトでの共同作業が簡単になります。 GitHub でコードを編集する方法を学ばなくても、プロジェクトを表示、テストし、貢献できます。チームと協力します。一時的な Salesforce 組織を作成します。この対話型ツールを使用して、変更を加え、変更を取得し、作業内容をプロジェクトに追加します。

https://metecho.readthedocs.io/en/latest/metecho-how-to.html#why-we-built-metecho

+ [Heroku のデプロイメント](https://metecho.readthedocs.io/en/latest/heroku-setup.html)

# インストール時のエラー

+ [RROR running auth:jwt:grant: Flag --username expects a value](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S000009fJCMSA2)

+ [Nov 09 04:02:37 neocol-metecho app/worker.1 mkdir: cannot create directory ‘/opt’: Read-only file system](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007PwxdGSAR)
+ [2024-05-03T16:56:53.861916+00:00 app[worker.1]: mkdir: cannot create directory ‘/opt’: Read-only file system](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ak0B6SAI)
Firebase HostingにNext.jsプロジェクトをデプロイ

# はじめに
この記事ではFirebase HostingにNext.jsプロジェクトをデプロイし、初期表示画面が出るまでを行います。

##### この記事で取り扱わないこと
- Firebaseへのアカウント登録方法

##### 動作環境
MacOS Ventura 13.5
Node v21.6.2

# 目次
1. [Next.jsプロジェクトを作成する](#Next.jsプロジェクトを作成する)
1. [Firebaseにプロジェクトを作成する](#Firebaseにプロジェクトを作成する)
1. [Firebaseにデプロイする](#Firebaseにデプロイする)
1. [参考文献](#参考文献)

# Next.jsプロジェクトを作成する
Next.jsのプロジェクトを作成します。
`npm run dev`を実行後[http://localhost:3000](http://localhost:3000)を確認し、Next.jsの初期ページが表示されればOKです。
```shell
$ npx create-next-app@latest
$ npm i
$ npm run dev
```
Next.jsの初期ページ
![Create_Next_App.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245466/21f5866c-18bf-6330-42fa-a42ac6a8a796.png)

# Firebaseにプロジェクトを作成する
[Firebaseのコンソール](https://console.firebase.google.com/u/0/?hl=ja)にアクセスします。

プロジェクトを追加をクリックします。
![Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245466/300ed440-9acd-61b8-3ce9-5e7368ac07e0.png)

プロジェクト名を入力します。
![プロジェクトの作成_-_Firebase_コンソール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245466/63804f11-c4f5-89a0-e9a1-4d0d2f25f190.png)

続行を選択します。
![プロジェクトの作成_-_Firebase_コンソール-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245466/c65fab9f-0210-cf1f-d34a-e413e300ce71.png)

プロジェクトを作成をクリックします。
これで少し待つとプロジェクトが作成されます
![プロジェクトの作成_-_Firebase_コンソール-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1245466/4dd962d4-dcf9-b014-6fb8-508df6d23872.png)

# Firebaseにデプロイする
firebase-toolsをインストールし、ログインします。
`firebase login`実行後、Googleログイン画面に遷移するのでご自身のアカウントでログインしてください。
```shell
$ npm install -g firebase-tools
$ firebase login
```

Firebaseにデプロイするためのセッティングを行います。
実行すると質問されるので、以下のように選択してください。
最後に`Firebase initialization complete!`と出力されればOKです。
```
$ firebase init hosting
? Please select an option: Use an existing project
? Select a default Firebase project for this directory: {先ほど作ったプロジェクトを選択}
? What do you want to use as your public directory? out
? Configure as a single-page app (rewrite all urls to /index.html)? No
? Set up automatic builds and deploys with GitHub? Yes
✔  Wrote out/404.html
✔  Wrote out/index.html

・・・・・
✔  Firebase initialization complete!
```

exportの設定を追加します。
```js:next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
    output: 'export'
};

export default nextConfig;
```

コードをビルドし、Firebaseにデプロイします。
`firebase deploy --only hosting`の実行が終わると、`Hosting URL`が出力されるので、それにアクセスするとデプロイしたものを確認することができます。
```shell
$ npm run build
$ firebase deploy --only hosting
・・・・
Hosting URL: https://test1-c5bdc.web.app
```

# 参考文献
- [Firebase に Next.js のアプリケーションを Hosting する](https://qiita.com/takiguchi-yu/items/5d22048b578bd311b996)
Batch Sizeの影響を減らす方法

# Batch Sizeを変えるとloss curveが変わる
GPUがVRAMのサイズが違うと、Batch Sizeが変わる。Batch Sizeだけを変えるとTrainingの結果が大きく変わってしまう事がある。


# learning rateのscaling
Batch Sizeを増やした割合だけ、Learning Rateも増やす
```
new_lr = base_lr * (new_batch_size / base_batch_size)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/2f99a132-5d7c-aec9-6d83-bc67fb7f43d1.png)

Learning RateのLinear Scaling RuleとWarmupを使えば、batch_size=8Kまでerrorを増やさずに学習できる。batch_sizeが大きすぎるとOver Smoothingで精度が落ちる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/965b43b1-164c-3c08-3897-60be8db6e671.png)

# Reference
[Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/pdf/1706.02677)
Javaで「Javaにおける変数とは」の動作を確認してみた

# 概要

Javaで「Javaにおける変数とは」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/var/index1.html

# 実装

以下のファイルを作成しました。
```JSample1_1.java 
class JSample1_1{
    public static void main(String[] args){
	int sum = 58 + 72 + 90;
	System.out.println("合計 " + sum);
	System.out.println("平均 " + sum / 3);
    }
}
```

以下のコマンドを実行しました。
```
$ javac JSample1_1.java 
$ java JSample1_1 
合計 220
平均 73
```

# まとめ

何かの役に立てばと。
【HTML/CSS】要素をブラウザ外に出す方法（≒ 透明以外の方法で要素をブラウザに表示させない方法）


## 結論

ブラウザ外に出したい要素に以下を適用させる。

```css
.off-screen {
  position: fixed;
  top: 0;
  left: 110%;
}
```

leftは100%でもいいかもしれない。
終わり。

## おまけのサンプル

```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>画面外サンプル</title>
  <style>
    #hoge {
      width: 100px;
      height: 100px;
      background-color: red;
    }
    .off-screen {
      position: fixed;
      top: 0;
      left: 110%;
    }
  </style>
</head>
<body>
  <div id="hoge" class="off-screen"></div>
</body>
</html>
```
（調査メモ）gulp5で画像ファイルが壊れた場合の対処

### 結論  
srcに`{encoding: false}`をつける  
  
### 問題  
gulp5が2024/03/29に正式ローンチされたので、自前の開発環境をアップデートしようとした。  
基本的にはgulp4のgulpfile.jsのままで動いたが、静的ファイルをコピーするタスクで、jpg, png画像が表示されなくなってしまった（コピー後のファイルが破損してしまった）。  
svg, txtファイルは正しくコピーできていた。  
  
### 原因  
gulp5の[changelog](https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md#500-2024-03-29)にある  
```
Default stream encoding to UTF-8
```
の影響と思われる。  

### 対処方法  
gulpの[issue](https://github.com/gulpjs/gulp/issues/2777#issuecomment-2036776560)に記載があり、srcに`{encoding: false}`をつけるとよいとのこと


以下の変更で動いた。  
```
const assets = () => {
  return src(developDir + 'static/**/*')
  .pipe(dest('./preview/'))
}
```
↓
```
const assets = () => {
  return src(developDir + 'static/**/*', {encoding: false})
  .pipe(dest('./preview/'))
}
```

画像ファイルもUTF-8エンコーディングされてしまっていたらしい。  
エンコードしたい場合は、gulpタスクをエンコード用 / 非エンコード用で分ける必要あり？  

### 参照  
- 同事象のstackoverflow  
https://stackoverflow.com/questions/78391263/copying-image-with-gulp?newreg=68810ff10e5649dbabfa475c54353965  

- 同事象のgithubのissue  
https://github.com/gulpjs/gulp/issues/2777#issuecomment-2036776560  
  
- gulp5の更新のお知らせ  
https://medium.com/gulpjs/announcing-gulp-v5-c67d077dbdb7  
  
- gulp5のchangelog  
https://github.com/gulpjs/gulp/blob/master/CHANGELOG.md#500-2024-03-29
s7のマクロを静的に展開するマクロ

s7のマクロはファーストオブジェクトで、動的に展開される。これは正しいLISPの挙動と思われるが、マクロを多用すればするほど実行速度は遅くなる。そこで、マクロを無理やり静的に展開するマクロを作った。

```scheme
(define (static-expand body)
  (let loop ((calls body)
             (ret '()))
    (if (null? calls)
      (reverse ret)
      (let ((next (cdr calls)))
        (if (and (not (null? next)) (not (pair? next)))
          (if (null? ret)
            (cons (let ((l (car calls)))
                    (if (pair? l)
                      (loop l '())
                      l))
                  next)
            (append (reverse (cdr ret)) (cons (car ret) next)))
          (loop next
                (cons (let ((call (car calls)))
                        (if (pair? call)
                          (let ((head (car call)))
                            (if (and (symbol? head) (defined? head (rootlet)))
                              (let ((_head (eval head (rootlet))))
                                (if (macro? _head)
                                  (let ((_call (eval `(macroexpand ,call) (rootlet))))
                                    (if (pair? _call)
                                      (loop _call '())
                                      _call))
                                  (loop (cdr call) `(,head))))
                              (loop call '())))
                          call))
                      ret)))))))

(define-macro (befine args . body)
  `(define ,args ,@(static-expand body)))

(define-macro (befine* args . body)
  `(define* ,args ,@(static-expand body)))
```

使い方は、関数定義の先頭文字をdからbに変えるだけw

いじょう
総合暗記補助アプリunfo(アンフォ) 制作メモ

# 目次
1. 概要
1. 使用技術
1. 機能一覧
1. デモンストレーション
1. 解説
    1. デザイン面
    1. コード面
1. 反省
<!--1. 補足-->

# 概要
Githubリポジトリ : https://github.com/ogaoga08/unfo_local
大学2年生に授業で作成したWebアプリケーションです。(ローカル環境にて作成)
大学受験での経験から欲しかった、忘却曲線ベースの単語帳アプリを作成しました。
既存のアプリよりも視覚的見やすさ、多機能さを実装することを意識しました。
　(名前はunforgettableから。ロゴを考えるのが好きなので授業課題外でロゴタイプも作成しました)
![ポートフォリオ_小笠原慎_ページ_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774078/ee319386-8428-96b8-d1c8-4914f50a23b4.jpeg)

>後述しますが、このアプリケーションは授業開始時に配布された簡単なブログアプリの雛形から作成したものです。インフラ部分は全て配布されたものです。

# 使用技術
<p>
  <img src="https://img.shields.io/badge/-Html5-444444.svg?logo=html5&style=popout-square" height="40">
  <img src="https://img.shields.io/badge/-Css3-1572B6.svg?logo=css3&style=popout-square" height="40">
  <img src="https://img.shields.io/badge/-Bootstrap-563D7C.svg?logo=bootstrap&style=popout-square" height="40">
  <img src="https://img.shields.io/badge/-Javascript-ffffff.svg?logo=javascript&style=popout-square" height="40">
  <img src="https://img.shields.io/badge/-FastAPI-ffffff.svg?logo=fastapi&style=popout-square" height="40">
  <img src="https://img.shields.io/badge/-Docker-ffffff.svg?logo=docker&style=popout-square" height="40">
  <img src="https://img.shields.io/badge/-Mysql-ffa500.svg?logo=mysql&style=popout-square" height="40">
</p>

# 機能一覧
- ユーザー登録、ログイン機能(授業にて雛形配布)
- ヘッダー、ナビゲーションバー、その他UIデザイン(Bootstrap)
- ホーム画面
  - 単語カードのOK,NG機能
  - 単語カードのフリップ機能(JavaScript)
  - クイズカードの正解判定(JavaScript)
  - タグ検索機能(MySQL)
- カード登録画面
  - クイズの選択肢数選択(JavaScript)

# デモンストレーション
<iframe width="560" height="315" src="https://www.youtube.com/embed/OmOXHVjJsmA?si=cEO3qqwZjzOL-p93" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 解説
### デザイン面
既存のアプリケーションよりも視覚的に見やすくするため、ライトモードの背景にした。また基本的にアプリ操作部分に緑、カード(単語帳)部分に赤を描画することで操作タスクを視覚的にわかりやすく工夫した。
そしてカード下部には進捗を表すプログレスバーを設置することによりあと何回で学習が終了するのかを視覚的にわかりやすく設計した。

<img width="309" alt="unfo_ホーム画面" src="https://github.com/ogaoga08/unfo_local/assets/131137413/c53b89a6-c4a7-45cf-8351-4f57acbec717">

### 　コード面
ログイン機能やディレクトリの構成は授業のTAさんが作成してくれたため、ある程度の雛形は用意されている状態(REST APIを利用した簡単なブログ投稿アプリ)から作成した。モデルとコントローラーをpythonで書いているため、初心者でも作りやすかった。
FastAPIでのテンプレートエンジンの記法を理解することが難しく、エラーになることが多かったため、chatGPTにコードを投げて修正していった。

# 反省点
初めてということもあり非常に可読性が低いコードばかりになってしまった。
画面に表示する単語カードの条件を全てSQL文で指定しているため、今ならもっとフロント側で処理できる気がする。
現在(2024/6/3)はReactで開発をしているので、コンポーネント化して再利用できる機能が多いと感じた。
今後モバイルアプリに移行する予定なので、そのときにリファクタリングしたいと思う。

<!-- 
# 補足
1年ほど前に作成したこのアプリについて、作成のプロセス・使用技術について思い出すため、またポートフォリオ作成の勉強のためにこの投稿を書きました。
このアプリケーションはそもそもある程度の雛形が用意されたものであること、基礎的なコーディング方法を学んでいなかったため、とんでもなく可読性の低いコードであることなどツッコミどころが満載ですが一記録として見ていただけたら幸いです。
-->
XserverのCronの設定画面のパスの指定の仕方について

①パスの指定でつまづいてしまった点
  phpのバージョンの指定のパスを入力した後に、半角スペースが必要

/usr/bin/php8.2 /home/サーバーの名前/ドメイン名.com/public_html/実行ファイル名.php

②実行するファイルのパーミッションは701

上記の設定で、cronが時間通りに動くようになりました。
ここは違う、ここはこの方がいいかも？
等々ございましたら教えていただけますと幸いです。

最後まで見ていただきありがとうございました。
ApplicationContextの適切な閉じ方


ApplicationContextはAutoCloseableを実装していないため、try-with-resources文で直接使用することができません。そのため、try-with-resources文でApplicationContextを使用すると、警告が表示されます。

代わりに、try-with-resources文で使用するリソースは、AutoCloseableを実装している必要があります。しかし、SpringのApplicationContextはAutoCloseableを実装していないため、この方法は適切ではありません。

代替案として、ApplicationContextを使用した後に、finallyブロック内で明示的に閉じることが推奨されます。以下はその例です。

```java
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
try {
    // ApplicationContextを使用するコード
} finally {
    ((ConfigurableApplicationContext) context).close();
}

```
Google Cloud Workflowsに過度な期待をするな

# はじめに

こんにちは、 みなさんはGCPのサービスの一つである、Workflowsはご存知ですか？

Workflowsは、Googleが提供するサーバレスのワークフローサービスです。2021年に一般提供が開始されました。
https://www.infoq.com/jp/news/2021/02/google-cloud-workflows/

https://cloud.google.com/workflows?hl=ja

Workflowsは、CloudFunctionや外部APIなどあらゆるサービスを呼び出して、それらを繋ぎ合わせることができるサービスです。
フローの定義にはFOR文やSWITCH文といった制御文を記載でき、サービスの戻り値を元に次にどのサービスをどのように呼び出すかを定義することができます。
また、簡単な文字列加工や関数による変数の操作が可能です。Workflowsは、まさにデータ加工のパイプラインを構築するにはもってこいのサービスのように思えます。
そこで、私はかねてから考えていた構想の実現のためにWorkflowsを使ってみることにしたのですが、そこで思わぬ落とし穴にハマってしまいました。

# 結論

**Workflowsに「処理」を期待するな。**

すみません、ミスリーディングなタイトルをつけました。この場でお詫びします。Workflowsは素晴らしいツールです。でもWorkflows単体での「処理」能力に期待するのはやめましょうというのが記事の主張になります。
Wokflowsでは、Pythonなどのプログラミング言語のように、自由に文字列やファイルの加工するといった「処理」をすることはできません。　一部できるのですが、制約が非常に多いのでやめたほうが賢明です。
Workflowsにはワークフローとしての役割だけを求めるようにしましょう。
当たり前のことのように思えますが、実際にワークフローを記述していくと「ここで直接この処理をかけたらめちゃくちゃ便利なのにな…」と思う場面に何度も出会しました。

この記事では、なぜ処理を書くことができないのか、書いてはいけないのかを例を用いて紹介します。

# Workflowsについて補足
Workflowsでは、ワークフローの定義をYAMLで記述すると、フロー図として可視化することができます。
![スクリーンショット 2024-05-13 1.29.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/d3642e84-73bb-934d-cc69-c0619352c5be.png)

実行する時は、JSONで引数となるデータを渡してあげると、定義したフローが実行されます。
![スクリーンショット 2024-05-13 1.31.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/45de7f7a-6e0b-6ecf-85a4-fd3486e8731e.png)


# Workflowsでできないこと

## Workflowでは512kBしか変数にデータを持つことができない

とあるWeb APIからJSONを受け取って、結果をループで回して特定の値を抽出する処理を実現したいとします。
これはすべてWorkflows上で実現することができます。Workflowだけで書けて嬉しいですね。 ただし、大きな落とし穴があります。これが正常に動作するのはJSONのデータが512KB以下にの場合に限ります。

正確には、「すべての変数に使えるメモリの最大量」が512KBであるので、ひとつの変数で扱えるデータは512KBよりももっと少ないです。

Workflows上での回避方法は残念ながらありません。
CloudFunctionで処理するように書き換えしましょう。

https://cloud.google.com/workflows/quotas?hl=ja#resource_limits

発生するエラー：
```
{"message":"ResourceLimitError: Memory usage limit exceeded","tags":["ResourceLimitError"]}
```


##  Workflowsではスクリプトの実行はできない

Workflowsのyamlの中に直接JSやPyhthonなどを書いて処理を実行することはできません。あくまでWorkflowsが用意している非常に限られた関数のみ理由できます。

https://cloud.google.com/workflows/docs/reference/stdlib/overview


## Workflowsでは日付の加工はできない(むずかしい）

Workflowsで使える日付の関数は`format`と`parse`のみです。
https://cloud.google.com/workflows/docs/reference/stdlib/time/format

しかも、`format`で出力できる日付の形式は`ISO 8601 format`のみです。
日付の操作を行う関数が準備されていないので、日付の操作を行うのは複雑なコードになってしまうか、そもそも実現できません。

この限られた関数と文字列操作を組み合わせて日付の操作を実現している方がいらっしゃるので、もしやりたい方はご参考になさってください。

https://swfz.hatenablog.com/entry/2021/12/06/191258


難しい処理はCloud Functionで書きましょう

#  WorkflowsではZipの解凍はできない

ダウンロードしたZIPの中から文字列を取得したい！
結論、できません。
Cloud Functionでやりましょう。

# まとめ

この記事では、Google Cloud Workflows上で複雑な処理を期待せず、あくまでサービス間の連携、処理の流れを制御する役割として認識する必要があるということを述べました。
Workflowsでは、文字列の加工やループといった処理が可能であるため複雑な処理を実装したくなりますが、関数が限られていたり、変数の最大容量が512kBだったりと処理の実装には制約が非常に大きいです。
Workflowsはワークフローの定義には非常にシンプルで強力なツールです。複雑な処理はCloud　Functionに任せて、Workflowsでは、あくまでワークフローの定義に専念しましょう。
Node-REDのobnizノードでどちらのノードを選ぶか - 使い方概要


Node-REDのobnizノードを使う時に結構悩む人が多いと思います。

## 3種類のノード（2種類 + 裏ボス1種）

（現時点バージョンだと）まずは3種類のノードがあり、1つは裏側の設定に隠されていて、2つは表に見える場所にあります。

> ![スクリーンショット 2024-05-13 1.28.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/3ca0e23e-448e-db98-b907-11d0b311e70c.png "スクリーンショット 2024-05-13 1.28.38.png")

### obniz functionノード

**処理を1回実行**するときに使えます。

LEDやスピーカーなど **アクチュエーターやインジケーター**を操作したい **アウトプット系の処理**場合はobniz functionノードを利用するのがオススメです。

### obniz repeatノード

1分ごと、毎秒...など **定期的に処理を実行**したい時に使えます。

**センサーなど**の数値を常に取得したい **インプット系の処理**はobniz repeatノードを使うようにするのがオススメです。

### 設定ノード

割とクセモノです。 **隠れノード**で裏ボスです。

隠されていて、設定するときに開かれます。表の編集画面には見えないです。

obniz IDを設定しておくだけではなく、共通のピンアサイン（各ピンに何を設定するのか）などの初期化処理も記述します。

**このノードを消し忘れてobnizが謎に永遠に動いてしまう事象**が慣れないうちはあります。

## 例外

インジケーターはobniz functionノードを使った方が良いですが、ディスプレイへの描画時は常に表示させたい場合もあるのでobniz repeatノードを使うのもアリな気がしています。

検証中...
GASを使ってDiscord Botを手軽に作成する（おまけ：定期投稿まで）

# はじめに
discordのチャンネルにメッセージを通知してくれるbotを作ってみたかったので、GASを利用し通知botを作成してみました。
本記事はGASを利用してdiscordのbotを作り方を紹介したものになります。


# 目次
- [前提](#前提)
- [Discord側の準備](#discord側の準備)
- [GAS側の準備](#gas側の準備)
  - [ソースの準備](#ソースの準備)
- [動かしてみる](#動かしてみる)
- [おまけ：定期実行に対応させる](#おまけ定期実行に対応させる)

# 前提
- Botを追加したいサーバーにテキストチャンネルを準備
- GASを使用するためのGoogleアカウントを準備

# Discord側の準備
テキストチャンネルを右クリック > チャンネルの編集 > 連携サービス > ウェブフック から「新しいウェブフック」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/0614d33f-1573-bc05-bb4b-af7027d6e8f0.png)


その後「ウェブフックURLコピー」をクリックし、URLをコピーしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/260dbe6e-9280-dd51-4d12-a5110057c894.png)



# GAS側の準備
GASを使用するGoogleアカウントにログイン後、Googleドライブを開きます。
必要な場合は作業フォルダも合わせて作成しておいて下さい。
画面を右クリック > その他 > Google App Script を選択しApp Script側に移動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/601b43fc-e669-f109-95f6-683c70efd94a.png)


### ソースの準備
ソースの詳細はコメントアウトの通りです。

```javascript:main.gs
function calculatePercentageOfYear() {
  const today = new Date();
  const year = today.getFullYear();
  
  // 1月1日の日付を取得
  const startDate = new Date(year, 0, 1);

  // 今日までの経過日数を計算
  const daysPassed = Math.floor((today - startDate) / (1000 * 60 * 60 * 24));

  // 今年の総日数を計算
  const endDate = new Date(year, 11, 31);
  const totalDays = Math.floor((endDate - startDate) / (1000 * 60 * 60 * 24));

  // 進捗率を計算
  const percentageFinished = (daysPassed / totalDays) * 100;

  // 通知メッセージを作成
  let message = year + " 年は全体のうち " + percentageFinished.toFixed(2) + "% が終了しました。";

  // 通知を送信
  sendNotification(message);
}

// Discord側に通知
function sendNotification(message) {
  const webhookUrl = "Discord側コピーしたwebHookのURL"

  const payload = {
    "content": message
  };

  const options = {
    "method": "POST",
    "contentType": "application/json",
    "payload": JSON.stringify(payload)
  };

  UrlFetchApp.fetch(webhookUrl, options);

  Logger.log(message);
}
```

# 動かしてみる
ここまで出来たら実際に関数を動かしてみます。
画面上部のバーにおいて動かす対象の関数を選択し、「実行」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/a9906b33-2935-af1b-053d-06dad0379eb3.png)

実行するとDiscord botがチャンネルにメッセージを投稿しているのが確認できます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/25ac34d3-3087-a12f-c03e-baf8e85ceffd.png)


# おまけ：定期実行に対応させる
GASではトリガーを使用し、プログラムを定期実行させることができます。
画面左の時計マーク（トリガー）をクリックします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/68b0c8a4-d59f-b521-35d8-948b8eb93bf2.png)


今回は試しに毎月15日のAM：10~11時に対象の関数を実行するようにトリガーを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/229e12c1-004e-ea5f-0306-d16cd0fbb5b8.png)


・`実行する関数を選択`：動かしたい関数を選択（今回は`calculatePercentageOfYear`で設定）
・`実行するデプロイを選択`：Head
・`イベントのソースを選択`：時間主導型
・`時間ベースのトリガーのタイプを選択`：月ベースのタイマー
・`日を選択`：15日
・`時刻を選択`：午前10時～11時

以上の設定を保存すると毎月15日のAM10時～11時にプログラムが実行され、botがDiscordのチャンネルに自動でメッセージを投稿してくれます。


# 終わりに
めんどい作業もGASを使って自動化していきたいです。


- 今回のソース

https://github.com/enumura1/gas-discord-year-progress-notifier
ER図について

データベース設計について
　Rubyonrails初学者になります。備忘録のために記事を投稿します。


 現在はチーム開発カリキュラムを学習しており、データベース設計という単語がでてきました。

 データベース設計とは？
 　どのような情報をどういった構造でデータベース化するのか設計することをデータベース設計というらしい。

データベース設計に必要なこと
　1.エンティティを洗い出す
 　エンティティとはテーブルのこと。実装したい機能に従って必要なテーブルを作成する。

  ２．要件から情報を抜き出す
  　例えば商品テーブルでいくと、商品名であったり、商品の紹介文であったり、カラムにあたる部分

　３．重複する部分は分割する
 　　この部分は私にとって理解が難しかった部分にあります。
   注文テーブルを例にとって理解しました。
   ![スクリーンショット 2024-05-13 003510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788856/511f01d5-f767-9c62-eac1-d6d703dc8493.png)

例えばこのような注文テーブルがあるとします。（雑ですがご容赦ください）２つ悪いところがありまして、１つ目は空のカラムが存在していることです。空のカラムが存在しているとデータベースとして運用する際にエラーが発生する要因になるとのこと。
２つ目はカラムが増える可能性があること。現状では購入商品は２種類のみですが、今後購入した人が３種類や４種類購入することもあるかと思いますが、そうした場合に新たにカラムを追加する必要があります。一度作成したデータベースを後から更新するのは、バグなどを生むリスクが大きいため、よろしくないとのことです。

ではどうすればいいのかというと、もう一つ新たにテーブルを作成する必要があります。
![スクリーンショット 2024-05-13 004522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788856/5ee29f28-1887-363f-d011-f4fa42d89b60.png)
下の２つが新しいテーブルになります。注文商品テーブルには注文IDと紐づけできるように注文IDのカラムが追加してあります。

以上のことからデータベースを作成する際には
　　・空のカラムは存在していないか
 　　・カラムを増やす必要がないか
 この２つに注意して作成する必要があります。

 途中ですが、いったん休憩のため後日作成いたします。拙い文章で申し訳ありません。間違いがあれば、ご指摘いただけると幸いです。
JavaScript event loop

Important Word
・Call Stack
・Task Queue(Callback Queue)
・Microtask Queue

1️⃣　check Call Stack → clear Call Stack
　　↓ if Call Stack is clear

2️⃣　check Task Queue → clear Task Queue
　　↓ if Task Queue is clear

3️⃣　check Microtask Queue → clear Microtask Queue 
　　↓ if Microtask Queue is clear
  
　　go back to Call Stack and loop again. 1️⃣ → 2️⃣ → 3️⃣

https://www.lydiahallie.com/blog/event-loop

https://www.youtube.com/watch?v=8aGhZQkoFbQ
SCVMM+Hyper-V環境でLinux VMテンプレートを作成する

## 概要
vSphereの仮想マシンテンプレートと同様に、SCVMM環境でもVMテンプレートを用いて効率的にVM作成できるようにする。

## 環境
- System Center VMM 2022
- Hyper-Vホスト：Windows Server 2022
- テンプレート化対象：CentOS 7.9

## テンプレートの作成元となる Linux VM をセットアップ
1. SCVMMからVM作成
    - 空のバーチャルハードディスクを使用してCentOS7.9をISOからインストール
1. LIS（Linux Integration Services）をインストール　→ビルトインで含まれているため省略
1. VMMゲストエージェントをインストール
    - SCVMMの以下フォルダにあるファイルをVMへ持ってくる
    - C:\Program Files\Microsoft System Center\Virtual Machine Manager\agents\Linux

```
//VMMゲストエージェントインストール用ファイルを持ってくる
[root@localhost tmp]# ls -l
合計 4008
-rw-r--r--. 1 root root    9608  2月 19  2022 install
-rw-r--r--. 1 root root 4085760  2月 19  2022 scvmmguestagent.1.0.3.1028.x64.tar

//インストールを実行するとエラーが返ってきた
[root@localhost tmp]# chmod +x install
[root@localhost tmp]# ./install scvmmguestagent.1.0.3.1028.x64.tar
-bash: ./install: /bin/bash^M: 誤ったインタプリタです: そのようなファイルやディレクトリはありません

//Windowsからファイルを持ってきたので改行コードがよくないと想定して直す
[root@localhost tmp]# sed -i 's/\r//' install

//再度インストールを実行すると今度は正常に完了
[root@localhost tmp]# ./install scvmmguestagent.1.0.3.1028.x64.tar
05/05/24 04:01:11 UTC   Installing SCVMM Guest Agent to /opt/microsoft/scvmmguestagent
05/05/24 04:01:11 UTC   Successfully installed SCVMM Guest Agent
```
## SCVMMでVMテンプレートを作成
Linux VM の場合、ライブラリに保管された仮想ハードディスク（VHDX）をソースとしてVMテンプレートを作成する。（ホスト上に展開されている既存VMをソースとしてVMテンプレートを作成することは不可。）

#### 作成した仮想マシンをライブラリに保管
VMとサービス >> 仮想マシンを選択 >> 右クリックして「ライブラリに保管」

#### 仮想ハードディスク（VHDX）をライブラリにインポート
ライブラリ >> 物理リソースのインポート >> テンプレート元となるVMの仮想ハードディスク（VHDX）を選択してインポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/52afc92a-9555-7edf-4052-091c74f9e340.png)

#### VMテンプレートを作成
ライブラリ >> VMテンプレートの作成
ソースには、テンプレート元となるVMの仮想ハードディスク（VHDX）を使用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/d715f8ac-bd1c-a835-a2c1-c190c85ce16c.png)

centos7.9-template という名前のVMテンプレートが完成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/c421c128-7e50-c75d-bcd4-45621059a082.png)

## 動作確認
#### VMテンプレートからVMを作成する
ソース選択では、VMテンプレート「centos7.9-template」を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/d671a560-38ef-f3bd-3ecd-d158210b0ff1.png)

1分程度でVMが作成できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3359374/ff42d078-133a-205a-48cc-a7648a8c56b2.png)

## 参考
テンプレートの作成元となるLinux VMのセットアップ時にVMMエージェントをインストールしていないと、VMテンプレートからVM作成する際に以下ブログ記事のようにVM作成が完了しない問題が発生した。手元の環境ではタスク進捗率は91%で止まりジョブは完了しないがVMは作成されておりコンソールからログインは可能な状態。
[Japan System Center Support Blog | VM テンプレートから仮想マシン (Linux 系) を作成が完了しない](https://jpsystemcenter.github.io/blog/SCVMM/SCVMM_error_makeVMfromtemplete/)
LightGBM初期パラメータの決定境界

ふと「そういえばランダムフォレストとGBDTって仕組みが違うよな」って思ったので決定境界を見てどのように分類されているのか見てみたくなりました。

# 決定境界の関数
過去の記事から持ってくる

https://qiita.com/murasaki1994/items/7b116747a022aa9805f0

```Python3
from sklearn import preprocessing
import matplotlib.pyplot as plt
import numpy as np
def showline_clf(x, y, model, modelname, x0="x0", x1="x1"):
    fig, ax = plt.subplots(figsize=(8, 6))
    X, Y = np.meshgrid(np.linspace(*ax.get_xlim(), 1000), np.linspace(*ax.get_ylim(), 1000))
    XY = np.column_stack([X.ravel(), Y.ravel()])
    x = preprocessing.minmax_scale(x)
    model.fit(x, y)
    Z = model.predict(XY).reshape(X.shape)
    plt.contourf(X, Y, Z, alpha=0.1, cmap="brg")
    plt.scatter(x[:, 0], x[:, 1], c=y, cmap="brg")
    plt.xlim(min(x[:, 0]), max(x[:, 0]))
    plt.ylim(min(x[:, 1]), max(x[:, 1]))
    plt.title(modelname)
    plt.colorbar()
    plt.xlabel(x0)
    plt.ylabel(x1)
    plt.show()
```

# LightGBM
```Python3
from lightgbm import LGBMClassifier
from sklearn.datasets import make_blobs

x, y = make_blobs(n_samples=300, centers=4,random_state=0, cluster_std=0.60)
model = LGBMClassifier()
model.fit(x, y)
showline_clf(x, y, model, "LightGBM", x0="x0", x1="x1")
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/f952f83d-4481-9790-a992-7781ae4b6f7f.png)
もっとこう複雑なもんだと思っていたけど決定木とそう変わらないけど仕組み上そんなもんか。

# ランダムフォレスト
コードはさっきの続きです。
```Python3
from sklearn.ensemble import RandomForestClassifier

model2 = RandomForestClassifier()
model.fit(x, y)
showline_clf(x, y, model2, "RandomForest", x0="x0", x1="x1")
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/478b4012-5cfe-b11a-57d6-145756e1e448.png)

まあ学生時代からよく見てた決定境界だな・・・

# Scikit-LearnのGradientBoostingClassifier
コードはさっきの続きです。
```Python3
from sklearn.ensemble import GradientBoostingClassifier

model3 = GradientBoostingClassifier()
model3.fit(x, y)
showline_clf(x, y, model3, "GBDT(scikit-learn)", x0="x0", x1="x1")
```
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782889/318cb2de-7670-5f59-725e-c47b2b8f2527.png)
多少LightGBMと比べて複雑になっているけど、それでもランダムフォレストと比べたらかなりシンプルに分類されている。
詳しい仕組みはこのサイトが分かりやすいです。

https://nisshingeppo.com/ai/whats-gbdt/



# まとめ
可視化しないと分からないものがそこにある
【React】仮想キーボードの Enter キーのラベルを変更する方法

`enterKeyHint`を使用すると仮想キーボードの Enter キーのラベルを変更できます。

```tsx

export function Sample() {
  return (
    <input
      type="text"
      enterKeyHint="search"
    />
  )
}

```

上記のようにした場合には以下のように表示されます。

![IMG_5098.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/36c51cd6-d084-5adc-6ff7-aef0b3c0deaf.jpeg)

- `enter`の場合
![IMG_5097.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/f4190fab-75c3-34e1-a013-003af74ecb56.jpeg)

- `done`の場合
![done](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/f7b27a87-08a0-619b-d25e-04567d3ef026.jpeg)

- `go`の場合
![go.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/778bedc7-05d1-0f3d-02ec-a38789d7abaf.jpeg)

- `send`の場合
![アカウント  TASCON 3.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/b3e3bff7-2386-23a2-072c-e399511833af.jpeg)

https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/enterKeyHint
pygameでゲームつくるよ！2024 ①

# 1.はじめに！
__皆さんはじめまして！__
今回が初投稿の __たまねぎ(@onion0815)__ です！よろしくお願いします^^
早速ですが、今回からpythonでゲームをつくっていきます!!

### おしながき ~ 今回の目標 ~ 
 - 環境構築

# 2.環境構築
はじめに __環境構築__ を行います！
僕はAnacondaを使っているのでそこに仮想環境を作っていきます。
とはいっても、pythonとpygameをインストールするですが(笑)
では早速やっていきましょう！

# 2-1.仮想環境の立ち上げ
まずは"Anaconda prompt"でゲーム制作用の仮想環境を用意します。
ゲーム制作用とわかるように名前は "game_project"にして作ってみます！
※game_projectの部分を変えれば好きな名前にできます

```:仮想環境の立ち上げその１
conda create -n game_project
```
コマンドを実行すると、proceed([y]/n)と「作っちゃうけどだいじょぶそ？」のような感じの確認が入りますが[y]を選択しちゃってください。
（以下、僕が仮想環境を作ったときのスクリーンショット）
![仮想環境の立ち上げその１](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790454/cdf7760b-ef46-495b-dab8-1c0c7292e8f3.png)

次に、仮想環境がきちんとできたか確認してみましょう!
```:仮想環境の立ち上げその２
conda info -e
```
出来ていた場合は作った名前の環境が確認できるはずです！
(白塗りで見えにくくてごめんなさい☆(・ω<). )
![仮想環境の立ち上げ２](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790454/8698cceb-d11e-7485-bb1e-956953e7e9f8.png)

ここまで出来たら、この仮想環境の立ち上げは出来ました！
それではPythonとpygameをインストールしていきましょう！

# 2-2.pythonとpygameのインストール
続けてPythonをインストールする為に先ほど作った仮想環境をアクティベートしましょう！
作業は引き続き"anaconda prompt"で行います
```:仮想環境にインストールその１
conda activate game_project
```
アクティベートができると"anaconda prompt"の作業場所がbaseからgame_projectに移動しているはずです！
ここって書いているところが変化していますね（顔文字じゃないよ^^）
![仮想環境にインストールその１](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790454/0ae95381-f92d-a87a-d856-8f597ea8b996.png)

さて、それではpythonとpygameをインストールしていきましょう！
pygameは最新の2.5.2をインストールします(2024/05/12時点)
```:仮想環境にインストールその２
conda inatall python
```

```:仮想環境にインストールその３
pip install pygame==2.5.2
```
 __※pygameはcondaではなくpipなので注意です...__

インストール後は、game_project内にきちんとインストールできているか確認しましょう！
```:仮想環境にインストールその３
conda list
```
![仮想環境にインストールその２](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3790454/1e35eba1-c67b-83f6-aab2-2b02da06080a.png)
ちゃんとインストールできていますね！

# 3.最後に...
さて、今回はここまでです！ ~~（記事書くのに疲れた...(´;ω;｀)）~~
本当はVScodeで立ち上げた仮想環境を使えるように設定したり、gitの登録などを行おうと思っていたのですが、ここまでです！

今回の作業は環境を立ち上げまで行いましたが、うまくできましたか？
初投稿なので読みづらいところもあったかもしれませんが、次回以降も読んでいただけると幸いです！

次回の内容は、今回するはずだった作業を行うのでpygameを使用したゲームの製作は次回以降になる予定です...

では、皆さんお疲れ様でした！
Bluestacksで/systemをmountする

結論から
1. `C:\ProgramData\BlueStacks_nxt\Engine\**\HypervVm.json`をエディターで開き、Root.vhdで検索し、以下の箇所を変更する
    ```diff_jsondoc:HypervVm.json
    {
       /// ...
       /// "Path" : "...Root.vhd"
    -  "Readonly" : true,
    +  "Readonly" : false,
       /// ...
    }
    ```
2. adbでデバイスと接続する
3. 以下を実行する
    ```
    $ /system/xvin/bstk/su
    # mount -o rw,remount /system
    ```

以上で/system以下に書き込みできます
ちなみに、Pie以降の場合以下のpropがありますが、`/system/xbin/su`が出てくる効果以外よくわかりませんでした
```sh
$ setprop bst.config.bindmount 1
```
PowerAutomate: SharePoint 内のファイルを拡張子で抽出する by  Filter Query 

# 背景

そういえば書き留めてなかったと思った備忘録、件名のままに

# 概要

File_x0020_Type で拡張子を指定してやればよい

```text: 拡張子が "png", "gif" を抽出する例
File_x0020_Type eq 'png' or File_x0020_Type eq 'gif'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/5b79d3c7-b19b-f6ac-420d-a63b5ce90297.png)

## 利用例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/229bbeb7-739e-621b-e930-2d394ed45675.png)

# 参考


https://learn.microsoft.com/en-us/openspecs/sharepoint_protocols/ms-wssts/bac496c6-c19e-4243-94e0-4f92477b6e82

# あとがき

Filter Query の Sample を記録していって、まとめを作ろう

とりあえずの案
- バージョン
- ファイル or フォルダー
- ファイル名　<< ここはよくあるのでまとめぐらい
pythonでelasticsearchのメモ

```python
# %%
from elasticsearch import Elasticsearch

#%%
username = 'admin'
passwrod = '<INPUT YOUR ADMIN PASSWORD>'
host = 'https://%s:%s@<INPUT YOUR HOSTNAME>:<INPUT YOUR PORT>' % (username, passwrod)
print(host)

# %%
client = Elasticsearch(hosts=host, ca_certs='<INPUT YOUR CA_CERTS PATH>')
# %%
client.cat.indices(index='*', h='index').splitlines()
# %%
client.indices.create(index='test')
# %%
client.cat.indices(index='*', h='index').splitlines()
# %%
client.indices.delete(index='test')
# %%
client.close()
# %%
```