OmniAICreator/Qiita-1.07M huggingface dataset:
新作のスマホゲーム名作―面白くて無料で遊べるGoogleゲームアプリ

近年、スマートフォンゲームの人気が急速に高まっています。特に、最近発売された名作ゲームは、その面白さと無料で遊べる点で注目されています。Google Playストアで提供されている新作ゲームアプリは、多くのユーザーにとって魅力的な選択肢となっています。本記事では、最新のスマホゲーム名作について探求し、その魅力に迫ります。![tro-choi-vui-nhon-mien-phi-avt-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031688/1280fab9-48b4-e538-a4df-bac388ef0d74.jpeg)

スマホゲーム 名作
スマートフォンゲームの世界は、多くの面白いゲームで溢れています。その中でも、特に名作と呼ばれる作品は、その面白さやクオリティの高さでプレイヤーを魅了しています。[スマホゲーム名作](https://newwave-solutions.co.jp/smartphone-game-masterpiece/)は、その名の通り、優れた作品であり、多くのユーザーから高い評価を受けています。これらの名作ゲームは、様々なジャンルやテーマで展開されており、プレイヤーに多様な体験を提供しています。
面白 ゲーム 無料         
[面白い無料ゲーム](https://newwave-solutions.co.jp/funny-games-free/)は、スマートフォンゲームの世界で魅力的な選択肢の一つです。これらの無料ゲームは、広告収入やアイテム課金などの収益モデルによって支えられていますが、基本的なゲームプレイは無料で提供されています。スマートフォンゲームを楽しむ際に、無料で遊べるゲームは、誰もが気軽にアクセスできるため、幅広い層に人気があります。また、さまざまなジャンルやコンセプトのゲームが提供されているため、自分の好みや興味に合ったゲームを見つけることができます。
Google ゲーム 無料
[Googleの無料ゲーム](https://newwave-solutions.co.jp/google-play-game/)も、スマートフォンユーザーに大変人気です。Google Playストアでは、様々なジャンルのゲームが無料で提供されており、ユーザーは自分の好みに合ったゲームを簡単に見つけることができます。これらの無料ゲームは、Googleのプラットフォームを通じて簡単にアクセスできるため、多くのプレイヤーにとって便利な選択肢となっています。
最近 発売 され た ゲーム
ゲーム市場は常に進化し続けており、[最近発売されたゲーム](https://newwave-solutions.co.jp/recently-released-games/)はその最新のトレンドや技術を反映しています。これらの最新のゲームは、その新鮮さや魅力によって多くの注目を集めています。プレイヤーは常に新しい体験を求めており、最近発売されたゲームはその期待に応えるものとなっています。
新作 ゲーム アプリ
[新作のゲームアプリ](https://newwave-solutions.co.jp/new-game-app/)は、スマートフォンゲーム市場において重要な位置を占めています。これらの新作ゲームアプリは、その革新的なゲームプレイや魅力的なストーリー、そして先進的なグラフィックスで多くのプレイヤーを引き付けています。スマートフォンユーザーは常に新しいゲームを楽しみたいと考えており、新作ゲームアプリはその要求に応えるものとなっています。
Newwave Solutions Japanと一緒にゲームアプリを開発
Newwave Solutions Japanは、スマートフォンゲーム業界で革新的なサービスを提供しています。当社のサービスは、スマホゲームの開発や運営に関する包括的なソリューションを提供しています。我々の専門家チームは、スマホゲームの制作から最適化、マーケティング戦略の策定まで幅広いサポートを行います。面白くて無料のゲームを提供するために、Google Playや他のプラットフォームで無料で公開されたゲームについても、我々は多くの経験を持っています。また、最近発売されたゲームのトレンドや市場動向を把握し、それに合わせて新作ゲームアプリを開発しています。Newwave Solutions Japanは、スマホゲームの世界での成功を支援するパートナーとして、常に最高のサービスを提供することをお約束します。
Python3.12でmatplotlibを日本語対応する

# はじめに
Python3.12でMatplotolibを使っていると、3.11以前まで使えていた`japanize_matplotlib`が使えず、日本語が◻︎◻︎のように表示されてしまいます。
この記事では、Python3.12でMatplotlibを使用した際の日本語対応について説明します。

# 解決方法
```python
import matplotlib_fontja
```
`japanize_matplotlib`の代わりに`matplotlib_fontja`というライブラリを使えば解決しました。
# 導入方法
https://github.com/ciffelia/matplotlib-fontja?tab=readme-ov-file#matplotlib-fontja

開発者のgithubです。こちらをご覧ください。
# 参考
https://github.com/uehara1414/japanize-matplotlib

https://github.com/ciffelia/matplotlib-fontja?tab=readme-ov-file#matplotlib-fontja
Webアプリ開発とC#アプリ開発：新しい時代のテクノロジー

最近、Webアプリ開発とC#アプリ開発は、テクノロジー業界で注目を集めています。これらの技術は、現代のデジタル世界で重要な役割を果たしており、多くの企業や個人がそれらを活用して革新的なプロジェクトを実現しています。ここでは、Webフレームワークを使用したWebアプリ開発とC#を使用したアプリ開発について掘り下げてみましょう。
Webアプリ開発の重要性
Webアプリケーションは、インターネットを介して利用できるアプリケーションです。[Webアプリ開発](https://newwave-solutions.co.jp/web-app-development-flow/)は、ユーザーがブラウザを介してアクセスできるウェブサイトやオンラインサービスを構築するプロセスです。この分野では、多くのプログラミング言語やフレームワークが利用されていますが、特に人気なのはJavaScriptやPythonなどです。Webフレームワークを使用することで、開発プロセスを効率化し、より堅牢でスケーラブルなアプリケーションを構築することができます。
C#アプリ開発の特徴
C#（Cシャープ）は、Microsoftが開発したプログラミング言語であり、主にWindowsアプリケーションの開発に使用されています。[C#アプリ開発](https://newwave-solutions.co.jp/c-web-app-development/)は、デスクトップアプリケーションやゲーム、さらにはモバイルアプリの開発にも活用されています。C#は.NETフレームワークをベースにしており、強力な機能や豊富なライブラリを提供しています。これにより、開発者は高度なアプリケーションを迅速に構築し、デプロイすることができます。
Webフレームワークの役割
[Webフレームワーク](https://newwave-solutions.co.jp/web-framework/)は、Webアプリケーション開発において重要な役割を果たしています。これらのフレームワークは、開発者がアプリケーションの機能を迅速に実装し、セキュリティやパフォーマンスの向上を図るのに役立ちます。代表的なWebフレームワークには、Django（Python）、Ruby on Rails（Ruby）、Express.js（JavaScript）などがあります。これらのフレームワークは、開発者がコードを再利用し、スケーラビリティを高めることができるため、多くの開発者に支持されています。
Webアプリ開発とC#アプリ開発は、現代のテクノロジー業界で重要な位置を占めています。Webフレームワークを使用したWebアプリ開発は、インターネットを介したさまざまなサービスを提供するための重要な手段です。一方、C#を使用したアプリ開発は、Windowsアプリケーションやゲームなどの幅広い用途で活用されています。どちらの技術も、効率的な開発プロセスと高品質なアプリケーションの構築を支援するための重要なツールです。

Newwave Solutions Japanと一緒にアプリを開発
Newwave Solutions Japanは、幅広いサービスを提供しています。我々の専門チームは、ウェブアプリ開発やC#アプリ開発を中心に、お客様のニーズに応じたソリューションを提供しています。また、Webフレームワークを活用して、高品質で効率的なアプリケーションの開発を行っています。
実はVSCodeにはpetが飼えるだって

# どういうこと？
タイトルの通り、たまたまこういう機能もあるんだ！って知って、試してみました。

# やり方
### ①拡張機能に「vscode-pet 」を検索し、インストールする

ただpetだけ入力すると、ほかにもいろいろ拡張機能がありますが、青いマークがついてるやつがより安全だと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/d716ce00-5faa-d5d2-036c-d89ebe23deb0.png)

### ②画面右下にペットアイコンがでて、それをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/db01f4ca-0540-30db-7ffb-2df236987e46.png)

### ③ペットを選ぶ
いろんなペットありますね～
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/3b51b979-8c7a-1e81-932f-a7eb8f096cd4.png)

さらに色や名前の決められるんだって

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/bc592d93-8f11-559f-2c21-5fe41ddd71ac.png)

### ④すると。。。
こんなことになりました！
しかも複数匹飼えるよ～

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/347e1b5c-10d5-f120-9aac-195469a8f758.png)

ネコだと、壁からジャンプするシーンもある～かわいい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/a4b482aa-dc05-8765-f249-0c7f857eef7b.png)

# 終わりに
ストレス発散として、面白い拡張機能を発見！
なんかも昔のwordみたいなペット機能だな
(個人的)便利ツール一覧


# 環境
windows 10 Home
22H2

# ツール一覧
## よく使う
| ツール名 | 機能 | 備考 |
| :--- | :--- | :--- |
| AutoHotkey | ショートカットキーの作成 | 移動キーを設定してます．使用率半端ない． |
| Microsoft PowerToys | ウィンドウの配置を変更 | ウィンドウを任意の配置にできます．他にも準レギュラーの機能が入ってます． |
| Tablacus Explorer | フォルダのタブ管理 | windows 11の人はいらないかも． |
| Visual Studio Code | コードエディタ | 有名なエディタ．拡張機能が優秀． |
| PDF-XChange Editor | PDFエディタ | Adobe Acrobat互換． |
| Everything | ファイルやフォルダの検索 | 検索結果が一瞬で出てきます．10のエクスプローラ遅すぎ． |
## たまに使う
| ツール名 | 機能 | 備考 |
| :--- | :--- | :--- |
| RunCat | 猫が走ります | CPUの使用率に合わせて猫が走ります． |
| Brave | AD blocker入りのブラウザ | 広告が減ります．広告が鬱陶しいページを見やすくします． |
| WizTree | ファイル整理 | 大きいファイルを視覚的に見つけることができます． |
| CrystalDiskInfo | ディスクの情報確認 | 劣化がある程度わかります． |

# 余談
ツールの整理も兼ねてやってます．
RestTemplate で Apache HttpClient を使用時に、Cookie rejected が出てしまう問題

## 私が直面したもの
JavaでWebアプリケーションを開発している際、RestTemplateを使用して外部のAPIへリクエストを送信するコードがありました。そのプロセス中、次のような警告メッセージがログに表示されました。
```
WARN 100 --- o.a.h.c.protocol.ResponseProcessCookies
Cookie rejected Illegal 'domain' attribute "〇〇.co.jp". Domain of origin: "xx.co.jp"
```
このメッセージは、レスポンスで返されたクッキーのdomain属性が、リクエストを送信したオリジンのドメインと異なるために拒否されたことを示しています。
この問題に対処しようと、RestTemplate および背後にある Apache HttpClient に関する公式ドキュメントやオンラインリソースを探しましたが、この特定の警告メッセージや、それに伴うクッキーの扱いについて明確に解説している資料は見つかりませんでした。

唯一見つかった参考資料は、[こちらのQiitaの記事](https://qiita.com/nakanoseiji/items/54129156479a0f069200) だけでした。そこで、この問題に直面する可能性がある他の開発者を助け、私のケースについての情報を共有するために、本記事を執筆することにしました。

## 環境
- OS：Windows 10
- Javaのバージョン：Oracle JDK 17
- フレームワーク：Spring Boot 2.6

**問題の HttpClient**
- org.apache.httpcomponents:httpclient:4.5

## 背景
サーバーが外部APIにリクエストを送信し、そのレスポンスを受け取るプロセス中に、レスポンスヘッダーから特定の値を抽出するロジックを実装しています。このプロセスを通じて、Spring.log に次のような警告ログが記録されることに気づきました。
```
WARN 100 --- o.a.h.c.protocol.ResponseProcessCookies
Cookie rejected Illegal 'domain' attribute "〇〇.co.jp". Domain of origin: "xx.co.jp"
```
このログは、レスポンスで返されたCookieが不正なdomain属性を持っており、それが原因でクッキーが拒否されたことを示しています。

## 原因
RestTemplate が内部的に使用している Apache HttpClient の挙動が重要な役割を果たしていることが分かりました。
Apache HttpClient は、デフォルト設定で特定の動作をします。

> この HttpClient、デフォルトの挙動では、通信先から Set-Cookie されたものを次のリクエスト時に Cookie ヘッダにセットして送ろうとします。（参考資料より抜粋）

このケースでは、RestTemplateがApache HttpClientを利用していることが、予期しない動作の原因となっていました。Apache HttpClientの特定の仕様が、この問題を引き起こしていたのです。

## 解決策
今回の箇所では、クライアントからのリクエストがサーバーに送信され、サーバーはこれを外部APIに転送しています。その際、外部APIからのレスポンスヘッダーがクライアントにCookieとして送り返されます。
このプロセスにおいて、サーバーは外部APIに対してCookieを送信する必要がありません。
したがって以下記載のように、ヘッダーにCookieを自動的に追加しない設定にすることで、問題を解決することができました。
```
HttpClientBuilder httpClientBuilder = HttpClients.custom().disableCookieManagement()
```
## 参考資料
https://qiita.com/nakanoseiji/items/54129156479a0f069200
<meta name="csrf-token" content="{{ csrf_token() }}">

## 問題
```layout.blade.php
<meta name="csrf-token" content="{{ csrf_token() }}">
```
これをheadに記載する理由がわからない

## 答え？
JavaScriptを使うときに、CSRFトークンを使えるようにするため？


## 参考
https://sota1235.hatenablog.com/entry/2015/10/11/213000
AmazonLinux2023にswap領域を追加する

# 概要
EC2インスタンスはメモリが増えるほど高価になるので、とりあえずswap領域を追加してしのぐ方法。

# 環境

- Amazon EC2
  - インスタンスタイプ：t3a.micro
  - メモリ：1GiB
- Amazon Linux 2023
  - OS：Amazon Linux 2023.4.20240401

# 手順
基本的には公式の情報通りやっていきます。

https://repost.aws/ja/knowledge-center/ec2-memory-swap-file

## 1. 容量の確認

`free`で現在のメモリ容量と`df`でディスク容量を確認します。

```console
$ free -h
               total        used        free      shared  buff/cache   available
Mem:           909Mi       666Mi        51Mi       3.0Mi       191Mi       117Mi
Swap:             0B          0B          0B

$ df -h
Filesystem        Size  Used Avail Use% Mounted on
devtmpfs          4.0M     0  4.0M   0% /dev
tmpfs             455M     0  455M   0% /dev/shm
tmpfs             182M  448K  182M   1% /run
/dev/nvme0n1p1     16G  2.3G   14G  15% /
tmpfs             455M  3.3M  452M   1% /tmp
/dev/nvme0n1p128   10M  1.3M  8.7M  13% /boot/efi
tmpfs              91M     0   91M   0% /run/user/1000
```

## 2. swapファイルの作成
swapファイルを作成します。RHEL9の情報を見るとRAMの容量が2GB以下の場合、推奨されるスワップ領域はRAM容量の2倍なので、1MB×2048=2GB追加します。

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/9/html/managing_storage_devices/recommended-system-swap-space_getting-started-with-swap

```console
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 15.2433 s, 141 MB/s
```

## 3. 権限変更とセットアップ

```console
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=6170d152-687a-4dce-9562-b46920ecc4c2
```

## 4. swapファイルを有効化する

```console
$ sudo swapon /swapfile
$ sudo swapon -s
Filename                                Type            Size            Used            Priority
/swapfile                               file            2097148         0               -2
```

## 5. 再起動してもswapファイルを自動で有効化

`/etc/fstab`の末尾に追記します。これをやらないと再起動時にswapfileが認識されなくなるのでお忘れなく。

```console
$ sudo vi /etc/fstab
/swapfile swap swap defaults 0 0
```

## 6. 確認

`free`でswapが2GB確保されていることを確認できます。ちなみに`df`で見るとディスクの使用量が2.3G→4.3Gになっていて2GB増えているのが確認できます。

```console
$ free -h
               total        used        free      shared  buff/cache   available
Mem:           909Mi       660Mi        56Mi       3.0Mi       191Mi       126Mi
Swap:          2.0Gi       0.0Ki       2.0Gi

$ df -h
Filesystem        Size  Used Avail Use% Mounted on
devtmpfs          4.0M     0  4.0M   0% /dev
tmpfs             455M     0  455M   0% /dev/shm
tmpfs             182M  448K  182M   1% /run
/dev/nvme0n1p1     16G  4.3G   12G  27% /
tmpfs             455M  3.3M  452M   1% /tmp
/dev/nvme0n1p128   10M  1.3M  8.7M  13% /boot/efi
tmpfs              91M     0   91M   0% /run/user/1000
```
時間の差分を分単位で求める方法

```vb
Dim startTime As Date
Dim endTime As Date
Dim diff As Date
Dim minutes As Long

' 開始時刻と終了時刻を設定
startTime = #6:00:00 PM#  ' 18:00:00
endTime = #4:00:00 PM#    ' 16:00:00

' 日をまたいでいるかどうかをチェック
If endTime < startTime Then
    ' 翌日の時間として計算
    diff = DateAdd("d", 1, endTime) - startTime
Else
    ' 同一日内の計算
    diff = endTime - startTime
End If

' 差分を分に変換
minutes = DateDiff("n", startTime, DateAdd("d", IIf(endTime < startTime, 1, 0), endTime))

' 結果を表示
Debug.Print "差分は " & minutes & " 分です。"
```
ButtonのOutlineまわりの色を変更したいよ！！！！！(アピアランスがSlateBrushとかいう名前で管理されてるっぽい話)

こんにちは、最近はUIばっかり作ろうとしている**にーあい**です。

皆さんは最近取り返しのつかないミスをしましたか？
ついさっき僕はガンプラのデカールを貼り間違えました。デカールの単品販売もなさそうです。

# ButtonのOutlineの色とかサイズを変えたい！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/74f97757-732b-0694-fba9-761235c83ebb.png)


このように、ButtonのOutlineはデザイナーからだとOutlineSettingsから簡単に編集できますよね。

しかし、いざBlueprintから編集しようとすると！！あれ！？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/b34600d6-4d5a-b0f4-ca15-5bc855a1e683.png)


**なんじゃこりゃ！！**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/61ca695e-0af2-e0fd-76dd-4c5393a11cee.png)

このノード、今回の目的であるButton本体のOutlineを操作してくれるやつではないようです(たぶん名前の通りFontとか文字だけ……？)。

# SlateBrushを使おう
完成系がこちらです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/e06cccaf-c25a-585a-8efa-d6709710bddf.png)


どうやらエディターのアピアランス→StyleはButtonStyleの名前で管理されており、さらに各状態(Normal,Hoveredなど)はSlateBrushと呼ばれているみたいです

つまり、Outlineだけ変えたい場合にはこのOutlineSettingsのみ新規で作り、他は全部もとのパラメーターを引っ張ってくればよいのです

この例だとTintも同じ色になるようにしています

# できた～～！


![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3754903/aed8548e-e91c-8640-569e-978b6fc162b2.gif)

# さいごに
今回は色だけを変えていますが、Widthなどのレイアウトもここからいじれます。ちょっと見つけにくかったねって話でした！

## X/Twitterも見てね！！！！！
→[X/Twitter(@2iStudio048)](https://twitter.com/2iStudio048)
個人開発】ゲーム風画像生成サイトの共有

皆さんこんにちは。最近作ったウェブサイトをシェアさせていただきます。https://facetomany.app/ 

Face to Many Appはps2フィルター用にデザインされた画像ジェネレーターで、ps2、絵文字、エモジ、ピクセルアートのような様々なスタイルに画像を変換します。

![facetomany-img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772236/7c1fafc8-0902-0ef1-e899-cade1d5bfc24.png)


# ウェブサイトの特徴

これはnextjs + clerk.js + tailwindcssをベースとした画像生成サイトで、各ユーザーは5クレジットを持つことができ、5枚の画像を無料で生成することができます。



# 特徴
1.5枚の画像を無料で利用できる
2.PS2フィルター、粘土、おもちゃ、ピクセル...のような複数のスタイル。近日中に他のスタイルも追加予定
3.高速生成




# 利用方法
このページに画像をアップロードする https://facetomany.app/create
画像に必要なプロンプトを入力してください。
生成するために作成をクリックします。


![create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772236/6c26600a-6e57-6529-8c0f-427c53f8cb47.png)



# いくつかの例
![style_emoji.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772236/01f7d248-7f3c-ca48-f179-791c3063577e.png)
![style_toy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772236/ca10d9bb-685b-7501-a6b4-ddcfd334998c.png)
sphinx 記述方法

前回はドキュメント作成し記述できる状態まで出来たので今回は記述方法を学んで行こうと思います。

---
### 参考記事

https://zenn.dev/y_mrok/books/sphinx-no-tsukaikata/viewer/chapter10

---
### 第一歩目
まずは目次を作成し見出しに番号を振る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/179bf0fc-eb1a-71a4-0c35-92aa53971606.png)

##### 拡張子は省略できる
```
#index.rst
.. VBA_Documents documentation master file, created by
   sphinx-quickstart on Wed Apr 17 08:57:49 2024.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

VBA_Documents's documentation!
=========================================

.. toctree::
   :numbered:

   /doc/page1
   /doc/page2
   /doc/page3

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
```
```
#page1.rst
###########################
Page1
###########################

***************************
段落が下がる-1
***************************

***************************
段落が下がる-2
***************************

***************************
段落が下がる-3
***************************

#page2.rst
###########################
Page2
###########################

***************************
段落が下がる-1
***************************

***************************
段落が下がる-2
***************************

***************************
段落が下がる-3
***************************

#page3.rst
###########################
Page3
###########################

***************************
段落が下がる-1
***************************

***************************
段落が下がる-2
***************************

***************************
段落が下がる-3
***************************
```
#### リテラルコードブロック
リテラルコードブロックは、行末に空白スペースを入れ、:: を記述することで行うことができる。　
インデントを3つ入れないとエラーが発生する。 ::
```
***************************
リテラルコードブロック
***************************
リテラルコードブロックは、行末に空白スペースを入れ、:: を記述することで行うことができる。　
インデントを3つ入れないとエラーが発生する。 ::

   ここからスタート
   TEST TEST TEST TEST TEST TEST TEST TEST
   TEST TEST TEST TEST TEST TEST TEST TEST
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/00bbf45d-028c-0a48-7a19-dfefc08c7d68.png)

#### コード(空白行を一つ開けて記述する)
```
.. code-block::
```

```
.. code-block::
   print('Hello')
```
LLM の学習に使えそうな optimizer まとめる

LLM の学習において、メモリ消費量が一番の敵です。
今回は LLM 学習に使えそうな optimizer をまとめます。

## 8bit-AdamW
- AdamW の 8bit 版です
    - ちなみに AdamW は Adam の問題点を改良したものです
- 量子化しているので精度は落ちますが、ほぼ影響はないです
    - 特に素の Adam/AdamW はメモリ消費量がやばいので、普通にやってみて動かせなかった場合は 8bit 版を使うとよさそうです
- huggingface なら `adamw_bnb_8bit` を指定するだけで使えます
```python
training_args = TrainingArguments(per_device_train_batch_size=4, optim="adamw_bnb_8bit", **default_args)
```

## Adafactor
- Adam のメモリ消費量を抑えた改良版
    - 素の Adam よりも多少性能面で落ちているようですが、計算コストやメモリの面で大幅に改善されている
- Adafactor も huggingface なら `adafactor` を指定するだけで使えます
```python
training_args = TrainingArguments(per_device_train_batch_size=4, optim="adafactor", **default_args)
```

## Galore
- 勾配を低ランク行列に落とし込んでメモリ消費量を削減した optimizer
    - Galore 自体は勾配を低ランク行列に落とし込む手法っぽいので、Adam (Galore 版)、Adafactor (Galore 版) とかが存在するようです
    - 8bit Adam と比較しても性能低下はそれほど見られないらしい
    - 一方でメモリ消費量は 8bit Adam 以下です
        - Galore 論文ではメモリ消費量をわかりやすく画像でまとめてくれていますね
```plantuml
@startuml
<style>
root {
  Padding 0
  Margin 0
}
footer {
  FontColor black
  FontSize 17
}
</style>
footer  LLaMA 7B を学習したときのメモリ消費量\n(出典：GaLore: Memory-Efficient LLM Training by Gradient Low-Rank Projection)
title <img:https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/758571/a4293481-b6e9-67af-0074-18d64f29cad4.png>
@enduml
```

- galore も optim を指定するだけ
```python
# “galore_adamw”, “galore_adamw_8bit”, “galore_adafactor” とかがある
args = TrainingArguments(
    output_dir="./test-galore",
    max_steps=100,
    per_device_train_batch_size=2,
    optim="galore_adamw",
    optim_target_modules=["attn", "mlp"]
)
```
Ruby Rails そのCSVどんな文字コードだろうと取り込んでやるよ

# 文字コード...
...日本で開発をしている皆さん。こんにちは。文字コードです😈

# もう嫌なんだ
- CSVが取り込めない？
- 文字コード？
- UTF-8？
- SHIFT-JIS？
- BOM？
- BOM付？え？
- ローカルではいける？
- あの人は取り込めないらしい？
- Macならいける？
- Windowsならいけない？
- エクセルで開いた？
- メモ帳で保存して？
- スプレッドシートから出力？
- 取り込めないんですけど😡？
- こっちでは取り込めるんだよなあ？
- ああああああああああああああああああ

# どんなものでも取り込めるそんな魔法のような実装はないのかね
あるかもしれない、ないかもしれない。
僕が辿り着いたところはここまでだ。
効率がいいか？そんなことはしらん。
いいから魔改造だ！

```rb
require 'csv'
require 'nkf'

def import_csv(file_param)
  # どんなものでも取り込めるように魔改造
  file_encoding = NKF.guess File.read(file_param.path)
  File.open(file_param.path,
            "rt:BOM|#{file_encoding}",
            universal_newline: true,
            undef: :replace,
            invalid: :replace,
            replace: '') do |file|
    CSV.new(file,
            liberal_parsing: true,
            headers: true,
            converters: nil,
            header_converters: :symbol,
            skip_lines: /^(?:,\s*)+$/,
            col_sep: ',',
            quote_char: '"').each do |row|
      product = Product.find_by(id: row['ID'])
      product.update(name: row['名前'], price: row['価格'])
    end
  end
end
```

# 参考にさせていただきました

https://qiita.com/kurashita/items/df51e69a3426b3ba007f
React コンポーネントのパフォーマンス最適化: memo と useCallback の活用

React でのコンポーネントのパフォーマンス最適化には、不必要な再レンダリングを防ぐことがキーポイントです。

ここでは、React の `memo` と `useCallback` フックを使用して、効率的なコンポーネント更新を実現する方法を紹介します。

## コンポーネントの再レンダリングされる条件

- コンポーネントの state が更新された時

- 渡されている props の値が変更された時

- **親コンポーネントが再レンダリングされた時**
  → メモ化によって不要な再レンダリングをスキップできる

## memo

### 再レンダリングをスキップできるケース

再レンダリングされた親コンポーネントから渡されている props　が変更されていない場合。

通常は親コンポーネントが再レンダリングされると、必ず子コンポーネントも再レンダリングされます。

しかし、`memo`関数は新しい props が古い props と同じである限り再レンダリングされないコンポーネントを作ります。

これを "メモ化されたコンポーネント" と呼びます。

### 使い方

コンポーネントを `memo`関数でラップする。

```jsx
import { memo } from "react";

const UserProfile = memo((props) => {
  const { user } = props;

  return (
    <div>
      <h2>{user.name}</h2>
      <p>{user.email}</p>
    </div>
  );
});

export default UserProfile;
```

### 推奨されるシナリオ

- **レンダリングコストの高いコンポーネント:**

大きなリスト、複雑な状態を持つフォームフィールドなど、再レンダリングのコストが特に高いコンポーネントは、props が変更されない限り、再レンダリングを避けるためにメモ化が有効です。

- **静的コンポーネント:**

再レンダリングがほぼ発生しない、静的な情報を表示するコンポーネント（例：ヘッダーやフッターなど）も、メモ化によって初期レンダリングのみを行い、以降の無駄な処理を省くことができます。

## useCallback

`useCallback` はメモ化されたコンポーネントに props として、関数を渡す際に有効なフックです。

`memo`関数と併用することで不要な再レンダリングを防ぐことができるということです。

### メモ化だけでは再レンダリングを防げないケース

メモ化されたコンポーネントは、渡されている props が変更されなければ基本的に再レンダリングされません。

しかし、props が変わってなくても親コンポーネントの再レンダリングによって、再レンダリングされてしまうケースがあります。

それが関数を props として受け取っているケースです。

JavaScriptでは関数もオブジェクトの一種であるため、その関数の参照先が重要になります。

親コンポーネントの再レンダリングごとに新しいインスタンスが生成され、これが React に新しい props が渡されたとみなされてしまうため、子コンポーネントも再レンダリングされてしまいます。

### 関数のメモ化

`useCallback`フックは関数をメモ化します。メモ化された関数は依存するデータが変更されない限り、同じ参照を返します。

これにより、上記の問題を回避することができます。

### 使い方

`useCallback` は、第一引数にメモ化したい関数を、第二引数にその関数内で依存している変数の配列（依存配列）を指定します。

依存配列内のどれかの値が変わると、関数は再生成されます。

もし依存配列を空にすると、コンポーネントがマウントされた時のみ関数が生成され、アンマウントされるまで同じ関数が使い回されます。

```jsx
// 子コンポーネント
import { memo } from "react";

// ChildComponent をメモ化
const ChildComponent = memo((props) => {
  const { onClick } = props;
  return <button onClick={onClick}>Click</button>;
});

export default ChildComponent;
```

```jsx
// 親コンポーネント
import { useState, useCallback } from "react";

const  ParentComponent = () => {
  const [count, setCount] = useState(0);

  // increment 関数をメモ化して、依存配列中の setCount が変わらない限り関数が再生成されないようにする
  const increment = useCallback(() => {
    setCount((prev) => prev + 1)
  }, [setCount]); // 依存配列に setCount を追加

  return (
    <div>
      <p>Count: {count}</p>
      <ChildComponent onClick={increment} />
    </div>
  );
};

export default ParentComponent;
```

## まとめ

`memo` と `useCallback` を適切に使用することで、React アプリケーションのパフォーマンスを向上させることが可能です。

これらのツールは、特に大規模なアプリケーションや高頻度で更新が行われる UI コンポーネントにおいて、その効果を発揮します。

適切な依存配列を設定し、不必要な再計算や再レンダリングを避けることで、スムーズで応答性の高いユーザー体験を提供できます。
問題が発生しました。ページを最新の情報に更新するか、しばらく待ってからもう一度やり直してください



:::note alert
Error: The input body for trigger 'manual' of type 'Request' did not match its schema definition. Error details: 'Required properties are missing from object: entity.'.
:::


コードビューの中身が新しく作ったフローとは微妙に違いました。そこで、一旦このトリガーを削除して再度追加してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3c627203-23de-b9ea-242e-d83a60328465.png)

おお、腐ったエラーは出なくなったけど動かんことには変わりない。


何でだろうなぁ、１件しかデータはない。重複してないと思うけど

```Json
{
  "status": 400,
  "message": "リストの次のフィールドに重複する値が見つかったため、リスト アイテムを追加または更新できませんでした: [★センター商品コード] 。\r\nclientRequestId: bff2a3cf-5abf-480b-86a4-f902d407b5bb\r\nserviceRequestId: bff2a3cf-5abf-480b-86a4-f902d407b5bb"
}
```

The list item could not be added or updated because duplicate values were found in the following field(s) in the list: |0].

画面からも入力できない。意味が分からん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0ae23d33-a256-d07d-cd36-0683f65f0eb1.png)



不思議なことに新規に作ったフローは同じはずなのにマスターを参照してもいつも０件。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4b92dcdb-fe26-05cf-ed31-9874c80f6fb9.png)

上がうまく取得できたもの、下ができないもの。違いが分からん

```Json
{
    "host": {
        "connectionReferenceName": "shared_sharepointonline",
        "operationId": "GetItems"
    },
    "parameters": {
        "dataset": "https://xxxxx/sites/portal",
        "table": "e7430603-df67-4045-a35c-3457ded0d708",
        "$filter": "Title eq 'HP0.9-3P​'"
    }
}

{
    "host": {
        "connectionReferenceName": "shared_sharepointonline",
        "operationId": "GetItems"
    },
    "parameters": {
        "dataset": "https://xxxxx/sites/portal",
        "table": "e7430603-df67-4045-a35c-3457ded0d708",
        "$filter": "Title eq 'HP0.9-3P'"
    }
}
```

結局何が違ってリストからアイテムを取得できなかったかは分かりません。消して再作成です。
本当、このツールで大規模な仕組みを作ったらえらい目にあいそうだ。信用できません。
「AWS」Amazon Quick Sightとは

# Amazon QuickSightとは
AWSがWebアプリケーションとして提供するBIサービス
# BIサービスとは
「Business Inteligence-ビジネス インテリジェンス」の略で、企業が大量蓄積しているデータを情報を集約・分析して、業務に活用できるようにするサービスです。
# クラウドコンピューティングの利用形態
Software as a ServiceーSaaSに分類されます。
ユーザはブラウザからAWSに蓄積されたデータの分析や可視化を実現します。
クラウド内の様々なデータを様々なソースからデータを組み合わせます。
単一のデータダッシュボードで、AWSデータ、ダードパーティーデータ、ビッグデータ、スプレットシートデータ、SaaSデータ、B2Bデータを含めます。
また、マネージド型のサービスであり、セキュリティや可用性にも配慮されています。
# Amazon Quick Sightの特徴
・アドホック分析
データの解析や異常検出、予測、自然言語クエリなどの機械学習機能を利用して、インサイトを得られる

ダッシュボードとレポートの作成
自分自身でダッシュボードとレポートを作成し、公開、共有することができます。
カスタマイズされた質問に対する明確な答えを得ることができます。

・クラウドネイティブなサービス
クラウド内のデータに接続し、様々なデータソースからデータを組み合わせることができます。
エンタープライズグレードのセキュリティ、グローバルな可用性、組み込みの冗長性を提供しています。

・コスト効率の高さ
コストを抑えることもできる特徴があります。
料金形態はストレージ容量の使用料と利用しているユーザ数の合計に基づきます。
# Amazon QuickSightまとめ
ビジネス上のデータを効果的に活用し、迅速な意思決定を行うことを支援し、データ分析と可視化のための強力なツールです。
【Flutter】スクロールの表示を一番下にする方法

こんにちは。
今回は、スクロールの表示を一番下にする方法について説明します。
Listview.builderやSingleChildScrollViewなどのスクロール機能使用時に使えます。

# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)

ボタンを押してControllerをScrollControllerを使用します。
その際に、animateToを使ってスクロールの動きを決めます。
*  duration：スクロールする時間
*  curve：Curveを設定


# 使用例
```dart

class MyHomePage extends StatefulWidget {
  MyHomePage({super.key, required this.title});

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    final scrollController = ScrollController();
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        actions: [
          ElevatedButton(
              onPressed: () {
                scrollController.animateTo(
                  scrollController.position.maxScrollExtent,
                  duration: const Duration(seconds: 1),
                  curve: Curves.bounceInOut,
                );
              },
              child: Text("Scroll To Bottom"))
        ],
      ),
      body: SingleChildScrollView(
        controller: scrollController,
        child: Column(
          children: [
            for (var i = 0; i < 30; i++)
              Container(
                height: 50,
                width: double.infinity,
                color: i.isEven ? Colors.lightGreen : Colors.white,
                child: Center(child: Text(i.toString())),
              ),
          ],
        ),
      ),
    );
  }
}


```

# 実行例
![scroll.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/8100f200-1968-9813-91ff-891e0935f9d3.gif)



# 最後に
ここまで読んでいただき、ありがとうございました！
いいねしてくれたら、スキップして喜びます:heartpulse:
好きなアイコンを使ってDraw.ioで図を書こう！

## はじめに

みなさんDraw.io(Diagrams.net)使ってますか？構成図やワイヤーフレーム書いてますか？

Draw.ioとは直観的かつ簡単に図が描けてGitでファイル管理もできる便利なヤツです．
最近では，VSCode内で拡張機能を使って作成できるので重宝してます．

https://app.diagrams.net/

Draw.ioにはデフォルトでいくつかのオブジェクトやアイコンが使えるようになっており，特にAWS，GCP，Azureなどインフラ周りは充実しています．

## 使いやすいけど．．．

しかし，それ以外ではあまり有効活用できていないのが現状です．最新の技術ライブラリはもちろんのこと，人や車など普段使いしたいようなアイコンも微妙なものが多いです．OSSアイコンライブラリをDraw.ioで使えるようにしている例もありましたが，毎回欲しいものを変換するのは大変です．

https://qiita.com/corestate55/items/ace4ed28703fa071e55d

また，Draw.ioで最も使いづらいのは検索機能です．この検索機能，デフォルトのアイコンは類似検索ができる一方，追加したライブラリは**完全一致**でないと引っ掛かりません．これほど使いづらい検索機能はないでしょう．

## VSCodeで描くなら拡張機能が使える

そこで，

- いろんなアイコンライブラリが使える
- 欲しいアイコンを簡単に検索できる
- 簡単にコピペできる
- **色を編集できる**

アイコン検索拡張機能「**Icon Collection**」を作成しました！

https://marketplace.visualstudio.com/items?itemName=kage1020.icon-collection

使い方は簡単！検索欄に使いたいアイコンの名前を入力して，コピーするボタンを押すだけ！

![スクリーンショット 2024-04-17 143300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274081/a38a8517-b179-eb29-9f23-6dc16e4b072b.png)

コピーするボタンは「SVG」と「diagram」の2種類あります．
SVGは文字通り素のSVGなのでReactやVueなどにそのまま使えます．
diagramの方はDraw.io用の図がコピーされます．通常，SVGをDraw.ioに張り付けても線の色を変えることはできません．しかし，魔法のおまじない

```
editableCssRules=.*;
```

を入れると以下のように編集できる項目が増えます．

![スクリーンショット 2024-04-17 144146.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2274081/c1b968ee-2473-3576-9e90-390fa0352d9d.png)

これを毎回書くのはめんどくさいので拡張機能が代わりにやってくれます．とても便利なのでぜひ使ってください！

また，何か追加したいアイコンや画像があればIssueください！ライセンスは各アイコンライブラリに準拠します．

https://github.com/kage1020/IconCollection

よりよいDraw.io生活を！

---

## 参考文献

https://qiita.com/yaegashi/items/c0882e76baab72b13e39

https://qiita.com/a-hiroyuki/items/90f5f960c0e552904b6b

https://qiita.com/corestate55/items/ace4ed28703fa071e55d

https://qiita.com/xsgk/items/f3a107a4d2125d02ef7f
PDFに透かしを追加するときに役立つスクリプト

PDF文書に透かしを追加する必要が生じた際、Pythonを活用してこの処理を簡単に実行する方法を紹介します。以下のスクリプトでは、指定されたテキストを透かしとしてPDFに追加します。

```python
from reportlab.pdfgen import canvas
import PyPDF2

def create_watermark(input_pdf, watermark_text):
    with open(input_pdf, "rb") as input_file:
        reader = PyPDF2.PdfReader(input_file)
        first_page = reader.pages[0]
        page_size = first_page.mediabox

    c = canvas.Canvas("watermark.pdf", pagesize=(page_size[2], page_size[3]))
    c.setFont("Helvetica", 10)
    c.setFillColorRGB(1., 0., 0., alpha=0.3)
    c.saveState()
    c.translate(page_size[2] / 2, page_size[3] / 2)
    c.drawCentredString(300, 180, watermark_text)
    c.restoreState()
    c.save()

def add_watermark(input_pdf, output_pdf, watermark_pdf):
    original = open(input_pdf, "rb")
    reader = PyPDF2.PdfReader(original)
    watermark = open(watermark_pdf, "rb")
    watermark_reader = PyPDF2.PdfReader(watermark)

    writer = PyPDF2.PdfWriter()

    for page in reader.pages:
        page.merge_page(watermark_reader.pages[0])
        writer.add_page(page)

    with open(output_pdf, "wb") as output_file:
        writer.write(output_file)

    original.close()
    watermark.close()

create_waterark("input.pdf", "CONFIDENTIAL")
add_watermark("input.pdf", "output_with_watermark.pdf", "watermark.pdf")
```

## 必要なインストール

このスクリプトを実行するためには、`PyPDF2`と`reportlab`ライブラリが必要です。以下のコマンドでインストールできます。

```bash
pip install PyPDF2 reportlab
```

## 関数の解説

### `create_watermark`

この関数は、入力されたPDFファイルからページサイズを取得し、そのサイズに合わせて透かしを含む新しいPDFを作成します。

- `input_pdf`: 入力PDFファイルのパス
- `watermark_text`: 透かしに使用するテキスト

### `add_watermark`

この関数は、作成した透かしPDFを元のPDFファイルの全ページに適用します。

- `input_pdf`: 元のPDFファイルのパス
- `output_pdf`: 透かしを適用したPDFを保存するパス
- `watermark_pdf`: 透かしPDFファイルのパス

## まとめ

このスクリプトを使用することで、簡単にPDF文書に透かしを追加することができます。透かしは文書のセキュリティ強化や機密情報の管理に役立つ重要なツールです。
vSphere Lifecycle Manager のイメージを使用した管理の設定で”デポへの接続中にエラーが発生しました。”のエラーの解決

# 現象
vSphere Lifecycle Manager (vLCM) の「イメージを使用した管理」の設定で、イメージのコンプライアンスの確認中に「デポへの接続中にエラーが発生しました。」のエラーが発生。
![20240417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354637/e55abec7-ad5e-aa01-d8ee-a738430ac93e.png)

# 対処方法
該当ホストのDNS設定を、vCenter Server の FQDNからIPを解決できるDNSサーバに変更

# 背景
* vSphare 7 から 8 へのアップグレードを行う過程で、まずは vCenter Server を 8 にアップグレード
* 8 では、vSphere Lifecycle Manager ベースライン (旧称 vSphere Update Manager VUM) が廃止されており、vSphare Livecycle Manager イメージの設定を行っていた際に、「デポへの接続中にエラーが発生しました。」のエラーが発生
* vCenter Server 7 まで、vCenter Server のホスト名にIPを設定しており、8 へのアップグレードの際に、vCenter Server のホスト名が自動的に FQDN になっていた

# 備考
* 対処方法にたどり着くまでに時間がかかった
* 「デポ」が vSphere Lifecycle Manager = vCenter Server を示しているとは思ったが、
** ステップ1(イメージの定義)が設定できたので、ネットワーク周りの設定とはすぐに思わなかった
** 証明書(vCenter ServerのCA）の更新もあったので、証明書周りを疑った
* 日本語エラーメッセージでは、同様の現象の情報にたどり着けなかった
（解決後になぜか英文で表示されたエラー「An error occurred while connecting to depot.」ならば、DNSが原因かもという情報を発見）
* DNSサーバが複数あり、vCenter Server のFQDNのドメインはローカルドメインであり、ローカルドメインを解決できるDNSサーバと、解決できないDNSサーバがあった
【Excel Addin】Displaying writeback logs in a textbox 

# Introduction #
This time I will explain how we can display the writeback process logs in a textbox rather than the default popup dialog or cells on the sheet.

# Configureing writeback logging option #
I prepared an Excel workbook with a Sharperlight writeback definition.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7fdb2682-1fb9-46f6-3f81-a7d60a7d2edf.png)

The writeback does insert/update to the Ledger table in this database.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/324761c4-e0ee-6976-f64f-0073398877e2.png)

Insert a textbox and rename the name of the textbox.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d9797fb6-3212-fc5b-e714-66ad22828aa8.png)
You can also use the default name. 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/75013ff0-39be-5677-4241-40a8f0cd816b.png)

Open the writeback definition by clicking the gear icon.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9e038b16-6907-a454-ce21-4c061b458072.png)
Display the definition by clicking the lookup button for Writeback Name field.
Choose **Ledger**.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b2067182-cd2d-43d8-4a41-72994da68546.png)

Once the definition is loaded, you can go for **Processing Options** tab.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/27586b3e-a783-945e-57cc-d501f6771c71.png)

Specify the name of the textbox, i.e. **=TextBox 1** into Logging Cell option.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/debd18ab-e446-bddd-d169-fe99c8910c21.png)


Save the changes and close the writeback definition.

Click the Execute Writeback button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/82f54a1f-e30c-7246-e3fd-999c3c1cc7b5.png)

The process log would be displayed like this.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/76556390-dcbe-a9b2-2f42-db6c3936ffe9.png)


# Conclusion #
This will allow for greater extensibility in report design.
長時間動画を短くするときに使ったスクリプト


動画を非常に高速に早送りする必要がある場合、Pythonと`moviepy`ライブラリを使用してこれを簡単に行う方法を紹介します。以下のスクリプトは、動画を400倍速で早送りし、フレームレートをカスタマイズして出力します。

```python
from moviepy.editor import VideoFileClip
from moviepy.video.fx.speedx import speedx

def speed_up_video_with_custom_framerate(input_file_path, output_file_path, speed_factor=400, new_fps=5):
    clip = VideoFileClip(input_file_path).without_audio()
    new_clip = speedx(clip, factor=speed_factor)
    new_clip.write_videofile(output_file_path, codec='libx264', audio=False, fps=new_fps)

# 例としてのパス（適宜変更してください）
input_file_path = "/path/to/your/video/file.mkv"
output_file_path = "/path/to/your/output/video.mkv"

# 関数の実行
speed_up_video_with_custom_framerate(input_file_path, output_file_path)
```

## 必要なインストール

このスクリプトを実行する前に、Python環境に`moviepy`ライブラリをインストールする必要があります。以下のコマンドを実行してください。

```bash
pip install moviepy
```

## 関数の解説

### `speed_up_video_with_custom_framerate`

この関数は、4つの引数を取ります。

- `input_file_path`: 加速したい動画ファイルのパス
- `output_file_path`: 加速後の動画を保存するパス
- `speed_factor`: 早送りの速度倍率（デフォルトは400）
- `new_fps`: 出力される動画のフレームレート（デフォルトは5）

#### 処理の流れ

1. `VideoFileClip`を用いて動画ファイルを読み込みます。`without_audio`メソッドでオーディオトラックを無効にします。
2. `speedx`関数で指定された倍率で動画の速度を加速します。
3. `write_videofile`メソッドで加速された動画を指定のコーデック、フレームレートでファイルに出力します。

## まとめ

このスクリプトは、研究やプレゼンテーションで長時間の動画を短時間で示す際に非常に役立ちます。調整可能なフレームレートと速度倍率により、さまざまなニーズに対応可能です。
.NET MAUIの.NET 8への切り替え

## はじめに
11/14に.NET 8がリリース。
これまで.NET 7を利用して.NET MAUIアプリを作成していたため、.NET 8への切り替えについて記録。

## .NET 8について

参考
https://devblogs.microsoft.com/dotnet/announcing-dotnet-maui-in-dotnet-8/



## .NET 8への切り替え
### Target .NET Runtimeの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625332/1ca247ec-2900-5873-80d3-9fe67e4c061b.png)

### Nugetの各ライブラリバージョンの更新
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625332/333e6484-9145-8fd5-2124-de8fe850faa0.png)
.NET MAUIでのBlazor利用

## はじめに
.NET MAUIでの、Blazor利用についての備忘録

## Blazor(ASP.NET Core Blazor)とは
C# と HTML(Razor) でWebアプリケーションが作れるフレームワーク。

Blazor WebAssembly と Blazor Server という 大きく２つの ホスティングモデルが存在。
Blazor Server→サーバーサイドで動作
Blazor WebAssembly→クライアントサイドで動作

## .NET MAUIでのBlazor利用
BlazorWebViewによって.NET MAUIでBlazorを実現できる。
Webサーバーを介さないという点でASP.NET Core Blazorと異なる。

## .NET MAUI Blazorのプロジェクト作成
Visual Studio で新しいプロジェクトの作成から.NET MAUI Blazorアプリを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625332/37f96847-82dc-4408-923d-015783cc363e.png)

.NET MAUIアプリのメイン画面はMainPage.xaml で定義される。
```xaml:MainPage.xaml
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:BlazorWebViewDemo"
             x:Class="BlazorWebViewDemo.MainPage"
             BackgroundColor="{DynamicResource PageBackgroundColor}">

    <BlazorWebView HostPage="wwwroot/index.html">
        <BlazorWebView.RootComponents>
            <RootComponent Selector="#app" ComponentType="{x:Type local:Main}" />
        </BlazorWebView.RootComponents>
    </BlazorWebView>

</ContentPage>
```



## 参考
https://learn.microsoft.com/ja-jp/dotnet/maui/user-interface/controls/blazorwebview
OCIのRocky Linuxのログインでハマった話

OCIのコンピュートインスタンス作成画面でRocky Linuxが選べるようになっていたので作成しました。

作成手順はここでは割愛しますが、これまでの手順と同様に非常に数回ボタンを押すだけで簡単にデプロイできました。
![20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/6792da89-11e9-2aa6-74ac-3ecfa6769ae1.jpeg)


早速、TeratermでSSHログインしようとしたのですが、ログインできず、再試行になってしまいました。
![21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/6e3d534b-6406-9bf5-38ad-f42fa19ec49e.jpeg)

そういえば、OracleLinuxはデフォルトのログインユーザー名は「opc」でしたが、これが違うのかも知れないと思い調べてみるとユーザー名は「rocky」との事で速攻で解決して良かったと思ってrockyユーザーでログインを試しましたが先ほどと同様に弾かれました・・・
![22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/52214b54-5511-2e10-a046-1966b0d56732.jpeg)

思い当たる原因を考えてみます。

①VPNでつないでいて22番ポートが使えない
　→認証画面まで行っているのでセッションは確立しているのでネットワークは疎通している
②パスワードが間違っている
　→鍵認証なのでパスワードは使っていない
③鍵がおかしい
　→再度、インスタンスを構築し、SSH秘密鍵をダウンロードしてみましたがやはりダメ
　→ただ、認証が通っていないので怪しい

 というのを思い付き、秘密鍵に問題がありそうな気がしていろいろとググってみました。
 すると、下記の記事が見つかったためWindowsにOpenSSHを入れて3072ビットの秘密鍵を作り、再度インスタンスを作成した時に作成した秘密鍵に対応する公開鍵をアップロードしてSSHアクセスはこの秘密鍵でアクセスを試みました。

 https://qiita.com/aokazu/items/60bc5c51591982f06b13

 ・・・が、やはりダメです。
 もう、rocky linuxはOCIでは上手く動かも知れない・・・と思い始めていました。
 いろいろと考えた挙句、試していない事がある事に気が付きました。

 そう、Teratermを最新にしていないという事です。
試していたバージョンは4.105でした。
![23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/04db3232-5b64-c610-f33d-e0ed20dde261.jpeg)

調べてみるとこれより新しいバージョンがあるようなのでインストールしてみました。
最新は4.108とちょっとだけ数字が大きくなっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/fb92c497-68cc-d1e6-22d6-eaaf565f1f70.png)

ソース管理もSubversionからGitに代わっているんですね。

早速接続すると・・・
![25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2367692/7d8cc7ed-1ff9-0a2a-82d1-51512ab91b9b.jpeg)

無事に繋がりました。

結論として、SSHクライアントのバージョンが古いと繋がらない事があるという事がわかりました。

この後、再度、インスタンス作成時にOCI側で作成したSSHキーをダウンロードして接続して問題無く接続できたため、特に自分で作成する必要性がなければこれまでのLinuxと同様にOCIで作成したSSHキーをそのまま利用できます。

ここまで半日近くかかってしまったので、少しでも参考になればと思い今回の記事を書かせて頂きました。
EasyOCRで画像をOCR処理して結果を赤枠表示する

# はじめに

あるソーシャルゲームでガチャを大量に引いて必要なアイテムか目視でチェックしていた。
とても目を酷使するのでガチャの結果を画像ファイルにして必要なアイテムかOCRで自動判別するプログラムを書いたのだが、OCRの認識結果を表示するだけのサンプルプログラムが簡単に見つからなかったのでまとめた。

# 環境

+ EasyOCR 1.7.1
+ pillow 10.3.0　        
+ Python 3.9.13
+ Windows 10 Pro (64bit) 22H2

::: note info
EasyOCR, pillowモジュールのバージョンを確認するコマンド
```
python3 -m pip show easyocr pillow
```
:::

標準で日本語に対応しているとのことでEasyOCRを今回は選択しただけで、深い理由はない。
なお、OCRライブラリによっては標準で認識結果を表示する機能もあるらしい

画像の加工はpillowを使用。opencvを利用する方法もあるようだが、今回の用途ではpillowで十分と判断した

# OCR処理して認識結果を表示

```py
import easyocr
from PIL import Image, ImageDraw

RED = (255, 0, 0)

fname = "sample.png"                          # 処理するファイル名

reader = easyocr.Reader(['ja','en'])          # 文字の選択

img  = Image.open(fname)
draw = ImageDraw.Draw(img)

# OCR処理をする
res = reader.readtext(fname)

# OCRの各認識結果を赤枠で囲う
for b in res:
    (rect, txt, posi)  = b              # rect = [[x1, y1], [x2, y1], [x2, y2], [x1, y2]]
                                        # txt：認識文字
    (x1, y1) = rect[0]
    (x2, y2) = rect[2]
    xy = (x1, y1, x2, y2)               # xy = ((x1, y1), (x2, y2)でもよい

    # 認識したBoundary Boxを四角で囲う
    draw.rectangle(xy, outline=RED, width=3)

# 認識結果を赤枠で囲った画像を表示する
img.show()                    
```

注意点としては、EasyOCRが返してくる座標情報の形式とpillowで使用する座標情報の形式が異なるので若干の変換が必要な点だけ。

![座標表現.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/774174/c4ff6c29-33d9-40f2-ccce-c9d6e92c8a62.jpeg)


例えば、左上の座標が(x1, y1)で右下の座標が(x2, y2)の方形範囲でもEasyOCRは`` [[x1, y1], [x2, y1], [x2, y2], [x1, y2]]``という形式（4点指定）で返してくるが、pillowでの入力パラメータでは`` (x1, y1, x2, y2)``あるいは`` ((x1, y1), (x2, y2))``という形式（2点指定）になる

# 参考情報

+ [EasyOCR GitHub](https://github.com/JaidedAI/EasyOCR)
+ [pillow Homepage](https://python-pillow.org/)
Azure logic appsで送信元IPアドレスを固定する！

# はじめに
* logic appsを使って、インターネット上のサーバーのAPIを叩いて処理を自動化したいけど、そのサーバーがIPアドレス制限をしているケースは無いだろうか？
* 通常、logic appsは以下の情報の通り、複数の送信IPアドレスがある

https://learn.microsoft.com/ja-jp/connectors/common/outbound-ip-addresses

* すべての記載されたIPアドレスを登録できれば問題ないだろうが、今回私が直面したケースでは、1アドレスへの限定が必要だったためその方法を共有する

# やること
* 最終的な構成を示す
* logic appsでVNET統合を行い、そのVNETに接続したNAT Gatewayから通信させることによって、IP固定化を行った
* 通信したいサーバーでは、NAT GatewayのパブリックIPのみを許可することで、やりたいことが実現できた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/45e3dcee-a38c-61f7-2a9c-8f45a931c4e6.png)

# IP固定化手順
## 1. logic appsをstandardプランで作成する
* ConsumptionプランはVNET統合をサポートしていないため、Standardプランを選択すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/679c8da9-1fb6-d21c-2cfc-d1676b133d30.png)

## 2. VNETとNAT Gatewayを作成する
* 任意にVNETを作る。サブネットも適宜設定する
* 今回はデフォルトサブネットのみ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/9d2a0ad5-b94f-db68-1c44-2e76e6187394.png)

* 続いてNAT Gatewayを作成する
* パブリックIPを新規取得することと、先ほど作成したVNETおよびサブネットに紐づけることとをわすれないこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/78ad985f-0284-0b6b-7861-9b6ef7fad1d5.png)

## 3. logic appsでVNET統合に接続する
* Networkingから、VNET Integrationの項目を選択し、新規作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/350f46ee-e0b7-bb3c-0b35-3746690947e5.png)

* 2で作成したVNETおよびサブネットと紐づけること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/c9e49253-8d49-82de-fee1-5e2ff500b7af.png)

* Outbound Internet Trafficにチェックが入っていることと、NAT Gatewayが指定されていることを確認すること
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/9aa02e22-f2f6-59c9-a7bd-717e285c79ba.png)


# テストする
* 「確認くん」というサイトを取得するサンプルプログラムを作成し、先ほど作成したIPアドレスからの通信になっているか、テストする

## logic apps デザイナー
* 適当なトリガー（今回はRecurrenceを選択）と、HTTPのみで良いだろう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/4903a61a-1f24-958a-24a1-686d668fd23f.png)

* HTTPの中身は、「確認くん」のサイトURLを指定しておく
* メソッドはGETを選択。それ以外はすべて初期値でかまわない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/39c0458a-1edf-f4c8-b6c0-836800207c01.png)

## テスト結果
* HTTPのレスポンスで、「確認くん」より示されたIPアドレスが、NAT GatewayのパブリックIPになっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10317/ffc2bbb8-3135-4a25-2afb-4760259a6e2f.png)

# さいごに
* logic appsのStandardプランはConsumptionプランと比べると、小規模な環境においてはかなりお金がかかることがネックとなる
* Standardプランのlogic apps上に、複数のフローを作成することができるため、できるだけ共有するなどしてコスト削減されるとよいと思う
Dockerでマウントしたホストディレクトリのパスを確認する

コンテナ作成時にホストディレクトリをマウントしたはいいものの、どのディレクトリをマウントしたかわからなくなってしまいかなり時間がとられました。
そのため、マウントしたパスを確認する方法をメモしておきます。

# 確認方法

Dockerコンテナがどのディレクトリをマウントしているのかは、以下のコマンドで確認することができます。

```
//コンテナIDを確認
$ docker ps -a

//マウントしたディレクトリを確認
$ docker inspect コンテナID
```

このコマンドの実行結果の以下の部分に、ホスト側のディレクトリとコンテナ側のディレクトリそれぞれのパスが表示されます。

```
"Mounts": [
            {
                "Type": "bind",
                "Source": "ホスト側のマウント先ディレクトリのパス",
                "Destination": "コンテナのパス",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
```
Sourceがホスト側のディレクトリ、Destinationがコンテナ側のディレクトリです。
これで、マウントしたホスト側のディレクトリのパスを確認することができました。

# 補足｜Dockerコンテナをマウントする方法

そもそも、Dockerコンテナをマウントする際に、どのディレクトリをマウントしたのか覚えておけば何の問題もありません。
Dockerコンテナをマウントする方法は、

https://qiita.com/liker39/items/e66e1aa81a9edcf0fa30

↑を参考にするととてもわかりやすいです。

簡単に説明すると、
```
$ docker run -it -d -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] [イメージ] bash
```
でホスト側のディレクトリをマウントしてコンテナを作成することができます。
docker run の -v オプションを用いることで、ホスト側のディレクトリをマウントすることができます。
Salesforceのグローバル値リスト(選択リスト値セット)に新規値追加しても対象レコードタイプで使えるようにならない時は

追加時に「このグローバル値セットを使用するすべてのレコードタイプに新しい選択リスト値を追加します」をチェックしても使えるようにならない
オブジェクトマネージャの対象レコードタイプの選択リスト値の編集で追加する必要がある
Go言語 Docker開発環境構築方法 メモ

## 概要

* DockerでGo言語の開発環境を構築する方法について備忘録としてメモする。

## 環境情報

* OS：WSL2 Ubuntu-22.04
* Docker：24.0.7
* docker compose : v2.10.0
* Visual Studio Code：1.85.1

## 手順

### 1. 作業用フォルダにDockerfile、docker-compose.ymlを作成する

* 任意の作業用フォルダの直下に次の2ファイルを作成する

  * `Dockerfile`

    ```dockerfile
    # ベースイメージ
    FROM golang:1.22rc1-alpine3.19
    # コンテナ内のディレクトリ作成
    RUN mkdir /go/src/app/
    # 作業用ディレクトリ設定
    WORKDIR /go/src/app/
    # ホスト上のファイルをコンテナ作業用ディレクトリにコピー
    COPY ./ /go/src/app/
    ```

    ※ベースイメージは[公式](https://hub.docker.com/_/golang)より適宜選択すること

  * `docker-compose.yml`

    ```yaml
    version: '3'
    
    services:
      go-app:
        build: ./
        volumes:
          - ./:/go/src/app/
        ports:
          - "8080:80"
        restart: always
        tty: true
    ```

### 2. Dockerコンテナを起動する

* 次のコマンドを実行し、Docker コンテナを起動する

  ```shell
  docker compose up -d
  ```

  ※コンテナ起動状態を確認したい場合

  ```
  $ docker ps
  CONTAINER ID   IMAGE             COMMAND     CREATED          STATUS         PORTS                                   NAMES
  xxxxxxxxx   godocker-go-app   "/bin/sh"   18 minutes ago   Up 4 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   godocker-go-app-1
  ```

### 3. Visual Studio Code / Dev Containers で起動したコンテナにVisual Studio Codeをアタッチする

1. (Dev Containers 未インストールの場合、)Visual Studio Code の`Extensions` から`Dev Containers`をインストールする
2. Visual Studio Code 左パネルの`Remote Explorer`を選択する
3. `Dev Containers` リストにある`godocker-go-app`を右クリックし、`Attach in New Windows`を選択する(新しいVisual Studio Codeウィンドウがコンテナにアタッチされた状態で開かれる)
4. 新しいVisual Studio Codeウィンドウからソースファイルフォルダ`/go/src/app`を開く

### 4. 動作確認用プログラムを作成する

* 動作確認用プログラム`main.go`を作成・配置する。

  ```go
  package main
  
  import "fmt"
  
  func main() {
  	fmt.Println("Hello Go Lang!")
  }
  ```

​	※`Hello Go Lang!`と標準出力するのみのプログラム

### 5. 動作確認用プログラムを実行する

1. Visual Studio Codeのターミナルを起動する(Windows ショートカットキー`Ctrl + Shift + @`)

2. 動作確認用プログラム`main.go`をビルドする

   ```shell
   /go/src/app # go build main.go
   ```

3. 動作確認用プログラム`main.go`を実行する

   ```shell
   /go/src/app # ./main
   Hello Go Lang!
   ```

   ※ `go run main.go`でも可

## 参考情報

* [golang](https://hub.docker.com/_/golang)

* [Developing inside a Container](https://code.visualstudio.com/docs/devcontainers/containers)
動画セグメンテーションソフトウェア　XMem でのtroubleshooting

XMem は今時点でSota のvideo segmentation のライブラリである。
https://github.com/hkchengrex/XMem/

## この記事で述べること
- 動画へのセグメンテーションを実行してくれるライブラリであるXMemのインストール手順

以下の内容は無保証です。

ソフトウェアはリリース後に、依存ライブラリのバージョンが変更になるのはいつものことです。
そのために、公式のリリースの手順に従ってもエラーがでるのはありがちなことです。

## 実行時のライブラリの不足対策
```
from 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platform plugin
```

https://stackoverflow.com/questions/77725761/from-6-5-0-xcb-cursor0-or-libxcb-cursor0-is-needed-to-load-the-qt-xcb-platform


```
sudo add-apt-repository universe
sudo apt-get update
sudo apt-get install libxcb-cursor-dev
sudo apt-get install libxcb-cursor0
```

## DEIVISION_BY_ZERO 対策

```
~/github/XMem$ git diff inference/interact/gui.py
diff --git a/inference/interact/gui.py b/inference/interact/gui.py
index 9c52214..5ea047a 100644
--- a/inference/interact/gui.py
+++ b/inference/interact/gui.py
@@ -875,11 +875,11 @@ class App(QWidget):
         global_used = global_total - global_free
 
         self.gpu_mem_gauge.setFormat(f'{global_used:.01f} GB / {global_total:.01f} GB')
-        self.gpu_mem_gauge.setValue(round(global_used/global_total*100))
+        self.gpu_mem_gauge.setValue(round(global_used/(global_total + 1e-6)*100))
 
         used_by_torch = torch.cuda.max_memory_allocated() / (2**20)
         self.torch_mem_gauge.setFormat(f'{used_by_torch:.0f} MB / {global_total:.01f} GB')
-        self.torch_mem_gauge.setValue(round(used_by_torch/global_total*100/1024))
+        self.torch_mem_gauge.setValue(round(used_by_torch/(global_total + 1e-6)*100/1024))
 
     def on_gpu_timer(self):
         self.update_gpu_usage()
```
# 使い方
```
python3 interactive_demo.py --video [path to the video] --num_objects 4
```

- 動画が再生できることを確認する
- 動画の冒頭で、対象物１つにセグメンテーションする。
	- Scribble, click, free のどれかを選ぶ。
	- click を選ぶと、クリックした点を中心に領域をセグメンテーションする。
- "Forward Propagation"を選ぶ。

## Q: GPUが使われていないのをどうしたらいいですか？
A: PyTorch の環境がGPU(=CUDA)を使う設定になっていないのが原因です。
- Jetsonでは該当のJetPackに対応するバージョンのPytorchのディスクイメージが公開されています。
- それを用いてDocker環境で動作させるのがよい。
Mavenで特定のテストをスキップして、buildしたい。


## タイトル通り。

以下みたいなシェルスクリプトを使えばいいんや！
```
#!/bin/bash
# Backup original pom.xml
cp pom.xml pom.xml.bak

# Add test exclude configuration to pom.xml
xmlstarlet ed --inplace -u "/project/build/plugins/plugin[artifactId='maven-surefire-plugin']/configuration/excludes" -x "concat(., '<exclude>除外クラスの条件</exclude>')" pom.xml

# Run maven clean install
mvn clean install

# Restore the original pom.xml
mv pom.xml.bak pom.xml
```