OmniAICreator/Qiita-1.07M huggingface dataset:
自分自身を許可するセキュリティルールについて

## はじめに
最近、Finatextの夏季インターンに参加させていただきました。AWSを自由に触れる環境を提供していただき、最初は「AWSﾅﾆﾓﾜｶﾗﾅｲ」状態だった私も、セキュリティグループやIAMと喧嘩できるぐらいには理解度が向上しました。
今回は、学習していく中でセキュリティグループに関する大きな誤解があったため、備忘録として書き残しておきます。

## セキュリティグループとは

>セキュリティグループは、関連付けられたリソースに到達するトラフィックおよびリソースから離れるトラフィックを制御します。例えば、セキュリティグループを EC2 インスタンスに関連付けると、インスタンスのインバウンドトラフィックとアウトバウンドトラフィックが制御されます。
[セキュリティグループを使用して AWS リソースへのトラフィックを制御する](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-security-groups.html)

要するに、セキュリティグループとは、AWS内のリソース間で通信を行う際の入出力ルールを定めるものです。ルールでは、送信先/元、ポート範囲、プロトコルを指定できます。これにより、外部からの機密データへのアクセスを遮断し、セキュリティを高めることが可能です。
送信先/元はIPアドレスだけでなく、セキュリティグループも設定することができます。
セキュリティの観点から非常に重要なものである一方、その厳格さゆえに作業を妨げられることもたびたびありました。

今回直面したのは、セキュリティグループAからセキュリティグループAへのインバウンド通信を許可するルールを設定する状況でした。

## 誤解について
「セキュリティグループ」という名前から、私はそのグループからのトラフィックの出入りが規定されていると考えていました。よって、同じグループ内ではわざわざルールを記載する必要はないと思っていました。しかし、実際にはこれは誤解で、「グループ」とは、同じ入出力ルールを共有するリソースの集まりを指していたのです。

この誤解を図を使って説明していきます。

| セキュリティグループ | インバウンド | アウトバウンド |
|:-:|:-:|:-:|
|A  | 許可しない  | すべて許可  |
| B  | A  |  すべて許可 |

上記のルールの時を考えます。
> グループからのトラフィックの出入りが規定されていると考えていました

この考えに従った時の図です。
![間違った認識](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898883/349ad986-f487-505e-39a7-07c33557d1aa.png)

しかし、この図は誤りで、正しいトラフィックは以下のようになります。


![正しい認識](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3898883/214adc86-ae1f-23f8-d009-d76c03d08a31.png)


このように、同一セキュリティグループ内での通信はデフォルトでは許可されません。
では、セキュリティグループAのリソース同士で通信したい場合はどうすればよいでしょうか。
答えは自分自身からのインバウンドを許可することです。
| セキュリティグループ | インバウンド | アウトバウンド |
|:-:|:-:|:-:|
|A  | A  | すべて許可  |
| B  | A  |  すべて許可 |

こうすることでセキュリティグループAに属するリソース同士で通信することができます。
## まとめ
例え同じセキュリティグループでも、無条件にインバウンドが許されるというわけではありません。
同一セキュリティグループ内で通信したい場合は、必ず自分自身からのインバウンドを許可しましょう。
また、今回はグループ単位でのルールを考えましたが、セキュリティグループはIPアドレス単位で設定することもできます。最小権限の原則に従って必要な分だけ権限を許可するようにしましょう。
raisのパラメーターについて

## paramsについて
コントローラー内でリクエストから送信されたパラメータを扱うためのメソッドです。これを使うことで、フォームから送信されたデータやURLのクエリパラメータを簡単に取得できます。
### 基本的な使い方

1. **フォームデータの取得**:
フォームから送信されたデータは`params`を使って取得できます。例えば、以下のようなフォームがあります。

~~~html
<form action="/questions" method="post">
  <input type="text" name="question[title]" />
  <input type="text" name="question[content]" />
  <input type="submit" />
</form>
~~~
このフォームが送信されると、コントローラーでは以下のようにデータを取得できます。

~~~ruby
defcreate
  @question = Question.new(params[:question])
if @question.save
    redirect_to action: :index
else
    render :new
endend
~~~

2.**ストロングパラメーター**:
セキュリティを確保するために、特定のパラメータだけを許可する「ストロングパラメータ」を使用します。以下のように設定します。

~~~Ruby
defcreate
  @question = Question.new(question_params)
if @question.save
    redirect_to action: :index
else
    render :new
endend

private

defquestion_params
  params.require(:question).permit(:title, :content, :name)
end
~~~



### 具体的なシナリオと使用例

1. **新規作成フォームの送信データを扱う**:
フォームでユーザーが入力したデータを、`params`を使って取得し、新しいモデルオブジェクトを作成するのが一般的です。
2. **URLのクエリパラメータを取得する**:
URLに含まれるクエリパラメータ（例: `?search=example`）を取得することもできます。
エクセルで結合済セル達を移動させる時『この操作によって、いくつかの結合されたセルが解除されます』となる場合の対応

# 起きる例

こういった結合されたセル達がある状態で…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/816546b6-9b8e-3351-3ce3-147b7adf12e5.png)

切り取りコピーして…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3f0e5426-b71e-58de-c64f-cbdd4af5b4ae.png)

こう一段下にずらしたい時。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/258508a8-44f1-4629-65a3-db5642d5f974.png)

貼り付けしようとすると下記。

> この操作によって、いくつかの結合されたセルが解除されます。
> 続けてもよろしいですか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c2d24f3e-b773-bb22-0297-982750a8bbf9.png)

OK押すとこんなふうに結合が解除されちゃう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/da8470af-afca-8ff1-ced8-edec7de14902.png)

# 対応

いったん何も無い場所までドラッグドロップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/4bd0a858-ce7f-b5c4-7c81-ae8e6ffba987.png)

その後に移動したい場所までドラッグドロップ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fba51090-2e66-b2b4-91f3-53db5e193ca4.png)

* 移動先に結合セルなどの **何かある状態** が問題の原因。
* なので、いったん **何もない場所へ退避させてから戻す** といった操作です。

# 参考サイトさん

https://shionikki.com/excel-ketugoushitahyo/

# バージョン

Microsoft Windows [Version 10.0.22631.4249]
Microsoft Excel for Microsoft 365 MSO (バージョン 2409 ビルド 16.0.18025.20030) 32 ビット
ReactHookFormとZodを利用する

## はじめに
表題通り、ReactHookFormとZodを組み合わせる

## 成果物
![rhf_zod.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/fb478080-d239-e4ff-3bc7-65171fc96eb2.gif)

## ソースコード

```tsx:src/App.tsx
import "./App.css";
import { UserRegisterForm } from "./Form";

function App() {
	return <UserRegisterForm />;
}

export default App;

```

```tsx:src/Form.tsx
import { TextField, Button } from "@mui/material";
import { useUserRegisterForm, type UserRegisterFormValue } from "./useForm";

export const UserRegisterForm = () => {
	const { register, handleSubmit, errors, isValid } = useUserRegisterForm();

	const onSubmit = (data: UserRegisterFormValue) => {
		alert(JSON.stringify(data));
	};

	return (
		<form onSubmit={handleSubmit(onSubmit)}>
			<TextField
				label="ユーザーID"
				{...register("userId")}
				error={!!errors.userId}
				helperText={errors.userId?.message}
				fullWidth
			/>
			<TextField
				label="パスワード"
				{...register("password")}
				error={!!errors.password}
				helperText={errors.password?.message}
				fullWidth
			/>
			<Button
				type="submit"
				variant="contained"
				color="primary"
				disabled={!isValid}
			>
				送信
			</Button>
		</form>
	);
};
```


```tsx:src/useForm.tsx
import { zodResolver } from "@hookform/resolvers/zod";
import { useForm } from "react-hook-form";
import { z } from "zod";

const UserRegisterFormValueSchema = z.object({
	userId: z
		.string()
		.min(1, "ユーザーIDを入力してください。")
		.regex(/^[A-Za-z0-9]*$/, "半角英数字のみを入力してください。"),
	password: z
		.string()
		.min(1, "パスワードを入力してください。")
		.max(8, "パスワードは8文字以内で入力してください。")
		.regex(
			/^(?=.*[!@#$%^&*(),.?":{}|<>])[A-Za-z0-9!@#$%^&*(),.?":{}|<>]*$/,
			"パスワードには半角英数字と記号を1つ以上含めてください。",
		),
});

export type UserRegisterFormValue = z.infer<typeof UserRegisterFormValueSchema>;

export const useUserRegisterForm = () => {
	const {
		register,
		handleSubmit,
		formState: { errors, isValid },
	} = useForm<UserRegisterFormValue>({
		mode: "onChange",
		resolver: zodResolver(UserRegisterFormValueSchema),
	});

	return { register, handleSubmit, errors, isValid };
};

```

## 終わりに
ReactHookFormとZodを組み合わせると便利で良いですね！
WEBサーバーソフトウェアの違いについて

# はじめに

IT業界未経験からインフラエンジニアへの転職を目指すmmと申します。<br>
今回はWEBサーバーについて理解を深めるために、それぞれのソフトウェアの違いについてまとめてみました。<br>
初学者のため、誤っている事があればご指摘いただけると幸いです:bow_tone1:

## WEBサーバーとは
クライアントからのWebブラウザのリクエストに対して、HTMLやCSS、JavaScriptなどの情報を返すコンピュータのことです。
コンピュータはWEBサーバーソフトウェアをインストールすることで、WEBサーバーとして機能できるようになります。

WEBサーバーソフトウェアとしては、Nginx、Apache、IIS、LiteSpeedの4種類があります。

### Apache
無償で利用できるオープンソースのWEBサーバーソフトウェアです。
WEBサーバーの代表格として２０年以上の実績があり、高い信頼性と安定性を誇ります。そのため、技術情報が豊富であり、インターネットで情報の入手がしやすいです。
また、WEBサーバーソフトウェアの中でもモジュールの数が一番豊富です。
そのため、様々な機能を柔軟に選択することが可能です。

また、Apacheはマルチプロセスモデルのため、動的コンテンツのような重たい処理が得意です。しかし、マルチプロセスモデルは、クライアントからのリクエスト毎に1つのプロセスで対応します。そのため、同時接続数（クライアントの数）が増えると、その分だけプロセスも増えるため、プロセス数の上限以上のリクエストを同時に処理できなくなったり、メモリが大量に消費されてしまうという問題があります。

:::note info
メリット
- 信頼性と安定性が高い
- 技術情報が入手しやすい
- 拡張機能が豊富
- 重い処理が得意
:::

:::note alert
デメリット
- メモリの消費が大きい
- 大量の同時処理には耐えられない
:::

### Nginx
シングルスレッドのイベント駆動型モデルです。
イベント駆動型とは、クライアントのアクセスをイベントとして扱い、それをトリガーにプロセス内で処理を開始します。マルチプロセスモデルとの違いは、1プロセスにつき1スレッドであるということです。そのため、同時接続数（クライアントの数）が増えても、プロセス数やスレッド数は増えないため、Apacheで問題となっていた同時接続数が増えた場合にも対応できます。
また、リバースプロキシやロードバランサー機能があります。静的コンテンツやリバースプロキシに特化させ、プログラムの実行は他のサーバーに行わせるといった活用方法も可能です。しかし、単独ではPHPなどのスクリプト言語を処理する機能がなくCGIなどを別途導入する必要があります。

:::note info
メリット
- 動作が速くて、高負荷に強い（特に静的コンテンツに強い）
- リバースプロキシやロードバランサー機能がある
:::

:::note alert
デメリット
- 重い処理には不向き
- Nginx単独での運用は難しい
:::


### IIS（アイアイエス）
Windows専用のWEBサーバーソフトウェアであり、SQLやAzureといったMicrosoft製品と親和性が高いです。
WindowsのOSにインストールして使用することから、見慣れたGUIを使用して、Windowsと同じ感覚でWEBサーバーを構築できます。
拡張機能や開発環境も充実しているほか、日本語の公式マニュアルが用意されており、トラブル対応へのハードルも低いことから初心者に優しいWEBサーバーソフトウェアです。
技術者情報も豊富であり、インターネット情報の入手がしやすい事も大きな特徴です。
ただし、Windows専用であり、運用がWindowsの環境に限られてしまうのがデメリットです。

:::note info
メリット
- Windows専用でMicrosoft製品と親和性が高い
- GUIベースで操作が可能
- 拡張機能や開発環境が充実している
- 日本語の公式マニュアルがある
- 技術情報は豊富
:::

:::note alert
デメリット
- WindowsのOSでしか利用できない
:::

### LiteSpeed
近年、超高速のWEBサーバーソフトウェアとして注目が集まっています。
Apacheと完全互換性があることも大きな特徴です。Apacheと互換性がある事から、サーバー移行のハードルが低く、Apacheの代わりに採用されるケースが増えているそうです。
また、ブログやWebサイトを作成できるコンテンツとしてトップシェアを誇るWordpressを高速化する専用のプラグイン「LiteSpeed Cache」があります。「LiteSpeed Cache」はワンクリックで簡単に導入することができます。
しかし、新しいWEBサーバーソフトウェアであることから、技術情報が少なく入手しにくいというデメリットもあります。

:::note info
メリット
- 超高速
- Apacheと完全互換性がある
- Wordpressを高速化する専用のプラグインがある
:::

:::note alert
デメリット
- 技術情報が少ない
:::

## 終わりに
今回は過去の勉強メモをもとに、今までなんとなくしか覚えていなかったWEBサーバーについて再度学習し、それぞれの違いについてまとめてみました。
まだまだ理解が及んでいない部分もありますが、引き続き学習したいと思います。

## 参考

https://www.geekly.co.jp/column/cat-technology/1903_096/#Apache

https://qiita.com/kamihork/items/296ee689a8d48c2bebcd

https://www.techfirm.co.jp/blog/web-server
Unity CatalogのAI生成コメントを翻訳できるようになりました！

いつの間に。

https://docs.databricks.com/ja/comments/ai-comments.html#update-an-ai-generated-comment

> オブジェクトの所有者またはオブジェクトに対する `MODIFY` 権限を持つユーザーは、カタログエクスプローラーのUI を使用して、いつでもコメントを更新できます。 インラインチャットアシスタントは、コメントの編集を支援し、 テキストを短くしたり 、テキストを別の言語に 翻訳 したりするオプションを提供します。

試してみます。カタログエクスプローラでテーブルにアクセスします。一旦英語でコメントが生成されるので、**編集**をクリックします。
![Screenshot 2024-10-03 at 13.22.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6b349b71-a767-94e6-c4d6-8294877f8d23.png)

UIが変わっている…。**テキストを翻訳**をクリックします。
![Screenshot 2024-10-03 at 13.23.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/80af82e1-16cc-e119-ecc8-850e4bf8a75d.png)

`コメントを翻訳`と入った状態でプロンプトボックスが開きます。しかし、ここで注意です。翻訳先の言語を指定しないとうまく翻訳してくれません。
![Screenshot 2024-10-03 at 14.05.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/84d4e1de-70c6-e826-806b-6e31109e81e8.png)

ですので、`コメントを日本語に翻訳`に変更してプロンプトを実行します。
![Screenshot 2024-10-03 at 13.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ec0a5880-a45c-eb98-4dc3-27b941cd630f.png)

日本語になりました！内容に問題がなければ**承認**して、**Save**します。
![Screenshot 2024-10-03 at 13.23.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/823d1b24-c5cf-687b-2238-80ffdcf22d9b.png)
![Screenshot 2024-10-03 at 13.23.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/953059fd-680b-2b57-6f68-ee04d863b74e.png)

列のコメントにおいても同様の操作が可能です。また、**テキストを短くする**の場合も、`コメントを日本語で短くします`と言語を指定するようにしてください。
![Screenshot 2024-10-03 at 13.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b11840a1-e212-8aa5-f04d-361523ff108a.png)

英語でしか生成されたない状態から一歩前進というところでしょうか。もっと改善されていくはずですので、是非ご活用ください！
![Screenshot 2024-10-03 at 13.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55c448d7-cd87-e018-f70c-46a5367dc10a.png)



### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
チェックボックスをinput要素のみでスライドスイッチにする

チェックボックスをスライドスイッチにするとき、普通は `label` などを使い対象を指定するかと思います。

**「でもやっぱり `input` のみでシンプルに実現したい！」**

できます。

# サンプルコード
まずはこちらをご覧ください。

```html
<style>
    input[type="checkbox"] {
        --size: 24px;
        --scale: 0.8;

        appearance: none;
        cursor: pointer;
        margin: 0;
        height: var(--size);
        aspect-ratio: 2;
        border-radius: var(--size);
        background-color: #444444;

        &::before {
            content: "";
            display: block;
            height: var(--size);
            aspect-ratio: 1;
            border-radius: var(--size);
            background-color: #FFFFFF;
            transform: scale(var(--scale));
            transition: 0.2s;
        }

        &:checked {
            background-color: #24B441;

            &::before {
                transform: translateX(var(--size)) scale(var(--scale));
            }
        }
    }
</style>

<input type="checkbox">
```

<p class="codepen" data-height="300" data-theme-id="dark" data-default-tab="css,result" data-slug-hash="yLmJajy" data-pen-title="qiita-demo-checkbox-css" data-user="dojyorin" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
<span>See the Pen <a href="https://codepen.io/dojyorin/pen/yLmJajy">qiita-demo-checkbox-css</a> by dojyorin (<a href="https://codepen.io/dojyorin">@dojyorin</a>) on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 解説
デフォルトのチェックボックスを `appearance: none;` で無効化しているのと、普通は `label` を使用するところを `::before` で代用しているのがミソです。

全チェックボックスをスライドスイッチにしたくなければ、適当にクラスを作ってセレクタに混ぜれば大丈夫です。

```css
input[type="checkbox"].switch {/*...*/}
```

なお、原型は [こちら](https://qiita.com/McbeEringi/items/dcbf35c9aa02aeefaad0) の記事を参考にしました。感謝！
javascript/typescriptの非同期関数について

## はじめに
今年フロントエンドエンジニアに転職して、自分が学習した非同期関数についてまとめたいと思います。
もし解釈が間違っている&補足など、アドバイスがあれば教えていただきたいです!

## 非同期関数とは
javascriptは基本的に一つの処理しかできず、並行処理ができません

javascriptの非同期処理で使用するメソッドは主に（**async**・**await**・**Promise**）の3つ存在します。

**async** : 
・非同期関数の宣言に使用します。asyncを関数の前に付けることで、その関数の返り値Promiseにします。
**await** : 
・非同期処理が終了するのを待機します。
・awaitはasync関数内でのみ使用でき、ます。そのため、次の処理で返り値を使うことができます。
**Promise** : 
・非同期処理の結果を表現するオブジェクトです。Promiseは3つの状態を持ちます。
・pending: 未解決（処理が終わるのを待っている状態）
・resolved: 解決済み（処理が完了し、無事成功した状態）
・rejected: 拒否（処理が失敗した状態）
・Promise.all(): 複数のPromiseがすべて解決されるのを待ち、その結果を返します。すべてのPromiseが成功した場合は、成功した結果の配列が得られます。

## 非同期関数はどのような場面で使用するのか
ログイン処理 :
ログインして大丈夫なユーザかチェックする時、ログイン処理に時間がかかることがあります。特にモバイルアプリの場合は画面の処理が遅いとユーザが待ち時間にイライラすることがありますので、先にログイン後の画面を表示させて、その間にユーザチェックを行います

## javascriptの処理を早くするにはAWSのLambdaを使用！！
非同期処理でバックエンドに問い合わせて、AWSのLambdaで処理をする。すべての処理が返ってくるのをPromise.Allで待機する。
AWS LambdaはAWS側のサーバーで一つのLambdaが一つのPCとして考えるので、並行処理になり、複数の処理を同時に実行することができ全体の処理時間を短縮できます。

## さいごに
閲覧いただきありがとうございました！

私の非同期処理の理解について間違っていたら、ぜひコメントで教えていただきたいです。

また、今回はコードで具体的に説明できなかったので、次回非同期処理について触れる時はコードも含めて説明できるようにします！！
Azure VM診断設定でカスタムイベントログを追加する

Azure VM(Windows Server)でWindowsイベントログを収集する方法として診断設定があります。
診断設定を利用することでWindowsイベントログをストレージアカウント(Azure Table Storage)に収集することができますが、デフォルトだとアプリケーション、セキュリティ、システムの3種類が対象となります。

上記3種類以外、具体的にはSetupイベントログを収集できないか試したので手順を残します。

# 診断設定を有効化する
* 対象の仮想マシンを選択し、左メニューより[監視]→[診断設定]の順に選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/5cc71aa7-7ac7-8b0c-1cbf-fc0396a72c0d.png)

* 収集するストレージアカウントを選択し[ゲストレベルの監視を有効にする]をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/22ad7428-d543-48c5-a74c-efe723d7d7c3.png)

* しばらくすると仮想マシンにDiagnostics拡張機能がインストールされ、イベントログやパフォーマンスカウンターの収集が始まります（仮想マシンは起動状態である必要があります）

# カスタムログを追加する
* 診断設定画面より[ログ]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/3dcad0f9-6459-7312-c643-fd4d3e24cb24.png)

* デフォルトだと以下の状態になっており、アプリケーション、セキュリティ、システムが収集される設定となっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/26df5093-4a35-afd5-c69e-437ebe968243.png)

* カスタムログ欄にSetup!*と入力し[追加]を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c2cf388b-6048-8315-1551-428569258628.png)

* これでSetupの全てのレベルのログが収集されるようになりました

# テスト
* 最後にイベントログの書き込みを行い、収集されるかテストします
* Windows ServerでPowerShellを管理者権限で開きます
* 以下コマンドを実行しSetupイベントログにテストログを書き込みます

```powershell
$EventSource = "TestSource"
$EventLog = "Setup"

# イベントソースが存在しない場合は作成
if (-not [System.Diagnostics.EventLog]::SourceExists($EventSource)) {
    New-EventLog -LogName $EventLog -Source $EventSource
}

# イベントを書き込む
Write-EventLog -LogName $EventLog -Source $EventSource -EntryType Information -EventId 1000 -Message "This is a test event for Setup log."
```

* Storage Explorer等でTable Storageにアクセスし、テストログが収集されていることを確認します
* 以下はAzure CLIでの確認例

```
az storage entity query --table-name WADWindowsEventLogsTable --account-name [Storage Account Name]
```

以上です
Windowsリモートデスクトップログイン先のキーボード入力が英語入力(Shift+2を押すと@が表示されるなど)になった場合の対処法の1つ 

## 概要
　最近、リモートデスクトップログイン先のキーボード入力で、日本語入力にした場合のみキーボード配列が英語（101/102配列）になってしまう現象がありました。

ググるとレジストリを修正するなどの情報があったのですが、自分の場合はこの方法で直りました。※多分、直らない場合もあるかと思います。

## 手順
1. リモートデスクトップ側の言語の106/109になっているキーボード設定を一旦101/102に変更する
1. リモートデスクトップ側を再起動する
1. リモートデスクトップ側の言語の106/109に再び変更する(元の設定に直す)
1. もう一度リモートデスクトップ側を再起動する

## 設定画面への入り方(これで、キーボードのレイアウトを切替して再起動をする)
1. Windowsの設定画面を開く
1. 時刻と言語
1. 言語
1. 優先する言語
1. 日本語
1. オプション
1. ハードウェアキーボードレイアウト
1. リストボックスでレイアウトが選択できるので変更する
Pythonを用いたプログラミング学習①｜演算子

本記事の内容は書籍『[いちばんやさしいPython入門教室](https://amzn.asia/d/1NwQOiC)』のLesson 2-5にあたる。
なお、当記事は書籍に記載されていない情報も補足的に記載している。
# 演算子
 Pythonにおける各種の演算子（一部）は以下のように定義されている。

### 算術演算子
| 演算子 | 処理内容 |
|:-:|:-:|
| + | 足し算 |
| - | 引き算 |
| * | 掛け算 |
| / | 割り算 |
| // | 割り算（小数点切り捨て） |
| % | 割り算の余り |
| ** | べき乗 |

### 累算代入演算子
| 演算子 | 同義の式 |
|:-:|:-:|
| a += b  | a = a + b  |
| -= b  | a = a - b  |
| *= b  | a = a * b  |
| a /= b  | a = a / b  |
| %= b  | a = a % b  |
| **= b  | a = a ** b  |
| //= b  | a = a // b  |

### 比較演算子
| 演算子 | 意味 |
|:-:|:-:|
| a == b  | a が b と等しい  |
| a != b  | a が b と異なる  |
| a < b  | a が b よりも小さい  |
| a > b  | a が b よりも大きい  |
| a <= b  | a が b 以下である  |
| a >= b  | a が b 以上である  |
| a in b  | a が b に含まれる  |
| a not in b  | a が b に含まれない  |

### 文字列演算子
| 演算子 | 処理内容 |
|:-:|:-:|
| a + b  | 文字列 a と 文字列 b を連結  |
| a * n  | 文字列 a を n 回繰り返す  |
| a[n]  | 文字列 a の中の n 番目の文字を取り出す  |
| a[n:m]  | 文字列 a の中の n 番目から m-1 番目までの文字列を取り出す  |
| a[n:]  | 文字列 a の中の n 番目から最後までの文字列を取り出す  |
| a[:m]  | 文字列 a の中の 0 番目から m-1 番目までの文字列を取り出す  |
<br>

次項：[Pythonを用いたプログラミング学習②｜値の表示・変数・ループ処理・条件分岐・関数・モジュール](https://qiita.com/D_Sato_01/items/a48b91a5ad97f23b7b49)

前項：[『いちばんやさしいPython入門教室』を用いた学習の開始](https://qiita.com/D_Sato_01/items/73023531fe5b876bf1bc)
ドローン検定3級合格体験記

ドローン検定を受験し合格することができました。
合格体験記をまとめますので、
これから受験する方のご参考になればと思います。

![Screenshot_20241003-121522~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881331/997e99e2-dd64-5345-18cb-8dd92d1bda4b.png)

①試験名
ドローン検定3級

②受験日
2024/9/22

③点数
現時点では正答一覧が出ていないため不明ですが、
数問ミス程度だと思いますので、90点～100点だと思います。

④受験回数
1回目

⑤学習期間
約1か月

⑥使用テキスト
ドローンの教科書 標準テキスト

⑦参考にしたサイト
揚力が発生する仕組み、プロペラ機のピッチが変化する様子、
ブラシレスDCモータの動作原理はyoutubeを見ました。

⑧学習方法
基本的には「ドローンの教科書 標準テキスト」で充分だと思います。
ただ、ドローンの動作や仕組みに関して理解を深めるため、
youtubeで動画を見ました。

⑨試験の感想

・小さな会議室1部屋で受験者は10程、男女比8:2だったと思います。
　おそらく30代～だったと思います。

・途中退出可能でした。私は試験開始40分程度で退出しました。

・会議室に時計はありました。

・問題数が多いので、テンポよく解答する必要があると思います。
　
⑩次に受験予定の試験
ドローン検定2級
コマンドの中でRubyを実行する

## 環境
Ruby2.6

## 内容

Rubyでちょっとした処理を実行したい場合、テキストファイルにRubyのコードを記述して、コマンドから呼び出して実行することになります。

因みに次のコードは1から20までに出てくる素数を出力するコードです。

```hoge.rb
def hoge
    require 'prime'
    puts Integer.each_prime(20).to_a
end
hoge
```
コマンドからファイルを呼び出して実行します。

```
$ruby ./hoge.rb
```

Rubyのコードを別ファイルに作成するのではなく、Rubyコマンドの中にコードを直接埋め込んで実行することができます。

やり方その１
```
$ruby -e 'require "prime"; puts Integer.each_prime(20).to_a'
```

やり方その２
```
$ruby -rprime -e 'puts Integer.each_prime(20).to_a'
```
Railsプロジェクトのライセンスを調査した

「Railsプロジェクトで使用しているOSSライセンスを出力したい」という要件があったので、OSSライセンスを [pivotal/LicenseFinder](https://github.com/pivotal/LicenseFinder) を使用して調べてみました。

https://qiita.com/mtsuge/items/9e08ff2570effcf6d47c

この記事を参考にしましたが、時間が経ってオプションが変わっていました。

## `pivotal/LicenseFinder` を使う

### インストール

無駄な依存関係が増えてしまうため、あまり好ましくないけど `Gemfile` に以下を追加して `bundle install` を実行します。

```ruby
gem 'license_finder', :group => :development
```

`Gemfile` より直接インストールするこちらのほうが良いみたいです。

```bash
$ gem install license_finder
```

とりあえずライセンスの情報を出力してみます。

```bash
bundle exec license_finder report --format html --save license_report.html
```

次のようなHTMLが出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6964/3bba6d16-2042-d9b3-a916-33600ce936ef.png)

許可設定していないため全て unapproved となっています。

### ライセンス許可を設定する

許可するにはサブコマンドの `approvals` で gem を個別で許可するか、`permitted_licenses` でライセンス単位で許可するのかの2種類があります。

個別は手間がかかるので、ライセンス単位で許可してみます。

```bash
bundle exec license_finder permitted_licenses add mit 'Simplified BSD' 'Apache 2.0' 'New BSD' WTFPL ruby
```

また、コマンドでライセンスの判断がつかないものは、該当プロジェクトのリポジトリ等でライセンスを調べて `licenses add`  サブコマンドで設定します。

```ruby
bundle exec license_finder licenses add evma_httpserver lgpl2
```

再度レポートを出力すると、次のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6964/62588c58-175d-4cc1-3947-0aebdca385e7.png)

### 設定ファイル

デフォルトだと `doc/dependency_decisions.yml` に設定が書き込まれます。

プロジェクトの名前や許可したライセンス、削除したライセンスが書かれます。

`licenses add` や、`licenses remove` を実行するたびに設定ファイルの既存のものが上書きされず追加されていくので、ある程度最終形が決まったら手動で整理するほうがいいと思います。

### まとめ

コマンドを実行するだけで一つずつライセンスを調べる必要が無いので便利ですが、もしかしたらライセンスを間違って判定してる可能性もあるかもしれないので、最終的には目視で確認したほうがいいかもしれません。
VBAセルの操作【メソッド編】

# はじめに
学習記録・復習のためまとめています。IT業界2年目のひよっこです。

## セルの操作　メソッド
セルに対して、操作などの命令を実行するときに使用する。


***

### Copyメソッド
＜こんなときに使える＞
・セルや表をコピーしたいとき

```
'基本形
コピー元のセル.Copy Destination:=コピー先のセル

'省略形
コピー元のセル.Copy コピー先のセル
```
:::note info　
　対応するExcel操作
 　Ctrl + V　→　Ctrl + C
:::

:::note warn
・指定可能オプションが１つしかないため「Destination:=」は省略してOK
・書式はペースト可能
・列幅はペーストできない
:::

例　ペーストする内容を指定する場合　★
```vb
Range("H2").CurrentRegion.Select
    
Selection.Copy
    'フォーマットのみ貼り付け
    Range("J2").PasteSpecial xlPasteFormats
    '列幅のみ貼り付け
    Range("J2").PasteSpecial xlPasteColumnWidths
    '値のみ貼り付け
    Range("J2").PasteSpecial xlPasteValues
    
'コピーの範囲指定を解除する（気になる場合は記述）
Application.CutCopyMode = False
```
※同じセルを対象にする場合は「Withステートメント」を使うと記述量を減らせる

***

### Clearメソッド
＜こんなときに使える＞
・セルや表をクリア（削除）したい

```
対象セル.Clear
```
:::note info　
　対応するExcel操作
 　？（あったら教えてください！）
:::


| メソッド | 説明 |
|:-:|:-:|
| 値のみ削除  | ClearContents |
| 書式のみ削除  | ClearFormats |

※最後の「s」を忘れずに！

例　A1セルを含む表範囲を全削除したい
```VB
Range("A1").CurrentRegion.Clear
```
【ChatGPT】“Logic-of-Thought”とは？


　どうも、カーブミラーです。

　今回は、“Logic-of-Thought”とは？という内容を書きます。“なんやねん、それ？”の疑問については、中で説明しますね。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ニュースはないので、
　　さっそく本題です。

　“Chain-of-thought”（略してCoT）は
　　ご存知の方も多いかと思います。

　“Chain-of-thought”は
　　連鎖的な思考をさせることで、
　　　出力精度を高める
　　　　Promptテクニックですね。

　それに対して
　　“Logic-of-Thought”（略してLoT）は
　　　LLMに
　　　　論理的にヒントを与える
　　　　　Promptテクニックです。

　Logic-of-Thoughtは
　　論文として、
　　　まだ産声をあげたばかりです。
　　　　ググっても出てきません。
　　　　　Perplexityでもダメでした。

　こちらが
　　その論文記事になります。
　　　もちろん英語です😅
[Logic-of-Thought: Injecting Logic into Contexts for Full Reasoning in Large Language Models](https://arxiv.org/abs/2409.17539)

　こちらが
　　論文から作成されたnote記事です。
　　　もちろん日本語です🤣
[【論文瞬読】Logic-of-Thought：AIの論理的推論能力を革新する画期的手法](https://note.com/ainest/n/n2185f13b4102)

　こちらも参照してください。
[K.Ishiさん解説ポスト](https://x.com/K_Ishi_AI/status/1840201914748940799?t=LAghe1MZXyPZ6kECqlfmGQ&s=19)

　これまで
　　Promptに必要条項を
　　　書き連ねていた方は、
　　　　すべてをLLMが
　　　　　受け取っておらず、
　　　　　　歯がゆい思いをしたことも
　　　　　　　あったかと思います。

　そこにこそ、
　　重要な情報が
　　　あったのに！と。

　そこで
　　“そのPromptに
　　　ヒントとしての情報を
　　　　与えたら良いのでは？”と
　　　　　なったのでしょう。

　では、
　　そのヒントとなる情報とは？
***
　ここでは、
　　そのヒントを
　　　作る方法を示します。

　こちらは
　　X-Twitterのポストで
　　　具体的なPromptを
　　　　提供してくださって
　　　　　いただいております。
[あおいさんポスト](https://x.com/Aoi_genai/status/1840960427754406314?t=VTk9SL2aJggXF23k-9cHNA&s=19)

　上記は、ファイル（PDF）をもとに
　　ヒントを作成するPromptでした。

　これを
　　文章をペーストして
　　　使えるようにしました。
　　　　日本語にもしています。
```Text:文章LoTヒント作成Prompt
以下の文章を、Logic-of-Thoughtを用いて論理的構造を特定・抽出し、それを体系的にJSON形式に変換してください。
```
　このPromptに追加して、
　　区切り（```など）を入れて、
　　　文章をペースト。そして、送信。

　ごらんのように
　　ヒントは、JSON形式で
　　　出力されます。

　私は
　　小説の一節をコピペして、
　　　JSONを作成しました。

　さすがに
　　長尺なので、出しませんよ😅
***
　さて、
　　このヒントであるJSONを
　　　どうすれば良いのでしょうか？

　本来は、
　　もとのPrompt＋JSONなのかも
　　　しれませんが、このポストでは
　　　　JSON作って終わりでした。

　私は、
　　上記のJSONから
　　　小説を記述させてみました。

　もちろん、
　　もとの小説が
　　　出てくるわけはありません。

　しかし、
　　脈絡も登場人物たちも
　　　破綻なく、書けているようです。
***
　なんともしまらないので、
　　これまでのPromptを入れて
　　　JSONを作成したあと、
　　　　そのPromptを実行する
　　　　　Promptを作成しました。

```Text:Prompt＋JSON作成・実行Prompt
“（これまでのPrompt）”を、Logic-of-Thoughtを用いて論理的構造を特定・抽出し、それを体系的にJSON形式に変換してください。

JSONが出来上がったならば、指定文章とJSONで指示をこなしてください。
```
　まだたいして
　　テストしていません。

　なんらかの
　　参考にしてください。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
メンバ変数を const にすると不便

## おことわり

残念すぎる初心者の日記です．

## 日記

C++ のリハビリ中に，本当にしょうもないところでコンパイラに怒られた．

以下は実際のコードではないが，話としてはこんなだ：

```C++
//何かclassがあって……
class Test { ... };

//こういうデータがあって……
std::vector< Test > Vec;

//ココでコンパイラ様がブチギレですよ
std::sort( Vec.begin(), Vec.end() );
```

出てきたエラーメッセージとしてはこんな：

`error C2280: 'Test &Test::operator =(const Test &)': 削除された関数を参照しようとしています`

うん，わからん．

いや，エラーメッセージ自体の意味はわかるんだが，「何故そのような事態となったのか？」がわからんという．
一体誰が（いかなる理由で）私の書いた `Test` class から `operator=` を削除したというのか？

……と，無駄な時間を過ごした．

原因はなんてことはなくて

```C++
class Test
{
private:
	const int m_v;  //←これかよ！　クソォォオオオ！！

public:
	Test( int value ) : m_v(value) {}
	void SomeMethod(){ /*何かする*/ }
};
```

……っていうだけの話だったんですけどね．

`class Test` の実装にあたって

* メンバ変数 `m_v` とは ctor で指定されてきた値を保持するものであって，勝手に変更してはならない性質のものである
* OK，そしたら `const` としよう．  
  そうすれば `Test::SomeMethod()` 内とかでうっかり `m_v` を変更する記述を書けばコンパイラ様が黙ってはいないだろう！

とかなんとか考えたわけだが，結果として「すごく扱いづらい型」が出来上がっていた，と．

### How to 対処？

単純に `const` を取っ払えば万事うまく事は進むわけだが，それでいいのかなぁ？　とか．
「`m_v` は ctor で指定された値を保持するのであって，勝手に変更してはならない性質のものである」っていうのが全く表現されなくなっちゃうというか(?)．

「そんなこと言うなら `std::vector< Test >` とかいう使い方の側を諦めればいいよね」っていうのは **嫌** （←わがまま）．
マイクロサービスにおける通信&コミュニケーション設計

# 概要
マイクロサービス同士の結合や連携には、大きく分けて同期通信と非同期通信がある。
この時に両方の設計パターンのメリット・デメリットと、
その際の組織的な連携の心構えなどについて触れておきたいと思う。

なお、書籍チームトポロジーの用語が以下では当たり前のように使用されるため、気になる方は他の記事で用語を調べていただきたい。

# 組織的なマネジメント
基本的にコンウェイの法則の力学を意識して、
１つのマイクロサービスは、１つの組織が責任をもって運用するという
のが鉄則である。
そのマイクロサービスの中のサブコンポーネントに対しては、サブ組織を相似形で対応付けて運用していく。
図


# とにもかくにも疎結合
マイクロサービスにしている時点で、
そのメリットを生かすためには、極力他のサービスと疎な関係性。
つまり、他のサービスを運用する組織とやり取りをすることなく、
変更したり、デプロイできることが望ましい。

他のサービスとは独立して運用されることが前提であるため、
以下のようなことは極力避けないとメリットを生かしきれない。

:::note warn
あるサービスに対する変更や障害が他のサービスにまで波紋する。
:::

これは組織同士のコミュニケーションパス的には、
以下のように言い換えることができる。

:::note warn
あるサービスAに変更を加えようとした際に、
Aを担当する組織と、Bを担当する組織の間に変更の旨の
コミュニケーションが発生する。
:::

このような状態は、サービスの境界付けられたコンテキストにより、
独立して運用したりデプロイしたりできるというマイクロサービスの
メリットを発揮できていない。
むしろ分ける意味は本当にあるのか？と疑ってみた方がいい。

# どんな時に起こる？
では、上記のようなケースはどのようなときに起こるのか？
下図のように同期的な通信を行っていると、実質動的に密結合を起こしていることになる。

エピックサーガや伝言ゲームサーガパターンなどが、この代表例であるといってもいいかもしれない。

## デメリット
確かにこのままでは、

:::note alert
他のサービスと密結合している
:::

という、なんのためにサービスとして分けたんだという話にもなる。
しかし一方で以下のようなメリットも存在する。

## メリット
マイクロサービスの独立性を強く担保させるためには、
データのリアルタイムな整合性はある程度犠牲にしなくてはならない。

しかしながら、エピックサーガや伝言ゲームサーガパターンに関しては

:::note info
マイクロサービスでありながらも、アトミックな整合性を保てる。
:::

これは密結合しているがゆえの恩恵ともいえる。

## 組織コミュニケーションパス
まず、サービスAとサービスBが連携しあっていると仮定する。
この時に同期的なやり取りがある場合には、チームトポロジー的にABは密な連携が必要であることを意味している。
同期通信になっている以上、イネイブリングチームやプラットフォームチームは、継続的にそれをサポートしてあげる必要がある。

:::note warn
これはコミュニケーションコストという面では、非同期に比べてかなりかかると思っている。
:::
その一方で、

:::note info
チーム同士が持っていて、共有しなくてはならない情報に対して、どうしても不整合リスクを抑えたい　という場合にはこちらの方が適している。
:::

ようは何が言いたいかというと、
ビジネスアーキテクチャ上ではどうしても机上の空論になってしまい、
情報の不整合リスクがどの程度ビジネスに対してマイナスの影響を与えるのかわからないといった場合に、
実際に実装していく中で、チーム間にどういったコミュニケーションが発生するのか？　どのくらいの時間、情報の不整合があっても許容できるのか？を
イネイブリングチームは意識した上で、ファシリテーションを行う。

はっきりいってイネイブリングチームには、想像以上に認知負荷がかかると思っている。

各チームのそれぞれの役割も念のため以下に記載する。

### ストリームアラインドチーム
これへ対応するようにして、サービスチームAとチームBを置く。
素早くデリバリーするためにも、これらチームA、Bはチームトポロジーでいうところのストリームアラインドチームである必要がある。

### コンプリケイテッド・サブシステムチーム
サービス内のサブコンポーネントはコンプリケイテッドサブシステムチームに担わせる。
この際に組織構造と対応付けるために、
そして、そのチームの責任範囲を瞬時に名前空間から把握できるようするために、
チームA.xとかチームB.yみたいな名前にしておくことをお勧めする。

### イネイブリングチーム
サービスAとBの変更時の素早い情報連携を支援する形で、
イネイブリングチームはABを横断する形で連携のファシリを行う。

### プラットフォームチーム
プラットフォームチームは、非機能的な部分の改善などによって、
サービスが更新された場合などの時に、AB間の連携を取るイメージだ。
私はサービスメッシュなどが整備されている場合には、そこを担当するのがこのチームだと捉えている。
通信的な障害が起きた際には、プラットフォームチームが率先してストリームアラインドチームをサポートしてあげる。

# 非同期の場合
では、逆に非同期の場合を見てみようと思う。
非同期の場合には、

:::note warn
情報の不整合リスクが同期通信の時よりも出てくる
:::

代わりに、

:::note info
コミュニケーションコストという面で見たら、だいぶ抑えられる。
:::

各サービス間が、同期の時と違って、
メッセージを投げる側はキューに投げたら、返事を待たなくていい。
受け取る側は、好きな時にキューから受け取れる。

同期通信の時と違って、障害や変更影響が波紋することもない。
よって、チーム同士の対話の必要性は抑えられる。

一方で技術的にはこちらの非同期の方が学習コストも高いので、
そのコストを払うのか？　それともチーム同士の密なコミュニケーションコストを払うのか？
これら目に見えないコストの比較の上で、決定すると思っている。
Java基礎文法Part9

今回はスコープについて記事にしたいと思います。

スコープとは、プログラミングにおいて、変数やオブジェクトがどの範囲で有効（アクセス可能）かを示す概念のことです。スコープを理解することで、プログラムの中でどこで変数が使えるのか、またどこで使えないのかがわかり、効率的にコードを書くことができます。特にWeb開発やJSPのようなサーバーサイド開発では、スコープの管理が重要です。

1. スコープの基本的な考え方
スコープは、どこで変数やオブジェクトが生きているか（有効か）を指します。スコープの範囲外では、その変数やオブジェクトは使えなくなります。これにより、プログラムの中で変数の寿命やアクセスの範囲を制御できます。

2. JSPにおけるスコープの種類
JSP（Java Server Pages）やサーブレットでは、スコープの概念が非常に重要で、データをどの範囲で使うかを決める4つのスコープが存在します。それぞれ、データをどれくらいの期間、どこで使用できるかを決定します。

3. JSPのスコープの種類
ページスコープ（Page Scope）

有効範囲: JSPページ内だけで有効です。
説明: 現在表示している1つのJSPページの中でのみデータが有効です。他のJSPページやサーブレットにデータを渡すことはできません。
使用例:
```jsp
<%! String pageData = "ページ内だけで使えるデータ"; %>
```
使い方: データを一時的に使用する場合、例えば計算結果やメッセージの一時表示などに使います。
リクエストスコープ（Request Scope）

有効範囲: 1回のリクエストに対して有効です。ページ遷移中や、他のサーブレットやJSPにデータを引き渡すことができます。
説明: 例えば、フォームに入力されたデータを処理する場合に使われ、フォームデータを次のページに渡すことができます。
使用例:
```jsp
request.setAttribute("userName", "Taro");
String name = (String) request.getAttribute("userName");
```
使い方: ユーザーがフォームに入力したデータを他のページやサーブレットに渡して処理する場合に使います。
セッションスコープ（Session Scope）

有効範囲: ユーザーごとにセッションが続いている間有効です。ブラウザを閉じるか、セッションが切れるまでデータが保持されます。
説明: ログイン情報や、カートの中身のように、ユーザーごとにデータを保存しておきたい場合に使われます。
使用例:
```jsp
session.setAttribute("loginUser", "Hanako");
String loginUser = (String) session.getAttribute("loginUser");
```
使い方: セッション中にログイン情報やユーザーの一時的な状態を保持するのに使います。複数ページにわたってデータを維持できます。
アプリケーションスコープ（Application Scope）

有効範囲: アプリケーション全体で有効です。サーバーが起動している間、全てのユーザーや全てのページで使えるデータです。
説明: 例えば、アプリケーション全体で共通の設定情報やデータを保存しておきたい場合に使います。
使用例:
```jsp
application.setAttribute("appName", "MyApplication");
String appName = (String) application.getAttribute("appName");
```
使い方: サイト全体で共有したいデータや、アプリ全体の設定などに使います。すべてのユーザーに対して同じデータを参照させる場合に便利です。

4. スコープの使用例
リクエストスコープを使った例（入力データを渡す）
入力フォーム（input.jsp）
```jsp
<form action="output.jsp" method="post">
    名前: <input type="text" name="userName">
    <button type="submit">送信</button>
</form>
```
データを受け取るページ（output.jsp）

```jsp
<%
    // リクエストスコープでデータを取得
    String name = request.getParameter("userName");

    // リクエストスコープでデータを次のページに渡す
    request.setAttribute("userName", name);
%>
<h1>こんにちは、<%= name %>さん</h1>
```
この例では、input.jspから送信されたデータをrequest.getParameter()で取得し、request.setAttribute()でリクエストスコープに保存しています。次のページや処理にデータを引き渡すことができます。

5. まとめ
スコープは、変数やデータがどの範囲で有効かを制御するための仕組みです。これにより、データの有効期間や範囲を適切に管理できます。
JSPでは、4つのスコープ（ページ、リクエスト、セッション、アプリケーション）があり、それぞれ異なる範囲でデータを管理します。
ページスコープ: 現在のJSPページだけでデータを使いたいとき。
リクエストスコープ: ページ遷移や1つのリクエスト内でデータをやり取りするとき。
セッションスコープ: ユーザーごとにデータを保持したいとき。
アプリケーションスコープ: アプリ全体で共有したいデータがあるとき。

今回はスコープについて記事にしました。
Java基礎文法の記事はPart10で最終回にしようかと思っています！
所属大学にて9月に1日で機械学習

所属大学にて9月に1日で機械学習なんもわからん状態から生成モデルを組めるようになろうというワークショップをした。普通に考えて参加者側の視点に立ったら無理なんだが, まあとにかくそういうイベントをやった。やってみたところ, 「何話してるのかわからん」という感想が多く大絶賛だった(反省しています)。

ただワークショップ中にきた質問が結構自分も最初のころは躓いたところだな〜〜というものも多く, ワークショップ中にきた質問点をまとめていけば案外生成AIをフルスクラッチで作れる技術者になるためのTips集が作れるのではないかと思い, この記事を書くことにした。ただ正直, 自分が学びたての頃こういうTips集を読んで理解したかと言うとそうではない気がするので, 読者の皆様に関しては「へ〜こんなのあるんだ」という感じで読んでいただき, [実際にこ](https://daynghekimhoan.vn/hoc-ve-3d-tren-may-tinh/)のTipsでの問題が起こった時に思い出していただきたい。

重要度別に☆何個みたいな感じで発表していこうとも思ったが, なんだかんだ無意識に使う知識が多いのでつけないで発表を行う。
Dagster University の Dagster Essentialsをやってみた

## Dagster について
https://dagster.io/
Dagster は Asset ベースの Data Orchestration ツールになります。

Asset を Python コードで定義することで、データの Lineage を見ることができたり 定期実行する Job や、イベントをトリガーとした Job の実行などを管理できるツールです。

## Dagster Univerity とは
https://courses.dagster.io/courses/dagster-essentials
Dagster University は、Dagster 公式で用意されている Learning 用のコンテンツです。

チュートリアル的に手を動かして学べるのと、各章の最後に Quiz があり理解度チェックをすることができます。

基礎的な概念から実際に手を動かすパートなどあり、Dagster を使うとどんなことができるかのイメージが付きます。

## Dagster Essentialsの内容
```
- Lesson 1: Introduction
- Lesson 2: Prerequisites & setup
- Lesson 3: Software-defined Assets 
- Lesson 4: Asset dependencies
- Lesson 5: Definitions and code locations
- Lesson 6: Resources
- Lesson 7: Schedules
- Lesson 8: Partitions and backfills
- Lesson 9: Sensors
- Capstone
- Extra credit: Metadata
```

すべて英語な上、サイトの作りの影響なのか、ブラウザの翻訳が効かないです。
内容を翻訳サイトにコピペして、日本語で内容把握していきました。

## 修了証
全部終えると、このような修了証をもらうことができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/441104/757ef023-9b0a-f2e1-cc10-e1e357b6cf1b.png)


## つまったところ
### Lesson9: Sensors - Configuring asset creation
```
class AdhocRequestConfig(Config):
    filename: str
    borough: str
    start_date: str
    end_date: str
```
を書くと、
```
Metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its basesMypymisc
```
が発生。

#### 解決方法
正しいかは分からないですが、dagsterのバージョンを1.8系に上げるとエラー発生しなくなりました。(※使用しているpythonは、3.12.5)
手順では、 `pip install 'dagster~=1.7'` とあり、1.7系をinstallすることになっていますが、このバージョンだとエラーとなり、1.8系にあげるとエラー発生しなくなりました。

やったこと

``` setup.py
install_requires=[
        "dagster==1.8.*",　　　←1.8に変更
```
に変更した後、
`dagster_university % pip install -e ".[dev]"`
です。

### Lesson9: Sensors - Creating a job
```jobs/__init__.py
adhoc_request = AssetSelection.assets(["adhoc_request"])

adhoc_request_job = define_asset_job(
    name="adhoc_request_job",
    selection=adhoc_request,
)
```
をした後、dagster UIで、adhoc_requestが見つからないというエラーが出る。

#### 解決方法
Lesson 7: Schedules - Updating the Definitions object で、

```top levelの__init__.py 
all_jobs = [trip_update_job, weekly_update_job]
```
などの追加をしているが、requests.pyを同様に追加していない。
この手順が、Lesson 9に書かれていないので、手順通りにやってもエラーになってしまいます。

top levelの__init__.pyはこのようになるはずです。
```top levelの__init__.py 
# fmt: off
from dagster import Definitions, load_assets_from_modules

from .assets import metrics, trips, requests
from .resources import database_resource
from .jobs import trip_update_job, weekly_update_job
from .schedules import trip_update_schedule, weekly_update_schedule


trip_assets = load_assets_from_modules([trips])
metric_assets = load_assets_from_modules([metrics])
requests_assets = load_assets_from_modules([requests])

all_jobs = [trip_update_job, weekly_update_job]
all_schedules = [trip_update_schedule, weekly_update_schedule]

defs = Definitions(
    assets=[*trip_assets, *metric_assets, *requests_assets],
    resources={
        "database": database_resource,
    },
    jobs=all_jobs,
    schedules=all_schedules,
)
```
【JavaScript 】JavaScriptの関数宣言と関数式について

# はじめに
最近JavaScriptの基礎力を上げようと思い練習問題を毎日解いています。教材が少し古いものでfunction関数を使っていました。そこで発生した疑問である関数宣言と関数式についての記事になります。

# 関数の定義の仕方
JavaScriptの関数の定義の仕方には２種類があります。「***関数宣言***」「***関数式***」という2つの種類があります。

## 関数宣言
`function`を使い関数を宣言します。

```javascript
function hello() {
  console.log("Hello World")
}

hello();

// 出力結果　Hello World
```
`hello`関数を宣言した後に関数の関数を実行します。

```javascript
function sum(num_1, num_2) {
  return num_1 + num_2;
}

console.log(sum(1, 2));

// 出力結果 3
```
`hello`関数を宣言した後に引数を渡して関数を実行します。

## 関数式
関数宣言で書いた先ほどの関数を関数式で書いてみます。

```js
const hello = function() {
  console.log("Hello World")
}

hello();

// 出力結果　Hello World
```

`hello`という変数に対して`function`関数を代入しています。

```js
const sum = function(num_1, num_2) {
  return num_1 + num_2;
}

console.log(sum(1, 2));

// 出力結果 3
```

## 関数宣言と関数式の違いについて
関数宣言と関数式は、書き方だけでなくホイスティングというJavaScript独特の挙動にも違いがあります。ホイスティングは、関数が定義される前にその関数を呼び出せるかどうかに影響します。これを見ていきましょう。

### 関数宣言のホイスティングについて
ホイスティングとは関数が宣言されるより前に記述されていても実行される機能のことです。

***関数式の場合***
```js
console.log(sum(1, 2));

const sum = function(num_1, num_2) {
  return num_1 + num_2;
}

// 出力結果 Uncaught ReferenceError: Cannot access 'sum' before initialization
```

このように関数が宣言されるより前に`sum`を実行しているのでエラーになってしまいます。

***関数宣言の場合***

```js
console.log(sum(1, 2));

function sum(num_1, num_2) {
  return num_1 + num_2;
}

// 出力結果 3
```
関数宣言の場合はホイスティングにより先に`sum`を実行していますがエラーが発生しません。

## アロー関数で発生したホイスティングエラー
現在は基本的に関数を宣言するときにはアロー関数で宣言することが多いと思います。前提として<font color="Red">***アロー関数は関数式になります***</font>。今回私がこの記事を書こうと思ったのもアロー関数が関数式であるということを理解していなかったため起きました。問題集の回答が`function`で書かれておりそれをアロー関数に修正した際にホイスティングのエラーが発生しました。

***修正前***

```js
module(5);
module(7);
module(26);

const module = (num) => {
  for (let i = 1; i <= 25; i++) {
    if (num > 25) {
      console.log(num);
    } else if (i % num === 0) {
      console.log(i);
    }
  }
};

```
アロー関数は***関数式***になります。ですのでホイスティングによる巻き上げは機能しません。

***修正後***

```js
const module = (num) => {
  for (let i = 1; i <= 25; i++) {
    if (num > 25) {
      console.log(num);
    } else if (i % num === 0) {
      console.log(i);
    }
  }
};

module(5);
module(7);
module(26);

```

# 終わりに
今回、JavaScriptの関数宣言と関数式の違いについて理解を深めることができました。特に、ホイスティングの挙動を意識することで、エラーを回避し、正しく関数を使い分けることができます。アロー関数の扱いにも注意しながら、さらにコードの最適化を図っていきたいと思います。

# 参考

https://qiita.com/kotaro-caffeinism/items/cd84e4fc3aa90412474b

https://qiita.com/horitomoyuki/items/1a2847a93f53644fdc3b

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

https://developer.mozilla.org/ja/docs/Glossary/Hoisting
Java基礎文法Part8

今回は暗黙オブジェクトについて記事にしたいと思います。

暗黙オブジェクトとは？
**暗黙オブジェクト（Implicit Objects）**は、JSPで自動的に生成され、プログラマが特に宣言をしなくても使えるオブジェクトです。これらは、JSPページやサーブレットでよく使われるデータのやり取りや情報の処理を簡単に行うためのものです。

なぜ「暗黙」なのか？
「暗黙」というのは、「開発者が特別に用意しなくても、最初から用意されている」という意味です。通常、Javaではオブジェクトを使うときにnewキーワードでインスタンスを作成しますが、暗黙オブジェクトはJSPが自動的に作成してくれるので、自分でインスタンスを作らなくても使うことができます。

代表的な暗黙オブジェクトの一覧と使い方
request

説明: クライアント（ユーザーのブラウザなど）からサーバーに送信されたリクエスト情報を扱います。フォームデータやURLのパラメータを取得するために使います。
使い方:

```jsp
String name = request.getParameter("name");  // フォームの"name"フィールドの値を取得
response
```

説明: サーバーからクライアントに返すレスポンス情報を扱います。ページのリダイレクトや、クライアントに送るヘッダーの設定などに使われます。
使い方:
```jsp
response.sendRedirect("home.jsp");  // 指定されたページにリダイレクト
session
```

説明: クライアントごとにセッション情報を保持します。ログイン情報など、ユーザーがサイトを訪れている間だけ保持しておきたいデータを管理するために使います。
使い方:
```jsp
session.setAttribute("user", "Taro");  // セッションにデータを保存
String user = (String) session.getAttribute("user");  // セッションからデータを取得
application
```

説明: サーバー全体で共有されるアプリケーションスコープのデータを扱います。サイト全体で使う共通の設定や情報を保存するのに使われます。
使い方:
```jsp
application.setAttribute("appVersion", "1.0");  // アプリケーション全体で使うデータを保存
```

out
説明: クライアントにHTMLなどの出力を送るためのオブジェクトです。通常は<%= %>を使って簡単に出力できますが、outを使っても出力が可能です。
使い方:
```jsp
out.println("Hello, World!");  // クライアントにテキストを表示
```

config

説明: JSPページの設定情報を扱います。web.xmlで設定された情報にアクセスできます。
使い方:
```jsp
String pageConfig = config.getInitParameter("settingName");  // 設定情報を取得
pageContext
```
説明: JSPページ全体のコンテキスト情報を提供し、他の暗黙オブジェクトにもアクセスできる便利なオブジェクトです。
使い方:
```jsp
pageContext.setAttribute("data", "value");  // JSPページ全体で使うデータを保存
```

page
説明: 現在のJSPページ自身を指すオブジェクトです。Javaのthisキーワードと同じように使われます。
使い方:
```jsp
// 現在のJSPページオブジェクトを指します（通常は直接使わないことが多いです）
exception
```

説明: ページ内で発生した**例外（エラー）**にアクセスするためのオブジェクトです。エラーページで例外処理をする際に使用されます。
使い方:
```jsp
<%= exception.getMessage() %>  // エラーメッセージを表示
```
暗黙オブジェクトの使い方の例
以下は、ユーザーがフォームに入力したデータをrequestオブジェクトを使って受け取り、sessionに保存し、outを使ってクライアントに表示する例です。

1. 入力フォーム（input.jsp）
```jsp
<form action="output.jsp" method="post">
    名前: <input type="text" name="username">
    <button type="submit">送信</button>
</form>
```
2. データを受け取るページ（output.jsp）
```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>結果ページ</title>
</head>
<body>
    <% 
        // フォームで送信されたデータを取得
        String name = request.getParameter("username");

        // セッションに保存
        session.setAttribute("user", name);

        // クライアントにデータを表示
        out.println("こんにちは、" + name + "さん！");
    %>
</body>
</html>
```
この例のポイント：
request.getParameter("username"): フォームから送信された名前を取得しています。フォームのname="username"と一致するデータを取得します。
session.setAttribute("user", name): 取得した名前をセッションに保存します。これにより、次のページでもこのユーザー名を使うことができます。
out.println("こんにちは、" + name + "さん！"): 取得した名前を画面に表示しています。
まとめ
暗黙オブジェクトは、JSPで自動的に用意され、Webアプリケーションの開発を簡単にしてくれる便利なツールです。これらのオブジェクトを使うことで、リクエストやレスポンスの処理、セッション管理、出力処理が手軽に行えるようになります。暗黙オブジェクトを理解して活用することで、より効率的にWebアプリケーションを開発することができるようになります。

今回は暗黙オブジェクトについて記事にしてみました。
RailsでのTailwindの画像path

##### 今回私は、わからずに苦戦していたのでメモ✍️をします。
画像ファイルは、 ***app/assets/images/test.jpg*** においています。

**tailwind.config.js**
```
module.exports = {
  theme: {
    extend: {},
    backgroundImage: {
      "top-bg": "url('./app/assets/images/test.jpg')"
    },
  },
};
```
**app/views/home/index.html.erb**
```
<div class="bg-calender-bg min-h-screen bg-cover"></div>
```
backgroundImageに画像ファイルがある ***url('./app/assets/images/test.jpg')*** にしたら
localサーバーで確認しても画像が表示されませんでした。
---
#### 出来なかった理由
###### Railsのアセットパイプライン
Railsのアセットパイプラインは、app/assets/images/フォルダにある画像やその他のアセット（CSS、JavaScriptなど）をプリコンパイルして、URLを通じてアクセスできるようにします。この際、アセットはRailsが提供する/assets/パスで公開されます。
ですから、Railsでは、app/assets/images/にある画像が自動的に/assets/というパスで公開されるため、フルパス（app/assets/images/test.jpg）を書く必要がありません。

###### Tailwind CSSのビルドプロセス
```
docker compose exec web rails assets:precompile
```
このコマンドによって、Railsのアセットパイプラインが画像を含むすべてのアセットをプリコンパイルし、/public/assetsディレクトリに配置します。これにより、Railsアプリケーションが静的ファイルを適切に提供できるようになります。
```
docker compose exec web npm run build
```
このコマンドにより、Tailwind CSSがtailwind.config.jsの設定を基にCSSファイルを生成します。特にbackgroundImageの設定は、このビルドプロセス中に適用され、最終的にCSSに背景画像が適用される形で出力されます。
Next.jsとはなにもの

# Next.jsとは
React開発のためのフレームワーク。
Reactは機能が多く複雑なものが多いため、それを使いやすく誰でも高機能なプリケーションを書けるようにしたようなもの。
高度なWebアプリケーションを作成するための様々な機能を提供している。

## Reactとの違い
- React
    - UIを構築するための機能を提供するライブラリ
- Next.js
    - React開発のための機能を提供するフレームワーク

# Next.jsのメリット
- 設定入らずで高度な機能を使用可能
- 手動で複雑な設定をする必要がない
Lambdaのエラーログを分別する方法

## AWS LambdaのログをCloudWatch Logs Insightsでエラータイプ別に分析する方法

AWS Lambda関数のログデータを効率的に分析し、エラーをタイプ別にカウントした事があったので備忘に残します。
このような場合に役立つツールが**CloudWatch Logs Insights**です。
Lambda関数が出力するログデータをCloudWatch Logs Insightsを使って分析し、エラーをタイプ別に集計する方法について記載します。

---

### CloudWatch Logs Insightsとは？

**CloudWatch Logs Insights**は、Amazon CloudWatchのログデータに対してクエリを実行し、迅速に必要な情報を抽出・分析するための強力なツールです。
SQLに似た構文を使い、ログメッセージをフィルタリングしたり、メトリクスを集計したりすることができます。これにより、AWS Lambdaをはじめとするさまざまなサービスのログを効果的に活用できるようになります。

---

### Lambdaから出るエラーをカウントする豊富

- **エラーをタイプ別にカウントしたい**  
  Lambda関数が出力するエラーメッセージを特定のパターンごとに分類し、その頻度を確認する必要した。

- **CloudWatch Logs Insightsのクエリを使ってデータを集計したい**  
  CloudWatch Logs Insightsのクエリを使って、Lambda関数のログから効率的にデータを抽出し、エラーメッセージをタイプ別に集計します。

---

### CloudWatch Logs Insightsクエリの例

まずは、基本的なクエリについて。
クエリは、Lambda関数のログデータから「error」を含むメッセージをフィルタリングし、メッセージごとのエラーの発生回数をカウントします。

```sql
fields @timestamp, @message
| filter @message like /error/  # "error" を含むログメッセージをフィルタリング
| stats count() by @message  # メッセージごとにカウント
| sort count() desc  # カウントを降順でソート
```

#### このクエリについて
1. **`filter @message like /error/`**  
   ログメッセージから「error」を含むものだけを抽出します。
   
2. **`stats count() by @message`**  
   メッセージごとに出現回数をカウントし、エラータイプ別の発生頻度を確認します。

3. **`sort count() desc`**  
   カウント結果を降順に並べ替え、どのエラーが最も頻繁に発生しているか一目で確認できるようにします。

---

### クエリのカスタマイズ：エラーコード別に集計

次に、エラーメッセージが特定のパターンに従っている場合、例えば「Error Code:」というフォーマットでエラーコードを集計したい場合。
この場合、`parse`関数を使ってエラーコードを抽出し、それに基づいてエラーを集計するクエリに変更することができます。

```sql
fields @timestamp, @message
| filter @message like /error/
| parse @message "[Error Code: *]" as errorCode  # エラーメッセージからエラーコードを抽出
| stats count() by errorCode  # エラーコードごとにカウント
| sort count() desc  # カウントを降順で並べ替え
```

#### クエリについて
1. **`filter @message like /error/`**  
   先ほどと同じく、「error」を含むログメッセージを抽出。

2. **`parse @message "[Error Code: *]" as errorCode`**  
   メッセージから「Error Code:」に続くエラーコードを抽出し、それを`errorCode`という変数に格納します。

3. **`stats count() by errorCode`**  
   エラーコードごとにカウントし、エラーのタイプ別に発生頻度を確認します。

4. **`sort count() desc`**  
   カウントを降順で並べ替え、どのエラーコードが最も多く発生しているかが把握できます

---

### CloudWatch Logs Insightsの活用メリット

- **リアルタイムでログ分析が可能**  
  Lambda関数のエラーを素早く検出し、原因特定までの時間を大幅に短縮できます。

- **高度なクエリで柔軟な分析**  
  SQL風のクエリを使うことで、カスタマイズしたログ分析が簡単に行えます。
  パターンマッチングや集計、並べ替えも自由自在です。

- **コスト効率の良いログ管理**  
  必要なログデータだけを効率的に抽出することで、膨大なログデータを扱う際のコストを抑えることができます。

---

### まとめ

AWS CloudWatch Logs Insightsを活用することで、AWS Lambda関数のログデータからエラーをタイプ別に集計し、効率的に分析することができます。特に、`stats`コマンドや`count`関数を活用することで、エラーの発生頻度を可視化できるのはとても良い利点です。

--- 

参考文献

https://ci.clara.jp/media/?p=7429
8の倍数ルールでデザインする理由とメリット・デメリット

# 目次
### 1. 8の倍数で設計する理由とメリット
### 2. 8の倍数でデザインするデメリット
### 3. 実践と応用
### 4. 最後に


## **1.8の倍数で設計する理由とメリット**

- **デザインの一貫性向上**：要素のサイズや余白に秩序が生まれ、デザインの品質が向上します。
- **コーディング効率の向上**：端数が出にくく、コーディングがスムーズになります。
- **汎用性の高さ**：多くのデバイス解像度が8の倍数であるため、幅広いスクリーンサイズに適応しやすいです。
パソコンサイズ　1920px＝240✖️8 、スマホサイズ640px＝80✖️8
- **デザインルールの徹底**：統一されたルールにより、デザインとコーディングの品質と速度が向上します。

## **2. デメリット**

- **計算の複雑さ**：8の倍数を計算する際に繰り上がりが発生し、直感的ではない場合があります。しかし、慣れによって解消可能で、大きな問題ではありません。

## **3.実践と応用**
- **よく使う余白サイズ**：8px、16px、24px、32px、48px、64pxなど。必要に応じて4の倍数（4px、12px）も活用します。
- **効率的なコーディング**：余白サイズを変数として定義し、管理とメンテナンス性を向上させます。
- **デザインの秩序維持**：数列的な秩序が生まれ、デザインの一貫性が保たれます。
- **ツールの活用**：IllustratorやAdobe XDで8の倍数のシンボルやガイドを用意し、デザイン作業を効率化します。

## **4.最後に**

8の倍数ルールは、デザインとコーディングの両面で大きなメリットをもたらし、結果的にWebサイトやアプリ全体の品質向上につながります。このルールはデザイナーやエンジニアだけでなく、利用者や運用者にもメリットがあり、サービスの品質や運用性の向上に寄与します。

フロントでエンジニアをしていく上で基礎的なデザイン知識はデザイナーとうまくコネクトしていく上で大切なですね。


参考文献
https://yuyakinoshita.com/blog/2019/02/10/design-by-multiple-of-8/
LINE WORKS の Incoming Webhook を簡単に試してみる

https://colab.research.google.com/drive/1OIsbaznzSZldi0DwBsimIQw26ComO47G?usp=sharing
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">LINE WORKS の Incoming Webhook をブラウザで簡単に試せます。<br><br>Goolge Colaboratory に簡単なスクリプトを置きました。自分の環境の Webhook URL を指定すれば、すぐに実行できます。<a href="https://t.co/HG7lmXVsg4">https://t.co/HG7lmXVsg4</a><br><br>Google アカウントでログインが必要です。<a href="https://twitter.com/hashtag/LINEWORKS?src=hash&amp;ref_src=twsrc%5Etfw">#LINEWORKS</a> <a href="https://t.co/OVgLg6zIq4">pic.twitter.com/OVgLg6zIq4</a></p>&mdash; iwaohig (@iwaohig) <a href="https://twitter.com/iwaohig/status/1841666121436692784?ref_src=twsrc%5Etfw">October 3, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
備忘録: TypeScriptでアロー関数の使い方を間違えた話

## 概要
アロー関数の書き方を間違えて、`find()`のコールバック関数の返り値が`void`になっていたために、後続の処理が想定通りに動作しなくなっていた話の備忘録です。

## ミスの概要

### 本来書くべき内容

```TypeScript
const numberList = [1,2,3,4,5]
const func = (num: number) => num === 5

const targetNumber = numberList.find(func)
// 5が出力される
console.log(targetNumber) 
```

アロー関数で`num === 5`の場合に`true`を返す関数を定義し、`find()`のコールバック関数として渡しています。この場合、`num === 5`は`{ return num === 5 }`の省略形であり返り値(式)です。


### 実際に書いた内容

```TypeScript
const numberList = [1,2,3,4,5]
const func = (num: number) => { num === 5 }

const targetNumber = numberList.find(func)
// undefinedが出力される
console.log(targetNumber) 
```

本来書くべき内容と異なっているのは`{ num === 5 }`の箇所のみです。
先ほどの`num === 5`は`{ return num === 5 }`の省略形であり返り値でしたが、`{ num === 5 }`は通常のアロー関数の書き方で処理として`num === 5`という式文を書き、値を`return`しない(返り値が`void`の)形になっています。

[MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find#%E8%A7%A3%E8%AA%AC)によると、`find()`はコールバック関数が真値を返さない場合に`undefined`を返します。そのため、`func: (num:number) => void`をコールバック関数として渡した場合`targetNumber`は必ず`undefined`になり、`targetNumber`に数値が返ってくる想定で処理を書いた場合、当然その後の処理は想定通りに動作しません。

## まとめ
アロー関数やその他の記法を書く際は、通常の記法と省略記法を把握した上で、どちらを書いているのかを意識しながら書くように心がけようと思いました。
PowerApps 親レコードの追加後、親IDを子供レコードに渡して、子供レコードを追加する実装方法

# 元データ

Parent_table
|id |product_name|
|---|---|
|1  |商品A|
|2  |商品B|

Child_table
|id |product_id |year |sales |
|---|---|---|---|
|1   |1|2024  |100|
|2   |1           |2025  |200
|3   |1           |2026  |300
|4   |2           |2024  |10
|5   |2           |2025  |20
|6   |2           |2026  |30

# 目標
Parent_table
|id |product_name|
|---|---|
|1  |商品A|
|2  |商品B|
|3  |商品C|

Child_table
|id |product_id |year |sales |
|---|---|---|---|
|1   |1|2024  |100|
|2   |1           |2025  |200
|3   |1           |2026  |300
|4   |2           |2024  |10
|5   |2           |2025  |20
|6   |2           |2026  |30
|7   |3           |2024  |20
|8   |3           |2025  |20
|9   |3           |2026  |20

# 方法
```
ClearCollect(
    year_col,
    [2024,2025,2026]
);
With(
    Patch(
        Parent_table
        {id:Blan()},
        {product_name: 商品C}
    )As ParentRecord,
    ForAll(year_col,
        Patch(
            Child_table
            {id:Blan()},
            {product_id:ParentRecord.id,
             year:Value,
             sales:20
            }
        )
    )
);
```

# 参考サイト
https://community.powerplatform.com/forums/thread/details/?threadid=227bc535-8d17-4dd7-8c87-9a1d762519bf