OmniAICreator/Qiita-1.07M huggingface dataset:
paramiko を使用してSSH接続を確立する

Pythonの拡張機能であるparamikoを使ってリモートVMにSSH接続できるようにします．


#### ポート番号と自身のローカルVMの公開鍵の絶対パスを引数に入れます．

```書き方
port = 22
private_key_path = '/home/"pass"/.ssh/"公開鍵名"'
```


#### SSHセッションを確立します
- paramiko ライブラリの SSHClient クラスのインスタンスを作成します
- クライアントに、システムのホストキーを読み込むように指示します．これにより，既知のホストの鍵が保存されている場合，その情報が利用されます
- ホストキーがクライアントにまだ知られていない場合、新しいホストキーを自動的に受け入れるポリシーを設定します
- Ed25519 アルゴリズムを使用した秘密鍵をファイルから読み込みます
- connect メソッドを使用してSSH接続を確立します

```SSHセッションの確立
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
private_key = paramiko.Ed25519Key(filename=private_key_path)
client.connect(host_name, port, user_name, pkey=private_key)
```
SSHクライアントがセットアップされ，指定された秘密鍵を使用して指定されたホストに接続することができます

#### 接続したいリモートVMのディレクトリを取得します
- リモートサーバー上でリストアップしたいディレクトリのパスを指定します(以下のプログラムでは"/var/log/")
- リモートサーバー上で実行するコマンドを構築する(以下のプログラムでは"ls -a"を使用してディレクトリ内のすべてのファイルとディレクトリをリストアップしています)
- exec_commandメソッドを使用して，リモートサーバー上でコマンドを実行します
stdin, stdout, stderr はそれぞれ標準入力，標準出力，標準エラーを表します
- 標準出力から読み取ったリモートサーバーのコマンド実行結果を文字列として取得します

```リモートディレクトリを取得
remote_directory = '/var/log/'
command = f"ls -a {remote_directory}"
stdin, stdout, stderr = client.exec_command(command)
file_name = stdout.read().decode('utf-8')
```
file_nameにはリモートサーバーのコマンド実行結果が文字列として入っている
traceroute概要/詳細

# tracerouteの概要と機能

## 目次
- [概要](#概要)
- [機能/詳細](#機能詳細)
- [まとめ](#まとめ)

## 概要
traceroute（トレースルート）は、インターネット上のパケットがどの経路を通過して目的地に到達するかを調査するためのネットワークトラブルシューティングツールであり、TCP/IPネットワークで広く使用されています。tracerouteは、ネットワーク上のホップ（ルーターやゲートウェイ）に対してICMPやUDPパケットを送信し、パケットの生存時間（TTL）を経過させながら送信元から目的地までの経路を特定します。

機能/詳細
1. ネットワーク経路の特定: tracerouteは、ネットワーク上のすべてのホップ（経由点）を特定するために使用されます。各ホップの応答時間やラウンドトリップタイム（RTT）も表示されることがあります。
2. トラブルシューティング: ネットワークの問題を特定するために、tracerouteはパケットロスやボトルネックの位置を特定するのに役立ちます。時間がかかるホップやパケットロスのあるホップは、ネットワークの問題の可能性を示唆することがあります。
3. 経路の最適化: ネットワーク管理者は、tracerouteの結果に基づいて経路を最適化することができます。遅延やパケットロスの問題を抱える特定のホップを特定し、経路の変更やネットワークの設定変更により改善を図ることができます。
4. ネットワークモニタリング: 定期的に実行されるtracerouteは、ネットワークの状態を監視するためにも使用されます。ネットワークの変更や問題のある時には、tracerouteの結果が変化することがあります。

まとめ
tracerouteはネットワークトラブルシューティングにおいて非常に役立つツールであり、ネットワーク経路やボトルネックの特定、経路の最適化、ネットワークの監視に使用されます。

## Javaでのtracerouteのサンプルコード

```java
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class TracerouteExample {

    public static void main(String[] args) {
        String host = "example.com";
        try {
            InetAddress address = InetAddress.getByName(host);
            System.out.println("Traceroute to " + host);
            for (int ttl = 1; ttl <= 30; ttl++) {
                Process process = Runtime.getRuntime().exec("traceroute -m " + ttl + " " + host);
                int exitCode = process.waitFor();
                if (exitCode == 0) {
                    // Traceroute successful
                    System.out.println("TTL " + ttl + ": " + address.getHostAddress());
                } else {
                    // Traceroute failed
                    System.out.println("TTL " + ttl + ": Request timed out");
                }
            }
        } catch (UnknownHostException e) {
            System.out.println("Unknown host: " + host);
        } catch (IOException e) {
            System.out.println("Error executing traceroute: " + e.getMessage());
        } catch (InterruptedException e) {
            System.out.println("Traceroute interrupted");
        }
    }
}
```

## Goでのtracerouteのサンプルコード

```go
package main

import (
    "fmt"
    "net"
    "os/exec"
)

func main() {
    host := "example.com"
    address, err := net.ResolveIPAddr("ip", host)
    if err != nil {
        fmt.Println("Unknown host:", host)
        return
    }
    fmt.Println("Traceroute to", host)
    for ttl := 1; ttl <= 30; ttl++ {
        cmd := exec.Command("traceroute", "-m", fmt.Sprint(ttl), host)
        err := cmd.Run()
        if err != nil {
            fmt.Println("TTL", ttl, ": Request timed out")
        } else {
            fmt.Println("TTL", ttl, ":", address.String())
        }
    }
}
```

以上がtracerouteの概要と機能、JavaとGoでのサンプルコードです。tracerouteはネットワークのトラブルシューティングや監視に役立つツールであり、経路特定や最適化に使用することができます。
Windows PC - WindowsPC 間で ssh ポートフォワーディングしてjupyterを動かすメモ

## 前提

- Windows 11 (Windows 10でもほぼ同じはず）
- サーバー側はローカルユーザー
- サーバー側のIPは固定されているとします．（そうでなくてもできるはず）
- クライアント側にはssh, ssh-keygen が入っている．（Windows 11の最新版ではデフォルトで入っていた）
- サーバー側にPort: 8888でjupyter serverが立っている

## サーバー側にSSHサーバーを立てる　(サーバー側）
- `システム設定`-`オプション機能`-`オプション機能を追加する`から`Open SSHサーバー`をインストールする

- SSHサーバーのコンフィグを修正する
```:sshd_config (追加する)
AllowTcpFowarding yes
```
TcpFowardingを許可しないとポートフォワーディングできない（はず）なので有効化する．

```:sshd_config (コメントアウトする)
#Match Group administrators
#   AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```
これは管理者アカウントのときにadministrators_authorized_keysを使用する設定を削除している．

- SSHサーバーを起動する
```:powershell
PS > Start-Service sshd
```
上記に加えて，sshd_configの中身を変えたときは`Restart-Service sshd`によりサービスを再起動する必要がある．

## ssh接続のために公開鍵と秘密鍵を作る (クライアント側)
```:powershell
PS > ssh-keygen -t ed25519
```
このコマンドで公開鍵と秘密鍵が作成された．

## 公開鍵を登録する(サーバー側)

- クライアント側で作成した公開鍵の中身をコピーして，サーバー側の`authorized_keys`に書き込む．初期状態ではデフォルトの参照先ファイル`.ssh/authorized_keys`が無いはずなので，新しくファイルを作る．

（補足：sshd_configで `AuthorizedKeyFile <参照先>`を設定すると参照先が変わる）
- `authorized_keys`のアクセス権限を修正する．
```:powershell
PS > icacls.exe .\authorized_keys /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
```
正しい権限設定になっていない場合，ssh接続ができなかった．

## ポートフォワーディングする．(クライアント側)

- ssh configを書く
```:config
Host servername
  Hostname <サーバーのIPアドレス>
  User <サーバのユーザー名>
  IdentityFile <秘密鍵のファイルパス>
  PasswordAuthentication no
  PubkeyAuthentication yes
```

- ssh接続を確認する
```:powershell
PS > ssh servername
```
リモート側（サーバー側）のPowershellが見えたら成功．

- ポートフォワーディングする．
```:powershell
PS > ssh servername -L 8888:127.0.0.1:8888 -N
```
`127.0.0.1`はローカルホストのことである．ただし，なぜか`localhost`表記では正しく動作しなかった（何故？）

これでブラウザから`localhost:8888`にアクセスしてjupyterが見えたら成功．
ADDコマンドについて

# 1.初めに
　私が行った研究において，Dockerfileで使用されるADDコマンドについて調べていく中で，Dockerfileを記述する際には非常に手軽だがDockerの公式の公開する[ベストプラクティス](https://docs.docker.jp/develop/develop-images/dockerfile_best-practices.html#add-copy)からは使用を推奨されていないコマンドである．
このコマンドについて研究の過程で，知ったことをメモ代わりに書いていく．

# 2.ADDコマンドとは
　ADDコマンドとは，Dockerfileにおいて記述されるコマンドでありコンテナにファイルやディレクトリをコピーする機能を持ちます．
```Dockerfile
#ファイルのコピー
ADD sample.txt.gz /tmp
#リモートURLからファイルのコピー
ADD https://www.example.com/sample_data.txt
```
特徴として，コンテナにファイルやディレクトリを追加する他に
- リモートURLから直接ファイルを追加することができる．
- 圧縮ファイルを自動解凍することができる．

という機能があります．
とても便利なコマンドですね．

# 3.どうして使用を推奨されていないか
　ADDコマンドが便利なのに使用を推奨されていない理由として，だいたいこんな感じです．
 
 - 必要以上の処理を行う可能性があるため
 　リモートからのファイル追加や，圧縮ファイルの自動展開などの様々な機能があるため，Dockerfileの可読性が下がったり，解凍する予定だった圧縮ファイルを展開してしまう可能性があります．

 - イメージサイズの問題
 ADDコマンドでファイルを追加した場合，同一命令内でファイルを削除できません．
ファイルを展開した後やイメージ内の異なるレイヤにファイルを加えないのであれば，イメージサイズの削減のため削除するべきですが，ADDコマンドを使った際に生成されたレイヤには追加したファイルが残ります．これによりイメージサイズが大きくなる可能性があります．



# 4.最後に
 ADDコマンドはいろんな機能を持っているため，非常に便利な機能を搭載していていて，Dockerfileに柔軟性を与えてくれます．
 しかし，柔軟すぎてもDockerfileが脆くなるということで便利だけど乱用は控えましょうということでした．
 ADDコマンドの適切な使用ケースは，tarファイルを解凍追加する場合で，なおかつそのファイルをイメージ内に残しておきたい場合のみな気がしてます．
 後，圧縮ファイルの自動展開機能でZIPファイルが展開できなかったのが印象に残ってます．
Rails + Ruby 3.3.0でYJITを使ってみる

## Rubyインストール時にRust環境が必要

Ruby 3.3.0では簡単にYJITが選択できるようになっているのですが、前提条件としてRubyビルド時にRustコンパイラがインストールされている必要があります。Rustが入っていない場合、YJITが使えないRubyがビルドされてしまうので注意しましょう。
これはrbenvでRubyをインストールする場合も例外ではありません。Macの場合は次のような手順で事前にRust環境をインストールしておきます。
```
$ brew install rustup-init
$ rustup-init
$ exec $SHELL -l

$ rbenv install 3.3.0
```

rubyを`--yjit`オプション付きで実行するとYJITが有効になります。バージョン情報を確認すると「+YJIT」と表示されて、YJITが有効になっていることが確認できます。
```
% ruby -v --yjit
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) +YJIT [arm64-darwin23]
```

## RailsでYJITを有効化する方法

`--yjit`オプション以外の方法として、プログラム実行時に`RubyVM::YJIT.enable`とすることで実行中動的にYJITが有効化されます。
Railsの場合、config/initializersに置くと良いです。

```ruby:config/initializers/enable_yjit.rb
if defined? RubyVM::YJIT.enable
  Rails.application.config.after_initialize do
    RubyVM::YJIT.enable
  end
end
```

これはRails 7.2でデフォルトの挙動になる予定です。
https://github.com/rails/rails/pull/49947
C＃でAtCoder Beginners Selection ABC086C Traveling

https://atcoder.jp/contests/abs/tasks/arc089_a

自分が書いたコード

```c#
using System;
using System.Linq;

class Program
{
    public static void Main(string[] args)
    {
		int N = int.Parse(Console.ReadLine());
		int[][] txyArray = new int[N][];
		for (int i = 0; i < N; i++)
		{
			txyArray[i] = Console.ReadLine().Split(' ').Select(p => int.Parse(p)).ToArray();
		}
		
		bool flag = true;
		(int t_, int x_, int y_) = (0, 0, 0);
		for (int i = 0; i < N; i++)
		{	
			(int t, int x, int y) = (txyArray[i][0], txyArray[i][1], txyArray[i][2]);
			int time = t - t_;
			int distance = Math.Abs(x_ - x) + Math.Abs(y_ - y);
			(t_, x_, y_) = (t, x, y);
			if (time < distance)
			{
				flag = false;
				break;
			}
			if (time % 2 != (distance % 2))
			{
				flag = false;
				break;
			}
		}
		if (flag)
		{
			Console.WriteLine("Yes");
		} else 
		{
			Console.WriteLine("No");
		}
	}
} 
```

最初に書いたコードは、ただスタート$(0, 0, 0)$ から $(t, x, y)$ まで到達できるかを判定するコードとなってしまっており、各点間の移動が可能かどうかを判定することができていないコードになってしまっていた。

```c#
using System;
using System.Linq;

class Program
{
    public static void Main(string[] args)
    {
		int N = int.Parse(Console.ReadLine());
		int[][] txyArray = new int[N][];
		for (int i = 0; i < N; i++)
		{
			txyArray[i] = Console.ReadLine().Split(' ').Select(p => int.Parse(p)).ToArray();
		}
		
		bool flag = true;
		for (int i = 0; i < N; i++)
		{	
			int t = txyArray[i][0];
			int distance = Math.Abs(txyArray[i][1]) + Math.Abs(txyArray[i][2]);
			if (t < distance)
			{
				flag = false;
				break;
			}
			if (t % 2 != (distance % 2))
			{
				flag = false;
				break;
			}
		}
		if (flag)
		{
			Console.WriteLine("Yes");
		} else 
		{
			Console.WriteLine("No");
		}
	}
} 
```

最初に書いたコードでも、テストケースが全部で14個あるうちの最後のケース以外は通ってしまっていたのには驚いた。

コンテスト当時は荒れたのかな～とか思ったり。
[Linux]コマンドをインストールする方法

## 要 旨
コマンドをパスの通っている場所にインストールする方法について、記述します。
## 実施要領
通っているパスを確認する。
```linux
echo $PATH
```
現在のディレクトリ内にあるコマンドを全部インストールする。
```linux
install -m 0755 -o root -g root -t /usr/local/bin *
```
## 結　言
今回は、コマンドをパスの通っている場所にインストールする方法について、記述しました。
新しいPCでFigmaを開こうとしたらUh oh... we can't open that fileと言われた時の対応


# 環境
macOS 13.4.1
Apple M2 Pro
Chrome: バージョン: 120.0.6099.199（Official Build） （arm64）

# 概要

備忘録として残す、新しいPCにしてFigmaをブラウザ上から開こうとした際に起きたエラー

![スクリーンショット 2024-01-10 16.02.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980538/30e587c3-4a9a-2dc4-4985-e8ec57ff3723.png)

```
Uh oh... we can't open that file

We can't open this file because WebGL isn't supported, or is disabled, in your browser. If your browser supports WebGL, check out this help article to find out how to enable it.
```

日本語訳(deepl)

```
お使いのブラウザでWebGLがサポートされていないか、無効になっているため、このファイルを開くことができません。お使いのブラウザがWebGLをサポートしている場合は、このヘルプ記事でWebGLを有効にする方法を確認してください。
```


# 解決策

以下のリンクでブラウザごとの対応が書いているのでそのようにする

https://www.docs.trendmicro.com/ja-jp/enterprise/trend-vision-one/xdr-part/workbench/alert-view/performing-an-alert-/advanced-analysis-ac/execution-profile/enabling-webgl.aspx


### chromeの場合

設定画面からハードウェア　アクセラレーションがkのうな場合は使用するにチェックして再起動する

![スクリーンショット 2024-01-10 16.05.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1980538/c0e722a7-cc3b-938e-202f-06410d2bc29f.png)

# Chatgpts先生に聞いた

Q. 
```
ハードウェアアクセラレーションが使用可能な場合は使用するとは
```

A. 

```
「ハードウェアアクセラレーションが使用可能な場合は使用する」というのは、コンピューターの処理において、特定のタスクをより効率的に実行するために、専用のハードウェア（例えばGPUや特定のプロセッサー）を使用することを意味します。通常、これらのハードウェアアクセラレータは、特定の種類の計算や処理（例えばグラフィックス処理、ビデオエンコーディング、暗号計算など）に特化しており、これらのタスクを通常のCPUよりも高速かつ効率的に実行できます。

ハードウェアアクセラレーションを使用すると、システムの全体的なパフォーマンスが向上し、CPUの負荷が軽減され、エネルギー効率も改善されることがあります。ただし、すべてのアプリケーションやタスクがハードウェアアクセラレーションの恩恵を受けるわけではなく、使用するハードウェアとソフトウェアの両方が対応している必要があります。
```


Q.

```
WEBGLと関係しているの？
```

A. 
```
はい、WebGL（Web Graphics Library）はハードウェアアクセラレーションと密接に関連しています。WebGLは、ウェブブラウザ内で3Dグラフィックスを描画するためのJavaScript APIです。この技術は、ウェブページ上でインタラクティブな3Dグラフィックスのレンダリングを可能にすることを目的としています。

ハードウェアアクセラレーションの利点を活用するため、WebGLは通常、コンピュータのグラフィックス処理ユニット（GPU）を直接使って処理を行います。このアプローチにより、グラフィックスの描画が高速化され、CPUにかかる負荷が軽減されます。その結果、複雑な3Dグラフィックスやアニメーションをスムーズに、かつ効率的にウェブブラウザ上で表示することができるようになります。

WebGLを使用するウェブアプリケーションやゲームは、GPUのパワーを利用して、よりリッチでインタラクティブなビジュアルエクスペリエンスを提供することができます。ただし、ユーザーのデバイスがWebGLをサポートしている必要があり、また適切なドライバやハードウェアが必要となる場合もあります。
```

どうやらfigmaはこの辺の技術を使ってUIを実現させていることがわかった。
ミラーレスカメラで撮影したjpgがGooglePhotosで「元の画質」のまま「保存容量の節約画質」に圧縮/変換されない事象への対応

# これはなに
Sonyのα6400で撮影した写真をGooglePhotosにアップロードすると「元の画質」となり、「既存の写真と動画を保存容量の節約画質に変換」しても「保存容量の節約画質」に圧縮されないのでその対応方法のメモ。

# 原因
https://support.google.com/photos/answer/6220791
> 状況によっては、一部の写真や動画が圧縮されずに、元のファイルサイズのまま保存されることがあります。一部のマルチピクチャ形式（mpf）の .jpg ファイルは圧縮できません。

exifからMPF関連のタグを削除すれば良いらしく、実際削除してからアップロードすると「保存容量の節約画質」で保存された。

# exif削除

## exiftoolをインストール
https://exiftool.org/

## exifからMPFタグを削除するコマンド
```
exiftool -overwrite_original_in_place -mpf:all= ./*.JPG
```

## ショートカット作成
```
sudo vi /usr/local/bin/removeMpf
/* ↑のコマンドを書き込んで */
sudo chmod 755 /usr/local/bin/removeMpf
```

## 実行
```
cd /tmp/jpg/
removeMpf
```

# 参考にさせていただいた記事

https://protein-muscle.dizch.com/archives/1689

https://twitter.com/Blue_Liner31/status/1484457038348357637

https://note.com/fuddy/n/n1018de9bdec0
【Googleスプレッドシート】「グループ化」で行と列を賢く整理しよう【隠れたコツ】[+] / [-] ボタンを移動する方法【動画 10分24秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【Googleスプレッドシート】「グループ化」で行と列を賢く整理しよう【隠れたコツ】[+] _ [-] ボタンを移動する方法【動画 10分24秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/ad4943c2-113c-fbb0-1fcc-00df2cbfc0a5.png)




* # 動画URL
    * https://youtu.be/XLsM8PIuJIM

<br>

* # 動画タイトル
    * 【Googleスプレッドシート】「グループ化」で行と列を賢く整理しよう【隠れたコツ】[+] / [-] ボタンを移動する方法【動画 10分24秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-12-23(土)

YouTube Summary with ChatGPT & Claude( Chrome拡張機能 )で、目次と概要を自動生成しました。
https://chromewebstore.google.com/detail/youtube-summary-with-chat/nmmicjeknamkfloonkhhcjmomieiodli


動画の目次( タイムスタンプ ):

00:00 - オープニング
　└ 00:00 - Googleスプレッドシートの行、または列の、グループ化の完成イメージ

01:20 -グループ化の入れ子
　└ 小さなグループを、大きなグループにまとめられる
　└ 01:33 DALL·E 3 @ChatGPT Plus にて作成した「入れ子」のイメージイラスト
　└ 02:15 実際のグループ化操作

03:39 - 非表示機能とのちがい
　└ 非表示機能：非表示 or 再表示をさせたい、行範囲 or 列範囲を保存できない❌ ( 範囲選択が解除される )
　└ グループ化機能：非表示 or 再表示をさせたい、行範囲 or 列範囲を保存できる⭕

05:54 - 行と列のグループ化の違い、注意点、コツ
　└ 列のグループ化を入れ子にする場合は、第2階層までに留めておいた方がよい
　└ 理由は、縦方向のセルの可視化範囲が狭くなることを防ぎたいから
　└ 07:04 不必要なグループの削除方法

07:18 - [+] / [-] ボタンの移動
　└ グループを非表示 or 再表示をさせるボタンオブジェクトが見えなくなった、または隠れている場合の対処方法

09:23 - おまけ：Googleスプレッドシートで効果的な関数のサンプル
　└ 一瞬で、「行」番号を200まで表示させる
　　└ =ARRAYFORMULA(ROW($A$2:$A$202)-2)

　└ 一瞬で、「列」番号を200まで表示させる
　　└ =ARRAYFORMULA(COLUMN($B$1:$GS$1)-1)


動画の概要:

この動画では、Google スプレッドシートのグループ化機能に関する包括的な情報を提供しています。
基本操作から応用技術までを丁寧に説明し、スプレッドシートユーザーが日常的に直面する問題を解決し、作業効率を向上させる方法を紹介します。

まず、グループ化の基本的な概念と、行と列の選択方法を示しています。
プラスとマイナスボタンを使用したグループの開閉方法も説明し、基礎をしっかり理解するための重要な部分です。

次に、「入れ子になったグループ化」の概念に焦点を当て、小さなグループを大きなグループに組み入れる方法を詳しく解説しています。
これにより組織化と可視性が向上し、情報量が多いGoogleスプレッドシートの管理を容易にすることができます。

また、行と列のグループ化の違いにも触れ、それぞれがスプレッドシートの操作性にどのように影響するかを説明します。
列のグループ化では、スペース節約( セル範囲の確保 )とデータの見やすさを重視するため、グループ化の入れ子を第2階層までに留めておいた方がよいことを実演しています。

グループ化をした後のカスタマイズ方法も紹介し、ユーザーが自分の要望に合わせてグループを管理する方法を提案しています。
これには、ボタン位置の調整が含まれます。

動画の後半では、グループ化機能の実践的な応用例を紹介しています。
大規模データセットの管理や、ビジネスでの実務など、日常のデータ管理におけるグループ化の利点を示しています。

さらに、グループ化機能がスプレッドシートの可読性と操作性をどのように向上させるかについても詳細に説明しています。
目的の情報へのアクセスを容易にし、大量データの管理を助け、プレゼンテーションやレポートでのデータ提示方法を改善するヒントとなりえます。

動画では視覚的な例を多用し、グループ化機能を使ってスプレッドシートのデータを効果的に整理し、管理する方法を段階的に示しています。
各ステップは具体的なPC操作画面と共に説明され、視聴者が容易に理解し、自分の作業に応用できるようになっています。

全体として、この動画はGoogle スプレッドシートのユーザーにとって非常に価値のある情報です。
初心者から上級者まで幅広いスキルレベルのユーザーにとって有益で、グループ化機能を使ってスプレッドシートの全体的な効率と機能性を向上させる方法を総合的に理解できます。


---


✓ 🎥My videos are strongly related to this video. | この動画と関連が強いわたしの動画 ↙
　・“効果的にGoogleスプレッドシートを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPKt1RQjiH2Dw-iNtB1xqd_


　・“Googleスプレッドシートの関数”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMwoHyLyMFhm0N5w-2ieyAV


　・“デモ・マニュアル動画”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMJJv4wKFZDT03S2qmL2pkR


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/3RUY6ls
【2023年 第1回 生成AIパスポート試験】合格体験記 その2 | 今後の受験予定者へのアドバイス 1)学習のやり方は？、教材は何をつかえばよい？ 2)受験申込み期間は？ 【動画 14分39秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【2023年 第1回 生成AIパスポート試験】合格体験記 その2 _ 今後の受験予定者へのアドバイス 1)学習のやり方は？、教材は何をつかえばよい？ 2)受験申込み期間は？ .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/202da5c8-ec9d-8e2b-59f9-50d8848fbe6b.png)




* # 動画URL
    * https://youtu.be/YK5sdEuGlWw

<br>

* # 動画タイトル
    * 【2023年 第1回 生成AIパスポート試験】合格体験記 その2 | 今後の受験予定者へのアドバイス 1)学習のやり方は？、教材は何をつかえばよい？ 2)受験申込み期間は？ 【動画 14分39秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-01-07(日)

YouTube Summary with ChatGPT & Claude( Chrome拡張機能 )で、目次と概要を自動生成しました。
https://chromewebstore.google.com/detail/youtube-summary-with-chat/nmmicjeknamkfloonkhhcjmomieiodli


動画の目次( タイムスタンプ ):

00:00 - オープニング

01:17 - 今回のテーマ( 議題 )は、今後の受験予定者へのアドバイス

01:32 - 学習のやり方は？、教材は何をつかえばよい？
　└ 教材：公式テキストブック( 山中はKindle版を購入しました )
　└ リンク：生成AIパスポート 試験概要 | 一般社団法人生成AI活用普及協会(GUGA) 
　　https://guga.or.jp/outline/

　└ 04:05 公式認定講座1：株式会社東京リーガルマインド( LEC )『生成AIパスポート試験合格講座』
　　https://lpe-jp.com/guga_lp/
　　10,780円

　└ 04:36 公式認定講座2：株式会社リンクアカデミー『生成AIパスポート対策講座』
　　https://www.aviva.co.jp/lp/generative_ai_passport/
　　金額不明( 不透明、かつ、「資料請求はこちら」パターン。おすすめしない講座の特徴である )


07:58 - 受験申込みの流れ：今後の生成AIパスポート試験の申込み期間は？
　└ リンク：生成AIパスポート 試験概要 | 一般社団法人生成AI活用普及協会(GUGA) 
　　https://guga.or.jp/outline/


11:12 - 受験後に届いたメール「【2023年11月度】GUGA月次報告のご案内」の紹介
　└ GUGA( 生成AI活用普及協会 )：生成AIパスポート試験の運営団体です。

　└ 11:26 合否結果( 合格率：73.71％ )

　└ 11:44 シラバス分野別得点率

14:04 - おわりに：メッセージと感謝


動画の概要:

この動画では、2023年に行われた第1回生成AIパスポート試験の合格体験記として、わたしの学習方法や教材選びのポイント、受験の申し込み方法などについて詳しく紹介しています。
学習のやり方やスケジュールの組み方、効果的な教材の選び方から受験の申し込みまでの詳細なプロセスを解説しています。

これから生成AIパスポート試験に挑戦する方々へ、実体験に基づいた有用なアドバイスを提供することを目的とした内容です。
これからの受験予定者はもちろん、AI技術に興味がある方々にも役立つ情報を多く含んでいます。

生成AIパスポートは、2023年に新しく始まった資格試験です。
わたしが受験した初回( 2023年 第1回 )試験は、過去問が存在しない環境での学習体験でした。
ですので、わたしの合格体験が役に立つのは、第2回目、第3回目の試験までかなと考えています。

その短い間であっても、誰かの、何かの役に立てたらとても嬉しいです。


---


✓ 🎥My videos are strongly related to this video. | この動画と関連が強いわたしの動画 ↙
　・“生成AIパスポート試験 合格体験記”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMbDo3Blwj-vJGWbIlMLgK3


　・“生成AIパスポート 試験学習(動画公開日で降順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMuGz8uBLRl1XyLqeRCIY11


　・“生成AIパスポート 試験学習(動画公開日で昇順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOQB8T6uppVO_juFi-4xL3E


　・“効果的にマインドマップを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMTIuF-n2Uyaw6cqEMFt0aL


　・“マインドマイスター( クラウド型マインドマップ )を活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMCeUohu19ZbUilmcZnEJ1q


　・“マインドマイスター( クラウド型マインドマップ )でのプレゼンテーションの例”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMXJCYhmWK4bjAUG1uy78li


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/48JnT5B
mkvファイルから字幕を抽出する

## 前提
ffmpegがインストール済み

```zsh
$  ffmpeg -version
ffmpeg version 6.1.1 Copyright (c) 2000-2023 the FFmpeg developers

$  ffprobe -version
ffprobe version 6.1.1 Copyright (c) 2007-2023 the FFmpeg developers
```

## データの確認
```zsh
$ ffprobe input.mkv

Stream #0:1(eng): Subtitle: ass
Metadata:
  title           : English Subs (Coalgirls/R1)

Stream #0:2(eng): Subtitle: hdmv_pgs_subtitle
Metadata:
  title           : English SDH (Retail US-BD)
```

複数ある字幕のうち必要なものの以下二つを確認。
1. Streamに続く**0:n**
(変換コマンドのオプション"-map 0:n"でこの値を指定する)
2. Subtitleに続くファイル形式

### ファイル形式が「ass」
字幕のデータがテキスト形式のためそのまま抽出可能。

```zsh
$  ffmpeg -i input.mkv -map 0:n output.srt
```

### ファイル形式が「HDMV PGS」
字幕データがビットマップ方式のためOCR（光学文字認識）を使用してテキストに変換しなければならない。
ffmpegにOCR機能はないため、supファイル（ビットマップ画像）として保存し別の方法で変換が必要。

```zsh
$  ffmpeg -i input.mkv -map 0:n -c copy -f sup output.sup
```

[Sup to Srt Download](https://subconverter.com/convert-sup-to-srt-online)
ffmpegで作成したsupファイルを選択してstrファイルに変換

## プレーンテキストに変換
・[Nikse - Subtitle Edit online](https://www.nikse.dk/subtitleedit/online)
"Subtitle -> Open"で展開し"Subtitle -> Export plain text"で保存

・[Convert Sup to Srt: online format converter](https://subtitletools.com/convert-sup-to-srt-online)
【2023年 第1回 生成AIパスポート試験】合格体験記 その1 | 導入の話 ゆったりと始めよう 【動画 2分22秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【2023年 第1回 生成AIパスポート試験】合格体験記 その1 _ 導入の話 ゆったりと始めよう 【動画 2分22秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/5647343d-bff5-6291-38f9-0bd885fad1aa.png)




* # 動画URL
    * https://youtu.be/tHcoNJDTDU4

<br>

* # 動画タイトル
    * 【2023年 第1回 生成AIパスポート試験】合格体験記 その1 | 導入の話 ゆったりと始めよう 【動画 2分22秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-12-23(土)

YouTube Summary with ChatGPT & Claude( Chrome拡張機能 )で、目次と概要を自動生成しました。
https://chromewebstore.google.com/detail/youtube-summary-with-chat/nmmicjeknamkfloonkhhcjmomieiodli


動画の目次( タイムスタンプ ):

00:00 - オープニング

00:18 - 受験に至った経緯と受験日

00:30 - 合格通知と合格書の到着

00:52 - 今回の動画の目的と合格体験の概要

01:10 - 約15種類のテーマ( 議題 )の紹介

01:58 - エンディング: 今後の動画予告


動画の概要:

この動画では、2023年に開催された第1回生成AIパスポート試験の合格体験を共有しています。
わたし、山中一司が予期せぬことからこの試験に挑戦し、無事合格するまでの経緯や、試験に関する重要な情報について喋っています。
さらに、合格に至るまでの学習方法、試験対策、そして試験当日の体験について詳細に語ります。

主なテーマ( 議題 )は以下の通りです( 約15種類 ):
- 第2回目以降の受験予定者へのアドバイス
- 受験の動機
- 試験の概要と内容
- 学習方法と資料
- 試験対策のコツ
- 試験当日までにやっておいたほうがよい「試験デモ環境での動作確認」
- 学習期間中の時間管理のコツ
- やる気の維持方法
- 試験当日の体験
- 試験の難易度
- 失敗と成功の体験
- キャリアへの影響
- AI技術の、実務への応用
- AI技術の未来
- 生成AIの業界動向

これらのテーマ( 議題 )の中から、毎回どれかを選んで、少しずつ動画にしていきます。

生成AIパスポートは、2023年に新しく始まった資格試験です。
過去問が存在しない環境での学習体験です。
ですので、わたしの合格体験が役に立つのは、第2回目、第3回目の試験までかなと考えています。

その短い間であっても、誰かの、何かの役に立てたらとても嬉しいです。


---


✓ 🎥My videos are strongly related to this video. | この動画と関連が強いわたしの動画 ↙
　・“生成AIパスポート試験 合格体験記”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMbDo3Blwj-vJGWbIlMLgK3


　・“生成AIパスポート 試験学習(動画公開日で降順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMuGz8uBLRl1XyLqeRCIY11


　・“生成AIパスポート 試験学習(動画公開日で昇順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOQB8T6uppVO_juFi-4xL3E


　・“効果的にマインドマップを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMTIuF-n2Uyaw6cqEMFt0aL


　・“マインドマイスター( クラウド型マインドマップ )を活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMCeUohu19ZbUilmcZnEJ1q


　・“マインドマイスター( クラウド型マインドマップ )でのプレゼンテーションの例”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMXJCYhmWK4bjAUG1uy78li


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/48t2IEV
VSCode で Python 開発環境

# Python をインストール
[Python公式サイト](https://www.python.org/)から、Pythonパッケージをダウンロードします。
Googole Cloud と AWS で使用するため、2つのバージョンをインストールします。
バージョン3.12.1 と バージョン3.11.7
をインストールします。

ソースコードを置くディレクトリを作成して、移動します。
```
mkdir gc-sorce
cd gc-sorce
```

Pythonのバージョンを指定して、仮想環境を作成します。
仮想環境を作成することで、ライブラリのバージョンを環境毎に調整することが出来ます。
```
py -3.12 -m venv .venv
```

VSCode を起動して、「ファイル」→「フォルダーを開く」で、ソースコードを置くディレクトリを開きます。
「ファイル」→「新しいファイル」で、「Python ファイル」を選択します。
VSCodeの右下部分の赤く囲まれたPythonのバージョンをクリックして、使用するPythonを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392443/900f470b-eeb3-2ac2-9b7e-e0ad7ed138e8.png)

仮想環境を作成していますので、「Python 3.12.3 ('.venv':venv)」 を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392443/b76c4792-5fb9-c8b9-2561-5983eedd6c58.png)

ライブラリを追加するときは、「表示」→「ターミナル」で、ターミナルを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392443/a6472bcb-61fa-da59-66d4-c389353d7ded.png)

ターミナルを開いたときに、(.venv) で、始まるプロンプトになっていれば、仮想環境下で、ターミナルを開いていることになります。

Google Cloud Code のプラグインを入れて、VSCodeから、Cloud Run や Cloud Functions にディプロイしている場合、このままでは、venv ディレクトリまで、ディプロイの対象になってしまうので、ディプロイから除外するためのファイル .gcloudignore を作成します。記載例は、下記になります。
```.gcloudignore
.gcloudignore
# If you would like to upload your .git directory, .gitignore file or
# files from your .gitignore file, remove the corresponding line below:
.git
.gitignore
#!include:.gitignore
.vscode
__pycache__
venv
```
詳細は、[こちら](https://cloud.google.com/sdk/gcloud/reference/topic/gcloudignore#SYNTAX)を確認してください。

使用ライブライリスト requirements.txt ファイルの作成
```
pip freeze > requirements.txt
```

一括ライブラリのインストール
```
pip install -r requirements.txt
```
【生成AIパスポート】試験学習 復習の自動化動画 その9 | 次元削減とエンコーダの関係性を、1)恋愛 2)大学受験 3)DJ 4)漫才 にたとえてもらった話【動画 9分46秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![99 サムネイル 【生成AIパスポート】試験学習 復習の自動化動画 その9 _ 次元削減とエンコーダの関係性を、1)恋愛 2)大学受験 3)DJ 4)漫才 にたとえてもらった話【動画 9分46秒】.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/2cf6f6ed-49f2-42f0-130a-02c0cc0df142.png)




* # 動画URL
    * https://youtu.be/SneBiuyvclM

<br>

* # 動画タイトル
    * 【生成AIパスポート】試験学習 復習の自動化動画 その9 | 次元削減とエンコーダの関係性を、1)恋愛 2)大学受験 3)DJ 4)漫才 にたとえてもらった話【動画 9分46秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2023-10-23(月)

ひょんなことから生成AIパスポート試験を受けることになったので、手抜きしながら、学んだことの定着(記憶の定着)をねらっていきます。

・生成AIパスポートとは？
　https://bit.ly/WhatIs-GenerateAIPassport

やり方はこんな感じです。

・初回のインプット( 座学、教材学習、ChatGPT PlusやGoogle Bardへ質問する )

・アウトプット( 学んだことを声に出す → YouTube動画化 )

・2回目以降のインプット( 自分でつくった動画をながら聴きする )
　└朝起きてすぐ( YouTube + Chromecast )

　└ジョギング中( YouTube + スマホ )

などのやり方で繰り返しながら学習します。
技能を上げるには繰り返しが大切です。
初回のインプットではとにかく集中して、2回目以降のインプットでは繰り返し学習のためにとにかく手抜きします。

動画編集をしている時に、繰り返し学習ができる点も、楽ちんだなと感じています。


---


⏳開始時間
　00:00 イントロ
　00:25 本編開始

　00:58 「生成AIパスポート公式テキスト」( Kindle版 )から https://bit.ly/GenAIPass-Text
　　└ 次元削減とエンコーダの関係性とは？

　01:14 まずは、前提となるChatGPT Plusとわたしとの質疑応答を紹介します。
　　└ エンコーダとデコーダって、生成AIのどの文脈で出る言葉だったでしょうか？
　　└ 「エンコーダは、入力データ( 例えば、テキストや画像 )をより短くて密な形( 通常はベクトル )に変換します」という説明は、エンコーダの働きは、次元削減と同じという意味ですか？


前提となる質疑応答をふまえて......


　04:29 次元削減とエンコーダの関係性を、恋愛にたとえてもらった話
　　└ 次元削減は「多くの気になる相手から1人だけを選ぶ」、一方、エンコーダは「たった1人のパートナーと過ごした多くの瞬間や経験を、愛という1つの感情に凝縮する」ような感じです。

　05:44 次元削減とエンコーダの関係性を、大学受験にたとえてもらった話
　　└ 次元削減は「多くの科目やトピックから最も重要なものに絞る」、一方、エンコーダは「多くの情報を試験に役立つ形にまとめる」ような感じです。

　06:56 次元削減とエンコーダの関係性を、音楽のDJ( ナイトクラブDJ )にたとえてもらった話
　　└ 次元削減は「沢山のプレイリストの中から、最も盛り上がる曲や重要な曲だけを選ぶ」、「DJが複数の曲をミックスして、1つの新しい”気持ちよい瞬間 = 音の響き”を作っているまさにその瞬間」のような感じです。

　08:14 次元削減とエンコーダの関係性を、漫才にたとえてもらった話
　　└ 次元削減は「多くのネタから最も効果的なものに絞る」、一方、エンコーダは「選ばれたネタをさらに効果的な形にまとめる、磨き上げる」ような感じです。


---


✓ 🎥My videos are strongly related to this video. | この動画と関連が強い私の動画 ↙
　・“生成AIパスポート 試験学習(動画公開日で降順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMuGz8uBLRl1XyLqeRCIY11


　・“生成AIパスポート 試験学習(動画公開日で昇順)”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOQB8T6uppVO_juFi-4xL3E


　・“山中一司がお金を払って買った情報”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghOW4Cnbj6lnltyToJae_Rb5


　・“自己投資”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghP1Gxpymfr6fVF9pRYuGt1P


　・“効果的にマインドマップを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMTIuF-n2Uyaw6cqEMFt0aL


　・“マインドマイスター( クラウド型マインドマップ )を活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMCeUohu19ZbUilmcZnEJ1q


　・“マインドマイスター( クラウド型マインドマップ )でのプレゼンテーションの例”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMXJCYhmWK4bjAUG1uy78li


　・“効果的にChatGPTを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPfo1c-qmO2ERD7ldSgmblR


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/3QpMo1o
セイコーソリューションズ株式会社 戦略ネットワーク本部：テックブログ始めました！

はじめまして。セイコーソリューションズ株式会社の@msasa728です。
この度、セイコーソリューションズ株式会社 戦略ネットワーク本部のテックブログを始めることになりました。

戦略ネットワーク本部では、NTPやPTPの時刻同期プロトコルに対応したタイムサーバーやNTPクロック、ネットワーク運用管理向けのコンソールサーバーやアクセス管理ソフトウェアなどを開発しています。

- タイムサーバーの製品ページ
https://www.seiko-sol.co.jp/products/time_server/

- NTPクロックの製品ページ
https://www.seiko-sol.co.jp/products/ntp_clock/  

- コンソールサーバーの製品ページ
https://www.seiko-sol.co.jp/products/console-server/  

- アクセス管理ソフトウェアSmartJumperの製品ページ
https://www.seiko-sol.co.jp/products/smartjumper/  

このほか新たな取り組みとして、我々の強みである時刻同期や運用管理のノウハウや技術を生かした新たなサービスや製品を開発しています。
  
今後、戦略ネットワーク本部で取り扱っている時刻同期や運用管理に関する技術ネタ、新たな取り組みの紹介、社外カンファレンスへの参加・発表報告など、様々な情報を発信していきたいと思いますので、よろしくお願いいたします。
.npmrcファイルを作成する方法を調べた件

## nanoを使用して作成する方法
ターミナルから作成する際は下記のコマンドを入力します。
こんなシンプルなのに **nano** の用法を知らなかった…。
```
nano ~/.npmrc
```
* その他の操作方法
・開き方：nano ファイル名
・保存して終了：Ctrl + o
・確認：Enter
・終了：Ctrl + x

## プロジェクト内で作成する方法
格納したいフォルダに合わせて右クリックして、 **新しいファイル...** からでも作成できます。
ファイル名に **.npmrc** と入力します。
![新しいファイル....jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3144030/7fe5d425-aff5-97ba-a967-89f5826fa719.jpeg)

頭に下記のアイコンが付きファイルの作成が完了します。

![スクリーンショット 2024-01-10 17.09.24.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3144030/4bf3cf49-64a6-6268-3a08-3f254c790eaa.jpeg)

## 終わりに
滅多に使用しない気がするので、いざ使おうとなった時に忘れてそうだなと思いました。
120以上の金融機関が活用するAIプラットフォーム

金融サービスの業界で活躍する企業はどこもそれぞれにユニークです。しかし、その多くは基本的な課題を共有しています。操業する地が南米であろうと、ヨーロッパやインド亜大陸であろうと、ESGの導入からリスク管理まで、同様の基本的な要件に取り組む必要があります。

自画自賛は好きではありませんが、私たちは過去10年間、金融機関がデータの力を活用して業界で共通の課題や頭痛の種に取り組めるよう、懸命に支援してきました。クレジットカード不正をより的確に検知するための不正検出チーム、マネーロンダリングを未然に防ぐためのアンチマネーロンダリングチーム、モデル開発プロセスのガバナンス基盤を導入するためのデータチームなど、私たちは世界の主要15カ国にまたがる120以上の金融サービス企業から信頼をいただいています。

![FSI Infographic JP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1196881/dc52ae4a-711a-7654-ea7c-a8ba2d92bfd1.png)

<br>

資産運用、FinTech、リテールバンキングのいずれにおいても、データ活用のためにできることはまだまだあります。Dataikuの力を活用し、AIや高度な分析プロジェクトを進めている金融機関の長いリストに加わるには、今しかありません！

## FSIのすべてのユースケースを一挙公開
金融サービスに関する頭痛の種をお持ちなら、Dataikuがその痛みを和らげるお手伝いをできるかもしれません。[こちらのリンク（英語）](https://pages.dataiku.com/fsi-use-case-collection)をクリックして、金融サービスにおけるAIと高度なアナリティクスのユースケース集をご覧ください。

<br>
<br>

*原文： [Join Over 120 Financial Institutions Working With Us](https://blog.dataiku.com/120-financial-institutions-work-with-dataiku)*
Firebaseで秘密鍵不要で、token (JWT)を検証する

FireabaseのJWTを検証するのに、秘密鍵なんて要らないはずなのに、普通にライブラリを使うとなぜか使わざるをえないので、回避する方法を探してみた。

_token_genは非公開のAPIで、動作保証されないので注意。

```python
from firebase_admin import _token_gen
from types import SimpleNamespace

def verifyFirebaseToken(token, project_id):
  mockApp = SimpleNamespace(project_id=project_id, options = {})
  verifier = _token_gen.TokenVerifier(mockApp)
  return verifier.verify_id_token(token)

token = "{token}"
verifyFirebaseToken(token, project_id)
```
React Memo

### Attributes
In JavaScript, when the property name is the same as the value, we don’t have to write both the key and the value:
Instead of:
 ```<div style={ { color : color} }>Clicks count: { count }</div>```
 you can do:
 ```<div style={ { color } }>Clicks count: { count }</div>```

### Undefined Array
 To create the certain length of undefined array in JavaScript.
 ```const tempArray = [...Array(number)]```

### Put 'current' for UseRef
don't:
``` elementRef.style.color = 'salmon'```
do:
``` elementRef.current.color = 'salmon'```

### Call useEffect Only the beggining
put empty array at the end
```useEffect( () => { }, [])```
Kubernetes 1.29: SIG Storageの変更内容

# はじめに

本ドキュメントでは、Kubernetes 1.29.0の[CHANGELOG](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.29.md#changelog-since-v1280)をベースにSIG Storageに関する機能について紹介します。
:memo: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

# アップグレード前に絶対に確認が必要な変更点 (Urgent Upgrade Notes)

SIG Storageに関連するものはなし

## Changes by Kind
### 非推奨 (Deprecation)

SIG Storageに関連するものはなし

### APIの変更 (API Change)

- Podにcertificates.k8s.io/v1alpha1のClusterTrustBundleオブジェクトを投影するためのサポートが追加されました。（＃113374, @ahmedtd）
- Go API: VolumeResourceRequirements構造体がResourceRequirements構造体に置き換えられ、ボリュームの使用時に使用されます。（＃118653, @pohly）
- CSINodeExpandSecret機能がこのリリースでGAに昇格し、デフォルトで有効になりました。CSIドライバは、このリリースからCSI Client がオプションで送信するNodeExpansionリクエスト内のsecretRef値を利用することができます。（＃121303, @humblec）

:memo: 本機能の動作検証レポートは「[Kubernetes: CSI Storage Resizing Authenticated(NodeExpandSecret)の動作検証](https://qiita.com/ysakashita/items/90d23e11dc19624e034a)」にて公開していますので、興味のある方はご参照ください。

- CSIノードドライバが実行中でない場合には、NodeStageVolumeの呼び出しがリトライされるようになります。（＃120330, @rohitssingh）
- PersistentVolumeLastPhaseTransitionTimeがベータ版になり、デフォルトで有効になっています。（＃120627, @RomanBednar）

### 機能 (Feature)

- ReadWriteOncePodはGAに昇格しました。(#121077, @chrishenzie) 
- kubectl describe pvc (PVC) コマンドの出力の "Used by:" の部分に、ephemeral storage volumeとして(PVC)を使用しているPodをリスト化しました。(#120427, @MaGaroo) 
- nodevolumelimitsのscheduler pluginをcontextual loggingを使用するように移行しました。(#116884, @mengjiao-liu)
- volumebindingのscheduler pluginをcontextual loggingを使用するように移行しました。(#116803, @mengjiao-liu)

### ドキュメンテーション (Documentation)

SIG Storageに関連するものはなし

### 失敗するテスト (Failing Test)

SIG Storageに関連するものはなし

### バグまたはリグレッション (Bug or Regression)

- detach エラーの後のボリュームのAttachを修正しました。detachに失敗したボリュームはAttach済みとは扱われず、KubernetesはPodによって使用される前に完全にAttachされることを保証します。（＃120595、@jsafrane）
- SMBファイル共有が削除された後にアンマウントされた際、SMBマウントが古いままとなる問題を修正しました。（＃121851、@andyzhangx）
- ターゲットパスディレクトリがノード上に既に存在する場合、kubeletでボリュームのAttachまたはPublish操作が失敗することがなくなりました。（＃119735、@akankshapanse）


### その他 (Cleanup or Flake)

- E2E storage tests: DriverInfo.FeatureTagフィールドを介してテストタグ[Slow]などを設定するサポートは廃止されました。(#121391, @pohly)
- CSIMigrationvSphereに関するGA feature gateが削除されました。(#121291, @bzsuni) 
- v1.28でGAに移行し、無条件で有効化されていたRetroactiveDefaultStorageClassのfeature gateはv1.29で削除されました。(#120861, @RomanBednar)

# 所感

Kubernetes v1.29.0のSIG Storageに関しては大きなエンハンスはありませんでした。
GAになった機能としては、ReadWriteOncePodとNodeExpandSecret機能です。
後者のNodeExpandSecret機能は、その恩恵を受ける環境が限られていますが、前者のReadWriteOncePodは特にブロックストレージ(iSCSI,NVMe,NVMe-oFなど)のPVを利用する多くのユーザに有効なものになります。ReadWriteOncePodを利用することで、1つのPodから1つのPV(Volume)をマウントする際、不必要に他PodからPV(Volume)をマウントされることを防ぐことができ、より安全にPV(Volume)を運用できるようになります。
ReadWriteOncePodの動作検証レポートは「[Kubernetes: ReadWriteOnceとReadWriteOncePodの動作検証](https://qiita.com/ysakashita/items/ad1f13e2af99969c8e9e)」にまとめていますので、興味のある方はご参照ください。
Stripe CLI x Laravel Cashierを使い、ローカルでWebhook経由でイベントを受信する方法

この記事では
- Laravel 10系
- Laravel Cashier15系
- Stripe API バージョン2023-10-16
の前提で、ローカルで決済テストの実施方法をまとめています。

参考記事に記載のない細かい部分を自分用メモとして公開していますので、
同じ技術スタックの方は参考にしてみてください。

Laravel Cashier公式ドキュメント
https://readouble.com/laravel/10.x/ja/billing.html#handling-stripe-webhooks

ほとんどここに書いてある内容と同じです。
https://qiita.com/hideokamoto/items/effccc6b1073b677bd80

.env
```
# Stripe
STRIPE_KEY=your-stripe-key
STRIPE_SECRET=your-stripe-secret
STRIPE_WEBHOOK_SECRET=your-stripe-webhook-secret
```

３つのキーが正しくセットされていることを確認。
`STRIPE_KEY`と`STRIPE_SECRET`はStripeダッシュボード > 開発者　> APIキーから取得。
`STRIPE_WEBHOOK_SECRET` は後述。

ターミナルで
```
stripe login
```
してから、
```
stripe listen --forward-to 127.0.0.1:8000/stripe/webhook
```
を実行すると、
```
> Ready! You are using Stripe API Version [2023-10-16]. Your webhook signing secret is whsec_000000000000000 (^C to quit)
```
`whsec_000000000000000` の部分がwebhook_secretとなるので、`.env`のSTRIPE_WEBHOOK_SECRETにセット。

route.php
```php
Route::controller(WebhookController::class)->group(function () {
        Route::post('/stripe/webhook', 'handleWebhook');
    })
```

あとから各webhookごとにカスタマイズができるように、Laravel Cashier側の`WebhookController`を継承したクラスを作っています。
（`handleInvoicePaid` を実装して決済が完了したときに、ユーザー情報を更新するような仕様がある場合など）
WebhookController.php
```php
<?php
namespace App\Http\Controllers;
use Laravel\Cashier\Http\Controllers\WebhookController as CashierController;

class WebhookController extends CashierController
{    
}

```

あとは、Stripeダッシュボードで操作をしたり、APIを使うとイベントがローカルで受信できます。
これにより、`users`や`subscriptions`, `subscription_items` などのテーブルに正しい情報が作られます。
遠隔操作グローブを調査中

遠隔操作用のグローブの利用目的は複数ある。

目的１：　**実際に手元にあるものを人の手で操作して**、その結果をキャプチャする。それを、ロボットへの遠隔操作に用いる。あるいは、ロボットの動作の学習に用いる。

目的２：　実在のロボットの触覚を元に、実在のロボットを操作する。そのため、実在のロボットでの触覚を人のグローブに返すことが必要になる。
目的３：　**VR空間上にあるものを人の手で操作する。** そのため、VR空間上にあるものを操作したはずの感触を、人のグローブ側に返す。そのバーチャルな触覚を元に操作する。ヘッドマウントディスプレイでVR空間を人に見せることが必須である。


## HaptX Gloves DK2
触れて感じるリアルな触感を実現する触覚グローブで、遠隔操作などの用途に適しています。

http://www.nihonbinary.co.jp/Products/VR/PositionTracking/HaptX%20Gloves%20DK2.html

https://www.youtube.com/@HaptX

![](http://www.nihonbinary.co.jp/Products/VR/PositionTracking/image/HaptX_010.jpg)


## Tactile Telerobot
ロボット機器を制御し、遠隔地から物体を操作する際に、オペレーターに産業グレードの触覚フィードバックと自然なインタラクションをもたらす触覚グローブです。

http://www.nihonbinary.co.jp/Products/Robot/TactileTelerobot.html

力触覚グローブ
5指ハンドを備えたロボットアームと組み合わせた遠隔操作システムで、インターネットを介して遠隔地でも対象物の硬さ、軟らかさを把握できます。


# モーションキャプチャグローブ
[COBRA GLOVES](https://mocap.jp/igs/)

![](https://mocap.jp/wp-content/uploads/2022/06/cg_r.png)

実在の手のモーションをキャプチャするグローブであって、VRや遠隔のものでの触覚を手元に反映する機能はない。

[Manusグローブ](https://mocap.jp/manus/)
![](https://mocap.jp/wp-content/uploads/2022/09/Quantum-Metagloves-Pinch_2.jpg)


### ロボットの手の指の本数が少ない場合には
- ２本指のハンドを、開く・閉じるなどの操作を単純なゲームコントローラーベースで操作するという選択肢がある。

## 手の動きをどう生成するのか
https://www.researchgate.net/publication/323984867_Hand_gesture_recognition_using_spars[…]deep_neural_network_based_on_electromyography_measurements

## 要追記
- ロボットの開発において、そのようにグローブが使われているのか、代表的な使用例を明らかにする。
Rustの世界に飛び込んでみた。

こんにちは、システム開発部門の山本です。
Rustって面白いですね！

## 概要
新しい技術の習得を積極的に後押ししてくれる、そんな弊社。
Rust未経験の私がRustで構築された業務システムのバックエンド開発を担当した話。

### Rust
Webブラウザソフトウェア「Firefox」を開発しているMozillaが支援するオープンソースのプログラミング言語。
ネイティブコンパイラ言語であり、メモリ安全性と高パフォーマンスが売り。
今後、Webシステム開発の主流になる可能性もある。

### 担当する業務システム
とある企業の業務システムのリプレイス。
パッケージツールから自社開発Webシステムへの切り替えを目指すなか、
弊社が全面的に開発サポートをさせて頂いております。

## Rustの仕様に戸惑う１ヶ月目
まずバックエンド開発担当となって最初の作業がバグの改修でした。
そこで必要となるのがRustのコード解析。
これが難しい。。。
CやJavaなどの他の言語の感覚でコードを解析しようとするとRustの独特な構文に戸惑います。
ライフタイム、引数省略、マクロ・・・
分からん・・・

そこでまずはRustの仕様理解に努めました。
その際に参考になったのがこちら。
・https://doc.rust-jp.rs/book-ja/
・https://tourofrust.com/
公式ドキュメントとオンライン実行環境を提供しているRustのチュートリアルです。

これらのサイトのおかげでライフタイムなどのRust構文の理解を深められ、
コードの解析が捗るようになりました。

## Rustを理解する２ヶ月目
Rustに慣れ始めます。
個人的にRustのいいところとしてはつよつよなコンパイラー。
コーディングミスがあれば修正案を提案してくれますし、徹底的にエラー要素を排除してくれます。
コンパイラー性能がメモリ安全性を担保しているようです。

ビルドシステム兼パッケージマネージャのCargoも頼もしい存在です。

ただ１つ難点を挙げるとすれば、unwrap関数。
便利なので使ってしまいがちですが、バグに繋がる可能性もあります。
システムが落ちることも・・・

## そして、今（７ヶ月目）
Rustの楽しさに目覚める。
担当した業務システムは運用を開始し、仕様変更や機能追加に対応する日々を過ごしています。



Rustの開発案件、業務システム開発案件等ございましたら、
ぜひ、弊社にお声かけください。

弊社ではエンジニアを募集しています。ご興味ございましたら以下からどうぞ。

https://www.wantedly.com/companies/company_1847744/projects
[Rust->wasm]jsonをwasmで読み込めないので、jsonをコンパイル対象に予め含ませる

rustでwasm出力しようとした際に、ブラウザ上でJsonが読み込めず、wasmが表示されないエラーにあたりました。
エラーはブラウザ上で出力されていましたが、原因となるのは以下のコードでした。

```rust
        let input_fn = fs::read_to_string("patterns.json").expect("JSON Read Failed.");
        let deserialized: Vec<Hoge> = serde_json::from_str(&input_fn).unwrap();
```

上記コードのfsだと、ブラウザを走らせた際にwasm側でjsonの読み込みをしようとするのですが、
それに対応する処理が現時点(2024/1/10)ではない模様。
そこでファイルコンパイル対象としてjsonファイルを含ませるように以下の処理に変更すればいいようです。

```rust
        let input_fn =include_str!("./patterns.json");
        let deserialized: Vec<Hoge> = serde_json::from_str(&input_fn).unwrap();
```
include_str!を使うようにした結果、wasmが表示されるようになりました。

include_str!マクロの詳細は以下。

https://doc.rust-lang.org/stable/std/macro.include_str.html
>The provided path is interpreted in a platform-specific way at compile time.

参考: https://stackoverflow.com/questions/77767456/read-json-file-in-rust-and-compile-to-wasm
私のVRCワールド巡りツィートのまとめ記事(1/4~1/10

1/4
https://twitter.com/vrc_machida2/status/1742747931361599589

1/5
https://twitter.com/vrc_machida2/status/1743105286892933309

1/6
https://twitter.com/vrc_machida2/status/1743468429246648647

1/7
https://twitter.com/vrc_machida2/status/1743827797045596242

1/8
https://twitter.com/vrc_machida2/status/1744193205044666612

1/9
https://twitter.com/vrc_machida2/status/1744567168858280268

1/10
https://twitter.com/vrc_machida2/status/1744922761884266764
[ThoughtSpot]パラメータの使い方（基本）

## はじめに
ThoughtSpot利用歴約2年。
新しい機能についていくのにやっとの非エンジニアです。

パラメータ機能が追加されてからしばらく放置していたのですが、利用できそうだったので使ってみた記録です。
まずは基本の数値型での使い方になります。

追記：文字型パラメータの使い方は[こちら](https://qiita.com/shiisaa/items/86b477f44cb2572e3cc5 "[ThoughtSpot]パラメータの使い方（応用）")から。


## パラメータを使ってやりたいこと
例えば計上金額の未来予測をします。
今のままだったら計上金額このくらい（計上金額／グラフ上グレーの点線）、でも何かしら施策を打って売上が月2%伸びたらこのらい（計上予測金額／グラフ上青の点線）というのをグラフに出します。
この「2%」というのを、ビジネスユーザー（閲覧者）が好きに値を変更して金額の増減を予測計算できる、というものです。
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/1d7c576f-fea6-1272-f7f6-4b6ee30641ee.png)


## 手順１：ワークシートにパラメータを準備する
まずワークシートにパラメータを準備します。設定箇所は画像参照。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/199d6400-6ae3-7495-e6e9-dac7df2c8c78.png)
今回使いたいパラメータは「〇％」といういわゆる成長率なので、ダブル型で設定します。名称は例で「成長率」に、初期値は適当に「1」にしておきます。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/468e112f-9f39-d261-eeaf-e5b462032445.png)

## 手順２：データ検索でパラメータを入れた数式を作る
ワークシートが準備できたら、このワークシートを使ってグラフを作成します。
数式から、パラメータを入れた予測金額用の数値項目を作成します。
名称は「計上予測金額」に、式は数値項目*パラメータ（今回でいうと計上金額*成長率）で作成します。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/a755a3d3-360a-ff09-2f8f-186ea48f7131.png)

あとは検索バーから、グラフ表示に必要な日付軸項目、もともとの計上金額、数式で作成した計上予測金額を検索して配置すれば完成です。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658354/d4dcb1e5-750b-e4ca-defe-7a589444f8eb.png)


パラメータを使った数式を使うと、自動でフィルターの横にパラメータの項目が配置されます（上記画像の緑で囲った部分）。
今回の初期値は「1」にしているので、例えば2%UPで予測したい場合はここの数値を画像のように「1.02」にすれば金額予測ができるようになります。

上述したように、この数値パラメーターはフィルターと同じで、ビジネスユーザー（閲覧者）が好きに値を変更できるので、こうした試算系に利用すると便利です。

## おわりに
みなさんはThoughtSpotの新機能についていけてる？
私は英語→日本語翻訳を理解するのでいっぱいいっぱいだよ。
AWS SAP-C02 にSpecialtyを受けてから挑戦するメリット

# AWS SAPに受かりました。

2023/12/26 SAP-C02に合格しました。
一方で、夏ごろ受けた際は落ちていて、**Specialtyをいくつか受けてからSAPを取る**と戦略を変えての成果です。
結論として、この戦略は効果的でした。
SAPに挑戦する方の参考になれば幸いです。
本Qiitaでは、どのようにSAP取得にSpecialty取得が役立ったかを説明します。

一言で言うと、**直前の対策範囲を特定の分野にフォーカスできる**、ということにあります。
また、**関連して、エラーバジェットという考え方や、他のメリットについても紹介していきます。**

# 夏はどのようにして挑んでいたか。
SAPの対策本の問題を全て解き、暗記する。
公式の過去問を解いて挑む。
→落ちました

敗因は以下でした。
**対策が浅い**。

広く深い対策が必要ゆえに、
時間がない直前、広さも深さも中途半端になり敗北しました。

# DBSに受かる
DBSの対策本を全て解き、暗記する。
公式の過去問を解いて挑む。
→受かりました。

これは狭く、深くなので、深さが合格の深さに届きました。
また、ここで、***受かる水準のやりこみ度合の解像度があがりました。***

# DOPに受かる
ExamtopicsのDOPの問題を全て解く
→受かりました。

examtopicsの良さにも気づきました。以下の記事にまとめています。

https://qiita.com/kawahara_k/items/e8f9d7db3518baae2846

しかしこの時点で、12/23でした。
年内にSAPを受かるのを目標にしていたので、
ここからさらに突き進む必要がありました。

# いざSAP
DOPに受かったら、クリスマスにSAPを受ける宣言をしていたのですが、

↓某クリスマスイヴにSAPを受けた方の手記
>街はクリスマス一色です。
試験会場には、ムズカシイ顔をしながらマウスをカチカチする妙齢の男性が数名。
闘う人は皆かっこいいのだと思いました。

https://qiita.com/ogw_t/items/d8ff3ec64deaef1627b6


をしていたのですが、
M1グランプリを見る必要があり辞め、26日に試験を予約しました。

ここで、夏のときの勉強での敗因、**深さが足りていない**の攻略に挑みました。
DBS、DOPに受かっているので、DBやデプロイ戦略、また、共通範囲のロギングやセキュリティは**すでに深められている**。

よって、ネットワーク関連、また、SAAであるようなS3、コンテナ、ラムダ、EC2、EFSなどの主要サービスの深堀り、にフォーカスしました。
短期的にここだけやりこむ作戦です。

ここでお気づきの方もいるかと思いますが、**対策を省いている分野があります**よね。これはあとでダメージになりました。後述します。

これによってdirect connect,clientvpn,site-to-site vpn,transit gateway,route53,resolver,transitgatewayの苦手部分の短期攻略にフォーカスできました。また、S3などの、落とせない問題の深堀も十分にできました。

クリスマスの一日をこの対策に捧げました。



# 結果は？
合格しました。
789点でした。

当日はIoTの問題(全く対策していなかった)、Single sign on、Active directory(深堀りまでできていなかった)、などの問題では**まじでわからんぞ、、状態**になりました。IoT関連3問くらい出て、致死量になりかけました。

一方で、SREの考え方でエラーバジェット
>SLOの余剰分を「万が一の時の保険金」ではなく、「有効活用するための予算」として捉えるのがエラーバジェットです。

https://qiita.com/shin7446/items/58c173d30a08955f0a0d

というものがあり、これに則り、
**10%の問題は落とせるというバジェット**があると見方を変えると、このADやIoTはそこのバジェットとして活用できてよかったと思います。

思えばこの試験のエラーバジェット、が夏のときは破産寸前なほどありましたね。

また、20分の実行時間の問題が出て、「ラムダってあれ？15分だっけ30分だっけ?」となりましたが、15分であると判断でき、耐えました。
これは**直前にDOPを受けていたので、試験の瞬発力**がでました。そういう試験慣れという意味でもSpecialty受験を挟むメリットはありました。




# 最後に
以上、**直前に徹底的に深堀する分野を絞れる**というのが、タイトルにある、**AWS SAP-C02 にSpecialtyを受けてから挑戦するメリット**です。

これからSAPに挑戦される方の参考になれば幸いです。

DBSとDOPは当日の20時ごろに合格通知が来たので、てっきりその時間にくると思っていました。
26日夜、**所属部署の忘年会があったので、
会場で歓喜し、ドヤリ散らかす予定**だったのですが、バッジも予約ページの結果も更新されず、
**飲み会なのにただ携帯をチラチラ見るだけの変なやつ**に成り果てました。

結果翌日早朝4時にbadgeが来て、早朝ハッピーにベッドから飛び出ました。

外に出ると、冬至の早朝。
7時に沈む満月が低い角度で未だ暗い朝を照らしていました。


以上、最後まで読んでいただきありがとうございました。
指定したファイルに指定した文字列を追記するJavaScript

# 指定したファイルに指定した文字列を追記するJavaScript

たくさんのHTMLファイルに、規定の文字列を差し込みたい要望があったので作成。

たとえば、ある注釈テキストのHTMLコードを、たくさんのHTMLファイルに差し込みたい、など。

数ページの対象のファイル数でのみテストしたので、大量だと動作保証できないです。

## 検証環境

* MacOS 13.5.1
* node v14.20.0

## JS

```index.js
const fs = require('fs');
const readline = require('readline');

//
// ファイルの存在チェック
// 1: ファイルパス
const isExist = (filePath) =>  {
  let ret = false;
  try {
    fs.statSync(filePath);
    ret = true;
  } catch(err) {
    ret = false;
    throw new Error("ファイルが見つかりません " + filePath);
  }
  return ret;
}

//
// ファイル読み込み処理
// 1: ファイルパス
// 2: エンコードの種類（デフォルト UTF-8)
const read = (filePath,encodestr) => {
  let content = new String();
  if(!encodestr){
    encodestr = "utf-8";
  }
  
  if(isExist(filePath)) {;
    content = fs.readFileSync(filePath, encodestr);
  }
  return content;

}

// パラメータ
// 1: パーツ部品のファイル
// 2: パーツを入れるファイルのパスがリスト化されたファイルリスト
// 3: パーツをいれたい場所に入れたキーワード（置き換え用の文字列、正規表現を使用しているので()[]{}などの記号前にはエスケープ文字をいれる）
// 例 node index.js part.txt filelist.txt "changestrings20230105"
try{
  // パラメータ取得
  const args = process.argv.slice(2);
  // パラメータ分割
  const partspath = args[0]
  const filelist = args[1]
  const targetPoint = args[2]

  console.log('parts ' + partspath)
  console.log('replace ' + filelist)
  console.log('targetPoint ' + targetPoint)

  if(!targetPoint){
    throw new Error("置き換える対象の文字列を入力してください");
  }

  // パーツ部品の読み込み
  const parts = read(partspath, 'utf-8');
  // ファイルリストは１行ずつ読み込むストリーム作成
  const stream = fs.createReadStream(filelist);  
  stream.on("error", (err) => console.log("エラーが発生しました " + err));
  // ファイルリストの読み込み
  const reader = readline.createInterface({ input: stream });
  reader.on('line', targetFilePath => {
    let data = read(targetFilePath, 'utf-8');
    const replaced = data.replace(new RegExp(targetPoint,'g'), parts);
    fs.writeFileSync(targetFilePath, replaced);
  });
  
}catch(err){
  console.log("エラーが起きました " + err);
}

```

## 操作方法

### 1. ファイルリストをつくる

差し込む対象のファイルパスの一覧ファイルを用意する
（index.jsと同じディレクトリにおくと実行しやすい）

1行1ファイルパス

```filelist.txt
/hoge/hoge/index.html
/hoge/hoge/hoge/index.html
/hoge/hoge/hoge/sample.html
```
### 2. 差し込む対象の各ファイルに差し込み位置がわかる文字列をいれる

文字列はなんでもよい、既存のソースには存在ない文字列がよい

```/hoge/hoge/index.html
<div>元あるHTMLコード...</div>

[kokonisashikomi]

<div>元あるHTMLコード...</div>
```

### 3. パーツ用のファイルをつくる

差し込む文字列のみがはいったファイルをつくる
（index.jsと同じディレクトリにおくと実行しやすい）

```parts.html
<div>
<p>パーツ部分のテキスト</p>
</div>
```

 ### 4. コマンドラインでindex.jsのあるディレクトリへ移動

```
cd hoge/
```

### 5. 実行

**パラメータ**
* 1: パーツ部品のファイルパス
* 2: パーツを入れるファイルのパスがリスト化されたファイルリストのパス
* 3: パーツをいれたい場所に入れたキーワード（置き換え用の文字列、ダブルコーテーションで囲う、正規表現を使用しているので()[]{}などの記号前にはエスケープ文字をいれる）

```
node index.js parts.html filelist.txt "\[kokonisashikomi\]"
```

### 6. 結果

```/hoge/hoge/index.html
<div>元あるHTMLコード...</div>

<div>
<p>パーツ部分のテキスト</p>
</div>

<div>元あるHTMLコード...</div>
```
C＃でAtCoder Beginners Selection ABC049C 白昼夢

https://atcoder.jp/contests/abs/tasks/arc065_a

自分が書いたコード

```c#
using System;

class Program
{
    public static void Main(string[] args)
    {
		string S = Console.ReadLine();
		if (S.Replace("eraser", "").Replace("erase", "").Replace("dreamer", "").Replace("dream", "") == "")
		{
			Console.WriteLine("YES");
		} else 
		{
			Console.WriteLine("NO");
		}
	}
}
```

最初に書いたコードが以下で、
```c#
using System;

class Program
{
    public static void Main(string[] args)
    {
		string S = Console.ReadLine();
		if (S.Replace("dream", "").Replace("dreamer", "").Replace("erase", "").Replace("eraser", "") == "")
		{
			Console.WriteLine("YES");
		} else 
		{
			Console.WriteLine("NO");
		}
	}
} 
```

なんて単純な問題なんだと思ったが、ハマってしまった。
例えば `"dreameraser"` から`"dream"`を空文字に置換すると `"eraser"` がきれいに残ってうまくいく。

しかし、`"erasereraser"` だと、`"erase"` を空文字に置換して `"reraser"` が残ることになってしまいうまくいかない。

置換していく順番が大事で、
eraser -> erase -> dreamer -> dream
の順番にしてやればよい。