OmniAICreator/Qiita-1.07M huggingface dataset:
Discord.js 危険人物APIで自動キックBOTの作り方！

こんにちは。今回は、Discordの危険人物APIについての記事をわかりやすく紹介します。

## Discordとは
まず最初に、Discordはオンラインでコミュニケーションや交流をするためのプラットフォームです。もともとはゲーマーのために作られましたが、現在では様々な目的で広く利用されています。
Discordでは、テキストチャットや音声通話、ビデオ通話などさまざまな手段でコミュニケーションが取れます。グループやコミュニティはサーバーと呼ばれ、異なるチャンネルでトピックごとに議論することができます。
## 危険人物APIの開発元
危険人物検索サイトは「Discord海軍」というグループが開発しているようです。
サポートサーバーはこちら: https://discord.gg/V6SmYx8Ghp
# 危険人物APIの紹介
2023年12月にdiscord危険人物サイトとしてオープンし、2024年4月現在では6000人以上の危険人物情報が登録されているようです。
さらに、Discord危険人物情報サイトのAPIが誕生し、グローバルBANに使用するユーザーが増えてきました。
## APIを使った危険人物検出BOT
以下が危険人物（荒らし）がサーバーに入ってきたら自動でキックしてくれるBOTのサンプルコードです。
discord.js v13を使用しています。
```javascript
const { Client, Intents } = require('discord.js');

const client = new Client({ 
    intents: [
        Intents.FLAGS.GUILDS,
        Intents.FLAGS.GUILD_MEMBERS
    ]
});

const API_URL = 'https://discord-navy.net/users/api.php?id=';

client.once('ready', () => {
    console.log('Bot is ready');

    // クライアントのステータスを更新する関数を呼び出す
    updateStatus();
});

// サーバーの数を取得してステータスを更新する関数
function updateStatus() {
    // クライアントのステータスを更新
    client.user.setActivity(`${client.guilds.cache.size}サーバーで稼働中`, { type: 'PLAYING' });
}

client.on('guildMemberAdd', async member => {
    try {
        // APIにユーザーIDを送信して存在を確認
        const fetch = await import('node-fetch');
        const response = await fetch.default(API_URL + member.user.id);
        const data = await response.json();
        if (data.exists) {
            // ユーザーが存在する場合、キックする
            member.kick('荒らし情報が検出されました。')
                .then(() => {
                    console.log(`${member.user.tag} がAPIで検出されたため、キックしました。`);
                })
                .catch(error => {
                    console.error('キックエラー:', error);
                });
        }
    } catch (error) {
        console.error('Error:', error);
    }
});


// ボットのトークンでログイン
client.login('TOKEN');
```

## 最後に
荒らし行為が増える中で、このようなサービスが登場することは驚きです。開発者に感謝の意を示すとともに、記事はここまで。お読みいただきありがとうございました。
「Laut masih terlihat sekarang atau tidak」をインドネシア語Universal Dependenciesで解析する

[4月21日の記事](https://qiita.com/KoichiYasuoka/items/8d2413ddd133e8600fec)の例文に対応する「Laut masih terlihat sekarang atau tidak」を、[stanza](https://stanfordnlp.github.io/stanza/)の助けを借りつつ、インドネシア語Universal Dependenciesで解析してみた。

```
# text = Laut masih terlihat sekarang atau tidak
1	Laut	laut	NOUN	NSD	Number=Sing	3	nsubj:pass	_	_
2	masih	masih	ADV	D--	_	3	advmod	_	_
3	terlihat	lihat	VERB	VSP	Mood=Ind|Voice=Pass	0	root	_	_
4	sekarang	sekarang	ADV	D--	_	3	advmod	_	_
5	atau	atau	CCONJ	H--	_	6	cc	_	_
6	tidak	tidak	PART	G--	Polarity=Neg	3	conj	_	_
```

![UD_Indonesian.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/abc8058f-2c10-aa9c-c1c9-13613a6c38ee.png)

動詞「lihat」が受動態になっていて、主語「Laut」にnsubj:passでリンクされているのが特徴的である。すなわち、少なくともこの例文においては、インドネシア語とタガログ語とイラヴ語で、全く言語構造が違う。インドネシア語Universal Dependenciesは自動処理が進んでいるのだが、その知識をタガログ語やイラヴ語へと転用するのは難しそうだ。
釣りタイトルに使えそうなタイトル


## これ

「この○○、なにかがおかしい。」
「この○○… なんか変…」

## 使用例

このコード、なにかがおかしい。
このUI… なんか変…

## まだ誰も使っていない

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/a27c829b-384e-9238-66d8-980ea96b0ee6.png">

<img width=600 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/7116fd2f-5cd1-0ea4-4573-4858486526a9.png">

## 元ネタ

「変な家」「察しの悪い雨穴」でググってください
ActiveRecord の where in 句 の 空配列

### 通常の where in 句

こういう書き方をすると思います。

```sql
select * from table_name where id in (1, 2, 3, 4, 5)
```

### これをそのまま active_record で表現すると

```ruby
TableName.where(id: [1, 2, 3, 4, 5])
```

ですよね。

### in の中身が空だと

```sql
select * from table_name where id in ()
```

これは流石にエラーになりますよね？

### active_record でこれをやると...

```ruby
TableName.where(id: []) #=> []
```

お、エラーじゃなく空配列だ。

### どうなってる？

to_sql で active_record は発行する sql を視認出来ますよね？
早速確認

```ruby
TableName.where(id: []).to_sql #=> SELECT `table_name`.* FROM `table_name` WHERE 1=0
```

むむ！

```
WHERE 1=0
```

まさかの回避術

というか 空配列なら実行するなってツッコミどころもありますが、うっかり実行してもエラーにならない理屈はこういう事みたいです。
開発環境に必須「Docker」とは？

# ◆はじめに

Dockerの使い方：コンテナ化の基本から実践まで

仮想マシンとは、「ハードウェアの一部をソフトウェアで実現した物理マシンのようにみえるもの」です。

Docker は、アプリケーションやサービスをコンテナと呼ばれる独立した環境で実行するためのツールで仮想化コンテナとなります。

## 「コンテナ化すると何がいい？」

結論：Docker(コンテナ型仮想化)を使用すると各PCで違うOSの環境の違いが生じても同様の開発環境を実現してアプリケーションを実行することが出来るという内容となります。
![IT course Doker！？ (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/0c645b96-e789-96ef-be52-c4a51ec96d54.jpeg)



# ◆. Dockerのインストール

まずは、お使いの環境に Docker をインストールが可能です。
公式サイト

（https://www.docker.com/）から、対応するOSに合わせた Docker Desktop をダウンロードしてインストールします。
インストールが完了したら、起動して動作を確認してみます。（Docker desktopは2022年 2月 に有料化したので代替としてRancher Desktopを使用する方も多いです。）

参考：[Docker / Docker Desktop / Rancher Desktop って何が違うの？](https://qiita.com/megmogmog1965/items/dc73525f2c76170405c1)

まず、公式のイメージを使って Hello World アプリを実行してみましょう。

```shell
$ docker run hello-world
```

次に、簡単な Web サーバーを Docker コンテナとして実行してみます。

```shell
$ docker run -d -p 8080:80 --name my-web-server nginx
```

これで、Docker が NGINX のイメージをダウンロードし、Web サーバーをポート8080で実行します。

◆ Dockerコマンド

| コマンド | 意味 |
| ---- | ---- |
| docker run | コンテナの実行 |
| docker ps | 実行中のコンテナの一覧表示 |
| docker images | イメージの一覧表示 |
| docker pull | イメージのダウンロード |
| docker stop | 実行中のコンテナの停止 |
| docker rm | コンテナの削除 |
| docker rmi | イメージの削除 |

◆Dockerの使用方法

では実際にdockerの扱い方について解説致します。

Dockerの類似ツールとしては、コード管理ツールのGitを想像いただけると理解しやすいです。

Docker の基本的な使い方を以下にご紹介します！

まず、コンテナの実行に必要なパッケージをまとめた「イメージ」というものが存在します。

上記、イメージはGithubのようにdockerhubに保存されています。

今回は、開発現場で必要なフローのみ紹介します。

1, まずはDocker Hubからコンテナの元となるイメージを取得する
(※containerは2017年に追加されたもので結論なくても実行される)

◆取得したイメージを元にコンテナ起動

これだけの作業になります。

# ◆新規作成する場合

上記のように参考となるイメージを取得

⇒　Dockerfile(設定ファイル)に変更を記述

⇒　Docker Hubにpushする

等が必要です。

実際の開発プロセスではすでに構築されていることも多く、その場合、既に作られたgithubからdockerfileを取得して環境構築を行うことが多いです。
![docker05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1180499/f7ff1606-2913-b27e-49c0-2efc278cebd8.png)

参考及び画像引用：[Docker Hubを使ってGitHubにあるDockerfileからimageを自動生成する](https://simple-it-life.com/2016/03/27/dockerhub/)

# ◆まとめ

Docker を使うことで、開発やデプロイのプロセスを効率化し、環境の一貫性を保つことができます。このブログでは、Docker の基本的な使い方を紹介しましたが、さらに多くの機能や応用があります。ぜひ、公式ドキュメントや他のリソースを参考に、Docker の活用方法を学んでみてください。

参考文献：[開発系エンジニアのためのDocker絵とき入門 （単行本）](https://www.shuwasystem.co.jp/book/9784798071503.html)
【UE5】UEの幸せになる小技中の小技集　その2

# 1.ピンの削除

`Alt + 左クリック`

でピンを削除することができます

![ピンの削除.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/d8f08e8a-c897-89a0-afed-5351d37bed84.gif)

# 2.ピンの移動

`CTRLキー + 左クリック`

でピンを自由に移動させることができます

![ピンの移動.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/0039b57d-764d-9aef-d1bb-3b7d37c877ba.gif)


# 3.構造体の分割

左クリックで構造体ピンを掴んだ状態で
`Break`
と入力すると構造体を分割することができます

![Break.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/dae1169f-8aee-8d88-12f0-c3d365b63d53.gif)


# 4.構造体の作成

引数に渡す際に
`Make`
と入力するとローカル変数的なことが可能になります

![Make.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/36dec14e-1f2e-b7e6-ac8a-70e1a5c56e71.gif)


# 5.構造体の表示を制御

`Break`や`Make`でローカル構造体を生成した際
必要ない要素を非表示にすることができます


![構造体の編集.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/f86216b5-8323-5bcd-8cc8-345ce75a5140.gif)


# 6.Select
引数に追加する際
`Select`と入力するとSwitch文のようなノードを生成できます

![スクリーンショット 2024-04-28 195104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/22d7bda3-f4e1-9993-546d-88acd715a950.png)

個人的に一番多用する方法として
boolをトリガーにUMGのSetVisibilityをラップし表示切り替えに使用します

Ture・・・・Visible
False・・・Collapsed

![Select.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/b92c5ab4-3702-7b98-8f35-95dd77e3b711.gif)

EnumとWidgetSwitcherの組み合わせでも重宝します

![スクリーンショット 2024-04-28 200054.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1918199/8914ab5e-f44c-05d5-f317-79e8ef786b68.png)
[GitHub] ローカルの変更をリモートの最新の状態の上に適用する！（リベース）

GitHubに最初のプッシュをしようとしたときにいくつかのエラーが出たため、こちらで整理します！🙌
今回の肝は、`$ git pull --rebase origin main` です。

後ほど再喝しますが、以下の記事が今回の `git` コマンドを理解するのに非常に参考になりました。

https://kray.jp/blog/git-pull-rebase/

## 対象
- 未来の自分
- 以下の前提に合致する方

## 前提
- GitHubで、リモートリポジトリを作成済み
- リモートリポジトリに `READ.ME` ファイルが生成されている
- 初めてのプッシュを行う

## 本題
私が入力した、はじめのコマンドです。
```bash
# GitHubとGitを紐付け
$ git remote add origin https://github.com/ユーザー名/リポジトリ名.git
```
問題なく実行されたので、プッシュを試みますがエラーが出て失敗しています。
```bash
# 新規ファイルなどをGitHubにプッシュ
$ git push -u origin main
error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/ユーザー名/リポジトリ名.git'
```
このエラーメッセージ「error: src refspec main does not match any」は、**指定したブランチ**（この場合はmain）が**ローカルリポジトリに存在しない**ため、プッシュ操作が失敗したことを示しています。

これを解決するために、まずは**リモートリポジトリをローカルに複製**します。そうすると、**自動的にローカルリポジトリにmainブランチが誕生**します。
> $ git fetch とは「リモートのコピーをローカルにダウンロードする」コマンドです。ローカルのリモート追跡ブランチ（リモートのコピー置き場）にコピーしてくるだけなのでワーキングツリーには何も影響を及ぼしません。
```bash
# リモートのコピーをローカルに複製
$ git fetch
```
もう一度、プッシュを試みますが失敗します。
```bash
$ git push -u origin main
error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/ユーザー名/リポジトリ名.git'
```
エラーメッセージ「error: src refspec main does not match any」と表示される場合、通常、**ローカルブランチにまだコミットが存在しない**ことが原因です。Gitでは、何かしらのコミットが存在しないと、ブランチをリモートにプッシュすることができません。

これを解決するために、新規ファイル（もしくは変更）をワークツリーからインデックスに複製し、それをローカルのリモートリポジトリに複製します。そして最後、GitHubのリモートリポジトリに複製（プッシュ）します。
```bash
# 新規ファイルをインデックスに複製
$ git add .

# インデックスにある複製を、今度はローカルのリモートリポジトリに複製
$ git commit -m "Initial commit"

# 最後、ローカルのリモートリポジトリの複製をリモートリポジトリ（GitHub）に複製
$ git push -u origin master
```

https://qiita.com/atsushi101011/items/96054ebbd876e378cac4

プッシュを試みた際のエラーです。
```bash
$ git push -u origin main
To https://github.com/ユーザー名/リポジトリ名.git
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/ユーザー名/リポジトリ名.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
エラーメッセージによると、**リモートのmainブランチ**にはローカルブランチにない変更が存在しており、それがプッシュの拒否の原因になっています。これは通常、他の誰かがリポジトリにプッシュした結果、**ローカルとリモートの履歴が食い違っている**場合に発生します。

これを解決するためには、**リモートの変更をローカルに統合**してから再度プッシュを試みる必要があります。

### リモートの変更をローカルに統合（マージまたはリベース）
まず、リモートの変更をローカルブランチに取り込むために `git pull` を使用します。ここで `git pull` をそのまま実行するとマージが行われますが、履歴を直線的に保ちたい場合は**リベース**を使用することが推奨されます。

リベースを行うことで、**ローカルの変更がリモートの最新の状態の上に適用**されます。
```bash
$ git pull --rebase origin main
```

https://kray.jp/blog/git-pull-rebase/

### 変更をプッシュ
リモートの変更をローカルに統合し、再度プッシュを試みます。
```bash
$ git push -u origin main
```
無事にプッシュができました😊
ED法で複数出力の学習の経過報告

https://qiita.com/malt03/items/ad8eae77c46496e304c2

これの続き

ED法で CrossEntropyLoss を使った学習を実装している。
線形変換の学習はできたけど、非線形な学習はなかなかに難しい。
まぁそもそも一層だけの線形変換の学習は別にED法でもBPでも本質的に変わらないので「ED法で」というのは怪しいけど。

# 実装
https://github.com/malt03/ed-sandbox/blob/9194a6e1ee8329608ae7e947cc1fcace5bebba45/src/sandbox.rs

以下の実装でORゲートやANDゲートは学習できるが、XORゲートは学習できない。
backward関数の中のlayer0のbackward呼び出しはあってもなくてもほぼ結果が変わらず、学習になんの寄与もしていない。
そもそも最終層の勾配をとってきて第一層に渡しているため、コレで上手くいってもED法じゃないじゃんという話もあるが、上手くいくなら最終層以外には全部コレを渡せばうまくいくはずなのでよしとしている。

## モデル
```rust
pub struct Gate {
    layer0: Layer<Sigmoid>,
    last_layer: Layer<PassThrough>,
}

impl Gate {
    pub fn new() -> Self {
        let mut rng = StdRng::seed_from_u64(42);
        Gate {
            layer0: Layer::new(&mut rng, 4, 16),
            last_layer: Layer::new(&mut rng, 16, 4),
        }
    }

    pub fn forward(&mut self, inputs: &[f64]) -> Vec<f64> {
        let x = duplicate_elements(inputs.into_iter()).collect();
        let x = self.layer0.forward(x);
        let x = self.last_layer.forward(x);
        unduplicate_elements(x.iter()).collect()
    }

    pub fn backward(&mut self, delta: Vec<f64>) {
        let delta: Vec<_> = duplicate_elements(delta.iter()).collect();
        let delta = self.last_layer.backward_multi(&delta);

        for d in delta.iter() {
            self.layer0.backward(*d);
        }
    }
}
```

## 学習
```rust
let train = vec![
    (vec![0., 0.], vec![1., 0.]),
    (vec![1., 0.], vec![1., 0.]),
    (vec![0., 1.], vec![1., 0.]),
    (vec![1., 1.], vec![0., 1.]),
];

for _ in 0..1000 {
    let mut sum_loss = 0.;
    for (input, target) in train.iter() {
        let output = model.forward(&input);
        let loss = CrossEntropyLoss::eval((&output, &target));
        let delta = CrossEntropyLoss::derivative((&output, &target));
        model.backward(delta.into_iter().map(|d| d * LEARNING_RATE).collect());

        sum_loss += loss;
    }

    println!("loss: {}", sum_loss / train.len() as f64);
}
```

# 考察
```rust
for d in delta.iter() {
    self.layer0.backward(*d);
}
```

ここの実装は正直書いている最中から意味ない感じがしていた。だって右往左往してるだけだし。
単純な山登りにおいて二つの山を同時に登頂しようとしてもそれは無理でしょという話もある。
でも何かしら方法はあるような気がしているのでもう少し頑張ってみるつもり。

結局のところ、ED法ではある入力に対して最終出力を上げるか下げるかしか学習できない。
だから、同一の入力に対して2つ以上の出力を学習できない。
今は1次元空間の上下運動しか学習できないけど、2次元以上の空間での動きを学習できれば最終出力も2次元以上で学習できることになる。

# 追記
冷静に考えると、最終層はPassThroughな訳だから、 `let delta = self.last_layer.backward_multi(&delta);` の実装はなんの意味もなかった。
Salesforceで数式項目を作成しよう～項目の値によりレコードに点数をつける方法～

本橋孝昭です

今回はSalesforceで数式項目を作成し項目の値によりレコードに点数をつける方法をお伝えします



## ISBLANK関数
今回は数式項目での関数は「ISBLANK」関数を使用します

数式項目のISBLANK関数についてはこちらのヘルプをご確認ください

https://help.salesforce.com/s/articleView?id=sf.customize_functions_isblank.htm&type=5

※ヘルプにある数式の例

>(IF(ISBLANK(Maint_Amount__c), 0, 1) + ​
 IF(ISBLANK(Services_Amount__c), 0,1) + ​
  IF(ISBLANK(Discount_Percent__c), 0, 1) + ​
   IF(ISBLANK(Amount), 0, 1) +​
    IF(ISBLANK(Timeline__c), 0, 1)) / 5



## ISBLANKを使用した例数式

今回は例としてリードオブジェクトの標準項目について以下の内容にしましょう

・電話項目に記載があれば2ポイント獲得
・メール項目に記載があれば2ポイント獲得
・住所項目に記載があれば2ポイント獲得
・役職項目に記載があれば1ポイント獲得
・業種項目に記載があれば1ポイント獲得
・名項目に記載があれば1ポイント獲得
・携帯項目に記載があれば1ポイント獲得



上記内容を数式にすると以下になります

>IF(
ISBLANK(Phone),0,2)+
IF(
ISBLANK( Email ),0,2) +
IF(
ISBLANK( Address ),0,2) +
IF(
ISBLANK( Title),0,1) +
IF(
ISBLANK(TEXT(Industry)),0,1)+
IF(
ISBLANK( FirstName),0,1)+
IF(
ISBLANK(MobilePhone),0,1)


ポイントとしては業種（Industry）のような選択リストの項目の空欄の有無はTEXT関数を使うことですね


このようにポイントの数式項目があればどのリードがいいのか（ちゃんと埋まっているのか）が分かりますね
Discordのキャッシュクリア方法

# Discordのキャッシュクリア方法

## はじめに
Discordを使用していると、アプリの動作が遅くなったり、古いデータが残ってしまい最新の状態にならないことがあります。
これらの問題はキャッシュをクリアすることで解決する場合があります。
この記事では、PCアプリ版とiOSアプリ版のDiscordでキャッシュをクリアする手順を説明します。

## キャッシュクリアで状況が改善する可能性のあるもの
- アプリの動作が遅い
- 古い情報が更新されない
- アプリの更新で追加されたスラッシュコマンドが表示されない
- エラーが頻発する
私の場合は、アプリに追加した新規コマンドを表示するために使うことが一番多いです。

## PCアプリ版でのキャッシュクリア方法
1. 「Ctrl」キーを押しながら「R」キーを押します。
1. Discordのロード画面が表示され、通常の画面に戻れば完了です。


## iOSアプリ版でのキャッシュクリア方法
1. 自分のプロフィール画面を開きます。
1. 右上の歯車マークをタップします。
1. アプリの設定の「詳細設定」をタップします。
1. 「開発者モード」をオンにします。
1. 一つ戻り、下の方にある「Clear Caches」をタップします。
1. 画面上部に「キャッシュを削除しました！」と表示されれたらキャッシュクリアは完了です。
1. 必要に応じてアプリの設定の「詳細設定」をタップし、「開発者モード」をオフにします。

## まとめ
Discordのキャッシュをクリアすることで、アプリが重い状況や最新の情報が表示されない問題を改善する可能性があります。この記事が、Discordの使用中に遭遇する問題の解決に役立つことを願っています。

## 最後に
夜間でも安定して利用できる読み上げBOT「ShabeleA」を運営しています。
もし、他の読み上げBOTを使っていて安定性や機能に問題を感じている方がいらっしゃいましたら是非利用を検討してみてください。
[CAMPFIRE Community 「Discordのチャット読み上げBOT「ShabeleA」の運営・改良」](https://community.camp-fire.jp/projects/view/315819)
[Discord 読み上げBot「ShabeleA」公式サーバー](https://discord.gg/rtnjc5G)
[公式サイト](https://shabelea-bot.wendlandia.com/)
ABC351回答メモ

# 0.はじめに
 久々？のNoスポンサー開催。
 Cまではやさしめでしたが、D以降が難しく
 またもやA~Cのみでフィニッシュでした。
 レートも下落が止まらず-31の829と茶色が見えてきました・・・。

# 1.A - The bottom of the ninth
　まずは小手調べ問題。インプットは多めですが
 落ち着いて考えれば問題なく解けました。
 関数でリストの合計が取れるPythonは便利だなと思いました。

　https://atcoder.jp/contests/abc351/submissions/52835606


# 2.B - Spot the Difference
　これもBにしてはインプットの多い問題。
 AとBをそれぞれインプットして1文字ずつ比較で
 ACでした。

　https://atcoder.jp/contests/abc351/submissions/52846745

# 3.C - Merge the balls
　某果物を合体させるゲームを思わせる問題。
 数字が指数のため、隣り合ったら単純に倍ではなく、+１することと
 連鎖処理をするところがポイントかなと思いました。

 【実装】
 　1.以下インポート＆設定
  　-import sys
  　　sys.setrecursionlimit(10**8)
  　-from collections import deque
   2.NとリストAを入力
   3.デキューQを定義し、A[0]を格納
   4.iを１～N-1までループし、関数chkに引数A[i]を渡す
   5.Qの長さを出力して終了
   ～関数chk：引数x(筒に入れようとしているボールの値)～
   　1.Qが空の時
    　-Qにxをアペンド
     2.Qが空ではない時
     　-1.qにQの末尾の要素をpop
       -2.xとqが一致した時
       　-qに1を加算した値で関数chk呼び出し
       -3.xとqが一致しなかった時
       　-Qにqとxをアペンド
     3.リターン

　自信満々で提出しましたが、setrecursionlimitを拡張していなかったための
 REを食らった上に、関数chkでxとqが一致しなかったときに
 qとxをアペンドすべきところをqとA[i]をアペンドすると誤植していたために
 2回もWAを繰り返しました・・・。ちゃんと見ないとダメですね。

　https://atcoder.jp/contests/abc351/submissions/52866144


以上
タイマーとキー入力を待つだけのスクリプト(Python Windows限定)

# Pythonスクリプトで、タイマー待ち
ただ、一定時間待つ場合、
```python:test.py
import time

waittime = 300
while waittime > 0 :
    print(f"{waittime=}",end="\r")
    time.sleep(1)
    waittime-=1
print()
```

で、OK。

# そんなに待てない。(keyboardモジュールを使ってみる)

5分も待てない。

なにかキーを押すと、タイマーを繰り上げたい。
なるほど、キー入力ならkeyboardモジュールを使おう。

```python:test2.py
import time
import keyboard #pip install keyboard

waittime = 300
endtime = time.time() + waittime
zt = endtime - time.time()

while zt > 0:
    zt = endtime - time.time()
    print(f"waittime={int(zt)}",end="\r")
    if keyboard.is_pressed('q'):
        print("qキーが押されました")
        break

```
どや。

# ウィンドウが非アクティブでもキーを拾ってしまう。

え？

対策として、アクティブウィンドウのハンドルを取得して、タイトルを拾ったりしてもなかなか安定せず。

# getch()で、コンソールから１文字もらう。

コンソールからの入力を拾えれば、アクティブじゃないと入力できないのでgood。
しかし、getch()のみでは、文字が入力されるまで止まってしまうので、kbhit()を併用する。

getch() と kbhit() が、Windows のVCランタイムを使用しているので、Windows限定です。

```python:test3.py
import time
import msvcrt as m

waittime = 300 #秒単位
endtime = time.time() + waittime

print(f"sleep {waittime}sec")

zt = endtime - time.time()

b=b"0"

while zt > 0:
    zt = endtime - time.time()
    khit = m.kbhit() #キーが押されたら1
    if khit == 1 :
        b=m.getch()
        c=int.from_bytes(b, 'big')
        if ord("C") == c or ord("c") == c  :
            print(f"\nKey '{chr(c)}' pressed continue")
            time.sleep(1)
            break
    
    print(f"waittime Last {int(zt):3} sec. Hit 'c'key to continue {khit=} {b=}",end="\r")
    time.sleep(1)

```

スリープを適当に入れないと、高負荷になります。

初投稿でした。
SageMakerのドメイン削除が押せない

# はじめに
こんにちは、ユーゴです。今回は、AWSのSageMakerをいじっていた時に遭遇した問題について紹介します。
もはや機械学習は、エンジニアとしての嗜みで触れないと良くないのでは...と謎の焦燥感を感じて、SageMakerを触っていました。その感覚なので、SageMaker全体の仕組みやら扱いやらが全くわかっていないので、今回は超初歩的なお話です。

# 課題
SageMakerのドメインを削除するボタンが、ホワイトアウト(?)していてクリックできず、削除できない。
![スクリーンショット 2024-04-28 17.55.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/29f48e27-b491-ed68-4124-32950df79e43.png)

# 解決
ユーザープロファイルを消す。

## 1. 対象のドメインを選択
![スクリーンショット 2024-04-28 17.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/bdbfe4e4-f3ed-703f-2219-54b0cdc32603.png)

## 2. ユーザープロファイルを選択
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/1ec1cde1-2d42-ff0a-7f1b-027bc9ffbaf1.png)

## 3. ユーザーを削除
「**編集**」をクリックします。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/e73d1d55-59de-e3e3-bb65-5f402e26783c.png)

「**ユーザーを削除**」をクリックします。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/a03ac8cb-b890-ebed-340c-cf5a8b0d8f13.png)

あとは「本当に削除していいか？」と聞かれるので、削除を決定します。

# 確認
削除できるようになりました。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/494b6007-cc78-3627-e416-45fb4d976bf3.png)

# 補足
関連するS3バケットは残るらしいので、不要なら別途削除してください。

# まとめ
いかがだったでしょうか。今回は、SageMakerの初歩的な操作について説明しました。
このように、AWSの扱い方から、UnityやGASなど幅広いテーマを扱っています。
お役に立てましたら、いいね, LGTM, フォローなどよろしくお願いします！
【データセット作成用】一括正方形リサイズツール

# 概要
ディレクトリ内の画像を一括で正方形にクロップして、任意の解像度にリサイズできるツールを作りました。
YOLOなどのデータセット作成の歳に個人的に使っていたものですが、同じ機能を必要としている方がいるかと思い、共有させていただきます。

既出だったらごめんなさい。

データセット作成の前処理などにお使いください
## Requirements
実行にあたって、以下のコマンドを入力し、必要なモジュールをインストールしてください。
```install.sh
pip install Pillow
```

# コード
コードは`Github`にも同様のものをアップしています。

https://github.com/YaezakuraP/NNresizer.git

```crop.py
from PIL import Image
import glob
import os
from concurrent import futures

FileTypes = ['/*.jpg','/*.png','/*.JPG','/*.PNG']

def crop_center(pil_img, crop_width, crop_height):
    img_width, img_height = pil_img.size
    return pil_img.crop(((img_width - crop_width) // 2,
                         (img_height - crop_height) // 2,
                         (img_width + crop_width) // 2,
                         (img_height + crop_height) // 2))

#--------------------------------------------------

# 並列化用関数
def task_crop(target_file):
    img = Image.open(target_file)
    filename = os.path.basename(target_file)

    # ----正方形にする---
    img = crop_center(img,min(img.size),min(img.size))
    img = img.resize((resized_size,resized_size))

    print('Processing: ',target_file)

    # ファイルを保存
    img.save(f'{output_dir}/{filename}')


input_dir = input('Input data path:').replace('\\','/').replace('"','').replace("'",'')
output_dir = input_dir+'/resized'
resized_size = int(input('Input resized size:'))

# 出力先フォルダの作成
os.makedirs(output_dir,exist_ok=True)


# フォルダの中身を確認
for FileType in FileTypes:
    files = glob.glob(input_dir+FileType)
    # クロップ作業
    with futures.ThreadPoolExecutor() as executor:
        for i,file in enumerate(files):
            executor.submit(task_crop,file)
```

# 使い方
コードを実行すると、`Input data path`と`resized_size`を聞かれます。
それぞれ、一括処理したい画像が入ったディレクトリと、リサイズ後のサイズを入力してください。

# 参考
コードの作成にあたっては、以下のサイトのコードを参考にさせていただきました。

https://note.nkmk.me/python-pillow-image-crop-trimming/
BCM3383のSPIドライバ

USBを試してみたのですがなぜかEHCIのレジスタが見えないので、気分を変えてSPIを試してみました。

FreeBSDのSPIドライバーはコマンドとデータのバイト列を送受信する関数一本で実装されています。

おそらSPIドライバはSPI Flash(mx25l)と一緒に開発されたので、そうなったのだと思います。

Flashを認識するためのIdentはコマンドの送受信だけで処理されて、データの読み込みは、コマンドとデータの送受信で処理されます。

BCM3383のコードを探してみたところ、AtherosやMediatekと同じように古いタイプの仕組みと新しいFIFOを使った処理がありました。

FIFOは512バイトと非常に大きいです。おそらくこれはMX25などのFlashのセクターサイズに合わせたものと思われます。

設定レジスタやFIFOは複数用意されていていますが、あまりうまい使い方が思いつかないし、Broadcom自身のコードでも1本しか使っていません。チップ屋さんとドライバ屋さんは永久に分かり合えないのだと思います。

チップ屋さんはいろいろ機能考えたけど、ドライバ屋さんが使ってくれないと思ってるし、ドライバ屋さんはチップや屋さんは無駄なもの作ってと思ってる。

レジスタの定義でPINGPONGというのがあったのですが、SPIは送信と受信を一緒にするので、そう定義したのだと思われます。

とりあえず書いてみたら、一日でIdentが拾えるようになってうまくいったと思ったらデータの読み込みが出来ていませんでした。

いろいろ試したところBCM3383の転送は一つの処理を複数に分けて処理する事が出来ないようです。

なので、他のドライバーではコマンドとデータの処理を別々にしていたのをまとめて1回で処理するようにしました。

これだと、flashの処理に依存したSPIドライバになるので、あまり塩梅がよくないのですが、ぼちぼち調べてみたいと思います。

1回の転送がFIFOの長さの512バイト以上出来ないのは、ありえないようなきするのだが。

FreeBSDのFlashアクセスでは512以上の読み込み処理があったので、512を繰り返してよむようにしました。

BCM3383のSPIモジュールは、BCM6816,BCM6362と同様のようです。

BCM3383の処理はbcmHsSpi.cで行われていて、BCM3380はbcmLegSpi.cで行われていました。
【WPF】 TabControl の Header を XAML で 非表示にする方法

タブのページ切り替え機能は使いたいけど、デザイン的にタブは使いたくない。例えばナビゲーションメニューの選択でタブを切り替えたい、そう思ったことはありませんか？

WPFのTabContorlでHeaderを非表示にする方法が、くぐっても出てこなかったので、忘備録として記録しておきます。

## TabControlのHeader を非表示にするXAML

TabControl のXAMLを下記の様に記述すれば非表示にできます。
```C#
<TabControl>
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Style>
    </TabControl.ItemContainerStyle>
</TabControl>
```

タブページを含めるとこんな感じです。
```C#
<TabControl >
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Style>
    </TabControl.ItemContainerStyle>
    
    <TabItem>
        <TextBox Width="200" Height="30" Text="aaaaa" />
    </TabItem>

    <TabItem>
        <TextBox Width="200" Height="30" Text="bbbbb" />
    </TabItem>

    <TabItem>
        <TextBox Width="200" Height="30" Text="ccccc" />
    </TabItem>
</TabControl>
 ```

 もしこれでも少し隙間が出る場合、TabItem の PaddingとMarginを 0  にしてみて下さい。
【Windows】Docker Desktop を使っていて“Docker failed to initialize”というエラーが出た

## はじめに
Docker Desktopを開くとたまに“Docker failed to initialize”と出てくることがある。
原因は分からないけど、特にアップデートしたりしなくても起きちゃう。

## よく見る記事の解決策を試してみた結果
記事A「"C:\Users\[ユーザー]\AppData\Roaming\Docker"のファイルを消しちゃえばいいっすよ。」
記事B「"C:\Users\[ユーザー]\AppData\Roaming\Docker"のファイル消して再起動っすね。」
記事C「バージョン悪いかも。Docker Desktopとかバージョン変えたり入れなおしてみて。」

記事Cはめんどくさいし、今回アプデしてないんだよな。
記事A、Bの言う通り、そのファイル消しちゃおう！どうせローカル環境だし。
よし、パス入れて削除してっと、、、ん？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524702/c12ebfc1-96e3-ea44-3ba8-9b4990860df6.png)

Docker Desktop閉じてんのに、なんか動いているから消えねえ。
タスクマネージャ見てみると起動していないのになぜかバックグラウンドで動いてやがる。

## 結論
タスクマネージャから、バックグラウンドで動作しているDocker周りを止めちゃえばいい。
さすれば、後はDocker Desktopを開いてあげるだけで正常運行に復活。

## 原因考察
調べるのめんどくさいから、また起きたら調べます。すみません。
definePropsの戻り値は捨ててもよかった

コンポーネントのプロパティとエミットですが、

```vue:sample.vue
<template>
    <div @click="$emit('click')">{{ message }}</div>
</template>

<script setup>
const props = defineProps([
    "message"
]);
const emit = defineEmits([
    "click"
]);
</script>
```

templateの中だけで完結して、script内で参照しない場合は・・・

```vue:sample.vue
<template>
    <div @click="$emit('click')">{{ message }}</div>
</template>

<script setup>
defineProps([
    "message"
]);
defineEmits([
    "click"
]);
</script>
```

戻り値を捨てても問題ないんですね。
ずっとeslintに「propsは使ってない変数だよ！」怒られてたんですが、ようやく解放されました。
PythonでIFCのモデルをglTFに変換する

# はじめに

IFCファイルのモデルを表示して閲覧するのって、ちょっと手間ですよね？
表示するには、[Open IFC Viewer](https://openifcviewer.com/) や [BIMvision](https://bimvision.eu/) のような専用のソフトウェアをPCにインストールする必要があります。

他の人にIFCのモデルだけ見せたいんだけど...というときにわざわざソフトウェアをインストールしてもらうのもちょっとためらいますよね。
IFCのモデルを特に環境を設定しないでも閲覧できる形式に変換したいときがあると思います。

そこでIFCのモデルをPythonを使って、3Dモデルのファイル形式の一つである`glTF`に変換したいと思います。

## glTFに変換できました

できたよ！やったね？

[GitHub Gist: ifc2gltf.py](https://gist.github.com/kiyuka829/32c0f65d9ecf95eff57802e370e15e6e)

[Babylon.js Sandbox](https://sandbox.babylonjs.com/) で表示させれば、treeも表示できるよ！

![ifc2gltf_tree.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703301/82a9a7cc-6893-3acc-3be1-80c0583b3f1d.jpeg)

選択して非表示にしたり、移動したりもできるよ！（Xの投稿は階層構造ついてない）

https://x.com/kiyuka_study/status/1772612770770440508

## 経緯

最初は `IfcOpenShell` を使えば直接変換できるのではないかと思って調べたのですが、[公式ドキュメント](https://docs.ifcopenshell.org/ifcconvert.html)を見ると `BlenderBIM Add-on` を使う必要があり、直接変換することはできないようでした。

そういうわけで、[`IfcOpenShell`](https://ifcopenshell.org/)と[`pygltflib`](https://pypi.org/project/pygltflib/)を使用して、自力で実装しています。

## まとめ

IFCのモデルを階層構造付きでglTFに変換しました。
glTF形式にしておけば、Windowsのデフォルトでインストールされている3Dビューアーなどでも表示することができるので、ちょっとモデルを見るだけの用途であれば便利です。

え？解説？ほとんどglTFのフォーマットの話になってしまうので、ここではしません。
もしかしたら、別記事でPythonによるglTF出力方法の解説を書くかも？

## 参考

- glTF 

https://pypi.org/project/pygltflib

https://qiita.com/nokonoko_1203/items/827c4afc3ae88666126b

https://qiita.com/cx20/items/2b86cb5052cd7c36038a

https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#glb-file-format-specification

https://github.com/KhronosGroup/glTF-Sample-Models/tree/main/2.0/AlphaBlendModeTest

- Web glTF ビューアー

`Babylon.js Sandbox` が一番使い勝手が良かった。`Three.js`実装の`gltf-viewer` はglTFファイルのフォーマットが誤ってるとどこがエラーか表示してくれるのでglTFフォーマットの確認に便利。

https://sandbox.babylonjs.com/

https://gltf-viewer.donmccurdy.com/

https://playcanvas.com/viewer
DartでParameterized Testを実施してみる

## 概要
[単体テストの考え方/使い方](https://www.amazon.co.jp/%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9-%E4%BD%BF%E3%81%84%E6%96%B9-Vladimir-Khorikov/dp/4839981728) を読んでいたら、Parameterized Test という書き方がでてきたので、早速Dartで実践してみました。

## Parameterized Test
ケースをグループ化して、一つのメソッドにまとめるもの。検証すべき事実（パターン）がたくさんある場合に、テストケースが増えすぎるのを防ぐことができる。注意事項としては、テストコードの量を減らすことと引き換えに、検証すべきことがわかりづらくなるため、正常系と異常系でケースを分けるなどの工夫が必要。

## やってみよう
ShopValueの値から、SuperMarket, DrugStore, OtherStores のいずれかのインスタンスを取得するというシンプルなテストがあります。これをParameterized Testに変更してみます。

### Parameterized前
SuperMarketを生成できることのテストを書きました。このまま書くとすると、ケースをコピペして、DrugStore, OtherStoresのケースも作る必要があります。

```dart:Parameterized前
void main() {
  group('Shops', () {
    test('それぞれのWhereToBuyクラスが取得できること', () {
      WhereToBuy superMarket = Shops.getWhereToBuy(ShopValue.first);
      expect(superMarket, SuperMarket());
    });
  });
}
```

### Parameterized後
3つのケースを、１つの時とあまり変わらない量で書くことができました。特にひとつのクラスに複数のメソッドがある時に、テストケースが膨大にならずよさそうです。

```dart:Parameterizedしてみた
void main() {
  group('ShopValueからそれぞれのWhereToBuyクラスが取得できること', () {
    <ShopValue, WhereToBuy>{
      ShopValue.first: SuperMarket(),
      ShopValue.second: DrugStore(),
      ShopValue.third: OtherStores()
    }.forEach((shopValue, expected) {
      test('shopValueが $shopValue のとき、お店は $expected になる', () {
        WhereToBuy whereToBuy = Shops.getWhereToBuy(shopValue);
        expect(whereToBuy, expected);
      });
    });
  });
}
```

実行結果もわかりやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661656/7630398d-1932-4c8d-7f4a-f63e436097fc.png)

## 参考
https://zenn.dev/yu1ro/articles/ebcae8f2181030

[単体テストの考え方/使い方](https://www.amazon.co.jp/%E5%8D%98%E4%BD%93%E3%83%86%E3%82%B9%E3%83%88%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9-%E4%BD%BF%E3%81%84%E6%96%B9-Vladimir-Khorikov/dp/4839981728)
solana 開発勉強日誌４ 流動性供給（Liquidity Pools）

前回勉強した開発勉強日誌３

https://qiita.com/chanta/items/e58e3cd1e6a00cc77811

そもそも流動性供給（Liquidity Pools）をよく分かってなかった。
作りたいbotを決めなければ、必要な技術知識が分からないし、
知識がなければ作りたいbotが思いつかない
浅い知識ではあるが、分かった所をまとめていく。理解が浅いので解釈ミスあるかも



流動性供給（Liquidity Pools）について勉強する
流動性供給についての説明は下記NOTEが分かりやすかった。

https://note.com/crypto2real/n/nf6057288e26c



要点をまとめるのは難しいが、
トークンとトークンの価格を下限上限と設定する事で、スワップが行われた際に
自分の設定した価格帯で流動性供給（Liquidity Pools）が使われると設定された手数料が入りますよ。との事

その際のデメリットは変動損失
![014aa2bcdf82454994ffda7ced798a3d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3573208/831f3a67-2c98-2bc5-4338-d333d4b88a01.png)

https://image.binance.vision/editor-uploads/014aa2bcdf82454994ffda7ced798a3d.png

変動損失(Impermanent Loss)が発生すると
1.25倍の価格変動 = 0.6%の損失
1.50倍の価格変動 = 2.0%の損失
1.75倍の価格変動 = 3.8%の損失
2倍の価格変動 = 5.7%の損失



単純に流動性供給（Liquidity Pools）を使えば稼げるという訳ではないらしい
手数料の発生の仕組みなどは下記がわかりやすい


https://note.com/crypto2real/n/ndde88ebd78ee


流動性供給（Liquidity Pools）には
どういう形で発展したのか分からないが
Whirlpools（ORCA
CLMM（kamino
DLMM　(meteora

などがある


下記がmeteoraに書かれた原文


Important Notes

The ratio of tokens is how the initial pool price is set. It is important that this is the market price or you will get arbitraged away. So if you create a SOL/USDC pool, you would need to add 75 USDC for every 1 SOL you add to the pool. If this is way off you can lose money as arbitragers take advantage of your low price.

You need a minimum of $500 in liquidity (combined value of token pair) for your pool to be picked up by Jupiter. This may take 30mins for the crawler to update. If at any time the liquidity goes below $500 then it will auto-delist from Jupiter, but once it goes above, it will auto-relist.

It may take a few minutes for your pool to appear on the Meteora pools list, but if the transaction is successful then it will be created on-chain.




それぞれ流動性供給（Liquidity Pools）の方式に特徴はあるが、
注意すべき点は、流動性が低い所に流動性供給（Liquidity Pools）を行ってしまうと
市場価格とズレが発生しarbitragersの収益源になってしまうという事を理解した。


分かった事
簡単に儲かる流動性供給（Liquidity Pools）はない
atmicarbの収益源である鞘の発生は流動性供給（Liquidity Pools）が市場価格と乖離する事によって起こる事がある
Visual Studio Codeでカバレッジ付きでJUnitが実行できるようになった！！

ついに・・・Visual Studio Codeでカバレッジ付きでJUnitが実行できるようになりました :grin: :grin: :grin:

> **NOTE:**
>
> これまではMavenなどでJacocoのカバレッジレポートを出力し、出力したレポートをVSCodeのUI上に反映することはできましたが、これで直感的にカバレッジを確認することができるようになります！！
>
> https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters

* https://github.com/microsoft/vscode-java-test/releases/tag/0.41.0
* https://github.com/microsoft/vscode-java-test/issues/387

こんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117313/18ee2d9b-d54a-e4b5-281e-7542824d77d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117313/3550d953-d95e-3415-1c5f-9783b159b818.png)

やったね！！

### 小ネタ①

カバレッジ状態をインラインでハイライト表示するか否かを制御することもできます。

インラインでハイライト表示していない状態：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117313/2f5e2020-f5df-82a6-5c60-0cd6a2071afd.png)

インラインでハイライト表示している状態：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117313/84828937-34c9-9514-a01c-04bdaa006259.png)

### 小ネタ②

カバレッジ状態をクリアする方法は以下のとおり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117313/ff88e83d-48e0-121a-30df-4dc7500c8385.png)
Windows10系统从UEFI修改为BIOS启动模式

1. 备份EFI和RECOVERY分区的数据。
1. 删除EFI和RECOVERY分区，只保留系统分区。
1. 系统分区调整大小，占用原来的EFI和RECOVERY分区的空间。
1. 分区格式，从GPT改为MBR。
1. 系统分区设置为活动分区。
1. 修复系统盘MBR和系统分区PBR。
1. 从BIOS启动模式的Windows10系统，复制bootmgr和BOOT目录。
1. 用BCD编辑工具，修改系统分区BCD信息。
【RotorHazard】まっく氏、組み立てます！(｀・ω・´)

# 29. RotorHazard BOXの組み立て手順

### 29-1. RotorHazard Box側の組み付けと調整

ひとつ前の章で、RotorHazard BOXにそれぞれのパーツを設置していきました。ダクトファンの設置＋網戸貼り。サイドのフィン部にも網戸貼り。デジタル電圧計の設置、LED用のコネクタ出しをしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/a5c902f8-b5aa-d62b-3227-113eacd0744f.png)

次にRotorHazard Arduino PCB v1.2を用意します。純粋な基板にヘッダピンや抵抗、電源ケーブル、RX5808をはんだ付けしますが…すみませんｗ ここはやってもらっちゃったので割愛しますー！
いくつか後付けで2.54mmピンヘッダは後からワイがはんだ付けしたのもありますが、基本は [**ninjaMoonLight**](https://twitter.com/masaaki_oyama)さん にお願いしちゃったため画像だけー。ちなみにこの時点でArduino Nano互換機には既にNodeプログラムは書き込み済です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/65888457-cfbb-466e-a08a-1a9d95c71ec0.png)

Nodeプログラムの書き込みは、以前にRotorHazard for PC版で記事にしたのですが、下記を参照して実施してみてください。ちなみにNode番号(NODE_NUMBER)は4台とも特に編集せず **0(ゼロ)** のままでOKです。

https://qiita.com/tmac116/items/31b8dcebe86fb13350e9

### 29-2. Raspberry Pi 3Bを装着、全体組み付け

それでは、今度はラズパイ(Raspberry Pi)3Bを組み付けていきましょう。

① 一番下の層にラズパイを装着します。**M2.6 × 8mmビス** を使いますがお好みでスプリングワッシャーを入れても良いでしょう。そして装着時の回しすぎに注意してください。一発でナメますｗ (ワイ、既に一ヶ所怪しい場所があります。)

② 取り回し的にはそこまで悩ましくはないものと思います。ですが完璧な仕上がりを求める取り回し…となりますと結構気を使うのではないかと思います。またラズパイ側の **Pin#02～Pin#06** は、集中して挿入されていますので2.54mmピンヘッダが抜けないようマスキングテープで軽く巻いても良いかと思います。

③ ラズパイとの結線ができたら、一度取り回しに問題がないかを再確認します。この時点で一度起動してみても良いでしょう。ぜひ **指差し確認** を忘れずに！ｗ

④ 最後にもう一度、RTCモジュールの取り回しを別途実施します。今回ワイはPCB基板の裏側にマスキングテープで張り付けるような取り回しにしました。

⑤ 再度電源を投入し、各種問題がないかを再確認してください。(焦げ臭いとか…ありますと泣けてきますので)

また理解しやすくなるよう、下記にコメントを記載しました。いかがでしょうか？公式サイトよりも深い理解はできましたか？ｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/4c3726e7-0abe-de90-09f8-de4cea9f96da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/2ba5502a-d431-f192-f766-6b1b44e8e436.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/110d686f-72c9-32cc-5095-0b78e272d9c2.png)

ラズパイ構築編のつづきはこちら

https://qiita.com/tmac116/items/07639633ecb4d252aa0d
Rustのコンパイラと戯れる 〜 4日目

今日は、`deprecated`属性として付与された内容の取得を試みてみる。

## 取得方法

`rustc_middle::ty::TyCtxt`の`lookup_deprecation`に、`rustc_span::def_id::DefId`に渡すことで取得できる。

https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html#method.lookup_deprecation

取得できる値は、`rustc_attr::Deprecation`型。

https://doc.rust-lang.org/nightly/nightly-rustc/rustc_attr/struct.Deprecation.html

この型の値の`since`フィールド (`rustc_attr::builtin::DeprecatedSince`型)を見ることで、`deprecate`されたバージョンもしくは将来廃止予定なのかどうかが取得できる。

https://doc.rust-lang.org/nightly/nightly-rustc/rustc_attr/builtin/enum.DeprecatedSince.html

また、`note`フィールドには代替案の文面を取得できる。
加えて、`suggestion`フィールドも持つが、`std`では使用していなかった（ような気がする）。

以下、主要どころな各要素の`DefId`の取得方法。

### rustc_hir::Mod直下の構成要素

`rustc_hir::Item`の`owner_id`フィールド(`rustc_hir::OwnerId`型)に対して、`to_def_id()`メソッドを実行する。
`Struct`、`Enum`、`Trait`、`fn`、および型エイリアス(`pub type〜`)などに付与された`deprecated`情報の取得はここから

### Traitのメンバー

`rustc_hir::ItemKind::Trait`ヴァリアントがスライスとしてもつ`TraitItemRef`の`id`フィールドが起点。
この値ののフィールド`owner_id`に対して`to_def_id()`メソッドを実行する。

### Implのメンバー

`rustc_hir::ItemKind::Impl`ヴァリアントがもつ`rustc_hir::Impl`型の要素が起点。
`rustc_hir::Impl`がスライスとして有するフィールド、`items` (`rustc_hir::ImplItemId`型)を経由
この値の`id`フィールドが`owner_id`フィールドを持つため、この値に対して`to_def_id()`メソッドを実行する。

`impl`の場合、実装している型や`Trait`に`deprecated`が付与されている場合、各メンバーに付与されているとは限らないことに注意。
（少なくとも、`std`では型のみに付与されていた）

このような場合でも、`rust`の`API`リファレンスでは、各メンバーを`deprecated`として扱っているため、
同様の扱いをするのであれば、実装している型た`Trait`の`deprecated`も見る必要がある。

取得は以下の通り

#### `Impl`から`Trait`の情報の取得

`rustc_hir::Impl`の`of_trait` 
(`rustc_hir::TraitRef`型)の`hir_ref_id`(`rustc_hir::HirId`型)を中継。
-> `HirId`の`owner`フィールドから`to_def_id()`メソッドを実行する。

#### `Impl`を実装する型の情報の取得

`rustc_hir::Impl`の`self_ty`(`rustc_hir::Ty`型)を中継
-> `Ty`の`hir_id`(`rustc_hir::HirId`型)フィールド
-> `HirId`の`owner`フィールドから`to_def_id()`メソッドを実行する。

#### 型の詳細情報から取得

上記は、`deprecated`属性をソースコードに明示的に記述した場合に取得できる。
`derive`マクロ等で生成された`impl`の場合は、`deprecated`情報が取得できなかった。

この場合、型情報(`rustc_hir::Ty`)を深く辿る必要がある

`std`では大半は以下のケースで取得できた。

`rustc_hir::TyKind::Path`の`rustc_hir::QPath::Resolved`型の要素
-> `rustc_hir::QPath::Resolved`の`rustc_hir::Path`型の要素
-> `Path`の`res`フィールド (`rustc_hir::def::Res`型)
-> `rustc_hir::def::Res`型の各ヴァリアントが有する`DefId`
【CSS】画像を特定のアスペクト比でトリミングする方法

`img`要素に`aspect-ratio`と`object-fit: cover`を指定することで`aspect-ratio`の比率で画像をトリミングできます。

```css
img {
    aspect-ratio: 1 / 1;
    object-fit: cover;
}
```

https://developer.mozilla.org/ja/docs/Web/CSS/aspect-ratio

https://developer.mozilla.org/ja/docs/Web/CSS/object-fit
MLX で OpenELM を試してみる





# 目的
mlx を用いて OpenELM で text generation を動作させてみる


# node
- mac
    - m1
    - mem: 16GB



# mlx とは
apple シリコン上での機械学習研究のためのフレームワーク

- 参考記事
    - https://gigazine.net/news/20231207-apple-silicon-mlx-machine-learning/
- 公式 github
    - https://github.com/ml-explore/mlx
    - https://github.com/ml-explore/mlx-examples
        - ここを参考に色々試せる
- 要は
    - apple シリコンに最適化されていると解釈する
    - よくわからん



# 所管
- m1 macbook air, nvidia gpu 無しでの速度としては十分
   - 1B model も memory 16GB で動作した
- text 内容は判断を見送る
   - 使い方の問題もありそう
   - 素の1Bの状態では微妙に思えた
- mac studio 64G~128G などで, 高容量モデルを試してみたい所
   - 会社でも小規模なら耐えうるかもしれない



# 1B 8bit model の参考動作
![2024-04-28_1607.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/cc82e6d8-cbbc-79a1-2fac-3fe3bf7c529d.gif)



# 使用できるモデルと how to use
https://huggingface.co/mlx-community



# install
注
環境が汚れているので, 以下だけでは setup が完成しない可能性もあります

```
pip install mlx-lm
```


# sample code
```test.py
from mlx_lm import load, generate

model, tokenizer = load("mlx-community/OpenELM-1_1B-8bit")

response = generate(
    model,
    tokenizer,
    prompt='please tell me about programming language ruby',
    verbose=True,
    max_tokens=512,
    temp=0.0,
    repetition_penalty=3.2,
)
```


run. 以下で上述の gif のように動作するはず
```
python test.py
```




# 余談: 3b model の壊れた出力
unk

![スクリーンショット 2024-04-28 16.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118627/aaac60f0-a4b7-6586-87d1-83524394de2e.png)
AtCoder ABC351 C問題

https://atcoder.jp/contests/abc351/tasks/abc351_c

![2024_04_28 ABC_351_C問題.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/51dedc1b-ff52-8807-d3b2-d51e5db6c49e.jpeg)

![2024_04_28 ABC_351_C問題 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/17d1c6d3-773b-342c-0cb6-43c48d260ce5.jpeg)


普通に2＊＊a[i]リストに追加すると処理が重くなる。2＊＊a[i]のうち2の部分は他と変わらないので、a[i]だけ見る。
後は問題文を素直に実装してAC。

![2024_04_28 ABC_351_C問題 (3).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3768836/26f7adab-e3d3-d073-e6a3-661c3529b3ba.jpeg)
[flutter] super.keyって結局何？

## 初めに
ウィジェットを作成する際に、呪文のように書いているXxx({super.key})ですが、全く意味が推測できなかったので自分なりに調べてみました。
そもそも、super.keyってなんかすごいスーパーなことしてそうですよね。

## そもそもXxx()では何が行われているのか
例えば、ステートレスウィジェットを作成する際は以下のように記述しますよね
```dart
class Xxx extends StatelessWidget {
    Xxx({
        // ここ
    });

    @override 
    Widget build(BuildContext context) {
        return Container();
    }
}

```
これはstatelessWidgetを継承しているXxxの初期化を行っています。
つまり、ここで引数を受け取ってXxx内で使えるようにしているんですね。

## 本題
じゃあsuper.keyって結局何？という本題に入ります。
superとkeyに分けて説明しますね。

### superとは
先ほど、`statelessWidgetを継承しているXxx`といいましたが、flutterが用意してくれている親クラスのstatelessWidgetを使って自作でXxxを作成しているということなんですね。
そのため、親クラスのstatelessWidgetの機能を呼び出さないとXxxは使えません。
そこで、`super`を使用することで、拡張（継承）元のクラス（親クラス）のコンストラクタやメソッドを呼び出して、その機能をXxxウィジェットにも適用させることができます。だから、初期化時にsuperが必要なんですね。

### keyとは
`key`はその名の通り鍵です。
では、なぜ`key`が必要なのかというと、例えば親クラスのstatelessWidgetには子クラスXxxやYyy、Zzzがあった場合それぞれ識別する必要があります。そこで使うのが`key`です。

## まとめ
つまり、super.keyという記述は、XxxウィジェットがstatelessWidgetの機能を継承するために必要なコンストラクタの呼び出しを行い、その中でkeyを使ってXxxを識別します。
これにより、Flutterはウィジェットの状態管理やUIの更新を効率的に行うことができるんですね。
**これは、statelessWidgetだけではなく、statefullWidgetも同じことが言えます**
DPまとめコンテスト解説（開発中）

# DPまとめコンテスト解説（開発中）
## はじめに
こんにちは、競プロ歴1年（多分）のmikan0131（AtCoder茶）です
僕のQiitaの初投稿はDPまとめコンテストの解説です

https://atcoder.jp/contests/dp

初心者の解説なので、わかりにくいかもしれないですが、ぜひ見ていってください！
## A Frog1
### 問題
Nこの足場があります。足場には1, 2, ...., Nと番号が振られています。各i(1 <= i <= N)いついて、足場iの高さはh_iです。
最初、足場1にカエルがいます。カエルは次の行動を何回か繰り返し、足場Nまで辿り着こうとしています。
・足場iにいるとき、足場i + 1またはi + 2へジャンプする。このとき、ジャンプ先の足場をjとすると、コスト|h_i - h_j|を支払う。
カエルが足場Nに辿り着くまでに支払うコストの総和の最小値を求めてください。
### 制約
* 入力はすべて整数である
* 2 <= N <= 10^5
* 1 <= K <= 100
* 1 <= h_i <= 10^4
### 入力
```
N K
h_1 h_2 ... h_N
```
### 出力
カエルが支払うコストの総和の最小値を出力せよ。
### 解説
動的計画法の基本といえる問題です。
足場iにおいて、足場i - 2からジャンプするか、足場i - 1からジャンプするかで、コストの総和が小さいほうを採用するのを、足場3からNまで繰り返します。足場1のコストは0、足場2のコストは、足場1からジャンプするしかないため、一意に定まります。

### 解答
```cpp:solve.cpp
#include <bits/stdc++.h>
using namespace std;

int N, h[100009], A[100009], B[100009];
int dp[100009];

int main() {
  cin >> N;
  for (int i = 1; i <= N; i++) cin >> h[i];
  for (int i = 2; i <= N; i++) {
    A[i] = abs(h[i] - h[i - 1]);
  }
  for (int i = 3; i <= N; i++) {
    B[i] = abs(h[i] - h[i - 2]);
  }
  dp[1] = 0;
  dp[2] = A[2];
  for (int i = 3; i <= N; i++) {
    dp[i] = min(dp[i - 1] + A[i], dp[i - 2] + B[i]);
  }
  cout << dp[N] << endl;
  return 0;
}
```
個人的にお勧めする勉強の順番について

# はじめに

IT業界に入ったばかりの人は、分からないことだらけで、何から勉強するか迷うかもしれません。
書店に行っても、様々な種類、レベルの書籍が大量に積み上げられています。

そこで、今回は私が個人的にお勧めする勉強の順番をご紹介します。

（以下、「だ、である」調で記載する）


# 分類

勉強するスコープの種類を、「実務」「基礎」「トレンド」に分ける。

実務　＞　基礎　＞　トレンド
の優先順位で勉強する。

まずは、自分が関わっている案件のアウトプットの質を上げるところ（短期的な成果）に注力し、慣れてきたら、基礎（長期的に活用できる知識）や、トレンドを押さえるのが良い。

まだ案件が決まっていなかったり、これからIT業界に入ろうとする人は、基礎に取り組むと良い。

# ①実務

仕事で使っている、言語、フレームワーク、ミドルウェアなどで、詳しくないものがあれば、まずはそれを勉強する。

具体的な勉強方法の例を以下に示す。

## 本を買って読む
オーソドックスな方法。
Amazonなどで、以下の点を確認すると良い。
・出版日が古過ぎないこと
・ユーザからの評価が高いこと
・自分のレベルに合っていること（難し過ぎず、簡単すぎず）
・手を動かして覚えるタイプのものだと、記憶に残りやすい
（事前に立ち読みしておくことが望ましい）

## ベンダー資格試験を受ける
勉強した証拠になり、転職時などのアピールになる。
・高額な受験料の試験があるので、そこまでして取る価値があるかに注意する。
・対策本（勉強法）が用意されていること

## 情報発信をする（ブログなど）
単純に、知識や定義の伝達を目的としてしまうと、本家の公式サイトを見る方が良いことになってしまうので、自分の経験談や感想などを混ぜて書くと良い。

# ②基礎

流行に左右されない、汎用的に使える能力を鍛える。
情報処理技術者試験がおすすめ。
ただし、試験範囲がSIer寄りになっており、Web系が弱いため、
Web検定や、Web解析士などで必要に応じて補強すると良い。

Linuxだと、標準教科書が無償で公開されているため、活用するのも良い。
https://linuc.org/textbooks/linux/
https://linuc.org/textbooks/server/

個人の意見だが、単独の著者が公開しているものより、IPAやLinuCなど、団体が定めた「基礎」の方が信用できる。

# ③トレンド

流行りの技術を、表面だけでも押さえておく。
Web上で定期的にチェックするでも良いが、ある程度キュレーションされたものが良い。
「ソフトウェアデザイン」などの雑誌を読むのがおすすめ。

# 他の考え方

今回は、自分の勉強法を紹介したが、以下の考え方も間違いではない。
* 気持ちドリブン
    * 自分のやりたいこと、関心のある分野を優先する
* 実利ドリブン
    * 求人数、単価などの推移を元に、勉強するものを決める
統計学の基礎を身につけるための統計検定2級の活用法

私が統計検定2級を受験したのは何年も前のことであり、まだペーパーテストの時代でした。そのため、この記事は最新の統計検定2級の試験には即していない部分があるかと思います。一方で統計検定2級をベンチマークとして勉強していくと統計学の基礎が必然的に固まっていくため、非常に良いベンチマークであると思っています。

この記事では私がどのように統計学を勉強し統計検定2級に合格、優秀成績賞を勝ち取れたのかを徒然なるままに書いていきたいと思います。

## TR;DR

基礎力をつけたいのなら

- [ベルカーブの統計WEB](https://bellcurve.jp/statistics/course/)をひたすらやる

- 2級試験の過去問演習は直前期だけで良い

## 統計学を勉強する必要性にせまられる

あれはM1の冬でした。実験結果をRで解析にかけ、*P<0.05*が出て喜んでいた時の事です。指導教官の先生から、「自由度は？」、「統計量は？」、「そもそもANOVAってなんなのか理解してる？」と質問攻めにされました。当時の私は統計学をさっぱり理解しておらず、Rで`anova()`、`glm()`、`t.test()`などの関数を脳死で実行し、*P<0.05*という結果が出るか出ないのかという点だけを見ていました。もちろん、関数の中身は完全にブラックボックス状態で実行しています。先生からの質問に答えられるはずもありません。私がD進を決めていたこともあるでしょうが、統計学をきちんと勉強せよと先生からお叱りを受けました。

その時、渡された本がこちら。

https://www.kinokuniya.co.jp/f/dsg-01-9784320056398

今となっては非常に良い本で、わかりやすく書かれていると思いますが、当時の私には難しく、途中で読むのをやめてしまいました。

もう少しわかりやすい本はないものかと大学の図書館で本を漁っているとこの本に遭遇。

https://www.ohmsha.co.jp/book/9784274220807/

紙面のほとんどが絵で構成されていて、ビジュアル的に非常にわかりやすく、この本をとりあえずは読んでみることにしました。

一方で細かく読んでいくと詳細なロジックの解説については端折られ、いきなり「こうなる！」というような解説に頻繁に出会しました。わかりやすさを重視すると詳細部分については端折る必要があるのでしょう。こうした部分についてはネットで検索したり、図書館の蔵書をあたるなどして、情報を補いながら読み進めました。

## 統計検定と出会う

こうした、わかりやすい本というのはわかった気にさせるのが非常に多い上手く、私も例に漏れずわかった気にはなりました。ただ、本能のどこかでは「絶対わかってないな」とも思っていました。そうした中、「統計検定2級対応」や「統計検定」という文字が図書館の蔵書やネット記事からチラチラ目に入ってきました。

気になり「統計検定」を調べてみると統計検定という試験があり、2級がちょうど勉強したい統計学の基礎の部分に対応していることがわかりました。そこで、半年後の試験に照準を合わせ、統計学の勉強をしていくことを決めました。

## 本格的な統計学の勉強を開始

まず、購入したのが最新版の統計検定2級の過去問集。おそらく、統計検定2級に関しては統計学の基礎を理解していなくても、過去問集をやり込めば合格は可能でしょう。しかし、今回の目的はあくまで基礎の勉強であり、2級の試験は理解度チェックです。そのため、この段階ではどのような問題が出題されているのかを把握するためにチラチラ読むだけに留めました。

続いて、勉強に使用した教材ですが、ベルカーブの統計WEBを利用しました。

https://bellcurve.jp/statistics/course/

このサイトを3周すればかなりの基礎力が付きます。わかりやすい言葉で1から10まで丁寧に解説されています。また、章末問題も充実していて、かなり細かく理解度チェックができます。このクオリティーの教材が無料で公開されているのは非常にありがたいです。

2級では計算力も問われそうなことから、マセマの演習確率統計キャンパス・ゼミにも取り組みました。

https://books.mathema.jp/books/ltqyv18iobg77ms24menuk6puwsfbvc2

こちらは、ベルカーブの統計WEBを2周目するところから開始。一方で、2級レベルに対してはオーバースペックではあるので、難しい問題などはスキップして一通り解きました。正直、この本はやらなくても良いかもしれません。

## 直前期（3週間前）

直前期はひたすら問題演習をするために、ベルカーブの統計WEBの章末問題をひたすら解きました。また、この時期から、過去問演習も開始。1週目では2級の出題形式に慣れていないこともあり、かなり間違えました。出題形式になれるという意味でも過去問演習は必須です。

## 終わりに

結果として、2級試験には合格し、優秀成績賞も受賞できました。この時、身に付いた基礎力のおかげで、D3でかなりクセのあるデータの解析（実験系が悪いという真っ当なツッコミはご容赦ください）もこなすことができ、論文化もできました。また、統計学の基礎力に対する自信が現職に応募する動機、アピールにもなったと思います。社会に出てからもベイズ統計に挑戦する基礎力になりました。皆さんも、統計学の基礎の勉強に2級を活用してみてはいかがでしょうか？

私も久しぶりに統計検定（準1級・1級）に挑戦し、基礎力の強化をしたいと思います。
AWS transcribeをさわってみた

## はじめに

AWSサービスをもっと使っていきたいと思っているなかで、
知っているけど手を出したことがなかったサービスを使ってみる。

今回はAWS Transcribe

## AWS Transcribeとは

AWS Transcribeとは、自動音声認識のサービスで、
例えばリアルタイムの議事録を起こしてくれたり、音声ファイルから文字起こしを行ってくれる。

私が特に気に入っているのは、2点

1. 事前登録した単語から、音声認識の精度を上げてくれること
2. 参加者ごとの音声の使い分けをしてくれること

今回は、上記の2点の箇所までいかないが、音声ファイルから文字起こしするところまで行ってみる。

## 今回実践すること

今回は、音声ファイルをS3にアップロードしてそのファイルを文字起こしすることを実践してみる。

テストを行い実際に運用レベルに持っていくまでの提案材料を作成する。

## 実践内容

1. 音声ファイルを作成する
2. AWS S3にアップロードする
3. 作成した音声ファイルをAWS Transcribe job を作成して音声をテキストにする
4. テキストファイルをJSONファイルにして、


## 実践メモ

6人　1日1時間電話　20営業日　＝　120時間 * 60 = 7200分
7200 * 0.024 = $172.8 * 150円/$1 = 25,920円
※$1.44/h = 216円/h  1日3時間で648円/1day

## 感想

もっと安くできたら通常運用できるけど、
何かを組み合わせないといけないところをどうしたらいいかを考えたい
JavaScript で、画像ファイル群が存在するかちぇくプログラム。

苦労してやっとできた。

```javascript
/*  定義  */
let faile_ch_li = "";
var aru_arr = ['imge/cyat.png','imge/gall_1.png','imge/gall.png','imge/H_na_gazou.jpg','imge/man1.png',];
aru_arr.push('imge/んんん.png');//'imge/んんん.png' fileは確実に存在する名前付けの最後のファイル名でソートの最後のファイル名
var aru_arr2 = aru_arr;
faile_check();
/* faile_check */
function faile_check(){
    alert('faile_check');
    count_n = 0;
    for(let i = 0; i < aru_arr.length; i++){
        checkFileExists(aru_arr[i]);
    }
}
/* checkFileExists */
function checkFileExists(url) {
    var path_f = url;
    var element_f = new Image();
    element_f.onload = function () {        
        var width_f = element_f.naturalWidth;
        var height_f = element_f.naturalHeight;
        for(let i = 0; i < aru_arr.length; i++){
            if(aru_arr2[i] == path_f){
                aru_arr2.splice(i, 1);
            }
        }
        faile_ch_li=width_f + ' * ' + height_f;//使わない変数を処理して置く
       // if(!path_f){faile_ch_li="問題が解決見つかりました。";}else{faile_ch_li="問題なし。";}
       // alert(faile_ch_li +aru_arr2.length+ ' * ' + path_f + ' * ' + width_f + ' * ' + height_f);
        if(path_f == 'imge/んんん.png'){
            if(aru_arr2.length == 0){
                alert('全てのファイルが存在します。');
            }else{
                faile_ch_li=aru_arr2.join('\n');
                alert('無いのは '+aru_arr2);
            }
        }        
     };    
    element_f.src = path_f;     
}

```

![スクリーンショット 2024-04-28 155256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625232/9289caa3-8d5f-db93-70b9-cc7456283cb2.png)

参考にどうぞ。
【React 学習】プログラミング初心者が React の実務に入るまでに学習したこと

## はじめに
今回は、プログラミング初心者の自分が React の実務に入るまでに学習してきたことについて解説していきます。

就活的な内容は省いて、色々学習してきた中で良かった教材をピックアップしていきます。

それでは、頑張っていきましょう。

## Progate
まずは Progate をしました。Progate が出している講座は殆ど勉強したかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780238/4fdeb15d-704e-f425-06a5-5496b7be8a4a.png)

https://prog-8.com/

これで、なんとなくプログラミングの基礎は身に付きますが、まだ殆どコードは書けません。

ただ、他の教材を学習する際に Progate でプログラミングの基礎を学習しておいたのがかなり役に立ちました。数ある教材の中で、一番分かりやすいかと思います。

## 1冊ですべて身につくHTML & CSSとWebデザイン入門講座
HTML・CSS に関して様々な動画・本を学習しましたが、この本が一番良かったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780238/1e70a917-0915-554c-508e-7d1bf8f90493.png)

「一冊ですべて身につく」と書いてある本ですが、同じ作者がまさかの続編を執筆されていました。それが、下記に紹介する「ほんの一手間で劇的に変わるHTML & CSSとWebデザイン実践講座 」です。

## ほんの一手間で劇的に変わるHTML & CSSとWebデザイン実践講座 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780238/f1bcfadf-3fe1-3ac9-82da-b9b34005ef4a.png)

こちらの本も、かなり分かりやすかったです。HTML・CSS に関しては、上記の二つの本に書いてある内容をマスターすれば、後は実際にコーディングしていくだけで身に付くかと思います。

## TypeScriptの型入門
https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a

TypeScript はこちらの記事で学習しました。内容としてはかなりしっかりしているので、こちらの記事に書いてあることをマスターすれば、TypeScript はある程度書けるようになるかと思います。

## りあクト！ TypeScriptで始めるつらくないReact開発 第4版
https://booth.pm/ja/items/2368045

HTML・CSS・JavaScript の基礎知識がある前提ではありますが、こちらの本がかなり良かったです。ちなみに、三冊あるのでぜひ学習してください。

内容としては初心者には非常に難しいですが、かなりしっかりと解説されています。JavaScript・React のかなり深い内容が書いてあるので、読み物としても非常に面白いです。

自分は、比喩表現無しでこちらの本を 7 週ほど学習しました。

この本を学習し終わる頃には、React の理論についてかなりしっかりと学ぶことができたかと思います。

## チャート式問題集の用に学ぶ React・Next.js・TypeScript・Tailwind CSS
https://www.udemy.com/course/react-chart-app/

React の動画教材としては、こちらの Udemy の講座が非常に良かったです。

React の理論の学習というよりは、実際に数々のコーディングをすることで Reactの構文や実際に書く上での考え方を身に着けることができました。

プログラミングは書くことが非常に大事かと思われます。単純に書く量を増やしてくれるような教材はあまりないので、かなり助かりました。

## 最後に
ここまでで、自分が React を学習する際に役に立った教材のまとめは終了です。

少しでも皆様のお役に立てれば幸いです。お疲れさまでした。