OmniAICreator/Qiita-1.07M huggingface dataset:
VBのWith...End With ステートメントをRubyで実現するには

## 環境
Ruby2.6

## はじめに
Rubyを触っていて、その昔、VBでよく使っていた**With...End With ステートメント**が、Rubyでも使えないものだろうかと思いググってみました。

Rubyではどうも、**instance_execメソッド**を使って実現できるらしいです。

VBのWith...End With ステートメントは個人的には、わりと重宝して使っていたにも関わらず、Rubyのinstance_execメソッドについて書かれた記事はあまり散見されないようです。

instance_execメソッドの便利さはあまり認知されていないのだろうか。そこで、instance_execメソッドの便利さについて書いてみました。

https://learn.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/with-end-with-statement

## メリット

instance_execメソッドを使うと、オブジェクト参照を複数行に渡って記述したいときに、反復した記述を省略することができます。そのことによって、コードの見映えをよくすることができます。

## サンプル

RubyXLというgemを使って、Excelファイルを新規に作成して書き込みをするサンプルコードです。こちらのコードを使って、instance_execメソッドを使った場合と使わない場合とのコードの違いを比較してみました。

```sample.rb
require 'rubyXL'
require 'rubyXL/convenience_methods'

book  = RubyXL::Workbook.new
sheet = book[0]
        
# instance_execメソッドを利用しない場合
rs = sheet.add_cell(0, 0, '2024/03/01')
rs.set_number_format('yyyy/mm/dd')
rs.change_border(:bottom, 'hair')
rs.change_horizontal_alignment('center')
        
# instance_execメソッドを利用した場合
sheet.add_cell(1, 0, '2024/04/01').instance_exec {
    set_number_format('yyyy/mm/dd')
    change_border(:bottom, 'hair')
    change_horizontal_alignment('center')
}
     
book.write('foo.xlsx')
```

コードを実行すると、Excelファイルはこのように作成されます。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/7151879c-91e6-33a0-2ff8-6be2aa99c721.png)

## 解説

上部の記述がinstance_execメソッドを利用しない場合の書き方で、下部の記述がinstance_execメソッドを利用した場合の書き方です。

どうでしょうか？。instance_execメソッドを使うと、rsというオブジェクト変数が省略できます。また、ブロック化できることで、整理された印象となり、見た目が分かりやすくなりました。そして、気になるのが、どっちの書き方の方が早いのかということですが、そこは分かりません。悪しからず。
【Unity】CRIで音声をビルドする

# CRIとは

CRIとは、株式会社CRI・ミドルウェアが提供するゲームやマルチメディアコンテンツの開発を支援するための技術とツールの総称です。今回は、その中でも、Unityと統合するためのプラグインを提供しているCRIWAREというツールを使用します。

# 音声のビルド

UnityでCRIWAREのオーディオミドルウェアを使用する場合、AtomCraftというツールを使用して音声データをビルドする必要があります。

# インストール

[ダウンロードページ](https://game.criware.jp/products/adx-le/) から、Unity向けのプラグインである「ADX LE Unity SDK(3.10.01)」
をダウンロードしましょう。ダウンロードしたフォルダを展開して、「"cri\tools\ADX2LE\ver.3\CriAtomCraft.exe"」のパスにあるCriAtomCraft.exeを開きます。

# ビルドの流れ

最初に、AtomCraftを起動し、新しいプロジェクトを作成します。

次に、マテリアルルートフォルダーに再生したい音声を追加します。

続いて、キューシートフォルダー下のキューシートに追加した音声をD&Dします。

そして、キューシートを右クリックして、Atomキューシートバイナリのビルドを選びます。

この時、「Unity向けAssetsフォルダを出力」にチェックを入れましょう。

最後に、ビルドボタンをクリックしてビルド完了です。

最後までご覧いただきありがとうございました :laughing:
投稿マラソン38/38記事目 遂に完走

## 苦痛と感謝

![38days.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/1deb0d7b-fc79-35a1-53c4-99de5bb79fbd.png)

「[国語が苦手、読み書きが辛い](https://qiita.com/koji-yamauchi/items/ee3f7a791c9bfd2acf6d)」で書いたように、文章を書くには苦手で38日休みなしで毎日記事を作成するのは苦痛でした。

しかし、このようなお祭りがきっかけとしてなければ、ここまでやることはできなかっただろうなというのと自分の思考をアウトプットする機会になって良かったです。

このような場を設けていただいたQiitaさんには感謝です。

## 失速したと思われないように

単純に投稿件数を稼ぐだけで、中身の薄い投稿が続いていると思われないように、なるべく熱意をもって記事作成しました。

## 反応が気になる

熱意をもって書いた文章に多くの「いいね」がつくと手応えを感じ充実した気持ちになります。
一方、十分な熱量があって、きっとこれは「いいね」がいくつかつくだろうという予測が外れ無風状態だと少し気を落としてしまいます。

SNSで発言がバズり目当てで先鋭化する人の気持は少しわかる気がします。
人はかけたコストに見合うフィードバックをどこかで期待してしまう癖があるのでしょう。
気をつけなければと思いました。

### 数値として現れる世界での競争

当初は投稿マラソンだけを考えており、Organization対抗戦などはどうせ圏外だろうからと意識していませんでした。

しかし、いざ始めてみると10名以下部門ランキングの上位に食い込み始めました。
折角ならここで勝ちたいという欲が出てきました。

1位になったり、4位まで転落したり、1位に復活したと思ったらすぐに巻き返されたり。
思うように数値が上がらない日々を過ごすと疲れが出てきます。世のセールスマンもこのような気持ちなのでしょう。

後半には追いつけないほどの差が開いたので、現時点で1位を取れる可能性はほぼゼロですが、手に汗を握る時間も今となっては良かったと思います。

## 苦行の先に景色は変わるか

1ヶ月強の期間は苦行でしたが、それを乗り越えると見える景色が少し変わるかな？という気持ちがありました。
実際にやってみて感じたのは下記のようなものです。

* 自信がついた
* 文書作成のスピードは上がった
* 挿絵を作る力がついた
* 自分の考えを落とし込んだ資産ができた

### 自信がついた

やり切ることが出来たというのは自信につながりました。
また、いくつかの記事はトレンド入りし、意外と文書かけちゃうのかも。と少しだけ自信につながりました。

### 文書作成のスピードは上がった

毎日記事を作るとなると一つに時間をかけてられないので、無理矢理にでも早く仕上げる必要がありました。良い訓練になったと思います。

### 挿絵を作る力がついた

「[記事の挿絵をつくる技術](https://qiita.com/koji-yamauchi/items/f97272690c9c305bad1f)」でも記載しましたが、少し情緒をもたせるためであったり、テンポやリズムを整えるのに挿絵を作成しました。

基本的にはChatGPTのDALL-E3を用いていますが、具体的な指示を実現するには向いておらず、うまくいかない場合にはパーツだけを採用してPhotoshop上で加工を行いました。

![iceceamshop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/25c89ebc-216d-3634-486a-a01bf42b06f7.png)

例えば、「[なんだか助かる便利なおっちゃんになりたい](https://qiita.com/koji-yamauchi/items/61aed31bc27b929c996c)」で使った上記のイラストはどうしても生成されるのがロボットの店員だけで片方を人にできなかったので、Photoshop側の生成AIなどを併用しました。

ちょっとした挿絵をつくるということであれば、ある程度最適なオペレーションが自分の中で確立できてきたかなと思います。

また、動画を共有するためにYouTubeへのアップデートを行いました。
動画アップロードが初めてということではないのですが、「最近はこういうこともアップロード後にできるのか」などの新しい発見がありました。

### 自分の考えを落とし込んだ資産ができた

自分の考えを沢山文章に落とし込めたので人へ説明するときに利用できる資産ができました。
ポエム中心の投稿になりましたが、少なくともどういう価値観をもって仕事に取り組んでいるかはイメージできる材料になったと思います。

## 最後に

投稿マラソンの完走を果たした人、お疲れ様でした。
横目でチラチラとトレンドやOrganization対抗戦の結果を気にしながら見ていましたが、皆よい記事を高頻度で書くので本当にすごいなと思いました。

これを機会に自分も継続して情報のインプットとアウトプットができる人になりたいと思います。
業務知識を得るために読んだ本

過去に読んだ本で、業務知識を得ることにつながった本をご紹介します。

## THE MODEL

https://www.shoeisha.co.jp/book/campaign/the-model

情報がよく整理されており、とても読みやすいです。
インサイドセールスや営業の人に特に良い本だと思いますが、MAツール導入の相談を受けたり、マーケティングの担当者と協業する機会が増えてきた今の時代ではエンジニア側も読んでおくと、自分の担当するスコープの前後で会社組織としてどのような動きがあるのかイメージできて良いでしょう。

## ITエンジニアのための【業務知識】がわかる本 第5版

https://www.shoeisha.co.jp/book/detail/9784798157382


> 多くの知識は、明日必ず必要というものでもなく…「将来、必要になるかもしれないし、ならないかもしれない」…そんな感じのものです。よーく考えれば、だからこそストレスなく勉強できるし、必要になった時にあたふたしなくていいということなので、それ自体がメリットなのですが、ことモチベーションとなるとどうしても高まりません。しかも面白くない。本書を読んでいても全く笑えない（苦笑）。なので、資格取得を目標にするなどセルフコントロールが必要になります。

本の中で上記のように書かれているとおり、基本的に面白くなく、これまでの経験と関わりの薄い部分は読むのが辛い本です。
しかし、業務知識について広く知っておくべきだろうなと納得できる内容が網羅されています。

私は学生時代にピッキングのアルバイト経験があったので、倉庫内のマテハン機器の話などはこれまでの経験でとてもイメージしやすく理解が広がって面白く感じました。

IPAの資格対策以外にも、ベースとなる教養を得るために良い本だと思います。

書籍の中で、実際に工場見学できると良い、難しければバーチャル工場見学でもという旨の記載がありましたがバーチャル工場見学は子供向けのものが多いので、個人的にはテレ東の「知られざるガリバー～エクセレントカンパニーファイル～」がオススメです。

https://www.tv-tokyo.co.jp/gulliver/


## 全図解 メーカーの仕事

https://www.diamond.co.jp/book/9784478112946.html

これからはIT技術だけでなく、IT技術で何を解決するかの対象となるもの業務の理解がとても重要になるため、読んでみました。
ちなみにメーカー（製造業）の割合は2013年のデータでおおよそ2割だそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/2aee7b19-cc9e-31d3-8259-c8cc6af62f3b.png)

出典: https://www.meti.go.jp/report/whitepaper/mono/2015/honbun_pdf/pdf/honbun01_02_01.pdf

前述の「ITエンジニアのための【業務知識】がわかる本」に比べると、比較的簡易な表現で文章がつくられており、図解も多くとても読みやすいです。
ページ分割も読み手に優しいように区切られており苦痛なく読み進めることができます。

ビジネスや問題解決の考え方はWeb制作であっても製造業であっても、共通部分が多いように感じました。

物流ABC(Activity Based Costing)は弊社が社内で取り組んでいる工数管理に通じる部分がありました。

https://www.wantedly.com/companies/add-more/post_articles/481230

----

実際には本で学べる範囲は表層部分だけですので、顧客へのヒアリングや対話しながら理解を進める必要があると思いますが、土台となる知識があるかどうかで自分や相手の負担が大きく変わりますので、基礎知識固めも重要だと思います。
いかにして相手の想像を掻き立てるか


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/e4a48c91-0d3a-bc08-4f49-324b81990c5f.png)


## 採用活動において

**"いかにして相手の想像を掻き立てるか”** は、採用において求職者と採用担当の両者において大切です。

せっかく応募いただいても、応募者の求めている職場環境や価値観にミスマッチだといけませんので、応募者の方に入社後の具体的なイメージを想像できる情報提供が必要でしょう。

採用を担当する側としても、お互いの条件面でフィットしそうな場合、次のステップとして深く想像します。

* どういうこだわりのある人だろう
* 何を求めているだろう
* 会社として期待に答えられるか
* 負担のある依頼をするとどんな反応だろう
* どういうときに嬉しい人だろう
* 既存メンバーとはどのようなコミュニケーションをとるだろう

出社から、ミーティング、一緒に業務を進める姿を想像します。
まるでイマジナリーフレンドのように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/0cc2120a-6d53-0856-421b-9173c030f363.png)


私はこれまであまり就職活動らしい事をしてこなかったのですが、おそらく多くの採用担当も応募頂いた人の入社後のことをイメージするでしょうから、自分がもし転職活動をするとなった場合はこのあたりの想像をいかに掻き立てるか、不安を払拭するかを意識して面接に挑むと思います。

そういった意味でこのようにQiitaに考えを文章として落とし込むと普段どのようなことを考えている人かが相手にわかりやすくて良いかもしれませんね。

## 普段の業務においても

普段の生活や業務の中でも、相手が想像できるかはとても重要です。
いま取り組んでいる仕事のアウトプットがどうなるか、何が上がってくるか誰もわからない仕事は不安で仕方がありません。

それぞれのマイルストーンで、どのような事が発生し、どういう中間成果物ができあがるか、それはどのような目的で、どう効果を発揮して、最終的にどうなっていくかをイメージできなければいけません。

抽象的で前例がないプロジェクトの場合は、より具体的な部分まで落とし込むことは難しいかもしれませんが、少なくとも「このような道筋を我々は歩んでいくのだな」というストーリーは想像できる必要があります。
また、少しずつだったとしてもゴールに近づいているという感覚、きっとうまくいくと想像出来ることが大切です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426622/e857890c-51b2-1930-3571-39ac1e8038d8.png)


製品やサービスについても同じことが言えます。
これを導入すると生活がどのように豊かになるのだろう。
ここに行けば、どのような楽しい時間が過ごせるのだろう。
想像を掻き立て、気持ちを醸成します。

我々の仕事は、下記のように言えるかもしれません。

* チームメンバーの想像を掻き立てる
* 顧客の想像を掻き立てる
* 顧客の製品やサービスを利用するエンドユーザの想像を掻き立てる

これを実現するための能力がこれからを生きる力のひとつかもしれません。
SvelteKitでのCSRF対策の実装って結局、必要なの？不要なの？

## はじめに

昔からある攻撃の1つであるCSRFだが、SvelteKitでは対応不要というのを見かけた。

https://github.com/sveltejs/kit/issues/72#issuecomment-927143506

ほんとに？というのをソースコードを見て安心したいと思ったので、今回はソースコードでどのように実装されているか？を見てみたいと思う。

そしてソースコードを見ていく中で、[server route](https://kit.svelte.dev/docs/routing#server)による`'Content-Type': 'application/json'`を受け入れるエンドポイントを実装した場合は、自分でCSRFの対策をする必要があるように思えたので、それについてもまとめてみたいと思う。

## CSRFの対策を実装している部分の実装を見てみる

ずばり以下の部分。

https://github.com/sveltejs/kit/blob/%40sveltejs/package%402.3.2/packages/kit/src/runtime/server/respond.js#L63

```js:packages/kit/src/runtime/server/respond.js
	if (options.csrf_check_origin) {
		const forbidden =
			is_form_content_type(request) &&
			(request.method === 'POST' ||
				request.method === 'PUT' ||
				request.method === 'PATCH' ||
				request.method === 'DELETE') &&
			request.headers.get('origin') !== url.origin;

		if (forbidden) {
			const csrf_error = new HttpError(
				403,
				`Cross-site ${request.method} form submissions are forbidden`
			);
			if (request.headers.get('accept') === 'application/json') {
				return json(csrf_error.body, { status: csrf_error.status });
			}
			return text(csrf_error.body.message, { status: csrf_error.status });
		}
	}
 ...
```

確かにOriginヘッダーを見てチェックしていることがわかるので、SvelteKitではCSRFの対策はデフォルトで実装されている！＼(^o^)／！！

と思ったが、これは[**Form actionの時だけ**](https://kit.svelte.dev/docs/form-actions)なのでは…という罠？がある。

`is_form_content_type`関数の実装は[以下の通り](https://github.com/sveltejs/kit/blob/%40sveltejs/package%402.3.2/packages/kit/src/utils/http.js#L70)で、コンテントタイプをチェックしてformか？を確認しているため、REST APIのエンドポイントとして実装できる[server route](https://kit.svelte.dev/docs/routing#server)に対して`application/json`でfetchを利用してリクエストを送った場合は、このOriginヘッダーのチェックはスキップされる。

```js:packages/kit/src/utils/http.js
export function is_form_content_type(request) {
	// These content types must be protected against CSRF
	// https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/enctype
	return is_content_type(
		request,
		'application/x-www-form-urlencoded',
		'multipart/form-data',
		'text/plain'
	);
}
```

したがって、Form actionsで実装している場合には、上記で見たようにCSRFの追加の対策は不要と考えていいが、server routeでREST APIのエンドポイント（`'Content-Type': 'application/json'`でPOSTするとき）は自前でCSRF対策を実装すべきという事になる。

## server route（`'Content-Type': 'application/json'`を受け入れるエンドポイント）でのCSRF対策の実装

Webスタンダードの`fetch`であれば`'Content-Type': 'application/json'`でもOriginヘッダーは送信されるので、Form actionsと同じようにOriginヘッダーを検証するような実装で対策できるだろう。また、CSRFトークンによる検証でもよい。

※CSRF対策が必要になるような具体的なケースは以下など。

https://firebase.google.com/docs/auth/admin/manage-cookies?hl=ja

## まとめとして

SvelteKitでのCSRFの対策はたまに自信がなくなることもあるので、今回実際にソースコードを見てどのような実装になっているのかを確認して理解することで、どのような対策をすべきか？で迷うことがなくなったように思える。
IoT GWでmosquittoを利用しはじめる時につまったことメモ

## 背景
IoT GWにデフォルトでインストールされているmosquittoサービスを使ってみようとしたところ、いくつかエラーが出たので、起きた現象と解決方法を残します。

書いた人：手探りでIoTゲートウェイを触っている人です。ご指摘大歓迎です。

### バージョン情報

- IoT GWマシン： Futurenet MA-X320/L
- ファームウェア： `MA-X3xx firmware version 6.1.2 (Thu Mar 14 17:16:38 JST 2024)`
- OS: `Ubuntu 20.04.2 LTS`
- Mosquitto：

```
mosquitto -v
1720056781: mosquitto version 2.0.18 starting
```


## Mosquittoを起動したいが、なぜかうまくいかない

### 現象

以下のエラーが出る。

```terminal
$ systemctl start mosquitto
Job for mosquitto.service failed because the control process exited with error code.
See "systemctl status mosquitto.service" and "journalctl -xeu mosquitto.service" for details.
```

### 対応

Mosquitto実行コマンドを変えてみる。

まずは生きているプロセスがあれば一旦killする。

```terminal
$ ps aux | grep mosquitto
mosquit+     294  0.0  0.3  14952  7368 ?        Ss   Jul03   0:22 /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto_internal.conf
root        9415  1.0  0.0   3432  1936 pts/0    S+   10:17   0:00 grep --color=auto mosquitto
```

２つ引っかかる。上から1つ目がMosquitto実行コマンド。
一番目のプロセスをkillする：

```terminal
$ kill 294
```

kill結果確認：
```terminal
$ ps aux | grep mosquitto
root        9440  0.0  0.0   3432  1900 pts/0    S+   10:17   0:00 grep --color=auto mosquitto
```

`systemctl start mosquitto` ではなく以下のコマンドで実行する。
実行時にエラーが出力される：

```terminal
$ mosquitto -v -c /etc/mosquitto/mosquitto.conf
1720056089: Error: Invalid bridge configuration.
1720056089: Error found at /etc/mosquitto/mosquitto.conf:11.
```

→設定ファイルに不備があったことがわかりました。


## Mosquittoを起動したいがログファイル書き込み権限がないと怒られる

### 現象

以下のエラーが出る。

```terminal
$ mosquitto -v -c /etc/mosquitto/mosquitto.conf
1720056781: Loading config file /etc/mosquitto/conf.d/bridge.conf
Error: Unable to open log file /var/log/mosquitto/mosquitto.log for writing.
Error: Address already in use
```

設定に記載のある `/var/log/mosquitto/mosquitto.log` を自前で作成してしまったことが原因。
（本来、Mosquitto実行時に存在なければmosquittoがエラーなく作成するはず。）

### 対応

ファイルの状態を確認する：

```terminal
$ ls -l /var/log/mosquitto/

-rw-r--r-- 1 root      root         0 Jul  4 10:19 mosquitto.log
-rw------- 1 mosquitto mosquitto 9557 Jul  4 10:17 mosquitto_internal.log
```

やはり。。
ログファイルの所有者をmosquittoユーザーに変更する：

```terminal
$ chown mosquitto:mosquitto /var/log/mosquitto/mosquitto.log 
```

ログファイルの所有者の変更を確認する：

```terminal
$ ls -l /var/log/mosquitto/

-rw-r--r-- 1 mosquitto mosquitto 521234 Jul  4 13:01 mosquitto.log
-rw------- 1 mosquitto mosquitto   9557 Jul  4 10:17 mosquitto_internal.log
```
→OK!
ESP32-S3 C3 C6 H2を自分なりに纏めてみた

ESP32で多くの開発をしているのだが最近は色んなシリーズが出ているため
自分なりに纏めてみた。

以下のサイトがわかりやすいが、
https://lang-ship.com/blog/work/esp32-series/


私の場合は消費電力の比較が必要だったため
それを以下に記載。

| 　         |ESP32-S3     | ESP32-C3    |ESP32-C6     |ESP32-H2     |
|:-----------|------------:|------------:|------------:|------------:|
| WiFi4(802.11n) TX   | 286mA  | 278mA  |  268mA    |  -   |
| WiFi4(802.11n) RX   | 91mA     | 87mA    | 82mA      | -        |
| WiFi6(802.11ax) TX   | -     | -    | 252mA      |  -         |
| WiFi6(802.11ax) RX   | -     |  -   | 78mA      |  -         |
| BluetoothLE TX   | 表記なし     | 表記なし    | 315mA      | 148mA         |
| BluetoothLE RX   | 表記なし     | 表記なし  | 71mA      |  25mA         |
| ZigBee(802.15.4) TX  | -     |  -   | 305mA      |  153mA         |
| ZigBee(802.15.4) RX  | -     |  -   | 74mA      |  27mA         |
| Modem-sleep   | 23mA(40MHz)   |  22mA(80MHz)   | 30mA(80MHz)      | 8mA(32MHz)          |
| Light-sleep   | 240uA     | 130uA   | 180uA      | 85uA          |
| Deep-sleep   | 8uA     |  5uA   |   7uA    |  7uA         |

省電力であればESP32-H2を使用する方が良さそうだ
Next.jsでオセロAI対戦できるWebアプリを作成しました

# 概要
オセロで二人対戦とAI対戦ができるwebアプリケーションです。
こちらから実際にやってみてください。
https://hagisawa-yuki-github-io.vercel.app
GitHubはこちら
https://github.com/HagisawaYuki/HagisawaYuki.github.io.git

# 参考にした記事
https://qiita.com/Ryukuu0919/items/329aac4d738d328a6929
初めてNext.jsで開発したため、ひっくり返すとか、AIとか以外はほぼ参考にさせていただきました。

# 公開方法
GitHubを利用し、Vercelで公開しました。

# ひっくり返すアルゴリズム
まず、置いたマスから8方向に近い順で配列に二次元配列として格納します。
```gameSetting.tsx
const checkBoardLines: BoardState = new Array(8).fill(null).map(() => Array(0));
            
/** checkBoardLines = [右, 左, 上, 下, 右上, 左上, 右下, 左下]*/
//左右
board[row].forEach((cell, colIndex) => {
    (colIndex > col) ? checkBoardLines[0].push(cell) : (colIndex < col) ? checkBoardLines[1].unshift(cell) : {}
});
//上下
board.map((rows) => rows[col]).map((cell, rowIndex) => {
    (rowIndex < row) ? checkBoardLines[2].unshift(cell) : (rowIndex > row) ? checkBoardLines[3].push(cell) : {}
});
        //斜め四方向
board.forEach((rows, rowIndex) => rows.forEach((cell, colIndex) => {
    (colIndex > col && rowIndex + colIndex === row + col) ? checkBoardLines[4].unshift(cell) : 
    (colIndex < col && rowIndex - colIndex === row - col) ? checkBoardLines[5].unshift(cell) : 
    (colIndex > col && rowIndex - colIndex === row - col) ? checkBoardLines[6].push(cell) : 
    (colIndex < col && rowIndex + colIndex === row + col) ? checkBoardLines[7].push(cell) : {}
}));
```
そして、どの方向も挟めていればひっくり返すというように処理させています。

# AIのロジック
AIは今回とてもシンプルな設定にしてますが、一応ちょっとした先読みをするようにしてます。
①最初から44手まで
(1) 角取れたら取る。
(2) 角に置かれない。（無理なら諦める）
(3) 角の斜め内側に置かない。（これも無理なら諦める）
(4) (2)(3)をできるだけ満たしつつ、相手の打つところが最も少なくなる一手を打つ。
②45手から60手まで
(1)終盤のため最も多く取ることができるところに打つ。

# 最後に
これからは、Next.jsでwebアプリケーション開発する手順を環境構築から公開までを説明する記事を書いていこうと思います。
【GitHub】ローカルリポジトリをリモートリポジトリにPushする

# はじめに
ローカルで作成したリポジトリをGitHub上のリモートリポジトリにプッシュします。

# 前提条件
- gitがインストールされていて、gitコマンドが使える状態

# GitHubでの操作

1. 新しいリポジトリを作成

任意の名前でリポジトリを作成します。
READMEや.gitignoreを作成するオプションがありますが、一旦スルーして空のリポジトリを作成します。

# ローカルでの操作
## 1. ローカルプロジェクト内でgitの初期設定を行う

リモートリポジトリで管理したいプロジェクトに移動します。
そこで以下のコマンドを実行します。
```bash
git init
```

これでプロジェクト内に`.git`フォルダが作成されます。

## 2. プロジェクトファイルをgit管理下に置く

```bash
git add .
git commit -m "commit comment"
```

## 3. ブランチ名の確認

以下のコマンドでbranch名を確認します。
```bash
git branch
> main
```
2024年7月現在、デフォルトのブランチ名は`main`になっていると思います。
上記コマンドでデフォルトのブランチ名を確認しています。

ブランチ名がmainでない時は以下のコマンドでブランチ名を変更します。
```bash
git branch -M main
```
`-M`オプションでブランチ名を強制的に上書きできます。
`-m`オプションでもブランチ名を変更できますが、同名のブランチがあれば失敗します。
好きな方で名前をmainにしておきます。

## 4. リモートリポジトリと接続

以下のコマンドでローカルとリモートを接続します。
```bash
# sshキーの登録が済んでいる場合
git remote add origin git＠github.com:ユーザー名/リモートリポジトリ名.git
# httpsから接続する場合
git remote add origin https://github.com/ユーザー名/リモートリポジトリ名.git
```

最後にpushを行います。
```bash
git push -u origin main
```

以上でローカルからリモートリポジトリにpushすることができました。
これ以降、git commitを行ったら、`git push`だけでリモートにファイルをpushすることができます。
Goのlog/slogパッケージを使ってみる

## はじめに
今まで、文字列などを出力するときはlogかfmtを使って標準出力か標準エラー出力をしていたが、APIサーバを作るにあたり利用者の行動をファイルに記録する必要があると考えた。そこで、Goの標準パッケージであるlog/slogを用いて、json形式での構造化ロギングを行った。

## 実装
### コード
このコードは、GoのWebフレームワークに一つであるginを用いた簡単なAPIサーバです。エンドポイントへのアクセスが行われたとき、その情報をlog/slogを用いてserver.logに出力します。

https://github.com/Sawawa42/slog-qiita

```golang:main.go
package main

import (
	"github.com/gin-gonic/gin"
	"io"
	"log"
	"log/slog"
	"os"
	"time"
)

func main() {
	// ファイルを開く
	file, err := os.OpenFile("server.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		log.Println("Error")
		return
	}
	defer file.Close()
	fileWriter := io.Writer(file)

	// loggerの生成
	logger := slog.New(slog.NewJSONHandler(fileWriter, nil))
	// 生成したloggerをデフォルトにする
	slog.SetDefault(logger)

	r := gin.Default()
	// Ginのミドルウェアを設定
	r.Use(ginLogFormat(logger))

	r.GET("/ping", func(c *gin.Context) {
		c.String(200, "pong")
	})

	r.Run()
}

// Ginのミドルウェア
func ginLogFormat(logger *slog.Logger) gin.HandlerFunc {
	return gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
		logger.Info("gin-request",
			slog.String("time", param.TimeStamp.Format(time.RFC3339)),
			slog.Int("status", param.StatusCode),
			slog.String("latency", param.Latency.String()),
			slog.String("client_ip", param.ClientIP),
			slog.String("method", param.Method),
			slog.String("path", param.Path),
			slog.String("error", param.ErrorMessage),
		)
		return ""
	})
}
```
### 実行結果
- ```http://localhost:8080/ping```にアクセス -> pongが返される(200)
```json:server.log
{"time":"2024-07-04T12:52:46.369314015+09:00","level":"INFO","msg":"gin-request","time":"2024-07-04T12:52:46+09:00","status":200,"latency":"23.841µs","client_ip":"::1","method":"GET","path":"/ping","error":""}
```

- ```http://localhost:8080/hoge```にアクセス -> ページが存在しない(404)
```json:server.log
{"time":"2024-07-04T12:58:19.784257142+09:00","level":"INFO","msg":"gin-request","time":"2024-07-04T12:58:19+09:00","status":404,"latency":"370ns","client_ip":"::1","method":"GET","path":"/hoge","error":""}
```

## おわりに
サードパーティのパッケージに依存せず、標準パッケージ内の機能で構造化ロギングを行えるのはすごいと思った。このパッケージのことをもう少し深く掘り下げて、実運用で活かせるようなログ収集をしていきたい。

## 参考

https://pkg.go.dev/log/slog
Plot のレイアウト

## レイアウトを指定してプロットを配置

Julia　の　Plots　パッケージを使って、複数のプロットをマトリックス形式で並べることができます。

このとき，layout　引数を使って、縦横のプロットの個数を指定することができます。以下はその方法の例です。

```Julia
using Plots

# 各プロットを定義します
p1 = plot(rand(10), title="Plot 1")
p2 = plot(rand(10), title="Plot 2")
p3 = plot(rand(10), title="Plot 3")
p4 = plot(rand(10), title="Plot 4")
p5 = plot(rand(10), title="Plot 5")

# レイアウトを指定してプロットを配置します
plot(p1, p2, p3, p4, p5, layout=(2, 3))
```

![fig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/6f8355cf-6bdb-1113-65eb-26d5e332e374.png)
Azure NSGとAWS SGの違い

Azureを触った後にAWSを勉強して混乱したのでメモ

Azureの「Network Security Groups(NSG)」
＝ AWSの「Security Groups(SG) + Network Access Control Lists(NACL)」

|観点|SG（AWS）|NACL（AWS） |NSG(Azure)|
|---|---|---|---|
|アタッチ対象|インスタンス|サブネット|サブネット、ネットワーク インターフェース|
|設定方法|ホワイトリスト方式（許可のみ）|ブラックリスト方式（許可・拒否）|ブラックリスト方式（許可・拒否）|
|設定効果|ステートフル|ステートレス|ステートフル|
|評価|序列はなくすべて評価される|優先度順に評価される|優先度順に評価される|

## ステートフル、ステートレスとは
ステートフル = 戻りの通信（インバウンドトラフィックに対する応答のアウトバウンドトラフィック、アウトバウンドトラフィックに対する応答のインバウンドトラフィック）は、行きの通信が許可されている限り自動的に許可

## Azureで既定ではVnet内は明示的許可にならない
NSGを作成するときに気づいた点。
既定セキュリティ規則で
受信: AllowVnetInBound
送信: AllowVnetOutBound
が有効になっている。[※1](https://learn.microsoft.com/ja-jp/azure/virtual-network/network-security-groups-overview)

これにより、同じVirtualNetworkからの通信は許可されてしまうため、「明示的許可」をしたい、つまり他のものを拒否したい場合、拒否のルールをより上位に設定する必要がある

AWSではSGがホワイトリスト形式なのでAzureのように許可されてしまうことはない
【基本情報技術者】公開鍵暗号方式とか共通鍵暗号方式とか

なぜこんなにややこしくなってしまうのか

自分なりにまとめます。（図とか画は無いのでごめんなさい…）

## 公開鍵暗号方式
**公開鍵と暗号鍵の二つを使う方式**

送信者は受信者の公開鍵で平文を暗号化し、受信者は自身の秘密鍵で複合化する。

この方法では<font color=red>**受信者が秘密鍵から生成した公開鍵**</font>を公開しておくことが必要。
　
１．受信者が秘密鍵から公開鍵を作成し送信者に渡す **（鍵を公開する）**
２．送信者が、その**公開鍵を使って**通信内容を暗号化する
３．暗号化された文書を受信者が受け取る
４．受信者が秘密鍵を用いて復号し中身を確認する

### メリット
* 鍵の管理が楽（鍵を公開しているので）
* 秘密鍵を盗まれる心配が少ない（安全性が高い）

### デメリット
+ 処理速度がめっちゃ遅い（秘密鍵を共有せず、暗号化と復号が複雑になるため時間が掛かる。）

主な規格
**RSA**　
　
こう見ると結構有能？個人的にはこっちの方が安全でええやん！と思ってしまいます。

　
## 共通鍵暗号方式
**送信者と受信者が同じ鍵で暗号化や復号を行う暗号方式**
**<font color=red>「秘密鍵暗号方式」</font>とも言う。**

とも言わないでほしかった…ややこしい…。

この方法では、事前に情報をやりとりする相手と**共通鍵を共有しておく**必要がある。

１．送信者が秘密鍵から共通鍵を作成し受信者に渡す **（鍵の共有）**
２．送信者が、共通鍵を使って通信内容を暗号化する
３．暗号化された文書を受信者が受け取る
４．受信者が共通鍵を用いて復号し中身を確認する
　
秘密鍵≒共通鍵みたいなところありますよね。ややこい。

### メリット
* 処理が爆速

### デメリット
* 秘密鍵を盗まれる心配がある
* 鍵の管理が大変
* 鍵が盗まれる恐れがある


主な規格
**AES、DES**

　
こんな感じでしょうか。
これは基本情報の問題解いていったら分かってきたり沼にハマったりするので図解が一番望ましいですね。

[基本情報技術者平成25年春期 午前問39](https://www.fe-siken.com/kakomon/25_haru/q39.html "午前問39")

> **Xさんは，Yさんにインターネットを使って電子メールを送ろうとしている。電子メールの内容を秘密にする必要があるので，公開鍵暗号方式を使って暗号化して送信したい。電子メールの内容を暗号化するのに使用する鍵はどれか。**
> **ア**　Xさんの公開鍵
> **イ**　Xさんの秘密鍵
> **ウ**　Yさんの公開鍵
> **エ**　Yさんの秘密鍵

<br><br><br>

正解は**ウ**

公開鍵暗号方式の流れ
１．受信者が秘密鍵から公開鍵を作成し送信者に渡す **（鍵を公開する）**
２．送信者が、その**公開鍵を使って**通信内容を暗号化する
３．暗号化された文書を受信者が受け取る
４．受信者が秘密鍵を用いて復号し中身を確認する
- - -

[基本情報技術者平成24年春期 午前問41](https://www.fe-siken.com/kakomon/24_haru/q41.html "午前問41")
>**文書の内容を秘匿して送受信する場合の公開鍵暗号方式における鍵と暗号化アルゴリズムの取扱いのうち，適切なものはどれか。**

> **ア**　暗号化鍵と復号鍵は公開するが，暗号化アルゴリズムは秘密にしなければならない。
**イ**　暗号化鍵は公開するが，復号鍵と暗号化アルゴリズムは秘密にしなければならない。
**ウ**　暗号化鍵と暗号化アルゴリズムは公開するが，復号鍵は秘密にしなければならない。
**エ**　復号鍵と暗号化アルゴリズムは公開するが，暗号化鍵は秘密にしなければならない。

<br><br><br>
正解は**ウ**

> 解説
公開鍵暗号方式は、暗号化と復号に異なる鍵を使用する暗号方式です。暗号化鍵は誰もが使用できるように公開し(公開鍵)、復号鍵は受信者が厳重に管理します(秘密鍵)。
暗号化鍵と復号鍵は一対のペアとして生成され、1つの暗号化鍵で暗号化されたデータは、その鍵のペアである復号鍵でしか元のデータに戻せないため、復号を行えるのは正当な受信者のみであることが保証されています。
暗号化アルゴリズムには大きな数の素因数分解が困難なことを利用したRSA、離散対数問題を利用したエルガマル暗号などがあり、これらのアルゴリズムは広く公開されています。
したがって公開するのは暗号化鍵とアルゴリズム，秘密にするのは復号鍵になります。


ということです。科目Bの情報セキュリティで出るから困るよね。
何回解いても最初はこんがらがる。練習あるのみ。
アンケート招待リンクを含むQRコードを共有する


+ [アンケート招待リンクを含むQRコードを共有する](https://help.salesforce.com/s/articleView?id=sf.task_qr_code.htm&type=5)
+ [Share Survey Invitations Using QR Codes](https://help.salesforce.com/s/articleView?id=release-notes.rn_general_survey_qr_code.htm&release=226&type=5)

# 機能してないみたい

+ [I've set up a Salesforce Survey in my Trailhead Playground org but the QR Code invitation from the survey does not work. When I download it and try to scan it with any scan app on my mobile, it does not open](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007epy6HSAQ)

+ [Salesforce Surveys の QR コード ジェネレーターで問題が発生しています。QR コードを生成できるのですが、どれも機能せず、コードが密集しすぎていてスキャンできないという問題が発生しています。ズームインしたり、別の形式で保存したり、Android や Apple を試したりと、さまざまなことを試しましたが、スキャンされません。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007NCw9HSAT)

# 既知の問題

+ [Download QR Code is not working](https://issues.salesforce.com/issue/a028c00000gAyZ6AAK/download-qr-code-is-not-working)

# SalesforceでのQR コード

+ [Salesforce での QR コードの活用](https://haidernaseem.medium.com/utilizing-qr-codes-in-salesforce-6cbde0d1abc0)
+ [QRコードの構文](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A8iGWSAZ)
Asteriskで外線接続しようとしたが、簡単に手をだせなくなっていた

## 概要
- タイトルの通りであるが、外線接続を試そうとしたところ簡単に手が出せなくなっている、、

## 流れ
Asteriskで簡単な内線を構築できるようになったので、せっかくなので外線番号をSIPトランクを利用して付与して、普通の電話⇔内線ができるように構築しようと考えた。

適当に調べたところ、すぐに参考サイトが見つかったので比較的容易に実施できるかに思われたが、参考サイトで利用しているサービスが日本では終了していた、、、

**参考サイト：**

https://qiita.com/sgrowd/items/dd1fc682718a2a623e4c

**終了を伝える悲しいお知らせ：**

https://kwcplus.kddi-web.com/notice/termination-of-serviceprovision

そこで、改めて調べたところ

AWSのほうにSIPトランクを実装できる機能があるようであった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/0a190369-70ac-66e1-5ddb-e577dcf9c124.png)

ただ実際に実装に移そうとすると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/4775a1ab-0f68-3802-3bdc-091817222c6c.png)

といったエラーが解決できなかった

一応Twilioのほうで、700円ぐらいで日本の電話番号が売っているので試そうと思えば試せるが、完全に興味本位でやるには少し躊躇してしまう金額である

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/a26b0884-e230-f7c0-8aac-9e846f0177d6.png)

ほかの方法を探しつつ、方法がない場合は1食我慢して試してみようと思う
⇒試して動いた場合に満足してしまうので、3分の電話に700円はすこし高い、、、
データエンジニアとしてできるセキュリティ対策を考えてみた

## はじめに

2024年6月9日、株式会社KADOKAWAが、複数のWebサイトで利用できない事象が発生し、外部からの不正なアクセスの可能性が高いと公表しました。6月14日の公式発表では、ランサムウェアを含む大規模なサイバー攻撃であることが確認されました。この攻撃により、サービスが一時停止し、データセンターのサーバの物理的なシャットダウンが必要となるほどの被害が発生しました。

このようなサイバー攻撃は、デジタルトランスフォーメーション（DX）、リモートワーク、クラウドシフトの進行に伴い増加しています。ここでは、データエンジニアとして実践すべき具体的なセキュリティ対策について解説します。

## サイバー攻撃の種類と対策

### ランサムウェア

ランサムウェアは、コンピュータをロックしたり、ファイルを暗号化したりして使用不能にし、元に戻すための身代金を要求するマルウェアです。例えば、角川のケースでは、ランサムウェアがデータセンター内のサーバに感染し、サービスの大規模な停止を引き起こしました。

### 対策

- **定期的なデータバックアップ**: 定期的にデータをバックアップし、オフラインで保管することで、攻撃を受けても迅速に復旧できます。
- **セキュリティパッチの適用**: ソフトウェアやシステムの脆弱性を修正するパッチを迅速に適用することで、感染リスクを減らします。
- **従業員の教育**: フィッシングメールなどの社会工学的手法に対する警戒心を高めるためのトレーニングを行います。

## DDoS攻撃

DDoS (Distributed Denial of Service) 攻撃は、Webサーバに大量の通信を発生させ、サービスの提供を妨害する攻撃です。これにより、サービスが一時的に利用不能になります。

### 対策

- **Webアプリケーションファイアウォール（WAF）の導入**: WAFを使用して、不正なトラフィックをブロックします。
- **セキュリティグループの設定**: クラウド環境では、セキュリティグループを適切に設定し、不要なポートを閉じることで攻撃を防ぎます。
- **トラフィックモニタリング**: 異常なトラフィックを検知するためのモニタリングツールを導入し、早期に対策を講じます。

## 情報漏洩の防止策
サービスアカウントやCLI情報が漏洩すると、攻撃者に悪用されるリスクが高まります。以下の対策を講じることで、情報漏洩を防ぐことができます。

### 環境変数を使用する
環境変数を使用して、APIキーや認証情報を管理することが重要です。これにより、ソースコードに直接認証情報を記載するリスクを避けられます。

```bash
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/credentials.json"
```
### シークレットマネージャーの活用
Google CloudのSecret ManagerやAWSのSecrets Managerを活用し、機密情報を安全に管理します。

### IAMポリシーの最小権限原則の適用
IAMポリシーを設定する際は、最小権限の原則に従い、必要最低限の権限のみを付与します。これにより、不必要な権限が付与されるリスクを減らします。

### データセット単位でのアクセス制限
データセットのアクセス制限を適切に設定することも重要です。特に、機密性の高いデータについては、アクセス制御リスト（ACL）やIAMロールを利用してアクセスを制限します。

**IAMロールとポリシーの設定**:
特定のデータセットに対してアクセスできるユーザーやサービスアカウントを明確に定義します。
**アクセスログの監視**: 
誰がいつどのデータにアクセスしたかを記録し、異常なアクセスパターンを検知します。
**データの暗号化**: 
重要なデータは保存時および転送時に暗号化し、アクセス権を持つユーザーのみが復号できるようにします。
### データ損失防止（DLP）の導入
DLP（Data Loss Prevention）ツールを導入することで、機密データの不正な転送やコピーを防ぎます。DLPツールは、データの分類と監視を行い、不正な動きを検知して自動的にアラートを発します。

### データクリーンルームの活用
データクリーンルームは、異なる組織が共有するデータを安全に分析するための環境を提供します。これにより、個々のデータが外部に漏れるリスクを最小限に抑えつつ、共同でのデータ分析が可能となります。

## GitHub Actionsを使用する際の注意点
GitHub ActionsはCI/CDパイプラインを自動化する強力なツールですが、適切に設定しないとセキュリティリスクが生じます。

### シークレットをGitHubリポジトリの設定で管理する
GitHubのリポジトリ設定でシークレットを管理し、ワークフローで環境変数として使用することで、機密情報の漏洩を防ぎます。

```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
    - name: Set up environment
      run: echo "MY_SECRET=${{ secrets.MY_SECRET }}" >> $GITHUB_ENV
```
### サードパーティのアクションの使用に注意する
サードパーティのアクションを使用する際は、そのソースコードを確認し、信頼できるものかを判断することが重要です。

### ワークフローのトリガーに注意する
ワークフローが予期しないイベントでトリガーされないように、トリガー条件を慎重に設定します。例えば、pull_requestイベントで機密情報が漏洩する可能性があるため、注意が必要です。

```yaml
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
```
## まとめ
サイバー攻撃の脅威は日々進化しており、データエンジニアとしてもセキュリティ対策を徹底することが重要です。ランサムウェアやDDoS攻撃への対策、情報漏洩防止のためのベストプラクティス、データセット単位でのアクセス制限、DLPの導入、データクリーンルームの活用など、具体的な対策を実践することで、安全なシステム運用を実現しましょう。
OpenSSHの脆弱性(CVE-2024-6387)にAmazon Linux 2023でアップデート対応する

個人メモ

# 概要
OpenSSHで脆弱性(CVE-2024-6387)のアナウンスがあった。
Amazon Linux 2023で利用しているOpenSSHも脆弱性の対象に該当しているためアップデート対応を行った。

https://explore.alas.aws.amazon.com/CVE-2024-6387.html

https://alas.aws.amazon.com/AL2023/ALAS-2024-649.html

# 現状確認
```
# Amazon Linux 2023 のバージョンを確認
cat /etc/os-release

# OpenSSHのバージョンを確認
rpm -qa | grep openssh

openssh-server-8.7p1-8.amzn2023.0.9.x86_64
openssh-8.7p1-8.amzn2023.0.9.x86_64
openssh-clients-8.7p1-8.amzn2023.0.9.x86_64
```

# 対応
```
# 修正パッチ適用(バージョンアップデート)
sudo dnf update openssh --releasever 2023.5.20240701
```

# 確認
```
# OpenSSHのバージョンが想定通りに更新されたことを確認
rpm -qa | grep openssh

openssh-8.7p1-8.amzn2023.0.11.x86_64
openssh-clients-8.7p1-8.amzn2023.0.11.x86_64
openssh-server-8.7p1-8.amzn2023.0.11.x86_64
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269537/e6261321-b7f3-1e8b-3e4c-c3cbce56df23.png)
PNGにメタデータを埋め込む

PNG 画像に文字列データを埋め込み、また、そこから文字列データを読み取ります。

メタデータの収容エリアには `tEXt` チャンクを使います。JPEG なら Exif あるいはヘッダコメントに相当するものです。

処理は、Python の画像処理ライブラリ [Pillow/PIL](https://pillow.readthedocs.io/) から行います。

<img src="https://pillow.readthedocs.io/en/stable/_static/pillow-logo-dark-text.png">


##### PNGファイルを読む

まず PNG ファイルを読みます。Pillow で画像ファイルを開くには `PIL.Image.open()` です。

```python
>>> from PIL import Image
>>> img = Image.open('240704-qrcode.png')
```

##### メタデータを用意する

PNG メタデータの操作には [`PIL.PngImagePlugin.PngInfo`](https://pillow.readthedocs.io/en/stable/PIL.html) クラスを使います。インスタンス化したら、`.add_text()` メソッドからデータのキーと値を追加します。

```python
>>> from PIL.PngImagePlugin import PngInfo
>>> metadata = PngInfo()
>>> metadata.add_text('url',
 'https://www.amazon.co.jp/Python-Pillow-PIL-%E8%B1%8A%E6%B2%A2%E8%81%A1/dp/4877835253')
```

##### メタデータ込みで画像ファイルを保存する

保存には、`PIL.Image.save()`です。画像フォーマットはファイル名の拡張子から自動的に決定されます。保存時に `pnginfo`キーワード引数を使ってメタデータを指定するところがポイントです。

```python
>>> img.save('new.png', pnginfo=metadata)
```

##### ファイルからメタデータを読む

メタデータを読むには、Pillow/PIL で開いて、`text`属性を読むだけです。

```python
>>> img_new = Image.open('new.png')
>>> img_new.text
{'url':
 'https://www.amazon.co.jp/Python-Pillow-PIL-%E8%B1%8A%E6%B2%A2%E8%81%A1/dp/4877835253'}
```

##### おまけ

Pillow が読める画像フォーマットは Pillow ドキュメントの [Handbook > Appendices > Image file formats](https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html) に示されています。

プログラム的に調べるなら、`PIL.Image.OPEN` 辞書に収容されています。ただし、先に `Image.init()` をかけないと用意されません。

```python
>>> Image.init()
1
>>> Image.OPEN.keys()
dict_keys(['PNG', 'BMP', 'DIB', 'GIF', 'JPEG', 'PPM', 'BLP', 'BUFR', 'CUR', 'PCX',
  'DCX', 'DDS', 'EPS', 'FITS', 'FLI', 'FTEX', 'GBR', 'GRIB', 'HDF5', 'JPEG2000',
  'ICNS', 'ICO', 'IM', 'IMT', 'IPTC', 'MCIDAS', 'MPEG', 'TIFF', 'MSP', 'PCD',
  'PIXAR', 'PSD', 'QOI', 'SGI', 'SPIDER', 'SUN', 'TGA', 'WEBP', 'WMF', 'XBM',
  'XPM', 'XVTHUMB'])
```


##### おわりに

URL を収容した QR コードを（Python `qrcode` で）作成していたのですが、コード自体は読まずにもとの URL をチェックできる方法を探していて、この方法に行きつきました。

![new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2712175/cd6d70ef-e708-461a-4030-aa700de840b8.png)

Pillow/PIL は使い込んだつもりでしたが、`PngInfo` を使ったのは実は今日が初めてです。まだまだ修行が足りていないようです。約2年前（2022年9月）に書いた Pillow/PIL の教本では JPEG の品質パラメータ、GIF/WebPのアニメーション関連パラメータは紹介しましたが、そこまでは手が回りませんでした。ここで、追加させてもらった次第です。

ご購入はこちらから【 [出版社](https://www.cutt.co.jp/book/978-4-87783-525-5.html) | [ヨドバシカメラ](https://www.yodobashi.com/product/100000009003620044/) | [楽天ブックス](https://books.rakuten.co.jp/rb/17274403/) | [amazon.co.jp](https://www.amazon.co.jp/dp/4877835253) 】。

<img src="https://www.cutt.co.jp/book/images/978-4-87783-525-5.png" width="200" alt="表紙"></img>
dWi-FiのSSID「docomo0000」に接続できないときの対処メモ

# dWi-Fiとは

dWi-Fiはドコモが提供する公衆Wi-Fiサービスで、docomoのケータイを持っていなくとも、dアカウントに登録することで使用することができます。スターバークスやタリーズ、モスバーガーなどに多く導入されているので、カフェで勉強や調べ物をするときに重宝していました。

# 症状

そんな便利なWi-Fiですが、スマホでは便利に利用できるものの、Windows11のPCで利用できず、困りました。症状としてはWi-FiのSSID/パスワード認証には成功するものの、その後dWi-Fiへのログイン画面に遷移できず、いわゆる「インターネットアクセスなし」でした。

* ブラウザを開き、`https://wlan.m-zone.jp/`を直打ちしてもNGでした
* コマンドプロンプトを開き、`ping 8.8.8.8`を実行すると成功しました

したがって、DNSサーバーの設定が適切に行われていないと思われます。

# 結論

私のWindows11のPCではDNSサーバーの設定がプライマリ8.8.4.4、セカンダリ8.8.8.8といういわゆるGoogleのパブリックDNSサーバーのIPアドレスになっていました。
これをプライマリ220.159.212.200、セカンダリ220.159.212.201に設定すると、上記の`https://wlan.m-zone.jp/`にアクセスできるようになり、ログイン認証後、インターネットを利用することができました！
応用情報技術者試験に合格しました

# はじめに
2024年春の応用情報技術者試験を受験し、合格しました！

![1000007558.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/768789/8ed35f92-3bcc-770e-1780-c39a9c7965b4.png)


勉強内容等やったことを記載します。

# 勉強期間について
試験本番の2.5ヶ月前頃から勉強し始めました。
ただ体調を崩していたので、実質的な勉強期間としては1.5ヶ月程度と思われます(勉強時間はわかりません)。

# 午前について
過去問道場のみやりました。

https://www.ap-siken.com/apkakomon.php

まず直近2回を除く過去6回分の過去問を解きました。
隙間時間やまとまった時間を問わず、時間は測らずに行いました。

その後最後の確認として、過去10回分からランダム出題で模擬試験を3回行いました。
模擬試験は150分時間を測って行いました。

3回行なった模擬試験で8割程度点数が取れたので、ひとまず良しとしました。
時間に余裕があれば、8〜9割程度安定して取れるまで行なった方が安心出来るかもしれません。

問題は全て正解出来るまで解きました。
過去問道場は今回の勉強期間中に合計1000問以上解いていました。


# 午後について
重点対策のテキストを1周のみやりました。

https://amzn.asia/d/dXi1AKo

分野は以下5分野に絞って対策しました。
- アルゴリズム
- 情報システム開発
- 組込みシステム開発
- ネットワーク
- データベース

対策する分野選びについては、全分野の過去問を2問程度ずつ解いてみて点が取りやすかった分野を選びました。

絞った分野から、試験本番でどの4分野を選択するかについては、以下の方針を設定して選択しました。
- このテーマや出題なら選ぶ/避ける
- 分野選択に優先順位をつけて、判断に迷った場合は優先度順に選ぶ

実際の試験ではデータベース以外の4分野を選択しました。

:::note info
時間に余裕があるなら6〜7分野に絞って対策した方が安心出来ると思われます。

というのも難易度の高い問題が出た場合や、苦手なタイプの問題が来た場合に他の分野を選択出来るようにするためです。
:::

### 時間配分について
試験時間は150分なので、以下を目安に取り組みました。
- 最初の5～10分で分野選択
- 1分野あたり25分程度で解く(5×25分=125分)
- 残りの15～20分で見直し

### テキストの演習問題について
各分野1問を残して解きました。
各問題をそれぞれ解く際は25分時間を測って解きました。

その後最後の確認として、残した1問を全て通しで模擬試験として解きました。
模擬試験は情報セキュリティ+4分野で150分時間を測って解きました。
私の場合5分野に絞っていたので、残りの1分野はそのすぐ後に25分時間を測って解きました。

# おわりに
参考になりましたら幸いです。

# 参考記事

https://kotori-blog.com/qualification/ap-shiken/

https://qiita.com/drken/items/42e54d5c43d4d7815ed4

https://qiita.com/nemoken0827/items/cd7b4f035969838128e2

https://qiita.com/deuteridayo/items/1c19413a01beec0663a3

https://qiita.com/c60evaporator/items/0bbda34eead71c9e38d9

https://zenn.dev/toaru_fe/articles/3dc0b1f674defd
Kaggle AIMO参戦記 - 対話型数学学習を目指したLLM推論プロセス可視化アプリ開発

# はじめに

この記事は、大規模言語モデル **Gemini 1.5 Pro** を用いて執筆しました。生成してもらった文章をベースに加筆・修正しています。

近年、AI技術、特に大規模言語モデル（LLM）の発展は目覚ましく、様々な分野で注目を集めています。特に教育分野においては、AIによる個別最適化学習や、学習者の理解度に合わせた柔軟な対応などが期待されています。

私は、以前から **「学習者がAIとの対話を通じて、自身の思考プロセスを深掘りできるようなシステム」** の構築を構想してきました。LLMの登場により、その実現可能性が飛躍的に高まったと感じています。その可能性を探るため、そして構想を実現に近づけるために、Kaggleで開催されたAI Math Olympiad (AIMO) コンペティションに挑戦しました。

本記事では、AIMOコンペティションへの挑戦をきっかけに、**数学特化LLMを用いた対話型数学学習システム**の開発を目指し、その第一歩として**LLMの推論プロセスを可視化するWebアプリケーション**を開発した過程を紹介します。

# 2. AIMOコンペティションと対話型学習システム構想

AIMOは、世界中のAI研究者・エンジニアが、数学問題を解くAIの開発を競い合うコンペティションです。高度な数学的思考力と自然言語理解・推論能力が求められ、AI技術の最先端に触れることができる魅力的なコンペティションです。

AIMOコンペティションでは、例えば「Find the units digit of  \( 7^{100} \).」といった問題が出題されました。LLMは、このような問題に対して、解答だけでなく、その思考プロセスも出力することができます。

しかし、現状のLLMは完璧ではありません。問題によっては、解答が間違っていたり、思考プロセスが機械的で、人間には理解しにくい場合も少なくありません。

# 3. システム設計と実装 

現段階では、ユーザーが数学の問題文を入力すると、LLMを用いて解答を生成し、その推論プロセスを可視化するシンプルな構成となっています。Streamlitアプリケーション内でPythonコードとしてLLMを呼び出し、結果を表示しています。

## 3.1 システム概要図

```
     ユーザー        
       |                  
       | 問題文入力           
       ▼                  
  +-------------+ 
  |  Web UI     | (Streamlit) <--- PythonコードでLLM実行
  +-------------+
       |
       |  推論プロセス  |
       |      表示      |
       ▼
       | 回答
       |
       ▼
     ユーザー
```

## 3.2 AIモデル

* **DeepSeek AIの数学特化LLM** 
    * 本システムでは、高度な数学的問題解決能力を持つ[DeepSeek AI](https://deepseek.ai/)が提供する数学特化LLMを採用しました。（具体的なモデル名があれば追記）
    * このLLMは、 大規模な数学の問題と解答のデータセットで学習されており、複雑な計算や証明問題に対しても、人間に近いレベルで解答を生成することが可能です。

* **推論プロセスの可視化** 
    * DeepSeek AIの公開コードを参考に、LLMの推論プロセスを段階的に表示する機能を実装しました。
    * これにより、ユーザーはLLMが問題をどのように解釈し、どのような論理展開で解答に至ったのかを把握することができます。


## 3.3 Webアプリケーション

* **StreamlitによるUI構築** 
    * ユーザーインターフェースには、PythonのWebフレームワークである[Streamlit](https://streamlit.io/)を採用しました。
    * Streamlitは、シンプルな記述でインタラクティブなWebアプリケーションを構築できるため、開発効率の向上に貢献しました。
* **LLMの実行と表示**
    * ユーザーがWeb UIに入力した問題文を受け取り、Pythonコード内でLLMの処理を実行します。
    * LLMの処理結果である解答と推論プロセスは、Streamlitの機能を用いてWeb UI上に表示します。 

# 4. 使用例
今回は上手くいった例を示します。

![メモリの表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/6cf8f8e1-c90c-8a80-138a-9d266a5414d2.png)

![問題文と条件のインプット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/03d2f8ed-a45f-97d5-fbdf-93d43cb0d8a7.png)

![アウトプット1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/6ee41c7e-aae6-b379-6b38-18250ae8223e.png)

![アウトプット2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/43a1574d-b9ac-bf17-9f1f-e8c5ec8ae5fd.png)

# 5.  今後の展望: 対話型数学学習システムの実現に向けて

今回は、時間的制約もあり、Webアプリケーションとしての公開には至りませんでしたが、ローカル環境での動作確認を行い、LLMの推論プロセスを可視化できることを確認しました。

今後は、このシステムをベースに、以下のような機能追加や改良を進め、対話型数学学習システムの実現を目指します。

* **LLMとの対話機能**: ユーザーが入力した問題に対して、LLMが段階的に質問を投げかけ、ユーザーの理解を深めながら解答に導く対話形式の実装
* **ユーザーモデルの構築**: ユーザーの解答履歴や思考プロセスを分析し、個々の理解度や得意・不得意分野を学習するユーザーモデルの導入
* **説明生成機能の強化**:  LLMの推論プロセスを、より人間にとって理解しやすい形で可視化する説明生成機能の強化
* **UI/UXの向上**:  ユーザーがより直感的に操作でき、学習効果を高めるためのUI/UXの改善


# 5.  まとめ

本記事では、Kaggle AIMOコンペティションをきっかけに、対話型数学学習システムの開発を目指し、LLMの推論プロセスを可視化するWebアプリケーションを開発した過程を紹介しました。

本アプリは、まだ発展途上ではありますが、LLMの教育分野への応用は大きな可能性を秘めていると信じています。今後も開発を継続し、学習者にとって真に役に立つシステムの実現を目指します。
プラスアドレッシングについて

# AWSのアカウント閉鎖…
プロジェクトで全くAWSを触る機会がなく、久々に勉強がてらAWSのアカウントにログインしようとすると、クレカの有効期限が切れており、アカウントが閉鎖されていた。
同じメールアドレスで登録しようもログインしようにも閉鎖されているがアカウントはアドレスに連携されているためにどちらの対応もできない。（そもそもそこまで気づかないのが問題なのですが…）

# 解決方法
[サブアドレスで解決](https://docs.aws.amazon.com/signin/latest/userguide/troubleshooting-sign-in-issues.html#troubleshoot-cannot-create-new-acc)。
プラスアドレッシングというメール自体の機能を使い解決。

# プラスアドレッシングとは？
メールアドレスは以下のように構成されている。
`local-part@domain`
- local-part: メールアドレスの@より前の部分
- domain: メールアドレスの@より後の部分

プラスアドレッシングでは、この`local-part`にプラス記号（`+(任意の文字列)`）を追加することができる。

例えば、 `email@example.com`というメールアドレスがある場合、以下のように変更できる。
`email+something@example.com`
もちろんプラス記号だけでも大丈夫です。
`email+@example.com`

# メールの処理
メールの送信：メールが`email+something@example.com`に送信されると、メールサーバーは `local-part`のプラス記号以降の部分も無視する。
メールの受信：メールサーバーは、`email@example.com`としてメールを処理し、受信者のメールボックスに配信。

# 注意点
すべてのメールサービスプロバイダーがプラスアドレッシングをサポートしているわけではない。GmailやYahooはサポートされている。また、一部のウェブサイトやサービスでは、プラス記号を含むメールアドレスを受け付けないように制限している場合もある。

# まとめ
技術だけでなく、こういったこと豆知識的なことを知れるのは好奇心が掻き立てられ良い経験になりました！当たり前に使ってるメールの機能自体作った人すごい…
また、めんどくさくてもきちんとメールは確認し、対応しなければならないことは後回しにしないことは大切だと再認識しましたorz
もし知らなかったという方は、ぜひ試しに自分のメールアドレスにプラス記号を加えてみて、メール送信をして試して見てください！
AWSってなに？な新卒が1カ月でSAAを合格した誰でも出来る勉強方法

## こんにちは
Qiita初投稿なためもろもろお許しを。。。

### 経緯
クラウドもオンプレミスも何の話をしているのかさっぱりな新卒だった。(今も新卒ですが)
会社のビジネス研修などを受けながら、どうやら知っておくとよさそう？と思い資格を取ることに。
全くの無知な新卒が土日もまともに勉強せず合間時間のみで合格出来たため、体験記として方法など記しておく。

### 合格まで
2024年4月に新卒として入社し、5/8にSAAを受ける事を決断
6/2をSAA試験日に決定
5/26にAWS CLF合格(716点)、6/2にSAA合格(777点)

## いますぐ試験日を決める
全ての資格や目標に言えるが、ゴールを決めないと人間やる気は起きない。
結局夏休みの最終日の宿題から私たちは抜け出せない。
だからこそ、脳みそ空っぽにして今決めるべき。

それほど難易度が高い資格ではない。
冷静に問題を読めば知識量が多少及ばずとも実は合格だけなら出来る。
とりあえず試験日を今確実に決める。
試験24時間前までキャンセルが間に合うので。
3週間以降の空いている土日にとりあえず入れてから考える。話はそれからだ。

## 最初に
SAAが不安ならおやつ感覚でCLFを受けよう。
AWSはなんでも合格すると次が半額になるクーポンが付いてくる。(多分)
CLFで16,500円　SAAで22,000円
どっちも受けると2種で(CLF合格すれば) 27,500円なため、SAA単体と比べて5,500円無駄になる。無駄にはなるが、学びにはなるため個人的にはお勧めしたい。今の理解度で行けんのか？実際の試験レベルってどんなもん？と思うならCLFを受けて腕試ししてみては。
私の場合は合格すれば会社からの支給があったのでルンルンで受けた。

## 最短での合格方法
[Ping-T](https://mondai.ping-t.com)
↑これ
とてつもない問題数を無料で公開している。
カテゴリやサービス別に選択可能かつ未出題やミスのみも選べる。
しかも説明が画像付きで詳細で分かりやすい。

～心が折れにくい学習順序～
1. まず最初は上の「AWSクラウドの基本」から順番に1分野ずつ進める。
なんとなく分かったかな、という状態でOK。
一番下の試験レベルはやらなくていい。

1. 全ての分野をとりあえず触ったら全選択(試験レベルは入れない)で問題を解いてみる。

1. 正答率が低そうな分野だけに絞って解く。

1. 【試験レベル】に挑戦


【試験レベル】は最初かなり難易度が高く感じると思うが、やり続ければ解けるように絶対になるので大丈夫。

とは言ってもどうすんの？となると思うので、理解を早める考え方をご紹介。

## 考え方
**自分ならクラウドサービスをどうやって作る？** を考えながら問題に挑む。

最初は一つも用語は分からないが、自分が作るならこの機能は付けるだろ、こんな名前にするだろ！と仮定を立てて考えられるだけ考えて選択肢を選ぶ。
頭で**イメージしたサービスとAWSのズレを直していく感覚**を最初から持っておくと理解が早いと思う。
試験当日でも絶対に分からない問題は出てくるので、その時に適当に選ばず考え抜く力も付けられて一石二鳥。

## 学習方法
"学習時間"は取らない。
というか取るだけのモチベがあるなら取った方がいい。
取れないし取りたくない。なんなら資格勉強の時間を取る気力もモチベも何も無くても受かるようにはなる。

全てのデバイスのブラウザで先程のサイトを開いた状態にして、暇があったらとりあえず一問解く。通勤で解く。トイレで解く。昼飯食べながら解く。飲み会の途中のトイレで解く。寝付けないなら解く。
今日の運試し～くらいの感覚でOK。脳に刷り込み続ける事を忘れずに。

とりあえず試行回数を増やしてサービスやその繋がりが分かるまで解き続ける。

隙間時間でやるが
**正解でも不正解でも解説はしっかり読む。**
よく分からないけど間違ってた。合ってた。という状態には絶対にせず、
覚えられなくてもその瞬間だけは納得か理解は出来た状態にする。
正解したとしても何故その選択肢が正しいかを正しく理解する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802238/6f1d3ef3-2a1f-a1ed-add1-7898fea8016f.png)
このくらいの問題数解けばかなり理解は深まっている。と思う。
というか受かった時の状態↑↑

## ズルをしよう
正直、受かるだけならいくらでもズルが出来る。
大体この文言の後はこのサービスだな、みたいなやつ。
しかし言い換えれば、
このサービスはこの状況で効果的であるという非常に実用的な考えでもあるため、正攻法とも言える。
下にいくつかチートシートとして書いてみるが、自分の中でテンプレを見つけられるとかなり正答率が上がる。
正確性は欠けるためご注意を。

### SAAチートシート例
（問題文）コスト掛けたくない　→　大体EC2系は違う
（サービス）画像認識、音声認識系　→　名前覚えるだけで正解できる
（選択肢）手動で　→　大体違う
（問題文）負荷に応じて自動で　→　Autoscale系かサーバーレス
（問題文）運用上のオーバーヘッド　→　大体Lambdaは違う（作成、維持の必要性から）
などなど

## まとめ
AWSはどんな考えでサービスを作っているのか。
AWSにどんなサービスがあり、それらにどんな利点があるのか。
ざっくりと理解するためには非常に良い資格である。
全く知らない状態から学習するため、最初は何も分からなくて当然だ。と楽しむ気持ちを持てば飽きずに突破出来ると思う。

合格だけを狙う場合正直蛇足になるが、無料で使える面白そうなサービスがたくさんあるので是非使ってみてほしい。
ポチポチでの設定を一回でもやってみると、イメージが付きやすいかもしれない。

現在私はSAPを取得しようとしているが、
SAAでのざっくり知識に肉付けがされている感覚で面白い。
合格したらまた体験記を記載するので是非。
それではまた会いましょう。
【ChatGPT＋DALL-E3】【Dream Machine】の動画編集の上で注意すべきこと。


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

　今回は、Code Interpreterで、動画編集の上で注意すべきことを書きます。特別なことはありません。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あしからず。
:::

　ニュースは
　　特にありません。

　さて、今回は、
　　動画編集の上で
　　　注意すべきことを書きます。

　perplexity（無料版）を
　　使って調べました。

　最初の質問以外は、
　　perplexityが関連する質問として
　　　出してくれたもので
　　　　続けています。　　
***
***user***
Code Interpreterで動画を編集する際の注意点は？

***perplexity***
Code Interpreterで動画を編集する際の注意点について説明します:

ファイルサイズの制限:
Code Interpreterにアップロードできるファイルサイズには制限があります。大容量の動画ファイルは処理できない可能性があります。

処理能力の限界:
複雑な編集や長時間の動画処理は、Code Interpreterの処理能力を超える可能性があります。シンプルな編集作業に留めるのが賢明です。

ライブラリの制約:
利用可能な動画編集ライブラリが限られている可能性があります。高度な編集機能は使えないかもしれません。

プライバシーとセキュリティ:
個人情報や機密情報を含む動画の編集は避けるべきです。アップロードしたファイルの管理には十分注意が必要です。

結果の確認:
AIが生成した編集結果は必ず人間が確認し、意図した通りの編集になっているか確認することが重要です。

これらの点に注意しながら、Code Interpreterの動画編集機能を活用することをお勧めします。
︙

***user***
Code Interpreterで動画を編集する際の具体的な注意点は

***perplexity***
Code Interpreterで動画を編集する際の具体的な注意点について説明します：

ファイルサイズの制限：
Code Interpreterにアップロードできる動画ファイルのサイズには制限があります。大容量の動画ファイルは処理できない可能性があるため、短い動画や低解像度の動画を使用することをお勧めします。

編集機能の制約：
Code Interpreterで利用できる動画編集機能は限られています。複雑な編集や特殊効果の追加は難しい場合があります。基本的な編集（テキスト追加、画像の切り替え、音楽の追加など）に留めるのが賢明です。

フォントの使用：
日本語テキストを追加する場合、適切な日本語フォントファイル（.ttf）を一緒にアップロードする必要があります。「Noto Sans Japanese」などの一般的なフォントを使用することをお勧めします。

処理時間：
動画編集には時間がかかる場合があります。特に長い動画や高解像度の動画を扱う際は、処理に時間がかかることを念頭に置いてください。

結果の確認：
生成された動画は必ず人間が確認し、意図した通りの編集になっているか確認することが重要です。特に、テキストの表示タイミングや画像の切り替えなどを細かく指定した場合は注意が必要です。

これらの点に注意しながら、Code Interpreterの動画編集機能を活用することで、簡単な動画編集タスクを効率的に行うことができます。
︙

***user***
Code Interpreterで動画を編集する際の最もよくある間違いは

***perplexity***
Code Interpreterで動画を編集する際の最もよくある間違いについて説明します：

ファイルサイズの制限を無視すること：
大容量の動画ファイルをアップロードしようとして失敗するケースが多いです。Code Interpreterには、アップロード可能なファイルサイズに制限があります。

複雑な編集を期待しすぎること：
Code Interpreterの動画編集機能は限定的です。高度な特殊効果や複雑な編集を要求すると、期待通りの結果が得られない可能性が高くなります。

インターネットアクセスを前提とした編集：
Code Interpreterはインターネットにアクセスできません。オンラインのリソースやデータを使用する編集作業は実行できません。

処理時間の見積もりミス：
動画編集には時間がかかることを考慮せず、即座に結果を期待してしまうことがあります。特に長い動画や高解像度の動画の場合、処理に時間がかかります。

日本語フォントの問題：
日本語テキストを追加する際、適切な日本語フォントファイルをアップロードしないと、文字化けや表示エラーが発生する可能性があります。

これらの間違いを避けることで、Code Interpreterを使った動画編集をより効果的に行うことができます。
︙

***user***
Code Interpreterで動画を編集する際の最も簡単な方法は

***perplexity***
Code Interpreterで動画を編集する最も簡単な方法について説明します：

短い動画ファイルを使用する：
処理時間を短縮し、エラーのリスクを減らすため、短い動画（30秒以内）を使用することをお勧めします。

基本的な編集に限定する：
テキストの追加、簡単なトリミング、音声の追加など、基本的な編集操作に限定します。複雑な効果や高度な編集は避けましょう。

明確な指示を与える：
「動画の最初の10秒にテキストを追加してください」など、具体的で明確な指示を与えることが重要です。

適切なライブラリを指定する：
「moviepyライブラリを使用して」などと指定することで、Code Interpreterが適切なツールを選択しやすくなります。

結果を確認する：
編集後の動画を必ず確認し、意図した通りの結果になっているか確認しましょう。

これらの方法を組み合わせることで、Code Interpreterを使った簡単な動画編集が可能になります。ただし、プロフェッショナルな編集ツールの代替にはならないことに注意してください。
***

　基本的なことかもしれませんが、
　　あちこち調べまわるのも
　　　大変な時間も掛かりますし、
　　　　情報が欠けていたり
　　　　　誤情報もあったりします。

　ChatGPTでは
　　自分で答えてしまうので、
　　　少し方向性がズレていく
　　　　場合もあります。

　まぁ、Googleでもなんでも
　　インターネットから情報を
　　　得ようとすれば、
　　　　誤情報も含まれますし、
　　　　　情報がバラバラでも
　　　　　　あります。

　それらを
　　まとめるには
　　　こうしたAIツールが
　　　　必要かと思います。

　あれ、
　　話がズレてしまいましたね😅

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

　今回は、ここまで。
PlantUMLの基本的な使い方とUMLモデリング例

## PlantUMLの概要

PlantUMLは、UML（統一モデリング言語）図をテキストベースで簡単に作成できるツールです。UML図を作成するためのシンプルな構文を使用し、視覚的に理解しやすい図を生成できます。以下に、PlantUMLの基本的な使い方と、架空のテーブルを用いた2つの簡単な例を紹介します。

[PlantUML公式サイト](https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000)

## PlantUMLの基本構文

PlantUMLの基本構文は以下のようになります：

```plaintext
@startuml
Bob -> Alice : hello
@enduml
```

この構文では、「Bob」から「Alice」へのメッセージ「hello」を示すシンプルなシーケンス図が生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/84763779-9a2e-4072-7858-c56b7f3fca90.png)

## スター・スキーマの例
スター・スキーマはデータウェアハウスにおける代表的なスキーマです。中心に配置された事実テーブル（Factテーブル）と、それを取り囲むように配置された複数の次元テーブル（Dimensionテーブル）から構成されます。事実テーブルには数値データが格納され、次元テーブルにはそれを説明するための詳細データが格納されます。

以下は、架空の販売データベースを用いたスター・スキーマのUML例です。
「*」 で主キーを表し、「＃」で外部キーを表しています。
```plaintext
@startuml
entity Fact_Sales {
  * sales_id : int
  # product_id : int　
  # customer_id : int
  # store_id : int
  # date_id : int
  + sales_amount : float
  + quantity_sold : int
}

entity Dimension_Product {
  * product_id : int
  + product_name : string
  + category : string
  + price : float
}

entity Dimension_Customer {
  * customer_id : int
  + customer_name : string
  + region : string
  + birthdate : date
}

entity Dimension_Store {
  * store_id : int
  + store_name : string
  + location : string
}

entity Dimension_Date {
  * date_id : int
  + date : date
  + month : string
  + year : int
}

Fact_Sales }-- Dimension_Product
Fact_Sales }-- Dimension_Customer
Fact_Sales }-- Dimension_Store
Fact_Sales }-- Dimension_Date
@enduml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/d6c443bd-a993-cac8-4a38-21c580b851eb.png)

## データボルトの例
データボルトは、データウェアハウスの設計手法の一つで、柔軟性とスケーラビリティを重視したモデルです。データボルトは、Hub、Link、Satelliteの3つの主要な構成要素から成り立ちます。

Hub: 主キー情報を保持し、ビジネスエンティティを識別します。
Link: Hub間のリレーションシップを保持します。
Satellite: HubやLinkに関連する属性情報を保持します。
以下は、架空の顧客管理データベースを用いたデータボルトのUML例です。
```plaintext
@startuml
entity Hub_Customer {
  * customer_id : int
  + customer_key : string
  + load_date : date
  + record_source : string
}

entity Hub_Product {
  * product_id : int
  + product_key : string
  + load_date : date
  + record_source : string
}

entity Link_Customer_Product {
  * link_id : int
  # customer_id : int
  # product_id : int
  + load_date : date
  + record_source : string
}

entity Satellite_Customer {
  * customer_id : int
  + customer_name : string
  + region : string
  + birthdate : date
  + load_date : date
  + record_source : string
}

entity Satellite_Product {
  * product_id : int
  + product_name : string
  + category : string
  + price : float
  + load_date : date
  + record_source : string
}

Hub_Customer }-- Link_Customer_Product
Hub_Product }-- Link_Customer_Product
Hub_Customer }-- Satellite_Customer
Hub_Product }-- Satellite_Product
@enduml
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/d2022af9-580d-473a-fae0-d606a6530464.png)

## まとめ

PlantUMLを使用すると、テキストベースで簡単にUML図を作成できます。この記事では、PlantUMLの基本的な使い方と、架空のテーブルを用いた2つのUMLモデリング例（スター・スキーマとデータボルト）を紹介しました。これらの例を参考にして、実際のプロジェクトでPlantUMLを活用してみてください。
【Android開発】Kotlin入門 Androidのディベロッパーガイドの分かりにくいところを書き直す#2

https://qiita.com/tiger98/items/3ea6229ddef9456e0b31

👆の続き

前回は[アプリの基礎](https://developer.android.com/guide/components/fundamentals?hl=ja#DeclaringComponents)の「コンポーネントを有効にする」の章までやったので、今日は「[マニフェスト ファイル](https://developer.android.com/guide/components/fundamentals?hl=ja#Manifest)」から

### 知らないこと
マニフェストファイル
コンポーネントを宣言する
コンポーネント機能を宣言する
インテント
アプリの要件を宣言する
アプリのリソース

#### マニフェストファイルとは
+ アプリの基本情報や構成を定義するためのXMLファイル
+ 主なタスクはアプリのコンポーネントをシステムに知らせること

#### コンポーネントを宣言するとは
+ アプリの構成要素（例えばアクティビティやサービス）をシステムに知らせるため、Androidのマニフェストファイル（AndroidManifest.xml）で定義すること
+ ソースに含まれているがマニフェストで宣言していないアクティビティ、サービス、コンテンツ プロバイダは、システムに表示されないため、実行できない

#### コンポーネント機能を宣言するとは
+ アプリのコンポーネント（例えばアクティビティやサービスなど）が特定のインテントにどのように応答するかを指定すること

#### インテントとは
+ インテントは、コンポーネントを有効にするための非同期メッセージのこと

#### アプリの要件を宣言するとは
+ アプリが正常に動作するために必要なハードウェア機能やソフトウェアバージョンを、マニフェストファイル（AndroidManifest.xml）で指定すること

#### アプリのリソースとは
+ アプリの機能やユーザーインターフェース（UI）に関連する非コード要素のこと
+ これには、画像、音声ファイル、アニメーション、メニュー、スタイル、色、レイアウト、UI文字列などが含まれる
+ これらのリソースは、ソースコードとは別に管理され、簡単に更新や翻訳が可能
robloxでassistant その120

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
スクリプトだけで、音楽を流せ。

# 手順
- ServerScriptServiceに、Scriptを追加。
- スクリプトを書く。
```


local song = Instance.new("Sound", workspace)
song.SoundId = "rbxassetid://5410086218"
song:Play()


```

以上。