OmniAICreator/Qiita-1.07M huggingface dataset:
Webサイト制作におけるSVGの難点

## アジェンダ
SVG（Scalable Vector Graphics）は、解像度に依存せずに拡大・縮小できたり、モダンブラウザにも対応できているのであまり互換性を気にする必要性もなく(["SVG" | Can I use... Support tables for HTML5, CSS3, etc](https://caniuse.com/?search=SVG))、Webデザインにおいて非常に便利ですが、いくつかの難点があると思いましたので簡潔に備忘録としてまとめます。

## 1. デザインカンプからのダウンロード時のサイズ選択 
FaviconなどでSVGを使用する際、デザインカンプからSVGファイルをダウンロードする際に、希望のサイズを選べないことがよくあります。このため、特定の解像度に合わせて手動で調整する必要があります。

## 2. 複雑なSVGのパフォーマンス
複雑なデザインをSVGとして使用すると、描画に時間がかかり、ページの読み込み速度に影響を与える可能性があります。特にアニメーションや詳細な図形が含まれる場合、パフォーマンスに注意が必要です。

## 3. ファイルサイズの最適化
高解像度のビットマップ画像に比べると、SVGは小さなファイルサイズで済む場合が多いですが、不要なメタデータや複雑なパスが含まれると、逆にファイルサイズが大きくなることがあります。そのため、最適化ツールを使って軽量化することが推奨されます。

## 参考
上記、2と3に関しては、以下の記事にも記載があります。

https://deep-space.blue/web/2166
[CPU] CPUの構成

# 一覧
|CPU構成||
|:--|:--|
|制御装置|主記憶のプログラム命令を解読し、各装置を制御する|
|演算装置|制御装置の指示により、算術演算、論理演算、比較を行う|
|レジスタ|小容量・高速な記憶装置|

|レジスタ||
|:--|:--|
|プログラムカウンタ|**次に呼び出す**機械語命令が格納されるアドレス|
|命令レジスタ|主記憶から呼び出した機械語命令が格納されるアドレス|
|汎用レジスタ|データや演算結果が一時的に格納されるアドレス|
|スタックポインタ|サブルーチン呼び出し後に、戻り先アドレス等を格納する|

# Image
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/ea777cf5-5b1f-e60e-91e5-7b52c1fa43f8.png)



# Appendix
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/190f50d7-512d-1515-c767-ed919c2eff9c.png)


# 参考リンク
- [令和2秋8](https://www.ap-siken.com/kakomon/02_aki/q8.html)
- [コンピュータ構成要素](https://masassiah.web.fc2.com/contents/20ap/note03.html)
RPCエンドポイントを利用してウォレットを実装してみる　＃１残高表示

# テーマ設定
RPCエンドポイントを利用してウォレットの残高表示機能を実装してみる。

# 前提環境
+ Node.js がインストールされている。
+ Web3.js ライブラリがインストールされている。

+ RPCエンドポイントを取得（無料）
https://cabinet-node.com/ja/docs/user-guide/create-access-token

### web3のインストール
```bash
npm install web3
```

# 実装
以下の内容でget_balance.jsファイルを作成してください。
 ```js
const Web3 = require('web3');

// RPCエンドポイント
const rpcURL = 'https://gateway-api.cabinet-node.com/{access_token}'; // 上記の前提環境で取得したもの
const web3 = new Web3(new Web3.providers.HttpProvider(rpcURL));

// ウォレットのアドレス
const walletAddress = 'YOUR_WALLET_ADDRESS';

// ウォレットの残高を取得する関数
async function getBalance() {
    try {
        const balance = await web3.eth.getBalance(walletAddress);
        console.log('Balance in Wei:', balance);
        console.log('Balance in Ether:', web3.utils.fromWei(balance, 'ether'));
    } catch (error) {
        console.error('Error getting balance:', error);
    }
}

getBalance();
 ```

 # 実行
  ```
node get_balance.js
  ```

### 結果の例

```
Balance in Wei: 1562887683000n
Balance in Ether: 0.000001562887683
```
git pushを小分けにして、最大アップロードサイズ制限を回避するワンライナー

githubからgitlabへの以降などで大量のコミットをpushしようとするとアップロードサイズの制限に引っ掛かる場合があります。以下は200MB以上を一度にアップロードできない場合の出力例を示します
```shell-session
$ git push -u origin
Enumerating objects: 42153, done.
Counting objects: 100% (42153/42153), done.
Delta compression using up to 12 threads
Compressing objects: 100% (14835/14835), done.
remote: fatal: pack exceeds maximum allowed size (200.00 MiB)
...
```
この場合数百コミットごとにpushすることでこのエラーを回避できます。
masterブランチをおよそ256コミットずつコミットする方法を示します
```
git log --pretty=format:"%H" --reverse | grep -e "^00" | xargs -IX git push -u origin X:refs/heads/master
git push origin --all
```

- git log --pretty=format:"%H" --reverse

これはコミットハッシュを最古から順に一行ずつ表示します。

- grep -e "^00"

これは標準入力を一行ずつ精査し約256個に1個のコミットを通します。確率的に256コミットに1つはコミットのハッシュ値が00から始まります。

- xargs -IX git push -u origin X:refs/heads/master

通されたコミットハッシュまでをmasterブランチにコミットしています

- git push origin --all

残留コミットをすべてpushします。

## 最後に

もっといい方法があれば記事をアップデートします。
コメントいただければ嬉しいです。

#### 〆

貴方の御用のためにお使いください
Next.js+supabaseで商品成分サーチアプリを作ってみた話４（CSS）

※初心者のため、間違いや何かご存じの方がいましたら、教えていただけると助かります。

# 作ったもの
https://keshohin-seibun.vercel.app/

# 概要
取得データから、テーブルセルに値が表示されるが、値だけではユーザーがわかりにくいため、以下のように、値によって色付けするようにした。
![css色付け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3225872/155916dc-4b98-5371-0f72-bdb405373a28.png)



### 環境
windows11
docker-desktop
Next.js(app routerを使用)
supabase
ホスティング：Vercel

## 内容
１. cssファイルに以下のclassを用意。
```css
.pink {
    background-color: pink !important;
}

.red {
    background-color: palevioletred !important;
}

.light-green {
    background-color: rgb(178, 235, 178) !important;
}

.green {
    background-color: greenyellow !important;
}
```

２. page.tsxで、上記cssをimport

３. page.tsxに以下のgetClassName(名前はなんでもよい。)を追記。なお、'light-green'はハイフン（-）が含まれているため、styles['light-green']としている。
```tsx
const getClassName = (value: string) => {
        switch (value) {
            case '2':
                return styles.pink;
            case '3':
                return styles.red;
            case '-2':
                return styles['light-green'];
            case '-3':
                return styles.green;
            default:
                return '';
        }
    };
```

４. データセルのclassNameから、上記のgetClassNameを呼び出す。このとき、引数にセルに入るデータ値を渡すことで、３.の条件分岐にあったclassNameが適用されるようになる。
```tsx
<tr key={ingredient.id}>
    <td className={getClassName(ingredient.absorp)} >{ingredient.absorp}</td>
    <td className={getClassName(ingredient.risk)} >{ingredient.risk}</td>
    <td className={getClassName(ingredient.environmental)} >
        {ingredient.environmental}
    </td>
</tr>
```

## まとめ
MySQLやPostgreSQLなどのデータベースは、データ値を扱うことはできるが、エクセルやスプレッドシートと違って、そのままブラウザに表示してもユーザーには見にくい。（比較するものではないと思うが。エクセルなどでは、「条件付き書式」があり、セルを見やすくするのは簡単。）
そこで、CSSでセルに色付けをすることとした。
データを表示する際は、値だけではなく、「ユーザーが直感的に見やすいか」を軸に表示するように努めていきたい。

この４回までで、アプリ作成の詳細は省くが、今回アプリを作るうちに今後使えそうな機能をまとめた。

今回データベースとしてsupabaseを用いたが、このアプリを「非エンジニア」に渡したとしても、データの管理がしにくいと思われる。
そこで、次はgoogleスプレッドシートをデータベースみたいに使うアプリを考えている。（まだ構想段階。）
スプレッドシートであれば、「非エンジニア」であっても、データ操作が比較的管理しやすいはず。
これから勉強するため、しばし投稿をお待ちください。


<br/>

https://qiita.com/yassyjk/items/39406ae25376b7d64c71

https://qiita.com/yassyjk/items/0f7ad40e9116977c961b

https://qiita.com/yassyjk/items/40ab731c65c0930db905
CCPMの考え方とリファクタリングの共通事項

# 変化するクリティカルチェーン
プロジェクトを進めていく中で、ボトルネックが変化するのと同じメカニズムで、クリティカルチェーンも変化するので、その長さも変動していく。

変化前の優先度の高いタスクが、クリティカルチェーンが変化後は優先度が低くなっているなんてことはざらに発生する。

この時にずっと過去のボトルネックと向き合っていると、
あまり全体最適に結びつかないタスクをこなしていることになり、
コストの無駄遣いになってしまうので、
バッファ傾向グラフをモニタリングしながら最新の優先度のものに向き合う。

クリティカルチェーンの長さが長くなるとバッファ傾向グラフ上では、
プロジェクト進捗率が減少し、バッファを増やしたわけではないので、
バッファ消費率は増加してしまう。

よって、新しいタスクが積まれたりした際には、
再度クリティカルチェーンはどこなのか？ということと、
バッファ傾向グラフをモニタリングして、正しい制約の位置を特定することに励む。

# 似たような現象
ソフトウェア開発でも同じようなメカニズムの現象がある。

過去のリファクタリング個所をずっとやり続けていたら、それは負債の解消活動として貢献になっていない。
優先度の高い箇所(コンポーネントXと呼ぶ)、負債を最も生み出しているような箇所に対する
リファクタリングを行う。
すると今度は別のボトルネック箇所(コンポーネントYと呼ぶ)が発生する。

この時に、ボトルネックの位置が変わっていないと妄信して、
その部分のリファクタリングを行い続けても、
負債はたいして解消されず、逆にコストだけがかかっている状況を作り出す。

CCPMはプロジェクト進捗上のリファクタリングといっても過言ではないかもしれない。

# タスクの分割理由
ボトルネックの解消以外にも、タスクの構造を見直す活動もある。
たとえばその1つとして、タスクの分割などだ。

分割する理由として、以下の例を列挙する。

## 依存していない部分は分ける
初期段階で、以下の図のようにタスクA←タスクBという依存関係があったとする。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781175/926eda7e-a0cb-7551-869f-6a553d51b4b0.png" width=70%>

プロジェクトを進めていく中で、実はタスクAの一部分にしか依存していない、ということが判明したとする。
その場合には、依存していない部分は下図のように分割してあげる。

:::note warn
これらの改善活動は、必ず新しいタスクを積み上げる前に行うことが推奨。
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781175/7239a021-7511-21ed-cf2f-90abe8025408.png" width=70%>

### 設計原則と照らし合わせると
参照していない機能群は分割せよという、インターフェイス分離などの原則に近いものがある。
もしもタスクA1とA2とに分けなかったら次のような脅威が起こりうる。

分割していなかったとしたら、
タスクAの中のタスクA2部分に変更が入った際や、
タスクA2部分に遅延が発生した際にまで、
後続のタスクBがその影響を受けてしまう。

図程度の簡単な場合ならまだいいが、
もしもタスクBに依存した他のタスクが後続にあれば、
その影響リスクはどんどん跳ね上がる。

依存していないはずのものの影響を受けてしまうのは、設計原則的にも問題ありである。

:::note warn
分割しないままであった際のリスクなどをソフトウェア設計の時と同様にして考察し、メリットが上回ると考えられたら分割する。
:::

## 粒度が大きいから分ける
稼働している中で、タスク粒度が大きいことが判明したら、
タスクの高凝集疎結合を意識しながら分割する。

# タスクの削る作業
ODSCに貢献しないようなタスクは振り返りの中で削ってしまうこともある。
上記の説明のように、分割することはあっても、
統合したりすることは実際にはあまりない。
もともと1つのタスクの粒度感を2～10日程度で設計しているので、
変に統合したりすると、タスクの粒度を見誤る可能性が高いからだと思われる。

## 個人の考察
BPRのECRS原則をこのタスクの再設計の考え方に適用できるのでは？
と考えている。

その仮説では、まずはタスクの追加や分割などを考える前に、
いったん振り返りの段階で、削れる無駄なタスクはあっただろうか？
という分析を行って、削れそうなタスクを明らかにし、
ネットワーク図から削ってしまう。
複雑になればメンテコストが跳ね上がるので、この削る作業は各振り返りで行った方がいいと思われる。

そのうえで分割できるような箇所を探し、
次にRの段階で、タスクの割当先を変えた方がスムーズではないか？
を考察する。
次にタスク内容を簡素化できないか？とECRSの順番に沿って考えた上で、
タスクの追加積み上げを行う　という手順を踏む。

### 統合が求められるであろうケース
以下は完全に単なる予想です。

実際にプロジェクトを進めていく中で、あるタスクの一部が
別のコンテキストのタスクの方に分類された方がいいと判明したとする。
その場合には、いったん分割したうえで、適切なコンテキストの方に
配置しなおす必要がある。
分割された単位が短い期間のものであれば、移動した先の関係性が密な別タスクと統合してもいい可能性がある。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781175/9ae6fc67-2c30-b489-bc93-7ef04b661beb.png" width=70%>

たとえば上手でいうと、分割したタスクA1が、実は別のコンテキストbの方に配置した方がいいと判明した際に、たとえばタスクCと密結合していて、
かつタスク期間が短い場合には、タスクA1とタスクCを統合してしまうということ。

これはソフトウェアでいうところのクラスなどのモジュールを
別のパッケージに配置しなおすリファクタリング作業と非常に似ている。
Microsoft 365 Enterpriseライセンスを整理してみた

:::note warn
注意
こちらの記事はMS公式情報を基にしておりますが、個人の理解に基づいており、情報の正確性は保証出来ません。
あくまで参照のためとなりますので、参照者個人の責任の元ご活用下さい。
:::

# 整理したみた結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472352/9ba1fb06-c5b9-575d-9983-d14cb4c1db0a.png)

上記の各ライセンス間の枠をよくみると、以下の相関関係があることがわかった。
* M365 E3は基本的に同じカテゴリでPlan1と2に分かれる場合を除き、全てM365 E5に含まれる。
* EMS E5はEMS E3を補完する形でM365 E5 SecurityとComplianceから一部機能を切り抜いているため、M365 E5 SecurityとComplianceに含まれている。
* M365 E5 = M365アプリ ＋ Windows11 ＋ 基本的なセキュリティ ＋ EMS E3 ＋ EMS E5 ＋ Microsoft 365 E5 Security ＋ Microsoft 365 E5 Compliance ＋ Power BI ProなどM365 E5独自の機能
以下のようなイメージとなる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3472352/a412bc7c-15bd-bedb-a50a-d2a25a0e541f.png)


:::note info
情報
参照元MS公式情報(20240801時点)：https://go.microsoft.com/fwlink/p/?LinkID=2139145&clcid=0x411&culture=ja-jp&country=jp
:::



# ラインセスを選択する際の考え方についての自分なりの解釈
<table>
  <tr>
    <td> <strong>Microsoft 365 E3(M365 E3)</strong> </td> <td>M365アプリ機能とWindow11、基本的なセキュリティでよい場合</td>
  </tr>
  <tr>
    <td> <strong>Enterprise Mobility + Security E3(EMS E3)</strong> </td> <td>M365 E3のセキュリティをさらに高めたい場合</td>
  </tr>
 <tr>
    <td> <strong>Enterprise Mobility + Security E5(EMS E5)</strong> </td> <td>M365 E3のセキュリティをコンプライアンスを含めてさらに高めたい場合</td>
  </tr>
  <tr>
              <td> <strong>Microsoft 365 E5(M365 E5)</strong> </td> <td>ゼロトラストセキュリティを実現するために必要なクラウド保護、ID 保護やEDRなど高度なセキュリティ対策機能や充実したコンプライアンスの機能を求めている場合</td>
  </tr>
</table>
[スレッド] Berachefコントラクトの詳細解説 [Berachain翻訳]


:::note info
本記事は下記の翻訳となります。
[『[Thread] Berachef contract walk-through』](https://blog.berachain.com/blog/thread-berachef-contract-walk-through-2)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/db659569-f7de-5ce5-2165-af5b58d07f0a.png)

> Berachain では、バリデーターはブロック構築の報酬を Rewards Vaults を通じて dapps に直接配分しなければなりません。バリデーターは「カッティングボード」を通じて、どの vaults にどの比率で報酬を配分するかを選択します。
> スマートコントラクトレベルでこの仕組みがどのように機能するか、詳しく見ていきましょう 👇

https://x.com/camiinthisthang/status/1818739046358888862

> バリデーターは BGT ステーションでこの仕組みを裏で使用し、BGT の配分方法を設定します。円グラフをイメージしてください。各セクションが全体に対する割合を表し、それぞれのセクションが報酬の vault に対応しています。
> 例はこちらでご覧いただけます - https://t.co/dwtNiS0CHy pic.twitter.com/yyexXzn4Iz

https://x.com/camiinthisthang/status/1818739104580092241

> カッティングボードを更新するには、`queueNewCuttingBoard` 関数が呼び出されます。これにより、新しいカッティングボードが有効になるまでの遅延が設定されます。
> これにより、バリデーターの設定があまり頻繁に変更されないようになり、より予測可能性が高まります。 pic.twitter.com/Q2DQP4XikF

https://x.com/camiinthisthang/status/1818739165330391552

> また、カッティングボードを表す `CuttingBoard` struct（構造体）があります。これには、このカッティングボードが有効になるブロックと、先ほど見た Weights struct の配列が含まれています。 pic.twitter.com/8aANqbQX2j

https://x.com/camiinthisthang/status/1818739225174622310

> 読者の皆様へ：rewards vaults が gauge と呼ばれているのをご覧になったかもしれません。近々、より分かりやすくするために、ドキュメントと UI を更新して rewards vaults という表現に統一する予定です。

> Proof of Liquidity のコントラクトについて詳しくは、このスレッドをチェックしてください！

https://x.com/camiinthisthang/status/1818739685281481008

---

---

:::note info
【Sunrise とは】
Sunrise は Proof of Liquidity(PoL)と Fee Abstraction（手数料抽象化）を備えたデータ可用性レイヤーです。 私たちは DA の体験を再構築し、多様なエコシステムからのモジュラー型流動性を活用してロールアップを立ち上げています。

- [Sunrise - Specialized DA Layer for Proof of Liquidity](https://sunriselayer.io/)
- [Sunrise / Gluon Docs](https://docs.sunriselayer.io/)

【Social Links】

- [X(旧 Twitter)[英語])](https://twitter.com/SunriseLayer)
- [X(旧 Twitter)[日本語])](https://twitter.com/SunriseLayer)
- [Discord Community](https://discord.com/invite/sunrise)
- [Medium](https://sunriselayer.medium.com/)
- [Github](https://github.com/sunriselayer)
- [Linkedin](https://www.linkedin.com/company/sunriselayer)

【お問合せ】
Sunrise へのお問い合わせはこちらから 👉 [Google Form](https://forms.gle/h8RVahxRtXUvYwnv6)

![1080x360.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839047/8971d83b-3331-4757-dc72-320d28618735.jpeg)

:::
Bubble.io - Discord bot のメッセージ投稿

設定画面はこんな感じ
![スクリーンショット 2024-09-11 16.58.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47236/73e52a07-08c9-7ea3-83e4-093134bcc0bd.png)
これを送ると
![スクリーンショット 2024-09-11 16.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47236/33cb4803-001f-ca6d-c4b4-a6fec34aa4d0.png)

embedの内容は[ここ](https://leovoel.github.io/embed-visualizer/)や[ここ](https://discordjs.guide/popular-topics/embeds.html#embed-preview)に詳しく書いてあります！

画像が小さくていい場合は thumbmailにすると○
``` xml
"thumbnail": {"url": "<thumbmail>"},
```
webdeveloper bootcamp 非同期処理

書いてあることはあくまで自分が理解するためのイメージです。正しくありません。

# 非同期処理とは
同期処理:タスクA、タスクBが順に実行される。
非同期処理:タスクAの実行を他に一度任せてタスクBから実行できる。

# コールバック関数
関数に引数として渡される関数のことをコールバック関数と呼ぶ。

## コールスタックとタスクキュー
- コールスタック:逐次処理(同期処理)の待合室。実行開始に伴いpush,実行終了に伴いpopが起こる。
- 実行時に非同期処理の物はタスクキューに送られる。
- タスクキュー:非同期処理の待合室。タスクキューの中のものはコールスタックが空になるとコールスタックへと返される＆実行される。

# setTimeout
- 非同期処理を行える。つまり中の関数をタスクキューに送れる。
- setTimeout(関数,時間)と記述し実行終了から表示まで時間を置く。
- setTimeout(タスクA);タスクB;とすることによってタスクBを先に実行できる(非同期処理)。
- 
`` 関数１{setTimeout(関数２,1000);関数３;} 関数4{} ``
だと実行順は
- 関数１がコールスタックにpush(実行開始)
- 関数１内の関数２がタスクキューに渡される。
- 関数３が実行開始&終了
- 関数１がコールスタックからpop(実行終了)
- 関数４が実行開始&終了
- 関数２がコールスタックに帰ってくる。
- 関数２が実行される。

結果:関数３→(関数１)→関数４→関数２の順で実行される。

### コールバック地獄
関数４→２→３の順で実行したいとする。
`` 関数１{setTimeout(関数２;関数３,1000)} 関数4 ``

または１秒刻みで出力したい場合

``` 関数１{setTimeout(関数４(setTimeout(関数２;setTimeout(関数３,1000),1000),1000)} ```

となるがネストが深すぎて読みずらい→コールバック地獄

# promise
- setTimeoutで任せたタスクAが終わり次第実行してほしいタスクBがあったとする。上のコールバック地獄のような例でも実行可能だが、promiseを使うとスマートに書ける。
- promise内のコールバック関数には引数としてresolve,rejectが渡される
- コールバック関数はresolve()またはreject()を実行する。
- プロミスがresolve状態のとき→promise.then(関数B)
- プロミスがreject状態のとき→promise.catch(関数B)
- 関数Bの引数にはresolve(),reject()内の引数が渡される。


``` promise((reject,resolve) => {setTimeout(関数A,2000});resolve();)```
```promise.then(関数B)```

- setTimeoutは非同期処理なので関数Aがタスクキューに投げられる。
- ２秒後に関数Aがコールスタックに帰ってきて実行される。
- resolveが実行される
- promiseオブジェクトはresolve状態なのでthenに処理が進む


明日はpromise.async,awaitまとめる
Django Adminにてレスポンスが遅い場合に確認すること

## 原因
該当のテーブルが外部キーを設定していた。
これによって出力時に1件ずつ抽出していたため、レスポンスが遅くなっていた。
この場合は、list_select_relatedを設定する必要がある。

```python:admin.py
list_select_related = ("cilent_id",)
```
## まとめ
大量のデータ表示でないと、意外と気づかないかもしれない。ログを注視すれば何度もSELECTしていることが確認できます。
VBA保守効率を上げるテクニック Enum 列挙型 列番号の指定

## 前置き
自分は製造メーカーの情報部門で社内向けにVBAを使った開発をしています。
VBAで作るものは、ツール、Excel自動化、DBからExcelへデータ抽出などです。

## 問題点
社内向けに開発を行うと、ユーザーとの距離が近いせいか追加要求が頻繁に飛んできます。
ホントは、企画要件定義段階で仕様を固めたいのですが、あまり強く言ってしまうと現場からのツール化ハードルが高くなってしまってツール化・自動化が進まない恐れもあります。
要件定義をキッチリ行うことも重要なのですが、ここでは追加要求に対処するコードの書き方を記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/03876e2c-9a01-a5f0-5c48-017445f4c030.png)
## 現場からの追加要求
### 列項目の追加　&　列項目の変更
これがくると、苦労されるのではないしょうか。

サンプルプログラムです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/f318fce0-1c64-7782-ed16-5b7789c0c264.png)


CheckThicknessは私が作った関数で、意味は理解しなくて大丈夫です。引数にしている4,5なのですが、これは列番号です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/4f407590-71cb-de6a-5185-087ca17d33e1.png)

CheckThicknessは引数で受け取った列番号を処理して何をするマクロです。
この列指定方法は悪い例で、例えばユーザー側から、1列目に新たに列を挿入したい。という要望がくると、CheckThicknessが処理したい列番号は自然と+1されてしまい、↑の画像では4を5に。5を6に。計6か所の修正が入ります。
6ヵ所だけならばいいのですが、列を挿入したワークシートに関係しているマクロすべてをチェックしなければいけません。

#### 今回は変更を一度で済ませる列番号の指定方法についてお伝えします。
列番号を指定するときは、Enumを使ってください。
Enum：列挙型とも呼ばれます
使用例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/537c4e63-62cd-1b91-031d-a7b10734c1e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/a783d3ea-dc9a-c9d7-b23b-d505b6a6a748.png)
定数の宣言にてEnumを記述しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/7c361753-4ff7-808a-1a8d-4693741ba011.png)
意味は、
列.日付には1が入ります。　
列.商品名には2が入ります。
列.売上には3が入ります。　...
Enum列に列番号はが入るということですね。
enumは定数という扱いになっていて、モジュールの中で値を入れることはできません。

個数の右に販売日付の列を挿入したいとき。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/50be7021-0eff-45de-2961-0bfe868c4224.png)
(マクロ)列番号の変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882753/0a3a8d62-abc1-c9ae-b6cd-ffdb82ee85ec.png)
Enumの個数の下に販売日付を入れてあげればOK。
列.販売日付=6
列.利益=7
となり、ワークシートの変更に合わせてEnumの変更のみで保守完了します。ラクチンです。
DjangoのManyToManyフィールドをCharFieldで入力する

### 前置き
恐らくこの記事を見ている方は僕と同じ「ManyToManyFieldを直接formで使いたい」と思っている方でしょう。
そんな方に向けてどう対処するかを自分なりにまとめてみました。

### ManyToManyFieldを直接formで使うとどうなる？

その前に、まずはモデル構造から見ていきましょう。
今回は記事とタグの多対多での関係になります。

###### models.py
```
タグモデル
class Tag(models.Model):
    slug = models.CharField(verbose_name='SLUG', unique=True, max_length=20, primary_key=True)
    name = models.CharField(verbose_name='タグ名', unique=True, max_length=20)
    created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True)
    updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True)

記事モデル
class Article(models.Model):
    title = models.CharField(verbose_name='タイトル', default='タイトルです。', max_length=30, null=False, blank=False)
    text = models.TextField(verbose_name='テキスト', default='テキストです。', max_length=255, null=False, blank=False)
    author = models.ForeignKey(get_user_model(), verbose_name='作成者', on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag, verbose_name='タグ', related_name='articles')
    created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True)
    updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True)
```
記事モデルとタグモデルは多対多の関係なので、中間テーブルを作成する必要があります。
ですが、DjangoではManyToManyFieldを使うと自動で中間テーブルを作成してくれます。なんと便利なんでしょうか。

で、そのままManyToManyFieldを使ってみました。

###### forms.py
```
class ArticleNewForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = {
            'title',
            'text',
            'tags, #tagsがManyToManyFieldに設定したもの
        }
```

こうするとどうなるかと言うと、

ManyToManyFieldを定義したとき、それをそのまま継承してModelFormを作成すると```ModelChoiceField```が設定されます

なので、formのエラー（errors）を吐かせるとこんな感じで怒られます。

```
正しく選択してください。 〇〇は候補にありません。
```

じゃあどうするかって言うと、もうやけくそになってCharFieldを作ってしまえ！！って感じですね。笑

### CharFieldの作成

先ほどのforms.pyにforms.CharFieldを作成していきます。

###### 修正したforms.py

```
class ArticleNewForm(forms.ModelForm):
    # 追加
    tags = forms.CharField(label="タグ", max_length=〇〇)

    class Meta:
        model = Article
        fields = {
            'title',
            'text',
            'tags, #こいつは消す
        }
```

こうすることで```cleaned_data['tags']```で入力した値を取得できます。
あとはいつも通りに使えば解決ですね。


### まとめ（タグの場合）

・ManyToManyFieldをそのままModelFormのfieldsに書き込むと```ModelChoiceField```が設定される

・forms.CharFieldにて新たにtagsを定義し、feildsの中のtagsを消す

・forms.CharFieldのデータをcleaned_data['tags']で取得する




### 参考記事

https://zenn.dev/cococig/articles/d3374aa8fd70b0
自宅サーバって難しい？初心者が始めるサーバ構築！

## はじめまして！！
某企業でインフラエンジニアとして働いている、しらと申します。
IT業界に来てまだ三年目のひよっこです :runner_tone1:
業務ではAIXサーバの保守・運用を担当しています。

### はじめた目的
Qiitaを始めた理由は、今回趣味で自宅サーバを構築するにあたり、
自分がやってきたことの記録を残したいと思ったからです！
他にも、日々の学習で得たことをシェアしていきたいと考えています。


### どうしてサーバを作るのか:sunny:
ファイルサーバがほしい… ゲーム用のサーバがほしい… などいろいろありますが、
一番の理由は、インフラエンジニアとしてOSやネットワークの実践的な知識を身につけたいからです！
セキュリティについてもまだまだ知識がないので、学びながら設定していきたいと思っています。

### 今後について
実はサーバに使うパーツはほぼ決まっています！
（ただ、ちょうどいいケースがまだ見つかっていないんですが…）
パーツの構成や使用するOSが決まったら、また記事にしていきます！

### 最後に
エンジニアとしてまだまだ未熟なので、アドバイスなどがあればコメントで教えていただけると嬉しいです（泣）
これからよろしくお願いします！
App Sheetのカテゴリー和訳

新規でアプリを作るときにカテゴリーを選択しなくちゃいけないんだけど、
英語がわからなくて、いつも「Other」しか選択していないので
ChatGPTに和訳してもらったよ。

未来の自分に向けてメモしとく。

* Field Service: フィールドサービス
* Inspections & Surveys: 検査および調査
* Property Management: プロパティ管理
* Inventory Management: 在庫管理
* Customer Engagement: 顧客エンゲージメント
* Sales & CRM: 販売およびCRM
* Planning & Project Management: 計画およびプロジェクト管理
* Human Resources: 人事
* Education & Training: 教育および訓練
* Marketing: マーケティング
* Legal: 法務
* Accounting: 会計
* Manufacturing: 製造
* Operations: オペレーション
* Procurement: 調達
* Logistics: ロジスティクス
* E-Commerce: Eコマース
* Maintenance: メンテナンス
* Production: 生産
* Quality Management: 品質管理
* Administration: 管理
* Health, Safety and Environment: 健康、安全、環境
* Productivity: 生産性
* Personal/Fun: 個人／娯楽
* Other: その他
[T-DASH] 条件を満たしたとき、テストケースを途中で終了し、次のテストケースに移す

# Outline

テストケースにおいて、ある一定条件を満たしたとき、そのテストケースを中断してそれ以降のテスト実行をパスしたい。ただし、後続するテストケースを実行させたい場合がある。

たとえば、商品購入のテストケースで、在庫の概念があるとする。

テストケース１

1. 対象商品を検索する
2. 商品が存在しない場合、以降実行を行わない <font color=red><- 条件に応じて後続処理を判断</font>
3. 商品購入をする

テストケース２
テストケース３
　：


https://service.valtes.co.jp/t-dash/?qiita

# 技術的な情報

robot framework のseleniumのkeywordsを用いる

https://robotframework.org/SeleniumLibrary/SeleniumLibrary.html

## 要素があるかどうかのステータスを取得する

まず最初に、要素があるかどうかを検証し、あるばあいTrue、ないばあいFalseの値を取得する。
"Run Keyword And Return Status"と"Element Should Be Visible"の２つのkeywordsを用いる。

以下はlocatorが${location}の要素の存在有無をTrue/Falseで返すものである

```
${DOES_ELEMENT_EXIST} =	Run Keyword And Return Status	Element Should Be Visible	${location}
```

## テストケースを途中で中断する

"Pass Execution If"のkeywordsを用いる。
先ほどの存在有無のステータスをチェックする条件文をいれて、この条件文が成立する場合、 'message'のログを残して、後続の処理を行わず日本テストケースを終了する。
条件を満たさない場合は、処理を継続する。

```
Pass Execution If	'${DOES_ELEMENT_EXIST}'=='True'	  'message'
```


# T-DASHの手順

## カスタム動作

以下設定内容を TestContro.yamlのファイル名で保存する

```
ACT-CAT-CUSTOM-5c3fa408-54eb-48d4-80ca-0f50c7bc2766:
  action_category_name: TestContro
  icon: ''
  color: '#df1a9a'
  custom_data:
    file_name: TestControl
    pip_list: []
    library_list: []
  actions:
    ACT-CUSTOM-bd74caa0-ab0f-4663-8b81-37abf92ca53f:
      action_name: 要素が存在する場合、処理を中断して次のテストケースにPASSする
      action_type: operation
      action_format: 「画面名」「要素名」が存在する場合、処理を中断して次のテストケースにPASSする
      action_note: ''
      action_args:
      - screen
      - element
      action_def:
      - - ${DOES_ELEMENT_EXIST} =
        - Run Keyword And Return Status
        - Element Should Be Visible
        - ${location}
      - - Log
        - '${DOES_ELEMENT_EXIST} '
      - - Pass Execution If
        - '''${DOES_ELEMENT_EXIST}''==''True'''
        - pass execution
      - - Log
        - Continune Test

```

次に、作成された TestContro.yamlをT-DASHの動作定義 -> カスタム動作 -> カスタム動作をインポート にてインポートする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/dfb04211-eccd-8087-aae8-1beffd7aea4c.png)

このカスタム動作の引数として、存在有無をチェックする画面要素になります。

## スクリプト

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/41343f1d-29c2-9ff8-db5d-76278f4e9b5b.png)

## 実行結果

「対象商品」が存在するときのテスト実行結果である。
ログのように、要素が存在するため、以降のテスト（「対象商品」の要素をクリックするなど）は実行されない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/2f124764-411a-9a89-a258-0b5cf4155205.png)
Discord.jsで、特定の権限を持っている人にしか表示しないコマンドの実装方法

こんにちは、りょうです。
さっきBOTのアプデ中に調べてたら出てきたので共有。

## 実装

```ban.js
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js');

const data = new SlashCommandBuilder()
	.setName('ban')
	.setDescription('ユーザーのBAN')
	.addUserOption(option =>
		option
			.setName('target')
			.setDescription('BANするユーザー')
			.setRequired(true))
	.setDefaultMemberPermissions(PermissionFlagsBits.BanMembers);
 
    // この後はいつも通り
```
このように設定しておくと指定した権限をもったユーザーにしかコマンドが表示されなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3818367/63375865-9cf9-7573-a2ef-8e54434c7f36.png)

## 各部解説
```js
const { SlashCommandBuilder, PermissionFlagsBits } = require('discord.js');
// コマンド名とかの設定はふだんどおり
```
このコマンドの実装には **`.setDefauldMemberPermissions`** を使用します。
そのため、`PermissionsFlagsBits`をインポートするのを忘れないようにしてください。

```js
	.setDefaultMemberPermissions(PermissionFlagsBits.BanMembers);
```
これで実行させたい権限を設定します。(この場合はBAN権限)
また、複数の権限を設定したい場合はOR演算子を使用して設定します
```js
	.setDefaultMemberPermissions(PermissionFlagsBits.BanMembers | PermissionFlagsBits.KickMembers
);
```
こうすることでBAN権限もしくはキック権限を持っている場合に実行できるようになります。

こっちにも別で書いてるんでぜひ

https://qiita.com/ryo_001339/items/9215ad17e0e7b2d6a4d0
## まとめ
今回は権限を持ったユーザーにのみ表示、実行ができるようにするための手段の解説でした。
これを実装することで権限がないユーザーに使用されることを防げるようになります。

わからないことあったら書いてくれれば答えていきます。

**Discordにいる荒らしの情報や対策方法の共有をしている自鯖です**
ぜひ参加お願いします↓↓↓↓

https://discord.com/invite/ESRGwGQhxc
css 「fr」って便利だなと思いました。

お疲れ様です。

自己紹介ページにレスポンシブデザインを実装していなかったなーと思い、お昼からちょこちょこ編集していたところで、**「fr（単位）」** のありがたみを感じました:relaxed:

フッターに写真を6枚ほど貼っていまして、 display:grid で、グリッドデザインにし、大きさをどうしようかと思っていた時、ちょこちょこメモしているノートを見ていると、「fr」という単位があることを発見しました。

私のメモによると、**「親要素からみた子要素の大きさの割合を指定できる。画面の幅に合わせて伸縮させる」** ということです。
というわけで実装しました。

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

800pxくらいの画面では2列で、ノートパソコンなどの大きな画面では3列、4列で表示したいときは、親要素に **grid-template-columns** プロパティを使うことで、グリッド上の行や列を指定できます。
コードでは、1fr 1fr と、2つありますが、これを増やすと列が増え、減らすと列が減ります。

各クラスで大きさをpxで指定しているので、「画面の大きさに合わせて伸縮する」という特性は見られないのですが、pxの指定をせず、frのみの指定だと顕著だなと感じました。
営業力・人脈がなくてもエンジニアが副業で50万以上稼ぐ方法

# エンジニアになれば副業ができると思っていた奴いる？
僕です。

収入を増やしたくてエンジニアになりましたが、
自分のスキルにあった副業を探しても全然見つからず、
困っておりました。

# 多分これが一番簡単だと思います
こちらの方法がとても具体的でわかりやすかったです。

https://coconala.com/services/3418311

販売しているので内容は言えませんが、
実例として方法を述べているので、
収入を増やす方法が分かりやすかったです。

# おわりに
情報を集めるだけでなく、
なんだかんだ行動するのが一番大事ですね。
C言語 : メモリリーク防止の考え方

# はじめに
　C言語で動的にメモリを確保する場合、確保したメモリが不要になった段階でfreeする必要があります。これを怠るとリソース不足になる恐れがあります（現代だとほとんど問題にならないそうですが、学習する段階では少なくともこのように教わることが多いと思います）。
 　本記事ではメモリリーク防止の考え方を自分なりに整理しようと思います。

# メモリリークの検証方法
 メモリリークを検知するために使用するツールとしては複数選択肢があります。筆者はファイルディスクリプタなどの検知もしやすいvalgrindが好きで、今回もvalgrindを使用します。
## valgrind等動的解析ツール

https://qiita.com/tjun/items/e9d2f7da3c94eb0240d8

## 静的解析ツール

https://zenn.dev/mu/articles/f0b6f07bf6b397

# メモリリークを防止するコードの考え方
　守りたいルールは以下の3つだけです。

1. malloc系を呼び出した関数内でfreeする
1. 1が叶わない場合、malloc系を呼び出した関数を呼び出した先でfreeする
1. 1が叶わない場合、malloc系を呼び出した関数を呼び出した先以外でfreeしない

※ここでルールの２つ目について補足です。これに当てはまる場合はおそらく返り値に動的に確保したメモリを使用しているためという前提があります。
※3つ目については、これに違反するとデバッグが難しくなってしまいます。

これを踏まえて、以下の例を見てみましょう。

## 悪い例
```bad_mem.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *get_str(const char *msg)
{
    return (strdup(msg));
}

int main(void)
{
    char *str;

    str = NULL;
    str = get_str("hello");
    printf("%s\n", str);
    return (0);
}
```

こちらをコンパイルしてvalgrindを使用すると以下が得られます。
※一部マスクや省略をしています。
```
$ valgrind --leak-check=full ./a.out
==84483== HEAP SUMMARY:
==84483==     in use at exit: 6 bytes in 1 blocks
==84483==   total heap usage: 2 allocs, 1 frees, 1,030 bytes allocated
==84483== 
==84483== 6 bytes in 1 blocks are definitely lost in loss record 1 of 1
==84483==    at 0x4848899: malloc (in /usr/~)
==84483==    by 0x491758E: strdup (strdup.c:42)
==84483==    by 0x401154: get_str (in /home/~)
==84483==    by 0x401185: main (in /home/~)
==84483== 
==84483== LEAK SUMMARY:
==84483==    definitely lost: 6 bytes in 1 blocks
==84483==    indirectly lost: 0 bytes in 0 blocks
==84483==      possibly lost: 0 bytes in 0 blocks
==84483==    still reachable: 0 bytes in 0 blocks
==84483==         suppressed: 0 bytes in 0 blocks
==84483== 
==84483== For lists of detected and suppressed errors, rerun with: -s
==84483== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
```
strdup内にあるmallocしたメモリが開放されていないことを検知しました。
先程のルールに乗っ取って考えると
1. malloc系を呼び出した関数内でfreeする
→get_str関数の返り値に使用しているため、これはできないケース
1. 1が叶わない場合、malloc系を呼び出した関数を呼び出した先でfreeする

この2番を実行する必要があります。

## 良い例
```good_mem.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char *get_str(const char *msg)
{
    return (strdup(msg));
}

int main(void)
{
    char *str;

    str = NULL;
    str = get_str("hello");
    printf("%s\n", str);
    // 呼び出し先でfree追加する
    free(str);
    return (0);
}
```

```
$ valgrind --leak-check=full ./a.out
==85652== HEAP SUMMARY:
==85652==     in use at exit: 0 bytes in 0 blocks
==85652==   total heap usage: 2 allocs, 2 frees, 1,030 bytes allocated
==85652== 
==85652== All heap blocks were freed -- no leaks are possible
==85652== 
==85652== For lists of detected and suppressed errors, rerun with: -s
==85652== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
```
解決しました。

# 終わりに
　今回はルールを3つだけ設けて、メモリリークを事前に防ぐようなコードを書ける考え方を提案しました。なにかのお役に立てれば幸いです。お読みいただきありがとうございました。
 友人から以下のリンクを提示いただきました。次のレベルアップに良いそうです。筆者も勉強します。

 https://orumin.blogspot.com/2022/05/craii.html
corepackを使っていた人こそpnpmをおすすめしたい！

# corepackを使っていた人こそpnpmをおすすめしたい！

https://qiita.com/oekazuma/items/1e2ee304877efa48c122

以前、上記の記事で書いたように僕はNode.jsに標準搭載されているcorepackを使ってpnpmのバージョン管理をしていました。

しかし、先日 corepackをNode.jsから削除し、標準搭載じゃなくなる方針であることが決定されました。
(反対意見も多いみたいなのでもしかしたら変更されるかもしれない)

https://socket.dev/blog/node-js-takes-steps-towards-removing-corepack

そんな中、先月、pnpmがv9.7でcorepackを使わなくても、`package.json`のpackageManagerのフィールドを見て、pnpmのバージョンを切り替えられる機能をリリースしました！

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">pnpm v9.7 is out!<br><br>If you want pnpm to switch between versions, set the &quot;manage-package-manager-versions&quot; setting to &quot;true&quot;<a href="https://t.co/kiTyfYIkEC">https://t.co/kiTyfYIkEC</a> <a href="https://t.co/PIoSNsLfFU">pic.twitter.com/PIoSNsLfFU</a></p>&mdash; pnpm (@pnpmjs) <a href="https://twitter.com/pnpmjs/status/1821120903670845884?ref_src=twsrc%5Etfw">August 7, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

corepackで書いていたまま、`package.json`のpackageManagerフィールドにバージョンを記載し、`.npmrc`に1行足すだけで使えるようになります。

[公式ドキュメント](https://pnpm.io/ja/npmrc#manage-package-manager-versions)

```package.json
{
  "packageManager": "pnpm@9.10.0"
}
```
```.npmrc
manage-package-manager-versions=true
```



pnpmはNode.jsのバージョン管理もできるのでpnpmだけでpnpmのバージョンとNode.jsのバージョン管理ができます。

[公式ドキュメント](https://pnpm.io/ja/npmrc#use-node-version)

```.npmrc
use-node-version=20.17.0
```

corepackの代替というわけではないですが、Node.jsに標準搭載されていて、余計なものをインストールしたくないから使っていた方々にはpnpm1つですべて賄えるのでおすすめです！！
Moviepyでhevc_nvencを使う

## 結論：codecでhevc_nvencを指定する
Moviepyを利用してファイル出力する際、codec指定をしない場合、libx264が利用されます。
しかし参考とさせていただいた下の投稿にもあるように、Nvidia Geforceを利用していれば、ハードウェアエンコーダであるNVENCを利用することも可能です。

https://qiita.com/masachaco/items/0cb928c0f254cdc39258

## codecにnvencを指定するとなんだか出力が汚い
ハードウェアエンコーダの恩恵で処理速度は向上しますが、libx264と比べ画質が悪くブロックノイズが大きいと感じていました。
が、単純にmoviepyでビットレートを指定していなかったためでした。

部分的なコードのコピペですが、最終的には次のようにしています。
```
if cuda_n==True:
    clip.write_videofile(video_out, audio=audio_temp_filename,verbose=False,codec='hevc_nvenc', bitrate='11M', preset='slow',logger=WriteVideoProgress(pb))
else:
    clip.write_videofile(video_out, audio=audio_temp_filename,verbose=False,logger=WriteVideoProgress(pb))
```

NVENCを利用したかったのは処理時間を稼ぐためでしたが、ビットレートの変化はNVENCでの処理時間にあまり影響がなかったので、元のlibx264と同程度のファイルサイズまでで、できる限り大きいビットレート、を模索して11Mとしています。

loggerは、次の記事を参考というかほぼ丸っと使わせていただきました。
GUIはFletを利用していますが、プログレスバーにmoviepyの進捗を表示することができました。

https://qiita.com/midry3125/items/62d12596c80d508c6c34
chatgptに聞く_[GPUについて]

# はじめに
こんにちは
ChatGPTにGPUについて質問し、その回答をパワーポイントでまとめた資料を作成しました。以下にその資料を掲載します。

私自身、GPU周りの知識はほとんどないため、質問内容に的外れな点もあるかもしれません。なお、これらの回答はChatGPTによるものであり、必ずしも正確とは限りませんので、ご了承ください。

# 質疑応答結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940329/02623836-94ee-64e6-860c-ffc2ee6b95cf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940329/c79d873f-2349-cac4-50d7-f5e5dfc8ec1b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940329/7d758bb1-94c8-0ce4-0a51-54073837f037.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940329/790182da-3554-3bfc-bac4-9d20d8631112.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1940329/4522f431-89c0-3d71-92ce-d2272a28411b.png)

# 感想
GPUとCPUは、コアの性能の違いとコア数が異なっていることが違いということが理解できてよかった。
NVIDIAから出ている色んなGPUは何の違いあるのか（コア数..?）を次は聞いていきたい。
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

# 必要なライブラリが足りない
```
bundle install
...
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
...
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
```
# 原因
>This gem links against MySQL's libmysqlclient library or Connector/C library, and compatible alternatives such as MariaDB. You may need to install a package such as libmariadb-dev, libmysqlclient-dev, mysql-devel, or other appropriate package for your system. See below for system-specific instructions.

https://github.com/brianmario/mysql2?tab=readme-ov-file#linux-and-otherunixes:~:text=This%20gem%20links,system%2Dspecific%20instructions.

>You may need to install a package such as libmariadb-dev, libmysqlclient-dev, mysql-devel, or default-libmysqlclient-dev;

https://github.com/brianmario/mysql2?tab=readme-ov-file#linux-and-other-unixes:~:text=You%20may%20need%20to%20install%20a%20package%20such%20as%20libmariadb%2Ddev%2C%20libmysqlclient%2Ddev%2C%20mysql%2Ddevel%2C%20or%20default%2Dlibmysqlclient%2Ddev%3B

# 感想
libmariadb-dev, libmysqlclient-dev, mysql-devel, or default-libmysqlclient-devが足りないと考える

試しに`libmysqlclient-dev`をインストールしたら`bundle install`完了した。
[スレッド] PoLによるプロトコル所有の流動性の実現 [Berachain翻訳]


:::note info
本記事は下記の翻訳となります。
[『[Thread] PoL Enables Protocol-Owned Liquidity』](https://blog.berachain.com/blog/thread-pol-enables-protocol-owned-liquidity)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/9fedf98a-69bb-f5f1-9b13-5221326e6607.png)

> Proof of Liquidity（PoL）はプロトコル所有の流動性を可能にします。トークンの流動性をレンタルするために LP に支払いをするのではなく、プロトコルはチェーンのネイティブ発行を利回りの源として活用し、トークンの流動性をブートストラップできます。以下の 3 点について説明します：
> 1）流動性とは？
> 2）流動性所有の利点
> 3）流動性をブートストラップするための実行可能なステップ

https://x.com/berachain/status/1807814131103228336

> 通常、プロトコルは流動性マイニングプログラムに参加し、LP に対してトークンによる流動性提供の報酬を支払います。デメリットは、この流動性に対して継続的なレンタル料が発生することと、ネイティブトークンの発行量が増加し、結果として流通量のインフレーションを引き起こすことです。

https://x.com/berachain/status/1807814136199307570

> ビルダーは PoL を使って流動性をブートストラップできます：
> 3）BGT を BERA に交換し、ステップ 1 と 2 を繰り返して BGT の収益を複利で増やす
> 2）トークン供給量の一定割合を保持し、バリデーターに自分たちのプールへの排出を促すインセンティブとする
> 3）BGT を BERA に交換し、ステップ 1 と 2 を繰り返して BGT の収益を複利で増やす

https://x.com/berachain/status/1807814140536184940

> Proof of Liquidity は、通常はチェーンの外部にあるプライベートマーケットで行われる流動性メタゲームを取り入れ、それをプロトコルレベルで実装することで、より効率的な市場を作り出します。プロトコル所有の流動性に関する@eatsleepyeet の投稿をチェックしてみてください。

https://x.com/berachain/status/1807814142406902187

---

---

:::note info
【Sunrise とは】
Sunrise は Proof of Liquidity(PoL)と Fee Abstraction（手数料抽象化）を備えたデータ可用性レイヤーです。 私たちは DA の体験を再構築し、多様なエコシステムからのモジュラー型流動性を活用してロールアップを立ち上げています。

- [Sunrise - Specialized DA Layer for Proof of Liquidity](https://sunriselayer.io/)
- [Sunrise / Gluon Docs](https://docs.sunriselayer.io/)

【Social Links】

- [X(旧 Twitter)[英語])](https://twitter.com/SunriseLayer)
- [X(旧 Twitter)[日本語])](https://twitter.com/SunriseLayer)
- [Discord Community](https://discord.com/invite/sunrise)
- [Medium](https://sunriselayer.medium.com/)
- [Github](https://github.com/sunriselayer)
- [Linkedin](https://www.linkedin.com/company/sunriselayer)

【お問合せ】
Sunrise へのお問い合わせはこちらから 👉 [Google Form](https://forms.gle/h8RVahxRtXUvYwnv6)

![1080x360.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839047/8971d83b-3331-4757-dc72-320d28618735.jpeg)

:::
WSL（AlmaLinux環境）でDocker Sail実行時の改行コード問題と解決策

・参考サイト：

1. https://laracasts.com/discuss/channels/laravel/laravel-sail-error-on-up-error-decoding-ports-invalid-hostport-8080
2. https://vim.blue/vim-set-fileformat/
3. https://emacsdocs.org/docs/emacs/File-Name-Coding

## 【これを書くに至った経緯】
<br>

Laravel Sailを立ち上げようとした際、以下のエラーメッセージが表示されました。
```bash
./.env: line 7: $'\r': command not found
./.env: line 11: $'\r': command not found
./.env: line 18: $'\r': command not found
./.env: line 25: $'\r': command not found
invalid hostPort: 8080
invalid hostPort: 8080
```
`sail up` が実行できず少々ハマったのでまとめてみました。
<br>
<br>

## 【結論から言うと】
<br>

エラー内容から、**.env** ファイル内の改行コードに問題があることが示唆されていました。具体的には **$'\r'** というエラーは、Windowsで使用される **CRLF** 改行コードの影響で発生していました。

WSL上のAlmaLinuxは、Linuxと同様に改行コードとして **LF**（ラインフィード）を期待します。しかし、Windowsではデフォルトで **CRLF**（キャリッジリターン + ラインフィード）が使用されているため、**.env** ファイルがWindows環境で作成された場合、Linux環境では余分な \r（キャリッジリターン）が含まれてしまいます。

その結果、Linux環境でシェルスクリプトや設定ファイルを読み込む際にエラーが発生します。WSLやDockerもこれに該当し、**.env** ファイルの改行コードが原因でエラーが発生していました。

<br>

## 【解決策】
<br>

この問題を解決するには、`.env` ファイルの改行コードを `CRLF` から `LF` に変更する必要があります。以下の手順で解決しました。

### 1. `.env` ファイルの改行コードを変更

#### Visual Studio Code (VSCode) での手順
1. `.env` ファイルを VSCode で開きます。
2. 画面右下に「CRLF」と表示されている箇所をクリックします。
3. 表示されたオプションの中から「LF」を選択します。
4. `.env` ファイルを保存します。
<br>
<br>

#### Vim での手順
1. `.env` ファイルを Vim で開きます。
2. 次のコマンドを実行して、改行コードを `LF` に変更します。
   ```vim
   :set fileformat=unix
   ```
3. 以下のコマンドでファイルを保存し、Vimを終了します。
   ```vim
   :wq
   ```
<br>
<br>

#### Emacs での手順
1. `.env` ファイルを Emacs で開きます。
2. 次のコマンドを実行して、改行コードを `LF` に変更します。
   ```emacs-lisp
   C-x RET f unix
   ```
3. 以下のコマンドでファイルを保存します。
   ```emacs-lisp
   C-x C-s
   ```
<br>
<br>

### 2. Sailの再起動

改行コードを変更した後、再度 sail up を実行します。これで、改行コードの変更が適用され、Linux環境でも .env ファイルが正しく認識されます。
OCIの便利な利用法・TIPS サポートの活用について

<B>
OCIの便利な利用法・TIPS
 サポートの活用について
</B>

Oracle Cloud Infrastrucureご契約にはエンタープライズ向けサポートが含まれているのをご存じでしょうか。

<!-- https://www.oracle.com/jp/cloud/pricing/ によれば -->
<!-- [OCI上のVMリソース構成情報をTerraformでローカルPCに保存・クラウドに復元してみる その１ 初期設定](https://qiita.com/Assemble_EX-80/items/6a3418e609b7b1e15102)では
-->
 
 [Oracle Cloud Hosting and Delivery Policies](https://www.oracle.com/contracts/docs/cloud_hosting_delivery_policies_jp_5023328.pdf) ドキュメントの 
 <B>5. ORACLE CLOUD SUPPORT POLICY </B> に記載(2024年9月現在) の通り

・オラクル・クラウド・サービスの問題または不具合の診断

などはあらかじめクラウドの契約に含まれています。他社クラウドでは有償となるような部分がクラウド利用費用に含まれているのではないでしょうか。

保守や運用の有償サポートサービス [(Customer Success Services)]( https://www.oracle.com/jp/customer-success/) も提供しており、パートナー様によるサポートサービスの紹介もしているようです。

サポートはチャットやWeb（MyOracleSupport support.oracle.com)経由で受けることができます。

こちらのURLにはサポートご利用ガイドや、サポートご利用のFAQ、技術サポート活用のコツがあります。

<B>Oracle Cloud Support ご利用ガイド</B>
https://www.oracle.com/jp/a/ocom/docs/oracle-cloud-support-userguide-jp.pdf

<B>Oracle Supportオプション</B>
https://www.oracle.com/jp/support/support-options.html

<!--
<B>Oracle Cloud サポートについての FAQ</B>
https://blogs.oracle.com/supportjp/post/cloud-support-faq
-->

<B>トラブル解決に向けた技術サポート(SR)活用のコツ</B>
https://oracle-japan.github.io/ocitutorials/support-service/tips-support-cust-success/

うまくサポートを利用することで日頃のシステム運用でのトラブル解決が少しでもスムーズに進んだり、安定稼働につながるとよいですね。
[スレッド] PoLにおける役割と参加 [Berachain翻訳]


:::note info
本記事は下記の翻訳となります。
[『[Thread] Roles and Participation in PoL』](https://blog.berachain.com/blog/thread-roles-and-participation-in-pol)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/b125acfa-4536-1f96-bf72-a1bd2339ce4c.png)

> Proof of Liquidity は、Berachain のアプリケーション層を加速させるものです。ユーザー、プロトコル、バリデーターが協力して、流動性とセキュリティを同時にスケールさせます。
> その仕組みは以下の通りです 👇🐻

https://x.com/berachain/status/1805639727548350896

## アプリケーション

> アプリケーション：新しい gauge を作成する提案を行い、バリデーターからの BGT 排出の対象となる reward vault を作ります。gauge は単一の資産をステークするためのスマートコントラクトにすぎないため、BEX 上のプールや他の形態でも構いません！

https://x.com/berachain/status/1805639733445542138

## バリデーター

> バリデーター：交代でブロックを構築し、委任された BGT の量に基づいてブロック報酬を獲得します。バリデーターは、ブロック構築により獲得した BGT の一部を、自身の"berachef"を通じて選択した gauge に振り向けます。

https://x.com/berachain/status/1805639730568347858

## ユーザー

> ユーザー：流動性を提供し、LP をステーキングして BGT 報酬と LP 手数料を蓄積します。ゲージに対する BGT 報酬は、バリデーターのゲージの全体加重平均から計算されます。ユーザーの BGT 獲得量は以下に基づきます：1. ゲージにステーキングされた総資産 2. ゲージに発行される BGT の量

> ユーザー：流動性を提供し、LP をステークして BGT 報酬と LP の手数料を蓄積します。gauge に対する BGT 報酬は、バリデーターの gauge の全体加重平均から計算されます。ユーザーの BGT 収益は以下に基づいています：
> 1）gauge にステークされた総資産
> 2）gauge に排出される BGT の量

https://x.com/berachain/status/1805639729377067448

---

---

:::note info
【Sunrise とは】
Sunrise は Proof of Liquidity(PoL)と Fee Abstraction（手数料抽象化）を備えたデータ可用性レイヤーです。 私たちは DA の体験を再構築し、多様なエコシステムからのモジュラー型流動性を活用してロールアップを立ち上げています。

- [Sunrise - Specialized DA Layer for Proof of Liquidity](https://sunriselayer.io/)
- [Sunrise / Gluon Docs](https://docs.sunriselayer.io/)

【Social Links】

- [X(旧 Twitter)[英語])](https://twitter.com/SunriseLayer)
- [X(旧 Twitter)[日本語])](https://twitter.com/SunriseLayer)
- [Discord Community](https://discord.com/invite/sunrise)
- [Medium](https://sunriselayer.medium.com/)
- [Github](https://github.com/sunriselayer)
- [Linkedin](https://www.linkedin.com/company/sunriselayer)

【お問合せ】
Sunrise へのお問い合わせはこちらから 👉 [Google Form](https://forms.gle/h8RVahxRtXUvYwnv6)

![1080x360.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3839047/8971d83b-3331-4757-dc72-320d28618735.jpeg)

:::
画像ファイルのIOにOpenCVを使うのは正解だろうか

### はじめに
最近、画像認識・機械学習のアルゴリズム開発にscikit-learn,  scikit-image, pytorch, tensorRTなどを使っているせいか、OpenCVの機能を使ってコーディングする機会が減っている。

## 使っている機能
- cv2.imread()
- cv2.imwrite()
- cv2.imshow()
- cv2.VideoCapture()
- cv2.VideoWriter()

#### opencv のうれしくない点
- opencv はBGR の順序となっているためにRGBを想定しているライブラリとの相性が良くない。
- Unicode 文字列の描画をサポートしていない。

## opencv がらみの心配
どのwhl を入れたらいいのか
- opencv-python
- opencv-contrib-python
- opencv-python-headless
- opencv-contrib-python-headless
#### headlessを利用する場合
- imshowなどのGUIを必要としない場合に選ぶ。
- opencv-python と opencv-python-headless が同時に含まれている状況を作ってはならない。
どちらか一つを残すこと。
- GUIが不要な場合：　opencv-python-headless 
- GUIが必要な場合：　opencv-python

#### opencv-contrib-pythonを利用する場合
- https://github.com/opencv/opencv_contrib にあるmoodules を利用する場合に選択する。

## 他のライブラリとの適合性の問題
- numpy
- scikit-learn
- 他の商用ライブラリ
OpenCVへの依存ライブラリが多いので、循環import問題を生じやすくなっている。

[AttributeError: partially initialized module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline' (most likely due to a circular import)](https://stackoverflow.com/questions/72706073/attributeerror-partially-initialized-module-cv2-has-no-attribute-gapi-wip-gs)

OpenCVへの依存ライブラリ、Numpyへの依存ライブラリが多いので、許容されるバージョンの組合せが少なくなる問題。



## 他のライブラリ
#### imageio
- imageio.imread()
- imageio.imwrite()
np.ndarray 型の戻り値です。
画像の表示はない。

#### scikit-image
https://scikit-image.org/docs/stable/api/skimage.io.html
imread()
imsave()
np.ndarray 型の戻り値です。

#### scikit-imageのうれしいところ
- 画像のnp.float での処理をサポートしている点
- dtype=np.float 型での演算や画像の表示機能が充実しているので、opencv ではできない処理もできることが多い。

#### PIL Image(pillow)
読み込んだあとのデータ形式がnp.ndarray型にとは異なるライブラリです。
テキストの画像への書き込むがASCIIの範囲に限らない。

## 現状の私の指針
- scikit-image, imageio, Pillow のいずれかをimport しているプロジェクトで、画像ファイルのIOにしか用いていない状況では、OpenCVを使わない。
　imageIOはPillowを利用する。scikit-imageはimageIOを利用する。
　そのため、imageIOのimreadを使った方が、OpenCVを追加しない分だけ簡潔になる。

- 動画ファイル、GStreamerを用いているときは、必ずOpenCVを使う。
 - それ以外の適切なライブラリを知らない。
  
追記：

`def some_func(img: np.ndarry) -> np.ndarray:`
とは書かず、
`def some_func(rgb_img: np.ndarry) -> np.ndarray:`
もしくは
`def some_func(bgr_img: np.ndarry) -> np.ndarray:`
と書くように心がけている。
疑似要素before,afterの位置指定で小数点を使うと画面によってはズレる

# ？
CSSの疑似要素でよく使うbefore,afterを使った際に、位置調整に小数点を使用するとディスプレイによっては表示がズレる

# 例
ラジオボタンを装飾したCSSがあります。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="jOjJGNL" data-pen-title="画面によってズレるCSS" data-user="mu_umino" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/mu_umino/pen/jOjJGNL">
  画面によってズレるCSS</a> by umino (<a href="https://codepen.io/mu_umino">@mu_umino</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

他のディスプレイで見ると↓

<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149691/c3da2eda-8b60-f245-f613-dce2c41cd2fe.png">
<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149691/72b61f76-9d13-9bbd-8ba2-324ce5ebcf79.png">

←MacBookの画面で見た時　EV2456で見た時→
どうしてか黒点の位置がズレます。

# 解決策
そもそも小数点を指定しない

黒点の箇所に
```css
top: 2.5px;
left: 2.5px;
```
と小数点で指定したことが原因でした。
デザインの段階で数値指定が小数点にならないようにしたら良いので

```css
.radio-label:before {
  /* もとは15px */
  width: 16px;
  height: 16px;
}
.radio-label:after {
  /* もとは2.5px */
  top: 3px;
  left: 3px;
}
```
と変更して解決しました。
0.25remとか書いてもズレるのでpxにした時小数点以下にならないようにしたらいいのかなあとぼんやり思いました。


---
仕事中にラジオボタンの位置がずれてる！でもこっちで見たらずれてない！でてんやわんやしたので、ディスプレイによってはズレるんだなあと学びを得ました。
小数点気をつけたい。

おしまい。
Security Hubを中央設定へ移行した際にハマったこと

# はじめに

Security HubはAWSのセキュリティ状況を可視化する上で非常に便利なサービスです。
2023年11月に中央設定という便利な機能が追加されました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/aws-security-hub-central-configuration/

従来の機能（ローカル設定）では、マルチアカウントで運用している場合においてアカウント毎に標準の追加やコントロールの無効化などを容易に実施することが出来ませんでした。
中央設定はこれらの課題を解決してくれます。

この記事では、元々ローカル設定で動かしていた環境を中央設定へ移行する際にハマったことを説明します。

# Security Hub

AWSのセキュリティに関する状況を一箇所でまとめて見ることが出来るサービスです。
機能のひとつに「セキュリティ基準」というものがあり、AWSのベストプラクティスや各種基準（CIS Benchmark、PCI DSSなど）に沿っているかをチェックする機能もあります。
詳細は、以下などをご確認ください。

https://pages.awscloud.com/rs/112-TZM-766/images/20201013_AWS-BlackBelt-AWSSecurityHub.pdf

# 中央設定とは？

ローカル設定に対して中央設定は以下のような違いがあります。

- ローカル設定
  - Security Hubの管理アカウントからOrganizations配下のメンバアカウントに対して、AWSアカウント作成時に自動有効化することは出来る
  - 自動有効化した際のセキュリティ基準はAWSがデフォルトとして指定しているものだけ
  - 細かな制御は出来ず、実施するためには個々のAWSアカウントおよびリージョンでひとつずつ設定する必要がある
- 中央設定
  - Security Hubの管理アカウントにてポリシーというものを作成し、それをOrganizations配下のメンバアカウントへ適用することが出来る
    - 個々のAWSアカウントおよびリージョンでひとつずつ設定を行う必要がない
  - ポリシーでは適用するセキュリティ基準やセキュリティコントロールを細かく指定出来る（逆にSecurity Hubの無効化を強制することも出来る）

また、クラスメソッドさんのブログが非常に分かりやすかったです。

https://dev.classmethod.jp/articles/introduction-2024-aws-security-hub/

# ハマったこと その1

中央設定ではあらかじめ作成しておいたポリシーを`組織`や`アカウント`に適用させる必要があります。
今回の作業で一番大きい組織では100個を超えるアカウントが存在してました。

中央設定の適用はCloudFormationで実施したのですが、適用が完了する前にタイムアウトが発生しロールバックしてしまう事象が発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483600/14356c0f-d802-3ce7-5526-1bbfe6735e8e.png)

AWSサポートに確認したところ、`AWS::SecurityHub::PolicyAssociation`リソース作成のタイムアウトは約2時間であり、現時点でタイムアウトは延長できないとのことでした。
そのため、代替案としてリソースインポートを用いる方法を紹介されました。
CloudFormation経由ではなく一度手動でポリシー適用を行い、その後にCloudFormationスタックへインポートすることで無事に適用することが出来ました。

# ハマったこと その2

いくつかのアカウントに対してポリシー適用が失敗しました。
ログには以下のような内容が記載されてありました。

```
Policy association failed because standards could not be enabled in Regions <リージョン名>, <リージョン名> and 2 other(s). Check if AWS Config is enabled and properly configured and retry.
```

これは、Security Hubの管理アカウントで集約リージョンとして指定されているリージョンのうち、AWS Configが有効となっていないケースで発生するようです。
今回は利用可能なリージョンを全て集約リージョンへ含めるようにしていたのですが、Organizations配下で有効なリージョンが統一されていない場合にはこのようなエラーに直面する場合があるかと思います。
中央設定の場合は集約リージョンを個別に設定出来ないため、この点はデメリットと言えるかもしれません。

# 最後に

中央設定に移行したことで、Security Hubの構成管理が非常にシンプルになりました。
これからもSecurity Hubを活用してセキュリティを高めていきたいです。
科学的記数法に起因するInfinityバグについての覚書

# はじめに

こんにちは、Gakken Leap のフロントエンドエンジニアの日下です。

今回は過去に経験した興味深い技術的問題について書きます。

クーポンコード 72E875 が Infinity に変換されてしまうというものです。この記事では、この問題の原因と、JavaScript の数値解釈の特性について共有します。

# 問題の概要

私が当時担当していた通販サイトでは、Cookie に保存されたランダムな文字列から生成されたクーポンコードに基づいて割引を適用する機能がありました。

その機能は問題なく動作していたのですが、ある日決済時クーポンが適用されないという事象が発生しました。

Sentry のログを確認すると coupon=Infinity と記載されていました。

当初悪意のあるユーザーが Infinity という文字列を試しに入れたのかと思っていたのですが、発生件数が日毎に増えていくため本格的に調査を行いました。

調査を進めていく中でクーポンコード 72E875 の場合、決済時クーポンが適用されていないことが判明しました。

# 原因の解明

この問題の根本的な原因は、JavaScript の数値解釈にあります。

JavaScript では、E または e を含む数値文字列は、科学的記数法（指数表記）として解釈されます。

具体的には：

72E875 は JavaScript によって 72 \* 10^875 と解釈されます。

この数値は、JavaScript が扱える Number 型の範囲（約 ±1.8 \* 10^308）を遥かに超えています。

結果として、この値は Infinity（無限大）に変換されてしまいます。

Infinity というクーポンはないため、クーポンが適用されていなかったというわけです。

以下のように

```javascript
setCookie("coupon_code", "72E875");
const coupon = useCookie("coupon_code").value.toString();
```

と書いても String に変換する前にすでに暗黙的型変換により数値として解釈され、結果として Infinity に変換されているため、coupon は "Infinity" です。

# 対策と教訓

対策として暗黙的型変換時に文字列として解釈されるように Cookie 保存時クーポンに文字列のプレフィクスをつける対応を行いました。

Cookie から取り出すさいにプレフィクスを取り除き文字列を置換します。

```javascript
setCookie("coupon_code", "MyCoupon72E875");
const coupon = useCookie("coupon_code").value.replace("myCoupon", "");
```

このようにすることで上記の問題を防ぐことができます。

# まとめ

JavaScript の動的な型変換は便利な特性である一方で、予期せぬ挙動を引き起こす可能性もあります。

今回のケースでは、クーポンコードが科学的記数法として解釈され、結果として Infinity に変換されるという問題が発生しました。

この問題を解決するために、クーポンコードに文字列のプレフィクスを追加するという対策を採用しました。

これにより、クーポンコードが数値として解釈されることを防ぎ、期待通りの動作を保証しました。

この経験から、JavaScript の型変換の特性を理解し、それがコードの挙動にどのように影響するかを常に意識することの重要性を学びました。

# エンジニア募集中

Gakken LEAP では教育をアップデートしていきたいエンジニアを絶賛大募集しています！！
ぜひお気軽にカジュアル面談へお越しください！！

https://gakken-leap.co.jp/recruit/