OmniAICreator/Qiita-1.07M huggingface dataset:
フォルダ上のファイル・フォルダの数値を0埋めする

フォルダ上でファイルに番号を付けた管理するようなことがあると思います。
で、「この時このぐらいの桁数で足りるやろ」とか思ってたらファイルが増えて桁数が足りない。。。なんてことがありますよね？

※こんな感じ
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990347/51f47e42-8c60-ceb5-6e26-c6daa910a6ac.png">

Windowsのエクスプローラーは優秀(?)なのでこの場合も順番に並んでくれますが、
CLIを使用すると1,10,2,3,4,..の順で並んでしまったりするので改めて数値の0梅をしたいなんてことがあると思います。

今回はのためのPowershellスクリプトを作成したので紹介したいと思います。

# 早速スクリプト本体

```Zerorename.ps1
# 引数設定箇所
# $Digits: 0埋め後の桁数指定(デフォルトは3桁)
# $TargetDir: 0埋め対象ファイルのあるディレクトリ.未指定の場合カレントディレクトリ
Param(
    [int]$Digits=3,
    $TargetDir=(Get-Location).Path
)

# ゼロ埋めの桁数を変数指定
# 0の数が数値変換のフォーマットになる
$Zeropadding = "0" * $Digits

# 対象ファイル一覧取得
# 一覧に対して処理を実行
foreach($f in Get-ChildItem -Name ${TargetDir}){
    # ファイルに含まれる整数値を取得
    $NumberList = [regex]::Matches($f,"\d+")
    
    # 探索した数値の位置それぞれに対して0埋め後の数値に置き換える処理
    # 元の数値が定義した桁数以上の場合は置き換えない。
    $filename=""
    $before=-1
    foreach($qp in $NumberList){
        if ($qp.Length -ge $Digits){
            continue
        }
        $filename=$filename + $f.Substring($before + 1,$qp.Index - $before -1) + ([int]($qp.value)).ToString($Zeropadding)
        $before=$qp.Index + $qp.Length - 1
    }
    $filename=$filename + $f.Substring($before + 1)
    
    # 0埋め後のファイル名が元のファイル名と一致した場合は後続のリネーム処理をスキップ
    if ($f -eq $filename){
        continue
    }
    
    # リネーム処理
    try{
        Rename-Item -Path ${TargetDir}\${f} -NewName ${TargetDir}\${filename}
        write-output "Rename file. From:${TargetDir}\${f} , To:${TargetDir}\${filename}"
    }catch {
        write-output "Failed File rename. Target file : ${TargetDir}\${f}"
        write-putput $_
     }
}
```

### スクリプトの使い方と仕様

```Command
PS> .\Zerorename.ps1 -Digit <0埋め後の桁数> -TargetDir <対象フォルダ>
```
<font color="Red">0埋め後の桁数</font> : 任意の整数を入力してください。未指定でも稼働し、その場合は3桁になります。※3桁の場合1⇒001とリネームされます。
<font color="Red">対象フォルダ</font> : 対象ファイルが存在するふぉるだを指定してください。未指定の場合はカレントディレクトリで動作します。

* 指定したフォルダ上のファイル/フォルダの数値を指定した桁数で0埋めしてリネームします。
　例: 1_test.txt ⇒ 001_test.txt
* ファイル/フォルダに数値が含まれていない場合はリネームされません。
* ファイルに複数の数値が含まれている場合はそれぞれの数値が0埋めされます。
　例: 1_02_12_test.txt ⇒ 001_002_012_test.txt
* 含まれている数値が指定した桁数より大きい場合はその個所はリネームされません。
　例: 1_0088_test.txt ⇒001_0088_test.txt


### 動作確認
こんな感じのファイルを用意して実行してみる。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990347/cbb2038f-9f35-7316-a8d2-4145f7a420f2.png">

実行
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990347/acc47765-380d-d6b4-154b-778e61ccc847.png">

うまく変更された。
※007_test.txtは変更されないのでログに出てきません。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3990347/17079634-eedf-9118-0865-f0f895e8bc73.png">
メモ：Windows 11 pro 24H2アプデでモバイルホットスポットがインターネット接続なしになった

いつかのためのメモ

Windows11proに24H2を適用したら、モバイルホットスポットで使用していたスマホがインターネット接続なしになってしまった。
・使用スマホ3台すべてが同様の状態（android2台、iPhoneSE2が1台。）
・他の人の24H2はつながる。

やったこと
ノートンのスマートファイアーウォールをオフにしたけど変化なし。
（以前ノートンのアプデで同様の状態になったことがあり、スマートファイアーウォールをオフにしたらつながったので、ネット接続の共有をオンにして、ホットスポットのIPスコープのトラフィックルールを設定して解決した）

有線とWi-Fi設定を見直すもおかしいところはない。
ホットスポットのアダプター設定でIPv6をオフにするが変化なし。
意を決してネットワーク設定のリセットをかけるも変化なし。

調べても情報に当たらない。
お手上げ。

Twitterの海に現実逃避しながら、Twitterでも検索してみた。
モバイルホットスポットをオンにして接続する手順を紹介しているツイートをみたとき、
名前とパス変えてみるかというのがなんか沸いてきた。
・・・なおった！スマホつながる！

素人考察すると、スマホ側で保存されてる設定がPC側と食い違ったみたいなヤツ？？？
あ、調べてた時にホットスポット機能が強化されたとかあったな？
てことは、スマホに保存されてる接続を破棄すればよかっただけか・・・
もう試せない！

まぁ直ったからよし！
ぺーぺーのSEには細かいことはわからん。

直ったからSNS捗る！！！いえい！！
OpenWrtでVLANを作成後、有線では繋がるがWi-Fi環境下でDHCPが動かない場合

# 症状
バージョン:`LuCI openwrt-23.05 branch (git-24.327.84347-ef27870) / OpenWrt 23.05.5 (r24106-10cc5fcd00)`
AP単体でDNS/DHCPを動かしている場合に発生します。
VLANを割り振った有線LANポートでつなぐとちゃんと繋がってますが、同じく割り振ったインターフェイスに接続しているWi-FiでDHCPが動作しません。

# 解決策

OpenWrtを再起動すると解決します。
おそらくインターフェイスに紐づくDHCPの設定が正しく反映されていないようで、再起動するとちゃんとDHCPが機能し始めます
面倒なネットワーク設計はAIで解決!!

こんにちは、ROBONIKKIの中の人です。最近、ネットワーク技術が急速に発展している一方で、ネットワーク設計がどんどん複雑化しています。オンプレミスの設計やクラウドの設計、またはその両方を取り入れたハイブリッドなど、ネットワークエンジニアは休んでいる暇もありません。そんなエンジニアの皆様にお届けするのが、AI技術を活用したネットワーク構築です。

![technology-7772914_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/bb869884-266e-196e-b5f2-14d4fca34466.jpeg)


# AIを活用したネットワーク構築の概要
AIはネットワーク設計において、**効率化と最適化**を実現するために重要な役割を果たしてくれます。まず、AIはトラフィック予測を行うことで、将来のネットワーク需要を正確に見積もり、**適切なリソース配分**をサポートします。また、AIは異常検知技術を用いることで、ネットワークの脆弱性や潜在的な問題を早期に発見してくれます。早期に発見した分、内部ネットワークに被害を広げる前に対策を講じることができます。さらに、AIは自動化された設計プロセスを提供し、**複雑なネットワークトポロジーの最適化**を迅速に行います。これらにより、エンジニアはより戦略的な業務に集中でき、全体の効率性が向上するというわけです。

# AIを活用したネットワーク構築のぽい
では概要で説明した内容をもう少し具体的に深堀りしてみようと思います。

## トラフィック予測と最適化
AIは過去のネットワークトラフィックデータを収集し、機械学習アルゴリズムを用いて分析します。これにより、トラフィックのパターンやトレンドを把握します。次に、収集したデータを基にトラフィック予測モデルを構築します。ディープラーニングや時系列解析モデルを使用して、将来のトラフィックを予測することができるのです。ここで構築した予測モデルを用いて、リアルタイムでトラフィックを予測します。これにより、ネットワークのリソースを効率的に配分するだけではなく、急激なトラフィックの増加や減少にも迅速に対応できます。

## 異常検知
AIはリアルタイムでネットワークデータを監視し、異常なパターンを検出します。異常なパターンを検出するプロセスは、**データ収集、前処理、モデルのトレーニング**の３ステップです。
１）まずはAIの基本でもあるデータ収集です。パケットキャプチャやログデータを含む、ネットワークデータをリアルタイムで収集します。
２）次は前処理です。収集したデータを確認し、不備があれば修正します。このステップを踏むことで、データ分析の精度が向上し、信頼性の高い結果を得ることができます。前処理をしたデータからパケットのサイズ、送信元と宛先のIPアドレス、プロトコルタイプなどの必要な特徴量を抽出します。
３）最後にモデルトレーニングです。機械学習アルゴリズムを使用して、正常なトラフィックパターンを学習します。教師あり学習、教師なし学習、半教師あり学習のいずれかを使用します。

これにより、潜在的な問題を早期に発見し、迅速に対応することが可能になります。

## 自動化された設計プロセス
AIは複雑なネットワークトポロジーの設計を自動化し、最適な構成を提案します。最適な提案をするために、**データ収集と分析、モデル**を実施します。収集したデータをもとに機械学習モデルをトレーニングすることで、トラフィックの予測やリソースの最適化を実施します。こうすることで、設計者の負担が軽減され、該当する環境における最適なトポロジーを提案できるのです。


![business-5475661_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/1130acc6-e36a-b72a-0cb6-25af9d3cea05.jpeg)

# 今日から使えるAIツール
最後に、ネットワーク構築が楽になるAIツールを紹介します。これらのツールをうまく使いこなして、より効率的で最適なネットワーク環境を構築してください。

## ChatGPT
まずは一番有名といっても過言ではないAIツール。ネットワークスクリプトや設定ファイルの生成に利用できます。これにより、ネットワーク構築の効率が大幅に向上します。またコンフィグレーションのフィードバックやトラブルシューティングのソリューション検索にも役立ちます。

## MyMap.AI
ネットワーク構成を私たちの言語で説明するだけで、AIが図を自動生成してくれます。ネットワークエンジニアにとって、負担が大きい図の作成。このツールを使うことにより、手動での描画作業の負担がなくなります。図の種類もほうふ、マインドマップやフローチャートも作れるため、様々な場面で活用できます。

## NetBrain
ネットワーク構成のさまざまなシナリオをシミュレーションしてくれます。これにより、ネットワークの設計と運用がより効率的になります。

## DeAnoS
NTTが開発したディープラーニングベースの異常検知技術です。ネットワークトラフィックの異常を高精度で検出してくれます。AIアルゴリズムもNTT研究所が開発した最先端技術を採用。

## IBM Watson
IBMのAIプラットフォーム。異常検知アルゴリズムを提供し、リアルタイムでの脅威検出をサポートしてくれます。もちろん、機能だけではなくオープンで直観的なユーザーインターフェースをもち、使いやすさも追及したツールです。
【Rails】ActiveSupport::Concern

# はじめに
ActiveSupport::Concernについて調べた内容をまとめます。

# Concern
- ModelやControllerのコードを分割（＝モジュール化）するときに使えるモジュール
- ModelやControllerとは分離させて実装でき、複数のModelやControllerで再利用することができる

# ActiveSupport::Concern
- Concenを実装するためのモジュール
- extendして使用する

## 定義方法
- app/controllers配下もしくはapp/models配下にconcernsディレクトリを作成し、ファイルを配置する
- Concern（モジュール）をつくる
- ActiveSupport::Concern を extend する
- 作成した Concern （モジュール）をinclude したいクラスへ include することでそのクラス内で使用することができるようになる

#### 実装例①（Controller）

```app/controllers/concerns/current_hoge.rb
require "active_support/concern"

module CurrentHoge
  extend ActiveSupport::Concern

  included do
    helper_method :current_hoge
  end

  private

  def current_hoge
    return false unless user_signed_in?
    current_user.try(:hoge)
  end
end
```
```app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  include CurrentHoge
end
```
#### 実装例②（Model）
```app/models/concerns/common_scope.rb
require "active_support/concern"

module CommonScope
  extend ActiveSupport::Concern

  included do
    scope :disabled, -> { where(disabled: true) }
  end
end
```
```app/models/common_space.rb
class Hoge < ApplicationRecord
  include CommonScope
end
```

## `included` メソッド
- ActiveSupport::Concernをextendすると使用できる
- includeした際に呼び出されるコールバックメソッド
- クラスでモジュールをincludeすると、モジュール内で定義されたincludedメソッドを自動的に呼び出す

# 参考
https://api.rubyonrails.org/classes/ActiveSupport/Concern.html

https://www.sejuku.net/blog/65753
ALBのOIDCフロールールセットでPOSTリクエストのデータが空になる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/9362fc28-852c-1965-b839-f63b00223139.png" alt="aws" width="80">


ALBのルールセットでOIDCフローを組んでいるWebアプリで起こったはなし。

UAのフォームPOSTデータが稀に空っぽでバックエンドに到達することがある。
クライアント環境/Webサーバー/アプリケーション/セッション層=自分の保守範囲で考えうる仮説と検証を繰り返してもどうしても穴がないため、フロント=>バックエンド間＝aws/idp層の調査を開始する。

## ALB

問題発生時間帯のALBのアクセスログをAthenaでトレースするとめちゃめちゃど真ん中**2**に気になるアクセスログ`/oauth2/idpresponse?code=...`があった。
`/oauth2/idpresponse`といえば、ALBがOIDCフローのIDプロバイダからユーザの認証結果を受け取るリダイレクトのコールバックエンドポイントだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/cfb1fbdf-7343-fb00-84e1-e428e231a517.png)

紐解くと、
- **1**では、本来のPOSTのリクエストはバックエンド前段でALB層でUAがIDプロバイダに302リダイレクトされていることがわかる。
- **2**では、IDプロバイダでユーザ検証が完了してALBにリダイレクトしてきたので、ALBが本来リクエストに302リダイレクト復帰させようとしている。
- 問題は**3**で、UAから本来`POST`メソッドのリクエストが`GET`メソッドでリクエストされたので、バックエンドが送信元画面に302リダイレクトで差し戻している。
- 結果、**4**で、UAが差し戻しで元画面にリクエストしている。ユーザは**2**と、**3**が見えずこの間1秒未満なので、何かわからんが元画面に戻った？という状況

なお、**1**から**2**の間は、IDプロバイダの認証有効期限とか、ましてALBがUAに食わせる認証結果の収納クッキーの有効期限切れとか起こっているわけでもなく、定期的にIDプロバイダに送ってユーザ検証をしてくれていて、ログ全体でこの検証フローがたびたび発生していて、POSTリクエストに当たったときに問題として顕在化したようだ。

Httpメソッドとデータも維持して復帰してくださいよ、、と思うが、aws公式で、自分で対策してくれとレポートが出ているためしょうがない。

> **注**: Application Load Balancer は 301 と 302 のリダイレクトのみをサポートします。これらのリダイレクトにより、クライアントは後続のリクエストで HTTP メソッドを POST から GET に変更できます。307 リダイレクトが必要な場合は、リダイレクトはターゲットアプリケーションを経由する必要があります。
[Application Load Balancer を使用して、ドメインを別のドメインにリダイレクトする](https://repost.aws/ja/knowledge-center/elb-redirect-to-another-domain-with-alb)

## 対策

私のユースケースではOIDCフローは追加認証要素でありアプリ層には別途、認証と、一般的な検証＆ログインリダイレクト機構を担保しているので、
ホスト全体に適応していたALBのOIDCルールを認証ロケーションに狭めることで、IDプロバイダへの検証割り込みを回避することで対策とした。
MVCフレームワークでRequest_URLとRequire envでアクセス制御するときの注意点

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/417736/4b609ebb-2a8f-a816-9927-0fa356f78671.png" alt="apache" width="80">

apacheconfまたは.htaccessで`Request_URI`に基づいて`SetEnvIf`で環境変数でフラグを立てて、`Require`でホワイトリスト判定しているのに拒否される。

## 通常

`SetEnvIf Request_URI {ロケーション} `と`Require`でロケーションで判定するシンプルな例

```apacheconf:apacheconf
# http://host/path/to/location でリクエスト

# ロケーションにマッチして環境変数をフラグする
SetEnvIf Request_URI /path/to/location allowed_location

# Requireでフラグを判定して許可
Require env allowed_location
```

## MVCフレームワーク下におけるリダイレクト影響

Webフレームワーク+apache環境ではだいたい`mod_rewrite`を使った次のコードスニペットが公開されている。

```apacheconf:apacheconf
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
# => http://host/index.php?_url=/path/to/location にインターナルリダイレクトする
```

### 原因

上記インターナルリダイレクトでconfの再評価が入るとロケーションが一致しなくなる。

```apacheconf
# http://host/index.php?_url=/path/to/location でリクエスト

# ロケーションにマッチしないので環境変数をフラグしない
SetEnvIf Request_URI /path/to/location allowed_location

# Requireでフラグを判定して拒否
Require env allowed_location
```

### 対策

リダイレクト後のロケーションもフラグメントするのではさすがに不毛だわ

```apacheconf
SetEnvIf Request_URI /path/to/location allowed_location
# リダイレクト後のロケーションもフラグメント
SetEnvIf Request_URI /index.php?_url=/path/to/location allowed_location

# Requireでフラグを判定して拒否
Require env allowed_location
```

**結論**

`mod_rewrite`によるリダイレクトでは、前回評価で定義した環境変数が`REDIRECT_`プレフィックス付きで`REDIRECT_{環境変数}`のように引き継がれるので、
`Require`に`REDIRECT_{環境変数}`を追加して、本来のユーザリクエストに基づく評価結果をもって通過させる。

```apacheconf
# リダイレクト再入ではマッチしない
SetEnvIf Request_URI /path/to/location allowed_location

# が、RequireでREDIRECT_allowed_locationを評価して許可
Require env allowed_location REDIRECT_allowed_location
```
統計検定1級　統計数理　2024　問2　解説

![2-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/a05e0e20-caaa-59e4-5c45-77beddae762f.jpeg)
![2-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/78461767-0866-e89b-bbbe-bb68408f9e4d.jpeg)
![2-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/20b81511-8c82-4d12-f05d-ddb29843bc31.jpeg)
RockyLinux8.9にSlurmをソースコードからインストール（インストール手順の確認）

## はじめに
RockyLinux8.9上で、ネット上の情報やslurmの[ドキュメント](https://slurm.schedmd.com/quickstart_admin.html)を参考にインストールまでを行ってみたが、munge-develのインストールでエラーになったりで、本番環境できれいにインストールするには何が必要で何が不要であったかを整理した結果をまず記録に残すことにしました。
```
$ sudo dnf install munge-devel
引数に一致する結果がありません: munge-devel
エラー: 一致するものが見つかりません: munge-devel
```
まだ、管理ノードのみしか用意していないので、計算ノードを準備してから、設定ファイルを用意して、slurmの起動を行う予定です。
### インストール直後のRockyLinuxへのインストール
"Development Tools"やmunge-develのインストールの前に、powertoolsをインストールすることで、mungeキーの生成やmungeの起動まで行えました。
```
##  システムの最新化
[localhost ~]$ sudo dnf update -y
## 必要なリポジトリを確認・有効化
[localhost ~]$ sudo dnf install epel-release -y
## 開発ツールのインストール
[localhost ~]$ sudo dnf config-manager --set-enabled powertools
[localhost ~]$ sudo dnf groupinstall "Development Tools" -y
## munge（認証用ライブラリ）のインストール
[localhost ~]$ sudo dnf install munge munge-devel -y

##  Slurm のソースコードをダウンロード
[localhost ~]$ wget https://download.schedmd.com/slurm/slurm-24.11.0.tar.bz2
[localhost ~]$ tar -xjf slurm-24.11.0.tar.bz2
[localhost ~]$ cd slurm-24.11.0/
## ソースコードのビルド準備
[localhost slurm-24.11.0]$ ./configure
## Slurm のコンパイルとインストール makeは5分ほどかかる
[localhost slurm-24.11.0]$ make
[localhost slurm-24.11.0]$ sudo make install

[localhost slurm-24.11.0]$ which scontrol 
/usr/local/bin/scontrol
[localhost slurm-24.11.0]$ which slurmd
/usr/local/sbin/slurmd

## MUNGE キーの生成（管理ノードで実施）
[localhost slurm-24.11.0]$ sudo /usr/sbin/create-munge-key
Generating a pseudo-random key using /dev/urandom completed.
## MUNGE サービスの起動と確認
[localhost slurm-24.11.0]$ sudo systemctl start munge
[localhost slurm-24.11.0]$ sudo systemctl status munge.service
● munge.service - MUNGE authentication service
   Loaded: loaded (/usr/lib/systemd/system/munge.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2025-01-21 02:27:57 EST; 5s ago
     Docs: man:munged(8)
  Process: 200533 ExecStart=/usr/sbin/munged (code=exited, status=0/SUCCESS)
 Main PID: 200535 (munged)
    Tasks: 4 (limit: 47476)
   Memory: 960.0K
   CGroup: /system.slice/munge.service
           └─200535 /usr/sbin/munged

 1月 21 02:27:57 localhost.localdomain systemd[1]: Starting MUNGE authentication service...
 1月 21 02:27:57 localhost.localdomain systemd[1]: Started MUNGE authentication service.
[localhost slurm-24.11.0]$ sudo systemctl stop munge
```
## あとがき
できてしまえばシンプルな手順ですが、
・"Development Tools"やmunge-develがインストールできずに悩む
・Slurm v23.11 から自身のプラグインによる認証がサポートされるようになったことで、mungeをインストールするのか、 Slurm コンポーネント間の通信・認証にmungeを使うのか悩む
で、手間取りました。
nohup コマンドで nohup.out は作りたくないが、ターミナルへの出力は行いたい

# やりたいこと

nohup コマンドと & を用いて任意のコマンドをバックグラウンドで実行したいです。

- nohup: "no hang-up" の略で、シェルセッションが終了しても実行中のプロセスが終了しないようにするためのコマンドです。通常、シェルを閉じるとそのシェルで実行中のプロセスも終了します。しかし nohup コマンドを使うとそのプロセスは継続して実行されます。
- &: コマンドをバックグラウンドで実行するためのシェル演算子です。これによりコマンドが実行されている間もシェルのプロンプトが戻り、他のコマンドを続けて入力することができます。

```shell-session
$ MY_COMMAND="echo \"I love playing yo-yo\"; echo \"I don't like yo-yo\" 1>&2"
$ nohup bash -c $MY_COMMAND 1>&2 &
[1] 28357
appending output to nohup.out
[1]  + 28357 done       nohup bash -c 
$ cat nohup.out
I love playing yo-yo
I don't like yo-yo
```

nohup コマンドを使用すると、実行したコマンドの出力が `nohup.out` というファイルに出力されます。このファイルを作りたくない場合は、コマンドの出力を `/dev/null` にリダイレクトさせます。

```shell-session
$ nohup bash -c $MY_COMMAND 1>&2 > /dev/null 2>&1 &
[1] 28739
[1]  + 28739 done       nohup bash -c  > /dev/null 2>&1
$ cat nohup.out
cat: nohup.out: No such file or directory
```

しかし「`nohup.out` は作りたくないがターミナルへの出力は行いたい」という場合はどうすればよいでしょうか？

# 方法

```shell-session
$ nohup bash -c $MY_COMMAND > >(tee) 2>&1 &
[1] 29886
I love playing yo-yo
I don't like yo-yo
[1]  + 29886 done       nohup bash -c $MY_COMMAND > >(tee) 2>&1
$ cat nohup.out
cat: nohup.out: No such file or directory
```

- `> >(tee)`: プロセス置換を使って、標準出力を tee コマンドに渡します。tee は入力を受け取り、それを標準出力に書き出すと同時に、指定されたファイルにも書き出すことができます。この場合、ファイル指定がないため、単に標準出力に出力されます。
- `2>&1`: 標準エラー出力を標準出力にリダイレクトします。これにより、標準出力と標準エラー出力の両方が tee コマンドに渡され、両方の出力がターミナルに表示されます。

`|` を使ってもよいですが、プロセス置換を使うことで 1 つのプロセスだけで実現できます。

```shell-session
$ nohup bash -c $MY_COMMAND | tee 2>&1 &
[1] 30789 30790
I love playing yo-yo
I don't like yo-yo
[1]  + 30789 done       nohup bash -c $MY_COMMAND | 
       30790 done       tee 2>&1
$ cat nohup.out
cat: nohup.out: No such file or directory
```

ファイルを指定しない tee コマンドの使い方があるんだなと思いました。

# 参考

- [bash - how to use nohup while still sending stderr to the terminal - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/213046/how-to-use-nohup-while-still-sending-stderr-to-the-terminal)
- [Linuxでのプロセス置換 #Bash - Qiita](https://qiita.com/angel_p_57/items/fd1d9a10e2f4aba17669)
Pythonのunittestとpytestの比較

# 概要
- unittest：Python 標準ライブラリのユニットテストフレームワークです
- pytest：pip install が必要なサードパーティーライブラリで、 unittest の上位互換です

# 文法と可読性
- unittestはJavaのJUnitに影響を受けており、クラスベースで記述します。テストメソッドはtest_で始める必要があります
- pytestはよりシンプルな関数ベースの文法を採用しており、通常のPython関数としてテストを書けます

# アサーション
- unittestはassertEqual(), assertTrue()などの専用メソッドを使用します
- pytestはPythonの標準的なassert文を使用でき、より直感的です
```python
# unittest
self.assertEqual(result, expected)

# pytest
assert result == expected
```

# フィクスチャ
- unittestはsetUp()とtearDown()メソッドを使用します
- pytestは@pytest.fixtureデコレータを使用し、より柔軟な依存関係の管理が可能です


# パラメータ化テスト
- unittestでは対応していませんが、サードパーティライブラリで実現可能です
- pytestは@pytest.mark.parametrizeで簡単にパラメータ化テストを実装できます

# エラーレポート
- unittestのエラー出力は比較的シンプルです
- pytestはより詳細なエラー情報を提供し、失敗したアサーションの値を表示します

# プラグイン対応
- pytestは豊富なプラグインエコシステムを持ち、機能拡張が容易です
- unittestはプラグイン対応が限定的です

# 選択の基準
- 小規模なプロジェクト：pytestの方がシンプルで書きやすい
- 標準ライブラリのみ使用したい場合：unittest
- より高度なテスト機能が必要な場合：pytest
- レガシーコードの保守：既存のコードベースに合わせる
中華ゲーム機Linuxのよもやま話(Linuxディストリビューション制作編)

# はじめに
MagicXから開発用のmini zero 28という中華ゲーム機を提供していただいたので、zero28で動作するLinuxディストリを作っていきたいと思う。

(私が制作したLinuxディストリビューションはgithubにて閲覧できます)
https://github.com/game-de-it

# zero28用のLinuxって何を使うの？
zero28ではopenwrtベースのTinaLinuxを利用する。
TinaLinuxはA133P搭載のSBCに対応したLinuxなので、A133P搭載のzero28にも使えるが、もちろんそのままでは何もできないのでカスタムしないといけない。

WindowsもAndroidもLinuxもMacOSも「OSだけでは何もできない」と同じことで、OSとアプリケーションが組み合わされないと、やりたいことが実現できないのだ。

# まず何をするの？
まずはTinaLinuxやエミュレーターなどのプログラム全般をビルドするために必要な「ツールチェーン」を整える必要がある。
ツールチェーンとは`「ソフトウェア開発やシステム開発において、目的を達成するために組み合わせて使用するプログラム（ツール）の集合体」`とグーグル先生が教えてくれるとおり、今回の例ではTinaLinuxをビルドするためのプログラムの集合体でもあり、エミュレーターというプログラムをビルドするためのプログラムの集合体　とも言える。

# ツールチェーンってどうやって作るの？
ツールチェーンを作るためにはまずTinaLinuxのビルドツールに組み込まれている「パッケージリスト」の修正や追加を行なっていく。
なぜリストを修正＆追加するかというと、プログラムをビルドするにはプログラム(パッケージ)の依存関係が存在するので、その依存しているパッケージを洗い出し、新たなパッケージが見つかればリストに追加、パッケージのバージョン番号の変更が必要な場合はリストの修正をしていく必要があるからだ。

例えば「卵焼き1.19」を作るには「フライパン2.1.1」が必要
->フライパン2.1.1を作るには「鉄2.0」と「火1.1.3」が必要
->鉄2.0を取るには「ハンマー0.56」が必要で火1.1.3をつけるには「ガス0.6」や「薪0.8.1」が必要
->ハンマー0.56を作るには・・・　

と言った具合に「卵焼き1.19」というプログラムを焼き上げる前に、依存関係のある様々な道具のバージョンを確認したり、足りない道具は新規追加しないといけないのだ。

依存関係を調べ終えた後には、依存するパッケージをダウンロードするためのURLを探す必要がある。
ほとんどはググればすぐにURLは見つかるものの、その数が数百近くあると思うと気が重い。
いざパッケージのURLを揃え終わったとしても、それぞれのパッケージごとにMakefileやpatchファイルを作成する必要がある。

よってこのツールチェーンの作成作業がLinuxディストリビューションを作る上で一番大変な工程と言ってもいい。

# 説明書のようなものはないの？
一応、TinaLinuxのマニュアルは存在するものの全て中国語で書かれているので、翻訳作業や翻訳された言葉の意味も理解していかないといけない。
https://tina.100ask.net/

マニュアルといっても「zero28用のTinaLinuxを作るためのマニュアルではない」ので、zero28のTinaLinuxを作るためには、マニュアルに書かれている情報の何が必要で、何が不必要な情報なのかを精査しないといけない。

もちろんTinaLinuxをガッツリ触ったことがないので、TinaLinuxのビルドツールのお作法も学習しなければならない。
お作法というのはどういうことか？　というと、上記で「パッケージリストを修正＆追加する」と書いたものの、そもそもどこにパッケージリストがあるのか？、どのようなMakefileを書く必要があるのか？、どうやってそれをビルドするのか？、ビルドすると何がどこに配置されるのか？　など、あらかじめ知っておかないといけない情報が「お作法」ということだ。

buildrootやEmuelec系のビルドツールはある程度精通しているものの、TinaLinuxのビルドツールは初めて触るので結構大変。

Linuxディストリビューションを作るには作業コストだけではなく、学習コストもハンパないと言える。

もちろんツールチェーンを使ってプログラムをビルドしただけでは何も起きない。
例えばフォトショップのプログラムをダウンロードしても何も起きないのと同じことで、そのプログラムがLinuxで意図した通りの動作をするように設計しないといけない。

例えばOSが起動するときに自動的に実行しておく必要があるプログラムもあれば、ユーザがそれを実行したいというアクションによって実行されなければならないプログラムもある。
ビルドされたプログラムの何をどのようにするのか設計するのも結構大変な作業であると言える。

# なんか・・・もう地獄じゃない？
でも・・・それが楽しいのだっ！
読むべきコンピュータサイエンスの論文

## はじめに
現代のソフトウェア工学の基盤は、いくつかの高い影響力を持つ研究論文によって築かれました。現在のアプリの多くを支えるアルゴリズムから、データを保存するデータベースまで、私たちが日常的に使っている多くの技術は、学術的な出版物から生まれたものです。こうした論文は最初は難解に思えるかもしれませんが、ソフトウェア開発のアプローチを大きく変える重要な洞察を提供してくれます。

この記事では、コンピュータサイエンスの論文を読むことがなぜ重要なのか、そしてどのようにそれを効率よく行うかについて説明します。それでは、

## なぜコンピュータサイエンスの論文を読むべきか?
新しい知識を学ぶことは、開発者にとって非常に重要です。それはスキルの向上や新たな技術を習得する鍵となるからです。しかし、実際には多くの人がコンピュータサイエンスの研究論文をあまり読んでいないことに気づきました。

では、なぜ研究論文を読む必要があるのでしょうか？それは、コンピュータサイエンスやソフトウェア工学の幅広い概念や深い理論を理解する助けになるからです。実際、現在使っているプログラミング言語の多くの機能は、これらの論文から生まれました。また、新しい論文を読むことで、未来にどのような技術が登場するのかを予測することも可能です。

さらに、研究論文を読むことで批判的思考を養うことができます。他の人がどのように似た問題に取り組み、どのような解決策を提示しているのかを知ることで、自分のプロジェクトに役立つアイデアや効率的なアプローチを見つけることができます。例えば、大規模言語モデル（LLM）に関する基礎研究[「Attention Is All You Need」（2017年、Vaswani）](https://arxiv.org/pdf/1706.03762)は、ChatGPTのような技術に大きな影響を与えています。

## 論文を読む方法：
ここでは、[S. Keshavの「How to Read a Paper」](https://web.stanford.edu/class/ee384m/Handouts/HowtoReadPaper.pdf)という論文を紹介し、その中で提案されている実用的で効率的な「3パス法」を説明します。この方法に従えば、研究論文を効果的に読み解くことができます。

##### 1. ファーストパス（5〜10分）
- タイトル、概要、序論を読む
- セクションやサブセクションの見出しを確認
- 結論を読む
- 参考文献に目を通す
##### 2. セカンドパス（約1時間）
- さらに注意深く読むが、複雑な証明はスキップ
- 重要なポイントをメモする
- 追跡するべき重要な参考文献に印をつける
##### 3. サードパス（1〜5時間）
- 実際にアイデアを再実装してみる
- 全ての仮定を特定し、それに疑問を投げかける
- 関連研究と比較する

## おすすめの研究論文（例）:
以下は、ぜひ読んでみてほしい重要な研究論文の一部です：

- [On the Criteria To Be Used in Decomposing Systems into Modules(1972年, D.L. Parnas)](https://wstomv.win.tue.nl/edu/2ip30/references/criteria_for_modularization.pdf) :
この論文では、システムをモジュールに分割するための原則が紹介されています。Parnasは、モジュールの独立性を高め、システムの変更や保守を容易にする設計手法を提案しました。このアプローチは、モジュール設計の基本として今日も広く使われています。
- [Time, Clocks, and the Ordering of Events in Distributed Systems (1978年, L. Lamport)](https://www.microsoft.com/en-us/research/publication/time-clocks-ordering-events-distributed-system/) : 
この論文では、分散システムにおけるイベントの因果関係と時間の概念を定義した画期的な論文です。「ラマポート時計」という論理時計のアイデアを導入し、分散環境でのプロセス間の同期問題を解決する基礎を築きました。
- [Why Functional Programming Matters (1990年, J. Hughes)](https://www.cs.utexas.edu/~shmat/courses/cs345/whyfp.pdf) :
この論文では、関数型プログラミングがなぜ重要なのかを説明した論文です。Hughesは、遅延評価や高階関数といった概念が、プログラムのモジュール性や再利用性をどのように向上させるかを明らかにしました。関数型プログラミングの利点を理解する上で、非常に有益な論文です。
- [A Note on Distributed Computing (1994年, J. Waldo)](https://scholar.harvard.edu/files/waldo/files/waldo-94.pdf) : 
この論文では、分散コンピューティングの基本的な課題を概説した論文で、ネットワーク分離やプロセス間通信の問題に焦点を当てています。この論文は、分散システムを設計する際の重要な洞察を提供します。
- [The Google File System (2003年, Ghemawat S.)](https://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf) : 
この論文では、Googleが大量のデータを効率的に扱うために設計した分散ファイルシステムについて解説した論文です。このシステムは、大規模なストレージ要件に対応し、データの信頼性とパフォーマンスを両立させたもので、現在のクラウドストレージの基盤の一部となっています。

## 結論:
この記事を通じて、コンピュータサイエンスの論文を読むことの重要性と、その方法論について理解が深まれば幸いです。技術的な知識を磨く旅の中で、ぜひ研究論文を味方につけてください！
次の記事まで、ハッピーコーディング！
【AWS】VB.NETで作成したWindowsアプリケーションからAWSを使ってみよう

とある歴史のあるシステムにて、拠点間でのデータ交換手法に電子メールを使っている箇所があります。その当時は、メールが身近で使いやすい技術だったのですが、

・**大量データ送信には向かない**
・**メール喪失時の再送が面倒**

などなど、ちょっと使いにくい面もありました。

「動いているソースには安易に手を入れるな」と言われて育ってきた世代ですが、（ソースにおまじないとかコメントあったな...:thinking:）お客さんと作り手双方にメリットがある新しい技術は、積極的に取り入れていきたいものです。

そこで今回は、メールでのデータ交換部分の処理を **AWS(S3)** に代替すべく手順を調べました。※ソースコードは、**Copilot** が生成したソースをベースにしています。

# メールでのデータ交換をAWS S3に移行する手順
開発環境は、**VB.NET(VisualStudio2019)** を使っています。
以下のステップとなりました。

#### 1. AWSが使えるようにアカウント作成し、S3上にバケットを作成
※この手順は.NET特有のものではないため、詳細は割愛します。

#### 2. NETからAWS S3が使えるように、NuGetパッケージマネージャーから「AWS SDK for .NET」をインストール

#### 3. 拠点A（データ送信側）S3へのファイルアップロード
次に、データ送信側である拠点Aから、ファイルをS3にアップロードします。以下のVB.NETコードで実現できます。

```vb:vb
    Imports Amazon.S3
    Imports Amazon.S3.Transfer

    Module Module1
        Sub Main()
            Dim bucketName As String = "your-bucket-name"
            Dim accessKey As String = "your-access-key"
            Dim secretKey As String = "your-secret-key"
            Dim filePath As String = "C:\path\to\your\datafile.txt"
  
            Dim s3Client As IAmazonS3 = New AmazonS3Client(accessKey, secretKey, RegionEndpoint.YourRegion)
            Dim fileTransferUtility As New TransferUtility(s3Client)

            fileTransferUtility.Upload(filePath, bucketName, "your-file-key")
            Console.WriteLine("File uploaded successfully.")
        End Sub
    End Module
```
現状のシステムでは、メールで送るファイルをローカルに保存しているため、そのファイルをS3に転送するのは結構簡単に出来そうです。（エラー処理はとりあえず置いておきます。）

#### 4. 拠点B（データ受信側）でS3からファイルをダウンロード
データ受信側である拠点Bでは、S3からファイルをダウンロードする処理を実装します。以下のコードでダウンロードを実現できます。

```vb:vb
Imports Amazon
Imports Amazon.S3
Imports Amazon.S3.Model
Imports System.IO

Module Module1
    Sub Main()
        Dim bucketName As String = "your-bucket-name"
        Dim keyName As String = "your-file-key"
        Dim filePath As String = "C:\path\to\save\file.txt"
        Dim accessKey As String = "your-access-key"
        Dim secretKey As String = "your-secret-key"

        Dim s3Client As IAmazonS3 = New AmazonS3Client(accessKey, secretKey, RegionEndpoint.YourRegion)

        Try
            Dim request As New GetObjectRequest() With {
                .BucketName = bucketName,
                .Key = keyName
            }

            Using response As GetObjectResponse = s3Client.GetObject(request)
                Using responseStream As Stream = response.ResponseStream
                    Using fileStream As FileStream = File.Create(filePath)
                        responseStream.CopyTo(fileStream)
                    End Using
                End Using
            End Using

            Console.WriteLine("File downloaded successfully to " & filePath)
        Catch ex As AmazonS3Exception
            Console.WriteLine("Error encountered ***. Message: '{0}' when writing an object", ex.Message)
        End Try
    End Sub
End Module

```
このコードでは、S3から指定したファイルをダウンロードし、ローカルに保存します。特に難しいことなく実装できると思います。



Smart Design 高橋
Google Cloud PlatformでPython 3.7サポート終了！移行が必要なサービスと対応方法

GCP（Google Cloud Platform）ユーザーの皆さんに重要なお知らせです。2023年の終わり頃にGoogleは、**Python 3.7のサポート終了**を発表しました。このニュース、ちょっと不安になりますよね？でも安心してください！この記事では、どのサービスが影響を受けるのか、移行の準備に必要なステップを楽しく解説します✨

---

## なぜPython 3.7のサポートが終了するの？🤔
Pythonコミュニティ全体としても、古いバージョンのサポートを段階的に終了する流れが進んでいます。Python 3.7は、公式サポート期間がすでに終了しており、セキュリティリスクが高まる可能性があります。そのため、Google Cloudも最新バージョンへの移行を推奨しています。

:::note info
💡 **ポイント**
- Python 3.7のリリース：2018年
- Python 3.7のサポート終了：2023年6月
:::

---

## サポート終了で影響を受けるGoogle Cloudサービス⚠️
Google Cloudでは多くのサービスがPythonを利用しています。特に以下のサービスは注意が必要です：

### 1. **Cloud Functions**
Cloud FunctionsでPython 3.7を使用している場合、サポート終了後はデプロイや修正ができなくなります。

- **影響**：既存の関数が動作しなくなるリスクがあります。
- **対策**：Python 3.8以上のランタイムへ移行してください。

### 2. **Cloud Run**
DockerイメージでPython 3.7を使用している場合も移行が必要です。

- **影響**：セキュリティ更新が受けられなくなります。
- **対策**：最新のPythonバージョンを基に新しいイメージを作成します。

### 3. **App Engine**
App Engineのスタンダード環境でPython 3.7を使用している場合も、移行が必須です。

- **影響**：アプリケーションのスケーリングや新機能の利用が制限されます。
- **対策**：対応する新しいランタイムへ移行してください。

---

## 移行の手順🛠️
### ステップ1: 依存関係の確認🔍
プロジェクト内のPython 3.7依存ライブラリをチェックします。

```bash
pip list
```

**ヒント**: `pipdeptree`を使えば依存関係を可視化できます。

```bash
pip install pipdeptree
pipdeptree
```

### ステップ2: コード互換性の確認🧐
Python 3.8以上の互換性をチェックします。`pylint`や`pyupgrade`のツールが役立ちます。

```bash
pip install pylint pyupgrade
pylint your_project/
pyupgrade --py38-plus your_code.py
```

### ステップ3: ランタイムの更新🚀
Google Cloud ConsoleまたはCLIを使用してランタイムを更新します。

#### 例: Cloud Functionsでの更新
```bash
gcloud functions deploy FUNCTION_NAME \
  --runtime python310 \
  --trigger-http
```

---

## よくある質問❓

### Q1: Python 3.7のプロジェクトをそのまま使い続けるとどうなる？
サポート終了後は、**セキュリティ更新やバグ修正が受けられなくなる**ため、リスクが高まります。また、Google Cloudの一部機能が利用できなくなる可能性があります。

### Q2: ライブラリの互換性が心配です。
Python 3.8以上での動作確認を事前に行うことをお勧めします。互換性のないライブラリは、公式サイトやGitHubリポジトリでアップデート情報を確認しましょう。

---

## おすすめリソース📚
- [Google Cloud公式：Pythonランタイムサポートポリシー](https://cloud.google.com/functions/docs/concepts/python-runtime)
- [Python公式：3.7から3.8への移行ガイド](https://docs.python.org/3.8/whatsnew/3.8.html)

:::note warning
⚠️ **注意:**
移行作業は早めに行いましょう！
:::

---

## おわりに🙌
Python 3.7サポート終了は大きな変化ですが、適切な準備を行えばスムーズに移行できます。この機会にプロジェクトをアップデートして、新しい機能や性能を最大限に活用しましょう！

この記事が皆さんのプロジェクト移行の一助となれば幸いです😊

移行の体験談やTipsがあれば、ぜひコメント欄でシェアしてください！🚀✨
ASP.NET入門

## 概要
.NET向けのActive Server Pagesであり、Webアプリケーションフレームワークである
.NETに対応した言語であれば開発可能

また、ASP.NET Webサービスという、Webサービスを開発することが可能

## ASPを使う利点
WIndowsアプリ経験者が同じような感覚でwebアプリが作成出来る

## プロパティの実装について
モジュール間で変数を受け渡したときに、普通のプロパティ実装だと、ページが変更されたときに
変数が破棄されてしまう
viewStateを使って、保持しておく必要がある
コントロールのプロパティについては、自動的にviewStateに保持されるものとそうでないものがあるので注意

## ファイル拡張子
aspx    webフォーム
ascx    ユーザコントロール(共通のページ的なもの)

## デバッグモードで実行時に、出力ウィンドウに出力する
System.Diagnostics.Debug.Print(なにかしらオブジェクト)

## ListBoxがらみの制御
http://dobon.net/vb/dotnet/control/lbselectitem.html

## ポストバック
ポストバックとはHTTP処理を隠蔽するための機能
処理を自分自身に返す(自分自身にポストする)
なにかしらのイベント(例えばボタンクリック)が発生し、サーバ側で処理して
その結果を自分自身のページに反映させる
ビューステートとは、ページ表示時の情報(例えばテキストボックスの入力値)を持つ
ビューステートの値と、ポストバック時の値を比べることで、値が変更された！などの
情報を把握することが出来る

## ビューステート
ページ表示時の情報
実体は、hiddenパラメータである

## ノウハウ
・ASP.NETで、子画面を開いたときに親画面のスクロールを維持する方法
　⇒MaintainScrollPositionOnPostbackプロパティを使用する
(QA) ILE RPG(COBOL)プログラムのソースを調べたい

## Q.　ILE RPG(COBOL)プログラムのソースを調べたい

RPGⅢだとDSPPGMコマンドでソースが表示されます。

DSPPGM PGM(DEMOLIB/IPH110)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/034aeae7-6636-e157-37c3-eeec20f31874.png)

ILE RPGだとDSPPGMコマンドでソースが分かりません。

DSPPGM PGM(DEMOLIB/BCH110)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/c0c4b6e5-08c7-bd04-9a90-ad9f44fe5ee1.png)

## A. ILE プログラムでは　DETAIL(*MODULE) を指定します

上記の状態ですと、DSPPGM_PGM(..../....)DETAIL(*ALL)　がデフォルト指定されています。

**DSPPGM PGM(DEMOLIB/BCH110) DETAIL(\*MODULE)**　のように指定すると
下記の画面が出て、OPTION.に5を入れます。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/eaeec46c-fe18-eb06-eab1-74068f5c0792.png)

結果表示画面で、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/8667fead-e6eb-b280-ba01-b191fc976a9c.png)

上記のようにプログラムソースが表示されました。
WSL-Ubuntu22.04を用いて通信シュミレーション

## WSLのつかいかた
#### 環境セットアップ
Windows PowerShellを起動する。
~~~
wsl --install Ubuntu22.04
~~~

続いてインストールしたUbuntu22.04をデフォルトに設定する
~~~
wsl --set-default Ubuntu-20.04
~~~

Ubuntu-20.04を起動

## 通信シュミレーションに用いるソフトの準備
#### 今回はシュミレーションソフトとしてNS-3を使用する。
#### また、５Gのシュミレーションとして５G-LENAを導入する。

必要ライブラリ等の準備を行う。
Ubuntu22.04にて以下コマンドを実行
~~~
sudo apt update
~~~
~~~
sudo apt upgrade
~~~
アップデート終了後ライブラリのインストールを行う。
~~~
sudo apt-get install libc6-dev
~~~
~~~
sudo apt install sqlite sqlite3 libsqlite3-dev
~~~
~~~
sudo apt install libeigen3-dev
~~~
次に、Pythonの開発環境管理用ソフトウェアをインストールする。
~~~
sudo apt install python3.10-venv
~~~

~~~
python3 -m venv ./myenv
~~~
~~~
source ./myenv/bin/activate
~~~
myenvという名前の環境を構築し、有効化する。

つぎに、ライブラリ管理用ソフトウェアであるPIPをインストールする。
~~~
sudo apt install python-pip
~~~
計算用ライブラリであるnumpyをインストールする。
~~~
pip install numpy torch
~~~
以上で必須ライブラリの準備を終え、NS-3のインストールを行う。
以下コマンドでGit Hub上からクローンする。
~~~
git clone https://gitlab.com/nsnam/ns-3-dev.git
~~~
ns-3-devというディレクトリに移動する。
~~~
cd ns-3-dev
~~~

~~~
git checkout -b ns-3.42 ns-3.42
~~~
ここまででNS3のインストール作業を終了する。
次に、インストールが成功しているか確認し、テストする。
~~~
./ns3 configure --enable-examples --enable-tests
~~~
~~~
./test.py
~~~
contribのディレクトリに移動し、５GNRモジュールのインストールを行う。
~~~
cd contrib
~~~
~~~
git clone https://gitlab.com/cttc-lena/nr.git
~~~
~~~
cd nr
~~~
~~~
git checkout -b 5g-lena-v3.3.y origin/5g-lena-v3.3.y
~~~
ここまでで５GNRモジュールのインストールを終了する。
次に、再度確認する。
~~~
./ns3 configure --enable-examples --enable-tests
~~~
~~~
check
SQLite support                : ON
Eigen3 support                : ON
~~~
上記２つのライブラリがONになっていることを確認する。
確認後、成功していればビルド行う。
~~~
./ns3 build
~~~
ビルド終了後以下コマンドで実行する。下記例ではcttc-nr-demoというファイルを実行している。
~~~
./ns3 run cttc-nr-demo
~~~

次に、ファイルの編集方法を示す。今回は利便性を考慮し、Visual Studio Codeを用いる。
VScodeのインストール方法については省略する。（参考文献に公式HPを記す。）

VScodeの拡張機能インストール欄でWSLと入力する。
![2025-01-21_16h25_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911098/ca256599-0224-9069-b901-614f882e8513.png)

一番上に出てくる、Microsoftが提供している拡張機能をインストールする。
一度VScodeを再起動し、左端のリモートエクスプローラーにUbuntu22.04があることを確認する。
![2025-01-21_16h27_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3911098/0c136b2d-9e1b-ec4f-2d8f-5d201c98a601.png)

その後、ファイルタブで以下フォルダを開く。
~~~
¥¥wsl.localhost
~~~


#### 参考文献
5GLENA, https://5g-lena.cttc.es
Microsoft VScode, https://azure.microsoft.com/ja-jp/products/visual-studio-code/
ZEPETOでマイルーム作れるようになった！！

![スクリーンショット 2025-01-21 160522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/4ccb8622-394c-0055-1704-29aa5be35c25.png)

2025年1月20日のアップデートでマイルームが実装されました！
早速遊んでみたので内容まとめていきます！

## マイルームとは？
コインやゼムでインテリアを購入し、好きなように配置して自分だけの空間を作成することで出来る新機能です！
他のユーザーの部屋に遊びに行くこともでき、部屋の中で写真や動画を撮影することが出来ます！

## ①マイルームへ移動する！
プロフィール画面の右上に「マイルーム」と表示されているので、ここを押すとマイルーム画面に移動します！
他のユーザーの部屋にお邪魔する時も同じ方法です。

![スクリーンショット 2025-01-21 134542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/2f477f1c-4a3a-f095-2f47-a090a425bdb0.png)


## ②アイテムを配置してみよう！
ファッションアイテムと同じように、コインやゼムでインテリアや壁紙などを選んで自由に配置が出来ます！

![スクリーンショット 2025-01-21 150959.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/404285ec-105a-41a7-f491-8d5bc9ac181c.png)
【左：[ショップ]ボタン、中央：ショップ、右：アイテム配置】

一部のインテリアは、自分が投稿したフィードを設定することが出来ます！
イチオシのフィードを設定して、部屋に遊びに来てくれたユーザーに見てもらいましょう！
![IMG_1835.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/c3a4846b-09f6-c844-99dd-3e8525fc2a65.png)
【機能タブ > FEEDから購入】
![スクリーンショット 2025-01-21 140036.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/815564d8-39df-5ecf-4bcc-36bb789d9369.png)
【赤矢印：フィード設定、青矢印：フィード視聴】

## ③マイルームで遊んでみよう！
インテリアの配置が完了したら、[Play]ボタンを押して遊んでみましょう！
椅子に座ったり、ベッドに横たわったりすることができ、ワールド同様に様々なポーズで写真や動画を撮影することも可能です！

![スクリーンショット 2025-01-21 153634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828655/86131a0c-0e69-51bd-4434-154510442021.png)
【左：[Play]ボタン、中央：椅子に座っている様子、右：撮影モード】

## 感想
現実世界ではできないような空間を作れるのが、メタバースの良いところだなと再確認できました！
これからどんどん新しいインテリアや機能が実装されるそうなので、皆さんもマイルーム機能で自分だけの空間作りに精を出してみてはいかがでしょうか！
Processingで丸いウィンドウを表示する

# はじめに
「おめシス」がデスクトップマスコットアプリを作ったので、Processingで矩形ではないwindow表示について調べた結果です。非矩形はできましたが、まだ、画像入力でshapeの自動生成まで出来ていません。

昔は、色々出ましたね。
ペプシマンのが、印象に残ってる。

# 環境
MacOS 13
Processing 4.2

# 使用画像
AIに星を書いてもらったら、精緻なものが登場。
![Designer2s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/513bb227-0a03-226e-0ad3-5b8fdce7e965.png)


![Designer2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/11566f89-85e0-7d9a-4b4f-35d251f7ac52.png)


# プログラム
かなりAIに書いてもらいました。javaのawtライブラリを使います。

```java
import java.awt.Frame;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.Color;
import processing.awt.PSurfaceAWT;
//import java.awt.geom.Path2D;

PImage img;
PShape svg;
Frame frame;

void setup() {
  size(512, 512);
  img = loadImage("Designer2.png");
  surface.setVisible(false); // Processingのウィンドウを非表示にする
  
  // 新しいフレームを作成
  frame = new Frame();
  frame.setUndecorated(true); // ウィンドウの装飾を削除
  frame.setBackground(new Color(0, 0, 0, 0)); // ウィンドウを透明にする

  // 楕円形のウィンドウを作成
  Shape shape = new Ellipse2D.Float(0, 0, 512, 512);
  frame.setShape(shape);

  // フレームを表示
  frame.setSize(512, 512);
  frame.setLocation(100, 100);
  frame.setVisible(true);

  // Processingの描画をフレームに追加
  PSurfaceAWT.SmoothCanvas canvas = (PSurfaceAWT.SmoothCanvas) surface.getNative();
  frame.add(canvas);
}

void draw() {
  background(0, 0, 0); // 背景を黒に設定
  image(img, 0, 0, 512, 512);
  frame.setLocation((100+frameCount*3)%(width*3), 100);
}
```

ウィンドウを透明にできるのですが、background命令で透明は扱えないので、黒で塗っています。
shapeを画像から生成できたらと思ったのですが、難航して、時間がかかりそうなので、別の機会に。

任意形状のwindowが開ければ、なんとかなるかと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/68bfeec5-0ba0-962c-7799-ce5ce025b3ae.png)
[React, Next.js] 気になったUIコンポーネントライブラリをまとめた

# はじめに
昨今のReact, Next.jsを用いたアプリケーション開発では、UIコンポーネントライブラリを用いることが一般的となっています。
そこで、気になったコンポーネントライブラリをまとめていきます。

# 紹介
以下が今回紹介するコンポーネントライブラリです。
|ライブラリ名|URL|気になるレベル(1~5)|
|---|---|---|
|Mantine|https://mantine.dev|5|
|HeroUI|https://www.heroui.com|4|
|Justd|https://getjustd.com|3|
|shadcn/ui|https://ui.shadcn.com/docs|3|

一つずつ紹介していきます。

## Mantine
Mantineは、モダンなReactアプリケーション向けのUIコンポーネントライブラリです。
豊富なコンポーネント群と柔軟なカスタマイズ性が特徴で、TypeScriptのサポートも充実しています。

### 良いところ
- コンポーネント数が他に比べてかなり豊富(今回紹介したものでは一番)
- ドキュメントがとても読みやすく、説明が細かく丁寧
- ダークモード対応
- コンポーネントだけでなく、便利なhookが用意されている
- Next.jsに公式対応している
- テンプレートなども公開されているので、コピペで利用可能なものもある


### インストール方法
Mantineのインストール方法については、以下のページをご覧ください。

https://mantine.dev/getting-started/#get-started-without-framework

### 🔗リンク

**⚪︎ドキュメント**

https://mantine.dev

**⚪︎テンプレート**

https://ui.mantine.dev/

### 雑感
Mantineはコンポーネントも豊富なだけではなく、ドキュメントが読みやすいので、今回紹介しているものの中では、一番ではないかなと感じています。
また、Tailwind CSSを使っていないので、Tailwindを使っていないメンバーが多くても導入しやすいというのも良い点ではないかなと思います。
私は、新規プロジェクトを立ち上げる際は、Mantineを推したいなと思います。

## HeroUI
HeroUIは、Vercelが提供するUIライブラリで、React用のUIライブラリとなります。
最近まで「Next-UI」という名前でしたが、2025年1月17日に「HeroUI」に名前が変わりました。
React Area ComponentsとTailwind CSSをベースにしています。

https://x.com/getnextui/status/1879987885954207871

### 良いところ
- TypeScriptで記述されているので、TypeScriptと互換性がある
- 豊富なコンポーネント(チャートコンポーネントも用意されているので良い)
- Framer Motionを採用していて、アニメーションをより簡単かつ効率的に処理
- ダークモード対応
- Tailwind CSSが使える
- 企業(Vercel)として取り組んでいる分サポートが長そう

### 雑感
Vercelが提供しているので、安心して利用できます。コンポーネントもVercelチックなものが多い気もします。
Mantineとは違い、Tailwind CSSが使えるので、Tailwind CSSをどうしても使いたいという場合は、こちらを選択するのが良いかと思います。

### 🔗リンク
**⚪︎ドキュメント**

https://www.heroui.com

## Justd
今回紹介しているコンポーネントライブラリの中で、一番直近で開発スピードが早いなと感じています。(開発者のやる気がすごい)
React Area ComponentsとTailwind CSSをベースにしています。

### 良いところ
- Tailwindの最新バージョンに対応している(v4)
- アップデートが頻繁に行われており、将来性がある
- コンポーネントが豊富(Mantineよりは下かなーという印象)
- Tailwind CSSが使える

https://getjustd.com

### 雑感
リリースされたばかりのTailwind CSSのバージョン4に対応していたりと、開発のスピードが他のものと比べ早いので、将来性(開発者のモチベーション)は他のライブラリよりあるのかなと思います。


## shadcn/ui
直近だと一番人気のあるコンポーネントライブラリかなという印象です。
2023年, 2024年の2年連続でプロジェクト・オブ・ザ・イヤーを受賞しています。
コンポーネントはnpm経由でインストールします。
Radix UIとTailwind CSSをベースにしています。

### 良いところ
- Tailwind CSSが使える
- Next.js v15 + React v19に対応
- ダークモード対応
- 世界的に人気があり、信頼性がとても高い
- npm経由でコンポーネントをインストールするので、コンポーネントコードの完全な制御が可能

### 雑感
shadcn/uiはnpm経由で、コンポーネントをインストールするので、プロジェクト間で一貫性を保ちたい場合には、少し手間が掛かりそうだなーと感じました。
あと、コンポーネントのアップデートも手動で行う必要があるので、その点については、コストが少し掛かりそうだなと感じました。

### 🔗リンク
**⚪︎ドキュメント**

https://ui.shadcn.com/docs


# 最後に
他にも色々な記事を書いているので、よければ読んでいってください！

https://qiita.com/hukuryo/items/b3b8f7b79c842b38e889

https://qiita.com/hukuryo/items/4a02784929b0cf0404a5

https://qiita.com/hukuryo/items/2a649d2ee018308d89f6

https://qiita.com/hukuryo/items/4e957621682a25da5f3b

https://qiita.com/hukuryo/items/e14779aeb0c0cf26c2d2
AWS SAM Lambda Powertools for Python

# AWS SAM で Lambda Powertools for Python のレイヤー

```template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Parameters:
  FunctionRuntime:
    Type: String
    Default: python3.11
    Description: "Lambda関数のランタイム"

Globals:
  Function:
    Runtime: !Ref FunctionRuntime  # Lambda関数のランタイム
    Layers:
      # https://docs.powertools.aws.dev/lambda/python/latest/#extra-dependencies
      # Powertools for AWS Lambda (Python) レイヤー
      - Fn::Join: 
        - "-"
        - - Fn::Sub: "arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPythonV3"
          - Fn::Join: ["", !Split [".", !Ref FunctionRuntime]]
          - "x86_64:5"
      - !Ref PythonBaseLayer  # 自分の使用するレイヤー

Resources:
  PythonBaseLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: python-base-layer  # レイヤーの名前
      ContentUri: layer/python-base-layer  # レイヤーのコンテンツURI
      CompatibleRuntimes:
        - !Ref FunctionRuntime  # 対応するランタイム
      RetentionPolicy: Delete  # レイヤーの保持ポリシー
    Metadata:
      BuildMethod: makefile
      BuildArchitecture: x86_64

  PythonBaseLayerPermission:
    Type: AWS::Lambda::LayerVersionPermission
    Properties:
      Action: lambda:GetLayerVersion  # アクション: レイヤーのバージョン取得
      LayerVersionArn: !Ref PythonBaseLayer  # 対象のレイヤーARN
      Principal: !Ref AWS::AccountId  # アクセスを許可するプリンシパル
```
数クリックで環境構築！？生成AI導入補助ツール”Pinokio"を使ってみた

![kinopio](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/587b2ece-ec36-2e58-64de-b4d704f9767f.png)


# はじめに
みなさん生成AI使っていますか？
社内何でも屋さんをやっているとどうしても画像に動画、コーディングまでやらざるをいけない時ってありますよね。

「すぐラフだけでも出したいのに環境構築か...」
#### そんな皆様に朗報です。
#### なんと数クリックで今なら簡単にできちゃいます。
#### そう、Pinokioならね。

# こんな人向け
・Pythonよくわからん
・ちょっと使いたいだけなのに仮想環境作るのめんどい
・いろんなAIツール使うから環境ぐちゃぐちゃになる！！

# 早速つかってみる
まずは以下のリンクにアクセスしてお好きなOSのインストーラーをクリック。
https://program.pinokio.computer/#/?id=windows
![スクリーンショット 2025-01-21 144735.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/d559215f-a9d7-bfd3-2378-d3d82c91f7c7.png)

ダウンロードしてきたZipファイルを解凍して.exeファイルを動かしてPinokio本体のインストールをします。

しばらく待つと以下のような初期設定画面が出てくるのでパスとシームカラーを選んだらOK。
![スクリーンショット 2025-01-21 145621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/774ad3c5-03c4-97e0-de38-94db3ac5b96c.png)

Saveボタンを押して待ったのち、Welcomeページが出てくればセットアップ完了です。

# 使い方説明
おそらく現在下の画像の画面になっていると思います。
まずはDiscoverをクリックしてAIツールインストール用のスクリプトを見に行きましょう。
![スクリーンショット 2025-01-21 153706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/762b94e4-6e52-1f3a-2efe-f12333db8d76.png)

今回はComfy UIをインストールしたいので、その部分をクリックし、
遷移したらDownloadをクリック。
![スクリーンショット 2025-01-21 153839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/746a057d-b481-18cc-a849-4632471df908.png)

必要なライブラリーの確認をされるのでポチポチOKをクリック。
![スクリーンショット 2025-01-21 154041.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3564568/765d158c-c911-f331-7184-20acc8724b92.png)

そうすると普段の面倒な環境設定と必要なファイルすべてのダウンロードを全てPinokioがやってくれます。
しばらくしてダウンロードが完了するとgit名を決めるようにダイアログが出てくるので任意の名前を記載します。

その後、Pinokioが全てを順序良く自動でインストールしてくれるので優雅にお茶を飲んだり眠らせている期限不明のタスクを片づけたりしましょう。

インストール後はPinokio上のTerminalからコマンドを飛ばすか、WebUIスタートのボタンを押せばOKです。

# おわりに
### いかがでしたか？
仕事で複数のAIサービスやモデルを使っていると環境構築がごちゃごちゃになって急に使えなくなることもあります。
AI使いたいけど環境設定わかんない、ハンズオンで毎回設定させるの面倒...みたいなケースで大分使えそうです！
#### ”””自分で環境設定する時間をほぼ０に出来る”
この1点だけでも試す価値はあるかなと思います！

WhisperだったりPyramidだったり色んな生成モデルに対応しているので皆様も使ってみてください！！
【Ruby】__send__ メソッド

# はじめに
`__send__` メソッドについて調べた内容をまとめます。

# `__send__` メソッド
- BasicObjectクラスのメソッド
- レシーバが持つメソッドを文字列もしくはシンボルで呼び出し、メソッドの結果を返す
- メソッドに引数を渡す場合は第二引数を指定する

https://docs.ruby-lang.org/ja/latest/method/BasicObject/i/__send__.html

### 特徴１: 動的にメソッドを呼び出すことができる
- 実行例
```rb
class HogeValidator < ActiveModel::EachValidator
  
  def validate_each(record, attribute, value)
    value_before_type_cast = record.__send__("#{attribute}_before_type_cast")
    # 省略 
    end
end
```

-  `[attribute名]_before_type_cast`
    -  型が変換される前の標準入力された値を取得することができる

### 特徴２: privateメソッドを呼び出すことができる
- セキュリティリスクに注意が必要である
- privateメソッドのテストをするときなどに使われる


# 関連するメソッド
## `send`メソッド
- Objectクラスのメソッド
- 使い方は `__send__` と同じ
- `send` は再定義される可能性があるため、`__send__`　が推奨される
> send が再定義された場合に備えて別名 __send__ も用意されており、ライブラリではこちらを使うべきです。また __send__ は再定義すべきではありません。


https://docs.ruby-lang.org/ja/latest/method/Object/i/send.html

## `public_send`メソッド
- Objectクラスのメソッド
- 使い方は `__send__`　と同じ
- ただし、呼び出せるのはpublicメソッドのみ
- protectedメソッドやprivateメソッドに対して実行した場合は NoMethodErrorrが発生する
>public メソッドだけ呼び出せれば良い場合は Object#public_send を使う方が良いでしょう。


https://docs.ruby-lang.org/ja/latest/method/Object/i/public_send.html
【備忘録】StepFunctionのパラメーターの渡し方について

## StepFunctionのパラメーターの渡し方
StepFunctionでLambdaを使用したステートマシンを作成した際に、Lambdaの出力とステートの出力をどのように次のステートに渡すのか忘れないように整理。


## InputPath
ステートへの入力をフィルタリングする。
Lambdaへの入力をフィルタリングしたい場合に使用する。

## OutputPath
ステートへの出力をフィルタリングする。
ステートの出力をフィルタリングしたい場合に使用する。

## Parameters
Lambdaへ渡したい入力を記載する。
ステートからの入力は捨てられる。

## ResultPath
Lambdaの出力をどのような名前でステートの出力へ渡すか。
以下例

入力
> "ResultPath": "$.lambda_output"

出力
> {
  "test1": 2,
  "test2": 1,
  "lambda_output": {
    "statusCode": 200,
    "body": "ファイルの処理とアップロードに成功しました。"
  }
}

以下の場合はLambda関数の出力だけがステートの出力になる。
> "ResultPath": "$"

以下の場合はLambdaの出力を捨ててステートの入力がステートの出力になる。
> "ResultPath": null

### 参考
https://dev.classmethod.jp/articles/stepfunctions-parameters-inter-states/
GAS HTML作成

# 概要
スプレッドシートの内容をHTMLに反映させるGASのスクリプト

```javascript:GAS
function createHtmlFromSheet(){
  // 定数
  const SHEET_NAME = 'シート名';
  const HTML_TEMPLATE = 'index' // html名

  // 対象のシートから情報を取得する
  let spreadSheet = spreadSheetApp.getActiveSpreadsheet();
  let targetSpreadSheet = spreadSheet.getSheetByName(SHEET_NAME);
  let contents = targetSpreadSheet.getRange(1,1,1,1).getValues();

  let html = HtmlService.createTemplateFromFile(HTML_TEMPLATE);
  html.contents = contents;

  // HTML吐き出し（マイドライブ上）
  let fileName = 'test.html';
  let content = html.evaluate().getContent();
  let mineType = MineType.HTML;
  DriveApp.createFile(fileName, content, mineType);
}
```

```index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset='utf-8'>
  <meta http-equiv='X-UA-Compatible' content='IE=edge'>
  <title>Page Title</title>
  <meta name='viewport' content='width=device-width, initial-scale=1'>
  <link rel='stylesheet' type='text/css' media='screen' href='main.css'>
  <script src='main.js'></script>
</head>
<?
  let a = contents[0][0];
  let b = contents[0][1];
  let c = contents[0][2];
?>
<body>
  <p><?= a?></p>
  <p><?= b?></p>
  <p><?= c?></p>
</body>
</html>
```
schema.prismaが見づらいので分割したい

# 概要
Prismaを使ったプロジェクトでは、テーブルが増えるにつれて`schema.prisma`ファイルが肥大化し、管理が難しくなるときがあります。そんなときは、previewではありますが、prismaSchemaFolderを使えば解決するかもしれません。

# 設定方法
- `schema.prisma`のgenerator clientに下記の一行を追加してください

```diff:schema.prisma
datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

generator client {
  provider        = "prisma-client-js"
+  previewFeatures = ["prismaSchemaFolder"]
}
```
- primsaディレクトリの下にサブディレクトリであるschemaを作成します
- schemaディレクトリで`schema.prisma`を作成します

これでschemaディレクトリに追加ファイルしても、自動でリレーションを貼れるようになります！


## サンプル

```diff
prisma/schema
        ├── schema.prisma
+       ├── user.prisma
+       └── post.prisma
```

```prisma:user.prisma
model User {
  id    Int     @id @default(autoincrement())
  name  String
  posts Post[]
}
```

```prisma:post.prisma
model Post {
  id       Int     @id @default(autoincrement())
  title    String
  content  String
  authorId Int
  author   User    @relation(fields: [authorId], references: [id])
}
```

prisma generateを実行するとすべてのスキーマファイルが結合されるためので、その後のワークフローも問題なく動くようです。



# まとめ

モデル数が増えてきたりして分割して管理したいなぁって時に便利です。
preview機能ではありますが、有用な場面は多そうです。

# 小ネタ
プロジェクトでprisma-erd-generatorを使っているのですが、こちらも問題なく動作しました

# 参考
https://www.prisma.io/blog/organize-your-prisma-schema-with-multi-file-support
パスワードの定期的な変更を強制された際に反論する材料

## これは何?

パスワードの変更は良くないよと言っている公式ドキュメントを集めました。
万が一，所属する組織がパスワードの変更を強制してきた際にはこの記事に貼ってあるドキュメントを盾に抵抗しましょう笑

※パスワードのローテーションにも良い面がないわけではないです。

---

## パスワードの定期的な変更を推奨しないガイドライン

- [NISC インターネットの安全・安心ハンドブック](https://security-portal.nisc.go.jp/guidance/pdf/handbook/handbook-06.pdf)

    > ### 1.8 パスワードの定期変更は基本は必要なし。ただし流出時は速やかに変更する
    > 利用するサービスによっては、パスワードを定期的に変更すること求められることがあります。しかし、前出のように十分に複雑で使い回しのないパスワードを設定した上で、実際にパスワードを破られアカウントを乗っ取られたり、サービス側から流出したりした事実がないのならば、基本的にパスワードを変更する必要はありません。 むしろ、パスワードの基準を定めず、定期的な変更のみを要求することで、パスワードが単純化したり、ワンパターン化したり、サービス間で使い回しするようになることの方が問題となります。 一方、アカウントが乗っ取られたり、流出の事実を知った場合は速やかにパスワードを変更し，その原因も特定しましょう。

- [NIST Special Publication 800-63B](https://pages.nist.gov/800-63-3/sp800-63b.html)

    > 5.1.1.2 Memorized Secret Verifiers
    > Verifiers SHOULD NOT impose other composition rules (e.g., requiring mixtures of different character types or prohibiting consecutively repeated characters) for memorized secrets. Verifiers SHOULD NOT require memorized secrets to be changed arbitrarily (e.g., periodically). However, verifiers SHALL force a change if there is evidence of compromise of the authenticator.

- [政府情報システムの情報セキュリティ対策のための統一基準（令和6年度版）](https://www.nisc.go.jp/pdf/policy/general/guider5.pdf)

  > 基本対策事項 7.1.1(1)-5「利用者に主体認証情報の定期的な変更を求める場合」について
  > 定期的な変更を促すことについて、「利用者に主体認証情報の定期的な変更を求める場合には」と改めて適用する場面を限定しているのは、生体情報のように利用者本人でも変更が不可能なものも主体認証情報に含まれていることが理由の一つであるが、これに限られず、主体認証情報がパスワードである場合に、その変更を強制することが用者の利便性を低下させ、利用者が強度の低い安易なパスワードを設定しやすくなるなど、結果的に主体認証機能の安全性を低下させる懸念が想定されることを踏まえて、定期的な変更が真に必要である場合に限り適用すべき基本対策事項であることを示す趣旨である。

  > パスワードを変更する目的は、パスワードを他の主体に不正に利用されることを未然に防止することにあるが、どの程度の頻度で定期的に変更すればこれを防止するだけの意義を果たすと言えるのかは一概に言うことはできない。例えば、利用者がパスワードを入力する様子を背後から盗み見られる事態を想定して、その不正利用を確実に防止するためにパスワードの定期的な変更を求めるのであれば、変更は毎日必要となり、現実的でない。一定の不正利用はやむを得ないとしつつ、長期間にわたって不正利用され続けることを防止することを目的とするのであれば、例えば、半年に 1 度の定期的な変更を求めている場合は、平均して 3 か月間の不正利用を許すことになる。許容できる不正利用の平均継続期間を 1 週間と想定した場合には、2 週間に 1 度の変更が必要となり、これも現実的でない場合が多いと考えられる。このような目的では他の対策を講じることの方が効果的である場合があり、そのような場合にはその対策の採用を検討するべきである。

---

## パスワードの定期的な変更を推奨しているガイドライン

- [PCIDSS 4.0](https://www.commerce.uwo.ca/pdf/PCI-DSS-v4_0.pdf)

    > Defined Approach Requirements
    > 8.3.9 If passwords/passphrases are used as the only authentication factor for user access (i.e., in any single-factor authentication implementation)
    > then either:
    > • Passwords/passphrases are changed at least once every 90 days,
    > OR
    > • The security posture of accounts is dynamically analyzed, and real-time access to resources is automatically determined accordingly

    90日に1回の変更もしくは，アカウントのセキュリティ状態が動的に分析され、それに応じてリソースへのリアルタイムのアクセスの可否が決定される仕組みを持つのどちらかが必要になります。

---

## 他にチェックしたガイドライン等

- [CIS Critical Security Controls](https://learn.cisecurity.org/cis-controls-v8-1-guide-pdf): 記載なし
- [金融分野におけるサイバーセキュリティに関するガイドライン](https://www.fsa.go.jp/news/r6/sonota/20241004/18.pdf): 記載なし
- [医療情報システムの安全管理に関するガイドライン　第6.0版（令和5年5月）](https://www.mhlw.go.jp/stf/shingi/0000516275_00006.html)

---

## チェック未実施

- [FISC金融機関等コンピュータシステムの安全対策基準・解説書](https://www.fisc.or.jp/publication/guideline_pdf.php): 有料