OmniAICreator/Qiita-1.07M huggingface dataset:
AWS VPCの作成

## AWS VPC
Amazon Virtual Private Cloud (Amazon VPC) とは、リソースの配置、接続性、セキュリティなど、仮想ネットワーク環境をフルで制御できるサービスです。AWS サービスコンソールで VPC を設定するところから始めます。
## AWS VPCの作成
東京リージョンを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/ec35f03e-c829-20d6-a94f-014c1053197d.png)
管理コンソールのサービスからVPCを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/1648ad66-eb3b-2c1e-c6f8-1a9972623638.png)
VPCダッシュボードの「VPCを作成」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/0b30df2a-d666-4d3f-67a0-cabfefdc023b.png)
VPC作成画面の設定
作成するリソース：VPCのみ
名前タグ - オプション：my-vpc-01
IPv4 CIDR ブロック：IPv4 CIDR の手動入力
IPv4 CIDR：10.0.0.0/16
IPv6 CIDR ブロック：IPv6 CIDR ブロックなし
テナンシー：デフォルト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/0d7580ec-a5d8-56b9-9f01-7325fdbcf487.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/a309c9f4-8b1d-8912-f0af-15ce7ba73282.png)
お使いのVPCに作成されたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/0ce2d369-6d9b-0a17-2a2a-b6d13fa63ef2.png)
備忘録　BUFFALO TeraStation(TS3400D) 2台のMySQLデータベースをレプリケーション

BUFFALO TeraStationのMySQLServerをレプリケーションする

(MASTER)　NAS(1)　http://192.168.0.**1/ 
(SLAVE)　NAS(2)　http://192.168.0.**2/ 　

NAS(1) MySQLサーバーDirを \\\192.168.0.**1\MySQL\ 
NAS(2) MySQLサーバーDirを \\\192.168.0.**2\MySQL\ 
としている場合、

①フォルダを同期させてコピーを作成
　どちらかのTeraStationのメニューで、
　バックアップ > レプリケーションから、
　レプリケーション元　\\\192.168.0.**1\MySQL\ 
　レプリケーション先　\\\192.168.0.**2\MySQL\ 
　と設定して、一度フォルダ毎同期させる

②一定時間放置して、内容が　コピーされたら、フォルダの同期を解除
　①で設定したTeraStationのメニューの
 　バックアップ > レプリケーションから、フォルダのレプリケーションを解除

③MySQLServerのレプリケーション設定をする
　NAS(1),NAS(2)の phpMyAdmin　にログイン
　phpMyAdmin内のSQLタブで以下をそれぞれ順番に実施

④(MASTER)での操作 (ユーザーを作成する)　※UserNameは任意(※1)

    CREATE USER  'UserName'@'192.168.0.**2' IDENTIFIED BY 'replication';
    GRANT REPLICATION SLAVE ON *.* TO 'UserName'@'192.168.0.**2';


⑤(MASTER)での操作 (マスターを一度ロック)

    FLUSH TABLES WITH READ LOCK;
    SHOW PROCESSLIST;

⑥(MASTER)での操作 (Server_idを確認)　※サーバーIDを覚えておく(※2)

    stop slave;
    show variables like 'server_id';


⑦(MASTER)での操作 (ポジションを確認)

    SHOW MASTER STATUS;

　File : mysqld-bin.****** (※3)
　Position : 0000　(※4)
　↑この2つをメモ

⑧(SLAVE)での操作 (serverIDをMasterと被らないものにする)

    stop slave;
    show variables like 'server_id';
    SET GLOBAL server_id = 2;　←　(※2)と被らない数字にする

⑨(SLAVE)での操作 (以下を実行)

    CHANGE MASTER TO
     MASTER_PORT= 3306,
     MASTER_HOST='192.168.0.**1', (MASTERのIP)
     MASTER_USER='UserName',  (※1)の内容を入力
     MASTER_PASSWORD='replication',
     MASTER_LOG_FILE='mysqld-bin.******',　(※3)の内容を入力
     MASTER_LOG_POS=0000;　(※4)の内容を入力

    start slave;
    SHOW SLAVE STATUS;

⑩(MASTER)での操作 (ロックを解除)

    UNLOCK TABLES;
新人エンジニアが、E2Eテストについて調べたのでメモ

## E2Eテストとは

「E2E」は「エンドツーエンド」の略で、その名の通り、システムをユーザー視点で、「端から端まで」テストします。

ユーザーが行いうる操作のシナリオに沿って、ユーザー視点でプロダクトをシミュレーションするのが特徴です。アプリケーションの各コンポーネント（フロントエンド、バックエンド、DBなど）が統合した状態でテストを行うことによって、ユーザーの手元に届くプロダクトの挙動を把握することができるため、非常に信頼性の高いテスト手法です。

多くの場合、テスト自体を自動化して行うことが多いですが、人が手動でテストをすることもあります。手動でテストするのは手間がかかるので、自動化した方がコストが低いように思えますが、システムが複雑化するほど、メンテナンスにコストがかかるため、適切な範囲で実施することが重要です。

## E2E以外の「テスト」

ソフトウェアプロダクトのテストには、E2Eの他にも様々な種類があります。ここでは、その概要を確認します。

- ユニットテスト

ユニットテストは、テストの最小単位で、個々のコードの正しさをテストします。

- インテグレーションテスト

複数のユニットが連携する部分のテストです。このテストによって、コンポーネント間の相互作用を確認します。

- システムテスト

システム全体のテストです。E2Eテストと似ているように感じますが、システムテストは、技術仕様書や設計書に基づいて行われ、機能要件と非機能要件の双方をテストします。

- 受け入れテスト

プロダクトの発注者によるテストです。ここでは、ビジネス要件や契約条件を満たしているかどうかを、プロダクトを導入する側がテストします。受け入れテストも、E2Eと似ているような気がしますが、E2Eは開発者もユーザーもテストを実施する可能性があるのに対し、受け入れテストは、実際のユーザー、つまり発注者によるテストであるという点が、大きな違いです。

## Playwrightとは

私が関わっているプロダクトではPlaywrightを利用しています。

Playwrightとは、Microsoftが開発した、E2Eテストを自動で行うためのオープンソースのライブラリです。

“Any browser • Any platform • One API” つまり「あらゆるブラウザ、あらゆるプラットフォーム、１つのAPI」というキャッチコピーを掲げており、複数のブラウザやプラットフォームにおけるE2Eテストを、Playwright１つで行うことができます。具体的には、以下のブラウザ・プラットフォームに対応しています。

- ブラウザ
    - Chromium
    - WebKit
    - Firefox
- プラットフォーム
    - Windows
    - Linux
    - macOS

また、ローカルでもCIでもテスト可能で、ブラウザはヘッドレスでもヘッド付きでもテスト可能です。

また、API対応言語は以下の通りです。

- TypeScript
- JavaScript
- Python
- .NET
- Java

E2Eテストを行うためのツールには、Playwrightの他にも、Selenium・Puppeteer・Cypressなどがあります。
生きがいを見つけてくれるAI「IkigAI」をリリースしました！

いきなりですが、ikigaiチャートて知っていますか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802225/c5219df3-0ba6-0e95-8835-d10e73824339.png)


・あなたが愛するもの

・あなたが得意とすること

・世界が必要としていること

・あなたが報酬を受け取ること


これらの要素が重なる場所が、「生きがい」と呼ばれるものです。

最新の研究では生きがいのメリットがいくつも報告されています。

・メンタルヘルスの向上
・モチベーションの向上
・フロー体験の促進
などなどです

その「生きがい」をAIが見つけてくれるサービスを作りました！

[アプリはこちらから](https://ikigai-d3946.web.app/)

# サービスの特徴
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802225/c047fd29-81d5-6a45-cb9f-3a998124d75d.png)


今回作成したWebサービスは、生きがいの定義に則って、簡単かつ効果的に個人のIkigaiを発見できるツールを開発いたしました。

[実際のアプリはこちらから](https://ikigai-d3946.web.app/)


## AIのサポート

IkigAIでは、特に以下の点についてAIがサポートを提供します：

### 世界が必要としていること: 
現在の世界や地域のニーズをAIが分析し、あなたのスキルや興味と一致する分野を提案します。

### あなたが報酬を受け取ること:
 AIが市場動向や需要を解析し、あなたの得意分野で報酬を得られる機会を見つけ出します。

### 具体的なアクションプランの提案

あなたの回答に基づいてカスタマイズされたIkigaiを文章によって提供。

### 様々なビジネス視点からの提案

得意と好きを掛け合わせた新たなビジネスをAIが提案をしてくれます
　
つまるところ、世界が必要としていることと、あなたが報酬をもらえることをAIに丸投げして、得意と好きだけを入力するだけで生きがいを生成してくれる！ということです。

[実際のアプリはこちらから](https://ikigai-d3946.web.app/)


# 利用方法

### 質問に回答
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802225/8ff17452-cdc8-ff47-eb81-59ad244800cf.png)


 Ikigaiを見つけるための質問に回答します。質問は簡単で、自分の得意とすることと自分が行っていて楽しいと感じることを入力するだけです。

回答に基づいて、カスタマイズされたあなただけのIkigaiが自動生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802225/c047fd29-81d5-6a45-cb9f-3a998124d75d.png)

[実際のアプリはこちらから](https://ikigai-d3946.web.app/)

# 今後の展望

現在はChat機能のみを提供していますが、需要があれば、チャットで送った内容を編集・追加できる機能などを搭載していく予定です。

# まとめ

Ikigaiを見つけることは、自己理解を深め、人生をより充実させるための重要なステップです。今回紹介したWebサービスは、そんなIkigai探索の旅を手軽に、そして効果的にサポートします。

# その他
ブログも運営しているので覗いてみてくださいね！
https://www.front-blog.com/
[Python]2次元配列の初期化

# 結論
pythonで2次元配列を初期化する場合は*演算子ではなくforを使用する。
```python
# X
lst2d = [[0] * 3] * 3
# O
lst2d = [[0] * 3 for i in range(3)]
```

# 内容
listの初期化時に*演算子を使用すると、任意の長さで配列を初期化できる。
```python
lst1d = [0] * 3
print(lst1d)
```
```
[0, 0, 0]
```

2次元配列で＊演算子を使って初期化すると、[1][1]に値を代入した時に[0][1]や[2][1]にも同じ値が入ってしまう。
```python
lst2d = [[0] * 3] * 3
print(lst2d)
lst2d[1][1] = 1
print(lst2d)
```
```
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
```
~~*演算子は指定した要素を複製する。
そのため`[0] * 3`は0を3つ複製し、長さ3の整数配列([0,0,0])となる。
一方`[[0] * 3] * 3`は、**長さ3の配列**を複製するのではなく、**長さ3の配列のポインタ**を複製しているため、値を共有してしまう。~~
`[[0] * 3] * 3`は、**長さ3の配列を3つ**作るのではなく**長さ3の配列のポインタを3つ作る**ため、lst2d[0],lst2d[1],lst2d[2]とで値を共有してしまう。

2次元配列を初期化する時、外側は*演算子ではなくforを使用する。
```python
lst2d = [[0] * 3 for i in range(3)] 
print(lst2d)
lst2d[1][1] = 1
print(lst2d)
```
```
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
```
Cookieとセッション

## そもそもなぜCookieとセッションが必要なったか
webブラウザからwebサーバーへリクエストを送る際はHTTP通信で行う。HTTPは特徴としてステートレスであることが挙げられる。（状態を保持しない事）
そうするとAmazonなどのショッピングサイトに訪れ場合に不具合が生じる。
たとえば一回ログインしたのにブラウザを閉じるとまたログイン情報を入力しなければならない。
これはめんどくさいですよね。。

## Cookie
サーバーからブラウザにレスポンスを送る際にブラウザに保存してもらいたい情報（ログイン情報等）をCookieという形の情報で送る。
HTTPレスポンスのメッセージヘッダーにCookieを含める事で送信する。
デベロッパーツールで簡単に確認することができる。

## セッション
ブラウザとサーバーの一連のやり取りの事。
たとえば会員制サイトにログインしてログアウトするまで。
セッションを管理するためにCookieにセッションIDを含めて情報をブラウザで管理する。

## 参考文献
[この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E5%9B%B3%E8%A7%A3%E5%BC%8F-%E3%81%93%E3%81%AE%E4%B8%80%E5%86%8A%E3%81%A7%E5%85%A8%E9%83%A8%E3%82%8F%E3%81%8B%E3%82%8BWeb%E6%8A%80%E8%A1%93%E3%81%AE%E5%9F%BA%E6%9C%AC-%E5%B0%8F%E6%9E%97-%E6%81%AD%E5%B9%B3/dp/4797388811/ref=asc_df_4797388811/?tag=jpgo-22&linkCode=df0&hvadid=295704876452&hvpos=&hvnetw=g&hvrand=15349655132761382575&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9053274&hvtargid=pla-526274317363&psc=1&mcid=3fbbf2bb8e563902aceef57bc81ce684&th=1&psc=1)
SVDでメモリ消費を削減：AdaLoRAの革新的アプローチ

※ このページは「ADALORA: ADAPTIVE BUDGET ALLOCATION FOR PARAMETER-EFFICIENT FINE-TUNING」の要約になります。

## このページでわかること
- AdaLoRAというパラメータ効率の良いファインチューニング手法を提案し、重み行列の重要度に基づいてパラメータ予算を動的に配分することで、モデルの性能を向上させる
- 特異値分解（SVD）を利用して重要でない更新を効果的にプルーニングし、メモリ消費を削減する
- 実験結果は、自然言語処理や生成タスクにおいて、既存の手法よりも優れた性能を示した

## 対象読者
- 大規模言語モデル (LLM) の効率的なファインチューニング方法に興味を持つ人
- メモリ効率の良いモデル微調整技術を活用して、複数の下流タスクにモデルを適用しようとする人
- 特にリソース制約のある環境で高性能なNLPモデルを開発・デプロイする必要がある人

## 従来のファインチューニングの問題点

1. **メモリ消費の高さ**：LLMは非常に多くのパラメータを持ち、すべてのパラメータをファインチューニングする場合、大量のメモリが必要になる。そのため、多数の下流タスクを処理する際に、特にメモリ消費が非常に高くなる
2. **一律なパラメータ配分の非効率性**：従来のパラメータ効率的なファインチューニング手法（例：LoRA）は、全ての重み行列に対して均等にパラメータ予算を配分しますが、各重み行列の重要度の違いを考慮していないため、性能が最適でないことが多い

## AdaLoRA
### AdaLoRA とは？
AdaLoRA（Adaptive Budget Allocation for Parameter-Efficient Fine-Tuning）は、事前学習済み言語モデルの効率的なファインチューニングを目的とした新しい手法です。AdaLoRAは、各重み行列の重要度に基づいてパラメータ予算を動的に配分し、特異値分解（SVD）を用いて不要な更新を効果的にプルーニングすることで、メモリ消費を削減しながらモデルの性能を向上させます。

### AdaLoRA のメリット
1. **パラメータ効率の向上**: 重み行列の重要度に基づいてパラメータ予算を動的に配分することで、限られた予算内で最適なパフォーマンスを達成
2. **メモリ消費の削減**: SVDを利用して不要な特異値をプルーニングすることで、メモリ消費を効果的に削減
3. **性能の向上**: 低予算設定でも既存の手法に対して優れた性能を示し、特に下流の自然言語処理タスクや生成タスクで顕著な改善を達成

### AdaLoRA の手順
1. **SVDベースの適応**: 事前学習済みの重み行列の増分更新を特異値分解（SVD）の形式でパラメータ化する。具体的には、\(\Delta = P \Lambda Q\) とし、\(\Lambda\) は特異値、\(P\) と \(Q\) は特異ベクトル
2. **重要度スコアの計算**: 各特異値とその特異ベクトルに基づいて重要度スコアを計算する。これには感度ベースの指標を使用し、各エントリの影響を考慮する
3. **パラメータ予算の動的配分**: 重要度スコアに基づいて特異値をプルーニングし、パラメータ予算を動的に配分する。重要な特異値には高いランクを割り当て、重要でないものは低いランクにする
4. **グローバル予算スケジューリング**: 初期予算を設定し、トレーニングの進行に伴って予算を徐々に減少させ、最終的にターゲット予算に一致させる。

### AdaLoRA の性能
- **自然言語処理タスク（GLUEベンチマーク）**: AdaLoRAは、全てのデータセットで既存の手法よりも優れた性能を示し、特に低予算設定で顕著な改善を達成した
- **質問応答タスク（SQuAD）**: SQuAD v1.1およびv2.0のデータセットで、各予算レベルにおいて最先端の手法よりも優れた性能を発揮した。特に低予算設定でも高いF1スコアを達成した
- **自然言語生成タスク（XSum, CNN/DailyMail）**: BART-largeモデルを使用して、XSumおよびCNN/DailyMailのデータセットでLoRAよりも高いROUGEスコアを達成した

## まとめ
以上がAdaLoRAの要約でした。AdaLoRA は DyLoRA と同じように、動的にパラメータを調整してくれるタイプのやつですが、どっちが性能いいかは気になりますね。

おわり。
[Python]for文のループカウンタ

# 結論
forループでループカウンタを変更しても、次の繰り返しには影響しない。
ループカウンタを変更するループ文を書くにはwhileを使う。
# 説明
for文の中でi(ループカウンタ)を変更するコードを書く。
```python
for i in range(5):
    print(i)
    if i==1: i+=2
```
i==1の時にi+=2しているため、出力は0,1,4を期待するが、
```bash
0
1
2
3
4
```
となる。
iは同じ変数を使用しているのではなく、繰り返し時にrange(5)=[0,1,2,3,4]から取得しなおしているため、ループ内で変更しても次の繰り返しには影響しない。

ループ内でカウンタを変更するコードを書くには、forではなくwhileを使用する。
```python
i = 0
while i < 5:
    print(i)
    if i == 1: i+=2
    i+=1
```
```
0
1
4
```
LWR では Salesforce Surveysは使えない



+ [デジタル エクスペリエンス サイトに追加するアンケート コンポーネントが表示されない](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007I7X6MSAV)

:::note
There are two types of sites Aura and LWR. LWR sites don't support Surveys. Right now you have LWR. So, you need to create a new site but choose Aura this time. For example, use Build Your Own (Aura):

サイトには Aura と LWR の 2 種類があります。LWR サイトはアンケートをサポートしていません。現在、LWR があります。したがって、新しいサイトを作成する必要がありますが、今回は Aura を選択します。たとえば、独自のビルド (Aura) を使用します。
:::

+ [Salesforce アンケート招待 URL が機能していません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfX7wSAF)

:::note
最も一般的な問題は、本番環境で調査をホストしている Digital Experience サイト (旧称「コミュニティ」) が適切に構成されていないことです。

あなたの場合、サイトはhttps://portal.dmcc.aeです。このサイトにログインすると、ログインが要求されます。つまり、サイトはゲストユーザーを許可していません。

サイトがゲスト ユーザーによるサイトへのアクセスを許可していること、およびゲスト ユーザーがアンケートに回答するために必要な権限を持っていることを確認する必要があります。手順については、こちらを参照してください。

他に考えられる問題は、コミュニティが「lwr」サイトである場合です。LWR サイトは Salesforce Surveys と互換性がありません。
:::

+ [When I am clicking in Get invitation Link then I am getting error "Something went wrong Please refresh the page" for one survey it is working but for others it is not working"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007eoQde)

:::note
One other possible problem is if your community is an "lwr" site. LWR  sites are not compatible with Salesforce Surveys.
:::
KTOとは?：(Kahneman-Tversky Optimization ）



# KTOとは?：(Kahneman-Tversky Optimization ）


https://arxiv.org/abs/2402.01306

この図は、言語モデルのアライメント手法に関する説明を示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/4fe48cbc-af1a-6022-9652-6d4bd46103e1.png)


従来的なプロセスは、教師ありファインチューニングから始まり、続いてRLHF (Reinforcement Learning from Human Feedback) やDPO (Direct Preference Optimization) といった手法を使用して、モデルをペアリングされた嗜好データにフィットさせます。これらのアプローチが必要とするペアリングされた嗜好データは取得が難しいとされています。(図左)

新しい手法であるKTO (Kahneman-Tversky Optimization) は、入力に対する出力が望ましいか否かの情報のみを必要とするため、現実世界でより豊富で、安価で、迅速に収集可能なデータソースを活用できます。

## KTOとは？

KTO（Kahneman-Tversky Optimization）は、人間のユーティリティモデルを基に開発された新しい最適化手法で、現実世界の不確実な金銭的結果についての人間の意思決定を説明することに焦点を当てています。このアプローチは、既存の手法が好みの対数尤度を最大化するのに対し、生成物のユーティリティ自体を直接最大化することを目指しています。

### もうちょい解説

既存の手法、特にDPO（Direct Preference Optimization）などでは、モデルが学習する際に、特定の入力に対する好みのペア（好ましい出力と好ましくない出力のペア）から対数尤度を最大化することを目指します。つまり、モデルは人間の評価者が提供する具体的な「好み」に基づいて調整され、その好みに最も適合する出力を生成するように学習します。

一方で、KTO（Kahneman-Tversky Optimization）は、好みのペアに基づく学習ではなく、生成物自体のユーティリティ、つまりその生成物がどれだけ有用か、望ましいかを直接最大化することを目指します。これは、心理学者カーネマンとトヴェルスキーが提唱したユーティリティ理論に基づいています。彼らの理論は、人間が不確実性のある状況でどのように価値判断を下すかを数学的にモデル化したものです。

具体的には、KTOでは各出力が単に「望ましい」または「望ましくない」という二値のフィードバックに基づいて最適化されます。この方法により、モデルは複雑な好みの構造を解析する代わりに、より広範なデータから直接、実用的な生成物をより効率的に学習することができます。これによって、モデルは現実世界のアプリケーションで実際に役立つ出力をより確実に生成することが可能になります。

## KTOのメリット

### データが集めやすい
KTOでは、望ましいか望ましくないかの二値信号のみを必要とし、このデータは収集が容易でコストも低く、現実の世界で迅速に収集可能です。これにより、プロダクション環境でのアライメントのスケーリングが容易になり、モデルの迅速な反復が可能になります。


### 性能が出やすい
実験結果によると、KTOはDPOの性能に匹敵し、あるいはそれを超える結果を1Bから30Bパラメータのスケールで示しています。KTOは、優れた生成例を90％少なく使用しながらもDPOの性能に匹敵することができ、この成功は嗜好データセットからのアライメントデータに依存していないことが示されています。

さらに、事前学習されたモデルが十分に良い場合、監督付きファインチューニングを省略して直接KTOに進むことができ、生成品質の低下が見られません。これに対し、監督付きファインチューニングを行わないDPOアラインメントモデルは、全スケールで性能が大幅に劣ることが分かりました。

KTOが比較的弱い信号から学習しているにもかかわらず、DPOと同等またはそれ以上の性能を発揮することは驚きであり、この現象についての理論的な説明も提供されています。これらの結果は、KTOが特にデータの不均衡が激しい場合や迅速なモデル反復が求められる状況で特に有効であることを示しています。
CSS – 縦の行数指定をして省略する例

# 例

```html
  <div
    style="
      display: -webkit-box;
      -webkit-box-orient: vertical;
      -webkit-line-clamp: 3;
      overflow: hidden;
      max-width: 30%;
      word-wrap: break-word;
    "
  >
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDDDDDDDDD EEEEEEEEEEEE
    FFFFFFFFFFFFFFFFFFFFFFFF GGGGGGGGGGGGGG HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
  </div>
```

# 表示例

![image](https://github.com/YumaInaura/YumaInaura/assets/13635059/7cf2ea37-6dff-4fd3-bae9-784b8e3733ed)

# 参考

https://zenn.dev/itayuri/articles/51f0004a3bad64

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
Pillow: カラー画像を白黒に変換

## プログラム

```py:convert_to_gray.py
#! /usr/bin/python
#
#	convert_to_gray.py
#
#						May/28/2024
# --------------------------------------------------------------------
import sys
from PIL import Image
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
file_in = sys.argv[1]
file_out = sys.argv[2]
sys.stderr.write(file_in + "\n")
sys.stderr.write(file_out + "\n")
#
aa_jpg = Image.open(file_in,'r')

gray_img = aa_jpg.convert('L')
#
gray_img.save(file_out)
#
width, height = gray_img.size
print(width, height)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------

## 実行スクリプト

```bash
./convert_to_gray.py image.jpg gray.jpg
```

入力画像
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1061f169-855b-f32b-d3c5-1cc3a66390ad.jpeg)

出力画像
![gray.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/1997b220-66fa-bd7d-d4c5-350f8fbc1ee8.jpeg)
(QA) POWER8->10でCPUバウンダリーなジョブのレスポンスタイムが悪化した件（QPRCMLTTSKシステム値）

## システム値 QPRCMLTTSK CPUマルチタスク処理が0のシステムでPOWER8->10移行後レスポンスが悪化
メモとして。

### 環境
移行前：POWER8, IBM i 7.3, 0.4コア程度割当
移行後：POWER10, IBM i 7.5, 0.2～0.5コアでテスト

### 発生した事象
昼間の業務時間帯ほぼ全体にわたって移行前よりも明確に体感できるレベルでジョブのレスポンスタイムが悪化。バッチ処理時間も数倍～に悪化。

### 原因
システム値QPRCMLTTSKがデフォルト2のところ、0に設定されていました。移行前のPOWER8, IBM i 7.3も同様だったのであるタイミングで何らかの理由で変更されたのだと思われますが確認不能でした。
QPRCMLTTSKシステム値を0->2に変更したところCPU性能向上に近いレスポンスタイムの改善がみられました。

### 収集サービス　ヘルス標識
収集サービスデータを見ると、たとえば下記は最も悪い時間帯の断面ですが、CPUが赤標識で、とくにCPUキューイングがとても悪いものでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/3858bc26-dee6-0a17-868b-32c482fc745d.png)

### システム値 QPRCMLTTSK CPUマルチタスク処理　とは
マニュアル:[システム・デフォルトおよびユーザー・デフォルトのシステム値: プロセッサー・マルチタスキング](https://www.ibm.com/docs/ja/i/7.5?topic=overview-system-user-defaults-system-values-processor-multitasking)
（以下抜粋）
```
プロセッサー・マルチタスキングを制御できます。 このシステム値は、 ハードウェアが、1 つのプロセッサーで一度に 1 つのタスクのみを実行するか、 それとも 2 つ以上のタスクを実行するかを制御します。

このシステム値には、以下の値があります。

オフ (0)
    各プロセッサーは、どの瞬間でも、1 つのタスクだけを処理します。
オン (1)
    複数のプロセッサーが同時に複数のタスクを処理できます。
システム制御 (2)
    複数のプロセッサーが同時に複数のタスクを処理できます。 また、システム制御状態では、 オペレーティング・システムで、 必要に応じて 1 つのプロセッサーが 1 つのタスクだけを処理するよう制限できます。

値はパフォーマンスを基にして指定する必要があり、ワークロードに依存します。 1 つのプロセッサーに複数のタスクを許可すると、多くの場合、システムのパフォーマンス能力が増大します。 したがって、システムはより多くの作業を処理します。 プロセッサーを単一タスクの実行に制限すると、多くの場合、 システムでの個別タスクの実行を高速にすることができます。

システム値への変更は、Power6® 以降のハードウェアに即時に有効になります。

出荷時の値はシステム制御 (2) です。
```

CPUキューイングはCPUの演算装置数（＝ 一般に割当CPUコア数に近似と考えていいと思います）の不足を表していると思われます。上記の1つのプロセッサー＝1つのコアを意味していると考えられますので、POWER10 1コアの場合、8SMT *1 で動作できるところを1SMT（こんな表現は本来ありませんが・・）で動作していたためと思われます。

システム値変更後の収集サービスデータが分かれば追記したいと思います。

### 注記
*1 POWER CPUのSMT = インテルCPUのハイパースレッドと同義です。

### 考察
POWER8と同じシステム値だったにも関わらずPOWER10でパフォーマンス劣化が顕著に見られた件から、逆に言うと、POWER10はPOWER8よりもSMT8有効時のパフォーマンスが高い、SMT8により最適化している、と言えるかもしれません。

### 質問
ちなみに、「ジョブのCPUキューイング・パーセント」は、ジョブが 不適格待ち行列 にある時間的 (あるいは個数的) 割合を示しているのでしょうか？
参照 : [IBM i アーキテクチャー：実行管理 ジョブ状態遷移の具体例](https://qiita.com/gomAnomalocaris/items/447546ea1d9ac39e2c85)

A.
いいえ
CPUキューイングは、「スレッドやタスクが待ち⾏列に⼊り、プロセッサーの実⾏を待っている状態」を意味し、ジョブの活動レベルを維持した状態です。不適格待ち行列は活動レベルを放棄したジョブが入る待ち行列なので異なります。
図示すると以下のようになります。CPUキューイングは短時間待機（2秒以内の待機）に該当すると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/11d17e79-f956-d1a1-bebc-3bc1f7501595.png)


## 事後付記：QPRCMLTTSKシステム値変更後、改善結果のヘルス標識

参考までに首記について追記します。
全く同じトランザクション、処理内容というわけではありませんが、ほぼ同様な傾向の処理がなされた上でのデータとなります。上記システム値変更後、下記のようにシスステムヘルス標識は大きく改善されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b1116383-7c53-ef93-6d25-af6607f1a621.png)
【Windows】マウスポインタを一緒に画面キャプチャしたい

## はじめに
画面キャプチャをする際、マウスポインタは写らないでくれることに今までは感謝していました。
お客様にお見せするきれいな資料作成のためなど、みなさんも感じたことあるのではないでしょうか。

しかし、以下の記事を作成するのに今度は写ってほしいのに。。となんとも我が儘な思考になってしまいました:rolling_eyes:

https://qiita.com/mmm_qiita/items/9d80c3afae60ccec50d3

調べたら方法はあるようです。よかった:upside_down:
[こちらの情報](https://fukuro-press.com/win-take-screenshot-with-cursor/)を参考にし、マウスポインタも一緒にキャプチャを取ることを実現させたので、ご紹介します。

## キャプチャ方法
### 1. 拡大鏡を起動する
マウスポインタをキャプチャするのに、"<font color="Red">**拡大鏡**</font>"を起動することで可能になります。

スタートメニュー > "設定"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/55a049ab-ca86-b2e7-9c2d-dd9f0363c0c6.png)

"アクセシビリティ" > "拡大鏡"で、以下を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/d5aec92a-f4d1-c649-2fa1-454a32828e0f.png)
拡大鏡　　　：`オン`
ズームレベル：`100%`
ビュー　　　：`固定`

拡大鏡自体は、拡大鏡オンにすることで起動します。

:::note
画面上部が拡大画面です。
マウスポインタを動かしてみてください。
:::

### 2. 拡大鏡の範囲をキャプチャする
`Win` + `PrintScreen`や`Ctrl` + `PrintScreen`で画面キャプチャし、Excelなどに貼り付けトリミングする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726107/acdbf547-14f6-a51e-a908-3aab34e1b5bd.png)

上部が拡大画面、下部が通常画面です。
拡大画面にのみ、マウスポインタがあるのがわかるかと思います。

:::note
`Win`+`Shift`+`S`でもできることは確認しましたが、範囲選択の際マウスポインタが消えてしまうため難しかったです。
全画面キャプチャ→トリミングすることをおすすめします。
:::

## 最後に
今回は、マウスポインタをキャプチャに写りこませる方法をご紹介いたしました。
拡大鏡の使い道の幅が広がり、新たな発見ですね！

最後までお読みいただき、ありがとうございました:hugging:
Pythonのforループでlistを特定の回数回す方法


# Pythonのループの書き方

リストの全要素に対して、ループを回すとき。

```
list = [1,2,3,4,5,6,7]
for num in list:
    print(num)
```

リストの特定の範囲に対して、ループを回すとき。

```
list = [1,2,3,4,5,6,7]
for num in list[0:3]:
    print(num)
```

リストで特定の回数、ループを回すとき。
```
list = [1,2,3,4,5,6,7]
for num in range(4):
    print(num)
```
Unityでキャラクター選択システムを作ってみた

# はじめに
今回は、格ゲーなどで使うキャラクター選択システムを作ってみたので紹介します。

## 構造
### キャラクター選択シーン
* キャラクターのアイコンを貼り付けたボタンを配置
* ボタンをクリックしたら、static int型の変数に数字を入れて保存
* 同じシーン内で対応したキャラクターの立ち絵を表示する

### バトルシーン
* 選択されたキャラクターの立ち絵、キャラクター名を表示する

としました。

## キャラクターの立ち絵を表示する
スクリプトは以下のように書きました。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterPic : MonoBehaviour
{
    //ボタンごとに対応するキャラクターの立ち絵をアサインしてください
    public GameObject _character1;
    public GameObject _character2;
    public static int _selectCharaNumber;

    void Start()
    {
        _selectCharaNumber = 0; //最初は何も表示したくないので、割り当てをしていない番号を代入します
    }

    public static int CharaNamber()
    {
        return _selectCharaNumber;
    }

　　//キャラクター1のボタンにつける
   public void Chara1()
    {
        _selectCharaNumber = 1;
        _character1.SetActive(true);
        _character2.SetActive(false); //キャラ数に合わせて追加してください
    }

　　//キャラクター2のボタンにつける
    public void Chara2()
    {
        _selectCharaNumber = 2;
        _character2.SetActive(true);
        _character1.SetActive(false); //キャラ数に合わせて追加してください
    }

}
```

かなり力技。キャラクター数が増えたときに大変なので、例えば画像を差し替えるようにするとか、プレハブを生成するとか…改良の余地ありですね。

スクリプトができたら、適当なゲームオブジェクトを作ってアタッチしてください。Inspectorにキャラクターの立ち絵をアサインしておくのも忘れず行いましょう。
それができたら、ボタンでキャラクターに対応したメソッドを呼べるようにしておきます。

## 別シーンでキャラクターの立ち絵、キャラクター名のテキストを表示する

①のシーンで選んだキャラクターをバトルシーンで使うための機能になります。
スクリプトはこちらです。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Player : MonoBehaviour
{
    int _charaNumber;
    
    public Text _nameArea; //キャラクターの名前を表示させたいテキスト

    //キャラクターの名前
    public string _charaName1; 
    public string _charaName2;

    //キャラクターの立ち絵
    public GameObject _character1; 
    public GameObject _character2; 

    void Start()
    {
        _charaNumber = CharacterPic._selectCharaNumber; //キャラクター選択シーンで選んだキャラクターの番号を取得
        CharaSpawn();
     } 

    //キャラの名前、ゲームオブジェクト表示
    public void CharaSpawn()
     {
        if(_charaNumber == 1)
        {
            _nameArea.text = string.Format(_charaName1);
            _character1.SetActive(true);
        } 

        if(_charaNumber == 2)
        {
            _nameArea.text = string.Format(_charaName2);
            _character2.SetActive(true);
        } 
     }
}

```

こちらのスクリプトも適当なゲームオブジェクトを用意しアタッチして、キャラクター名や立ち絵素材をアサインしてください。

これでキャラクター選択の仕組みができました！

# 最後に
いかがでしたでしょうか。
1つのゲームオブジェクトで管理できるようにしたとはいえ、キャラクター数が増えるととんでもないことになりそうなので、もう少しいいコードにできないか考えてみようと思います。

最後まで読んでいただき、ありがとうございました！
robloxでassistant その83

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

# 練習問題
BlurEffectを使え。

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


local blur = Instance.new("BlurEffect")
blur.Enabled = true
blur.Parent = workspace.CurrentCamera
blur.Size = 15

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/cc282835-2ada-1bf0-a9dc-ffe72d3a61d0.png)


以上。
MacのコンソールはWARPからiTerm2に戻ろうか迷っている

# WARPの欠点

- 自分の好きなショートカット設定ができない 
- コマンド履歴からの検索がワイルドカード的に検索できず、前方一致的に検索されてしまう
- コマンド履歴が複数タブで共有されないことがある
- Vimで日本語入力がいまいち
- サーバーにssh接続するとすぐ途切れる

# WARPの長所

- コマンドの文法ミスを強調表示して教えてくれる ( これはけっこう良い )
- コマンド入力時のファイル・ディレクトリ補完が丁寧 
- コマンドがエラーで終了するとハイライトしてくれる
- GUIからコマンド・コマンド結果をコピーできる ( だけど自分はほとんど使ってない )
- コマンド実行ごとに単位が作られる ( でもあまりメリットを感じない )


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
robloxでassistant その82

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

# 練習問題
ParticleEmitterを使え。

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

local part = Instance.new("Part", workspace)
part.Position = Vector3.new(-5, 6, -10)
local fire = Instance.new("ParticleEmitter", part)


```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e1b8ff6e-765f-07c2-ac56-5f58bc47b35a.png)


以上。
robloxでassistant その81

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

# 練習問題
Sparklesを使え。

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

local part = Instance.new("Part", workspace)
part.Position = Vector3.new(-5, 6, -10)
local fire = Instance.new("Sparkles", part)

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/4bf1063b-0fe9-012f-f769-29de2876bcaf.png)


以上。
robloxでassistant その80

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

# 練習問題
Smokeを使え。

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

local part = Instance.new("Part", workspace)
part.Position = Vector3.new(-5, 6, -10)
local fire = Instance.new("Smoke", part)
fire.Size = math.max(part.Size.X, part.Size.Z)

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/be5519d5-58a7-f9f1-9e6b-5342c26228aa.png)


以上。
robloxでassistant その79

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

# 練習問題
Fireを使え。

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

```
local part = Instance.new("Part", workspace)
part.Position = Vector3.new(-5, 6, -10)
local fire = Instance.new("Fire", part)
fire.Heat = 10
fire.SecondaryColor = Color3.new(1, 1, 1)
fire.Size = math.max(part.Size.X, part.Size.Z)

```

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b1b88785-72c0-6cfc-ce6d-7e9a90dd9449.png)

以上。
初学者にも分かる Python のインストール方法（macOS向け）


## この記事で分かること
この記事を読めば、
- pyenvを使ってPythonを自身のPCにインストールする方法
- シェルで`python`コマンドを使えるようにする（パスを通す）方法

が分かります！

</br>

~~~
動作環境
macOS 14.5
Homebrew 4.3.2
pyenv 2.4.1
~~~
<br>

## 本題

### 1. Pythonをインストールする

Pythonをインストールする方法は、大きく分けて次の２種類あります。
- Python公式サイト（https://www.python.org/downloads/source/ ）から直接インストールする
- **pyenv**というツールを使ってインストールする

本記事では、後者の**pyenvというツールを使ってインストールする方法**を解説します！

pyenv（https://github.com/pyenv/pyenv ）は、Pythonのバージョン管理を行ってくれる便利なツールです。
このツールを通してPythonをインストールすることで、状況に応じて様々なバージョンのPythonを使い分けることができます。例えば、「普段は最新バージョンのPythonを使って開発をしているけど、少し古いバージョンのPythonでも動作するか確認したい」などの場合に活躍してくれます。

まずは、このpyenvをインストールしていきましょう。
pyenvは、Homebrewを使ってインストールします。以下のコマンドを入力して、Homebrewが既にインストールしてあるか確認しましょう。
~~~shell
$ brew -v
Homebrew 4.3.2
~~~
上記のようにバージョンが表示されていればインストール済みなので、早速pyenvをインストールしていきましょう。
~~~shell
$ brew install  pyenv
~~~

念のため、きちんとpyenvがインストールされているか確認しましょう。
~~~shell
$ pyenv -v
pyenv 2.4.1
~~~
バージョンが表示されていればインストール成功です。

<br>


続いて、pyenvを使って好きなPythonのバージョンをインストールしていきます。

まずは、**pyenv で利用可能な Python のバージョンを取得**しましょう。
~~~shell
$ pyenv install --list
~~~
すると、以下のような情報が返ってきます（一部抜粋）。
~~~shell
  3.11.6
  3.11.7
  3.11.8
  3.11.9
  3.12.0
  3.12-dev
  3.12.1
  3.12.2
  3.12.3
  3.13.0b1
  3.13-dev
  3.14-dev
  activepython-2.7.14
  activepython-3.5.4
  activepython-3.6.0
~~~
ここでは、2024年5月下旬現在の最新安定バージョンである`3.12.3`をインストールします。
~~~shell
$ pyenv install 3.12.3
~~~
これにてバージョン`3.12.3`のPythonがpyenvの中にインストールされました。

:::note info
以下のコマンドで、**pyenvにインストール済みのバージョンを確認**することができます。
~~~shell
$ pyenv versions

  system
* 3.12.3 (set by /Users/skkch96/.pyenv/version)
~~~
:::

冒頭で書いたように、pyenvでは複数のバージョンのPythonをインストールし、状況に応じて使用するバージョンを切り替えることができます。
しかし、本記事ではひとまず先ほどインストールした`3.12.3`を**システム全体で使う設定**にします。
~~~shell
$ pyenv global 3.12.3
~~~

:::note info
使用するバージョンを切り替える方法
本記事では詳しく解説できませんが、pyenvでは以下のような設定もできます。
- 特定のディレクトリでのみ、特定のバージョンを使う
- シェルごとに特定のバージョンを使う

興味がある方は、下記サイトにて詳細を調べてみてください。

【Python】pyenv の初期設定・使い方を徹底解説！
https://www.cfxlog.com/python-pyenv
:::

以上でPythonのインストールは完了です！

---

### 2. シェルで`python`コマンドを使えるようにする

Pythonのインストールが完了したら、以下のコマンドを実行してみてください。
~~~shell
$ python --version
~~~
すると、`command not found: python`と返ってきてしまったのではないでしょうか。
それもそのはず。今の状態では`python`コマンドのパスが通っていないので、**パスを通してあげる必要があります**。

まずはシェルの設定ファイルを開きましょう。お使いのシェルによって、シェルの設定ファイルは異なり、
- bashの場合　→ `/.bash_profile`
- zshの場合 → `/.zshrc`

です。
テキストエディタで上記の設定ファイルを開き、下記のコードを追加しましょう。
~~~
eval "$(pyenv init --path)"
~~~

追加したら、シェルを再起動します。
~~~shell
# bashの場合
source ~/.bashrc

# zshの場合
source ~/.zshrc
~~~

再起動後、`python`コマンドが使えるようになっているはずです。
~~~shell
$ python --version
Python 3.12.3
~~~

バージョン名が返って来れば成功です！

---
以上で、Pythonをインストールし、`python`コマンドのパスを通す作業が完了しました！
最後に、本記事の作成にあたり参考にさせていただいたWebサイトを再掲させていただきます。

https://www.cfxlog.com/python-pyenv
input要素の属性がアクセシビリティに与える影響

## 前書き

スマートフォンのブラウザを使っていて、なにかの応募フォームに情報を入力していたとしよう。メールアドレスの入力欄にフォーカスが当たるとそれっぽいキーボードが表示され、電話番号の入力欄だとやはりそれっぽいダイヤルパッドが表示されるのを目にした方も多いだろう。どんなすごい技術を使っているのかと思いきや、HTMLソース内に適切な指定がされているだけだった、という話なのだ。

さて、この適切な指定がアクセシビリティにどのような影響を与える可能性があるかについて考えてみたい。

## ターゲット層

誰に対してのアクセシビリティ7日をちょっとはっきりさせておこう。私が主に語れるのは、スクリーンリーダーというソフトウェアを使ってコンピュータを使っている、見えない・見えにくい人たちのことだ。それ以外の人たちにも影響を与えるかもしれないが、今回は考慮しないことにする。

## ちょっとおさらい

HTMLの<input>要素を確認してみよう。

``` HTML
<innput type="text" maxlength="20" />
```

みたいな感じだ。これで20文字入力できるフィール度が作られるはずだ。ここまではほとんどの環境で同じだろう。

## type属性をいろいろと変えてみる

<input>要素のtype属性にはいろんなものが指定できる。

* text: 文字入力
* button: ボタンを作る
* checkbox: チェックボックスを作る
* radio: ラジオボタンを作る
* ほかにもたくさん

文字を入力するものだけでももっとたくさんある。

* text
* number
* tel
* date
* datetime
* month
* week
* email
* url
* range

入力させたいデータに応じてこれらをちゃんと使い分けたらブラウザはどのようにふるまうだろうか。

## 期待してること

スクリーンリーダーユーザーとしては、入力操作はいろいろと難儀なことも多いのだ。主な失敗は、

* メールアドレスを全角で入力して受け付けてもらえない
* 電話番号が全角で受け付けてもらえない
* ひらがなとかカタカナを指定されていてそれに従ってないので受け付けてもらえない
* 必須入力に気が付いてなくて受け付けてもらえない

などなどである。この問題の一部を上記type属性を適切に指定してやることで解決できないかなと思うわけだ。例えば

* 電話番号とかメールアドレスとかＵＲＬとかはそもそも全角にならないようにする（あいやあ、全角のＵＲＬってのもあるんだよねえ）
* 日付を入れるところは、日付っぽいものしか入らなくなる
* 郵便番号も半角で固定される

もっとあるかもしれない。

ということで、テストページを作ってみた。
[Input type attribute test](http://a11y.rd01.net/input.html)

## ブラウザの振る舞いに関する考察

### 環境

私の環境は、

* Chrome 127.0.6485.0
* Windows 11 24H2 (OS ビルド 26120.670)
* JAWS 2023, NVDA 2024.1jp

でテストしている。他のブラウザ・スクリーンリーダーだと挙動が違うかもしれない。以下上記の環境での動きを見ながら考察する

### はじめに感想

どうやらちゃんとtype属性は設定したほうが良い。ブラウザはある程度それっぽいUIを提供するように設計されている。デザイン上許容できるのであれば、このUIに従うのがアクセシビリティ的には最も気を使わなくても良いはずである。日付入力をカスタムで作ろうとした場合、多くのアクセシビリティテストを通過させなければならないだろう。

### E-Mail 電話番号の入力

E-Mailの入力では、hoge@hiyoの形式になっていないと「無効なエントリー」とJAWSが警告する。また、Chromeに住所などを設定していると上下矢印キーを使ってアドレスが選択できる。

電話番号入力では、どんな文字列でも入力できてしまう。「ほげほげ」でも受け付けられる。なので、全角で入力しちゃって受け付けてもらえない問題は解決しない。

### 日付と時刻関連

UIはよくできていると思う。2月31日が入力できちゃったりするけれど、選択ツールもちゃんとJAWSでは読み上げている。積極的に使って良いと思う。

### 範囲・数値

範囲は、上下矢印キーで値を買えられる。もちろん直接入力しても良い。数値は、数字以外を入力するとそもそも入力フィールドに値が入っていない。が、「入らなかった」という事実がユーザに伝えられずに、混乱するかもしれないなとは思う（これはうぇぶせいさくしゃの責任にするのは辛い…）。

面白いのは、数値に全角を入れると、ちゃんと半角の数字に変換してくれってるっぽいこと。これもよくある失敗なので訂正してくれてありがたい。こちらも積極的に使えばよいと思う。

### その他

URLの入力は"hoge:hiyo"の形式になっていないと無効だと警告される。"www.example.com"では無効らしい。

## 感想

アクセシビリティ的には、type属性を妥当なものに設定することは意味があるようだ。それよりも、ある程度それっぽいUIと値のチェックをブラウザがやってくれることに意味があるのではないかと思う。少しばかりデザイン的にそぐわなかったとしても、このUIをアクセシビリティも含めてちゃんと実装するのは案外骨の折れる作業なのではないだろうか。ということで、多くの人に恩恵のあるちょっとした設定は、ぜひ積極的に活用されてはいかがだろうか。
debian dvd　 日本語　uim-mozc

## 0) arch linux では　かんたんなのですが、　厳密なdebianでは


https://www.cyberciti.biz/faq/installing-plugins-codecs-libdvdcss-in-debian-ubuntu-linux/


が　良さげですが　**未確認！**




## 0) 日本語　uim-mozc　は最初から入ってます

apt install zenity
のあと
im-config
で　uimを選択したあと　再起動すれば使えます

 $ uim-pref-gtk 
 もしておくこと


## 1) debian は　厳密すぎて　「皆に嫌われてるか」

https://www.youtube.com/watch?v=FR91CB5SBWU


ただ　１つだけ注意があります
以下です


```

ここ
/etc/apt/sources.list
の
１行目だけに
# をつけてください


# deb cdrom:[Debian GNU/Linux 12.5.0 _Bookworm_ - Official amd64 DVD Binary-1 with firmware 20240210-11:28]/ bookworm contrib main non-free-firmware

deb http://ftp.jaist.ac.jp/debian/ bookworm contrib main non-free-firmware
deb-src http://ftp.jaist.ac.jp/debian/ bookworm contrib main non-free-firmware

deb http://security.debian.org/debian-security bookworm-security contrib main non-free-firmware
deb-src http://security.debian.org/debian-security bookworm-security contrib main non-free-firmware

# bookworm-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
deb http://ftp.jaist.ac.jp/debian/ bookworm-updates contrib main non-free-firmware
deb-src http://ftp.jaist.ac.jp/debian/ bookworm-updates contrib main non-free-firmware


```

## 2）　自分の持ってるブラザーのプリンターは　ブラザーが　deb ドライバーを供給してくれてるので　このとおりです

![CLCL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211097/73b0e6cd-0306-69df-957f-eaa3e0b14c8c.jpeg)


## 3) freeoffice
https://www.freeoffice.com/ja/service/tips-and-tricks/linux


## 4) 導入アプリ
obs-studio
shotcut
---
shotwell


## 5)
2024/5/28主にITとかセキュリティの記事

米国の犯罪記録データベースが流出の可能性、攻撃者は7,000万件窃取と主張(5/26)
https://news.mynavi.jp/techplus/article/20240526-2951472/

脆弱性の存在が指摘される消費者向けスパイウェア「pcTattletale」のサーバーがハッキングされ内部データが流出(5/26)
https://gigazine.net/news/20240526-spyware-pctattletale-hacked/

身近な「Windows」をより安全に使う“なるほどの方法”(5/26)
https://atmarkit.itmedia.co.jp/ait/articles/2405/26/news026.html

米スタートアップProtecto、RAGで安全な生成AI利用を実現｜情報漏洩を防ぐ(5/26)
https://techable.jp/archives/235083

Azure API Management Basic V2とStandard V2をリリース：拡張性、セキュリティ、ネットワークの強化(5/26)
https://www.infoq.com/jp/news/2024/05/azure-apim-new-tiers-ga/

偽造マイナ　詐欺横行 伊藤氏「カード利用中止を」(5/26)
https://www.jcp.or.jp/akahata/aik24/2024-05-26/2024052602_04_0.html

グーグルの検索結果から個人情報を削除する方法(5/26)
https://wired.jp/article/remove-your-personal-info-from-googles-search-results/

ショッピージャパン、越境ECの失敗事例をまとめた「越境ECしくじり大全」を無料公開(5/26)
https://news.mynavi.jp/techplus/article/20240526-2952934/

中古でiPhoneを買うなら何世代前のものまで？買うべきではない機種はどれ？(5/26)
https://otona-life.com/2024/05/26/232274/

国税庁を名乗り“滞納金を払わないと差押処分だ”と脅してくる詐欺急増中(5/25)
https://ascii.jp/elem/000/004/200/4200640/?rss

公共料金が未払いだと嘘をつくフィッシング詐欺メールにヒヤリ！(5/26)
https://ascii.jp/elem/000/004/200/4200646/?rss

NATOは露国境沿いにサイバーラボのネットワークを形成している＝露外務省(5/25)
https://sputniknews.jp/20240525/nato-18489006.html

タイ軍、2024年10月までにサイバー司令部を設立予定(5/26)
https://www.thaich.net/news/20240526ah.htm

G7 財務大臣・中央銀行総裁会議声明（仮訳） 
(2024 年 5 月 23-25 日 於: イタリア・ストレーザ)
https://www.mof.go.jp/policy/international_policy/convention/g7/20240525.pdf

米予算、核兵器予算増額、核不拡散と浄化プログラム削減(5/26)
https://www.epochtimes.jp/2024/05/228050.html

刑期11,196年、暗号通貨取引所の全データを持って消えた男(5/26)
https://wired.jp/article/sz-faruk-ozer-turkey-crypto-fraud/

デジタル円の現在地
官民一体の具体的な検討始まる　「大義名分」はいまだ見えず(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nft/21/040100002/052100041/

AWSにデジタル教科書 GIGAで新しい学校(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/052200177/

VRF(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031500132/051700028/

カオナビ子会社で15万件流出　マイナンバーも対象(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/031800050/051700063/

止まらぬ不正に進まぬ対策　官民連携も即効性に疑問(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nft/21/042600012/052100036/

10年で求人数は約24倍、採用困難なセキュリティー人材を確保するには？(5/27)
https://xtech.nikkei.com/atcl/nxt/column/18/00577/051700074/

回線工事遅延を巡って泥沼の争い　SBの約108億円賠償は取り消し(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/052300156/

ウラノス・エコシステム（Ouranos Ecosystem）(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/052100169/

ソニー、ソフトバンクが成功事例　変革なき「我が社のDX」を正せ(5/27)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/052300166/
【GitHub Copilot Workspace】PRタイトルにプレフィックスを判断して付けさせるプロンプト

# やったこと
GitHub Issueのcommentに下記を追加

```md
- 作業内容に応じ、以下から適切なものを選択してPull Requestのタイトル先頭に付け加えること
\```
feat: A new feature
fix: A bug fix
docs: Documentation only changes
style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
refactor: A code change that neither fixes a bug nor adds a feature
perf: A code change that improves performance
test: Adding missing or correcting existing tests
chore: Changes to the build process or auxiliary tools and libraries such as documentation generation
\```
```

![スクリーンショット 2024-05-28 3.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/e88a7351-a28c-70f8-2488-7f3abcfc8ca1.png)


## 結果
プルリクのタイトルにプレフィックス（`feat: `）をつけてくれた
![スクリーンショット 2024-05-28 3.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188242/452248fc-5b83-1c93-0e88-724fb7fa85c6.png)
WordPressでiframeを埋め込んだらCSPエラーが発生した件

## はじめに
WordPressで作成したページにVimeoの動画を埋め込んだ際にContent Security Policy (CSP) エラーが発生したので、今回はそれについてまとめる。
CSPはセキュリティ対策の一環として重要だが、設定ミスや外部リソースの許可を適切に行わないとエラーが発生する。

## 問題点
以下のようなコードを追加して、Vimeoの動画を埋め込んだところ、以下のようなCSPエラーが発生しました。
```php
<div class="main__video-item">
  <div style="padding:56.25% 0 0 0;position:relative;">
    <iframe src="https://player.vimeo.com/video/{video_id}?h={hash_parameter}" width="{video_width}" height="{video_height}" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen　style="position:absolute;top:0;left:0;width:100%;height:100%;" title="〇〇"></iframe>
  </div>
  <script src="https://player.vimeo.com/api/player.js"></script>
</div>

```

発生したエラー：
```console
[Report Only] Refused to load the script 'https://***' because it violates the following Content Security Policy directive: "script-src 'none'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.
```
このエラーの原因は外部スクリプトの読み込みがCSPポリシーによりブロックされているためである。この問題を解決するためには、以下の手順でCSPポリシーを適切に設定する必要がある。

## 解決策
functions.phpに以下のコードを追加して、Vimeoのスクリプトを許可するCSPポリシーを設定する。
```php
// functions.php に追加するコード
function add_custom_csp_policy() {
    header("Content-Security-Policy: default-src 'self'; script-src 'self' https://player.vimeo.com https://f.vimeocdn.com 'unsafe-inline'; frame-src https://player.vimeo.com;");
}
add_action('send_headers', 'add_custom_csp_policy');

```
このコードは、https://player.vimeo.com と https://f.vimeocdn.com からのスクリプトを許可し、Vimeoの動画が正しく埋め込まれるようにします。

## 終わりに
今回は、WordPressでVimeoの動画を埋め込む際に発生するCSPエラーの解決方法についてまとめた。
Power Automate(クラウドフロー)で月初7営業日の計算を行う

はじめにPowerAutomate(クラウドフロー)では営業日判定を実現するようなアクションが
提供されていません（2024.05.28時点）。そのため、営業日計算を自前で実装する必要が
あり、備忘として記事にしました。:eyes:

本記事では、5月の7営業日「5/13」を算出します。


また「イベントの取得(V4)」はフィルタークエリーと並べ替え順で正しく取得できるか
どうかを検証しましたが、一部の祝日が正しく取得できない為、「イベントのカレンダー
ビューの取得(V3)」を使用する事としました。

## 構築手順

全体のフロー図は御覧の通りです。
　
![営業日判定1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/a288b437-2bd5-8814-d4b2-71cf65939790.png)

　
手順1：手順2の営業日判定で利用する変数を定義します。

![営業日判定2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/75b4bcd4-5d75-4731-7810-37f5640b5289.png)
　⓪トリガー　（※今回は検証のため手動でフローをトリガーするを利用しています）
　①実施年月を設定します。操作日の月初日を初期値とします。
　②日付（X営業日）カウンタを定義します。
　③営業日カウンタを定義します。
　④日付（X営業日）の月日を変数定義します。
　⑤日付（X営業日）の曜日を変数定義します。

　上記の変数定義ですが、後述の繰り返しの中で X=X++をしても足し算が繰り返されない為
 　X=X+Y ※Yの方をインクリメントする考え方になります。
  
手順2：日付の先頭から営業日判定（土日祝でない）を行います。
　営業日カウンタが目的の営業日になるまで繰り返します。

　![営業日判定3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/bfa50ba2-23eb-c157-8a27-e869b9545f34.png)
　⑥繰り返しの終了条件を設定します。

　⑦　「④日付（X営業日）の月日」に「①操作日の月初日」＋「②日付（X営業日）」を設定します。

```
formatDateTime(addDays(body('実施年月を取得し月初日を設定する'),variables('カウンタ')),'M/d')
```

　⑧　「⑤日付（X営業日）の曜日」も⑦と同じように設定します。

```
formatDateTime(addDays(body('実施年月を取得し月初日を設定する'),variables('カウンタ')),'ddd','ja-JP')
```

　⑨　「④日付（X営業日）の月日」を利用して祝日判定を行います。
 ※「イベントのカレンダービューの取得(V3)」で開始時刻と終了時刻に④を設定

　⑩　土日祝日の判定を行います。
 　　下記のいずれかを満たせば、土日祝日と判定
　　　・「⑤日付（X営業日）の曜日」が土である
　　　・「⑤日付（X営業日）の曜日」が日である
　　　・「⑨祝日判定」で戻り値が空　※祝日の場合、jsonが返却されます  
```
  length(body('祝日の判定').value)
```
　⑪　⑩で土日祝日でないと判断した場合に、「③営業日カウンタ」を増やします。 

手順3：
　⑫手順2の結果を出力します。

:::note info

テスト実施ですが、実行ログを参照しても良いですが、分かりやすいので投稿を利用しています。
 
![営業日判定4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/06b9f0c2-db53-ebd3-6649-b94ec24e7171.png)

![営業日判定5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264141/200b0a1b-c6c2-4e32-067f-0db19c91ed52.png)

:::

以上です。ご精読いただき、ありがとうございました。

---
PostProcessのBloomにアニメーションを付与する

# タイトル
PostProcessで光の強弱を表現するようなエフェクトをかける

#### 完成したもの↓
ランタン、屋台の明かりなどの元から明るい箇所を光らせるようなエフェクトをかけました
![作成物](https://i.gyazo.com/a2dcadc32e623444621805e19802d881.gif)

# 誰に向けた記事か
内容としてはほぼ備忘録です
PostProcessはじめたての人、簡単に↑のようなエフェクトをかけたい人へ

# 前提条件
まず以下の準備が整っていることを条件としています
- PostProcessのインストール
- DoTweenの簡単な知識

# Unity側の操作
まずエフェクトをかけたいカメラにPost-process Layer、Post-process Volumeをアタッチします。
カメラを分けないとオブジェクトすべてにエフェクトがかかってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/c3bbaa11-c31b-65e7-b377-2ee890186712.png)

次に↑で設定したカメラをエフェクトをかけたいオブジェクトのみを配置したCanvasのRender Cameraに設定します。
今回はこのCanvasの子にImageの背景を設定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/c6d67a30-ecde-644f-a096-15798505c86b.png)

次にInspectorのLayerからAddLayerを選択し、「PostProcessing」という名前のレイヤーを追加します。
これはエフェクトをかけたものを描画する際に他のオブジェクトとかぶらないためにレイヤーを分けるためです。
レイヤーの追加を行えたらカメラにアタッチしたPostProcessの設定をおこないます。
Post-process Layerの方はLayerを先ほど作成した「PostProcessing」に設定します。
Post-process VolumeはIsGlobalをtrueにし、Profileの欄で「New」をクリックして新しいプロファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/cb43316b-3d32-21c8-9a5b-407a27bd916f.png)

プロファイルを作成したらAdd effectでBloomを追加します。
今回は
- Intensity(光る度合い)
- Threshold(エフェクトをかける範囲)
- Color(何色に光らせるか)

の3つを設定します。この辺りは使う素材によって変わってくるのでてある程度は手当たり次第で色々いじってみるのが良いと思います。
ただColorの中にあるIntensityは1より大きくないとBloomのエフェクトがかからないので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/113f4141-cfcf-0e4d-5404-5d1eabf12de2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/78b90bdb-3829-4322-4bf1-4a181a5242fd.png)

今回はこのプロファイルの値をDoTweenで操作してアニメーションを付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272154/486a84ee-a4b8-e1a0-85e7-f0c544ef4d3d.png)

# アニメーションスクリプト
カメラにアタッチするスクリプトを書いていきます
以下はPostProcessのプロファイラのBloomのIntensityの値をDoTweenのYoyoでループさせることでアニメーションを付けています
```C#:Effect.cs
using DG.Tweening;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Rendering.PostProcessing;

public class Effect : MonoBehaviour
{
    [SerializeField]
    private PostProcessProfile m_PostProcessProfile = null;

    private static float fMinIntensity = 0.8f;
    private static float fMaxIntensity = 2.75f;

    private void Start()
    {
        var pSettings = m_PostProcessProfile.settings;
        var pBloom = pSettings.Where(x => x as Bloom).FirstOrDefault() as Bloom;
        pBloom.intensity.value = fMinIntensity;
        if (pBloom != default)
        {
            var pSequence = DOTween.Sequence();
            DOTween.To(() => pBloom.intensity.value, (x) => pBloom.intensity.value = x, fMaxIntensity, 1.75f).SetLoops(-1, LoopType.Yoyo);
        }
    }
}
```

# 参考資料

- [【Unity】Render Textureを使ってPost ProcessingをUIだけに適用する](https://qiita.com/Butterfly-Dream/items/9e76282dfab223722ee5 "【Unity】Render Textureを使ってPost ProcessingをUIだけに適用する")

# お借りした素材
- https://www.ac-illust.com/main/detail.php?id=22641641
(調査中)Spring MVCアプリケーションをデプロイした際に日本語が文字化けする問題

## 1. Mavenの設定
`<project.build.sourceEncoding>`プロパティを設定することで、プロジェクトのソースコードのエンコーディングを指定し、ビルドプロセス全体でエンコーディングが統一されるようにします。特に国際化対応や日本語を扱うプロジェクトでは重要です。

```xml
   <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
```

さらに、以下のように追加の設定をすることで、テストソースのエンコーディングも設定できます。


```xml
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
```

`<project.reporting.outputEncoding>`プロパティは、Mavenのレポート出力のエンコーディングを指定します。これにより、ビルドレポートやその他の生成物が正しくエンコードされるようになります。
（調査中)サーバー側とクライアント側のセキュリティ設定において、keystoreとtruststoreの役割と配置について

サーバー側とクライアント側のセキュリティ設定において、keystoreとtruststoreの役割と配置について説明します。

## keystoreとtruststoreの概要
#### keystore:

証明書と秘密鍵を格納する。
主にサーバー側で使用されるが、クライアント側でも必要に応じて使用される。
自分自身の証明書と秘密鍵を管理するためのストア。
#### truststore:

信頼する証明書を格納する。
クライアント側とサーバー側の両方で使用される。
他のエンティティ（サーバーやクライアント）の証明書を信頼するためのストア。
## サーバー側の設定
#### keystore
サーバーは自身の証明書と秘密鍵を使用してクライアントに対する認証を行うため、keystoreが必要です。

keystoreの作成には、通常以下のようなコマンドを使用します

```sh
keytool -genkeypair -alias server-alias -keyalg RSA -keysize 2048 -keystore server.keystore
```

#### truststore
サーバーがクライアント証明書を信頼する場合、または他のサーバーとの通信において相手の証明書を検証する必要がある場合、truststoreを使用します。

truststoreに証明書を追加する例:

```sh
keytool -importcert -alias ca-cert -file ca-cert.cer -keystore server.truststore
```

## クライアント側の設定

#### keystore
クライアントが自身を認証するための証明書と秘密鍵が必要な場合、keystoreを使用します。
クライアントのkeystoreの作成:

```sh
keytool -genkeypair -alias client-alias -keyalg RSA -keysize 2048 -keystore client.keystore
```

#### truststore
クライアントはサーバーの証明書を検証する必要があるため、truststoreが必要です。
サーバーの証明書を信頼するための証明書をtruststoreに追加する例

```sh
keytool -importcert -alias server-cert -file server-cert.cer -keystore client.truststore
```

## ファイルの配置
#### サーバー側のkeystoreとtruststore:

サーバーのアプリケーションがアクセス可能な場所に配置します。多くの場合、サーバーの設定ファイルでパスを指定します。
#### クライアント側のkeystoreとtruststore:

クライアントアプリケーションがアクセス可能な場所に配置します。Javaプログラムでシステムプロパティを使用してパスを指定します。
(ドット絵)「VGS-Zero」を勝手に応援2。スプライト


x arduinoは、あまり関係ない

目的
VDPがぐちゃぐちゃして、わかりずらいので図にしてみた


●　スプライト

動きのあるパターンをハードの力を借りて素早く表示する物?


●　スプライトパターン

あらかじめ、どこかに格納したスプライト毎のパターン
(なぞのペンギン)


図


![o_coq133.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ad33ad02-3db0-1de8-3d19-a5cfaadf714e.jpeg)



●　スプライトの表示位置

XとYで指定すると、勝手に描画してくれる。
(ドット絵)「VGS-Zero」を勝手に応援1。バックグランド


x arduinoは、あまり関係ない


(ドット絵)「VGS-Zero」を勝手に応援1。バックグランド




目的
VDPがぐちゃぐちゃして、わかりずらいので図にしてみた


●　ブロックの配置
(キャラクター、ネーム　テーブル、ブロック、タイルは、同じ)

30x24のテーブルがある(表示される広さと確保されている広さは、違う)


図

![o_coq131.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e9292fb2-15c6-9c25-51dc-13766e78368a.jpeg)



●　ブロックのパターン
(キャラクターパターン、キャラクタージェネレータパターン、
タイルパターン、ブロックパタンは、同じ)

8x8 で　16色が格納されている


図

![o_coq132.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8dc5826c-d678-aa5b-335a-c88447cd5d0e.jpeg)



●　アトリビュート(属性)
透過やブリンク?、パレットの情報

説明は、省略
【Flutter】Flutter web で404ページを表示(URLのPathの#google_vignetteに対応する)

## この記事で紹介すること

:::note info
Flutter WebでGoogle AdsenseやrefererなどでURLのパスに想定外のパスが入力された場合デフォルトで表示されるエラーページを変更する方法
:::

実際のデフォルトのエラーページがこのような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/9ca6f2a3-8f00-9c75-6821-42a7bb75296a.png)

ちょっとイケてないですよね……。

## 構築後のエラーページの例

実際に構築した私のサービスでのエラーページはこのような感じになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/2b1318d1-61c9-0567-ce43-28b07ec9dacc.png)


## 実装方法

### go_routerパッケージを使用した方法
私の場合、ルーティングには、[go_router](https://pub.dev/packages/go_router) パッケージを使用しているので以下のような書き方になります。

```dart

return GoRouter(
    navigatorKey: navigatorKey,
    debugLogDiagnostics: true,
    initialLocation: AppRoute.path,
    routes: $appRoutes,
    errorBuilder: (context, state) => const NotFoundPage(), //　ここを追加
  );

```

これで後はお好みのNotFoundPage Widgetを作成すれば、意図しないルーティングの場合、設定したページが表示されるようになります。

### 特にパッケージを使用しない場合での実装方法
特にパッケージを使用しない場合は、MaterialAppクラスの'onUnknownRoute'の引数を利用することで実装できます。

```dart
class MyApp extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      onGenerateRoute: (settings) {
        switch (settings.name) {
          case '/':
            return MaterialPageRoute(
              builder: (context) => HomePage(),
            );
        }
      },
      initialRoute: '/',
      // 以下のonUnknownRouteを追加
      onUnknownRoute: (RouteSettings settings) {
        return MaterialPageRoute(
          builder: (context) => const NotFoundPage(),
        );
      },
    );
  }
}

```

## 参考記事

https://medium.com/flutter/handling-404-page-not-found-error-in-flutter-731f5a9fba29

https://aboy-perry.hatenablog.com/entry/flutter-web-404
Pythonでの0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1  == 1.0 の結果は？

# はじめに
競プロの問題をPythonで解いているときに何気なくWhile文を使って書いていたら`とあること`が起きてしまった．

# 事象確認
Pythonで以下のようにコードを書いたとしよう．
```py
x = 0.0
while x != 1.0:
    print("OK")
    x += 0.1
```
OKは何回出力されるだろうか？

ではこの出力結果はどうか？
```py
0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1  == 1.0
```

一度結果と根拠を考えてからスクロールしてほしい，どのようになるかな？
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.


結論を言うと結果は以下のようになる．
OKの数は，
```
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
...
```
> ほんの一部分の出力にすぎません

```py
0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1  == 1.0
```
の結果は，

```
False
```

まあ記事のタイトル的に予想できただろう．OKは10回出力されるわけではなく無限ループが起きてしまった．また，0.1を10回足しても1.0ではないみたいだ．

なぜだろうか？

# 検証
強引に10回繰り返してみて`x`の値を確認してみる．
```py
x = 0.0
for _ in range(10):
    x += 0.1
print(x)
```
この出力結果は
```
0.9999999999999999
```
？？？　`1.0`にならない？？

# 理由
Pythonにおいて，浮動小数点数は一般的にIEEE 754倍精度浮動小数点数形式（64ビット）で表現される．この形式では，0.1を正確に表現することができない．0.1を2進数で表現すると，次のような無限循環小数になる．
```
0.1 (10進数) = 0.0001100110011001100110011001100110011001100110011... (2進数)
```
Pythonでは，この無限に続く2進数を64ビットの範囲で丸めて表現する．この丸めにより，わずかな誤差が発生する．
このような仕様により0.1を10回足しても1.0になるわけではないのだ．

:::note info
この問題の本質は`浮動小数点型の精度`にある．コンピュータにおける浮動小数点型の定義と計算をもう一度考え直してみるいい機会だと思う．
:::
# 解決策
>コメント欄から以下の解決策をいただきました．
>`引用元`@YottyPGさんのコメント

```py
from decimal import Decimal
x = Decimal('0.0')
for _ in range(10):
    x += Decimal('0.1')
print(x)
```
```
1.0
```
PythonのDecimalクラスを使用することで，正確な10進数の計算が可能になる．
浮動小数点値の0.1の代わりにDecimal('0.1')を使用することで，このコードでは10進数の精度で加算が行われることが保証される．Decimal('0.1')をxに加算するたびに正確に行われ，最終的な値は1.0になる．
Decimalクラスは，正確な10進数の計算が必要な場合に役立つ．

:::note info
浮動小数点数で発生する可能性のある丸め誤差や精度の問題を回避することができる．
:::


競プロの問題を解く際は浮動小数点型の表現に気をつけよう．