OmniAICreator/Qiita-1.07M huggingface dataset:
Debian用の仮想マシンをVirtualboxで作成し、Debianをインストールする（M1Mac）

# Debian用の仮想マシンをVirtualBoxで作成し、Debianをインストール（M1 Mac）

## はじめに
タイトル「Debian用の仮想マシンをVirtualBoxで作成し、Debianをインストール（M1 Mac）」からは、あたかも上手くいったかのように見えるかもしれません。しかし、結論から言えば、うまく行きませんでした。M1 Macにおいて、VirtualBoxを使用してDebian仮想マシンを作成することは、現時点では困難を伴う作業であることがわかりました。そこで本記事では、二度同じ道を踏まないために、参考にした記事と共に、私が経験した問題点と解決策を整理していきたいと思います。

## VirtualBoxのインストール

VirtualBoxをM1 Macにインストールする方法について、Web上の記事を調べたところ、大きく分けて二つの方法があることがわかりました。

1. HomeBrewを使用してインストール
2. Webサイト上からM1Macに対応した開発者向けのPreview版をインストール

### HomeBrewを使用する方法

M1 MacのCPUアーキテクチャ（arm64）は、現在VirtualBoxが対応していないアーキテクチャです。VirtualBoxの公式サイトにも、以下のように明記されています。

> VirtualBoxは、サーバー、デスクトップ、組み込み用途をターゲットとした、x86ハードウェア用の汎用フルバーチャライザーである。

つまり、M1 Macにネイティブでインストールすることはできないのです。

ただし、多くの記事で紹介されているように、Rosettaを使ってx86として認識させることで、HomeBrewを介してVirtualBoxをインストールすることは可能です。しかし、実際にインストールを試みたところ、仮想マシンを起動する段階で以下のエラー（NS_ERROR_FAILURE (0X80004005)）が発生し、起動に失敗してしまいました。


これは、HomeBrewでインストールされる最新版のVirtualBox（バージョン 7.0.14 r161095 (Qt5.15.2)）が、M1 Macに対応していないことが原因だと考えています。

### 参考記事
 https://qiita.com/YutoYasunaga/items/d0321756eccfce9a6d05
 https://qiita.com/k21071/items/55f81bdfc22a02b425d3
 
 

### Webサイト上からバージョンを選んでインストールする方法
　HomeBrewを使用する方法では、インストールまでは成功するものの、仮想マシンの起動に失敗するという問題がありました。また、その後仮想マシンを起動した事例が管見の限りでは見当たりませんでした。
 そこで、開発者向けのVirtualBox 7.0.8のベータ版を公式サイトからダウンロードし、インストールすることにしました。この方法なら、M1 Macにも対応しているはずだと考えたからです。
　しかし、この方法でも問題が発生しました。仮想マシンの起動自体は成功したのですが、肝心の仮想マシンへのアクセスに失敗してしまったのです。つまり、仮想マシンを立ち上げることはできたものの、実際に使用することができない状態に陥ってしまいました。

### 参考記事
 https://blog.oyasu.info/2023/05/05/8680/
 
 https://www.virtualbox.org/wiki/Download_Old_Builds_7_0

 
 
### VirtualBoxを用いたDebian起動
https://github.com/pasqualerossi/Born2BeRoot-Guide?tab=readme-ov-file#part-3---accessing-your-virtual-machine
を参考に２の方法でインストールした開発者向けのVirtualBoxはいい線までは行けたが、結局参考記事におけるPart 3 - Accessing Your Virtual Machineの箇所で問題が発生した。具体的には、installを押すとブラックアウトし、その後終了してしまうという問題である。それに対して、メモリや CPU、ビデオメモリを多く割り当てることで、解決を試みたが無理だったので、諦めることにした。

## まとめ

以上の経緯から、現時点でM1 MacにおけるVirtualBoxを使用したDebian仮想マシンの作成は、非常に困難であることがわかりました。ます。
大学1回生がソリューションエンジニアとして働いてわかったこと

# はじめに
こんにちは、学生エンジニアのMasamichiです。最近大阪に引っ越したのですがあまりのアクセスの良さにびっくりしてます。ただ車を運転したいなとは思わなくなりました()

今回は、2023年11月〜2024年2月まで株式会社プレイドにてエンジニアインターンに参加してきたので、その体験記を書いてみました。

# インターンについて
## ポジション
僕が今回ついたポジションは[カスタマーエンジニア](https://www.wantedly.com/projects/1418410)という職種です。
※僕はこの部署の中で特にソリューションエンジニアという配役だったので、今回はソリューションエンジニアという職業について言及しています。

## 仕事内容
社内では自社SaaSである「KARTE」の**ソリューション開発をする**という仕事をしました。具体的には、導入企業からご意見をいただいたり社内で新たな使い方を検証したい機能を、設計・実装・発信するという一貫したプロセスを体験できました。以下に自分が実装したソリューションの一覧を載せておきます。

https://solution.plaid.co.jp/2023012-counter-notification-slack

https://solution.plaid.co.jp/202312-show-only-once-per-group

https://solution.plaid.co.jp/202402-line-diagnose-content

https://solution.plaid.co.jp/202402-kvs-based-notification-inbox

# 気づき・学び

## PRの粒度
会社のリポジトリに入りメンターの方にコードレビューを受ける中で、そのPR粒度の高さに驚きました。業務を行うときは、ベースの完成像のイメージがズレて行かないように細かく認識を擦り合わせる機会があり、それがコードレビューにも現れていました。

仕事に慣れていく中で、次の流れが仕事をしやすくなりました。

1. ソリューションの設計
1. 設計におおまかに沿ったミニマムを作成する
1. 実装ベースでコードレビューを受ける
1. コアを完成させる
1. コードレビューでコードをクリーンにする
1. 仕様を変更・追加する or 完成
1. 5に戻る

また、コード管理を行う上で、Github Actionsを使ってESlint, Prettierなどを使用することでフォーマットを統一でき、コードレビューのコストを減らすための工夫ができていて、レビュアーが構文とロジックを指定するだけで良いという状態になっていました。強いていうなら構文まで統一してPR前にチェックしてくれるともっといいなと思いました。

## テンプレート化を意識したコード
前述で少し触れましたが、全社的にコード管理はかなり徹底されていた印象です。とりわけ自分がいたカスタマーエンジニアチームでは、実装したコードがそのまま導入企業で使われるテンプレートになるので、特に品質管理の意識が高かったです。

レビューを受けていく中で、注意された・意識を向けた点の例を少し上げてみます。

### ロジック
- ユーザーがセグメントから外れたときにメイン関数からすぐに脱出しているか
    - セグメントから外れたときに`return`しないとメインの一番下まで処理を読み込んでしまうため
- メイン関数を読むだけで処理の流れが完全に掴めるか
    - 複雑なロジックは関数に切り出す、必要な処理はメインで見せるようにするなどの工夫をする
- `read/write`などの負担がかかる処理を呼び出し過ぎていないか
    - 処理速度が下がりそうな処理に対して適切に`async/await`の使用ができているか、ネストし過ぎていないか、など

など

### コード管理
- よりストレスフリーに読めるコードフローを意識する
    - 何でもかんでも三項演算子を使えば良いというわけではなく、三項演算子を使って一行で書いた方がわかりやすい時のみ有効、など
- ロギングが使用時に有用であるか
    - ロギングを行うときに、「**何**」が「**どの部分**」で「**どんな値**」を取得して「**何**」に「**成功/失敗**」したのかが一撃で理解できないロギングは修正する、また`debug`で出すのか`info`で出すのかもロギングの実行回数から逆算して記述する
- 処理のフローに沿わないものは、メインの最初に記述する
    - データの取得やAPI認証など

など

## 設計の難しさ
働いてわかったことは、実装以上に設計が難しいということです。自分も仕事をするときは、実装に入る前は必ず**設計のレビュー**を繰り返ししてもらいました。

具体的には、企画で出た要件を設計に落とし込んでいくだけなのですが、よく起こりがちな「**設計しているうちに要件が膨らんでいく**」ということを防ぐために、一機能の設計ができたら認識を擦り合わせる、ということを繰り返し行うことで、他にイメージの焦点がずれないように工夫をしました。


# 終わりに
今回は自分がエンジニアインターンとして働いた成果・活動についてまとめましたこの記事への感想やコメント・評価を[Twitter](https://twitter.com/ma_kanakubo)なりDMなりでいただけるととても喜びます。ほなまた
scpコマンドでAWSのEC2とローカル間でファイル・ディレクトリを転送する

## scpコマンド

```cmd:ローカル→EC2
scp -i <秘密鍵のパス> <転送元のパス> <ユーザー名>@<パブリックIPアドレス]>:<転送先のパス>
```
```cmd:EC2→ローカル
scp -i <秘密鍵のパス> <ユーザー名>@<パブリックIPアドレス]>:<転送元のパス> <転送先のパス>
```

## ローカル→EC2の例

ユーザー名がec2-userで、EC2の/home/ec2-userディレクトリに転送する場合

```cmd:ファイルを転送する
scp -i <秘密鍵のパス> -i <転送するファイルのパス> ec2-user@<パブリックIPアドレス>:/home/ec2-user/
```
```cmd:フォルダを転送する
scp -i <秘密鍵のパス> -r <転送するフォルダのパス> ec2-user@<パブリックIPアドレス>:/home/ec2-user/
```

秘密鍵はダウンロードされた.pemファイルのこと。
ファイルの時は-i、フォルダ（ディレクトリ）の時は-rを前につける

## EC2→ローカルの例

ユーザー名がec2-userで、EC2の/home/ec2-user/hoge.txtを転送する場合

```cmd:ファイルを転送する
scp -i <秘密鍵のパス> -i ec2-user@<パブリックIPアドレス>:/home/ec2-user/hoge.txt <転送先のパス>
```
EC2の/home/ec2-user/hogeフォルダを転送する場合
```cmd:フォルダを転送する
scp -i <秘密鍵のパス> -r ec2-user@<パブリックIPアドレス>:/home/ec2-user/hoge <転送先のパス> 
```

## 参考
https://qiita.com/jun_aws/items/62c248c5b06a3051a27d

https://qiita.com/pugiemonn/items/3c80522f477bbbfa1302
SharePointのアップロードで謎のエラーが発生

SharePointにファイルをアップロードしていたところ、謎のエラーが発生し、アップロードが失敗しました。
ファイルは2GBのzipファイルです。
エラーメッセージは以下です。一部を●に置き換えています。

```
Error= Value=Quota Exceeded,
Tag=●●●●●●●●●●,
Message=Exception=Microsof...
Message=An unexpected error has occurred., Chained= W (Value=●●●●●●●●●●,
Message=An unexpected error has occurred.)
```

以下のことを試しました。
1.別のフォルダに格納してみる
  →エラーとなる
2.再ログインしてみる
　→エラーとなる
3.別のファイルを格納してみる
　→小さいファイルは格納できる

試した結果だと容量に関するエラーのようです。

管理者に問い合わせたところ、容量がいっぱいになっていたことが判明し、対策を考えることができました。
更新系APIの状態不整合の解決策　非同期の照合ファイル

# はじめに　このページを読んでわかること
[更新系APIのタイムアウトで発生する課題](https://qiita.com/okotaniki/items/b4fb6210ebe6900d1f8e)でまとめたクライアントとサーバの状態不整合の解決策として、非同期の照合ファイルを利用する設計において考慮すべきことをメモしておく。

# 非同期の照合ファイルのシーケンス
#### 更新リクエストがタイムアウト後、照合ファイルでサーバ側の状態を確認する
照合ファイルの状態”データなし”に、クライアント側の状態を一致させる。(状態不整合として課題はない)

```plantuml
クライアント->x サーバ : 更新リクエスト(1回目)
note left:状態遷移　初期状態→不明
== 非同期(日次など) ==
note right:データなし
クライアント->サーバ:照合ファイル要求
サーバ--> クライアント : 照合ファイル"データなし"
クライアント-> クライアント : 状態遷移
note left:状態遷移　不明→初期状態
```

#### 更新レスポンスがタイムアウト後、照合ファイルでサーバ側の状態を確認する
照合ファイルの状態”処理済み”に、クライアント側の状態を一致させる。(状態不整合として課題はない)

```plantuml
クライアント->サーバ : 更新リクエスト(1回目)
note right:処理済み
サーバ-->x クライアント : OK
note left:状態遷移　初期状態→不明
== 非同期(日次など) ==
クライアント->サーバ:照合ファイル要求
サーバ--> クライアント : 照合ファイル"処理済み"
クライアント-> クライアント : 状態遷移
note left:状態遷移　不明→処理済み
```

# 結論
照合ファイルにより状態不整合の課題は解決する。
しかし、実務の課題として、非同期の照合ファイルを受領するまでの間、クライアント側の状態を"不明"のままにしておくことが許容されないサービス要件であることが多いと推測される。なぜなら、更新リクエスト自体がバッチ処理ではなく、オンライン処理を用いていることから、サーバ側の処理結果がクライアント側で即座に必要なためと思料される。
1から学ぶ「Teradata」(第3回)- VantageCloud Enterprise運用編

# 前回からの振り返り
前回はVantageCloud Enterpriseの構築について記載しました
※前回の記事：https://qiita.com/NTTD-niwats/items/bdfe7510be76fd31648d

# 今回のテーマ
今回はVantageCloud Enterprise運用について記載します。

## 1.障害復旧における責任範囲
SaaS版のVantageCloud Enterpriseですので、データベース/監視のサーバなどが停止した場合（障害）にはTeradata社が復旧してくれます。
ただし、業務アプリの処理中にデータベースが再起動した場合など、利用者側の処理においては対象外となりますのでご注意ください。

### 重大度レベル(severity)
4段階のレベルがあり、いずれの場合においてもサポートポータルに登録されているユーザにメール通知されます。サンプルは以下です。
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3695372/fc4d6db0-4a35-7207-9096-aec5dcc76365.png)

|Severity|説明|
|-------|-------|
|1|データベースの障害など、データベースにアクセスできない場合など重大な問題が発生した場合||
|2|バックアップ機能、監視用のダッシュボード、監視通知ができないなどのデータベース以外のサーバによる障害が発生している場合||
|3,4|その他の事象が発生した場合||

上記の表からわかるようにバックアップを計画的に取得し、バックアップ後に業務ジョブを起動している場合には業務の影響があるため、 __レベル１,2が発生した場合には放置することなく状況を把握するべきです。__ 
レベル3,4に関しては業務への影響はない事象のようですので放置してもよいかと思います。

## 2.セキュティ/監査における責任分担範囲
セキュティに関する問題が発生した場合について
|セキュティ問題|対処|
|-------|-----|
|脆弱性の問題が発生|脆弱性に対する暫定処置は即時対応<BR>恒久的な対応は利用者の承認の確認後に実施|
|サーバに対する不正アクセス|利用者側からの依頼に基づきTeradata社からアクセス情報を提供する|
|データベースの不正操作|データベース内の監査情報テーブルを参照する<BR>・DBC.EVENTLOG<BR>・DBC.DBQLOGTBL<BR>・DBC.DBQLSQLTBL<BR>・DBC.ACCLOGTBL|

## 3.サポートポータルによる問い合わせ
Teradata社に障害、技術的な問い合わせを行う場合には必ずサポートポータルに記載する必要があります。サポートポータルの登録時にSeverityがあり、上記のデータベースの障害時は迅速に回答いただけます。バックアップ機能などデータベースに直接関連しない機能の障害は最大6時間をメドに回答、技術的な問い合わせは最大2週間となります。
__※技術的な問い合わせを行うかなりの期間を要しますのでご留意ください。__


## データベース設計について
運用する上で必要な情報や作業について次の記事で書きます。
※1から学ぶ「Teradata」(第4回)- データベース設計編
https://qiita.com/NTTD-niwats/items/f3d86f8660a90ad828cc

# 仲間募集
NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary>1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)</summary>
クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer
</details>

<details><summary>2. データサイエンス領域（データサイエンティスト／データアナリスト）</summary>
データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist
</details>

<details><summary>3.お客様のAI活用の成功を推進するAIサクセスマネージャー</summary>
DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=804
</details>

<details><summary>4.DX／デジタルサクセスを推進するデータサイエンティスト</summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=898
</details>
pyo is not used unless python -OO is used

```sh
rm -rf __pycache__ *.pyc *.pyo
cat >mymodule.py <<EOM
def greet():
    assert False
EOM
cat >main.py <<EOM
import mymodule
mymodule.greet()
EOM

python -OO -m py_compile mymodule.py
strace python main.py 2>&1 | grep mymodule
```

You will be surprised that pyo is not used.

```
openat(AT_FDCWD, "/home/devel/python_compile_test/mymodule.pyc", O_RDONLY) = -1 ENOENT (No such file or directory)
unlink("/home/devel/python_compile_test/mymodule.pyc") = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/home/devel/python_compile_test/mymodule.pyc", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0100644) = 4
```

Meanwhile these works:

```sh
python -m py_compile mymodule.py
strace python main.py 2>&1 | grep mymodule
```

```sh
python -OO -m py_compile mymodule.py
strace python -OO main.py 2>&1 | grep mymodule
```

This is reproducible on both Python2 and Python3.

This means that pycache's optimization level and python running optimization level must be the same.
Python の dict のキー 1.0 と 1 は同一視される（そして True も！）

Python のキーで、int と float、つまり整数と浮動小数点は同一視されるようでした。たとえば 1.0 と 1 は同一視されるようです。仕組みは、謎です。

# コード

```python
a = {}
a[1] = 100
a[1.0] = 200
print(a) # => {1: 200}
```

キーは最初に指定した値が採用されるようです。

```python
b = {}
b[1.0] = 300
b[1] = 400
print(b) # => {1.0: 400}
```

`__hash__` の値を見てみましょう。

```python
(123).__hash__() # => 123
(123.0).__hash__() # => 123
(123.456).__hash__() # => 1051464412201451643
```

なるほど！ 驚きですね！

Python 3.5 のドキュメントに書いてありました。

> Numeric values that compare equal have the same hash value (even if they are of different types, as is the case for 1 and 1.0).

https://docs.python.org/3.5/library/functions.html#hash

詳しい説明も見つけたので貼っておきます。

https://stackoverflow.com/questions/32209155/why-can-a-floating-point-dictionary-key-overwrite-an-integer-key-with-the-same-v

# 感想

Python では `1 == 1.0` が成立するので、dict のキーにおいて 1.0 と 1 が同一視されるのは合理的な気もしますね。こういった言語に触れたことがあまりなかったので、個人的には新鮮でした。

# ※追記

コメントで指摘いただきましたが、True / False も 1 / 0 と同一視されるそうです。@shiracamus さんありがとうございます。

以下の記事で詳しく説明されています。

https://qiita.com/shiracamus/items/29129b19bc05dffd5612

```python
a = {};
a[1] = 100
a[1.0] = 200
a[True] = 300
print(a)               # => {1: 300}
print(1 == True)       # => True
print(True.__hash__()) # => 1
```

```python
a = {};
a[0] = 100
a[0.0] = 200
a[False] = 300
print(a)                # => {0: 300}
print(0 == False)       # => True
print(False.__hash__()) # => 0
```

# ※追記2

そんな馬鹿なと思ったのですが、Fraction と Decimal もそうらしいです。

```python
from fractions import Fraction
from decimal import Decimal

a = {}
a[1] = 100
a[1.0] = 200
a[True] = 300
a[Fraction(999, 999)] = 400
a[Decimal(1)] = 500
print(a) # => {1: 500}
```

https://twitter.com/tanaka_gabber/status/1772189162499670381
OR と ANDの違い🧐

# OR と ANDの違い🧐

`||`と`&&`の違いです。
下記に実行結果を記します。

```
(lldb) po true || false
true
(lldb) po true || true
true
(lldb) po false || false
false
(lldb) po true && false
false
(lldb) po true && true
true
(lldb) po false && false
false
```

　`||` の場合と、`&&`の違いは、双方が違う場合の返り値が違います。下記を見ていただくとわかります。
簡単そうで、この違いを理解しているとしていないでは、コードの簡潔さが断然違うと思います。
 
 ```
(lldb) po true || false
true
(lldb) po true && false
false
 ```

 以上です。
更新系APIの状態不整合の解決策　参照リクエスト＆リトライ 文書番号A03

# はじめに　このページを読んでわかること
[更新系APIのタイムアウトで発生する課題](https://qiita.com/okotaniki/items/b4fb6210ebe6900d1f8e)でまとめたサーバ間の状態不整合の解決策として、参照リクエストでサーバの状態を確認後、(必要に応じて)更新リクエストを再送する(リトライ)する設計において考慮すべきことをメモしておく。

# 参照リクエスト→リトライのシーケンス
#### 更新リクエストがタイムアウトして参照リクエストを送信
参照リクエストでサーバ側にデータがないことを確認してから、更新リクエストを再送する。(課題はなし)
```plantuml
サーバA->x サーバB : 更新リクエスト(1回目)RequestID=001
note left:状態遷移　初期状態→不明
note right:データなし
サーバA-> サーバB : 参照リクエストRequestID=001
サーバB-->サーバA:データなし
サーバA-> サーバB : 更新リクエスト(2回目)RequestID=001
note right:処理済み
サーバB-->サーバA:OK
note left:状態遷移　不明→処理済み
```

#### 更新レスポンスがタイムアウトして参照リクエストを送信
参照リクエストでサーバBにデータがあることを確認できたので、更新リクエストの再送をせず処理終了。(課題はなし)
正常ケース
```plantuml
サーバA->サーバB : 更新リクエスト(1回目)RequestID=001

note right:処理済み
サーバB-->x サーバA : OK
note left:状態遷移　初期状態→不明
サーバA-> サーバB: 参照リクエスト　RequestID=001
サーバB-->サーバA:処理済み
note left:状態遷移　不明→処理済み
```
業務エラー
```plantuml
サーバA->サーバB : 更新リクエスト(1回目)RequestID=001

note right:更新リクエストを業務エラー※と判定したので処理なし
サーバB-->x サーバA : 業務エラー
note left:状態遷移　初期状態→不明
サーバA-> サーバB: 参照リクエスト　RequestID=001
サーバB-->サーバA:業務エラー
note left:状態遷移　不明→業務エラー
```

# リトライ→参照リクエストのシーケンス
リトライを先に
```plantuml
サーバA->x サーバB : 更新リクエスト(1回目)RequestID=001
note left:状態遷移　初期状態→不明
note right:データなし
サーバA-> サーバB : 更新リクエスト(2回目)RequestID=001
note right:処理済み
サーバB-->サーバA:OK
note left:状態遷移　不明→処理済み
```

```plantuml
サーバA->サーバB : 更新リクエスト(1回目)RequestID=001
note right:処理済み
サーバB-->x サーバA : OK
note left:状態遷移　初期状態→不明
サーバA->サーバB : 更新リクエスト(2回目)RequestID=001
サーバB--> サーバA : RequestID重複エラー
サーバA-> サーバB: 参照リクエスト　RequestID=001
サーバB-->サーバA:処理済み
note left:状態遷移　不明→処理済み
```

```plantuml
サーバA->サーバB : 更新リクエスト(1回目)RequestID=001
note right:更新リクエストを業務エラー※と判定したので処理なし
サーバB-->x サーバA : 業務エラー
note left:状態遷移　初期状態→不明
サーバA->サーバB : 更新リクエスト(2回目)RequestID=001
サーバB--> サーバA : RequestID重複エラー


サーバA-> サーバB: 参照リクエスト　RequestID=001
サーバB-->サーバA:業務エラー
note left:状態遷移　不明→業務エラー
```
[Docker][NestJs][Jwt]ある日突然発生した「secretOrPrivateKey must be a symmetric key when using HS256」

# はじめに
毎度お馴染み何もしていないのにDockerが壊れたと思ったら、DockerではなくどうやらJwtの方に原因があるようです。
忘れないようにメモします。

環境：
- Docker
- NestJs
- Jwt認証
- ssh-keygen


# 問題とコード
NestJSでJwt認証を行う以下コードで発生しました
```ts
    this.jwtService.signAsync(payload, {
        secret: this.configService
          .get('auth.jwtSecret.accessToken')
          .replace(/\\n/g, '\n'),
          .algorithm: 'RS256',
        expiresIn: 60 * 60,
      }),
```
```
secretOrPrivateKey must be a symmetric key when using HS256
```


この環境で開発を始めて数ヶ月、始めて発生する現象です。
エラーの原因は認証方法がHS256(デフォルト)の処理にRS256ので作成した秘密鍵を入れていたからです。

しかし、これまで問題なく動いていたのに急になぜ？
envファイルをいじってしまったのか、なにかインポートの設定でも変えてしまったのか、
色々調査や再設定を行いましたが、急に現象が発生した理由についてはわかりませんでした。


# 解決
RS256を使用した秘密鍵を作成します。
passphraseは指定しません。

```
ssh-keygen -t rsa -b 4096 -f RS256.key
```
```
ssh-keygen -p -f RS256.key -m pem
```
```
openssl rsa -in RS256.key -pubout -outform PEM -out RS256.key.pub
```


# おわり
Macのせいなのか、Dockerのせいなのか、私がなにかしてしまったのか。
根本的な原因はわかりませんが、とりあえず解決してよかったです。
これで作業が進められます。。。



# 参考
https://www.millionwaves.com/development/auth/3180
360度カメラの撮影像からモデリングする

RICOH THETAやinsta360といった　上下左右360度一気に撮影できる
全天球カメラというのがあります

Blenderのシェーダーを利用して撮影空間をラフに再現する方法を解説したいと思います
![22021101-.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/c661ffed-d613-8a43-0bc3-21104149785c.gif)
## オブジェクト基準の座標と座標変換
３６０度カメラの撮影データは正距円座標の画像データとして取得できます
また、Blenderシェーダーには　特定のオブジェクトを基準にした座標を取得する機能があります
つまり　うまく撮影座標とオブジェクトの位置を計算できれば　撮影空間を再現できます

空間上の任意の座標[x,y,z](Z-UP)を正距円筒図法[u,v]に変換する式は
$u = atan(x/y)$
$v = atan(z/sqrt(x^2 + y^2))$
となり

これをBlenderのシェーダーのノードで再現するとこうなります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/1d655c89-9d74-339c-2e3f-0c82faf2654b.png)
u,v それぞれが360度や180度をラジアン変換で除算されているのは
シェーダーでの角度の単位がラジアンで テクスチャの座標が0.0~1.0の値で表されるため
Y座標で0.5を引いているのはカメラの位置が画像の中心を表すようにするオフセットです
キャプチャは円筒の面を反転した状態で裏面を非表示状態にしています

## モデリング
撮影条件の疑似的な再現の場合には　円筒や球体への投影だけでいいかもしれませんが
シェーディング状態のままモデルの編集ができるBlenderの利点を利用した
もう少し細かいモデルの作成方法を例示したいと思います

まずは さきほど基準に設定したEmptyオブジェクトを撮影時のカメラの高さに合わせて
地面位置に合わせた面を作成してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/f4d4600c-c1a9-7c98-de93-cf068294057e.png)
大まかな床面の形は合ってそうに見えますね
鉛直方向の板ポリゴンを床との境目に作成すれば壁が作れます。
このように　撮影地の既知のデータを基準に未測定だったものも含めた空間の再現ができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/ef67983a-b370-f09d-1a92-2ed708ee96ab.png)

:::note
冒頭の動画作成時は壁は間取り図でも既知だったので壁面を配置して
さらに細かいディテールは壁面に辺を追加した上で押し出しといった方法で作っています
:::

## 活用例
今回の例は以前の引越しの検討先で 家具を置いてみたらどうなるのかを検証に使った時のものです
![22032701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/f9053fd9-eafd-effc-c1f2-89890b7b53e1.png)
複数のカメラの結果をミックスして　ここまで例示したものよりも広い範囲を２時間程度で作れました

::: note
BlenderにはVRヘッドセットを使ってビューをVR表示するアドオンもあるので
この時はVR空間で家具の収まり具合を確認しました
:::


また、この方法でビル街を撮影して地上からの見え方を再現するといったこともやりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151493/e1f7ce72-b141-ddc7-6a63-5f9a641434a3.png)
地道な手段ではありますが応用の効く方法ではないかなと思います。

尚、360度カメラの撮影像も　光学的特性から実際には正確な円筒座標ではありませんので
校正データを作成して業務に使用しています
校正データの作成方法や使用法の概要も以前記事にしましたので参考にしてください
https://qiita.com/yukimituki11/items/c357b40021ce456d8a36


何かの参考になれば幸いです
【Apache】リバースプロキシでBasic認証を設定したら「500 Internal Server Error」が出た時の解決方法

## はじめに
備忘録
どなたかのお役に立てれば幸いです。

## 問題の詳細
`.htaccess`ファイルと`.htpasswd`を置き、Webサイトにアクセス後、ちゃんとBasic認証の画面が出た。

その後、入力したユーザー名とパスワードは合っているはずなのに、なぜか500エラーが出た。

## 解決方法
まず、エラーログを確認してみます。

```bash
$ cat /var/log/apache2/error.log
```

以下の2パターンに遭遇しました。

```bash
# パターン1
AH01617: user username: authentication failure for "/path/to/.htpasswd": Password Mismatch
```

```bash
# パターン2
Permission denied: Could not open password file: /path/to/.htpasswd
```

### パターン1
こちらは、`htpasswd`コマンドを使って`.htpasswd`ファイルを作ることで解決しました。

`vim`などで自分で作成した`.htpasswd`ファイルだと、うまく動作しないそうです。

具体的には、コマンドで作成すると、以下のように、パスワードの部分を自動で暗号化してくれるみたいです。

ただ、暗号化の種類がいくつかあるようなので、Webサイト上で`.htpasswd`を作成してくれるサイトよりは、ターミナル上で`htpasswd`コマンドを実行した方が確実かもしれません。

:::note
Basic認証の画面上では、自分で設定したパスワードを打てば認証されます。
わざわざ暗号化されたパスワードを打つ必要はありません。
:::

```bash:.htpasswd（自分で作成）
$ vim /path/to/.htpasswd
username:testpassword
```

```bash:.htpasswd（コマンドで作成）
$ htpasswd -c /path/to/.htpasswd username
New password: 
Re-type new password: 
Adding password for user username

$ cat /path/to/.htpasswd
username:$apr1$cPda4fWy$cASDFTf90/DojGK89UJkr9
```

ちなみに、以下のコマンドを実行することで、`.htpasswd`の中身を更新できます。

```bash
$ htpasswd -b /path/to/.htpasswd username newpassword
```

### パターン2
こちらは、単純にパーミッションの設定がうまくいってない場合もありますが、自分の場合は、`.conf`ファイル内でのBasic認証の記述が間違っていました。

`<Proxy *> ~ </Proxy>`や`<Directory /your/site/path> ~ </Directory>`も試しましたが、結局、以下のように変更することで、Basic認証後も500エラーが出ることなく、Webページが正常に動作するようになりました。

```conf:mysite.conf
<VirtualHost *:80>
  ServerName mysite.example.com
  ProxyPass / http://127.0.0.1/
  ProxyPassReverse / http://127.0.0.1/
  <Location "/">
    AuthType Basic
    AuthName "Basic Authentication"
    AuthUserFile /path/to/.htpasswd
    Require user username
  </Location>
</VirtualHost>
```
バッチ2

```
@echo off

REM カレントディレクトリ内のすべてのzipファイルに対してループ
for %%i in (*.zip) do (
    REM zipファイルを展開
    powershell -command "Expand-Archive -Path '%%i' -DestinationPath '%%~ni'"
    
    REM zipファイルを削除
    del "%%i"
)

exit
```
バッチ1

```
@echo off

REM MSIのインストール
msiexec /i "path_to_your_installer.msi" /qn /norestart

REM レジストリからインストール先のパスを取得する例
for /f "tokens=3*" %%A in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{YourAppGUID}" /v "InstallLocation" 2^>nul') do (
    SET "INSTALL_PATH=%%B"
)

REM インストール先にファイルをコピーする前に、ファイルが存在するか確認
IF EXIST "%INSTALL_PATH%" (
    REM コピー元とコピー先のファイルパスを指定してコピーを行う
    copy "source_file_path" "%INSTALL_PATH%\destination_file_name"
    REM 別のファイルをコピーする場合は、上記の行を追加する
) ELSE (
    echo Installation directory not found.
)

exit
```
New RelicのSNMP機能を活用したデバイス検出方法入門

# はじめに
　New Relicは、アプリケーションやインフラのモニタリングを実現にするオブザーバビリティプラットフォームです。特に、Network Performance Monitoring（NPM）のSNMP機能を使用すると、ネットワークデバイスの死活監視からトラフィック分析まで、詳細な監視が可能です。

 　このガイドでは、New Relic NPMでデバイスを手動で検出する基本コマンドと手順について紹介します。

:::note info
最新のアップデートの詳細はこちら
[New Relic アップデート一覧](https://newrelic.com/jp/blog/nerdlog/new-relic-update  "New Relic アップデート一覧")
:::
:::note info
[New Relic株式会社のQiita Organization](https://qiita.com/organizations/newrelic)では、新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::

　今回紹介する New Relic NPM は、無料アカウントでも利用できます。是非永久無償ライセンスを[こちら](https://newrelic.com/jp/sign-up-japan)から試してみてください。

https://newrelic.com/jp/sign-up-japan

# デバイス検出のための準備
### デバイス（検出される側）の準備
 デバイス検出を開始する前に、ネットワークデバイスがSNMPプロトコルに対応していて、かつSNMPが有効になっていることを確認します。更に、検出を行うサーバーからのSNMPリクエストを受け入れるように設定してください。
### ktranslate(検出する側)の準備
　New RelicのNPMを最大限に活用するため、ktranslateというツールの設定が必須です。このツールはSNMPを用いてネットワークデバイスの情報を収集し、New Relicに送信します。SNMP設定ファイル（snmp-base.yml）のdiscoveryセクションには、検出対象デバイスのIPアドレス範囲（CIDR）、SNMPのプロトコルバージョン、コミュニティ名などの情報を設定します。

 　例えば、デバイスを検出するIPアドレスの範囲が`192.168.100.0～192.168.100.255（192.168.100.0/24）`で`SNMP v2c` で認証情報にコミュニティ名 `public` を使用する場合のdiscoveryの設定は下記になります。

```yaml:デバイスを検出するための設定
discovery:
    cidrs:
        - 192.168.100.0/24
    ignore_list: []
    debug: false
    ports:
        - 161
    default_communities:
        - public
    use_snmp_v1: false
    default_v3: null
    add_devices: true
    add_mibs: true
    threads: 4
    check_all_ips: true
```


# デバイス検出コマンド
　以下のコマンドを使用して、ktranslateをDockerコンテナとして実行し、snmp-base.yamlに基づきデバイス検出を実施します。-snmp_discoveryオプションにより検出専用のプロセスが実行されます。
```console:デバイスの検出後に処理が終了します
docker run --rm \
-v `pwd`/snmp-base.yaml:/snmp-base.yaml \
-e NEW_RELIC_API_KEY=$YOUR_NR_LICENSE_KEY \
kentik/ktranslate:v2 \
　　　　-snmp /snmp-base.yaml \
　　　　-snmp_discovery \
  -nr_account_id=$YOUR_NR_ACCOUNT_ID \
 　　nr1.snmp
```
検出されたデバイスの一覧は、`snmp-base.yaml` に追記されます。実行結果は、`snmp-base.yaml`を確認してください。

ktranslateはこのほかにもオプションを用意しています。コマンドのオプションはktranslateのGitHub上に公開されているので確認してみてください。

https://github.com/kentik/ktranslate

# まとめ
　New Relicを利用したデバイス検出は、ネットワーク監視の基本であり、監視体制の強化に不可欠です。この記事で紹介した手順に従って、SNMP機能を活用し、監視対象のデバイスを効率的に特定することができます。New Relicのオブザーバビリティプラットフォームを通じてネットワークの健全性を確保し、運用の課題に迅速に対応しましょう。

　監視体制の構築と継続的な改善を心がけ、ビジネスの成長と持続可能性を支えるネットワーク管理を目指してください。


:::note info
[New Relic株式会社のQiita OrganizationOrganization](https://qiita.com/organizations/newrelic)では、
新機能を含む活用方法を公開していますので、ぜひフォローをお願いします。
:::
Kubernetesに環境変数を.envから入れる方法

# .envを直接読み込むことはできない

Kubernetesのコンテナ環境変数は、直接.envファイルから読み込むことはできないらしいです。しかし、**ConfigMap**や**Secret**リソースを使って.envファイルの内容をKubernetes環境にインポートし、それをPodの環境変数として利用することは可能です。

## .envをConfigMapに変換する
.envファイルをConfigMapに変換するには、以下のように`kubectl`コマンドを使うことができます。

```bash
kubectl create configmap my-config --from-env-file=.env
```

このコマンドでConfigMap名`my-config`が作成され、.envファイルの各行がキー・値となります。

そして、このConfigMapをPodで使うことで、環境変数として.envファイルの値を利用することができます。以下はPodの設定例です：

```pods.yaml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    envFrom:  # ConfigMapを環境変数としてimportする
    - configMapRef:
        name: my-config  # 先程作成したConfigMap名を指定
```

このように設定することで、Pod内のアプリケーションは.envファイルの各行を環境変数として参照することができます。ただし、機密情報を含む場合にはSecretリソースの使用を検討するなど、セキュリティ対策にも注意が必要です。
WindowsでLinuxをお勉強する/CentOSインストール時の落とし穴

Linuxをお勉強するならMacが楽らしいのですが、そんなことを言っても手持ちがWindows…
仕方なくUdemyでWindows対応っぽい講座を受講するも講師の環境はMac…絶望ですね。

しかし、ここで諦めてはいけません。強く生きていきましょう。

今回はLinuxのお勉強に向けた環境構築(Windows向け)をお話します。

最初の難関…それがCentOSのダウンロード。
早速手順とつまずきポイントを開設します。


1.まず、CentOSの公式サイトへ行きます。
https://www.centos.org/download/

2.次に、Downloadのタブへ移動。

3.そしてX86_64を選択。

The following mirrors in your region should have the ISO images available:

と出てくるのですが、.jpが含まれるものなら何でも良いらしいです。

ここはこだわらずいきましょう。

で、ここから先がwindowsの落とし穴(躓きポイント)です。

4.CentOS-7-x86_64-DVD-2009.iso
これをインストールしましょう。
講師の方はMacでそのままいい感じにインストールできていたようですが、Windosはどうやら選ぶ必要があるようです。そして、なんとなく軽い方がいいのかな？と「Minimal」を選択すると後々の設定でソフトウェアの選択が表示されなくなります。

同じ箇所でお困りの方がいたらぜひお役立てください！
(架空の)更新系APIの仕様

# はじめに
[更新系APIのタイムアウトで発生する課題](https://qiita.com/okotaniki/items/b4fb6210ebe6900d1f8e)を整理するために架空の更新系APIの仕様をまとめる。
実際には存在しないAPIだが、更新系APIを一般化したつもり。

#### プロトコル
- HTTP or HTTPS
- POST,SOAP,JSONをイメージ

#### 通信要件
- パブリックインターネット,LAN,Private IP-NWをイメージ
- サーバ間通信(つまりクライアントはブラウザではない)

#### リクエストの種類
|No|状態|説明|備考|
|---|---|---|---|
|1|更新リクエスト||Authorization request|
|2|取消リクエスト||Cancel request|
|3|参照リクエスト|サーバ側の状態は遷移はしない|Query request|
|4|ファイルリクエスト|照合ファイルを返却する|Reconciliation file|

#### サーバの状態遷移図
```mermaid
graph TD;
    初期状態-->|更新リクエスト|更新処理中;
    更新処理中-->|　|処理済み;
    処理済み-->|取消リクエスト|取消処理中;
    取消処理中-->|　|取消;
```

#### クライアントの状態遷移図
```mermaid
graph TD;
    初期状態-->|更新リクエスト|処理済み;
    処理済み-->|取消リクエスト|取消;
    初期状態-->|更新リクエストのタイムアウト|不明;
    不明-->|クライアント内の状態変更|処理済み;
    不明-->|クライアント内の状態変更|初期状態;
```

#### 状態の説明
|No|状態|説明|備考|
|---|---|---|---|
|1|初期状態(null)|更新リクエストが発生する前の状態|
|2|処理済み|正常に更新処理が行われた状態|
|3|不明|更新リクエストのレスポンスが未受信の際のクライアントの状態|クライアントのみ発生する状態|
|4|取消|更新リクエスト自体がなかったものとする|ここでは、取消を取消して処理済み状態に戻せないものとする|
#
EC-CUBEでトップページスライダーをレスポンシブ

# レスポンシブ切り分け
スマホ768px以下（ファースト記述）
タブレット768px以上1000px以下
パソコン1000px以上

# デフォルト

```:root/app/template/default/index.twig
<div class="ec-sliderRole">
    <div class="main_visual">
        <div class="item slick-slide"><img src="{{ asset('assets/img/top/img_hero_sp01.jpg') }}"></div>
        <div class="item slick-slide"><img src="{{ asset('assets/img/top/img_hero_sp02.jpg') }}"></div>
        <div class="item slick-slide"><img src="{{ asset('assets/img/top/img_hero_sp03.jpg') }}"></div>
    </div>
</div>
```
# スマホ用画像を作成
スマホ用画像01.jpg（768px × 768px）
スマホ用画像02.jpg（768px × 768px）
スマホ用画像03.jpg（768px × 768px）

# twig書き換え

```:root/app/template/default/index.twig
<div class="slider-pc">
    <div class="ec-sliderRole">
        <div class="main_visual">
            <div class="item slick-slide"><img src="{{ asset('assets/img/top/img_hero_sp01.jpg') }}"></div>
        <div class="item slick-slide"><img src="{{ asset('assets/img/top/img_hero_sp02.jpg') }}"></div>
        <div class="item slick-slide"><img src="{{ asset('assets/img/top/img_hero_sp03.jpg') }}"></div>
        </div>
    </div>
</div>
<div class="slider-sp">
    <div class="ec-sliderRole">
        <div class="main_visual">
            <div class="item slick-slide"><img src="{{ asset('assets/img/top/スマホ用画像01.jpg') }}"></div>
            <div class="item slick-slide"><img src="{{ asset('assets/img/top/スマホ用画像02.jpg') }}"></div>
            <div class="item slick-slide"><img src="{{ asset('assets/img/top/スマホ用画像03.jpg') }}"></div>
        </div>
    </div>
</div>
```

# CSS

```:root/html/user_data/assets/css/customize.css
/* スライダー
========================================================================== */
.slider-pc {
    visibility:hidden;
    height: 0;
}

/* レスポンシブータブレット768px以上1000px以下
   ========================================================================== */


@media only screen and (max-width: 1000px) and (min-width: 768px) {
        /* スライダー
    ========================================================================== */
    .slider-pc {
        visibility:visible;
        height: 450px;
    }
    
    .slider-sp {
        visibility:hidden;
        height: 0;
    }
}

/* レスポンシブーパソコン1000px以上
   ========================================================================== */


@media only screen and (min-width: 1000px) {
        /* スライダー
    ========================================================================== */
    .slider-pc {
        visibility:visible;
        height: 450px;
    }
    
    .slider-sp {
        visibility:hidden;
        height: 0;
    }
}
```
CDNって何？？

## 初めに
皆さん「CDN」をお聞きした事はありますか？

現在AWSの学習をしています。
その際にCDNが出てきたので、自分なりにまとめてみました。

## CDNとは？
CDN=(Contents Dellivery Network)の略称です。

システムのサーバー負荷を下げつつ、コンテンツ配信を高速化する仕組みです

## 仕組みは？
![スクリーンショット 2024-03-25 15.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744656/a04d22fd-0003-bfc8-37ef-0eeb3a85568c.png)

##### ①サーバーの負荷軽減
CDNでは、「エッジサーバー」と呼ばれる代理サーバーが、「オリジンサーバー」
　（大元サーバー)に代わりコンテンツ配信を行います。

エッジサーバーには、オリジンサーバーからキャッシュしたコンテンツが保存されており、ユーザーからリクエストがあると、オリジンサーバーに代わりレスポンスします。
(※エッジサーバーにキャッシュがある時）

##### ②物理的距離の短縮
例えば、日本(ユーザー)とブラジル(サーバー)間での通信だど、物理的距離が長く、コンテンツ配信に時間がかかります。

キャッシュサーバーを世界各地に分散して配置する事により、ユーザーから最も近いキャッシュサーバーがリクエストを受けて応答します。

## 使用例
・動画などの配信コンテンツ(大容量)
・アクセスが集中する(新製品広告)
・物理的距離の遠い場所からのアクセスがある　...など

##  メリット
・サーバーやネットワークの負荷を軽減できる。
・配信速度が改善できる。
・SEO対策になる。

##  デメリット
・古いコンテンツが配信されてしまう可能性が有る。
・個人情報がキャッシュされてしまい、公開する恐れ。

##  最後に
2回目の投稿をしてみました。
まだまだ、慣れないですが皆様の参考になる記事が投稿出来たら幸いです。
「基本情報技術者試験」2週間受験譚

私は2025年の4月からインフラエンジニアとして働くことになった大学生です。
せっかくIT業界に行くならと基本情報技術者試験を登竜門的に受けました。合格証は届いていませんが、回答後に得点が表示され、受かっていたので少し勉強法をA試験とB試験それぞれに触れていこうと思います。

A試験
最初は教科書から学ぼうとしましたが、本が分厚い割に、この試験はかなり網羅的だと思いやめました。
次に試したのがyoutubeの活用で、すーさんって方のyoutubeを見ました。ざっくりとしたイメージがわかりやすいので入りとしてはいいと思いますが、個人的に「人のイメージより自分なりのイメージを持つ方が記憶には残る」と「過去問を解くと足りない部分が出てくる」ということで次の勉強法へ。
最後に行っていたのが過去問をとにかく解き、わからないとこをその時に調べるという方法です。個人的には一番効果があった方法で、さらに毎回得点率をメモしていたのでそれも効果的だったと思います。

B試験
「出るとこだけ！基本情報技術者」という本を一冊買って、それを元にやっていきました。その本が特殊？だったのかわかりませんが、トレース法とやらを用いて解いています。
この本でやったことは、「説明などはすっ飛ばして解いてみる」です。javaを少し齧っていたので、とりあえず問題を解いて、できなかったなら何が原因なのか、どうしたら解けるのかを確認して間違った箇所は何度か解きました。

そんなこんなで実際集中した期間は二週間ほどなので、かなりさらーっとやってみるといいんじゃないでしょうか
JavaScriptでランダムな13桁のJANコードを生成する方法

検索しても、あまり良さそうなサイトが見つけられなかったため、[こちらのサイト](https://www.gs1jp.org/code/jan/check_digit.html)の「GTIN（JANコード）標準タイプ（13桁）のチェックデジットの計算方法」を参考に作成しました。

## コード

```javascript
const createFakeJanCode = () => {
  // 12桁のランダムな数字の文字列を生成
  const randomString = Math.random().toString(10).slice(-12);

  // ランダムな数字の配列
  const numberArray = [...randomString].map(Number);

  // 奇数番目の要素の合計①
  const oddSum = numberArray
    .filter((_, index) => index % 2 === 1)
    .reduce((sum, nextValue) => sum + nextValue);

  // 偶数番目の要素の合計②
  const evenSum = numberArray
    .filter((_, index) => index % 2 === 0)
    .reduce((sum, nextValue) => sum + nextValue);

  // ①x3+②の数の一桁目
  const firstDigit = +`${oddSum * 3 + evenSum}`.slice(-1);

  // 10を引いた数の一桁目がチェックデジットとなる
  const checkDigit = `${10 - firstDigit}`.slice(-1);

  return `${randomString}${checkDigit}`;
};

const fakeJanCode = createFakeJanCode();
// （例）4022583207511
```

注意点ですが、参考サイトで

> ① すべての偶数桁の数字を加算します。
> ② ①の結果を3倍します。

とあり、ついつい`index % 2 === 0`で求めたくなりますが、配列の`filter`メソッドの`index`は`0`から始まるため、奇数番目の合計を3倍する必要があります。

## 参考サイト

https://www.gs1jp.org/code/jan/check_digit.html

## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=fc5d8c3f823e15f575ad
【Active Directory (AD) におけるグループのスコープ】

Active Directory (AD) におけるグループのスコープについて書いてみました。ADのグループスコープは、ネットワーク上のリソースへのアクセスを効率的に管理するために使用されます。
【１】グループのスコープ：Active Directoryには、グローバル、ユニバーサル、ドメインローカルの3種類のグループ（スコープ）があります。
【１－１】グローバルグループ（スコープ）：通常、同じドメイン内のユーザーとグループが含まれます。
【１－２】ユニバーサルグループ（スコープ）：マルチドメインフォレストで役立ちます。これらを使用すると、複数のドメインにまたがる役割を定義したり、リソースを管理したりできます。各ユニバーサルグループは、作成された場所のドメインに保存されますが、そのグループメンバーシップはグローバルカタログに保存され、フォレスト全体に複製されます。
【１－３】ドメインローカルグループ（スコープ）：同一ドメイン内の全サーバから参照できるため、一度定義するだけで複数のサーバから利用できる。ドメインローカルグループの作成にはドメイン管理者の権限が必要になる。Active Directory(AD)はオブジェクト作成の権限をほかのユーザーやグループに委任できる。ドメインローカルグループはアクセス許可の設定単位で作成されるため、誰に何のアクセス許可を与えているかが一目で分かることにより管理が容易になる。
【２】セキュリティグループ：共有リソースへのアクセス許可を割り当てるために使用される。例えばWindowsエクスプローラでアクセス権を設定する場合、アクセス権の許可のダイアログでこのグループが表示される。 通常ではグループといったらこの"セキュリティグループ"をいう。Domain admin もこのグループに属する。Active Directory (AD) におけるセキュリティグループは、ユーザーアカウント、コンピューターアカウント、その他のグループを管理可能な単位に収集する方法です。これにより、個々のユーザーではなくグループで作業することで、ネットワークのメンテナンスと管理が簡素化されます。セキュリティグループは、ドメインのグローバルスコープ内には適用されません。セキュリティグループは通常、ネットワークレベルのリソースであり、VPC (Virtual Private Cloud) や サブネット などの範囲内で適用されます。ドメインは通常、アクセス制御ポリシーや認証に関連するものであり、セキュリティグループとは異なる概念です。
【３】配布グループ：電子メール配布リストを作成するために使用されます。例：Exchange Serverを使用。
【図１：ADグループのスコープ（１）】![スクリーンショット 2024-03-25 140154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587793/5b00f150-eb1f-0c9f-3f95-07ba961bb300.png)
【図２：ADグループのスコープ（２）】![スクリーンショット 2024-03-25 140334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3587793/65891bef-1c97-8a18-12c7-1d94771f4393.png)
（参考URL）グループアカウントの種類と運用方法【連載：ADについて学ぼう~基礎編(8)~】 - ManageEngine ブログ ManageEngine ブログ⇒https://blogs.manageengine.jp/group_account/
以上、ご指摘ありましたらお願いいたします。
「なりたい自分の、その先へ」エンジニアファーストの会社、助け合いの共同体、ワークスタイルは多様、集まり帰る場所のある会社⇒株式会社CRE-COエンジニアリングサービス　伊藤 俊広　https://www.cre-co.jp/
nltk.downloadでSSL認証エラーが発生して速攻解決できた話（Mac）

## 起きたエラー

以下のライブラをインポートする時にエラーが発生しました。

```python:ライブラリのインポート
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
```

```:エラー
[nltk_data] Error loading punkt: <urlopen error [SSL:
[nltk_data]     CERTIFICATE_VERIFY_FAILED] certificate verify failed:
[nltk_data]     unable to get local issuer certificate (_ssl.c:1002)>
```

## 解決方法

アプリケーションフォルダ内のPython3.X内にある↓をダブルクリックすると解決します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456646/4772ccb0-03be-01eb-1b4e-6f5ccf076de7.png)

もう一度ライブラリをインストール↓

```
nltk_data] Downloading package punkt to
[nltk_data]     /Users/~~/nltk_data...
[nltk_data]   Unzipping tokenizers/punkt.zip.
```

## 最後に

一応以下のコードを使うこともできます。
過去にWindowsで遭遇したときはこれ使いましたが、やはりSSLを無効にしてダウンロードするのはセキュリティ的にもリスクがあるので、できればやりたくないですね。

そういう意味では今回の方法は目から鱗でした。

```python:SSL認証を一時的に無効にしてDL
import nltk
import ssl

try:
    _create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
    pass
else:
    ssl._create_default_https_context = _create_unverified_https_context

nltk.download('punkt')

```
Node.jsを使った定期的なファイル同期の構築手順

# node-cronを使ったフォルダ同期の環境構築

Node.jsとnode-cronパッケージ、rsyncユーティリティを使用して、指定のフォルダ間で15秒ごとにファイルを同期する環境を構築します。

## 前提条件

- Node.jsがインストールされていること
- node-cronパッケージがインストールされていること
- rsyncユーティリティがインストールされていること
- 対象のフォルダ(/bitnami/wordpress/wp-content/uploads/ と /home/bitnami/Dropbox/wp-uploads/)が存在していること

## 手順

### 1. Node.jsとnpmのインストール

Node.jsの最新版をインストールします。

```bash
curl -sL https://deb.nodesource.com/setup_current.x | sudo -E bash -
sudo apt-get install -y nodejs
```

node-cronパッケージをインストールします。

```bash
npm install node-cron
```

### 2. スケジュールスクリプトの設定 (schedule.js)

schedule.jsファイルを作成し、以下のコードを貼り付けます。

```javascript
const cron = require('node-cron');
const { exec } = require('child_process');

cron.schedule('*/15 *', () => {
  console.log('Running sync_script.sh every 15 seconds');
  exec('/home/bitnami/Script/sync_script.sh', (error, stdout, stderr) => {
    if (error) {
      console.error(`Execution error: ${error.message}`);
      return;
    }
    if (stderr) {
      console.error(`Script error: ${stderr}`);
    }
    if (stdout) {
      console.log(`Output: ${stdout}`);
    }
  });
});
```

このコードは15秒ごとにsync_script.shを実行します。

### 3. 同期スクリプトの設定 (sync_script.sh)

sync_script.shファイルを作成し、以下のコードを貼り付けます。

```bash
#!/bin/bash

rsync -avz /bitnami/wordpress/wp-content/uploads/ /home/bitnami/Dropbox/wp-uploads/
```

このスクリプトは/bitnami/wordpress/wp-content/uploads/ディレクトリから/home/bitnami/Dropbox/wp-uploads/へファイルを同期します。

ファイルに実行権限を付与します。

```bash
chmod +x /home/bitnami/Script/sync_script.sh
```

### 4. スケジュールスクリプトの実行

schedule.jsスクリプトをNode.jsで実行します。

```bash
node /home/bitnami/my-scheduled-task/schedule.js
```

(オプション) スクリプトが常に実行されるようにするには、Node.jsプロセスマネージャー(pm2など)を使用することをおすすめします。

### 5. 動作確認

スクリプトが正しく動作しているかを確認します。15秒ごとに同期が行われ、ログにメッセージが出力されるはずです。

```
Running sync_script.sh every 15 seconds
Output: sent 67896 bytes  received 26 bytes  135840.00 bytes/sec
total size is 67922  speedup is 1.00
```

### 6. 権限の確認

rsyncが正常に動作するためには、/bitnami/wordpress/wp-content/uploads/ディレクトリと/home/bitnami/Dropbox/wp-uploads/ディレクトリに対する適切な読み取り/書き込み権限が必要です。

具体的には、ディレクトリの所有者やグループ、その他のユーザーに対して、適切な権限を設定する必要があります。以下のコマンドを使って、現在の権限を確認できます。

```bash
ls -ld /bitnami/wordpress/wp-content/uploads/
ls -ld /home/bitnami/Dropbox/wp-uploads/
```

出力例:
```
drwxrwxrwx 7 bitnami daemon 4096 Jan  1 00:39 /bitnami/wordpress/wp-content/uploads/
drwxr-xr-x 3 bitnami bitnami 4096 Mar 24 23:06 /home/bitnami/Dropbox/wp-uploads/
```

この例では、/bitnami/wordpress/wp-content/uploads/ディレクトリに対して、所有者(bitnami)、グループ(daemon)、その他のユーザーがフルアクセス権限を持っています。

一方、/home/bitnami/Dropbox/wp-uploads/ディレクトリに対しては、所有者(bitnami)とグループ(bitnami)がフルアクセス権限を持ち、その他のユーザーが読み取り権限のみを持っています。

rsyncが正常に動作するためには、これらのディレクトリに対する適切な読み取り/書き込み権限が必要です。この例の場合、/bitnami/wordpress/wp-content/uploads/ディレクトリに対する権限は適切に設定されていますが、/home/bitnami/Dropbox/wp-uploads/ディレクトリに対する権限を調整する必要があるかもしれません。

必要に応じて、chmodコマンドを使ってディレクトリの権限を変更してください。例えば、/home/bitnami/Dropbox/wp-uploads/ディレクトリに対して、所有者とグループがフルアクセス権限を持ち、その他のユーザーが読み取り権限のみを持つように設定するには、以下のコマンドを実行します。

```bash
chmod 770 /home/bitnami/Dropbox/wp-uploads/
```

このように、実際の環境に合わせて適切な権限を設定することが重要です。


#### 以上で、node-cronを使ってフォルダ同期を15秒ごとに実行する環境が構築できました。必要に応じて、cron.schedule()の引数を変更することで、同期の間隔を調整できます。
光信号の伝送シミュレーション

光信号を100km伝搬させて受信した時の電力波形を算出するpythonのシミュレーションプログラムです。
今回は光源の波長を1.55[μm]としてシミュレーションを行っています。

```python
    N = 2**10 #データ点数
    trange = 5.714e-10    #全時間幅
    dt = trange/N
    z1 = 100e3 #伝送距離
    B = -21.7*10**(-27) #波長1.55[μm]のとき
    ff = np.zeros(N, dtype=np.complex128)
    
    ###角周波数設定###
    omega1=np.linspace(0.0,np.pi/dt,N/2.0,endpoint=False)
    omega2=np.linspace(-np.pi/dt,0.0,N/2.0,endpoint=False)
    omega=np.hstack((omega1,omega2))

    ####送信-->受信波形####
    ##########分散##########
    ##fft
    ff = np.fft.fft(signal)
    #分散式
    signal_rx = ff * np.exp(-1j*B*(omega**2)*z1/2)

    ##ifft
    gf1 = np.fft.ifft(signal_rx)
    #受信後の分散波形
    signal_bun1 = np.abs(gf1) # 複素振幅波形
    signal_bun1k = np.abs(gf1) * np.abs(gf1) # 電力波形
```
BambuLabのAMSメリットデメリットまとめ

以前BambuLabのAMSは、多色刷りを使わないなら買わなくてもいいか？他にいいとこあったか？と質問があり、メリットデメリット色々あったので、そのまとめです。

## メリット
### フィラメントの入れ替えが自動で楽
入れ替えの際、普段なら、ノズル温め、フィラメントアンロードしてスプール取り外して、次のスプールに入れ替えて完全に色が切り替わるまでフィラメント出しながら待つ…という作業をします。

AMSでは、フィラメントをフィーダーユニットから抜き、スプールを外して、次のスプールに入れ替え、フィラメントの先をフィーダーユニットにぶすっと刺せば終わりです。
ノズルの温めや色の切り替わりまで待つ必要がありません。

### Auto Refill機能
AMSでは、同じ種類のフィラメントがAMSに入っていた場合に、<b>Auto Refill</b>機能を使えます。
今のフィラメントを使い切った際に自動で次のフィラメントを使う機能です。
フィラメント切れでの印刷失敗や、フィラメントを微妙に使い切れない問題を防げます。

設定方法は、同じ種類のフィラメントを2つAMSにセットし、デバイスタブ>ナットのマークから<b>AMS filament backup</b>にチェックを入れるだけです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/7d8469fc-9581-82bf-0d82-5c178a251019.png" width="600">

同じくデバイスタブ><b>Auto Refill</b>から所定のAMSスロットが循環の輪のようにセットされていればOKです。この場合はA1でもA4でも、印刷時に指定したスロットから印刷をはじめ、フィラメントがなくなったら逆側が使われます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/75689cd6-80c6-0376-262e-c1d2546b8287.png" width="500">

### フィラメント乾燥ボックスとして使える
フィラメントは湿気ると折れたり造形不良などが発生して使えなくなりますが、AMSの中には[AMS専用乾燥剤](https://jp.store.bambulab.com/products/desiccant-for-ams)が入っていますので、少しは湿気対策になります。
BambuLab本体にも乾燥機能がついているので、湿気てもある程度は復活可能です。


### 自動でフィラメントを認識してスライサーに反映
準備タブ>フィラメント横のAMSマークを押すと、自動でフィラメントを情報をスライサーに反映します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/4686cfab-d40c-c340-aa0a-3e653d9ec671.png" width="500">

Bambu純正フィラメントなら、フィラメントロード時に自動で読みだしますし、サードパーティでも本体側で指定しておけばスライサー側での設定は不要です。
純正フィラメントの読み出しには、たまに失敗しますが、大抵は本体再起動で読みだせます。

印刷設定時にどのスロットのフィラメントを使うか指定するだけでよいので非常に便利です。
今フィラメント何がついていたか忘れたり、材料設定間違ったりといったミスが減ります。


### もちろん多色刷りできる
AMS1個につき最大4色まで扱えます。塗装の手間がいらないので本当に便利です。
多色刷りならではの[リトファンセット](https://jp.store.bambulab.com/products/pla-cmyk-lithophane)などの楽しみ方もあります。
純正ならPLAの他、PETGやABSも多色刷りで使えます。


### 公式以外のフィラメントもモノによっては使用可能
私が試した中だと
Prusamentは△。行けるときもあるんですが、折れました
Overture、Crealityは〇。 
今は取り扱いがないようですが、AmazonブランドのEono(イオーノ）PLAも使えました。

なお紙製スプールのフィラメントは、AMSに入れると曲がったりするので、以下の動画のように純正のスプールホルダーかBambuLab内蔵メモリから印刷したスプールホルダーに入れ替えるのがよさそうです。

<blockquote class="twitter-tweet" data-media-max-width="400"><p lang="ja" dir="ltr">bambulabでプリントしたスプールホルダーに紙製ホルダーでAMSに付けられなさそうなgenelic PLAを換装。真ん中のリングは残して解けないように押さえながら入れ替えてみた <a href="https://t.co/zRaJ6BiZFT">pic.twitter.com/zRaJ6BiZFT</a></p>&mdash; まつはち (@matsuhachi0f) <a href="https://twitter.com/matsuhachi0f/status/1669651333761368065?ref_src=twsrc%5Etfw">June 16, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## デメリットと注意
### 色変え時のゴミが結構出る
AMSによる色変えは、フィラメントをロードする際と同じで、ノズルを温め、少しフィラメントを出してから引き抜き、色が切り替わるまで新しいフィラメントを出し続ける、を自動で行う仕組みです。
これを毎回やるので、切り替え色変えゴミがたくさん出ます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/980900ea-a973-f00c-3554-2671becf18a1.jpeg" width="500">

### サードパーティ製フィラメントでの印刷失敗
他社製PLAなど使った場合に、相性が悪いと24時間の造形で5～6回くらいフィラメント折れが発生することがあります。

公式のフィラメントでも、AMSに入れると時々折れたり詰まったりします。
PLA-CFもAMSは可能とありますが、[Stuck PLA-CF in AMS.](https://www.reddit.com/r/BambuLab/comments/14t1d0o/stuck_placf_in_ams_only_happening_on_my_second)といった投稿のように、摩擦が強すぎて失敗することもあります。
私も失敗しました。ただそのときは、上記投稿に書かれているように、BambuLab本体の乾燥機能を使って乾燥させたところ、安定して印刷できるようになりました。
郵便番号のエリアを地図で眺めてユースケースをあげる

郵便番号データと聞くと、郵便番号検索としてECサイトなどで住所入力の補助に使われる場面を思い浮かべる方が多いと思います。
郵便番号検索を実装したときにKEN_ALL.CSVを使って大変だった記憶が蘇ってくるという方も中にはいるはずです。

# 郵便番号地図
この記事で扱うのは、そのようないわゆる郵便番号データではありません。
郵便番号の地図、郵便番号のポリゴンといったデータの話です。
郵便番号地図はポリゴンなので、基本的には地図に表示して使うようなデータです。

![郵便番号地図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325378/dab7c74f-fad2-7808-87a8-be43c8db2fb8.png "郵便番号地図")
QGISを使ってOpenStreetMapに郵便番号のポリゴンを重ねてみました。瀬戸内海の島々も郵便番号が細かく分かれているのが見て取れます。
郵便番号のポリゴンは[郵便番号エリアデータ](https://www.mapmarketing.co.jp/data/area/Yubinbangouarea.html?grid=qiita&utm_source=qiita.com&utm_medium=referral&utm_campaign=qiita_yubinbango_7abfd64c1576f7cf7acc_01 "郵便番号地図データ")を使用しました。

## 郵便番号地図を使って何ができるか？
郵便番号地図に馴染みがあるという方は少ないと思います。
そのため、まずは郵便番号地図のデータを使ってどんなことができるかユースケースを紹介していきます。
以下にあげた他にも使い方があると思います。こんなのもあるよという方はコメントいただけると嬉しいです。

### ユースケース1　眺めて楽しむ
地図にポリゴンを表示して眺めるのは楽しいですね。これだけでじゅうぶん楽しめます。

### ユースケース2　顧客データと紐付けて顧客の可視化を行う
顧客データに郵便番号がある場合や来店アンケートなどで収集した郵便番号がある場合にどこから来店している人が多いのか地図でグラフィカルに表示して確認することができます。
詳細な住所データがない場合や住所データはあっても整備されていない場合、郵便番号を起点に使用したい場合などに有効です。

### ユースケース3　DMなどの販売促進施策のレスポンス分析
DMやタウンプラスなどで販促を行い、その結果の分析や更なる販促施策の立案などを行うことができます。

### ユースケース4　Web広告のエリア選定
Web広告によっては郵便番号を指定して広告を配信することが可能です。
郵便番号地図データを使用することで、広告配信希望者が地図を見ながらインタラクティブに配信エリアを指定することができます。

### ユースケース5　人口や世帯、年収データなどを絡めて
上記ユースケースでは主に郵便番号地図のポリゴンを使う例を紹介してきました。
ポリゴンデータだけではなく郵便番号ごとの人口や世帯、年収などのデータを組み合わせて使用することもできます。
こういったデータと合わせて使用することで、ただ地図で見るだけではない分析が可能になります。

こちらは世帯年収400～500万円の世帯数比率に応じて郵便番号エリアを色塗りした例です。
![郵便番号地図を年収データで色塗り](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325378/3b6a4fb2-a7ad-a3c3-819a-48ed9e9f48bf.png "日本全国の郵便番号地図を年収データで色塗り")


## 郵便番号地図の入手方法
郵便番号地図はKEN_ALL.CSVと違ってパブリックなデータではありません。
地図データを扱っている会社から購入するか、[こちらのサイト](https://hanishina.github.io/maps/yubindata.html)で公開されている上5桁の郵便番号のポリゴンデータをダウンロードするなどして入手できます。
 

## 郵便番号地図の形式
- シェープファイル
- GeoJSON
- ベクトルタイル

などの形式のファイルだったりWeb APIで取得することになると思います。

## 最後に
アクセスマップ以外に地図を使ったプロダクトの企画や開発をするケースはそんなに多くないですし、さらに郵便番号地図が必要になるようなケースも少ないと思います。
万が一、要件を満たすのに郵便番号地図が必要な場合にこの記事を思い出していただければ幸いです。


https://www.mapmarketing.co.jp/data/area/Yubinbangouarea.html?grid=qiita&utm_source=qiita.com&utm_medium=referral&utm_campaign=qiita_yubinbango_7abfd64c1576f7cf7acc_02
Next.jsのApp Router対応のnext-export-i18を使った場合にCypressでuseTransrationをモックする

Next.js において、exportを使ってサイトを公開する場合の多言語化で [next-export-i18n](https://www.npmjs.com/package/next-export-i18n) を利用する場合、
next-export-i18n は Next.js のルータの仕組みを使っているため、
CypressのコンポーネントテストではRouterをモックする必要が出てきます。

next-export-i18n の 2.x.x では、基本的にPage Routerのみに対応していたため、
以下のように next/router をモックすることで、テストが可能でしたので共有いたします。

```ts

import * as Router from "next/router";

const router = {
  query: {
    id: undefined,
    lang: "ja"
  },
  pathname: "/",
  push: cy.stub()
};
cy.stub(Router, "useRouter").returns(router);
```

しかしながら、 Next.js の App Router に対応した next-export-i18n の 3.0.0 以降では、
next-export-i18n 内で利用される Next.js のルータが "next/router" ではなく "next/navigation" となり、直接ルータをモックできなくなります。

その場合、useTranslationのみをモックさせる場合、以下のように直接 useTranslation() をモックすることができます。

```ts
import * as nextExportI18n from "next-export-i18n";
import translation from "i18n/translations/ja.js"; //next-export-i18nで利用している翻訳のファイル

const useTranslationReturns = {
  t: (key: string) => translation[key] ?? key
};
cy.stub(nextExportI18n, "useTranslation").returns(useTranslationReturns);
```
#2 キーボードを見ずに英語を打つ ― プログラミング学習の第0ステップ

この課題を初めて見たとき、何となく嫌な予感がしました。私はカスタマーサービスをしていますが、実際に仕事でタイピングをする機会はそう多くありません。ほとんどの場合、コピー＆ペーストで事足りるからです。そこで、先生の推薦に従って、指摘されたタイピング練習サイトにアクセスしました。最初のうちは、練習過程が非常に難しく感じられました。なぜなら、すべてのタイピング習慣が以前と異なり、どこに手を置くべきか、FキーとJキーの位置を覚え、そして何よりも、最終的にはどうあれ、両手がホームポジションに戻るべきだというさまざまなルールに、これまで私が接したことがなかったからです。約3週間の練習後、私のタイピング速度は分速18文字から徐々に36文字へと向上しました。これもかなりの進歩だと思います。

これからも練習を続け、近い将来、キーボードを見ずに、目を閉じたままでも、自分の考えを文章にできるようになることを願っています。


![火狐截图_2024-03-25T05-06-29.146Z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3703986/0fc42ab9-0aaa-26d0-2a25-b9ece8e06fd0.png)
コマンドプロンプトの便利コマンド（エクスプローラー系）

### 実行環境
- Windows 11 Pro
- コマンドプロンプト

# 指定したフォルダ配下の全てのファイルに対してセキュリティー保護を解除する
<img width="200" alt="代替テキスト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3755172/12203b19-e653-35c4-9cd6-ed5605c204de.png">

```
for /r "対象フォルダのファイルパス" %f in (*) do powershell -Command "Unblock-File '%f'"
```

# 指定したフォルダ配下の全てのファイルに対して権限付与の変更をする
```
icacls "対象フォルダのファイルパス" /grant:r Users:(CI)(OI)F /t
```

# 指定したフォルダの階層リストを生成する
```
tree 調べたいフォルダパス /f >テキストファイルの出力場所\任意のファイル名.txt
```
GPL、LGPL、AGPLソフトウェアライセンスについての備忘録

# はじめに

ソフトウェアライセンスであるGPL・LGPL・AGPLについて概要をメモとして書き留めておきます。

GPLは、GNUプロジェクトのためにリチャード・ストールマンにより作成されたフリーソフトウェアライセンスです。LGPLとAGPLはGPLから派生したものです。

ライセンスの利用にあたっては公式ドキュメントを参照してください。

https://www.gnu.org/licenses/gpl-3.0.html
https://www.gnu.org/licenses/agpl-3.0.html
https://www.gnu.org/licenses/lgpl-3.0.html


# GPLの特徴
:::note info
- 複製・改変・再配布・販売等自由に行なって良い
- ソフトウェアを配布する際は、ソースコードを一緒に配布しなくてはならない
- 再配布するものもGPLライセンスにしなくてはならない
:::


## ライセンス伝搬/感染

GPLライセンスで公開されたソフトウェアと他のソフトウェアを組み合わせて配布する場合、その組み合わされたソフトウェアもGPLライセンスにしなければなりません。

GPLは権利を守るためのライセンスなので「ライセンス伝搬/感染」という表現は誤解を招く恐れがありますが、理解しやすいことと、Wikipediaなどにも記載があることから書き留めておきます。
しかし、このライセンス伝搬があったおかげで今日のオープンソース文化が華開いたとも言えそうです。

### 例

パソコンのローカル環境で動く動画プレイヤーを作っていたとします。 GPLライセンスの動画デコードライブラリを組み込んで動画プレイヤーを配布する場合、動画プレイヤーもGPLライセンスとして配布しなくてはなりません。


## GPLの主な目的

GPLの主な目的はソフトウェアを使ったり変更したりする自由を守るためのものです。そのソフトウェアが無料か有料かどうかは問題にしていません。誰でもソフトウェアを利用することができて、ソースコードが開示されていて、誰でも変更することができる、といったことを大切にしているようです。

商用ソフトウェアではソースコードを非公開にして、企業が独占的に管理するといったことはよくあることです。GPLではこういったこと自体を否定しているのではなく、フリーに使ってもらうために作ったソフトウェアを企業が自社製品に取り込んでソースコードを隠蔽して改変できなくすることに反発して作られたライセンスのようです。


# LGPLの特徴

GPLから派生したライセンスで、GPLと比べると緩いライセンスになっています。LGPLのLは「Lesser」で、より小さい、劣るといった意味があります。GPLに比べるとライセンス伝搬が起き難くなっています。

LGPLライセンスのソフトウェアを組み込んで利用する場合と呼び出して利用する場合とでは、前者は組み込んだソフトウェアもLGPLライセンスにする必要がありますが、後者はLGPLライセンスにする必要がありません。

静的リンクして実行ファイルに組み込まれる場合は伝搬する。動的リンクして実行ファイルに組み込まない場合は伝搬しないということのようです。


## LGPLまとめ
:::note info
- 基本はGPLと同じ
- ソフトウェア配布時にライセンスが伝搬する
- 動的リンクはライセンス伝搬しない
:::

# AGPLの特徴

昨今、ソフトウェアを配布しインストールして利用すること以上にSaaSやWebサービスといった形でソフトウェアをネットワーク越しに利用することが多くなっています。

GPLもLGPLもソフトウェアを配布することとライセンスが深くかかわっていますが、ネットワーク越しにソフトウェアを利用するだけではソフトウェアを配布したことにはなりません。

AGPLはソフトウェアを配布しなくても、ネットワーク越しに利用しているだけでライセンスの効力が生まれる点でGPLやLGPLと異なります。

AGPLで作られたソフトウェアを使ってWebサービスを提供していて、そのソフトウェアを改変した場合、そのWebサービス利用者に対してソースコードを開示しなくてはなりません。

また、AGPLで作られたソフトウェアを自分のソフトウェアに組み込んで利用する場合、そのソフトウェアにもライセンスが伝搬します。組み込みの考え方はGPLと同等のようです。静的リンクや動的リンクのような形態を指しています。API呼び出しのようなネットワークを介した通信による利用の場合は、組み込みとは見なされずライセンスの伝搬はしないようです。


## AGPLまとめ
:::note info
- 基本はGPLと同じ
- ソフトウェア配布時にライセンスが伝搬する
- SaaSやWebサービスなどで利用することとソフトウェアの配布を同じと考える
- "REST　API"などネットワークを介した利用はライセンス伝搬しない
:::


# 参考サイト

https://yamory.io/blog/about-gpl-license/
https://www.tohoho-web.com/ex/license.html
https://snyk.io/jp/learn/agpl-license/
https://wa3.i-3-i.info/word13200.html
https://wa3.i-3-i.info/word13201.html