OmniAICreator/Qiita-1.07M huggingface dataset:
LuaLatex環境下でBibLatexを使って複数参考文献のスタイルを設定

# LuaLatexでBibLatexを使う
同様の記事が見つからなかった．．．
同じような問題を抱えている人がいるかもしれないので．

## 目的
複数の文献を1つの箇所で引用する時に[1-2]のようにしたい (multiple citationと検索するとよさそう)．

## 問題
上の目的を達成するため，citeパッケージを使うという記事が多いが，私の環境では参考文献の数字の部分が"?"になってしまった．

## 解決策
スタイルを指定するのではなく，以下のように参考文献のスタイル (bibstyle)と引用のスタイル (citestyle)を別々に指定する．
```
\usepackage[bibstyle=ieee,
citestyle=numeric-comp,
maxnames=99,maxnames=2,
url=true,doi=true,
hyperref=true,
bibencoding=utf8,
backend=biber
]{biblatex}
```
参考：[biblatex のオプションの解説](https://qiita.com/shiro_takeda/items/fac1351495f32c224a28#-bibstylefile)

## 補足

このままでも[課題](https://accounts.google.com/gsi/iframe/select?client_id=717762328687-iludtf96g1hinl76e4lc1b9a82g457nn.apps.googleusercontent.com&auto_select=false&ux_mode=popup&ui_mode=card&as=RFXy4pynYKyxYanQC1y2YA&is_itp=true&channel_id=59e0d38470ee3f513bd3ee3f5668f7d975dfec6e686cbb7052d53cd9f01b6fb2&origin=https%3A%2F%2Ftex.stackexchange.com)はありそうなので，様子見．

間違い等あればコメントください．
Rを学びたい Step6(レーダーチャート)

## はじめに
Rを学びたい！Step6です。レーダーチャートを表示する。

## ソースコード

```R:
# fmsbパッケージを読み込む
library(fmsb)

# PNGデバイスを開く
png("radar_chart.png")

# データフレームの作成
data <- data.frame(
  A = c(5, 3, 4, 2, 4),
  B = c(4, 2, 5, 3, 3),
  C = c(3, 4, 2, 5, 4),
  D = c(2, 5, 3, 4, 2),
  E = c(4, 3, 5, 2, 5)
)

# 最大値と最小値の行を追加
data <- rbind(rep(5, 5), rep(1, 5), data)

# フォントの設定
par(family = "HiraginoSans-W3")

# レーダーチャートの作成
radarchart(data, axistype = 1, 
           pcol = c("red", "blue", "green", "purple", "orange"), 
           pfcol = c("#FF9999", "#9999FF", "#99FF99", "#FF99FF", "#FFCC99"), 
           plwd = 2, 
           cglcol = "grey", 
           cglty = 1, 
           axislabcol = "grey", 
           caxislabels = seq(1, 5, 1), 
           cglwd = 0.8, 
           vlcex = 0.8)

# 凡例の追加
legend("topright", legend = c("A", "B", "C", "D", "E"), col = c("red", "blue", "green", "purple", "orange"), lty = 1, lwd = 2)

# PNGデバイスを閉じる
dev.off()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/1b0362c9-eca3-e316-e673-15ec24b02b5f.png)
効率的なMySQLユーザー管理と権限付与の手順

MySQLで新しいユーザーを作成し、権限を付与するためのコマンドは以下の通りです。

---

### **1. 新しいユーザーの作成**

次のコマンドで新しいユーザーを作成します。

```sql
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
```

- `username`: 作成するユーザー名。
- `host`: ユーザーが接続可能なホスト（例: `localhost` や `%`）。
  - `localhost`: ローカル接続のみ許可。
  - `%`: 任意のホストから接続を許可。
- `password`: ユーザーのパスワード。

例: ユーザー `testuser` をパスワード `securepassword` で作成し、任意のホストから接続を許可する場合：

```sql
CREATE USER 'testuser'@'%' IDENTIFIED BY 'securepassword';
```

---

### **2. 権限を付与する**

次のコマンドでユーザーに権限を付与します。

```sql
GRANT privileges ON database.table TO 'username'@'host';
```

- `privileges`: ユーザーに付与する権限（例: `ALL PRIVILEGES`, `SELECT`, `INSERT`, `UPDATE`, `DELETE`）。
- `database`: 権限を付与するデータベース名（例: `mydb`）。
- `table`: 権限を付与するテーブル名、またはすべてのテーブルの場合は `*`。

例: データベース `mydb` のすべてのテーブルに対して、`testuser` にすべての権限を付与する場合：

```sql
GRANT ALL PRIVILEGES ON mydb.* TO 'testuser'@'%';
```

---

### **3. 権限の反映**

付与した権限を即時反映するには、次のコマンドを実行します。

```sql
FLUSH PRIVILEGES;
```

---

### **4. 作成したユーザーの確認**

作成したユーザーとその権限を確認するには以下を実行します。

```sql
SELECT User, Host FROM mysql.user;
```

権限を確認する場合：

```sql
SHOW GRANTS FOR 'username'@'host';
```

例: `testuser` の権限を確認する：

```sql
SHOW GRANTS FOR 'testuser'@'%';
```

---

### **まとめ**

1. ユーザー作成:

```sql
CREATE USER 'testuser'@'%' IDENTIFIED BY 'securepassword';
```

2. 権限付与:

```sql
GRANT ALL PRIVILEGES ON mydb.* TO 'testuser'@'%';
```

3. 権限反映:

```sql
FLUSH PRIVILEGES;
```

これで、新しいユーザーが作成され、権限が付与されます。必要に応じて、特定の権限（例: `SELECT` や `INSERT` のみ）を付与するように変更してください。
オンプレのGitリポジトリをGitHUBに移行する方法

# はじめに
オンプレで運用していたGitリポジトリ。　これを履歴やブランチ含めてGitHubに移行しようと思う。
GitHubのimportでも出来そうであるがオンプレのGitリポジトリであるがゆえGitHubから参照できない。
よってコマンドベースで移行を行う。　ちなみにWindows11で実行。

## 大まかな手順
1. 移行元のリモートリポジトリからcloneする
1. GitHub側にリポジトリを作成する
1. 作成したGitHubのリポジトリに対してpushする

## 1.移行元のリモートリポジトリからCloneする
* 移行元のリモートリポジトリを保存したいフォルダを作成する
　ここでは「C:\temp\moto」というフォルダを作成したとする
* Windowsのコマンドプロンプトを起動する
* 作成したフォルダに移動する
　```cd \temp\moto```
* gitコマンドにて移行元のリモートリポジトリをcloneする
　```git clone --mirror 移行元のリモートリポジトリURL```
:::note
移行元のリモートリポジトリURLが分からないときは、TortoiseGitなどでクローンするときのURLだと思ってもらえればよい
:::
:::note warn
コマンドプロンプトはまだ閉じないように！
:::

## 2.GitHub側にリポジトリを作成する
* 中身は何もなくて良い（移行元と違うリポジトリ名を作成しても良い）
**ここでは「xyz」というリポジトリを作成したとする**

## 3.作成したGitHubのリポジトリに対してpushする
* 1でcloneしたgitフォルダに移動する
　```cd abc.git```
:::note
移行元のリモートリポジトリが「abc」という名前だったとして解説
```C:\temp\moto\abc.git``` というフォルダに移動しているはず
:::

* Gitのpush先をGitHubのリポジトリに設定する
```git remote set-url origin https://github.com/userspace/xyz.git```

* mirrorプッシュしてリポジトリ情報を登録する
```git push --mirror```

:::note
GitHubのログインを要求される場合があるが、ログインすればpushされる
:::

エラーなくコマンドが終了すれば移行が完了している
TestContainerを使ったテスト

WebAPIが呼び出しているDomain Serviceのテストを行います。
WebAPIは架空のユーザデータのCRUDをDB(今回はPostgres)を利用しています。
テストはWebAPIに対して行い、Test Containersが用意したDBに接続し、毎回初期データが入った状態でテストをします

:::note info

この時期は以前書いた[TestContainer for .Netを使い、まっさらなDBでUnitTestを行う](https://qiita.com/k-yamamoto/items/93a714ceda7eaa47f9cf)のアップデート版です
:::

# 環境

1. Vusla Studio 2022
1. .NET9
1. xUnit
1. TestContainers
1. Postgres
1. EntityFrameworkCore
1. [A5:SQL Mk-2](https://a5m2.mmatsubara.com/)

今回紹介する方法のメリットは
1. 本番と同様のDBを利用可能
1. 初期データの作成、投入か簡単
1. InsertやDeleteが可能(毎回データが初期化されるので)
1. 初期データはGitで管理することにより共有が可能
1. 開発、テストが楽
といったところでしょうか。

# ソースの準備
WebAPIを想定しサンプルソースを準備しました。
[リポジトリ](https://github.com/kyamamoto03/TCTest)

# ソースの構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/51d9064a-6008-3314-6450-763f4b5beab2.png)

# 流れ

私は仕事でC#を使い、受注開発を行っています。
納品物としてデータベース定義書が求められる事から、コードファーストではなくER図ファーストでDBの開発を行っていきます。

```plantuml
    :ER図作成;
    :DDL出力;
    :init.sql作成;
    :DB起動;
    :テストデータ作成;
    :insert文出力;
    :init.sql追記;
    :DBの再起動;
    :TestContainerテスト;
```

# TestContainers
[TestContainers](https://testcontainers.com/)は実行時に指定したコンテナを実行。使い終わったら破棄を行ってくれます。
Postgresもサポートしています。
Postgres実行時にdocker-entrypoint-initdb.dにあるsqlファイルを実行してくれるので、ここにinit.sqlファイルを置きテーブル作成および初期データ投入をします。
サンプルソースの

```
db/tctest-postgresql/init/init.sql
```
にあります

init.sqlの最初には
```
\c postgres
```
と記述しDatabaseを指定します


# ER図作成
A5:SQL Mk-2を使い

テーブル:user_info
|論理名|物理名|型|
|-|-|-|
|ユーザID|user_id|varchar(100)|
|名前|name|varchar(100)|
|年齢|age|integer|
を作成

# DDL出力
A5:SQL Mk-2を使いDDLを出力

```sql
-- ユーザ
-- * RestoreFromTempTable
create table user_info (
  user_id varchar(100)
  , name varchar(100) not null
  , age integer not null
  , constraint user_info_PKC primary key (user_id)
) ;

comment on table user_info is 'ユーザ';
comment on column user_info.user_id is 'ユーザID';
comment on column user_info.name is '氏名';
comment on column user_info.age is '年齢';

```
上記のようなコードが出力されます。
これをinit.sqlの"\c postgres"より下にコピーします。

# DB起動
PowerShellなりでdbフォルダに移行し

```
docker compose up
```
で起動します。

A5:SQL Mk-2で接続します
|設定項目|設定値|備考|
|-|-|-|
|サーバ名|localhost||
|ポート番号|51557|docker-compose.ymlに記載|
|データベース名|postgres||
|ユーザ名|user|docker-compose.ymlに記載|
|パスワード|pass|docker-compose.ymlに記載|

# テストデータ作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/ff3b3d6c-43a5-927f-ad0c-78897d742dcd.png)

# insert文出力
A5:SQL Mk-2にて
テストデータを全選択し、Insert文を出力します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136187/4f961680-1210-20d5-a652-3637f18c4587.png)

# init.sql追記
Insert文をinit.sqlのDDLの下にコピー

# DBの再起動
init.sqlにDDL + 初期データ投入SQLが記載された段階でPostgresを起動しなおします。

docker-compose.ymlがあるフォルダにて
```
docker compose down
```
Postgresを削除
```
docker compose up
```
で起動
A5:SQL Mk-2にて、作り直したPostgresに初期データが入っていることを確認します

# TestContainerテスト
Visual StudioにてxUnitでテストを実行します。
Testファイルを実行するたびに、TestContainersがPostgresを起動しテストコードを実行します。

# おわりに
デバッグ、テストで同じ初期データを使えるので、開発、テストが楽になりました。
テーブル、初期データを追加した場合でも、他のメンバーはコンテナを作成し直すことで、ソースと同期したDBを準備することができます。
まずは[リポジトリ](https://github.com/kyamamoto03/TCTest)をクローンしテストしてみてください
Dockerのログローテーションをした方が良い話

皆さんはdocker-composeを使って社内システムを運用していたりしませんか？
そんな時に、docker-compose.ymlファイルにログローテーションの設定を入れていますか？
私は、Redmineをdocker-composeを用いて運用していましたが、上記対応を怠っていました。
そのため、半年ほど経ってから、ディスクの容量を確認したら、ログファイルだけで20GB程度まで膨れ上がっていました。ログファイルは`/var/lib/docker/containers/...`にあります。`du`コマンドで確認してみることをお勧めします。

上記理由から、docker-composeを使ってシステムを運用する場合は、必ずログローテーションの設定を入れましょう。
以下にログローテーション方法が記載されたリンクを示しておきます。
また、ログファイルが巨大になると、`docker logs`コマンドでログを参照しにくくなるという理由もあります。

# 参考
[docker-composeのログローテーション](https://qiita.com/mihyon/items/23206b3aacb291b5ded2)
【Unity】VisualStudioのUnityにアタッチボタンを調べた

# はじめに
この記事は[Hamster Output Advent Calendar 2024](https://qiita.com/advent-calendar/2024/game_hamster)の1日目の記事です！

ゲーム開発をする時に、ずっと気になっていた**Unityにアタッチというアイコン**...Unityでゲーム開発をしている人はソースコードを書く時に、目にしたことがあるはず(多分)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/2e262d00-ef73-8b4a-8526-957e4d63487c.png)

今回の記事はこのアイコンの機能について調べた内容です！

# テスト用の環境を作る
数値の代入、ログを出すスクリプトの作成とGameObjectにアタッチするだけです！

・スクリプト
```C#
using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        int a = 100;
        int b = a;
        Debug.Log(b);
    }
}
```

・GameObjectにアタッチ
![img](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/33e90b06-0ee6-37cd-62f7-453f3f307277.png)

・コンソールでログを確認
数字が出ました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/89531995-2e49-d157-6f27-9a649edc7219.png)

# 本題
Unityにアタッチを押します！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/925663d0-a591-78d8-a3ac-2523b73f8cd4.png)

コードエディタでUnityにアタッチを押した後、Unityエディタに戻るとロードが入ります。ロードが終わると画像の警告文が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/99c3be28-5605-be9f-be41-a2e76c1d233a.png)

左から順に翻訳した内容を載せます！

``・Enable debugging for this session``
このセッションのみデバックを有効にする 
※この作業中の時だけ有効にする。再起動したらいつもの設定にもどるよ

``・Enable debugging for all projects``
全てのプロジェクトでデバックを有効にする

``・Cancel``
デバックモードを有効にせずキャンセル

今回は一番左のこのセッションのみを選びます。ここで、コードエディタに戻ると、上の再生アイコンが停止アイコンになっていたり、コードエディタの下側の色が変わり準備完了と表示さています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/fc4bffd7-a79c-9814-d348-d9475787a9a1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/cbd2530d-5e66-868c-eb44-ee71fab06d2d.png)

次に、コードエディタ上の該当行数をブレークポイントにします。グレー色の縦線の場所を押すと画像のように赤丸が出てきて、該当行数も赤色で囲われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/a1f93908-d392-ffad-de02-38aee7fe2c26.png)

ブレークポイントを設定したらUnityエディタに戻って再生してみます。いつもならログが出ますが、今回は出てきません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/1653fe28-69ab-b600-8d30-44e01927818f.png)

次にコードエディタを確認すると、ブレークポイントに設定した箇所が黄色で囲われていおり、処理がその場所で止まっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/77f3b33a-6b12-194c-e096-cdbbee56643e.png)

つまり、Unityにアタッチというボタンの正体はVisualStudioのデバッグ機能を有効にするボタンだということが分かりました！

ローカルから値を変えることもできるみたいですが、変更しても元の値に戻ってしまうのでUnityだと利用できないのかな...?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/bd4ba985-c48c-6f78-db83-23ccac0a0e32.png)

ブレークポイント以外に使える機能を調べて見ましたが、VisualStudio上では灰色になって使えなくなっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588406/bfb759e2-4006-7dc2-29c4-924a7852fdf1.png)

ドキュメントにもブレークポイントに関しての説明しかないので、それ以外の機能は使えないのかな？と思います。

https://docs.unity3d.com/ja/2022.3/Manual/ManagedCodeDebugging.html

# 結論
**UnityにアタッチはVisualStudioのブレークポイントが使えるボタンだった！**
Rを学びたい Step5(ヒストグラム)

## はじめに
Rを学びたいStep5です。今回はヒストグラムを作成します。

## ソースコード

```R:
# PNGデバイスを開く
png("histogram_plot.png")

# ベクトルの作成
data <- c(12, 2, 5, 8, 7, 10, 3, 6, 9, 4, 11, 1, 4, 7, 6, 9, 2, 5, 8, 3)

# ベクトルの内容を表示
print("ベクトルの内容:")
print(data)

# フォントの設定
par(family = "HiraginoSans-W3")

# ヒストグラムの作成
hist(data, breaks = 5, col = "blue", main = "ヒストグラム", xlab = "値", ylab = "頻度")

# PNGデバイスを閉じる
dev.off()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/ff5dc15b-7556-1482-90ef-f5160cc11f0f.png)
Rを学びたい Step4(棒グラフ)

## はじめに
Rを学びたいStep4です！今回は棒グラフを作成します

# ソースコード

```R:bar_plot.R
# PNGデバイスを開く
png("bar_plot.png")

# 行列の作成
mat <- matrix(c(12, 2, 5, 8, 7, 10, 3, 6, 9, 4, 11, 1, 4, 7, 6, 9, 2, 5, 8, 3), nrow = 10, ncol = 2)

# 行列の内容を表示
print("行列の内容:")
print(mat)

# 各列の合計を計算
col_sums <- colSums(mat)

par(family = "HiraginoSans-W3")

# 棒グラフの作成
barplot(col_sums, names.arg = c("Column 1", "Column 2"), col = "blue", main = "棒グラフ", ylab = "合計値")

# PNGデバイスを閉じる
dev.off()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/dea580f0-f3e6-c9bb-4bfc-460484c6c28a.png)
Rを学びたい Step3(散布図)

## はじめに
Rを学びたいStep3です。散布図を作成します。

```R:plot_sample/scatter_plot.R
# PNGデバイスを開く
png("scatter_plot.png")

# 行列の作成
mat <- matrix(c(12, 2, 5, 8, 7, 10, 3, 6, 9, 4, 11, 1, 4, 7, 6, 9, 2, 5, 8, 3), nrow = 10, ncol = 2)

# 行列の内容を表示
print("行列の内容:")
print(mat)

# 散布図の作成
plot(mat[,1], mat[,2], xlab = "Column 1", ylab = "Column 2", main = "scatter", pch = 19, col = "blue")

# 回帰直線の追加
abline(lm(mat[,2] ~ mat[,1]), col = "red")

# PNGデバイスを閉じる
dev.off()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/6b410a35-6ca4-8fe6-c7bb-47ed5909dba3.png)
【Figma Plugins】Figma plugin 開発は面白い

## はじめに
みなさんはFigmaのpluginを使ってますか?

現在、公開されているFigmaのpluginは便利なものが多いです！
画像やイラスト、Iconなどを挿入してくれるPluginやアクセシビリティをチェックしてくれるPluginなど、⁨UIをつくるにあたって、とても便利ですよね？

ただ、公開されている汎用性の高いpluginでは、実業務の課題を解決してくれるものは少なく、見つけるのが大変です。 また、pluginを効果的に使うために、UIの作成フローを変えることも必要になるでしょう。

そのため、Qiitaでは、UIを作成する時の課題を解決するために、Figmaのpluginを開発し、業務を進めています。

そのため、この記事では、Qiitaで開発したFigmaのPluginを紹介しようと思います。


## Qiitaで開発したPlugin「Issue Syncer」
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/e4677568-09d3-3ee4-5f09-cd3b9a0338b4.png)

Qiitaで開発したPluginは、「Issue Syncer」という**Figmaのファイル**と**GithubのIssue**を同期させるプラグインです。

Qiitaでは、GitHubのIssueで仕事を管理し、1つのissueで、1つのFigmaファイルを作成し、Figmaのサムネイルでissueのステータスを管理しています。

この「Issue Syncer」というプラグインでは、Figmaのテンプレートファイルの作成から、ステータスに合わせたサムネイルの変更とGithub Issueの管理をFigma側から行ってくれます。

## 「Issue Syncer」を開発した理由

このpluginを開発することにした理由には、2点あります。

- **Issueに着手してから、UIの作成を始めるのに時間がかかること**
- **Issueのステータスに合わせて、Figmaのサムネイルを変更し忘れること**


### ◯ Issueに着手してから、UIの作成を始めるのに時間がかかること

Qiitaでは、Issueに着手し始めてFigmaファイルを作成するあたって、やらないといけないことが多いです。

具体的には、

1. テンプレートファイルをコピー
2. ファイルのタイトルを変更する
3. サムネイルにissue番号やタイトルを反映させる
4. GitHubのURLや関連するドキュメントのURLをFigmaに反映させる
5. GitHubのissueに、FigmaのURLをコメントする

このように、ファイルを管理するために、FigmaとGithubを行き来することが多かったです。

そのため、Issue Syncerでは、ファイルを作成して、GithubのURLを入力しボタンを押すだけで、以下をやってくれます。

1. Figmaのテンプレートファイルが作られる機能
1. GitHubのissueのStatusに合わせて、サムネイルが自動的に生成される機能
1. GithubにFigmaのURLをコメントする機能

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/80541c4e-7b4b-4dd7-6f74-827f85bfb7fd.png)


### Issueのステータスに合わせて、Figmaのサムネイルを変更し忘れること

Qiitaでは、GitHubでissueを管理しているため、エンジニアがFigmaのサムネイルをみて、開発できる状態なのかが判断できなくなっていました。

そのため、Issue Syncerでは、ボタンを押すだけで以下のような機能を開発しました。

1. Figmaのサムネイルの変更とissueのCloseが同時にできる機能
1. サムネールのステータスをissueに同期させる機能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/085fd0b9-6615-e90a-d11d-690c69ba9c9a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/75b45362-2d14-3557-6bfe-571fb08c0d0f.png)

## まとめ
このように、FigmaのPluginを自作すると、自分たちの課題や業務に合ったプラグインを開発できるので、よりデザインに集中できる環境を作ることができます。

今までは、こういうPluginあったらいいなと思っていた方やこういうPluginないかなと検索した方は、ぜひFigmaのPluginを作ってみてはいかがでしょうか？

Figma Plugin開発に関する記事は、僕がQiitaに記事を投稿しているので、興味がある方は、ぜひ記事もご覧ください。

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
【ChatGPT】の回答のハルシネーション率をできうる限りに下げるためのPromptを作成してもらいました。


　どうも、カーブミラーです。

　今回は、回答のハルシネーション率をできうる限りに下げるためのPromptを作成してもらいました

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　まずは、ニュース？

　ChatGPT のWeb版の
　　送信アイコンの下に“？”が。
![Screenshot_20241116-215250~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/3ef58dba-6eb7-6c01-1fa6-0dcc1a80be05.png)

　今月頭のスクショには
　　ありませんでした。

　とりあえず、タップしてみたら
　　ポップアップメニューが
　　　出てきました。
![Screenshot_20241116-215346~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/bfc1b227-ba5d-35f3-779c-93cbc43b2fea.png)

　一番上はメールアドレス。
　　機能不明。

　まんなかの三つは
　　そのまま。

　一番下のキーボードショートカットを
　　タップすると、表が出てきました。
![Screenshot_20241116-215710.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/ef1bfdab-d35d-b955-aced-ad80f2f176ce.png)
***
　次に、
　　いつもお世話になっている
　　　DeepL のアプリが
　　　　ガラッと変わりました。
![Screenshot_20241117-140122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/416d8d00-147d-2310-87c5-a29c9ed5e38c.png)

　先日の機能追加の影響かな。

　カメラアイコンに
　　気付きました。

　やってみたら、OCRできました。
　　なんと写した画像の上に
　　　翻訳されて出てきます。

　もちろん、
　　もとの文章→翻訳も
　　　ふつうにできます。
***
　さて、本題です。

　今回は、
　　ChatGPTの回答を
　　　ハルシネーション率を
　　　　できうる限りに下げるための
　　　　　Promptを作成して
　　　　　　もらいました。

```Text:低ハルシネーション率Prompt
「（質問）」

上記の質問に対して、正確で信頼性のある情報（主にネット）に基づいて回答してください。
回答には必ず具体的な根拠や情報源を明示してください。
もし、情報が不確か、または根拠が存在しない場合は、『正確な情報が見つかりません』や『その点についてはわかりません』と明記してください。
推測や曖昧な回答は避け、可能な限り確実性の高い情報のみを提供してください。
```

　私が手を加えたのは、
　　“「（質問）」”と“（主にネット）”の
　　　部分のみです。
　　　　あとは改行でしょうか。

　もちろん、
　　ネットの情報に
　　　誤りがあれば、
　　　　問題ですが。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
plantUMLの加工方法

# はじめに
今回は以前から何度か書いているplantUMLで編集をする方法を紹介していきます
### 本文
まず、背景色は下記のように記述することで変更することができます
宣言した行の末尾にハッシュをつけて色を指定することで変更ができます
これはすでに用意されているものであれば名前でできますが、カラコードを利用することも可能です
```
actor Bob #red
participant "I have a really\nlong name" as L #99FF99
```

```plantuml
actor Bob #red
participant "I have a really\nlong name" as L #99FF99
```
次に順番の変更です。
plantUMLでは何もしない場合、宣言した通りの順番に表示されます。
しかし`order`を使用することで表示順を自由に変更できます
```
@startuml
participant Last order 30
participant Middle order 20
participant First order 10
@enduml
```

```plantuml
@startuml
participant Last order 30
participant Middle order 20
participant First order 10
@enduml
```
### 最後に
今回は表示順や背景色などの加工方法を紹介していきました
次にplantUMLの記事を書く時は少し特殊なparticipantなどの記述方法を紹介しようと思います
ツールを使い始めて、最初にやるべきことは〇〇だ！！

# はじめに
いろんなツールやアプリがたくさんリリースされているので、「新しいツールに触れる機会」はたくさんあるかと思います。

言語設定を日本語にしましょう。

# 結論「言語設定を日本語にする」
新しいツールに触れたら、まずは日本語化。
手元のマニュアルや公式チュートリアルよりも、日本語化しましょう。

# 事例集
## Cursor
AIの入ったVScodeです
インストールすると、デフォルトの言語設定は英語ですが、とりあえず日本語にしましょう。

https://qiita.com/k1mu0419/items/2d903660d1f571abb8f2

## Miro
ホワイトボードツールです。
こちらも最初は英語ですが、とりあえず日本語にしましょう。

https://miro.com/ja/blog/jpui/

## 日本語にできない場合（Github）
Githubは日本語にできません。
英語を読みたくない場合は、ブラウザで翻訳します。

https://support.google.com/chrome/answer/173424?hl=ja&co=GENIE.Platform%3DDesktop

## ブラウザでも翻訳できない場合（Kaggle）
Kaggleは機械学習のコンペ（大会）が開催されるwebサイトです。
ここでは色んな方が書いたNotebook（つまりプログラム）が公開されています。

コメントアウトされた文章は日本語で読みたいのですが、ブラウザの翻訳機能では翻訳されません。

しかし、いい感じに日本語に翻訳してくれる拡張機能があります。

https://tech.aru-zakki.com/kaggle-notebook-translation/

## 論文（PDF）
論文はだいたい英語です。
さっくり日本語にしてしまいましょう。

https://note.com/mizuki_oka/n/nfe6967ff1c7c

個人的には、テキストをコピーしてdeepL（無料版）に貼り付けするという泥臭い方法が好みです。

たまに、古い論文だとテキストがコピーできないケースもありますが、その場合は、画像から文字起こししてくれるツールを併用します。

これにはLINEが優秀でして、論文をスクショして貼り付ければ文字起こししてくれます。
そこそこの精度でよければ、翻訳もしてくれます。

https://guide.line.me/ja/services/scantext.html

# 終わりに
新しいツールを使ったり、勉強するのはそれだけで大変です。
もし言語の壁を感じる場合は、とりあえず日本語化がおすすめです。

Let's 日本語化
nullや空のデータが返ってくるときは200 vs 400どっち？

自分やチームのやり方でずっと開発していたらあまり気にしない問題だが、サーバーからnullやemptyのデータが返ってくるときはどんなエラーコードを使うべきかについて面接などで聞かれることがあるらしい。

普段はデータを返せる状態ならば`200 OK`を返すようにしていたが、調べてみたところ、他にもやり方がいくつかあったため、調べてみた。

## 404 Not Found
まずは、404を返すやり方がある。

実際に返ってくるデータがないから、見つかりませんでしたよー（Not Found）の意味で404を返す。

RESTの思想的にも合っていて、意味もわかりやすい。

しかし、空のデータであることがエラーとして判断されるべきかは考えどころではありそう。
ちゃんと設定すればいいと思うが、Sentryなどのエラー通知を行っていたら本当の404パターンと見分けつかなくなるかも？

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/404

## 200 OK
とりあえずレスポンスがちゃんと返ってきているからOKにするやり方。

js側でオプショナルにしておけば空で渡ってきて空の処理も難しくなさそう。

しかし、エラー処理を全部しないといけないので一発で動くものを作ることは難しそう。

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/200

## 204 No Content
データが空だからコンテンツありませんよー（No Content）とするやり方。

204にしているということはわざわざサーバー側で処理を入れているということになるので、意図が明確でわかりやすい形になりそう。

その分、200と204をわけて処理する必要が合って、200だけパターンより手間がかかりそう。
あとは、空だからレスポンスのbodyが完全にない状態だから処理に困る場合もあるかも？

https://developer.mozilla.org/ja/docs/Web/HTTP/Status/204

## おわりに
何か正解があるのかなと思い、周りに聞いたり、コミュニティのdiscussionを見ていると、この問題は特に正解が存在しないらしい。

200系の方を好んでる人が多い印象は受けた。
自分の環境が200を使っているからってのもありそうだけど...

面接でこのことについて聞かれたら、「チームのやり方に合わせます」と答えた方が良さそう
Docker-composeを用いてM2 MacにMySQLをデプロイ

# docker-compose.yml
~~~
version: '3'

services:
  # MySQL
  db:
    image: mysql:5.7
    platform: linux/amd64
    container_name: mysql_host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test_database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306
~~~

以下コマンドを実行
~~~
docker-compose up -d
~~~

以下コマンドで`root`ユーザとしてアクセス可能
~~~
docker exec -it mysql_host /bin/bash
mysql --host=localhost --user=root --password=root
~~~

# 参考
* [docker-compose でMySQL環境簡単構築](https://qiita.com/A-Kira/items/f401aea261693c395966)
* [M2 MacにDocker Imageが対応してなかったときの対処方法](https://qiita.com/kei_gnu/items/815e82b50db3bab6466d)
Rを学びたい Plot結果を画像表示する Step2

# はじめに
Rを学びたいStep2です。ベクトルの結果を画像表示できるようにしています。

# ソースコード

```R:plot.R
# ベクトルの作成
val <- c(12, 2, 5, 8, 7, 10, 3, 6, 9, 4)

# ベクトルの内容を表示
print("ベクトルの内容:")
print(val)

# プロットの作成
plot(val, type = "o", col = "blue", xlab = "Index", ylab = "Value", main = "ベクトルのプロット")

# 平均値の計算
average_val <- mean(val)
cat("平均値:", average_val, "\n")

# 平均値のラインを追加
abline(h = average_val, col = "red", lty = 2)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/d42b0a8c-9bcb-9e90-f947-240382037bb6.png)
Vimiumで数字キーによる繰り返し操作を無効にする

## 初めに

こんにちは、Ctrlです。

Vimiumでもう一つ、ちょっとした気づきがあったので備忘録として投稿しておきます。

## mapkeyで 0 を指定して、数字キーによる繰り返し操作を防ぐ 

独自のキーボードレイアウトやキーボード配列を使っていると、何らかのタイミングで数字キーを押してしまい、Vimiumの操作が繰り返されるうっかりミスをしてしまうことがあります。特に自分の場合はよく使うサイトのURLやサイト名とローマ字を紐付けてワンキーで表示できるようにしているため、いきなりタブがたくさん開かれてしまうといったようなことがありました。

```

mapkey 1 0
mapkey 2 0
mapkey 3 0
mapkey 4 0
mapkey 5 0
mapkey 6 0
mapkey 7 0
mapkey 8 0
mapkey 9 0

```

以上のような形で設定をしておくことで、数字キーをミスタイプした時でも、大量のタブが開かれたり、設定した操作が繰り返されたりすることを防ぐことができます。

## 最後に

キーボードから手を離さずに 快適なブラウジングをするためにも、Vimium の導入は非常におすすめです。 

Vimiumや自作 キーボード、キーボードレイアウト、キー配列 など、何か面白いアイディアがありましたら、是非とも教えてください！

最後までお読みいただきありがとうございました。

その他、コンテンツマーケティング関連や執筆関連のお仕事があれば、お気軽にご相談いただけると幸いです。

https://crowdworks.jp/public/employees/1089210

https://www.lancers.jp/profile/Ctrl

## 使用しているPCB：物理キーボード

使用している物理キーボードは[@takashicompany](https://twitter.com/takashicompany)さんのWorm Eatenです。

https://github.com/takashicompany/worm_eaten/tree/master

![IMG_20241115_123736169 (1) (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608727/764649e4-aba2-9e06-5e3f-afbd5b1148d7.jpeg)
AtCoder Beginner Contest 380(2024.11.16)

# キーワード
AtCoder Beginner Contest 380, 
# 問題
https://atcoder.jp/contests/abc380/tasks/abc380_c

0, 1 のみからなる長さ 
N の文字列 
S が与えられます。
S の中で先頭から 
K 番目の 1 の塊を 
K−1 番目の 1 の塊の直後まで移動した文字列を出力してください。

なお、
S には 1 の塊が 
K 個以上含まれることが保証されます。

より正確な説明は以下の通りです。

S の 
l 文字目から 
r 文字目までからなる部分文字列を 
S 
l…r
​
  と表す。
S の部分文字列 
S 
l…r
​
  が 1 の塊であるとは、以下の条件を全て満たすことと定める。
S 
l
​
 =S 
l+1
​
 =⋯=S 
r
​
 = 1
l=1 または 
S 
l−1
​
 = 0
r=N または 
S 
r+1
​
 = 0
S に含まれる 1 の塊が 
S 
l 
1
​
 …r 
1
​
 
​
 ,…,S 
l 
m
​
 …r 
m
​
 
​
  で全てであり、
l 
1
​
 <⋯<l 
m
​
  を満たしているとする。
このとき、以下で定義される長さ 
N の文字列 
T を、「
S の中で先頭から 
K 番目の 1 の塊を 
K−1 番目の 1 の塊の直後まで移動した文字列」と定める
1≤i≤r 
K−1
​
  のとき 
T 
i
​
 =S 
i
​
 
r 
K−1
​
 +1≤i≤r 
K−1
​
 +(r 
K
​
 −l 
K
​
 )+1 のとき 
T 
i
​
 = 1
r 
K−1
​
 +(r 
K
​
 −l 
K
​
 )+2≤i≤r 
K
​
  のとき 
T 
i
​
 = 0
r 
K
​
 +1≤i≤N のとき 
T 
i
​
 =S 
i
​
 
制約
1≤N≤5×10 
5
 
S は 0, 1 のみからなる長さ 
N の文字列
2≤K
S には 1 の塊が 
K 個以上含まれる
入力
入力は以下の形式で標準入力から与えられる。

N 
K
S
出力
答えを出力せよ。

入力例 1
Copy
15 3
010011100011001
出力例 1
Copy
010011111000001
S には、
2 文字目から 
2 文字目、
5 文字目から 
7 文字目、
11 文字目から 
12 文字目、
15 文字目から 
15 文字目の 
4 つの 1 の塊があります。

入力例 2
Copy
10 2
1011111111
出力例 2
Copy
1111111110
# アルゴリズム
1. N, K, Sを受け取る
1. "0"と"1"の間に,を入れる
1. ,区切りで分割してリスト形式にする
1. 最初が1で始まる要素を数える
1. 1の登場がK回になったら、その要素をa+1のところに入れる
1. 表示形式に合わせて、結果を出力する。

# 回答
失敗作
```Python
N, K = map(int, input().split())
S = input()

l = S.replace("01", "0,1")
l = l.replace("10", "1,0")

l = list(map(str, l.split(",")))

key = 0
a= 0

for i in range(len(l)):
  if l[i].startswith("1"):
    key += 1
    if key == K-1:
      a = i
  if key == K:
    l.insert(a+1, l[i])
    l.pop(i+1)
    break
  
L= []
for i in range(len(l)):
    L.append(int(l[i]))

from functools import reduce
LL = int(reduce(lambda x, y: x + y, [str(x) for x in L]))

print(LL)
```

# 参考
https://note.nkmk.me/python-str-replace-translate-re-sub/

https://note.nkmk.me/python-list-clear-pop-remove-del/#pop

https://magazine.techacademy.jp/magazine/23897

# 備考
- できそうで全然できなかった
- 正直なんでダメなのかはわからない。解説のアルゴリズムを見る限り、そこまでかけ離れているわけではない。細かいコードの違いと、余計な実装が多いからだと思う。もっとスマートにできるはず。
- そう考えると、手数の問題な気がする。現状手が少ないから、あの手この手で色々と盛り込んで全然スマートじゃないコードになっているはず。もっと手数を増やして、最適解をというのを見つける必要がある。
- あともちろんのこと、アルゴリズム（頭の中）が全然整理できていない。解説みたいに必要最低限のことを抽出する必要が、捨象大事！
Rを学びたい(CSVファイルの読み込み) Step1

## はじめに
Rを学習したいので、段階的に学んでいこうと思います。
まずはCSVファイルの読み込みから開始していきます。

## ソースコード

```R:csv_include.r
# CSVファイルを読み込む
data <- read.csv("sample_data.csv")

# データの確認
print("CSVファイルの内容:")
print(data)
```

```csv:sample_data.csv
Name,Age,Score
Alice,25,90
Bob,30,85
Charlie,35,88
David,40,92
Eva,45,95
```

## 実行結果
```shell:
> print(data)
     Name Age Score
1   Alice  25    90
2     Bob  30    85
3 Charlie  35    88
4   David  40    92
5     Eva  45    95
```
Ubuntu環境でPHP 8からPHP 7に変更してCakePHPを使う

UbuntuにPHP 8がインストールされている環境にPHP 7をインストールし、PHP 7の環境を利用できるようにする手順を説明します。

---

### 1. **必要なリポジトリを追加**
PHPの複数バージョンを簡単に管理できるように、[Ondřej Surý's PPA](https://launchpad.net/~ondrej/+archive/ubuntu/php)を追加します。

```bash
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
```

---

### 2. **PHP 7.x をインストール**
必要なPHP 7.xのバージョンを選択してインストールします。以下はPHP 7.4を例にしています。

```bash
sudo apt install -y php7.4 php7.4-cli php7.4-fpm php7.4-mysql php7.4-xml php7.4-mbstring 
sudo apt install -y php7.4 libapache2-mod-php7.4 php7.4-cli php7.4-fpm php7.4-intl
sudo apt install -y php7.4-mcrypt php7.4-curl
```

必要なPHPモジュールも合わせてインストールしてください。

---

### 3. **PHPのバージョンを切り替える**
Ubuntuでは、`update-alternatives`を利用してPHPのバージョンを切り替えることができます。

現在インストールされているPHPバージョンを確認：

```bash
update-alternatives --display php
```

PHP 7.4に切り替える場合：

```bash
sudo update-alternatives --set php /usr/bin/php7.4
```

現在のPHPバージョンを確認：

```bash
php -v
```

PHP 8に戻したい場合は、以下のように切り替えます：

```bash
sudo update-alternatives --set php /usr/bin/php8.2
```

---

### 4. **WebサーバーのPHPバージョンを切り替える**
ApacheまたはNginxを使用している場合、PHP-FPMの設定を切り替える必要があります。

#### Apacheの場合：
PHP 7.4用のモジュールを有効化し、PHP 8のモジュールを無効化します。

```bash
sudo a2dismod php8.2
sudo a2enmod php7.4
sudo systemctl restart apache2
```

#### Nginxの場合：
PHP-FPMのソケットまたはポートを指定して設定を変更します。たとえば、`/etc/nginx/sites-available/default`を編集：

```nginx
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # PHP 7.4
}
```

設定を再読み込み：

```bash
sudo systemctl reload nginx
```

---

### 5. **ComposerのPHPバージョン設定**
CakePHP 3ではComposerを利用しますが、現在のPHPバージョンで依存関係を解決する必要があります。以下のコマンドで確認してください：

```bash
php composer.phar install
```

問題が発生する場合は、`composer.json`のPHPバージョン制約を確認してください。

---

### 6. **確認**
CakePHP 3が正常に動作するか確認してください。

---

以上で、Ubuntu環境でPHP 7.xをインストールし、PHP 8と切り替えながら利用する準備が完了です。
【覚書き】JavaScriptで非同期処理を理解するための知識～実行エンジンとランタイム～

# 初めに
JS初心者です。普段はPHPやJavaを書いています。
シングルスレッドであるJSがどのように非同期処理を行っているのかが気になったので調べてみました。

# JavaScript実行環境
まずは前提知識から理解しましょう。

JavaScriptは**ランタイム**と呼ばれる実行環境で動作します。ランタイムは、JavaScriptコードを実行するだけでなく、非同期処理やI/O操作などをサポートする機能を提供します。ブラウザやNode.jsなどがそれです。ランタイムの中には**実行エンジン**と呼ばれるJavaScriptを実行するためのコンポーネントが存在します。

## 実行エンジン
* JavaScriptを評価、解析、実行する役割を担う
* **シングルスレッド**
* 例）V8やSpiderMonkeyなど

# 実行エンジンはシングルスレッド
実行エンジンはシングルスレッドで動作するため、非同期処理そのものを直接扱うことはできません。時間のかかるような処理を実行した場合、後続の処理は待たなければなりません。
そのようなことがないよう、ランタイムの機能によって非同期処理が可能になっています。

# 非同期処理を実現するためのコンポーネント
ランタイムが提供している非同期処理のためのコンポーネントを紹介します。

## Web APIs
* ランタイムが用意しているAPI（`setTimeout`、`fetch`など）
* 実行エンジンとは別に非同期に処理を実行する際に用いる
* 多くのWeb APIでは、処理完了後に実行する動作をコールバック関数で指定することができる
  * 例）1秒後、にコンソールに「終了」と表示したい場合、`setTimeout`にコールバック関数を渡す
    ```javascript
    setTimeout(() => {
        console.log("終了");
    }, 1000);
    ```
    ※`fetch`のようにPromiseを返すAPIではコールバック関数を直接渡さずに.thenで後続処理を記述します。

## タスクキュー（コールバックキュー）
* ランタイムで行う処理を管理するためのキュー
* Web APIsで渡されたコールバック関数の処理がキューに積まれる
* キューに積まれるタイミングは「WebAPIs自体の処理が終了した」タイミング
  * 例）setTimeoutの場合、〇秒経った後にキューに積まれる

## イベントループ
* 実行エンジンとランタイムの橋渡しを行うコンポーネント
* タスクキューに積まれた処理を実行エンジンに依頼する
* 実行エンジン側で実行中の処理がないことを確認して実行を依頼する


# 非同期処理の例

```JavaScript: 非同期処理の例
console.log('1: 開始');

setTimeout(() => {
  console.log('2: setTimeoutのタスク');
}, 0);

console.log('3: 終了');

// 実行結果
// 1: 開始
// 3: 終了
// 2: setTimeoutのタスク
```

1. `console.log('1: 開始');`が実行エンジンで実行される
1. `setTimeout`が呼び出され、タスクキューに`console.log('2: setTimeoutのタスク');`の処理が積まれる（※ここでは待機時間を0秒にしているため即座に積まれるが、実際は待機時間が完了したタイミングで詰まれる）
1. `console.log('3: 終了');`が実行エンジンで実行される
1. 実行エンジンが暇になったことを確認し、イベントループがタスクキューの`console.log('2: setTimeoutのタスク');`の処理を実行エンジンに依頼する
1. 実行エンジンが`console.log('2: setTimeoutのタスク');`の処理の処理を実行する

# 終わりに
本当はasync/awaitについて書くつもりだったのですが、書いている途中で理解が浅すぎることに気が付きました。
まだまだ理解できていないので、当分時間はかかりそうです。

# 参照
https://zenn.dev/msy/scraps/1490bd249046ce
https://zenn.dev/estra/articles/js-async-programming-roadmap
rubyで競プロ問題を解く際便利なメソッド（随時更新）

いずれC++とかに移行する時が来るかもしれませんが、とりあえずrubyで競プロ問題を解いています。
その際便利だったメソッドを自分用に残していきます。

# 文字列操作
#### swapcase
アルファベットの大文字・小文字を逆にして返してくれます。
大文字・小文字の判定して、大文字だったら小文字を、、、というふうに実装せず済むので楽
```ruby
str = ['a', 'B']
str.each do |s|
  puts s.swapcase
end

# 結果
A
b
```

# 配列操作
#### rotate
配列を内部の順番をぐるっと回してくれる、というイメージ。
引数に数字を渡すと、数字分だけ移動してくれる。
```ruby
arr = [1, 2, 3, 4, 5]
p arr.rotate
p arr.rotate(2)
# 破壊的では無い
p arr

# 結果
[2, 3, 4, 5, 1]
[3, 4, 5, 1, 2]
[1, 2, 3, 4, 5]
```
結合テストとは何か？ - 基礎概念の理解

## 結合テストとは何か
結合テストとは、複数のモジュール(機能)間の相互作用をテストする手法です。具体的には以下のような特徴があります。
1. 定義
    - 複数のモジュールを組み合わせて行うテスト
    - モジュール間のデータの受け渡しや連携の正確性を確認 
2. 単体テストとの違い
単体テストは1つの部品だけをテストします。以下の例では「価格計算」だけを確認しています。
一方、結合テストは複数の部品を組み合わせた際の動作をテストします。以下の例では「注文処理全体の流れ」をテストしています。

```java
// 単体テスト：計算ロジックのみをテスト
@Test
public void testCalculation() {
    PriceCalculator calculator = new PriceCalculator();
    int price = calculator.calculate(100, 0.1);  // 単一の機能
    assertEquals(110, price); // 価格が正しいか確認
}

// 結合テスト：注文処理全体の流れをテスト
@Test
public void testOrderProcess() {
    OrderService orderService = new OrderService(
        priceCalculator,    // 価格計算モジュール
        inventoryService    // 在庫管理モジュール
    );
    Order order = orderService.createOrder("ITEM-1", 2);  // 複数モジュールの連携

    assertNotNull(order); // 注文が作成されたか確認
    assertEquals("ITEM-1", order.getItemId()); // 注文IDが正しいか確認
    assertEquals(220, order.getTotalPrice()); // 合計金額が正しいか確認
}
```
## なぜ結合テストが必要なのか

結合テストが必要となる理由は、以下の3つに集約されます。
1. データの整合性確保
    モジュール同士がデータを正しく受け渡せるかを確認します。
    例として、「注文処理」と「在庫管理」のモジュールを考えます。
    - 問題例1：データの形式の違い
        「注文処理モジュール」は商品IDを文字列（`"12345"`）で扱うが、「在庫管理モジュール」は数値（`12345`）として扱っている場合、連携エラーが起こる。
    - 問題例2：欠陥データの処理
        注文処理で「購入個数=0」が渡された場合、在庫側で適切に処理されず、在庫が不正に減る可能性がある。
    - 確認するポイント
        モジュール間でデータ型やフォーマットが一致しているか？
        境界値（例：購入個数が0や最大値）の場合も正しく動くか？
2. 依存関係の検証
    モジュールが期待通りに連携できるかを確認します。
    連携時にはタイミングや依存する外部要素の影響で問題が発生することがあります。
    - 問題例1：同期と非同期の問題
        「ユーザー登録」モジュールが新規登録を完了する前に、「メール通知」モジュールが動き出し、登録されていないユーザーにメールを送る可能性。
    - 問題例2：環境依存の問題
        開発環境では正常に動くが、本番環境の違う設定（例：異なるデータベースやAPIのタイムアウト時間）でエラーが出る。
    - 確認するポイント
        モジュールが正しい順序で動くか？
        本番環境と似た条件で動作が保証されるか？
3. システム全体の信頼性向上
    システム全体の安全性やパフォーマンスを確認します。
    一部のモジュールの問題がシステム全体に悪影響を与えないようにする必要があります。
    - 問題例1：エラーが適切に処理されない
        「支払い処理モジュール」で失敗したときに、注文がそのまま完了したことになる（在庫が減る、請求が不正に行われる）。
    - 問題例2：トランザクション管理の失敗
        途中でエラーが発生した場合、システムが一部だけ変更を適用してしまい、不整合が発生する（例：お金は引き落とされるが商品が発送されない）。
    - 問題例3：パフォーマンスの問題
        一度に大量の注文が発生した際、システムが耐えられずに全体が停止する。
    - 確認するポイント
        エラー時にシステムが安全に戻るか（ロールバック）？
        高負荷時にスムーズに処理が行えるか？
p5.js で Androidスマホの振動をブラウザから始動させる（Vibration API を利用、2024年11月時点）【JavaScript】

この記事は後から、「[JavaScript Advent Calendar 2024](https://qiita.com/advent-calendar/2024/javascript)」の 4日目の記事としても登録しました。

## はじめに
iPhone だとブラウザ単体では実現できないですが、Android だとブラウザ単体で実現できる「p5.js で Androidスマホの振動をブラウザから始動させる」という話です。

ブラウザのデバイス系API の １つ、以下の Vibration API を使う話になります。

●Vibration API - Web API | MDN
 https://developer.mozilla.org/ja/docs/Web/API/Vibration_API

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8d5f52cc-04f6-a5a0-59c3-869d6d7d771e.png)

デバイス系の API、気が付くと仕様が変わってたとか、使えなくなった／制約がついて過去に作ったものがそのままでは動かなくなった、みたいなことがわりとある気がするので、記事執筆時点で Android の OS は新しいもので試してみます。

### 結果
まずは結果から掲載してみます。

2024年11月時点で試した結果、以下のとおり無事に動作させられました。
（画面をタッチすると、キャンバスの背景色と表示されているテキストが、振動する間だけ変化して、その後は元に戻るというもの）

https://x.com/youtoy/status/1857988753849201053

## ブラウザの対応状況
Vibration API のブラウザの対応状況は、上記の MDN のページなどを見ると、以下となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/70fb9056-4185-6401-d3a1-75c18fb55380.png)

Android を使う感じになりそうです。

上記で NG となっている Safari on iOS（iPhone の話）について、「iOS で Chrome を使ったら」ということを思うかもしれません。
しかし、今のところの iOS の Chrome は、Safari と同じエンジン以外は使えないという制約を受けた状態かと思うので、Safari が NG なものは同様となるかと思います。

### とりあえず試す
自分のスマホが対応しているか、簡単に試したい場合は既存のサンプルを使うのが楽です。例えば、以下などが良いかと思います。

●Vibration API Sample
 https://googlechrome.github.io/samples/vibration/

## 実際にやってみる
それでは、p5.js で Androidスマホの振動をブラウザから始動させるというのを Vibration API を使ってやってみます。

ちなみに、API で提供されている中の以下のメソッドを使う感じになるかと思います。

●Navigator: vibrate() メソッド - Web API | MDN
 https://developer.mozilla.org/ja/docs/Web/API/Navigator/vibrate

### 実装
冒頭に動作させた様子を載せていたものの、実装の話です。

以下が p5.js Web Editor で簡易に実装してみたサンプルです。

```javascript
const messages = {
  start: "タッチでバイブレーション開始",
  vibrating: "振動スタート！",
  unsupported: "この端末は非対応です",
};

let currentMessage = messages.start;
let isVibrating = false;

function setup() {
  createCanvas(500, 400);
  background(220);

  textAlign(CENTER, CENTER);
  textSize(24);
  fill(0);
  text(currentMessage, width / 2, height / 2);
}

function mousePressed() {
  if (navigator.vibrate) {
    navigator.vibrate(1500); // 1500ミリ秒振動
    currentMessage = messages.vibrating;
    isVibrating = true;

    // 振動が終わるタイミングで背景をリセット
    setTimeout(() => {
      currentMessage = messages.start;
      isVibrating = false;
      redrawCanvas();
    }, 1500); // 1500ミリ秒後に背景を元に戻す
  } else {
    currentMessage = messages.unsupported;
  }
  redrawCanvas();
}

function redrawCanvas() {
  if (isVibrating) {
    background(100, 150, 255);
  } else {
    background(220);
  }
  fill(0);
  text(currentMessage, width / 2, height / 2);
}
```

ポイントになるところは、時間をミリ秒指定で処理する「navigator.vibrate()」を使ったところのみになるかと思います。

```javascript
    navigator.vibrate(1500); // 1500ミリ秒振動
```

ちなみに、時間指定の部分は配列を渡してやることもできるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/540d58c7-9d74-b90d-b458-d7c096c995fb.png)

## 余談
iOS関連の話で、以下のようなものがあるようです。

●端っこまでスクロールしたら端末が震えるようになる iOS Safari 拡張機能を作りました｜Yasuhiro Yamada
 https://note.com/yasusun/n/n5a5d58480237
AtCoder Beginner Contest 380(2024.11.16)

# キーワード
AtCoder Beginner Contest 380, split
# 問題
https://atcoder.jp/contests/abc380/tasks/abc380_b

いろはちゃんは長さ 
N ( 
N≥1 ) の正整数列 
A=(A 
1
​
 ,A 
2
​
 ,…,A 
N
​
 ) を持っています。
いろはちゃんは 
A を使って、次のように文字列 
S を生成しました。

S= | から始める。
i=1,2,…,N の順に、次の操作を行う。
S の末尾に - を 
A 
i
​
  個追加する。
その後、 
S の末尾に | を 
1 個追加する。
生成された文字列 
S が与えられるので、正整数列 
A を復元してください。

制約
S は問題文中の方法で生成された長さ 
3 以上 
100 以下の文字列
A は長さ 
1 以上の正整数列
入力
入力は以下の形式で標準入力から与えられる。

S
出力
答えを以下の形式で、 
1 行に空白区切りで出力せよ。

A 
1
​
  
A 
2
​
  
… 
A 
N
​
 
入力例 1
Copy
|---|-|----|-|-----|
出力例 1
Copy
3 1 4 1 5
S= |---|-|----|-|-----| が生成されるような 
A は 
(3,1,4,1,5) です。
```
入力例 2
|----------|
```
```
出力例 2
10
```
```
入力例 3
|-|-|-|------|
```
```
出力例 3
1 1 1 6
```
# アルゴリズム
1. Sを受け取る
1. Sを"|"で分割する。|と|の間の"-"だけになる
1. 最初と最後に余計なやつがいるので、それを削除する
1. それぞれの"-"の数を数え、それを別のリスト(answer)に格納する
1. 表示形式に合わせて、answerを表示する。
    

# 回答
```Python
S = input()

l = S.split('|')

l = l[1:-1]

answer = []

for i in range(len(l)):
  answer.append(len(l[i]))

print(" ".join(map(str, answer)))
```

# 参考
https://note.nkmk.me/python-split-rsplit-splitlines-re/#sep

https://note.nkmk.me/python-list-clear-pop-remove-del/#pop

https://note.nkmk.me/python-str-len/

# 備考
- また表示形式を間違えた。
- `l = l[1:-1]`のゴリ押し感がある、汎用性が低い。
- あと単純に次の日に反省を書いているので大部分が忘れている。気づきはすぐにメモする。
- 他の人を見る限り、ぱっと見同じようなアルゴリズムになってる。というよりおそらく他の人のアルゴリズムのコードは読めないようになっている。
LangChainでOutputParserExceptionがでたときにRetryするChainにする

## 解決方法

chainに `with_retry`で Exceptionタイプを指定すればOK

```py
from langchain_core.exceptions import OutputParserException

chain_with_retry = chain.with_retry(
    retry_if_exception_type=(OutputParserException,),
    wait_exponential_jitter=False,  # Not add jitter to the exponential backoff
    stop_after_attempt=2,  # Try twice
)
```

## Ref

https://api.python.langchain.com/en/latest/runnables/langchain_core.runnables.retry.RunnableRetry.html
CSSのスタイル適用の優先順位について

## はじめに
HTMLでマークアップした要素に対してCSSを適用させようとすると、CSSがうまく適用されなくてデザインが反映されないという状況に陥ったので原因を調べているとどうやらスタイルの適応の優先順位が関係しているということがわかったので記録を残すことにしました。

---

### CSSのスタイルの優先順位のルール
1. !important
    CSSのプロパティに!importantが指定された場合、そのスタイルが最優先されます。ただし、多用しすぎるとコードの保守性が悪くなるため使いすぎ注意
    ```html
    <h1 id="example">優先順位</h1>
    ```
    ```css
    /* プロパティに!importantを指定しているためh1タグのスタイルが適用 */
    h1 {
        color: blue !important;
    }
    
    #example {
        color: red;
    }
     ```
    <br>
2. スタイルの指定場所
    同じセレクタが複数の場所で指定された場合は、後に指定されたスタイルが適用される
    ```html
    <h1>優先順位</h1>
    ```
    ```css
    /* 後に指定されたh1タグのプロパティredがスタイルが適用 */
    h1 {
        color: blue
    }
    
    h1 {
        color: red
    }
    ```
    <br>
3. インラインスタイル
    HTML要素のstyle属性で直接指定されたスタイルは他のスタイルよりも優先される。ただしメンテナンスが低下するため避けるべき
    ```html
    <p style="color:red;">インラインスタイル</p>
    ```
    <br>
4. IDセレクタ
        IDセレクタはクラスセレクタよりも優先されるが再利用性が低い
    ```html
    <h1 id="example" class="example-title">Hello World!!</h1>
    ```
    ```css
    /* IDセレクタのプロパティbuleのスタイルが適用 */
    #example {
        color: bule;
    }
    
    .example-title {
        color: red;
    }
    ```
    <br>
5. クラスセレクタ・属性セレクタ・擬似セレクタ
    クラスセレクタや属性セレクタ、擬似セレクタはタグセレクタよりも優先順位は高く再利用性が高い
    ```html
    <p class="example">Hello World!!</p>
    ```
    ```css
    /* クラスセレクタのプロパティrbuleのスタイルが適用 */
    p {
     color: red;
    }
    
    .example {
        color: bule;
    }
    ```
    <br>
6. タグセレクタ
    タグ名で指定されたセレクタは他のセレクタよりも優先順位は低い
    ```html
        <h1>Hello World</h1>
    ```
    ```css
    h1 {
        color: red;
    }
    ```
    
---

### まとめ
スタイル適用の優先順位を理解することで意図したデザインが正しく表示されることだけではなくコードの保守性、パフォーマンスの向上など生産性を高めるより高品質なデザインを実装することが可能
シリコーンオイルで眼鏡を洗う。

# 眼鏡の洗い方

1. シリーコンオイルでやさしく洗う
   1. 汚れは油で浮かせて落とすのが基本
   1. ガラスはどんなオイルでも大丈夫でしょうが、樹脂のレンズやフレームへのダメージの少なさからシリコーンオイルが良いと思います
1. 石鹸でやさしく洗う
   1. 油は石鹸で乳化するのが基本
   2. 油だけなら無水エタノールや IPA も有りだけど、溶剤なのでフレームなどの塗装やコーティング剤に影響でるかもしれないから、やらない方が良いと思う
1. 水で濯いで、やさしく拭き取る

これでピカピカ。

ジョンソンのベビーオイルでも良いのかも。
lilnote - 無料で使える自由配置ノートのサービスをリリースしてみた【Cursor + ChatGPT APIを使って】

![](https://storage.googleapis.com/zenn-user-upload/45ec93f0efa8-20241114.png)

https://lilnote.jp/

## サービスの特徴

1. ログイン不要ですぐに使える
2. ローカルファイルで保存可能
3. 無料（ローカル保存のみ、クラウドは有料プラン予定）

現時点ではあくまでローカルファイルに保存して、
それをロードして使うだけなので情報漏洩も心配なしです。
サービスのLPなしにドメイン直下でログインせずすぐ使えることを目指しました。
（今後LPは下層パスに作る予定。）

## どんなことに使えるの？

下記のような使用を想定しています。

- ホワイトボード的に人に図を説明する際
- 制作活動のためのムードボード作成
- シナリオプロット制作
- 思考整理のためのマインドマップ

## 基本の操作方法

- ノート上でダブルクリック：　　　　　　　テキストが配置されます
- テキスト上でダブルクリック：　　　　　　テキストが編集できます
- コピーした画像をctl + v でペースト：　　 画像を配置できます
- Alt + マウスホイールのドラッグ：　　　　キャンバスを移動　

## ChatGPTを使ってのサービス開発

以前はClaudeやGithub Copilotを使っていましたが、
ここ最近のコードの精度的にChatGPTに戻ってきてしまいました。

Cursorに対してChatGPTのAPIキーを設定して4oモデルにしています。

CanvasやThree.jsなどマウスイベントが多く発生するアプリを作る時は
AIを多用して作るのがかなり楽でした。

Replit Agentも出てきたことですし、
マイクロサービスが簡単に作れる時代が来てしまった感があります。

## 今後のアップデート

ローカルに保存するという機能に関しては今後も変わらず
無料で使えるようにしていこうと考えています。

あとはクラウド保存の機能や、チームでの共同編集機能、
スマホでの操作対応をアップデートにて予定しています。

アップデート予定の一覧は下記ページにありますのでもしよければ。

https://lilnote.jp/upcoming
AtCoder Beginner Contest 380(2024.11.16)

# キーワード
AtCoder Beginner Contest 380, count
# 問題
https://atcoder.jp/contests/abc380/tasks/abc380_a

6 桁の正整数 
N が与えられます。
この整数が以下の条件を全て満たすか判定してください。

N の各桁のうち、 
1 は丁度 
1 つである。
N の各桁のうち、 
2 は丁度 
2 つである。
N の各桁のうち、 
3 は丁度 
3 つである。
制約
N は 
100000≤N≤999999 を満たす整数
入力
入力は以下の形式で標準入力から与えられる。

N
出力
N が問題文中の条件を全て満たすなら Yes 、そうでないなら No と 
1 行に出力せよ。

入力例 1
Copy
123233
出力例 1
Copy
Yes
123233 は問題文中の条件を満たすので、 Yes と出力します。

入力例 2
Copy
123234
出力例 2
Copy
No
123234 は問題文中の条件を満たさないので、 No と出力します。

入力例 3
Copy
323132
出力例 3
Copy
Yes
入力例 4
Copy
500000
出力例 4
Copy
No

# アルゴリズム
1. Nを受け取る
1. Nを分割する
1. 条件をチェック
    1. True → Yes
    1. else → No

# 回答
```Python
N = int(input())

l = [int(x) for x in list(str(N))]

if l.count(1)==1 and l.count(2)==2 and l.count(3)==3:
  print("Yes")
else:
  print("No")
```

# 参考
https://dibtp.hateblo.jp/entry/2013/06/21/000629

https://note.nkmk.me/python-collections-counter/

# 備考
- 進研ゼミでやったやつだ！（桁ごとに分解する）
- 出力形式をYES, NOで間違えた。しょうもないミス。
- 他の人のコードを見る限り、数を数えるタイプ（strで数えている人もいた）とsortして、122333と一致するかどうか検証するタイプ、二つのタイプがあった。
【Windows11】タスクバーでWi-Fiアイコンまたは音量アイコンをクリックした際の再生中の動画のウインドウを非表示にする

## 内容

Windows11の場合、再生中の音楽や動画のサムネイルがタスクバーのWi-Fiアイコンまたは音量アイコンをクリックした際に表示されてしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706631/bb115d29-c0d3-03c1-5155-915067fa92f4.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706631/bc1f5125-6386-267a-d034-4ff8f81d2491.png)

こちらは再生、停止を簡単に行えるため非常に便利なのですが、リモートワークでペアプロなどをする機会に万が一再生中の動画のウインドウが見えてしまうとサボっていると思われそうで嫌だなと感じ、これを非表示にする方法がないか探してみました

## 結論

「chrome://flags」から「Hardware Media Key Handling」を無効にすることで解決できました

### 手順

1. Chromeのアドレスバーへ「chrome://flags」と入力
1. 表示された画面の「Search flags」とある枠内へ「Hardware Media Key Handling」と入力
1. `Default`を`Disabled`に変更
1. PCを再起動


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706631/31040d2b-ff20-3f7a-8a4c-a79437f93ef0.png)

この操作によって再生中の動画がサムネイル表示されることを防げます

また、今回はchromeで試しましたが、他のブラウザでも同様にフラグを無効化することでサムネイル表示を防ぐことができます

## 最後に

皆様良いリモートワークライフを！
分割されたzipファイルを解凍する方法（mac ver）

# はじめに
インターネットやメールでファイルを受け取った際に、以下のような見慣れない形式の分割ZIPファイルを受け取って困ったことはありませんか？

例: `file.zip.001`, `file.zip.002`

私自身は初めて見たとき、「この形式、どうやって解凍するの？」と戸惑いました。

この記事では、こうした分割ZIPファイルの解凍方法について、「アプリを使用する方法」と「コマンドを使用する方法」の2つをご紹介します。

# 解凍方法

## 1. アプリを使用する方法
分割されたZIPファイルを解凍する際に便利なツールとして、私が実際に使用した「7-Zip」を紹介します。

### 手順
1. まず、[7-Zip公式サイト](https://7-zip.opensource.jp/download.html)からアプリをダウンロードしてインストールします
2. 解凍したいファイル（例: `file.zip.001`, `file.zip.002`）をすべて同じフォルダに移動します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524923/39f47320-db45-e4cd-74f4-cca04f43d640.png)

3.ターミナルを起動し、7-Zipがインストールされているディレクトリに移動します
4. 次のコマンドを実行します

```bash
./7zz x file.zip.001
```

上記のコマンドを実行すると、分割されたファイルが結合され、同じフォルダ内に解凍された内容が展開されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524923/b08a29e4-5dc5-be77-fad8-8a978ae90a73.png)

## コマンドを使う方法
上記のようにアプリを使わずにターミナルで以下のコマンドを実行するだけでもまとめて解凍することができます。

```bash
cat xxxxx.zip.* > file.zip
```

以下のように、解凍後は分割されていたファイルが一つのフォルダ内にまとめられています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524923/d636fd41-aa4c-1c99-2bfc-b58cfeed0f4c.png)


# 終わりに
この記事では、分割されたZIPファイルを解凍する方法を「アプリを使用する方法」と「コマンドを使用する方法」の2つご紹介しました。どちらも簡単に実行できるので、ご自身の環境や状況に応じて使い分けてみてください。
Visual Studio ショートカットキー（調べてもなかなか出てこなかったやつ）

AIに聞いても間違ったことばっかり言ってくるので調べるのに時間がかかったこと
* 選択中の単語と同じ単語を追加で選択できるショートカットキー（VScodeでのCtrl+D)
    * Shift + Alt + .（ドット）
管理者権限でも起こる！Account Factoryエラーの原因と対処法

## はじめに
ControlTowerでアカウントを作成しようとしたときにエラーが発生し、アカウントが作成できませんでした。その解決方法を備忘録として残します。

## エラー内容
ControlTowerのAccount Factoryでアカウントを作ろうとしたとき、下記のようなエラー出る時があります。

```
No launch paths found for resource: prod-XXXXXX
```
 上記のエラーメッセージは、AWS Service Catalogでユーザーがプロダクトをプロビジョニングする際に、適切な「ローンチパス」（Launch Path）が見つからない場合に発生します。

※Account Factory は、AWS アカウントのプロビジョニング・登録・更新の際に、アカウントのカスタマイズを可能にする AWS Control Tower の機能です。
![https---qiita-image-store.s3.ap-northeast-1.amazonaws.com-0-3812002-95749aba-bdc9-a85a-e54a-be5f3e1e55c4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/54a469f0-e80f-6865-3a32-05b97aae8ffc.png)

## 原因
このエラーは、ユーザーまたはグループが該当するポートフォリオに対するアクセス権限を持っていないために起こります。

## 今回のエラー発生時の状況
組織管理アカウントのService_Catalog_testグループ内のユーザでログインしたが、グループにはAdministratorの権限がついていたのにも関わらず、エラーが発生


## 解決方法
### ポートフォリオへのアクセスのアクセス権が付与されているか`Service Catarolog`でアカウントを作成する権限があるか確認しに行きます。

1つ目:権限を許可するユーザを指定しているか確認する
2つ目:権限を許可するグループが指定されているか確認する
3つ目:AWSReservedSSO_AWSAdministratorAccessがセットされているか確認する

### 解決前の状況
IAMプリンシパルとプリンシパル名にポートフォリオへのアクセス権がない
![https---qiita-image-store.s3.ap-northeast-1.amazonaws.com-0-3812002-f3b23e86-5377-2075-58d9-7447d863768e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/c5dfed83-5547-1903-6193-6dde689a695e.png)

### 解決後の状況
下記の対象に対してポートフォリオへのアクセス権限を付与している状態。今回は例として、下記に権限を与えておりますが、例えば特定のIAMユーザのみに権限を付与したい場合はIAMユーザのみしてしてあげればよいです。

- 「CreateAccount」というIAMユーザ
- 「Service_catalog_test」というユーザグループ
- 「AWSReservedSSO_AdministratorAccess」を指定しIICユーザへ権限を付与

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/5c91e01f-e65d-75f0-7fa5-68a38094ca09.png)



## エラー解消
アカウントが作成できる状態になりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812002/a53b13ba-695f-3fba-f244-25401213cfb2.png)

## 備考

ロール名:AWSReservedSSO_AdministratorAccess
AWS Single Sign-On (AWS SSO) によって自動的に作成される予約済みのIAMロールです。このロールは、AWS SSOを通じて認証されたユーザーに管理者レベルのアクセス権限を付与するために使用されます。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::123456789012:saml-provider/AWSSSO_617777cea0256256_DO_NOT_DELETE"
            },
            "Action": [
                "sts:AssumeRoleWithSAML",
                "sts:TagSession"
            ],
            "Condition": {
                "StringEquals": {
                    "SAML:aud": "https://signin.aws.amazon.com/saml"
                }
            }
        }
    ]
}
```
Sassをビルドするときにnode_modules下のファイルが見つからない問題の解決方法

# 解決方法
load-pathを指定すれば解決しました。
```shell
sass --load-path=./node_modules/ ./style.scss ./dist/style.css
```

# 感想とか
ググってもAngularやViteの設定方法しか出てこなくて困っていたのですが、`sass --help`でヘルプを見たら載っていました。
ヘルプは偉大。

あと、確かにSassを単体でビルドしたいって状況になることってそんなに無いよな〜とか思ったり。
私はライブラリとしてAngular Material用のテーマを作りたくてこの問題に遭遇しました。

ググったときに出てくる情報が物語っている通り、Sassを単体でビルドしたいという状況はそんなに多くないと思いますが、私のように何かしらの事情で外部モジュールを使ったSassを単体でビルドしたい、という状況になった方の助けになれれば幸いです！
久々にGithubにファイルをpushしようとしたらエラーとなった

## 状況
久々に、MBAを使って、Githubからリポジトリをクローンして、ファイルを編集して、pushしようとしたら、以下のエラーが発生。

```
user@MBA marp_css % git push origin main
Username for 'https://github.com': user_id@gmail.com
Password for 'https://user_id@gmail.com@github.com': 
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/XXXXX/XXXXX.git/'
user@MBA marp_css % 
```

困りました・・・

どうやら、GitHubは2021年8月13日にセキュリティ強化のため、パスワードによる認証を廃止したようで、恥ずかしながら、全然知りませんでした(Githubを使っていなかったのがバレる・・)。

そのため、従来のユーザー名とパスワードでの認証ができなくなりましたとのこと。

ということで、どのように対処したかの備忘として、この記事を残そうと思います。

## とりあえず、perplexityに尋ねてみた

perplexity先生に尋ねたところ、

```
解決方法：個人アクセストークン（PAT）の使用
個人アクセストークン（PAT）は、パスワードの代わりに使用する長い文字列です。これを使うことで、安全にGitHubにアクセスできます。
```

とのことなので、やってみた。

## Githubにログインしてみる

ここでトークンを再作成しろということだった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/ffadd801-332c-658d-6e42-f950a8ef5048.png)

**Previre版** でも作成できそうだったが、怖いので、安定の **Classic版** で作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/3cc21b06-722e-e100-030d-546ccf406cc7.png)

いろいろ設定項目が出てきた・・

通常は `repo` にチェックつければ良いみたいなので、一旦従ってみる。
他の必須項目は、 `デフォルト` のまま。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/e68f851f-f3d5-d3b0-11b8-a05e613540ef.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/6e635dc6-68ab-9a64-8452-e192894b0968.png)

`Note` という項目も設定しないと怒られます。

発行れされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3078481/012d7165-2d59-4dc9-251b-1d7772ef4adf.png)

この発行されたトークンキーを、push時のパスワード入力を求められた時に設定すると良いみたいです。