OmniAICreator/Qiita-1.07M huggingface dataset:
Jetson AGX Orinを使いこなすうえで参照するリポジトリ


# 想定する読者
- Jetson AGX Orin ユーザー
- 画像認識、機械学習系の関心を持っている人
- すでに移植済みのモジュールがあれば、さっさとデモを動かしたい人

## URLS
### https://github.com/dusty-nv/
- https://github.com/dusty-nv/jetson-containers
![Screenshot from 2024-04-23 14-01-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/cf49ae38-594b-c9af-050c-a2fba7a0c2ba.png)
- これらの用途に対するdocker imageを得ることができます。
- 使用しているJetsonでのJetPacKのバージョン（もしくはL4Tのバージョン）にあうdisk imageを取得すれば、利用するアプリケーションの立ち上げがしやすくなります。
- https://github.com/dusty-nv/jetson-inference
![Screenshot from 2024-04-23 14-05-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83761/05f42ce5-840d-1164-f0e2-a9c16730cb24.png)
- 図に示してある種類の画像認識タスクを実行することができます。

### https://github.com/NVIDIA-AI-IOT
- https://github.com/NVIDIA-AI-IOT/torch2trt
- pytorch で学習されたモデルをTensorRT に変換するツール
- https://github.com/NVIDIA-AI-IOT/nanoowl
- OWL-ViTのTensorRT対応版（open vocabulary object detectionの１つ）
### https://www.jetson-ai-lab.com/index.html
- https://www.jetson-ai-lab.com/tutorial_nano-vlm.html

### https://huggingface.co/docs/transformers/ja/index
- transformers のライブラリで huggingfaceを使っている人も多いだろう。
- このサイトのモデルは、大規模言語モデルを使っているものが多い。
- メモリの潤沢なGPUボードを利用しているUbuntuPCを想定しているのが多いだろう。
- しかし、中にはjetson AGX Orinで動作するもの（わずかな改変で動作するもの）が含まれているだろう。


### https://github.com/MACNICA-CLAVIS-NV
- NVidiaの代理店であるMACNICA が作っているとみられるgithub

## 宣伝
- Jetson AGX Orinを使って、複数のリポジトリでdockerを使いつつ作業を進めていくと、ディスクスペースの枯渇に直面する。
- その状況への回避方法を以下の記事に書いた。
- [jetsonでのディスク枯渇対策　microSDの利用](https://qiita.com/nonbiri15/items/2a6b1fcc1a373e2b084c)
- [jetsonでのディスク枯渇対策　dockerの場合 その２](https://qiita.com/nonbiri15/items/f53094f1a88804aa135f)
#Javascript #プログラミング #Tetris # テト譜をテキスト化する #Chrome 拡張機能

**本内容を利用した場合の一切の責任を私は負いません。**

# 機能
タイトル通り。
テト譜は下記のサイト。
https://fumen.zui.jp/
内容を引用する時にスクショだと画像で容量を食ったり扱いにくいためテキスト化する。
色は表現できないが地形はわかる。
落ちてくるミノはよく使われるアルファベットで示せば、全て文字情報で扱える。
(棒はI、四角はOとか。)
テト譜は時系列があるが、これは簡易的なものなので対応していない。

![TetohuToText.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/f5bec60a-7060-9931-0bcd-de35f45ee15a.png)

# バージョン
* OS
OS 名:Microsoft Windows 10 Home
OS バージョン:10.0.19045 N/A ビルド 19045
システムの種類:x64-based PC

* Chrome:バージョン: バージョン: 123.0.6312.122（Official Build） （64 ビット）

# 準備
1. 下記の既存のChrome拡張機能の準備
[https://qiita.com/qiita21409102/items/b4a604b3180302455ad1](https://qiita.com/qiita21409102/items/b4a604b3180302455ad1)
(この中に含めたため。)

# 使い方
1. テト譜サイトを表示
1. フィールド作成
色情報は含まれないため、適当にデフォルトのままフィールドのマスをポチる等。
1. 「データ出力」ボタン押下
テト譜の機能でフィールドがデータ化され、フィールド下部に表示される。
1. 「ToText」ボタン押下
更に下のテキストエリアにフィールドをテキスト化したものが表示される。

# 補足
この機能だけのことではないが、この拡張機能パッケージにいろいろ詰め込むつもりなので、そのうち各機能のON/OFFスイッチを実装する予定。

# 主な履歴
あまり使ったことのないDatabricksのビジュアライゼーションを試す

Databricksノートブックやダッシュボードでは様々な可視化を簡単に行うことができます。ただ、普段使いしているのは棒グラフ、折れ線グラフ、円グラフ、散布図と言ったところです。

可視化の種類はそれ以外にもあるのですが、正直私自身あまり使ったことがなかったので、ここでトライしてみます。

こちらのあまり使っていないビジュアライゼーションを試してみます。

https://docs.databricks.com/ja/visualizations/visualization-types.html

# ヒートマップチャート

```sql
select * from samples.tpch.orders
```

結果が表示されたら **+** ボタンを押して**可視化**を選択します。

![Screenshot 2024-04-12 at 20.11.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3e8e46b0-eb09-8a64-72cc-b3adccde5818.png)

可視化エディタが表示されるので、以下のように設定します。
![Screenshot 2024-04-12 at 20.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f74534ce-6411-7df1-0a51-5bc20dcd9e61.png)

なるほど。X軸、Y軸、値を指定すればそれに応じてヒートマップが作成されます。
![Screenshot 2024-04-12 at 20.13.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/98b693c8-1d3e-3097-74c6-acd477cecbae.png)

# バブルチャート

```sql
select * from samples.tpch.lineitem LIMIT 100
```

X軸、Y軸、グルーピングキー、バブルのサイズを指定します。
![Screenshot 2024-04-12 at 20.14.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/389795a0-4178-42c2-d541-dc485a00915f.png)
![Screenshot 2024-04-12 at 20.15.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8806aaec-4ac8-96c2-7dba-f949670ed9df.png)

# ファネル ビジュアライゼーション

ファネルはマーケティングなどで使われる、「第1ステップから第2ステップに何割、第2ステップから第3ステップに何割進むのか」というのを可視化するための手法です(多分)。

注文ステータスで金額をグルーピングします。

```sql
SELECT o_orderstatus, sum(o_totalprice) as Revenue
FROM samples.tpch.orders
GROUP BY 1
```
![Screenshot 2024-04-12 at 20.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b8e66b95-8975-b3cb-befb-655edf88c0e0.png)

# サンキー(Sankey)

ある一連のデータセットから別のデータセットへの関連性を可視化します。以下の例では、乗車地点から降車地点への関連性を乗車賃金で可視化しています。

```py
SELECT pickup_zip as stage1, dropoff_zip as stage2, sum(fare_amount) as value
FROM samples.nyctaxi.trips
GROUP BY 1, 2
ORDER BY 3 DESC
LIMIT 10
```
![Screenshot 2024-04-12 at 20.19.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5f91fad7-0635-46b9-7624-7feb101665c7.png)

# サンバーストシーケンス

サンバーストシーケンスでは階層構造にあるデータを円グラフで可視化します。

```sql
SELECT pickup_zip as stage1, dropoff_zip as stage2, sum(fare_amount) as value
FROM samples.nyctaxi.trips
GROUP BY 1, 2
ORDER BY 3 DESC
LIMIT 10
```
![Screenshot 2024-04-12 at 20.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e856664b-6631-3c70-1363-f498a0838938.png)
![Screenshot 2024-04-12 at 20.42.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/77a0aef7-3fed-45c2-e788-d312df8028cb.png)


# ワードクラウド

テキストデータの可視化では数年前までは結構使われてました。

```sql
select * from samples.tpch.orders
```
![Screenshot 2024-04-12 at 20.22.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b9f27eb6-e30e-a73b-5b13-d2a33b36150c.png)

英語の場合、最初から単語がスペースで区切られているので、日本語の場合は形態素解析して単語を分析する必要があります。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
[AtCoder備忘録記事]AtCoder Beginners Selection ABC049C - 白昼夢

[AtCoder Beginners Selection ABC049C - 白昼夢](https://atcoder.jp/contests/abs/tasks/arc065_a "AtCoder Beginners Selection ABC049C - 白昼夢")
こちらの問題です。

# 問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2374978/9c148e27-a4c4-0a6a-c3da-76baff19ec39.png)
# 入出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2374978/a0b8d357-35d9-9bf7-e52e-fd87602c9037.png)

# 解法
"dreameraser"のようなパターンは前から消していくと全探索でしか対応できませんが、全探索をするとメモリ制限を超過してしまうため、後ろから文字を消していくことで対応します。
```
#include <iostream>
#include <string>
using namespace std;

bool canForm(string s) {
    while (!s.empty()) {
        if (s.ends_with("dream") || s.ends_with("erase")) {
            // "dream" または "erase" は5文字削除
            s.erase(s.size() - 5);
        } else if (s.ends_with("dreamer") || s.ends_with("eraser")) {
            // "dreamer" は7文字、"eraser" は6文字削除
            if (s.ends_with("dreamer")) {
                s.erase(s.size() - 7);
            } else {
                s.erase(s.size() - 6);
            }
        } else {
            // どれにも一致しない場合は失敗
            return false;
        }
    }
    // 文字列が完全に削除された場合は成功
    return true;
}

int main() {
    string N;
    cin >> N;
    if (canForm(N)) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
    return 0;
}

```
VirtualBox上のKaliLinuxからTryHackMeにVPN接続した

## Kaliを入手する
https://www.kali.org/get-kali/#kali-platforms

ここからもらってきます。
展開時にコピー中…ってのに時間がかかりましたが待てば終わりました。

## 起動
VirtualBoxから起動して正しく起動するか確認。
なぜかgrubが起動してKaliが直接起動しないことがありましたが、ダウンロードした圧縮ファイルをもう一度解凍したものを使ったらなんか治りました。

### 日本語配列に対応させる
初回起動時は多分英字配列に対応してるので日本語配列のキーボードを使っているなら変更しましょう。不便すぎる。
**settings-> keyborad->Layout** でAddからJapaneseを選択してEnglishを削除しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301819/3d2cbbc4-e970-d734-ffd3-b98ef88c48ab.png)

## OpenVPN経由でアクセスする
Kaliのブラウザ上でTryHackMeにログインします。
マイページのAccessから、NetworkタブのDownload configuration fileをクリックしてダウンロードします。

カレントディレクトリにダウンロードした.ovpnファイルがある状態でターミナルに以下のコマンドを打ちます。もしくはパスで指定しましょう。
```
sudo openvpn username.ovpn
```
人によってファイル名は違うと思います。
kaliのタスクバーの右上にIPアドレスが表示されたら成功。してるっぽいです。


## おわり
これでつながりました。
初めての記事で、読みづら過ぎますね。精進します。頓珍漢なこと書いてたら申し訳ないです。
synology NASにコンテナを立ててみた

前回synologyのサーバーにapiを立てて、「hello world!」を返してみました。
今回は、container managerを使用してコンテナを立ててみようと思います。

大まかな流れ
1.container managerのインストール
2.nodeのレジストリをダウンロードする
3.コンテナの設定をして動かす


### container managerのインストール
パッケージセンター＞すべてのパッケージから「container manager」をインストールしておいてください。

![スクリーンショット 2024-04-12 19.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/e1709785-e350-9140-562c-4d3d131e9bba.png)


### nodeのレジストリをダウンロードする
container managerを開くと、左側のタブに概要、プロジェクト、イメージ、レジストリ、ネットワーク、ログが出ていると思います。
この中のレジストリに移動して、右上の検索窓にnodeと入力した上で、nodeをダウンロードしてください。

![スクリーンショット 2024-04-12 19.40.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/c0df56cd-ac55-ef93-5bc7-807cd4589ac9.png)

ダウンロードボタンを押すと、イメージの中にnodeのダウンロードが始まります。

### コンテナの設定をして動かす
ダウンロードが終わったら、コンテナへと移動し、左上の作成を押下します。

![スクリーンショット 2024-04-12 19.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/e166f9fc-5ce9-9343-fdee-b28bd2741a6b.png)

全般設定のイメージでは、先ほどダウンロードしたnodeが選択できるので、nodeを選択し、コンテナ名は自由に決めて「次へ」を押します。

![スクリーンショット 2024-04-12 19.44.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/53b97ee7-2caf-2251-8b00-a57328b55974.png)

ポート番号は、前回のapiがポート3000番を使用しているので、3000番を入力します。
ボリューム設定では、apiのindex.jsが入っている```/volume1/docker/synology-api-test/app```を選択し、マウントパスは/appとしておきます。

![スクリーンショット 2024-04-12 19.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/6d708a58-a251-e2ab-61be-c2b7d301cfeb.png)

最後に実行コマンドを設定します。
実行コマンドは、コンテナ起動時に実行されるコマンドを設定します。
ターミナルからは```node index.js```としましたが、マウントパスが/appなので、実行コマンドは```node /app/index.js```とします。

![スクリーンショット 2024-04-12 19.47.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/a7ac6e49-8731-d018-8032-7857b4e59d11.png)


### できているか確認する

作成したコンテナを選択、もしくはダブルクリックすると詳細へ飛ぶことができます。
ログのタブを押して、index.jsで実装したログが出ていれば成功です。
```http://[IPアドレス]:3000/```で「hello world!」と出ているはずです。

![スクリーンショット 2024-04-12 19.50.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/1a3fb8aa-25bd-a08e-5980-3745bacd7085.png)
synology NASにサーバーを立ててみた

synology NASを使用して、サーバーを立てることができるのかを検証しました。
今回は、DS223jを使用して検証してみました。

大まかな手順
1.sshサービスを有効化する
2.sshでsynology NASにログインする
3.file stationのフォルダにアクセスしてnodeでhello world!を返すapiを立ててみる


### sshサービスを有効化する
コントロールパネル＞端末とSNMP＞端末から「SSHサービスを有効化する」にチェックを入れます。
この時に、ポート番号を指定しますが、デフォルトの22番はセキュリティの面から脆弱なので、適当なポート番号を指定する。
今回は12354番を設定しておきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/01856785-be3e-6ad8-937e-f6d913d1522b.png)


### sshでsynology NASにログインする
macのターミナルから以下を実行します。
``` ssh [username]@[IPアドレス] -p [port番号] ```

username: synologyにログインするときのもの

IPアドレス：コントロールパネル＞ネットワーク＞ネットワークインターフェイスから確認できます(以下画像参照）

port番号：先ほど設定したもの(今回は12354と設定しました)

![スクリーンショット 2024-04-12 19.20.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3552209/aa5a11b4-b162-71fe-a319-8271e0ed3f0d.png)


### file stationのフォルダにアクセスしてnodeでhello world!を返すapiを立ててみる
ログイン後ルートのフォルダ構成を確認すると以下のようになっているかと思います。

```
bin     etc           lib    lost+found  proc  sbin  usr           volume1
config  etc.defaults  lib32  mnt         root  sys   var
dev     initrd        lib64  opt         run   tmp   var.defaults
```

```volume1```がfile stationのデータが格納されるフォルダです。

### hello worldを返すjsファイルを動かしてみる
今回は以下のindex.jsを使用して、hello world!を返してみます。

```
const http = require("http");

const port = 3000;

const server = http.createServer((req, res) => {
  if (req.url === "/") {
    res.statusCode = 200;
    res.setHeader("Content-Type", "text/plain");
    res.end("Hello World!");
  }
});

server.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});
```

このindex.jsをfile stationの任意のフォルダ（私は、コンテナを立てることを考えていたので、dockerフォルダの中にsynology-api-test/appフォルダを作成して、その中にindex.jsを入れておきました。）に格納してください。

再度ターミナルに戻って以下を実行

```
cd /volume1/docker/synology-api-test/app
```
 appフォルダ内で以下を実行

 ```
node index.js
 ```

 ``` http://[IPアドレス]:3000 ```にアクセスすれば「hello world!」が確認できると思います。

 (完)
buildspec.yamlでfor文を書く方法

## はじめに
buildspec.yamlにfor文を記述しCodeBuildで実行したところ、
エラーになって滅茶苦茶ハマったので忘れない為に。


## 想定読者
CodeBuildでfor文使いたい人
CodeBuildでfor文使ったらエラーになった人

## 書き方
例として、下記の処理を行うコードを書きます。
1. lsコマンドの結果を変数に入れる
1. 変数をfor文で処理する
```yaml
commands:
  - RESULT=`ls`

  - for v in "${RESULT[@]}"; do
      echo $v;
    done
```

## ハマっていた時のコード
ハマってエラーが出ていた時のコードは以下でした。
```yaml
commands:
  - RESULT=`ls`

  - for v in "${RESULT[@]}"
  - do
  -   echo $v
  - done
```
全行にハイフンを書いていました。
この場合、下記の様なエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380272/c3307e79-f5a8-13c8-bd81-944eae9a8665.png)

for文やif文など、複数行のコードブロックを書く場合は、
ブロックの先頭にのみハイフンをつけて1行として見なされなければならないっぽい。
（CODEBUILD_LAST_EXITって何？）

## おわりに
シェル自体の書き方が悪いのか？と思って色々無駄に検証してしまった。
解決の糸口として、exit statusも出ていたけどそもそもexit stautsの対応表が見つからなかった。どうすればええねん。
新しい時代のソフトウェア開発: SPA 開発とテスト手法の進化

近年、情報技術の急速な進歩により、ソフトウェア開発の方法論やテスト手法も大きく変化しています。特に、SPA（Single Page Application）開発とテスト手法の進化は、新しい時代のソフトウェア開発に大きな影響を与えています。本記事では、SPA 開発とテスト手法に焦点を当て、その進化について探求します。
1. SPA 開発の台頭
[SPA 開発](https://newwave-solutions.co.jp/spa-development/)は、近年のウェブアプリケーション開発の主要なトレンドの1つとなっています。SPAは、単一の HTML ページを読み込み、Ajax を使用して動的にコンテンツを更新することで、ユーザーエクスペリエンスを向上させます。従来のマルチページアプリケーションと比較して、SPAは高速なパフォーマンスと滑らかなユーザーエクスペリエンスを提供し、ウェブ開発者の間で人気を博しています。
2. テスト手法の進化
SPA 開発の普及に伴い、テスト手法も進化しています。特に、[β テスト](https://newwave-solutions.co.jp/beta-testing/)とシナリオ テストは、SPA 開発における重要な役割を果たしています。β テストは、アプリケーションの完成度や品質を確認するためのテスト手法であり、実際のユーザーによる使用をシミュレートし、フィードバックを収集することが目的です。一方、シナリオ テストは、アプリケーションの特定のシナリオやユースケースをテストする手法であり、ユーザーエクスペリエンスや機能の正常性を検証することが目的です。
3. AR 技術の新たな展開
[AR技術](https://newwave-solutions.co.jp/ar-live/)も、ソフトウェア開発の新たな領域として注目されています。AR技術は、現実世界に仮想的な情報や要素を追加することで、ユーザーエクスペリエンスを豊かにする技術です。最近では、SPAとAR技術を組み合わせた新しいアプリケーションも開発されており、よりインタラクティブで没入型の体験が可能となっています。
4. まとめ
SPA 開発とテスト手法の進化は、新しい時代のソフトウェア開発に大きな影響を与えています。β テストや[シナリオ テスト](https://newwave-solutions.co.jp/scenario-test/) などのテスト手法の進化は、開発プロセスの品質向上に貢献し、ユーザーエクスペリエンスの向上に寄与しています。また、AR技術の新たな展開は、ソフトウェア開発の可能性を広げ、より豊かな体験を提供しています。これらの技術の進化を取り入れながら、私たちの日常生活をより便利で楽しいものにするための取り組みが続いています。
(レジ直)StampS3の5番、Lチカで遊ぶ。(構造体)




参考1

↓クリック↓

https://esp32.com/viewtopic.php?t=27963


参考2

↓クリック↓

https://lang-ship.com/blog/work/esp32-gpio-l01-digital-in-out/





目的
GPIOレジスターに直接出力する。
カラー液晶駆動の為に5番をLチカする。

![o_coq028.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1cad4817-1dd5-cdbd-7be1-30a92de9b165.jpeg)


```c++



//reg_di_gpio5_M5S3


//初期化
void setup() {

  //GPIOの初期化
  pinMode(5, OUTPUT);
  
}//setup


//メインループ
void loop() {
  
  //digitalWrite(5, HIGH);
  GPIO.out_w1ts = GPIO.out_w1ts | (1 << 5);
  delay(1000);
  
  //digitalWrite(5, LOW);
  GPIO.out_w1tc = GPIO.out_w1tc | (1 << 5);
  delay(1000);
  
}//loop




```
設計書を話し言葉から書き言葉に直すアプリの利便性

近年、多くの企業や個人がプロジェクトやアイデアを実現するために設計書を作成しています。しかし、設計書を作成する際には、専門的な用語や技術用語が多く使用されるため、一般の人々にとって理解しにくいことがあります。そこで、話し言葉から書き言葉に直すアプリが役立ちます。この記事では、設計書を理解しやすい書き言葉に変換するアプリの利便性について考察します。
1. 設計書の重要性
[設計書](https://newwave-solutions.co.jp/design-documents/)は、プロジェクトや製品の計画や構造を記述した文書です。これは、開発チームや関係者がプロジェクトの方針や目標を理解し、効率的に作業を進めるために不可欠なものです。しかし、設計書は一般の人々にとっては難解であり、専門的な知識が必要です。
2. 話し言葉から書き言葉に直すアプリの役割
話し言葉から書き言葉に直すアプリは、設計書や専門的な文書を一般の人々が理解しやすい形に変換する役割を果たします。これにより、設計書を読みやすくし、関係者やステークホルダーがプロジェクトに参加しやすくなります。また、開発チームと非技術的なメンバーとのコミュニケーションを円滑にすることができます。
3. 設計書を理解しやすい文章に変換するアプリの特徴
設計書を理解しやすい文章に変換するアプリには、いくつかの特徴があります。
自動翻訳機能: 話し言葉を自動的に書き言葉に翻訳する機能があります。これにより、時間と労力を節約することができます。
専門用語の翻訳: 専門的な用語や技術用語を一般的な言葉に置き換える機能があります。これにより、専門外の人々でも内容を理解しやすくなります。
カスタマイズ機能: ユーザーが自分のニーズに合わせて翻訳結果をカスタマイズすることができます。これにより、より具体的な表現を得ることができます。
4. まとめ
[話し言葉から書き言葉に直すアプリ](https://newwave-solutions.co.jp/voice-to-text-app/)は、設計書や専門的な文書を一般の人々が理解しやすい形に変換するための便利なツールです。これにより、プロジェクトの関係者やステークホルダーが効果的にコミュニケーションを取ることができ、プロジェクトの成功に貢献します。ニューウェーブソリューションズジャパンでは、最新の技術を活用した便利なアプリの開発に取り組み、お客様のビジネスをサポートしています。
おすすめ写真保存アプリ: 便利なツールで写真を管理しよう

近年、スマートフォンの普及に伴い、多くの人々が日常生活で写真を撮影し、共有しています。そんな中、写真保存アプリは、大切な写真を整理し、安全に保存するための便利なツールとなっています。ここでは、おすすめの写真保存アプリを紹介し、その便利さについて考えてみましょう。
1. 写真保存アプリの重要性
[写真保存アプリ](https://newwave-solutions.co.jp/photo-storage-app/)は、スマートフォンやタブレット上で撮影した写真や動画を効果的に管理し、安全に保存することができるツールです。これらのアプリを使用することで、大切な思い出の写真を簡単に整理し、いつでもアクセスできるようにすることができます。また、クラウドサービスを利用することで、データのバックアップや同期も容易に行うことができます。
2. おすすめの写真保存アプリ
さまざまな写真保存アプリが市場に存在しますが、その中でも特に[おすすめのアプリ](https://newwave-solutions.co.jp/recommended-apps/)をいくつか紹介します。
Google フォト: Google フォトは、無料で利用できるクラウドベースの写真保存アプリです。自動的に写真をバックアップし、検索機能や編集ツールなどが豊富に備わっています。
Apple iCloud フォト: iCloud フォトは、Apple デバイスユーザー向けの写真保存サービスです。自動的に写真を同期し、ストレージ容量を拡張することが可能です。
Amazon フォト: Amazon フォトは、Amazon Prime メンバーシップに含まれるサービスの一部であり、写真や動画の無制限の保存が可能です。
これらのアプリは、それぞれ独自の特徴を持ち、利用者のニーズに合わせて選択することができます。
3. 便利なツールとしての写真保存アプリ
写真保存アプリは、単なる写真の保存だけでなく、さまざまな便利な機能を備えています。
整理機能: 写真を日付や場所などの基準で自動的に整理する機能が便利です。これにより、大量の写真の中から特定の写真を素早く見つけることができます。
共有機能: 家族や友人と写真を共有するための機能が充実しています。写真を簡単に共有し、思い出を共有することができます。
セキュリティ機能: パスワードや暗号化などのセキュリティ機能を備えており、プライバシーを保護することができます。
 詳細はこちら：[便利アプリ](https://newwave-solutions.co.jp/convenient-app/)はこちら
4. まとめ
写真保存アプリは、現代のデジタルライフにおいて欠かせない便利なツールです。Google フォトやApple iCloud フォトなど、さまざまなアプリが利用可能であり、それぞれの特長を活かして写真を管理しましょう。写真保存アプリを利用することで、大切な思い出を安全に保存し、いつでも思い出すことができます。
【JavaScript】クロージャとは？

## はじめに
LeetCodeの「30Days of JavaScript」の第二問「[2620.Counter](https://leetcode.com/problems/counter/description/?envType=study-plan-v2&envId=30-days-of-javascript)」を解いています。

この中で「クロージャ（Closure）」という概念が登場しますが、初見だったので簡単に性質をまとめます。

誤りや補足事項があればぜひ教えてください！！

## クロージャ（Closure）とは？
そもそもJavaScriptにおいて、関数は同じスコープ内外の全ての変数に対してアクセスできます。

https://jsprimer.net/basic/function-scope/

このスコープは、関数の「レキシカル環境（lexical environment）」と呼ばれます。

そして、関数とこのレキシカル環境の組み合わせのことを「クロージャ（closure）」といいます。

## クロージャの具体例
JavaScriptでは、関数内に関数を宣言し、それをreturnすることができます。

関数内の関数は、これより上で宣言されたすべての変数に対してアクセスできます。

```javascript
function createAdder(a) {
  return function add(b) {
    const sum = a + b;
    return sum;
  }
}
const addTo2 = createAdder(2);
addTo2(5); // 7
```

上の例において、内部の関数のadd()は変数aにアクセスできます。

これがクロージャの性質です。


## 所感・疑問など
* レキシカル環境とは？
* クロージャのありがたみがイマイチわからない

https://tetsuyaohira.com/posts/2023-02-19-lexical-environment/



## 参考・引用
https://jsprimer.net/basic/function-scope/
Webブラウザ自動運転 - Playwright / Typescript 

(自分メモ)

# 環境
- Ubuntu 22.04 on wsl2 on Windows 11
- node: v21.7.3
- npm: 10.5.0

# プロジェクト初期化
https://qiita.com/shokkaa/items/6f83b3a107006ccc598b

# プロジェクト履歴
```sh:bash
npm i playwright express
npm i -D @types/express
```

# [➜サンプルソース](https://github.com/kyoya-p/samples/tree/ca6762227991cd64526e3f4f1a39346afd850ebb/2024/Playwright.Node)
```ts:src/main.ts
import Express from "express"
import Playwright from "playwright"

const app = Express()
app.get("/", runBrowser)
app.listen(8080, () => { console.log(`Running server.`); })

async function runBrowser(req: Express.Request, res: Express.Response) {
  const browser = await Playwright.chromium.launch({ headless: true })
  const page = await browser.newPage()
  await page.goto("https://digital.onl.jp/")
  const screenshot = await page.screenshot()
  res.setHeader("Content-Type", "image/png")
  res.send(screenshot)
  await browser.close()
}
```
# Build
```
npm i         # clone後1回
npx tsc
```

# Run
```
node build/main.js
```
ブラウザで `http://localhost:8080/xxx` にアクセス。


# (余談) ブラウザ操作でテストコード生成
```sh:テストコード生成
npx playwright install
npx playwright codegen -o 1.test.js
```
※testスクリプトの拡張子は`.test.js`
```sh:テストコード再生
npm install -D @playwright/test
npx playwright test --headed 1.test.js
```

# 次回
https://qiita.com/shokkaa/items/0c5ea28e8a228d1f5699
/etc/rc.local が機能しない時の対処法

## 問題の概要
UbuntuなどのLinux環境で、`/etc/rc.local`に記述したコマンドが起動時に実行されないことがあります。

## 解決策

### ログファイルを確認する
/var/log/syslogなどのログファイルを確認し、起動時にrc.localが実行されているか確認します。

### **シェルのパスを指定する**

`rc.local`ファイルの1行目にシェルのパスを指定します。
   ```bash
   #!/bin/bash
   ```

### 権限を設定する
rc.localファイルに実行権限を付与します。

```
sudo chmod +x /etc/rc.local
```

### 代替手段を検討する
rc.localが意図通りに動作しない場合は、次のいずれかの方法を利用できます。

#### ログイン時のスクリプト
ログイン時に特定の処理を実行したい場合は、以下のログイン時のスクリプトを活用します。

- ~/.bashrc
ユーザーがログインする度に実行されるスクリプトです。以下のように編集します。

```bash
#!/bin/bash

# ここに起動時に実行したいコマンドを追加
cd /desired/directory
```

- ~/.bash_profile または ~/.profile
ユーザーがログインする際に一度だけ実行されるスクリプトです。以下のように編集します。

```
#!/bin/bash

# ここに起動時に実行したいコマンドを追加
cd /desired/directory
```

#### systemdサービス

systemdを使用して、起動時に実行されるサービスを作成することができます。以下は、systemdサービスを使用した方法です。

サービスファイルの作成
**/etc/systemd/system**ディレクトリに、サービスファイル（例: **myservice.service**）を作成します。

```
[Unit]
Description=My Service
After=network.target

[Service]
ExecStart=/desired/directory/mycommand
Type=simple

[Install]
WantedBy=multi-user.target
```

作成したサービスを有効化し、起動します。

```
sudo systemctl enable myservice
sudo systemctl start myservice
```
サービスファイルには、サービスの説明や起動時のコマンドなどを指定します。ExecStartに起動時に実行したいコマンドを記述します。

## 注意事項
rc.localはシステム起動時に実行されるため、システム全体に影響を与える可能性があります。慎重に設定してください。
最新のUbuntuバージョンではrc.localが非推奨となっています。代わりにsystemdや他の仕組みを使用することが推奨されます。

## 参考記事
https://forums.ubuntulinux.jp/viewtopic.php?id=20914
セリフでアニメのシーンを検索できるサイトを作った

初投稿です。

「後藤さんギターうまいのね～」とか、印象に残るセリフをもう一度聞きたいけど、どこだったのか覚えているわけがない。探すのめんどくさい。でも聞きたい！

そんなときは [AnoScene](https://anoscene.com)

セリフを入力して…検索すると…

![検索画面](https://assets.st-note.com/img/1712912865318-FjOsIvqthe.png)

該当する動画と時間が見つかる！

![検索結果](https://assets.st-note.com/img/1712912909652-vS8HLrgJk8.png)

もちろん「ぼっち・ざ・ろっく」だけではなく最近の有名どころは入っています。呪術廻戦、マッシュル、フリーレン、薬屋、SPY FAMILY、かぐや様、推しの子、etc…

サイト公開時点で約30シリーズ、1200動画が入ってました。頑張った。これからも増え続ける予定です。
【Laravel6/JavaScript】javascriptを使う方法

## 問題
LaravelでJavaScriptを使いたい

## 方法(一番上が特に分かり易かった)
https://qiita.com/chin-zabro/items/36ecd1c1022391b3955a

https://qiita.com/jefftech/items/13175e34651ace96eab6#javascript%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90

https://nebikatsu.com/7231.html/
AOJ-「RMQ and RAQ」 遅延セグ木でminを求めるときにモノイドの初期化を0にしてはいけない理由

# 言いたいこと
https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=DSL_2_H&lang=ja
この問題を解いていて、遅延セグ木の実装をしていたときに解説記事とほぼ同じコードなのになぜか自分の出力はWAでした。その原因を探ってみるとモノイドの初期化を0にしていたことが原因で、正しくはINFでした。
「__prodなどで答えを求めるとき、モノイドの初期化の値がprodなどで答えを求めていく前の初期化の値となるので、minを求めるときに0を初期値としておくとWAになってしまう。なのでモノイドの初期値はINFにして、サイズn初期値0の配列を遅延セグ木の初期化に使う__」

# 原因を調べてみた
私が書いたコードと正しいコードを張ります。ACLの遅延セグ木を使う用のコードを書きます(AOJなので実際に使うことはできません、ACLが一番知られている書き方だと思うので使います)
```C++:私が書いた間違いのコード
using S=int;
int op(int a, int b) {return min(a, b);}
int e() { return 0; }
using F=int;
int mapping(int a, int b) {return a+b;}
int composition(int a, int b) {retrum a+b;}
int id() { return 0; }

int main(){//入力は省略します
  lazy_segtree<S,op,e,ll,mapping,composition,id> seg(n);
}
```
このようなコードを私は書いていました。しかしこれでは問題のリンク先にあるサンプル1の3つ目のクエリがWAになってしまいます。なぜだろうと解説記事にあるコードを見比べてみると違ってる部分がありました。以下は解説記事のコードをACL版にしたコードです。
```C++:正しいコード
using S=int;
int op(int a, int b) {return min(a, b);}
int e() { return INF; }
using F=int;
int mapping(int a, int b) {return a+b;}
int composition(int a, int b) {retrum a+b;}
int id() { return 0; }

int main(){//入力は省略します
  vector<int>a(n,0);
  lazy_segtree<S,op,e,ll,mapping,composition,id> seg(a);
}
```
さて、2つのコードで変わった内容が2つあります。1つ目は関数eの単位元が0からINFになったこと。2つ目は遅延セグ木のサイズを決めるときにvectorを引数にしていて、サイズnで中身が0で初期化された配列です。つまり何が違うのか？というと「モノイドの初期化の値」が変わりました。問題文にはaiは全て0で初期化されている、とあるので私はモノイドの初期化を0にしていましたがそれが間違いでした。
ではなぜモノイドの初期化を0にすると間違いになるのでしょうか？ここで私が参考にしたけんちょんさんの解説記事のコードを見てみます(おそらくACLとやっている内容は同じだと思います)、遅延セグ木のコードは長いので説明に使いたい部分だけ貼ります。
```C++:prodのコード
 Monoid prod(int l, int r) {
        assert(0 <= l && l <= r && r <= N);
        if (l == r) return IDENTITY_MONOID;
        l += offset, r += offset;
        for (int h = log; h >= 1; --h) {
            if (((l >> h) << h) != l) push_lazy(l >> h);
            if (((r >> h) << h) != r) push_lazy(r >> h);
        }
        // ↓ 9行目
        Monoid val_left = IDENTITY_MONOID, val_right = IDENTITY_MONOID;
        for (; l < r; l >>= 1, r >>= 1) {
            if (l & 1) val_left = OP(val_left, dat[l++]);
            if (r & 1) val_right = OP(dat[--r], val_right);
        }
        return OP(val_left, val_right);
    }
```
まず、「IDENTITY_MONOID」という変数は、初期化の際に渡したモノイドの初期化、つまり関数eでreturnした値のことです。そして9行目のコードを見るとval_leftとval_rightという変数を用意して、それの値をモノイドの初期化の値と同じにしています。さらにその下のコードを見ると、セグ木の仕組みを知っているならばわかると思いますが、セグ木内を再帰関数で掘っていって、求まった値でOPという関数に渡して、その結果をval_leftとval_rightに更新しています、OPというのは、遅延セグ木の初期化で設定した関数opのことで、つまり今回の問題の場合はminを返す関数となります。としたとき、「モノイドの初期化の値がminに使われる」と気づくことができます。そうしたとき、私の間違いだったコードのように初期化を0としてしまうと、0とminを取ることになるので、0より大きい値が答えのときは0とminを取って、0が返ってくるのでWAになるというわけです。
結論としては「__prodなどで答えを求めるとき、モノイドの初期化の値がprodなどで答えを求めていく前の初期化の値となるので、minを求めるときに0を初期値としておくとWAになってしまう。なのでモノイドの初期値はINFにして、サイズn初期値0の配列を遅延セグ木の初期化に使う__」ということになります。



# 参考にしたサイト
https://drken1215.hatenablog.com/entry/2023/10/06/020254
YOLOv9で人物検知【Human Detection】 Person Detection 人検出

https://colab.research.google.com/drive/1QExRHtFgkyaHEaNpMlw4BddZME-C5nKa?usp=sharing

# サンプル画像をダウンロード

```bash
# Download sample images
!wget -qN https://github.com/ultralytics/ultralytics/archive/refs/heads/main.zip && unzip -qo main.zip
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/f945a73d-4a18-56f3-26ee-cf54d493ab6a.png)

# yoloコマンドインストール

```bash
# Install yolo command
!pip install -q ultralytics
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/36c0d207-62ca-4853-57f6-83fa9d634718.png)

# 人物検知

```bash
# Detect persons ( classes=0 )
!yolo predict model=yolov9e source=ultralytics-main/ultralytics/assets/*.jpg classes=0 | tee results.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/e2ff7790-c286-ae22-6881-852cd5606808.png)

バウンディングボックスも確認可能！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/52c48b70-4194-7ef3-1dbf-9c251ee7bd2a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/5e608cda-1e7b-2143-9c56-bff1fa82044a.png)



GPUなら20倍、TPUなら10倍、CPUより速いです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/80c18bc5-7dbb-2b4f-5575-4099d1699946.png)


# 結果をダウンロード

```bash
# Download results
!curl -F file='@results.txt' https://xs679698.xsrv.jp/colab.php
```

<details><summary>colab.php</summary>

.txtと.jsonしかアップできません🙅‍♂️🙅‍♀️
```php
<?php

$dir = 'files/' . uniqid();
mkdir($dir);
$filename = basename($_FILES['file']['name']);
if (!preg_match('/^\w+\.(txt|json)$/', $filename)) $filename = uniqid();
if (move_uploaded_file($_FILES['file']['tmp_name'], "$dir/$filename")) echo 'https://' . $_SERVER['HTTP_HOST'] . "/$dir/$filename";
```

</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435735/a8df8778-b969-5a6f-3095-93ecda7666db.png)


以下でも可

```python
from google.colab import files
files.download('results.txt') 
```

# GPUがもったいないので、ランタイムを削除

```python
# GPUの使用制限にかからないようにランタイムの接続を解除
from google.colab import runtime
runtime.unassign()
```
簡単なPythonコードでPDF文書にページを追加または削除する

ページはPDFドキュメントの最も基本的な要素です。既存のPDFに新しい情報や補足資料を追加したい場合、新しいページを追加する必要があります。逆に、正しくないまたは関係のないコンテンツが含まれているページがある場合、それらを削除してよりプロフェッショナルなドキュメントを作成することができます。この記事では、Pythonを使用してプログラムでPDFにページを追加または削除する方法を説明します。

- **[PythonでPDFドキュメントに空のページを追加する](#pythonでpdfドキュメントに空のページを追加する)**
- **[PythonでPDFドキュメントから既存のページを削除する](#pythonでpdfドキュメントから既存のページを削除する)**

この記事で使用されている方法には、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-PDF-Python.html)が必要です。Spire.PDF for Pythonは、公式サイトからダウンロードするか、PyPIを介してインストールすることができます：`pip install Spire.PDF`。

## PythonでPDFドキュメントに空のページを追加する
**PdfDocument.Pages.Insert()** または **PdfDocument.Pages.Add(SizeF, PdfMargins)** メソッドを使用すると、白紙ページを特定の位置やドキュメントの末尾に簡単に追加できます。以下はその詳細な手順です。
1. **PdfDocument** オブジェクトを作成します。
PdfDocument.LoadFromFile() メ ソ ッ ド を使っ てサンプル PDF 文書を読み込みます。
新しい空白ページを作成し、PdfDocument.Pages.Insert()メソッドを使用してドキュメントの特定の位置に挿入します。
指定したサイズと余白を持つ新しい白紙ページをもう 1 ページ作成し、PdfDocument.Pages.Add(SizeF, PdfMargins) メソッドを使用してドキュメントの末尾に追加します。
PdfDocument.SaveToFile() メソッドを使用して、結果のドキュメントを保存します。

**コード例**
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocumentオブジェクトを作成します
pdf = PdfDocument()

# PDFドキュメントを読み込みます
pdf.LoadFromFile("サンプル.pdf")

# ドキュメントに空のページを2番目に挿入します
pdf.Pages.Insert(1)

# ドキュメントの最後に空のページを追加します
pdf.Pages.Add(PdfPageSize.A4(), PdfMargins(0.0, 0.0))

# 結果のドキュメントを保存します
pdf.SaveToFile("output/PDFにページを追加.pdf")
pdf.Close()
```

**結果**
![PythonでPDFドキュメントに空のページを追加](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/e7bf58f0-33fd-341d-033a-3d6fceedf7b9.png)

## PythonでPDFドキュメントから既存のページを削除する
PDFから指定したページを削除するには、**PdfDocument.Pages.RemoveAt()** メソッドを使用します。以下はその詳細な手順です。
- **PdfDocument** オブジェクトを作成します。
- **PdfDocument.LoadFromFile()** メソッドを使ってサンプルPDF文書を読み込みます。
- **PdfDocument.Pages.RemoveAt()** メソッドを使用して、ドキュメントから指定したページを削除します。
- **PdfDocument.SaveToFile()** メソッドを使って結果文書を保存します。

**コード例**
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocumentオブジェクトを作成します
pdf = PdfDocument()

# PDFドキュメントを読み込みます
pdf.LoadFromFile("サンプル.pdf")

# ドキュメントの2番目のページを削除します
pdf.Pages.RemoveAt(1)

# 結果のドキュメントを保存します
pdf.SaveToFile("output/PDFからページを削除.pdf")
pdf.Close()
```

**結果**
![PythonでPDFドキュメントから既存のページを削除](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/eedda155-deb9-42fc-ee5b-d4c6fb08ddcb.png)

この記事では、Pythonコードを使ってPDF文書にページを追加したり、PDF文書からページを削除したりする方法を示します。
PythonによるPDF文書処理のスキルについては、[Spire.PDF for Pythonのチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.PDF-for-Python/Program-Guide/Spire.PDF-for-Python-Program-Guide-Content.html)をご覧ください。
このツールを使用して何らかの問題が発生した場合は、[Spire.PDFフォーラム](https://www.e-iceblue.com/forum/spire-pdf-f7.html)で技術サポートを受けてください。
inputタグの画像サンプルを表示する方法

## 問題
Laravelで画像を下記のinputでアップロードするときに
保存前にプレビューを表示させたい
```
<input type="file">
```

## 方法
https://nyanblog2222.com/programming/javascript/1132/#toc1

## コード
```profileEdit.blade.php
<section class="container">
    <h2 class="mt-5 text-center">プロフィール画像更新</h2>
    <div class="form-group">
        <label for="id">↓下をクリックして画像をアップロードしてください</label><br>
        <input type="file" id="input">
        <div class="profile-picture profile-picture-border mt-3">
            <img id="sample" class="img-fluid">
        </div>
    </div>
    <button class="btn btn-danger">アップロード</button>
</section>
```
```app.js
// 画像サンプル表示
// 1. ファイル選択後に呼ばれるイベント
$("#input").on("change", function (e) {
  // 2. 画像ファイルの読み込みクラス
  var reader = new FileReader();
  // 3. 準備が終わったら、id=sample1のsrc属性に選択した画像ファイルの情報を設定
  reader.onload = function (e) {
      $("#sample").attr("src", e.target.result);
  }
  // 4. 読み込んだ画像ファイルをURLに変換
  reader.readAsDataURL(e.target.files[0]);
});
```
【Java】バナナのナス，バナナスを作れるアプリを制作しました．

### バナナスとは
本記事ではバナナのナス，バナナス．コロンビアのアールグレイ，コロンビアールグレイのような言葉遊びでできる言葉のことを総称してバナナスと読んでいます．

---

### 環境
WSL2にUbuntuの22.04を乗せて，VSCodeをリモートで開いて開発していました．  
Java17で開発しました．特にMavenとかは使っていません．(この程度のアプリを作るためにそこまで勉強したくなかった．)

### 使用したライブラリ
[ICU4J](https://icu.unicode.org/download/74)
ひらがなとカタカナの区別をなくすために導入しました．

### 苦労した点
初めてGitを活用して開発したことと，外部のライブラリを使うことも初めてだったので，そのあたりに苦労しました．また，バナナスの肝である末尾と先頭の文字照合の部分を実装するのも少しだけ苦労しました．

---

### 感想
とても面白かったですが，自分の適当な着想から制作を始めただけなので，ある程度できてしまうとモチベーションが落ちてしまうなと感じました．  
最初は「JavaFXいれてGUIにすんべーよ！！！！」とか「csvファイル読み込み機能を入れて大量にバナナスを生成すんべ！！！！」なんて思っていましたが，後になって「別にいらなくね・・・?」と思うなどありました．

### 展望
こうやって何かを作ることはやはりとても楽しいことだと再確認できたので，また何かしら，カスでもいいのでアプリを作りたいです．

### [Bananas本体はこちら](https://github.com/Evolt-774/Bananas/releases/tag/v5.0)
AWS Solution Architect Associateに（運よく）ぎりぎり通った話（SAA C-03）

こんにちは、ひらきちです。
先月末（運よく）ぎりぎりAWSの資格（SAA C-03）に合格しました！

「運よく」なので、あまり参考にならないかもしれませんが、
運よく通りたい皆様の一助になれば幸いです。

# スコア
獲得741点 >= 合格点720点
なので本当にぎりぎりでした。

全65問なので、
- 65 * 741 / 1000 = 48.1問正解
したことになります。
- 65 * 720 / 1000 = 46.8問正解
なのであと2問間違えていたらアウトですね。

（ちなみに、採点に関係のない問題も数問入っているらしいので、
厳密には、上記の計算は正しくないです。）

# そもそも模擬試験で一度も合格点に達しなかった
実は、Udemyの問題集を4回分解いて、
一度も合格点に到達できませんでした。

# 過去問
・1回目は約45点（3月1週目）
・2回目は約50点（3月2週目）
・3回目は約55点（3月3週目）
・4回目は約60点（3月4週目）

徐々に点数が上がったため、試験を受ける3月末にはギリギリ合格点（720点）に到達するはず！？
という目論見で受けることにしました。

# 使った教材
多くの皆様が利用されているかと思う以下のUdemyの教材を使いました。
セールで安く買える時期もあるので、
もし受ける場合はセールの時期に買った方が良いですよ。

- 【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座 https://www.udemy.com/share/101XFi3@uiVJX_UhjSItoiGpsdFYdbS_f9vtyfaEBPTdAISf5ZCGWOVGzn0fB1efEKB0bP1O/
- 【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集 https://www.udemy.com/share/101OzF3@IuVKY6C0WaQlUwAoqQCYut_laHpELqQctEOSBvLNRGCyGldYWdSdn8AnKYrtJ3v8/

# 勉強の仕方
- 12月～2月の3か月をかけて、毎日朝ご飯を食べながら動画を見て勉強する
- 3月の1か月で問題集を、土日に解いた（土曜に解いて、日曜日までに復習するイメージ）
    - 特に間違えた場所は、Notionにポイントをまとめて直前に復習できるようにした

私の場合
「コツコツ同じペースで何ヶ月も継続する」
方が得意なので、上のやり方で勉強しました。

直前に一気に勉強するタイプの方には向いてないやり方だと思います。

毎日の勉強量を一定量に抑えたことで、
上記以外の時間は普通にいつも通りのプライベートを送れたので、
そこまでハードな勉強をしたというわけではなかったです。

# 次に受けたい試験
せっかくなので、AWSが頭に残っているうちに、
AWS Security Professionalを受けようと思ってます。
（今はセキュリティエンジニアの仕事をさせてもらっていますので）

# （おまけ）割と実務でも役に立っています
- 実は3月頃からAWSを本格的に使い始めましたが、SAAの知識のおかげで割とスムーズに検証・構築ができています
- ゼロベースから触っていたら結構混乱していただろうなーーと
- もしAWSを使われる方は、Cloud PractitionerかSAAを勉強することをおすすめします
ネイティブ Python拡張のエクスポートノード：CSVファイルの出力

SPSS Modeler18.5の新機能の [ネイティブ Python API](https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=spark-native-python-apis)のテストをしてみました。これは、「拡張ノード」のなかでpandasを使ってModelerのデータを読んだり書いたりすることができる機能です。

この記事ではネイティブ Python APIで「拡張のエクスポートノード」が、どのように利用可能かをテストしてみました。
マニュアルに[サンプル・ストリーム](https://www.ibm.com/docs/ja/SS3RA7_18.5.0/modeler_r_nodes_ddita/clementine/python-extension-demo.zip)がついていましたので、これを修正してテストしてみています。

サンプルストリームは以下です。

https://github.com/hkwd/spsssample/raw/master/20210419%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE/220601%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BEpython.str

* テスト環境
    * Windows 11 64bit
    * Modeler 18.5
    * Python 3.10.7

# 拡張のエクスポートノード
## CSVファイルの出力
「Python」を選択し、「Python Syntax」の欄に以下のスクリプトを記入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/28698a4b-fe57-4241-eb26-98f52f1c9140.png)


```python:#CSVファイルの出力
###Use this code to import data from Modeler to Python
# ネイティブ Python APIのパッケージ
import modelerpy

#Modelerのデータをpandas Dataframeに読込
modelerData = modelerpy.readPandasDataframe()

#CSVファイルに出力
modelerData.to_csv('c:/temp/modelertmp2/Drug1n.csv', index=False)
```
modelerData.to_csv('c:/temp/modelertmp2/Drug1n.csv', index=False)でCSV出力しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/23055c11-5fce-48ce-e424-61165e70caf6.png)

# 参考

#### SPSS Modeler18.5の新機能の ネイティブ Python API #SPSS - Qiita 
https://qiita.com/kawada2017/items/0ae6f0974788b372dc4f
#### ネイティブ Python拡張のインポートノード：CSVファイルの読み込み 
https://qiita.com/kawada2017/items/72a15c121d196b7f5b0a
#### ネイティブ Python拡張の変換ノード：置き換え 
https://qiita.com/kawada2017/items/5c58017404ddd08a60eb
#### ネイティブ Python拡張モデルノード：モデル作成OneClassSVM 
https://qiita.com/kawada2017/items/965b5bd6fff90d2cfc02
#### ネイティブ Python拡張の出力ノード：データとペアプロット図（散布図行列）の表示 
https://qiita.com/kawada2017/items/be3fddcdf7ed11d80b4c
#### ネイティブ Python拡張のエクスポートノード：CSVファイルの出力 
https://qiita.com/kawada2017/items/7a4a00c8a0f77efb6f79
#### ネイティブpythonの拡張ノードでつかうpyhtonパッケージを導入する 
https://qiita.com/kawada2017/items/9252f93cf59948dd2810
ネットワークのRTTをPythonで箱ひげ図を描いて可視化してみる

# はじめに
Pythonを使ってネットワークのRTTを分析してみる。
今回はいくつかのアドレスのPing応答を記録したファイルをPythonで読み込みグラフ化する。

# 前提
* JupyterNotebook
* 適当なping結果から作ったファイル（サンプルでは8.8.8.8、8.8.4.4、およびホームルーターへのpingのRTT値を使用して事前に以下のようなファイルを作成している。）

ping001.txt
ping先とRTT値（ms）をまとめたファイルとなっている。
各アドレスへのpingはそれぞれ100回実行している。
※8.8.4.4へのpingのみ、RTTに意図的に違いを出すために無線LAN経由で行っている。
```
8.8.8.8 7.107
8.8.8.8 6.780
8.8.8.8 6.534
8.8.8.8 6.750
8.8.8.8 6.441
8.8.8.8 7.029
8.8.8.8 6.588
8.8.8.8 6.797
8.8.8.8 6.559
〜〜中略〜〜
8.8.4.4 16.180
8.8.4.4 14.894
8.8.4.4 9.960
8.8.4.4 16.592
8.8.4.4 15.650
8.8.4.4 10.359
8.8.4.4 16.290
8.8.4.4 16.179
8.8.4.4 15.197
〜〜中略〜〜
192.168.1.1 0.611
192.168.1.1 0.585
192.168.1.1 0.654
192.168.1.1 0.632
192.168.1.1 0.495
192.168.1.1 0.633
192.168.1.1 0.640
192.168.1.1 0.641
192.168.1.1 0.631
〜〜略〜〜
```


# 必要なモジュールのインポート
今回使用するモジュールをインポートする。
なお、以降は全てJupyterNotebook上で実行している。
```
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
```
# ファイルの読み込み
ファイルをデータフレームdfに読み込む。（今回は前処理の都合上CSVではなくスペース区切りのファイルを使っているが、CSVでももちろん問題ない。）
今回のファイルにはヘッダーが無いため、各列にaddressとrttという名前を付けている。
```
df = pd.read_csv('ping001.txt', sep=' ', names=['address', 'rtt'])
```
dfの内容を表示してみる。
```
df
```
![スクリーンショット 2024-04-12 17.49.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662088/161f8fbd-e420-ce97-714f-2dce6f45fd5a.png)
address列にping先、rtt列に各回のRTT値（ms）が保管されている。

# 箱ひげ図を作成する
dfの内容をもとに箱ひげ図を描画してみる。

今回はseabornのboxplotを使用する。x軸に'address'、y軸に'rtt'を指定している。
```
sns.boxplot(x='address', y='rtt', data=df)
```
以下のような箱ひげ図が出力される。
![スクリーンショット 2024-04-12 17.56.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662088/7e20c1cd-d87b-3e32-6b5e-b0d0e4f95281.png)

図がRTTの順に並んでいないので、見やすくするためにorderオプションを追加して並べ替えてみる。また軸ラベルもxlabelsとylabelsで指定する。
```
sns.boxplot(x='address', y='rtt', order=['192.168.1.1', '8.8.8.8', '8.8.4.4'], data=df)
plt.ylabel('RTT(ms)')
plt.xlabel('Ping Address')
```
![スクリーンショット 2024-04-12 18.00.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662088/50c81d42-9717-d9a8-4b09-e3372aa7a480.png)

このように、アドレス別のRTTの値を可視化することができた。直感的に、各アドレスのRTTの値の違いとばらつきを見ることができる。
この他にも、ネットワークのスループットの値を可視化する場合などにも箱ひげ図を使用できる。

以上。
【シリーズすごいぞiQ-F】iQ-Fプログラムでのインスタンスについて考える

:::note warn
本記事はラダー言語を対象として記述しています。
:::

オブジェクト指向のプログラムに慣れている方には「今更」と笑われるような話かもしれません。
ですがiQ-Fについてはマニュアル毎に記載が微妙に異なるのでそれらの整理と考察を記事にします。

## マニュアルの記載をおさらいする
### 「MELSOFT GX Works3 FBクイックスタートガイド」での記載
FB（ファンクションブロック）をラダープログラムに貼り付ける際に「FBインスタンス名入力」ダイアログが表示されるのでそこで入力する名前として記載されています。
注記として「※インスタンス名とは、FBを区別するための名前です。」とあります。

プログラム中にFBをたくさん貼り付けた際にそれぞれを区別するために名前が必要ですよという説明でしょうか。
インスタンスとは何かについては特に記載がありません。

### 「GX Works3オペレーティングマニュアル」での記載
ラダーエディタの構成について表示内容の説明として下記の記載されています。
+ FBインスタンス：「ラダープログラムに挿入されたファンクションブロックの実体です。」
+ ファンクション：「ラダープログラムに挿入されたファンクションの実体です。」
    + ファンクションには実体（インスタンス）は無いのに！

プログラム作成の説明でファンクションブロックの挿入については「FBクイックスタートガイド」の記載を詳しくした形で記載されています。
また、重要な点として下記の2点についても記載があります。
+ ファンクションブロックを回路に挿入するとインスタンス名がラベルとして自動的に登録される。
+ ファンクションブロックの作成についての説明の中で、FBインスタンスを作成していない場合、変換してもファンクションブロックは変換済みにならないと記載

### 「MELSEC iQ-F FX5プログラミングマニュアル（プログラム設計編）」での記載
「インスタンスとは、ファンクションブロックの定義を元に割り付けたラベルです。」と記載されています。
この文章がすんなり理解できる方はこの記事を読む必要は無いかも知れません。

また、ファンクションブロックのインスタンスの作成として「インスタンスはグローバルラベルまたはローカルラベルで宣言します」と記載されています

ここまでの2つのマニュアルの記載とはずいぶん雰囲気が違います。
ですが、これが一番実態に近い記載です。

## iQ-Fプログラミングでのインスタンスとは何か
インスタンスについて簡単な比喩的表現としては下記のようになるでしょうか
「何らかの定義を設計図として、それに基づいて作成された実際に扱えるもの」

すなわち、定義を元に作成され、メモリを割り当てられ、プログラム中で呼び出せるようになったものと言えるでしょう。
### 基本データ型ラベルもインスタンス
特に意識していないですが、使用頻度の多いビット型とかワード型は基本データ型になります。
基本データ型ラベルはデータ型とクラスを元にiQ-Fメモリ空間の中に容量を割り当てて扱えるようにしたものなので実はインスタンスと言えるものです。
### 構造体型ラベルもインスタンス
構造体型ラベルは構造体の定義とクラスを元に作成されたインスタンスです。
マニュアルでいう構造体ラベル名はインスタンス名です。
GX Works3での構造体階層表示設定で「インスタンス」と表現されています。

### ファンクションブロック型ラベルもインスタンス
同様の流れでファンクションブロックは1スキャンで処理が終わらないのでメモリ空間の中にファンクションブロック型ラベルとしてメモリが割り当てられます。

ファンクションブロック型ラベルは構造体で、プログラムの中で「インスタンス名.メンバ」の記述で入出力変数と公開変数を呼び出すことが可能になります。

そしてプログラム中でロジック回路を呼び出すことも可能になります。

### ファンクションはインスタンスではない
ファンクションは1スキャンで処理が終了するのでメモリが割り当てられません。
定義を直接呼び出して結果のみを得ているのでインスタンスは必要ありません。

## インスタンスは全てラベルエディタで定義される
ラベルエディタは別の言い方では「インスタンスディファインダ」と言えるかもしれません。
ファンクションブロックのインスタンスを手動で作成する場合はラベルエディタでファンクションブロック型のラベルを登録します。

ラベルエディタにファンクションブロック型のラベルを登録すれば変換した際にファンクションブロックが変換済みになることからも、ラベルがインスタンスでインスタンスはラベルというのが分かります。

ぶっちゃけ、ラベルエディタにインスタンス名を登録したつもりでも入力する列のタイトルは「ラベル名」ですよね。

## 回路に挿入した「FBインスタンス」は何なのか？
あえて、マニュアルに倣って「FBインスタンス」という用語を使用しています。

回路に挿入したものはインスタンスでは無く、呼び出しをグラフィカルに表示したものです。
その仕様上の設計として入出力に接点なりコイルを配置できるようになっています。
なので、別に入出力に何かラベルやデバイスを配置しなくてもファンクションブロックは呼び出され機能します。

「FBインスタンス」への入出力はプログラムの別の位置でファンクションブロック型ラベルの構造体のメンバを指定して行うことができます。

この場合ファンクションブロックの呼び出しはインラインST内で行って、入出力変数と公開変数への入出力はラダー上で行うという事も可能です。




## まとめ
+ インスタンスはiQ-F内に割り当てられたメモリ

+ メモリの割り当て作業はラベルエディタでラベルを登録することで行う

+ プログラム中で使用する場合は下記による
    + ラベル名(インスタンス名）でファンクションブロックのロジックを呼び出す
        + 呼び出し方
            + 「FBインスタンス」を回路に貼り付ける
            + インラインSTで呼び出す
    + ラベル名（インスタンス名）の構造体型変数として使用する

メーカーへの要望として、「FBインスタンス」は「FBボックス」と呼んでほしかったし、そうすれば「ファンクションの実体」なんて概念が混乱する記載も防げたような気がします。

PLC技術者はインスタンスなどになじみが無いので、それに配慮した記載だとは理解できるのですが検討をお願いしたいところです。

## 過去記事一覧
+ [過去記事一覧](https://qiita.com/fujiteruo/items/af2459d320e8109963db)
Flutter環境構築 Mac (CocoaPods編)

自分の環境

Mac M2

CocoaPodsをダウンロードする際にとても手間がかかったため，同じような人がいたときに参考になればなあと思い書いてみました．

1. Rubyの更新
    
    `brew install ruby` 
    
    [Download RubyGems | RubyGems.org | your community gem host](https://rubygems.org/pages/download)
    
2. drdのインストール
    
    `gem list drb` でdrbのバージョンを確認.
    
    ```jsx
    gem list drb
    
    *** LOCAL GEMS ***
    ```
    
    と出力された場合，この環境ではdrbがインストールされていないということ．
    
    そのため，インストールする必要がある．
    
    最新バージョンのdrbをインストールするには，
    
    ```
    Copy codegem install drb
    
    ```
    
    ただし、エラーメッセージに指定のバージョンが書かれている場合，念のためそのバージョンをインストールするのがよいかもしれない．
    
    その場合は以下のように指定してインストールする
    
    ```
    Copy codegem install drb -v 2.0.6
    ```
    
    [drb | RubyGems.org | コミュニティのgemホスティングサービス](https://rubygems.org/gems/drb?locale=ja)
    
3. yarn のアップデート
    
    `yarn [set version](https://yarnpkg.com/cli/set/version) stable` で更新できる．
    
    以下の公式サイトを参考に
    
    [Installation | Yarn](https://yarnpkg.com/getting-started/install)
    
4. activesupportのインストール
    
    `gem install activesupport -v 6.1.7.7` 
    
    [activesupport | RubyGems.org | your community gem host](https://rubygems.org/gems/activesupport)
    
5. cocoapodsのインストール・PATH
    
    `sudo gem install cocoapods`

    公式サイト
    [CocoaPods.org](https://guides.cocoapods.org/using/getting-started.html#getting-started)
    
    .zshenvというファイルを開いて
    
    `export PATH=$HOME/.gem/bin:$PATH`
    
    というコードを書き込み保存する．
    
    .zshenvファイルがない場合
    
    ターミナルを開き，
    
    `touch .zshenv` で作る．
    
    そして，
    
    `open .zshenv` で開く．
    

## 最後に

いずれも最新状態でない可能性はありますが，最新状態にすると互換性がないという場合もありますので，最新状態にすることが常に正しいということはありません．

そのため，よくエラーメッセージをよんで，指定のバージョンを読み込むことが必要です．

加えて，エラーメッセージの解読に生成系AIに尋ねることはかなり有効でありますが，それだけでは全て解決できない場合がります．そのため，公式サイトの活用はかなり重要です！！

**AI**と **公式サイト**を上手に使いましょう！！

Flutter公式サイト
[Start building Flutter iOS apps on macOS](https://docs.flutter.dev/get-started/install/macos/mobile-ios?tab=download)
【シリーズすごいぞiQ-F】GX_Works3でGX_Works2時代に挫折した構造化プログラムに再び挑む

:::note warn
本記事はラダー言語を対象として記述しています。
:::

## GX_Works2での構造化プログラムとは
2008年頃に発行されたマニュアルを一部引用して記載します
従来のラダープログラムマニュアルとは別に、構造化プログラムマニュアルがシリーズ化され発行されていました。
### 定義
「構造化プログラムとは、シーケンサCPU（PLC)で行う制御内容を階層的な構造にできるように小さな処理単位（部品）に分けて、プログラミングする手法です。」

### 作成手順
1. プログラム構成の作成
1. プログラム部品の作成
    + ファンクションブロックの作成やラベルの定義
1. プログラムの編集
    + プログラム部品をプログラムに配置して編集
1. コンパイル
    + 変換の事を構造化プログラムではコンパイルと呼んでいた

ラベルとファンクションブロックやファンクションを使用したプログラミングと理解できます。

## GX_Woks3での構造化プログラムとは
iQ-Fでは「MELSEC iQ-F FX5プログラミングマニュアル（プログラム設計編）」にてプログラムの構成について説明されていますが、構造化プログラムと記載されることは無く、順番にラベルやファンクションブロックの説明がされるようになりました。
それに伴い、コンパイルに関しては記述が無くなり従来からの「変換」が使用されています。

:::note warn
1ヵ所コンパイルという記述が残っていますが校正ミスと思われます
:::

それにしてもGX_Developer、GX_Works2と順番に使ってきたのでマニュアルの基本的な部分に注意を凝らして読んでこなかったのですが、（プログラム設計編）ではラベルやファンクションブロックを使用してプログラムを組むのが当たり前という立ち位置で驚きました。
デバイスの種別の説明は（応用編）にて記載がありますが、桁指定などの説明はいったいどこにあるのでしょうか。
+ 従来通りのアドレスプログラムでプログラムをしたい
+ 市販の参考書を見ながらPLCを覚えたい

といったときにFX3のマニュアルを推奨するしかありません。

色々長くなりましたが、GX_Works3でラベルやファンクションブロックを使用するにあたって払拭した懸念についての記事です。

## GX_Works2での構造化プログラムで挫折した理由
### ラベルメモリとデバイスメモリが共用だった
GX_Works2でのラベルには必ずデバイスが割り付けられる仕様でした。
+ グローバルラベル
    + ラベル定義時に手動でデバイスを割り付ける
+ ローカルラベル
    + コンパイル時に割り付け範囲から自動デバイスが割り付けられる

今考えると上手く使えばこれは問題なかったのかもしれませんが、気持ちが悪くて使う気になれませんでした。

### ラベルではデバイスで多用する記述方法が使用できなかった
#### ビットラベルの桁指定が出来ない
「K4M0」なとと同様な「k4b_label1」という指定ができません。
アラーム処理などで複数ビットをワードに変換する処理はよく行っているので困りました。

#### ワードラベルのビット指定が出来ない
「D0.1」などと同様な「w_label1.1」という指定ができません。

他にも制約があったのですが使ってないので良く思い出せません。

### ソース情報を書き込むメモリがプログラムメモリと共用
PLCから読み出したプログラムを復元するためにはソース情報をPLCに書き込む必要があるのですが、これがプログラムメモリと共用でした。

結局、上記の仕様があって、「デバイスで組めばいいじゃん」となってしまいました。

## GX_Works3では改善されたか？
結論から言って、私がGX_Works2での構造化プログラムで挫折した理由は全て改善されていました。

### ラベルメモリがデバイスメモリから独立した
ローカルラベルにはデバイスは割り付けられなくなりました。
グローバルラベルには必要に応じてデバイスを割り付けるのですが、
+ デバイスを割り付けた場合
    + デバイスメモリを消費
+ デバイスを割り付けない場合
    + ラベルメモリを消費
    
となっています 
デバイスは通信用にまとまった領域を確保するのでラベルとの取り合いが無くなりました。


### ラベルでもデバイスで多用する記述方法が使用できるようになった
ただし、ビットラベル配列を桁指定する場合
「k4w_label1[0]」では無く、添え字を省略して「k4w_label1」となります。
従って、0以外を始点とすることができません。
0以外を指定したい場合はビット転送や多点ビット転送を併用します。

### ソース情報を書き込むメモリはプログラムメモリから独立した
プログラムのソース情報は下記に分散して保存されるようになりました。
+ データメモリメモリ/プログラム 1024kB
+ データメモリ/復元情報　1024kB
+ データメモリ/パラメータ　1024kB
+ データメモリ/デバイスコメント　2048kB

ただし、どれに何が保存されるかは正確には分かりません。
私がテストしたときはローカルラベルはデータメモリ/プログラム、グローバルラベルはデータメモリ/パラメータといった具合でした。
マニュアルにも詳細な記載は無く、メーカーに問い合わせてもハッキリとした回答はありませんでした。

## おわりに
私以外にもGX_Works2での構造化プログラムの印象が悪く、GX_Works3そのものやGX_Works3でもラベルを使用していない方もいるかもしれないという想いで記事にしてみました。

## 過去記事一覧
+ [過去記事一覧](https://qiita.com/fujiteruo/items/af2459d320e8109963db)
【VSCode】時短VSCode術！複数行にわたって連番を入れたい

# はじめに
VSCodeを愛用している人間です。
VScodeを使っていて複数行に同時に連番を入れたいというときはありませんか？
Insert Sequenceという拡張機能を使うと簡単に入力できたので紹介したいと思います。

# 複数行一括入力の使い方
まずは複数行に一括で入力したいテキストを入力します。
Windowsでは`Ctrl + Alt`、Macでは`command + option`を押しながら
上下の矢印キーを押してカーソルを移動します。
これにより、複数行にカーソルが表示されます。
その状態でテキストを入力すると、複数行に一括で入力することができます。
その他のマルチカーソル入力の仕方についてはこちらの記事が網羅されていて、非常にわかりやすいです。

https://qiita.com/TomK/items/3b1f5be07d708d7bd6c5

# Insert Sequenceについて
連番を一括入力できる拡張機能です。
対応しているものは以下の通りです。
* 番号
* アルファベット
* 英語表記の月
* 英語表記の曜日
* メタ構文変数（意味のない名前）
* ダミーの名前

各項目の細かい内容です。
<details><summary>番号</summary>

何番からどのような表記で入力するか、いくつおきに入力するか(s)、いくつずつ入力するか(d)を指定することができます。
例えば`1,1,2`と入力すると次のように入力されます。(`1,s1,d2`と入力しても同じ結果が得られます)
```
1
1
2
2
3
```
いくつずつ入力するかについては省略することもできます。省略した場合は1つずつ入力されます。
例えば01,1と入力すると次のように出力されます。
```
01
02
03
```
また1から5ずつ増やしたいときは`1,5`のように開始番号と増やしたい数を入力します。減らして連番を付けていきたい場合には`8,-2`のように増やす数にマイナスを付けます。
```
//1,5のとき
1
6
11
```
</details>
<details><summary> アルファベット</summary>

順に入力するのと、繰り返しで入力することができます。
順に入力する場合、例えば`A`と入力すると次のように出力されます。
```
A
B
C
D
```
繰り返しの場合、例えば`r,g,b`と入力すると次のように出力されます。
```
r
g
b
r
g
b
```
`r,g,b`と入力しましたが、`Cat,Dog,Mouse`のような単語でも同じ挙動をします。
</details>
<details><summary>英語表記の月</summary>

正式な表記と3文字の省略表記に対応しています。
例えば`January`と入力すると次のように出力されます。
```
January
February
March
```
また、`Jan.`と入力すると次のように出力されます。
```
Jan.
Feb.
Mar.
```
</details>
<details><summary>英語表記の曜日</summary>

正式な表記と3文字の省略表記に対応しています。
例えば`Sunday`と入力すると次のように出力されます。
```
Sunday
Monday
Tuesday
```
また`Sun.`と入力すると次のように出力されます。
```
Sun.
Mon.
Tue.
```
</details>
<details><summary>メタ構文変数（意味のない名前）</summary>

以下のような２パターンがあります。

1. foo,bar,baz,qux,quux,corge,grault,garply,waldo,fred,plugh,xyzzy,thud
1. hoge,fuga,piyo,hogera,hogehoge

例えば`foo`と入力すると次のように出力されます。
```
foo
bar
baz
```
</details>
<details><summary>ダミーの名前</summary>

Alice,Bob,Carol,Dave,Ellen,Frank
以上のような名前が用意されています。

例えば`Alice`と入力すると次のように出力されます。
```
Alice
Bob
Carol
```
</details>

# Insert Sequenceの使い方
まずはVSCodeの拡張機能タブからInsert Sequenceをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/80447618-efb6-6dd5-253e-68612a19c630.png)
インストールが完了したら、新しいファイルを開きます。
連番を入力したい場所にカーソルを置き、コマンドパレットを開きます。

:::note info
コマンドパレットの開き方
Windows：F1またはCtrl+Shift+P
Mac：Command+Shift+P
:::

コマンドパレットにInsert Sequenceと入力し、表示されたオプションを選択します。
連番の開始番号とステップ数を入力します。
例えば、1から始めて1ずつ増やす場合は、`1, 1`と入力します。
Enterキーを押すと、連番が自動的に入力されます。
入力をやめたい場合にはEscキーを押します。

# まとめ
VSCodeのInsert Sequence拡張機能とCtrl+Alt+矢印キーを使った複数行一括入力を使うことで、コーディングをより効率的に進めることができます。
ぜひ活用してみてください。
以上、ご覧いただきありがとうございました。

### 参考・引用

https://untype.jp/blog/202312081719
[統計検定２級]項目別難易度評価

## はじめに
◆この記事の概要
・２級の出題項目の難易度を🔴を用いて５段階評価します。
・過去問の出題の頻出度も合わせて⭐️で５段階評価します。

◆この記事の対象
・統計の学習をしている方
・２級の受験を検討してる方

●著者について
2024年3月に統計検定２級を合格
現在は統計検定準１級に向けて勉強中

## 難易度🔴の評価基準
<strong>レベル１　🔴</strong>
全然難しくない。
もともと知っている方も多いと思う。

<strong>レベル2　🔴🔴</strong>
教科書を読めば難なく理解できる。
中学高校で触れたことある方は飛ばしても問題ない。

<strong>レベル3　🔴🔴🔴</strong>
少し注意が必要。
中学高校で触れたことがあっても忘れている方も多いと思う。

<strong>レベル4　🔴🔴🔴🔴</strong>
統計学に触れたことのない方は初見では難しい。
考え方自体が少しずつ複雑になっている。

<strong>レベル5　🔴🔴🔴🔴🔴</strong>
かなり難しい。
一度やっただけでは何やってるかわからない方も多いと感じる。
著者は４、５回繰り返してようやく理解した。


## 項目別評価
[統計検定２級　出題範囲](https://www.toukei-kentei.jp/exam/grade2/ "統計検定２級home")

#### データソース
身近な統計
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴 |  ⭐️ |

大学受験で数学を使ったことのある人は一度は見たことのあるようなものばかりです。
もう一度復習がてらに眺めたら理解できると思います。


#### データの分布
データの分布と記述
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴🔴 |  ⭐️ |

ここまでは算数のような内容です。決して落としてはいけない。


#### １変数のデータ
中心傾向の指標
散らばりなどの指標
中心と散らばりの活用
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴🔴 |  ⭐️⭐️⭐️ |

代表値と言われる単語や聞き馴染みのない単語がたくさん出てくるようになります。
しかし、覚えようとしなくてもコレから先の単元をやっていくうちに必然的にわかるようになりました。


#### ２変数以上のデータ
散布図と相関
カテゴリカルデータ
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴🔴🔴🔴 |  ⭐️ |

相関関係と因果関係の違いがわかりますか？


#### データの活用
単回帰と予測
時系列データの処理
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴🔴🔴 |  ⭐️ |

ここから記述統計学と呼ばれるものから推測統計学と呼ばれるものに移ります。
難易度が高くなっていく一方でようやくTHE統計学って感じがして面白くなってきます。


#### 推測のためのデータ収集法
観察研究と実験研究
標本調査と無作為抽出
実験
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴🔴🔴 |  ⭐️⭐️ |

標本の抽出方法には様々ありややこしくなってきます。
抽出方法についてはしっかり丸暗記してしまいましょう。


#### 確率モデルの導入
確率
確率変数
確率分布
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴🔴🔴 |  ⭐️⭐️⭐️⭐️ |

確率は統計っぽいイメージは持っていませんでしたがしっかりと統計学です。
ベイズ統計などの今後大事になるであろう知識の根幹になります。
今後も学習を続けていく予定のある方はしっかりと身につけておきたいです。


#### 推測
標本分布
推定
仮説検定
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴🔴🔴🔴🔴 |  ⭐️⭐️⭐️⭐️⭐️ |

仮説検定は最頻出かつ最難関だと感じました。
有意水準〇〇％など難しくなってきます。


#### 線形モデル
回帰分析
実験計画の概念の理解
| 難易度　| 出題頻度 |
|:-:|:-:|
|  🔴🔴🔴🔴 |  ⭐️⭐️⭐️⭐️⭐️ |

回帰分析はなんぞやって感じですが、二次関数を用いた予測になります。
大学受験で数学使った人は苦戦しないでしょう。

#### 活用
統計ソフトウェアの活用
| 難易度　| 出題頻度 |
|:-:|:-:|
| 🔴🔴🔴 |  ⭐️⭐️⭐️⭐️ |

始めて見る方がほとんどだと思います。著者も初めてでしたが内容はさほど難しくありません。
過去問を見てみると最後の１問は統計ソフトウェアの活用から出題されていることがとても多いです。

## おわりに
難易度と出題頻度は著者が過去数年分と他の予想問題集を解いた際に感じたものになります。
人ごとに難易度の感じ方に差があるでしょうが、少しでも参考にしていただけたら幸いです。