OmniAICreator/Qiita-1.07M huggingface dataset:
アクセス許可境界(Permissions Boundary)を試す

# はじめに

「運用で、オペレータに一部権限変更を可能とする」という運用をAWSで実装するときに、アクセス許可境界(Permissions Boundary)が使えそうなので、試してみました。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_boundaries.html

# 概要

アクセス許可境界のイメージは、よくベン図であらわされています。
「運用で、オペレータに一部権限変更を可能とする」という視点で表現すると、「許可できる範囲は、アクセス許可境界の内側に制限される」といえ、以下のように図示してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/e3eb5811-507f-48d0-bd86-08e0ef908347.png)

仮にオレンジが点線を超えてしまった場合、点線内部の操作しかできません。

またアクセス許可境界は、"IAMポリシーをアクセス許可境界として扱う"という風に設定します。アクセス許可境界の専用の特別設定があるわけではありません。

その他、付与可能なリソースは、ロールとユーザになり、ユーザグループはできません。



## アクセス許可境界の設定方法

設定方法は以下になります。

1. 境界用のポリシーを作成
1. 作成時/更新時に、上記ポリシーをアクセス許可境界として割り当て

新規作成時は設定でチェックを入れると指定できます。ラジオボタンになっており、複数選択はできませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/8a0b9c30-836f-4445-aa68-0db5052583a8.png)


編集時は、許可の境界のトグルを開き、「許可の境界を設定」ボタンをクリックすると、ポリシーを選択する画面に遷移します。こちらも複数選択はできませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/fadb86b1-327a-4c72-88c6-922aeb4e080f.png)

# アクセス許可境界の確認

今回はユーザを作って、それにアクセス許可境界を宛がい動作を確認します。

- ユーザにAdministratorAccessを付与
- アクセス許可境界として、一部のEC2の起動停止権限のみ可能のポリシーを付与

図示すると以下のように、権限は広いのですが、アクセス許可境界はすごく小さいイメージです。オペレータが操作ミスで過剰な権限を付与してしまった、という想定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f0d994ee-a912-4e69-a50e-223d58fecac8.png)


## 準備

アクセス許可境界用のポリシーとして、以前記事にした「ユーザーの`Dept`タグ:値と、同じ`Dept`タグ:値を持つEC2インスタンスの起動停止をできるポリシー」を使ってみます。

https://qiita.com/a_b_/items/5694dca0454057327677#%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E3%81%AEcfn%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88

ユーザは以下で作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/60b024f6-9e12-4ffa-bd0b-5a9a7104d664.png)

動作テストのために、2つのEC2を作ります。片方はユーザと同じタグ:値を持たせています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/9388bf72-b213-46c8-98fe-453fc426bef4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0c537456-6433-46f2-bb95-8eeb978b525a.png)

## 検証

作成したユーザでログインしてみます。
AdministratorAccessが付与されているのに、アクセス許可境界のために最低限の情報しか見れないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/06f20b62-5d45-4411-9aab-a92233dd65d6.png)

同じタグが付与されているEC2は起動できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c7bfd4bf-09bb-451b-a428-3f05f6582958.png)
タグが付与されていないEC2は、AdministratorAccessであるのに起動できませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f9720c6f-2707-4758-8e8a-4511a1f44ce8.png)


# おわりに

今回は実運用に即してアクセス許可境界の使い方を試してみました。この機能を使うと、作業ミスでも過剰な権限にならないようブレーキできるので、大変便利と感じました。

この記事がどなたかのお役に立ちましたら幸いです。
Pythonのフォルダ構成について考える

## はじめに
Pythonで色々コードを書いているときに
- どこに何の処理が書いてあるのかわかりづらい
- 処理/機能毎にフォルダ分けしておきたい

と思ったので、個人的なメモを残しておく。


## フォルダ構成の必要性
- 可読性・保守性の向上
    - コードの構造を視覚的に表現することで、目的の処理がどこに配置されているか分かりやすく、デバッグやメンテナンスが容易となる
- 管理効率化
    - 階層構造を明確にすることでファイルを探す手間が省け、プロジェクト全体を効率的に管理できる
- 規模が大きくなっても耐えられる
    - 目的別にフォルダ構成が分けられていると、機能追加等による拡張がしやすくなる

## Pythonフォルダ構成(例)

### ● 構成

[ project ]
├ [ project ]　　　　　　　# ソースコードを保管するフォルダ
│  ├ [ config ]
│  │  └ settings.py　　　　# 設定ファイル
│  ├ [ package1 ]
│  │  ├ \_\_init\_\_.py　※
│  │  └ moduleA.py
│  ├ [ package2 ]
│  │  ├ \_\_init\_\_.py　※
│  │  └ moduleB.py
│  ├ \_\_main\_\_.py
│  └ main.py
├ [ tests ]　　　　　　　　# テストのためのコードを保管するフォルダ
│  └ test.py
├ [ doc ]　　　　　　　　  # プロジェクトにおけるドキュメントを保管するフォルダ
└ Readme.md

:::note info
※昔はパッケージには必ず __init__.py が必要だったけど、最近（Python 3.3以降）は必須でなくなりました。ただ、互換性を考えて今でも置いておくのが一般的です。
:::

#### メイン処理

```python:main.py
from .package1 import moduleA
from .package2 import moduleB

def main():
    moduleA.func("kinouA")
    moduleB.func("kinouB")

if __name__ == '__main__':
    main()
```

```python:__main__.py
if __name__ == '__main__':
    from .main import main
    main()
```

#### 各パッケージ(サブモジュール)

```python:moduleA.py
def func(msg):
    print("A:",msg)
    return

if __name__ == '__main__':
    func()
```
```python:moduleB.py
def func(msg):
    print("B:",msg)
    return

if __name__ == '__main__':
    func()
```

### ● 実行
```shell-session
project $ python -m prj
A: kinouA
B: kinouB
```
### ● テスト
```python:test.py
import unittest
from unittest.mock import patch
from prj.package1 import moduleA

class TestUser(unittest.TestCase):
    @patch('builtins.print')
    def test_func_prints_message(self, mock_print):
        moduleA.func("kinouA")
        mock_print.assert_called_once_with("A:", "kinouA")

if __name__ == "__main__":
    unittest.main()
```

```shell-session
project $ python -m unittest discover test
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
```

### 補足
標準出力と戻り値の両方をテストする場合
```python:moduleA.py
def func(msg):
    print("A:",msg)
    return True
```
```python:test.py
class TestFunc(unittest.TestCase):
    @patch('builtins.print')
    def test_func_prints_message_and_returns_true(self, mock_print):
        # Act
        result = moduleA.func("Hello")
        # Assert: printの呼び出しをチェック
        mock_print.assert_called_once_with("A:", "Hello")
        # Assert: 戻り値をチェック
        self.assertTrue(result)
```

:::note info
テスト関数の名前付け、基本ルール
- 必ず test_ から始める（unittestが自動で見つけるため）
- 何をテストしているかが人間に読んでわかるようにする
- 動作＋条件＋期待結果 をなるべく含めると良い
:::

## 参考

https://qiita.com/flcn-x/items/c866eec8824a3cd70fa8

https://rinatz.github.io/python-book/ch04-07-project-structures/

https://qiita.com/flcn-x/items/c866eec8824a3cd70fa8

https://pep8-ja.readthedocs.io/ja/latest/
【高専】Gitプロキシ設定

# はじめに
全国の高専がどうか分かりませんが、少なくとも僕の高専のプロキシは大変使いにくい。

# プロキシの設定方法
プロキシの設定方法には「グローバル設定」「個別設定」の2種類があります。
主に高専内で使用する場合は「グローバル設定」で問題ないでしょう。
Windowsの場合、「コマンドプロンプト」または「PowerShell」や「Git Bash」で設定します。

## 1. グローバル設定
グローバル設定のコマンドはどのフォルダのターミナルで打っても問題ないです。
HTTP通信・HTTPS通信の両方を設定しておきましょう。

すべてのリポジトリに対して、HTTP通信時に指定のプロキシサーバーを使う設定です。
```
git config --global http.proxy プロキシのURL:ポート番号
```

すべてのリポジトリに対して、HTTPS通信時に指定のプロキシサーバーを使う設定です。
```
git config --global https.proxy プロキシのURL:ポート番号
```

## 2. 個別設定
個別設定のコマンドは適用したいリポジトリの中で実行してください。


今いるリポジトリだけに対して、HTTP通信時に指定のプロキシサーバーを使う設定です。
```
git config http.proxy プロキシのURL:ポート番号
```

今いるリポジトリだけに対して、HTTPS通信時に指定のプロキシサーバーを使う設定です。
```
git config https.proxy プロキシのURL:ポート番号
```

# プロキシの解除方法
学校内以外で作業をする時は、プロキシが邪魔になるので以下の方法で解除しましょう。
## 1. グローバル設定の解除
コマンドはどのフォルダのターミナルで打っても問題ないです。

すべてのリポジトリに対して、HTTP通信時に指定のプロキシサーバーの使用を解除する設定です。
```
git config --global --unset http.proxy
```

すべてのリポジトリに対して、HTTPS通信時に指定のプロキシサーバーの使用を解除する設定です。
```
git config --global --unset https.proxy
```

## 2. 個別設定の解除
コマンドは適用したいリポジトリの中で実行してください。

今いるリポジトリだけに対して、HTTP通信時に指定のプロキシサーバーの使用を解除する設定です。
```
git config --unset http.proxy
```

今いるリポジトリだけに対して、HTTPS通信時に指定のプロキシサーバーの使用を解除する設定です。
```
git config --unset https.proxy
```

# まとめ
テザリング？5GB/月でやってるもんで...
毎回毎回設定するのは面倒くさいですが我慢しましょう。
FortranでTodoツール

# はじめに

最近になって色々な言語やフレームワークを勉強しているが、その中で最初に作るのはTodoアプリだったりする。

最初の一歩は「Hello, world!」だと思っていたけどそこから一歩進んだプロジェクトということなんだろうか。

何度か作っているうちにふと、古い言語でやってみたら面白いかなと思い、Fortran90でやってみた。

# 環境

Windows 11 Pro 23H2
WSL Ubuntu 22.04
GNU Fortran (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0

# 導入方法

```bash
  sudo apt update && sudo apt upgrade -y
  sudo apt install gfortran
```

# ソース 

ほとんどChatGPTに書いてもらった

todo.f90
```fortran
program todo_app
  implicit none
  character(len=100) :: tasks(100)
  integer :: i, task_count
  character(len=100) :: input

  task_count = 0

  do
    print *, 'Todo tool:'
    print *, '  1. Add Task'
    print *, '  2. Show Tasks'
    print *, '  3. Exit'
    print *, 'Choose: '
    read *, input

    if (input == '1') then
      if (task_count < 100) then
        print *, 'Enter Task: '
        read *, tasks(task_count + 1)
        task_count = task_count + 1
      else
        print *, 'Error: Task list is full!'
      end if
      print *, '---------------------------'
    else if (input == '2') then
      print *, 'Tasks:'
      do i = 1, task_count
        print *, i, ': ', tasks(i)
      end do
      print *, '---------------------------'
    else if (input == '3') then
      exit
    else
      print *, 'Error: Invalid input'
    end if
  end do

end program todo_app
```

# 実行

```bash
$ gfortran todo.f90 -o todo
$ ./todo
```

# 結果
```bash
 Todo tool:
   1. Add Task
   2. Show Tasks
   3. Exit
 Choose: 
1
 Enter Task: 
test
 ---------------------------
 Todo tool:
   1. Add Task
   2. Show Tasks
   3. Exit
 Choose: 
2
 Tasks:
           1 : test                                                                                                
 ---------------------------
 Todo tool:
   1. Add Task
   2. Show Tasks
   3. Exit
 Choose: 
3
```

# 感想

モダンな言語やフレームワークで実装しようとするとセキュリティとか保守性、可読性など考慮して肥大化してしまいロジックが見えづらかったり実装が苦しくなることもあるけど、やってることはこんなにシンプルだと気づかせてくれた。

本当は削除とかも実装すればよかった。

# あとがき

よく組込みのLチカに相当するソフトウェアの最初の一歩が「Hello, world!」だと言われるけど、Todoアプリに相当するのはなんだろう。
パスを通すって結局何なのさ？

## はじめに 

こんにちは！プログラミングを学び始めると必ず出てくる「パスを通す」という謎の儀式。「とりあえずパスを通せばいいらしい」と言われて、言われるがまま作業した経験はありませんか？今回は「パスを通す」の正体に迫ります。

## パスを通すとは

「パスを通す」とは、コンピュータにプログラムの居場所（実行ファイルの場所）を教えることです。簡単に言えば、「このプログラムはこの住所に住んでるよ」と教えてあげる作業です。

## なぜパスを通す必要があるのか？

コマンドラインからプログラムを実行する時、OSはどこからそのプログラムを見つけ出せばよいのでしょうか？

例えば、ターミナルで以下のように入力したとします：

```bash
python hello.py
```

このとき、OSは「python」というコマンドが何を指すのか知らないといけません。もし知らなければ「'python' は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません」のようなエラーが発生します。

## 環境変数「PATH」の仕組み

ここで登場するのが「PATH」環境変数です。PATH変数には、OSがコマンド実行時に検索するディレクトリのリストが格納されています。

例えば PATH が以下のようになっていたとします：

```:Windowsの場合
C:\Windows\system32;C:\Program Files\Python\Python39;C:\Program Files\Git\bin
```

このとき「python」と入力すると、OSは：

1. `C:\Windows\system32` の中に python.exe があるか確認
2. なければ `C:\Program Files\Python\Python39` を確認
3. 見つかれば、そのプログラムを実行

という手順で検索します。

## パスを通さないとどうなる？

パスを通さない場合、プログラムを実行するには毎回フルパスを指定する必要があります：

```:Windowsの場合
C:\Program Files\Python\Python39\python.exe hello.py
```

これは面倒です。パスを通せば、どこからでも単に `python` と入力するだけで実行できます。

## 実際にパスを通してみよう

### Windowsの場合

1. スタートメニューで「環境変数」と検索
2. 「システム環境変数の編集」を選択
3. 「環境変数」ボタンをクリック
4. 「システム環境変数」の「Path」を選択して「編集」
5. 「新規」ボタンでパスを追加
   例：`C:\Program Files\Python\Python39`

### Macの場合

`.bash_profile`や`.zshrc`などのシェル設定ファイルに以下を追加：

```bash
export PATH="$PATH:/プログラムのディレクトリ"
```

## パスを通す際の注意点

1. **セキュリティ上の理由**: 信頼できるプログラムのみパスを通しましょう
2. **順序が重要**: PATHは先頭から検索するので、同名のプログラムがある場合は最初に見つかったものが使われます
3. **パスの競合**: 異なるバージョンのプログラムがある場合、どちらが使われるか意識する必要があります

## デバッグのヒント

「パスが通っていないのでは？」と思ったら：

### Windowsの場合
```
echo %PATH%
```

### Mac/Linuxの場合
```
echo $PATH
```

で現在のPATH変数を確認できます。また、特定のコマンドがどこから実行されているか確認するには：

### Windowsの場合
```
where python
```

### Mac/Linuxの場合
```
which python
```

を使いましょう。

## まとめ

「パスを通す」とは、OSにプログラムの場所を教えて、どこからでも簡単にプログラムを実行できるようにする作業です。これはプログラミングでよく使われる概念で、一度理解すれば怖くありません。

初心者の方も、もう「パスを通す」という言葉に怯えることはないでしょう。次回は変数のスコープについて解説します！

---
VSCODEにRを導入する

## はじめに
著者は普段Pythonでデータ分析しているのですが、Rも導入してみたので過程を記事にしました。
Rはトレンドの言語ではないですが、いざ使える？となったときに使ったことがないと機会損失につながると思い導入しました。
触ったことがあるかないかだと大きな差だと思うのでみなさんもR導入してみましょう！


## 1. R本体ダウンロード
macでも基本的な流れは一緒ですが、今回はWindowsで導入します。
下記のサイトにアクセスしてDownload R-4.5.0 for Windows (86 megabytes, 64 bit)をクリックします。
https://cran.rstudio.com/bin/windows/base/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937496/5edcd3a4-47d9-4f30-997e-ab5d4a66b3a9.png)




Windowsの場合、R-toolというライブラリの拡張ができるものがあります。
入れなくても大丈夫ですが、必要になることも多いので余裕があれば入れておきましょう。
手順通りにインストールすればRと連携されます。
mac、Linuxの人は別の方法でインストールします。
https://cran.r-project.org/bin/windows/Rtools/

| ソフトウェア | 含まれるもの | 主な用途 | 対応 OS |
| --- | --- | --- | --- |
| **R 本体** | R インタープリタ、標準パッケージ群 | R スクリプトの実行、統計解析、グラフ描画 | Windows/macOS/Linux |
| **Rtools** | C/C++ コンパイラ、Make 等のビルドツール | Windows 上でのパッケージのソースコンパイル | Windows のみ |

## 2.VSCODEのインストール、Rの拡張機能の追加
VSCODEをインストールして、拡張機能にRを追加します。
https://code.visualstudio.com/download
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937496/20106887-b612-477d-8f52-5046222d3641.png)

### 3.環境変数の設定

Windows設定の検索窓に「環境変数」を入力してして「PATH」にRのインストール先のパスを指定する。
Windows OSにRの実行ファイルの場所を教えるために環境変数を設定しています。

```python
C:\Program Files\R\R-4.5.0\bin\x64
```

### 4. Rファイルを作成してHello Worldが表示されれば成功です

```python
# hello.R
print("Hello, World!")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3937496/c6fcb3f3-e793-4c87-8588-823d031e9674.png)


## おまけ：R-studio

R 本体＋VS Code＋R 拡張 の組み合わせだけで十分に開発できます。
なのでVSCODEで開発する場合は不要です。
ただしR-studioはGUI でデバッグやプロット、パッケージ開発支援が一体化しているので、
ローコードで開発したい人やR Markdown／レポート作成を多用したい人は導入がおすすめです。

| 項目 | RStudio | VS Code + R 拡張 |
| --- | --- | --- |
| 統合ターミナル | R 専用コンソール・プロットペイン一体型 | 汎用ターミナルで R を実行 |
| プロット/ビューワ | ビューパネルに自動表示 | ターミナル内 or エディタ分割表示 |
| デバッグ機能 | GUI デバッガあり | 拡張機能や汎用デバッガを組み合わせ |
| プロジェクト管理 | .Rproj ファイルによる独自管理 | VS Code ワークスペース管理 |
| 拡張性 | R 専用機能に特化 | 他言語やツールとの統合に強い |
非エンジニアの私が技術ブログを書く理由

# Qiitaの1年間の活動を振り返り

私は普段業務整理だったり要件定義だったりいわゆるビジネスサイドの上流工程に携わっています。
エンジニアと話す機会も多くありますが、私自身業務としてコードを書いたことやインフラ関係を触ったことはありません。
実は転職を挟んでいるのですが、前職・現職ともにないです。

そんな中で、Qiitaの記事を書き続けて約1年間が経ちました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780099/5339bf67-ecc1-4567-8984-5ff631144e68.png)

https://qiita.com/setowatson


機械学習のテーマを中心に1年間で約50投稿しており、嬉しいことにContributionsも450以上いただいています。年間増加数として考えると上位約1%に入ります。

参考

https://qiita.com/Qiita/items/5046fd71ab3681b1546d

私自身そんな大層なことをしている感覚は本当に全くないのですが、
**「エンジニアでもないのになんでそこまでしてるの？」**
と聞かれることは少なくありません。（特に前職では）


これはきっと多くの日系企業で見られる話だと思うのですが、

- **社内エンジニアの言ってることがよくわからないけど、自分はビジネスサイドなので仕方ない**
- **技術のことはエンジニアや委託先に聞けばいい**
- **自分も色々インプットはしているけど、ブログを投稿するレベルではない**

そう思われている非エンジニアの方は多い気がします。
私自身も以前はそうでしたが、同時に（このままでいいのかな）という大きな不安感も抱えていました。

今なら確信を持って言えるのですが、
**ビジネスサイドの立場から技術を学びブログに書くことは、ものすごく価値のある行動** だと思います。
細かくすればいろんな理由がありますが、私がブログを書く1番の理由は 
**「技術を人にわかりやすく説明できるようになるため」**　です。


# レベルは低くて問題ないし、むしろそれが価値あるらしい。

こうした話をするとまず出てくるのが、**「大したこと書けないよ問題」** です。

大したことは書かなくて良いと思います。
正確に言うと **「自分では大したことじゃないと思っているだけ説」** が濃厚です。

この1年間、私が書いてきたブログの内容も本当に小さなことばかりです。
既存の技術解説記事を自分なりにまとめ直したり、面白そうなトレンドにただ乗っかってみただけだったり、kaggleにあるコーディングを模写してみただけだったり。

この記事なんかただの失敗体験談です。

https://qiita.com/setowatson/items/c7181a86ea546cb8ff7d

その他もその道を歩んでいるエンジニアの方から見たら、どれも"超"初歩的な内容です。
でも、そうした **"超"初歩的な内容のブログにしかない価値がある** と思っています。

特にこれから学ぼうとしている人たちにとっては、そうした記事が一番わかりやすかったりしますし、私自身「最初のつまずき」が丁寧に書かれている記事ほど助かります。
そして **そんな記事を自分で書くことは、自分の説明力を上げることにつながります。**
自分のためにも、どこかの誰かのためにもなると思っています。



# ビジネスサイドの私たちだからこそ書くことに意味がある。

最近では 「エンジニアにもビジネス視点が必要だ！」とよく言われています。
でもそれ以上に、**「ビジネスサイドにも技術理解が求められる時代」** であるとも思います。

実際、現職の立場から
「ニーズは聞きますよ！技術はわかんないけど！」
というスタンスでいると、社内外問わず信頼を得にくくなっている実感があります。

もちろん組織である以上、チームとしての役割分担は必要だと思います。
でもそれは、価値を最大化するための手段であって、
**非エンジニアが技術を学ばないで良い理由にはなりえません。** 

ビジネスサイドにいるからこそ、
- **今の技術で何ができるのか**
- **その技術を実現するには、どれだけのコストがかかるのか**

などを理解し、人に説明できるようしておくことは、
相手へのリスペクトでもあり、チームワークを成立させる前提でもあると感じています。

# あとは普通に楽しい。

技術ブログって、意外と楽しいんですよね。
知らなかったことが少しずつわかるようになる実感って、すごく気持ちいいし、
自分の書いた記事に反応があると、やっぱり嬉しいです。
「こんなの誰が読むんだろう？」と思ってた記事が意外と読まれたり、
逆に渾身で書いたのにスルーされたりするのも含めて、面白いです。

いいね稼ぎだけが目的になってしまうのは違いますが、
**「楽しいから続く」「続くから上達する」**　という好循環は、やっぱり本物だと思っています。


# 職種の肩書きに縛られず、価値あることをやりたい。

ここまで偉そうに書いてますが、私もまだまだ未熟です。
でもだからこそ書ける内容があると思っていて、これからも小さなことからアウトプットを続けたいと思っています。

そして嬉しいことに、現職ではこうした考えで動いている非エンジニア・ビジネスサイドの仲間がたくさんいます。技術力もありビジネスにも強いメンバーに囲まれているので、負けてられないなと思う毎日です。

ここまで書いておいてなんですが、「エンジニアだから」「エンジニアじゃないから」というセリフは視野を狭めるだけです。
面白いこと、楽しそうなこと、価値のありそうなことをみんなでやっていく、
それを率先できるような存在になりたいと思っています。
Tableau Publicのまとめ



# Tableau Public プロファイルへの接続に関する問題

+ [Tableau Public プロファイルへの接続に関する問題](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ervFmSAI)

:::note
ブラウザのプラグインを確認したところ、そのうちの 1 つが Cookie とトラッカーをブロックしていました。それを削除したら、動作するようになりました。
:::


# エラー

+ [【未解決】Unable to connect Trailhead to Tableau Public](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KgBLx)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/f3bf73e3-213e-7ce5-414b-c4d38ef8d3e4.png)


+ [アクションを完了できません。要求された操作を実行する権限がありません。エラーコード: DEF22B9A](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000SV8nq)

:::note
こちらの記事をご確認ください。 


https://issues.salesforce.com/issue/a028c00000y4yr3AAA/in-some-scenarios-the-publish-workbook-to-tableau-server-window-does-not-pop-up-before-the-permission-error-message
:::
windows11で、sketchup6 その85

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
UI.start_timer使ってみた。

# 写真



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/92b5e6ea-4e73-45b8-b416-b6d0cd2ee9db.png)

# サンプルコード

```
$n = -10

def run
	model = Sketchup.active_model
	entities = model.active_entities
	group = entities.add_group
	entitie = group.entities
	$n += 1
	x = $n
	z = 0
	y = 0
	pts = []
	pts[0] = [x * 10 +  5, y * 10 +  5, z * 10 + 5]
	pts[1] = [x * 10 + 10, y * 10 +  5, z * 10 + 5]
	pts[2] = [x * 10 + 10, y * 10 + 10, z * 10 + 5]
	pts[3] = [x * 10 +  5, y * 10 + 10, z * 10 + 5]
	base = entitie.add_face pts
	base.pushpull 5
	puts $n
end

def start1
	id = UI.start_timer(3, true) { 
		run 
	} 
end



```

以上。
ChatGPTを使用したアプリ開発記【フロント画面作成】

### 1行ごとに解読して写経しました。
```react
import React, { useState } from 'react';

function App() {
  const [text, setText] = useState('');
  const [posts, setPosts] = useState([]);

  const handleSubmit = (e) => {
    e.preventDefault();
    if (text.trim() === '') return;

    setPosts([text, ...posts])
    setText('');
  };

  return (
    <div style={{ padding: '2rem', fontFamily: 'sans-serif' }}>
      <h1>SNS</h1>
      <form onSubmit={handleSubmit}>
        <textarea
          value={text}
          onChange={(e) => setText(e.target.value)}
          placeholder='今なにしてる?'
          rows="4"
          cols="50"
          style={{ display: 'block', width: '100%', marginBottom: '1rem' }}
        />
        <button type="submit">投稿する</button>
      </form>

      <div style={{ marginTop: '2rem' }}>
      </div>
      {posts.map((post, index) => (
        <div key={index} style={{ padding: '1rem', borderBottom: '1px sold #CCC' }}>
          {post}
        </div>
      ))}
    </div>
  );
}

export default App;

```

![スクリーンショット 2025-04-29 7.56.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058366/2bc3015f-4eed-45ca-a30c-3c64dd531b83.png)
OpenGrADSによる降水量の時系列分析

## 1. 概要

OpenGrADSを使用して降水量の時系列変化を可視化し、降水が強まるタイミングを特定する方法を説明する。

## 2. 使用データ

- **MSM-S (地表面データ)**
  - https://database.rish.kyoto-u.ac.jp/arch/jmadata/data/gpv/latest/
  - 1時間降水量 (降水強度の時間変化を把握するために使用)
  - 時刻は初期値から60分間隔で34時刻分

## 3. 分析手順

### 3.1. GrADSの起動とデータの読み込み

```grads
reinit
sdfopen ./Opengrads/MSM-S.nc
```

このコマンドでMSM-Sのコントロールファイルを開き、データを使用可能な状態にする。

### 3.2. 降水量の時系列プロット

#### (1) 特定地点の降水量時系列グラフ

```grads
set lon 135  # 任意の経度
set lat 35   # 任意の緯度
set t 2 34     # 全時間範囲を指定(初期時刻は固定値のため除外)
set gxout line # 折れ線グラフを選択

display r1h  # 1時間降水量の変化をプロット
```

#### (2) 地域平均の降水量時系列グラフ

特定の範囲の平均を取ることで、広域的な降水の傾向を分析。

```grads
set t 2 34       # 全時間範囲(初期時刻は固定値のため除外)
set lon 135
set lat 35
set gxout line
display r1h      # 一度時系列グラフを描画しないと何故かうまくいかない
clear
a=aave(r1h, lon=130, lon=140, lat=30, lat=40) 
display a
```

### 3.3. 降水強度の急増タイミングを特定

降水強度が急激に変化するタイミングを検出するには、時系列データの時間変化率（微分）を計算する。

```grads
set gxout line
b = a - a(t-1)
display b  # 1時間ごとの降水量変化を計算
```

このグラフを観察し、降水強度が大きく増加する時点を特定する。

### 3.4. 降水が強まる要因の解析

降水量の急増が確認されたタイミングについて、以下の3つの要素を確認することで、降水強度が増す原因を特定できる：

1. **地上風の解析**
```grads
set t [降水量急増のタイミング]
set gxout vector
display skip(u, 20, 20);skip(v, 20, 20) # 地上風ベクトル
```
- 地上風の収束域を確認することで、水蒸気の集中する場所を特定できる
- 南からの暖かく湿った空気の流入は、降水の強化に重要な役割を果たす
- 風向の急激な変化は、前線の通過や局地的な収束の形成を示唆する可能性がある

2. **相対湿度の解析**
```grads
set gxout contour
set clevs 60 70 80 90 100  # 等値線の間隔を設定
display rh  # 相対湿度の分布表示
```
- 相対湿度が90%以上の領域は、雲形成や降水の可能性が高い地域
- 時間変化を見ることで、水蒸気の供給経路を把握できる
- 鉛直方向の相対湿度分布も重要な指標となる

鉛直断面での解析も有効：
```grads
reinit
sdfopen ./Opengrads/MSM-P.nc
set lon 135 # 東経135度(確認したい位置の経度もしくは緯度に合わせる)
set z 1 10  # 鉛直層の指定
set gxout contour
d rh  # 鉛直断面の相対湿度分布
```
3. **鉛直流の解析**
```grads

set gxout contour
d 36*w  # 鉛直p速度
```
- 負の値（上昇流）が強い領域は、対流活動が活発な場所を示す
- 特に-0.5Pa/s以下の強い上昇流域は、激しい降水の可能性が高い
- 上昇流と収束域が重なる場所は、特に注意が必要


これらの要素を組み合わせて解析することで、以下のような現象が特定できる：
- 前線に伴う降水
- 局地的な対流性降水
- 地形性降水
- 台風や低気圧に伴う組織化された降水システム
ABC403の振り返り

少し前のABCのC問題:二分探索・bit全探索・重実装が主流
現在のABCのC問題:圧倒的set・map時代
## [A問題](https://atcoder.jp/contests/abc403/tasks/abc403_a)(diff:9) ##
C++ならfor・ifだけで行ける、Pythonは配列も必要かも
普通にシュミレーションして $O(N)$ で解けます。
ACコード(pypy57ms,C++1ms)
```c++
N, ans = int(input()), 0
A = list(map(int, input().split()))
for i in range(N):
  if 1 - i % 2:
    ans += A[i]
print(ans)
```
AC時間:1:27
## [B問題](https://atcoder.jp/contests/abc403/tasks/abc403_b)(diff:74) ##
これは250点適正
$T$ から長さ $|U|$ の連続部分文字列を取り出して(これを $t$ とします)、$t_i \neq $ <code>?</code>である全ての $i$ について、$t_i = U_i$ であれば元の $S$ に $U$ が含まれます。
これを実装すると $O((|T| - |U|)|U|)$ となります。
ACコード(2ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  string T, U;
  cin >> T >> U;
  for(int i = 0; i <= (int)(T.size() - U.size()); i++) {
    bool f = true;
    for(int j = 0; j < (int)U.size(); j++) {
      f = f && (T[i + j] == '?' || T[i + j] == U[j]);
    }
    if(f) {
      cout << "Yes" << endl;
      return 0; 
    }
  }
  cout << "No" << endl;
}
```
AC時間:10:00
## [C問題](https://atcoder.jp/contests/abc403/tasks/abc403_c)(diff:208) ##
最近setとmapしか使ってないので久々に二分探索お願いします(あとWAtCoderで笑った)
まず、管理するデータとして、$ok_i =$ ユーザ $i$ が閲覧権限を持っているコンテストページの集合($1 \le i \le N$)、$allok_i =$ ユーザ $i$ が全てのコンテストページの閲覧権限を持っているかのフラグを持ちます。
クエリ1は、$ok_X$ に $Y$ を追加します。
クエリ2は、$allok_X$ を $true$ にします。
クエリ3は、$allok_X$ または $ok_X$ に $Y$ が含まれるならば<code>Yes</code>、そうでなければ<code>No</code>を出力します。
クエリの種類ごとに計算量は変わりますが合計して上から $O(QlogN)$ でおさえられると思います。
実装では、$ok_i$ を<code>set</code>で持ち、$allok_i$ を<code>bool</code>等で持てば良いです。
ACコード(227ms)
```c++
#include <bits/stdc++.h>
using namespace std;

int main() {
  int N, M, Q;
  cin >> N >> M >> Q;
  vector<set<int>> ok(N + 1);
  vector<bool> all_ok(N + 1, false);
  while(Q) {
    int query, X;
    cin >> query >> X;
    if(query != 2) {
      int Y;
      cin >> Y;
      if(query - 1) {
        cout << (all_ok[X] || ok[X].count(Y) ? "Yes" : "No") << endl;
      }
      else {
        ok[X].insert(Y);
      }
    }
    else {
      all_ok[X] = true;
    }
    Q--;
  }
}
```
AC時間:5:24
## [D問題](https://atcoder.jp/contests/abc403/tasks/abc403_d)(diff:1052) ##
$i = 0, \dots , N - 1$ で独立に解くことまでは行きましたが久々のDPで解けませんでした
edpcのA~E復習します…
## 感想 ##
多少上がりました(パフォ884,レート758)
Dが難しすぎる…
もっといろんなテクニック・アルゴリズム・データ構造を学んでいきたいです。
AWS Identity CenterのユーザーでClineを使う

# なぜ書いたか
ClineをAWS Bedrockを通して使うとき、AWS Identity Centerのユーザーで認証する方法が見つからなかったので書きます

# この記事で書くこと
- AWS Identity Center のユーザーを使うようにClineを設定する方法

# この記事で書かないこと
- AWS Identity Centerの設定
- AWS Bedrock 設定（モデルのリクエスト方法）
- AWS CLIの設定方法
- VSCodeのインストール方法
- Clineのインストール方法

# バージョン情報
- Cline: 3.13.3
- VSCode: 1.99.3
- AWS CLI: 2.27.1
- Windows 11 + WSL

# （ちなみに）ClineをAWS BedrockとAWS Identity Centerを通してVSCodeで利用するには次の手順を経ます
- AWSIdentity Centerを有効にして、ユーザーを作成、許可セットを割り当てます
- AWS Bedrockにて、使用したいモデルが使えるように、リクエスト申請をします
バージニア北部、オハイオ、オレゴンの各リージョンでリクエストしておくと、クロスリージョン推論がつかえるのでよいかも
- 自PCにAWS CLIをインストールして、AWS Identity Centerのユーザーで使えるように設定します
` $ aws configure sso ` などで設定
- 自PCにVSCodeをインストールして、"拡張機能"からClineをインストールします
- Clineの設定画面で、AWS CLIの認証情報を使う設定をします（本題）

 # ClineにてAWS CLIのユーザー情報を利用するように設定
 ClineでAWS Bedrockを利用する際のAWSのユーザー情報は、AWS CLIに設定したユーザー情報を利用します
下記の例では [default]や[profile administrator]を使います
```
$ cat ~/.aws/config
[default]
sso_session = my-sso
sso_account_id = 123456789012
sso_role_name = PowerUserAccess
region = ap-northeast-1
output = yaml

[profile administrator]
sso_session = my-sso
sso_account_id = 123456789012
sso_role_name = AdministratorAccess
region = ap-northeast-1
output = yaml

[sso-session my-sso]
sso_start_url = https://d-xxxxxxxxxx.awsapps.com/start
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access
```

Clineの歯車のアイコンから、設定画面を開きます
- API Provider: Amazon Bedrock
- ●AWS Profile
- AWS Profile Name: 
上記の例（`~/.aws/config`） にて、[default]にしているプロファイルを使うなら空欄にします
![2025-04-29 061426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886384/6cd8eea0-f88c-4740-b857-73de04ae7ac9.png)

[profile administrator]を使うなら`administrator`と入力します
![2025-04-29 061703.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3886384/53f08700-b48a-4053-bfb8-28f6c2d12268.png)

- AWS Region: AWS Bedrockにてモデルのリクエスト申請を行ったリージョンを選択します
- Use cross-region inference: チェックを付けます
- Use prompt caching: 項目があればチェックを付けます
- Model: 使いたいモデルを選択します
- Enable extended thinking: チェックを付けます

- Saveボタンをクリックして設定を保存します

# 使い方
1. AWS CLIにてユーザー認証を行います
[default]プロファイルを使う場合
` $ aws sso login`
[profile administrator]プロファイルを使う場合
` $ aws sso login --profile administrator`

1. Clineにてチャットを開始します！ 

# まとめ
Clineの認証にAWSのIAMユーザーを使う方法は見つかるのですが、AWS Identity Centerのユーザーを使う方法が見つからなかったので書いてみました
誰かのお役に立てば幸いです
Salesforce AI 環境でのエラー（トレイルヘッドを除く）




# Error while reading the copilot template null. Error: Copilot Template Name Or Id must not be null : Warning

+ [Error When Creating an Agent with "Create with Gen AI"](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000MZJaq)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/51159bd0-ed34-4aec-b622-d8e639b3dd4c.png)

:::note
I had to get with my Account Executive to add additional SKUs to our Salesforce Foundations. There had been updates since we got Salesforce Foundations in December. This fixed the issue and I am now able to create agents using Gen AI in Einstein Studio.
:::
Geminiでドラムを使う魔法少女を描いてみた。

# 概要

Geminiでドラムを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光のドラムを使う魔法少女を描いてください。
```

![光のドラムを使う魔法少女_20250429.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/76de77b7-902e-433e-bebc-43b34a4cb297.png)


```
闇のドラムを使う魔法少女を描いてください。
```

![闇のドラムを使う魔法少女_20250429.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/eabb8ead-3492-4243-b90d-e2d28cbebbb2.png)


```
聖なるドラムを使う魔法少女を描いてください。
```

![聖なるドラムを使う魔法少女_20250429.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/aa37b604-ba74-430a-8bb7-72f645be20c7.png)


# まとめ

光の子が可愛いかも。
何かの役に立てばと。
【AWS Lambda Tips】Lambda関数のコンソール上の変更の取り消し方法

# はじめに
AWS Lambda関数を、コンソール上で変更したものの、まだデプロイしていない状態で変更を取り消す方法を紹介する。

# 動作確認環境
* AWS Lambda
* Google Chrome

# 前提
AWS Lambdaをコンソールから編集し、反映させる前の状態（以下の画面）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/55e6ee1b-dc80-4735-af16-a8a2bbe72d29.png)

:::note warn
Deployした後だと本記事で紹介する方法は使えないので注意。
:::

# 方法

[こちらの記事](https://dev.classmethod.jp/articles/cancle-changes-not-deployed/#Cookie%25E5%2589%258A%25E9%2599%25A4)を参考にした。記事の頃とは、LambdaのGUIが変更となっていたため、[resetlambdafunction](https://dev.classmethod.jp/articles/cancle-changes-not-deployed/#resetlambdafunction)が使えなかったので、[Cookieを削除する](https://dev.classmethod.jp/articles/cancle-changes-not-deployed/#Cookie%25E5%2589%258A%25E9%2599%25A4)方法を使用する。

以下、Chromeからの操作方法を紹介する。

Lambda関数を編集しているページで、ブラウザのアドレス表示の左側にあるアイコンをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/b2cf2ecd-5a53-4e23-a68d-dac2bd3dca10.png)

「Cookieとサイトデータ」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/0cbc97ed-1186-4555-91f2-6f29dc9f3263.png)

「デバイス上のサイトデータを管理」をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/de3d401c-1c22-4ba7-af65-17fa83c64a11.png)


「埋め込みサイトからのデータ」にある```a.b.cdn.console.awsstatic.com```の横にあるゴミ箱ボタンを押して削除する。

「再読み込み」ボタンが出るので押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/6ae6c505-ea58-4d75-9f53-f2babdb2a776.png)

変更が破棄されていれば成功。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638977/f1bd8496-27f9-4e0a-bed7-720afc15e12f.png)


# まとめ

AWS Lambda関数を、コンソール上で変更したものの、まだデプロイしていない状態で変更を取り消す方法を紹介した。誤ってLambda関数のファイルを編集してしまった場合に有用なので参考にしてほしい。

# 参考

https://dev.classmethod.jp/articles/cancle-changes-not-deployed
MCP サーバー、結局どのサンプルが分かりやすいか

## 最も分かりやすかったサンプル(js/ts)

https://github.com/modelcontextprotocol/servers/blob/main/src/everything/everything.ts

こんな分かりやすいサンプルがあるのになんでもっと前に出さないんですの～

「everything サーバー」は、全ての機能を最小構成で実装しているサンプルになっています。

はじめに目につくのは下記２つのドキュメント
- https://modelcontextprotocol.io/quickstart/server
- https://github.com/modelcontextprotocol/typescript-sdk/blob/main/README.md

なんですが、前者は「National Weather Service API にアクセスして天気を持ってくる」というタスクがそもそも複雑で難しいし、後者は SDK の使い方が高度過ぎて難しかったです。(server.tool() がコンパクトすぎて全然応用が効かない～と思って人のサンプル読んだらみんな Low-Level Server の server.setRequestHandler() の方を使って実装してた)

これらを読まずに

https://github.com/modelcontextprotocol/servers/blob/main/src/everything/everything.ts

をベースに仕様書

https://modelcontextprotocol.io/specification/2025-03-26/server

の細かいオプションを読んでいくのが一番読みやすかったです。

## おまけ
### Claude は自発的にリソースを発見できない？
Claude は AI が自発的にリソースを発見できなくて、
![IS0U52uDnEVVdndr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176345/8df9cf95-cb5b-4e4b-aaa3-d178624087b5.png)
![NVjN658LlsiOF1Tn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176345/66be52d5-c32a-4260-b3ef-6e0d61ff0d66.png)
のように人間が選択して読ませてあげる必要があるみたい？(つまり AI が必要性を自発的に感じてから自発的にリソースを読みにいけない？意見求ム)「MCPサーバー xxxx のリソースを読んで」って頼んでもツールばっかりトライしたりします。

一方 Cline は自動でリソースを読んでくれる。

### everything の罠

ここで everything サーバーの例にはひとつ罠があって、プロンプト上で 「MCP サーバー everything のリソース test://static/resource/1 にアクセスして」って Claude に頼んだら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176345/7189a575-c43b-4f40-a0ff-3bc913274cef.png)
のようにまるでリソース機能を使って読んでくれるように見える動きをするんだけど、これは MCP のリソースにアクセスしてるのではなくて 「getResourceReference という***ツール***」を介してリソースにアクセスしているかのうように見せているだけでした。ややこしいですね。。なんで everything は Claude からリソースが扱えて自作のはリソースが使えないんだ！って３時間くらい悩みました。

Claude 対策で getResourceReference を実装しなよ、ってことなんでしょうか。
競プロ日記#25/04/28

# アルゴ式-[部分和問題](https://algo-method.com/tasks/427)
- 誘導があるのでそのまま実装するのはそこまで難しくないがそもそも概念がなかなか理解できていない。
- 解説を読んでGPTに入れてみてやっと理解できた。
- がしかし多分ものにはできていない。何度も復習しないと自分で応用はできない

# アルゴ式-[部分和問題のメモ化](https://algo-method.com/tasks/438)
- むずすぎる。ティルトしてるからなのか難しいからなのかわからないが解説読んでやっと理解できる。

# アルゴ式-[荷物と箱](https://algo-method.com/tasks/361)
- 久々に解説見ないでちゃんと実装できた気がする
- とはいえイテレータの理解はもう少し深めたい
- そもそもこの実装は大きいものから順に入れていったが本来は小さいものから入れていかないと事故る可能性がある気がする

```
int main() {
    int N, M;
    cin >> N >> M;
    vector<int> A(N), B(M);
    for (int i = 0; i < N; i++) cin >> A[i];
    for (int i = 0; i < M; i++) cin >> B[i];
    sort (A.rbegin(), A.rend());
    int ans = 0;
    for (int i = 0; i < N; i++) {
        auto it = lower_bound(B.begin(), B.end(), A[i]);
        if (it != B.end()) {
            ans++;
            B.erase(it);
        }
    
    }
    cout << ans << endl;
}
```

# アルゴ式-[区間スケジューリング問題](https://algo-method.com/tasks/363)
- 貪欲法の考え方が詰まった問題らしい。
- 終了時刻が早い予定を優先的に選んでいくのが良いらしい
計算ミスが減るかもしれない行列積のやり方

# 行列の積

## はじめに

大学に入学すると、行列の掛け算を習います。
しかし、行列の掛け算の計算は大変なことが多く、計算ミスをよくやってしまいます。

本記事では、紙に書く量は増えるものの、より間違わず行列の積が計算できる方法を紹介します。

## ここで想定している行列とは

```math
\begin{pmatrix}
a & b \\
c & d
\end{pmatrix}
```

大学初年次の線形代数学で導入される行列です。

## 行列の掛け算のルール
- 行列$A$と$B$の積$A B$を計算するとき、$A$の列の数と$B$の行の数が一緒じゃないとダメ

## 行列の計算の定義式(教科書に書いてあるもの)

行列 $A$（サイズ：$m \times n$）と行列 $B$（サイズ：$n \times p$）の積 $C = AB$ は、$m \times p$ の行列になります。  
$C$ の各要素 $c_{ij}$ は、次の式で計算されます。

$$
c_{ij} = \sum_{k=1}^{n} a_{ik} b_{kj}
$$

実際にやってみましょう。

## 計算例
$A$ $(2×3)$と$B$ $(3×2)$の積$AB$の計算

```math
A = \begin{pmatrix}
1 & 2 & 3 \\
4 & 5 & 6
\end{pmatrix}, \quad
B = \begin{pmatrix}
7 & 8 \\
9 & 10 \\
11 & 12
\end{pmatrix}
```

```math
AB = \begin{pmatrix}
(1*7 + 2*9 + 3*11) & (1*8 + 2*10 + 3*12) \\
(4*7 + 5*9 + 6*11) & (4*8 + 5*10 + 6*12)
\end{pmatrix}
```

皆さんは、この計算を頭の中で正しく行うことができるでしょうか？
正直、難しいと思います。私は、試験でこの計算をミスして、成績を落としました。

### 提案したい手法

行列の掛け算は、頭の中ですると、とても大変です。
しかし、ちょっと見方を変えてみると、すこし楽になります。

その見方は、

*行列の積を簡単な行列の積に分解する*

というものです。上の例でやってみます。
Aを列ベクトルに分解してみます。

```math
A = \left[ 
\begin{pmatrix} 1 \\ 4 \end{pmatrix},\ 
\begin{pmatrix} 2 \\ 5 \end{pmatrix},\ 
\begin{pmatrix} 3 \\ 6 \end{pmatrix}
\right]
```

今度は、Bを行ベクトルに分解してみます。

```math
B = \begin{bmatrix}
\begin{pmatrix} 7 & 8 \end{pmatrix} \\
\begin{pmatrix} 9 & 10 \end{pmatrix} \\
\begin{pmatrix} 11 & 12 \end{pmatrix}
\end{bmatrix}
```

このとき、行列の積は以下のような方法で計算することができます。

```math
AB = 
\begin{pmatrix}
1 \\ 4
\end{pmatrix}
\begin{pmatrix}
7 & 8
\end{pmatrix}
+
\begin{pmatrix}
2 \\ 5
\end{pmatrix}
\begin{pmatrix}
9 & 10
\end{pmatrix}
+
\begin{pmatrix}
3 \\ 6
\end{pmatrix}
\begin{pmatrix}
11 & 12
\end{pmatrix}
```

このように、行列の積は、$$ ((n,1) 型の行列) \times  ((1,n)型の行列)$$
の積に分解することができます。
それぞれの行列の積は簡単にできると思います。

つまり、行列の積を、簡単な行列の積に分解して、最後に足すことで
計算を書き起こすことができます。


計算ミスを減らしたいときに便利です。

## まとめ
- 行列の積は分解できる
- 難しい行列の積は、分解して、最後に足すことで比較的楽になる

## 参考資料
- [MITの講義](https://www.youtube.com/watch?v=FX4C-JpTFgY&list=PL221E2BBF13BECF6C&index=9)
PHP における null と "" と 0 の振る舞い比較

# はじめに

PHP では、null（値がない状態）・空文字列（""）・数値の 0 はいずれも「Falsy（偽とみなされる）」値ですが、式や関数での扱いには微妙な違いがあります。それぞれの扱いについて、ふわっととした理解でいる気がしたので、本記事では以下の観点から比較・検証・整理してみようと思います！

## PHPのバージョン
PHP 8.4.3

## 今回とりあげる挙動

1. if 文での評価
2. isset での判定
3. Null 合体演算子 (??) 

## 値の定義
| 値      | 型       | 内容                     |
| ------- | -------- | ------------------------ |
| `null`  | `NULL`   | 値が存在しない状態       |
| `""`    | `string` | 長さ 0 の文字列          |
| `0`     | `int`    | 数値のゼロ               |

# 1. if 文での評価

```php
php > $values = [null, "", 0];
php > foreach ($values as $v) {
php {     if ($v) {
php {         echo "truthy";
php {     } else {
php {         echo "falsy";
php {     }
php { }
falsyfalsyfalsy
```
null, "", 0 は**すべて falsy** と判定される。

# 2. isset での判定
```php
php >  $values = [null, "", 0];
php > foreach ($values as $v) {
php {   if (isset($v)) {
php {     echo "truthy";
php {   } else {
php {     echo "falsy";
php {   }
php { }
falsytruthytruthy
```

isset は 
変数が定義されていてかつ **null 以外 のときに true** を返す。


# 3. Null 合体演算子 (??)

```php
// nullの場合
php > $var = null;
php > echo $var ?? 'default';
default //右辺を返す

// 空文字の場合
php > $var2 = "";
php > echo $var2 ?? 'default';
// 空だけど左辺を返す

// 0の場合
php > $var3 = 0;
php > echo $var3 ?? 'default';
0 //左辺を返す
```

?? は 左辺が
- null のときのみ **右辺**を返す
- 空文字列や 0 は null ではないため、**左辺**が返る


# まとめと使い分け

| 判定／演算子         | `null`   | `""`     | `0`      |
| -------------------- | -------- | -------- | -------- |
| `if ($v)`            | falsy    | falsy    | falsy    |
| `isset($v)`          | false    | true     | true     |
| `$v ?? 'default'`    | default  | `""`     | `0`      |

**真偽判定** には if 文を使う
**存在確認** には isset を、
**デフォルト設定** には Null 合体演算子
以上を意識していくといいのかもしれません！！
信じるか信じないかは、あなた次第です！
2025/4/29主にITとかセキュリティの記事

アジア太平洋地域のデジタルトランスフォーメーションの真っ只中、産業の68%がいまだにサイバー攻撃を受けやすい(4/27)
https://voi.id/ja/teknologi/478465

「オムニウォー：脳をめぐる戦い」シンポジウム 2025年4月26日
https://alzhacker.com/omniwar-academia-weighs-in-on-the-battle-for-the-brain/

米国 FBI 2024年インターネット犯罪レポート(2025.04.23)(4/27)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2025/04/post-c9f354.html

日本人の7割が不安視する通勤中スマホの“見えない脅威”とは？(4/27)
https://news.yahoo.co.jp/articles/61d9b76a464566e94f67426c0b7b89af2c9b9f78

［社説］証券口座乗っ取り対策を急げ(4/27)
https://www.nikkei.com/article/DGXZQODK25B020V20C25A4000000/

証券会社口座乗っ取り被害急増　株価操縦狙いか、身に覚えのない中国株が購入される例も(4/27)
https://www.sankei.com/article/20250427-YXVUJEL6KZLTXLM4ZF7QOYTMWM/

DXビジネス強化へ2段構え、NECが乗り出した体制シフトの中身(4/27)
https://newswitch.jp/p/45490

10Gブロードバンド：中国が世界初の商用ネットワークを雄安新区で展開、従来の10倍速インターネット時代へ(4/27)
https://innovatopia.jp/uncategorized/52773/

GWに読みたい「ビジネス力＆教養力」爆上げの3冊！書評のプロが選んだオススメ本とは？(4/27)
https://diamond.jp/articles/-/363865?page=4

ウクライナのいくつかの電子決済システムが混乱しています(4/26)
https://voi.id/ja/teknologi/478413

広島"ゆめタウン"高収益の訳(4/28)
https://news.nifty.com/article/magazine/12179-4059610/

創業者は社食でいつも肉うどんを食べた…業界脅威の営業利益率誇る広島のスーパー｢ゆめタウン｣高収益の秘密(4/27)
https://president.jp/articles/-/94923

「恋に落ちたと思ったら」約10億円詐取…韓国・若き詐欺師、資産家女性を狙い撃ち(4/27)
https://www.afpbb.com/articles/-/3575126?cx_part=top_category&cx_position=5

何ができる？いつから？iPhoneへのマイナンバーカード機能搭載によって変わること(4/27)
https://dime.jp/genre/1952422/
つぐもんを支える技術（Web Components,D3.js,XSLT,Jakarta EE）

# はじめに

私は[つぐもん](https://tsugumon.net)という、アンケート、掲示板、アップローダーを統合した野心的なサイトを開発・運営しています。
本記事では、このつぐもんの技術構成について紹介します。
採用した技術は、流行しているものとは離れたものがほとんどです。
特に理由があってというのではなく、流れで何となくといった感じです。

## 採用した技術スタック
サーバーサイド：Jakarta EE（Javaエンタープライズ環境）

テンプレートエンジン：Framexs（クライアント駆動のXSLTフレームワーク）

データ形式：JSONではなくXHTML

フロントエンド：Web Components

データビジュアライゼーション：D3.js

プログラミング：Chain of Responsibility

## 各技術の選定理由
### Jakarta EE
SpringではなくあえてJakarta EEを選んだ理由というのは、実は技術的な観点からはありません。
初めに学んだのがJakarta EEだったから、というだけです。
PHPではなくJavaを選んだ理由なら、JPAが理由になります。
特にJPQLがいいですね。生SQLは書きたくないです…

### Framexs
クライアントサイドで２つのXHTMLを合成してHTMLへ変換を行うことで、サーバーの負荷を軽減しつつ、柔軟なUI生成を実現する技術です。
概要はここで把握できます。

[HTML5はXHTMLで楽に書ける？XSLTによるMVCライクなフレームワーク framexs を開発したので解説するよ](https://qiita.com/nandaka_furari/items/80528c0882479c059f96)

もともとGitHub Pagesに使っていたのですが、JSPとの相性がよさそうな気がしたので、採用してみました。
課題はありますが、JSPを書くのがらくらくです。
```xml
<?xml-stylesheet type="application/xml" href="https://tsugumon.net/framexs.xsl"?>
<?framexs.skeleton https://tsugumon.net/bbs/template.ftml?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" prefix="og: http://ogp.me/ns#" xmlns:v-on="urn:v-on" xmlns:v-bind="urn:v-bind">
...
```

### XHTML
appendすればそれで済むことが多かったので採用してます。Web Componentsとの相性ばっちり。らくらく
```xml
<template xmlns="http://www.w3.org/1999/xhtml">
<div class="comment-list">

<div class="comment">
<div class="comment-header">
...
</div>
</div>
</template>
```
```javascript
const fragment = parser.parseFromString(text, "application/xhtml+xml").documentElement.content;		
fragment.querySelectorAll("pre.tsugumon-text").forEach(e=>parseTsugumonText(e));
while(this.comments.firstChild) this.comments.removeChild(this.comments.firstChild);
this.comments.append(fragment);
...
```

### Web Components
カスタム要素がとにかく強力。軽量かつ標準で、特定フレームワークに依存しないのは精神的に楽です。
```html
<thread-comments id="thread-comments" thread-id="889" type="latest" page="1" max="10" v="1">
読み込み中です……
</thread-comments>
```

### D3.js
動的なデータ可視化に特化しており、Web Componentsとの組み合わせにより柔軟な表現が可能になります。
```html
<pie-chart id="crossPieChart" width="400" height="400" threshold="0.0.5" total="179" type="csv" src="https://tsugumon.net/resources/csv/enquete/56">
<attributes style="max-width:600px;width:100%"></attributes>
</pie-chart>
```
といった書き方でグラフを呼び出せるのでいったん作ってしまえばあとは楽です。

### Chain of Responsibility
コメントの中でURLを解析して埋め込みコードに変換する必要があったのですが、まさかのオブジェクト指向設計が役に立ちました。

## まとめ
今回紹介した技術構成は、標準技術や昔捨てられた技術を振り返ってみたらどうなるか、という観点から面白いのではないかと思います。

「つぐもん」は、初めから意図してこうなったわけではないのですが、今の流行を何も考えずに追うだけの風潮への疑問を形にしたい気持ちでなったのは確かにあります。

興味を持たれた方は、ぜひ[掲示板の情報系板](https://tsugumon.net/bbs/board?id=4)までお越しください。
AWSを頑張らずにAmplifyのビルド結果をSlackに通知する

## はじめに
全然厳密じゃないと思う

## 何がしたい

Apmlifyでホスティングしているアプリケーションのビルド結果をSlackに通知したい。

## 何がつらい

Amplifyの機能でメールに通知はできそう。
だけどSlackへの通知はAWSをいろいろ頑張れって情報が出てくる。
AWSはよくわからないし頑張りたくもない。

## どうするか

Amplifyのビルドコマンドの前後に通知コマンドを仕込んでしまう。

## 具体的な方法

※nextでやってます。他のフレームワークetcの場合はわかりません。

AmplifyのApp作成時にビルドコマンドを設定しているはず。
コンソールからでも`amplify.yml`をダウンロードして修正するでもよし。

```yml
preBuild:
  commands:
    - ${開始を通知するコマンド}
    - npm ci --cache .npm --prefer-offline || ${失敗を通知するコマンド}
build:
  commands:
    - npm run build || ${失敗を通知するコマンド}
postBuild:
  commands:
    - ${成功を通知するコマンド} 
```

コマンドの中身は自分で考えてください。
環境変数を拾えるので環境ごとに通知先を分けたりも可能なはず。

## おわりに

こういう甘えは怒られそう。
DeepSDFのbuildに関する備忘録

DeepSDFのbuildに詰まった箇所備忘録

# 依存関係
環境はwslのubuntu24
### CLI11, nanoflann, Eigen3
最新版をインストールしてok(状況に応じて要求cmakeのversionを書き換え)

### Pangolin v0.6推奨
最新版をインストールするとDeepSDFのビルド時にopengl周りでエラーが出る
まわりを最新バージョンで、そのままbuildするとeigenのバージョンやcstdintのインクルードに関するエラーが出るため、必要に応じてPangolinのコードを書き換え(詳しいことはchatgptなどが教えてくれる)

# DeepSDFのbuildに関して
Pangolin::getに関してエラーが発生したらstd::getに書き換え
utils.h7行目のnanoflann/nanoflann.hをnanoflann.hに書き換え
Pythonでモードアニメーション

## Pythonによる簡易的なモードアニメーションの例

**Sin波形の振幅が変化するアニメーションプロット**

```mode_anim.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# モード形状データ（例）
x = np.linspace(0, 10, 100)
mode_shape = np.sin(x)

# アニメーション用データ生成
def update(frame):
    line.set_ydata(mode_shape * np.sin(2 * np.pi * frame / 100))
    return line,

# プロット設定
fig, ax = plt.subplots()
line, = ax.plot(x, mode_shape)
ax.set_ylim(-1.5, 1.5)

# アニメーション作成
ani = FuncAnimation(fig, update, frames=100, interval=50)

# GIFとして保存
ani.save("animation.gif", writer='pillow', fps=10)

# アニメーションの表示
plt.show()
```

![animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1979979/f963ca8b-f58d-475a-9ddb-3f5adef27a2d.gif)
【Office】Amazonで購入したMicrosoft Office永続版プロダクトキーを使って、Officeをライセンス認証する

## 概要
Amazonで購入したMicrosoft Office永続版の認証手順がひとクセあったのでメモ。今回購入したのはOffice Home 2024のプロダクトキーなので、Business版とかだとちょっと違うかも。

## Microsoftアカウントを作成する
Amazonで購入したプロダクトキーは、後の手順でMicrosoftアカウントに登録しないとOfficeが使えません。したがって、あらかじめMicrosoftのアカウントを作成、サインインできる状態にしておく必要があります。

## プロダクトキーを確認、登録する
購入手続き後、注文履歴からOfficeの項目を見つけて「ライブラリへ移動する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/83da640e-86b6-482a-9d55-d897db62c6b8.png)

これまでダウンロード購入したものが表示されます。Officeの項目を見つけて、プロダクトキーをコピーなりメモなりしてから「office.comへ進みダウンロードの手続き」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/e2e2e804-63ee-447b-814c-2cf42b717488.png)

Microsoftのサイトへ移動するので「プロダクトキーは既に入力されていますか？」云々のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/2b8382ea-a41d-4de5-8c55-f3a4f218bed0.png)

サイドバー上の「サブスクリプション」から、「コードまたはプリペイドカードを利用する」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/93226362-757a-4d42-b66c-2519e070032e.png)

なぜか、1つ前の画面に戻されます。えぇ！？　落ち着いて「始める」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/fae57e5d-4b06-4ff5-abee-ca8141140e6b.png)

すると、プロダクトキーの入力画面が表示されます。最初から「始める」ボタンを押すと、こうはならなかった。何でやねん。プロダクトキーを入力して「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/3423e926-4e0f-4031-b56e-dce337332c80.png)

確認画面みたいなやつが出るので、「利用」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/b089ab3f-9a1b-45cf-af7a-4b859c18a266.png)

Microsoftアカウントのページにまた遷移するので、サイドバーの「サブスクリプション」タブをクリックします。購入済みの製品としてOfficeが表示されているので「インストール」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/b9372646-c49d-4928-8279-9dd272e650f5.png)

ダイアログが開きます。バージョンはそのままで進めましたが、他には32bit or 64bitの選択と、オフラインインストール版がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/3c6623d4-299a-4c6a-9407-ea02ee9871e6.png)

インストーラーのダウンロードが始まるので、待ちます。7MBぐらい。

## インストーラーの実行
前項で落としてきたインストーラーをダブルクリックで実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/4d04aeca-4126-4ebd-839b-8cc0d6ef906d.png)

インストール処理が実行されるので、待ちます。そないにすぐでもなかった。15分ぐらいかな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/d1a5f03b-2013-412a-8125-583898226aba.png)

終わったみたいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/ead3a65b-1044-411a-bf2a-c0bbde5227e7.png)

インストールされたExcelをWindowsのアプリメニューから起動しました。「はじめに」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/ca8cc992-857a-445d-88bc-64a9ea7c4f8a.png)


「同意する」をクリックします。必要な手順はここまで。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/b37e1664-37a6-4379-87e6-0ab18c437de3.png)

認証を済ませたExcel。ライセンス認証されていないので云々とか、出てません。素敵で過酷なOfficeライフをお楽しみくだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3906608/256ca49f-648a-4dba-a734-0fcdf89faa5c.png)
【Rails】devise(Gem)について

# 記事概要
Ruby on Railsのdevise(Gem)について、まとめる

# 前提
- Ruby on Railsでアプリケーションを作成している

# deviseとは
ユーザー管理機能を簡単に実装するためのGem

## ビューファイル
deviseに用意されたビューファイルは、編集できない
編集したい場合は、`app/views`配下にビューファイルをコピーする

## コントローラー
deviseに用意されたコントローラーは、編集できない
`devise_parameter_sanitizer`メソッドを使用することで、パラメーターの取得を可能にする

usersコントローラーを作成することで、マイページなどを作成することが可能になる
※usersコントローラーはdeviseに用意されたコントローラーではないため、編集できる

## 自動設定されるバリデーション
||自動設定されている制約|
|-|-|
|email|・存在すること<br>・一意であること<br>・@を含むこと|
|password|・存在すること<br>・6文字以上であること<br>・128文字以下であること<br>・password_confirmation項目と値が一致すること|



# Gemのインストール手順
https://qiita.com/likapantrip/items/d7317b9ece36b58dffd6#手順

# Gemfileの記述
https://qiita.com/likapantrip/items/c8718db9a4e72b7c6ad0#devise

# 手順(基本設定)
1. deviseの設定ファイルを作成するため、下記コマンドを実行する
    ```
    % rails g devise:install
    ```

# 手順(モデル作成)
1. Userモデルを作成するため、下記コマンドを実行する
    ```
    % rails g devise user
    ```
1. routes.rbに、下記ルーティングが自動的に追記されたことを確認する
    ```ruby
    Rails.application.routes.draw do
      devise_for :users
      # 省略
    end
    ```
    `devise_for`は、ユーザー機能に必要な複数のルーティングを一度に生成してくれるdeviseのメソッド

# 手順(テーブル作成)
1. `db/migrate/yyyymmddhhmmss_devise_create_users.rb`が作成されていることを確認する
1. メールアドレス・パスワードなどの基本的な項目は、既にカラムが用意されていることを確認する
1. テーブルを編集し、マイグレーションを実行する
    [こちら](https://qiita.com/likapantrip/items/6e94b32d8ea9ad266964#手順マイグレーション)を参照する
1. [サインアップ画面](http://localhost:3000/users/sign_up)や[サインイン画面](http://localhost:3000/users/sign_in)などが、自動生成される

# 手順(ビューファイル作成)
1. ビューファイルを編集するため、deviseに用意されたビューファイルをコピーして`app/views`の配下に配置する
    ```
    % rails g devise:views
    ```
1. `app/view/device`配下にビューファイルが生成される
    |画面|ビューファイル|
    |---|---|
    |サインアップ画面|app/views/devise/registrations/new.html.erb|
    |サインイン画面|app/views/devise/sessions/new.html.erb|

# 手順(ストロングパラメーター追加)
1. [application_controller.rb](https://qiita.com/likapantrip/items/6ff3ef0bd562e6fb961a)に、[devise_parameter_sanitizerメソッド](https://qiita.com/likapantrip/items/655e2c8fc2d4c02eb12e#devise_parameter_sanitizerメソッド)を追加する
    ```ruby
    class ApplicationController < ActionController::Base
      # devise_controller = Gemのdeviseに関するコントローラー(VSCodeで目視できないが、devise_controller.rbみたいなコントローラーが複数ある)の処理
      # deviseに関するコントローラーで処理を行う場合、メソッド[configure_permitted_parameters]を事前実行する
      before_action :configure_permitted_parameters, if: :devise_controller?
    
      # 省略
    
      private
      def configure_permitted_parameters
        # 指定した処理を実行する場合、指定したキーはパラメーターとして使用できる
        devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
      end
    end
    ```

# 手順(コントローラー作成)
1. usersコントローラーを作成するため、下記コマンドを実行する
    ```
    % rails g controller users
    ```
1. `app/controllers/users_controller.rb`が作成されたことを確認する

# Ruby on Railsまとめ
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a
JavaScript学習ログ　配列処理関係のメソッドその1

## ■値の追加と削除

### .push()

配列の末尾に要素を追加。

```jsx
const arrayNum = [10,11,12];
arrayNum.push (13,14);
console.log(arrayNum);
//(5) [10, 11, 12, 13, 14]
//array自体の配列が書き換えららえる。
```

### .unshift()

配列の先頭に要素を追加。

```jsx
arrayNum.unshift (8,9);
console.log(arrayNum);
//(7) [8, 9, 10, 11, 12, 13, 14]
//arrayNum自体の配列が書き換えらえる。
```

### .pop()

配列の最後の要素を取り出して削除する。引数はとらない。

```jsx
arrayNum.pop(); 
console.log(arrayNum);
//(6) [8, 9, 10, 11, 12, 13]
// → 最後の「14」が削除される
```

### .shift()

配列の先頭の要素を取り出して削除する。引数はとらない。

```jsx
arrayNum.shift();
console.log(arrayNum);
//(5) [9, 10, 11, 12, 13]
// → 先頭の「8」が削除される
```

## ■配列自体の操作

### .join()

配列を区切る文字列の操作。引数に何も入れないと区切り文字はカンマ。引数を入れると指定された文字列が表示される。

`join`は配列を変えない（破壊しない）

```jsx
const array = ['ぶり','はまち','まぐろ'];
array.join();
console.log(array);
//(3) ['ぶり', 'はまち', 'まぐろ']

array.join(' / ');
console.log(array);
//(3) ['ぶり', 'はまち', 'まぐろ']
//配列自体は変えないので['ぶり','はまち','まぐろ']と表示される。

console.log(array.join(' / '));
//ぶり / はまち / まぐろ
```

- `console.log(array)` → **配列**
- `console.log(array.join(' / '))` → **文字列**

### .fill()

第一引数に指定した要素で配列を埋める。指定した値で元の配列の要素を上書きする。

```jsx
console.log(array.fill('はまち'));
//(3) ['はまち', 'はまち', 'はまち']
//配列を上書きする

const array02 = new Array(5);
//(5) [空 × 5]

console.log(array02);
console.log(array02.fill('ーーー'));
//(5) ['ーーー', 'ーーー', 'ーーー', 'ーーー', 'ーーー']

console.log(array02.fill('✴︎',4));
//(5) ['ーーー', 'ーーー', 'ーーー', 'ーーー', '✴︎']
//第二引数の数字が（0から数えたときの）先頭位置になる

console.log(array02.fill('✴︎',0,4));
//(5) ['✴︎', '✴︎', '✴︎', '✴︎', '✴︎']
//第三引数の数字が（0から数えたときの）末尾の位置になる
```

### .reverse()

配列の向きを逆にする。

```jsx
const array03 = ['カレー','西京焼き','蕎麦'];

console.log(array03.reverse());
//['蕎麦', '西京焼き', 'カレー']

console.log(array03);
//['蕎麦', '西京焼き', 'カレー']
```

### .toReversed()

配列の向きを逆にする。配列は上書きされない。2023年に登場した新しいメソッドなので対応ブラウザに注意。

```jsx
const array04 = ['カレー','西京焼き','蕎麦'];
console.log(array04.toReversed());
//['蕎麦', '西京焼き', 'カレー']
console.log(array04);
//['カレー', '西京焼き', '蕎麦']
```

### .float()

ネスト（入れ子）された配列を平坦化させる。

```jsx
const array05 = [1,2,[3,4]];
console.log(array05.flat());
//(4) [1, 2, 3, 4]
```