OmniAICreator/Qiita-1.07M huggingface dataset:
mongodbレプリカセットのアクセス制御を有効化する

## はじめに
![img-products-mongodb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904291/7f777972-0e74-f22d-9cb6-5100a189a2ab.png)
[前回のmongodbレプリカセット構築](https://qiita.com/num-bx77/items/8a05ee5c340134549549)の続きです。
mongodbはデフォルトではアクセス制御が有効になっていないため、
誰でもアクセス可能な状態になっています。
今回はmongodbにアクセス可能なユーザを作成した後に、アクセス制御を設定してみようと思います。

## **この記事でわかる・できること**

- **EC2内にmongodbレプリカセットに対してアクセス制御をかける方法**

## **動作環境・使用するツールや言語**

- **OS バージョン**
  - amazonlinux2

- **言語 バージョン**
  - mongodb 5系

## **前提**

- mongodbがインストール済であること

## **手順**

### mongoシェルでログイン

```linux:
$ mongo localhost:27018
```

### mongoユーザパスワード設定

 ```linux:
$ use admin
$ db.createUser({user:"root", pwd:"pwd", roles:["root"]})
$ db.system.users.find()
    →作成したユーザが存在すること確認
$ db.auth("root","pwd")
    →認証が通るか確認
```
rolesのrootはアクセス制限のないロールになります

### アクセス制御設定

```linux:
$ mkdir -p /usr/data/keys
$ cd /usr/data/keys
$ openssl rand -base64 756 > keyfile
$ chmod 400 keyfile
$ vi /usr/data/db1/mongod.conf
$ vi /usr/data/db2/mongod.conf
$ vi /usr/data/db3/mongod.conf
```

```linux:mongod.conf
# ファイル末尾に追加
security:
    authorization: enabled
    keyFile: /usr/data/keys/keyfile
```

レプリカセットのアクセス制御をする際は、すべてのDBで同じkeyfileを使用する必要があります。
そのためdb1,db2,db3内のmongod.confで追記するものはすべて同じ内容で問題ありません

### mongo.shファイル修正(--authの追記)

```linux:
#! /bin/bash
mongod --auth -f /usr/data/db1/mongod.conf
mongod --auth -f /usr/data/db2/mongod.conf
mongod --auth -f /usr/data/db3/mongod.conf
```
修正後は設定を反映させるために、EC2を再起動 or mongodのプロセスを再起動させてください。

### 動作確認

mongoプロセスを再起動後に実際にアクセス制御が聞いているか試してみてください

```linux:
# mongoにログイン
$ mongosh

# mongoの構成確認
$ rs.status()
　→ユーザ認証していないため失敗

# ユーザ認証
$ db.auth("root","pwd")

# mongoの構成確認
$ rs.status()
　→ユーザ認証後のため成功

```

## **参考資料**

[自己管理型配置におけるロールベースのアクセス制御](https://www.mongodb.com/ja-jp/docs/manual/core/authorization/)
[キーファイル認証を使用した自己管理型レプリカセットの配置](https://www.mongodb.com/ja-jp/docs/manual/tutorial/deploy-replica-set-with-keyfile-access-control/)

## **おわりに・まとめ**

mongodbレプリカセットのアクセス制御手順をまとめてみました。
デフォルトだと誰でも操作可能な状態なので、セキュリティ的も必ずやっておきたいものです。
今回は操作権限のないrootロールを使用しましたが、機会があればロールの種類もまとめてみたいと思います。
【Unity】多言語フォント実装方法(中国語繁体・簡体カバー)　ローカライズ

# はじめに
作者見直し用記事です

ローカライズ作業で日本語、中国語のフォントを設定する際にてこずったので記録を残します。

ローカライズまで含めるなら↓
https://baba-s.hatenablog.com/entry/2019/05/06/200000

# 初期では英語以外は文字化けする
:::note warn
ただ単にTextMeshProを実装すると文字化けしてしまう
:::
`「Japan 日本」`と入力
![スクリーンショット 2024-11-26 215753.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/54667f22-67cd-027d-f09f-882daeaa9bc8.png)


# 手順
１・多言語対応フォントをダウンロード
２・Unityでフォントを作成
３・終了

# １．フォントダウンロード
:::note info
GitHubで中国語対応フォントを入手↓
:::
https://github.com/notofonts/noto-cjk/tree/main/Sans#downloading-noto-sans-cjk

---
:::note info
「TTF Variable Simplified Chinese(簡体中文) Mono TTF」をダウンロード↓
:::

:::note warn
MEMO:
・TTF　→　フォントデータの入ったファイル（TrueType Font）
・TTC　→　.ttfファイルが複数入ったファイル（TrueType Collection）
:::

![スクリーンショット 2024-11-26 225800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/120d8cfa-2e79-4132-38bd-35d161c9cad1.png)



# ２．Unityでフォントを作成
:::note info
ダウンロードしてきたファイルをUnitのAssetに追加↓
:::

![スクリーンショット 2024-11-26 230044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/47e459ea-25ca-63ac-d97f-2435a4e722f8.png)

---

:::note info
Window > TextMeshPro > Font Asset Creatorを選択↓
:::
![スクリーンショット 2024-11-25 172835.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/41b2b46a-d0b4-7b40-5331-a8eeea3961ca.png)

---

:::note info
フォント作成ウィンドウが出てくる↓
:::
![スクリーンショット 2024-11-26 230118 (1) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/aabbbbf9-34db-9d16-4227-1336ac41a276.png)



:::note info
・`Source Font File`　→　ダウンロードしてきた.ttfファイルをアタッチ
・`Atlas Resolution`　→　4096 x 4096 に変更
・`Character　Set`    →　Unicode Range (Hex) に変更
・`Character　Sequence (Hex)`　→　`4E00-9FBF`と入力

最後に`Generate Font Atlas`でフォントを作成
:::

:::note warn
Atlas Resolutionを大きくしすぎるとデータサイズが大きくなります。
`8192x81921`だと`100MB`超えるのでGit管理している場合は注意です。
:::

## 作成まで待機
:::note warn
作成まで少し時間がかかります。（3～4分くらい？）
:::

:::note info
終了したら`Save`↓
:::

![スクリーンショット 2024-11-27 000330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/debabec2-5e36-60fc-629f-966c9930ed91.png)

---

:::note info
フォントが出来てるのでそのまま使用↓
:::

![スクリーンショット 2024-11-27 000345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3847430/f8423407-24e9-3ac5-d05c-9cf56661692c.png)


# まとめ
Unicodeとか初めて使った。
日本語はまた別なので別記事にします。
Gemini先生に「本当ですか。」と聞くと反撃をうけました。本文短いです。

>「本当ですか」という言葉に対して、どのような状況でこの言葉を使っているのか、もう少し詳しく教えていただけますでしょうか？
以下続く。

chatGPT先生は、もう少しやさしかったと思います。


# 参考

https://qiita.com/SAUNAX/items/d4c2eff8fea80d356667#%E8%B3%AA%E5%95%8F2

＞Blockquotes - 引用

https://qiita.com/Qiita/items/c686397e4a0f4f11683d#blockquotes---%E5%BC%95%E7%94%A8
【Rails環境構築】Ubuntuにrbenvをインストールする方法

# はじめに
これまでずっとReactのキャッチアップを進めてきましたが、**転職先で使うであろうRailsのキャッチアップを始めました**。
バックエンドの言語に関しては、業務でJavaをちょろっと触ったことがありますが、ほぼ初学者のマインドで学んでいきます。

学習教材はこちらを使って、手を動かしながら学んでいきます。

https://railstutorial.jp/

# 問題
第二章のToyアプリケーション構築にて、せっかくなので学習がてら**ローカルで環境構築をしてアプリを作成**していきます。
エディタはこれまで使用していた**Cursor（VSCode）を使います**。
**Ubuntuにrbenvをインストールする手順で少し詰まった**ので、その方法をまとめていきます。

# Ubuntuにrbenvをインストールする方法

公式によると、**rbenvの最新バージョンは`sudo apt install`を使ってインストールできないので、Gitからクローンする方法が推奨**されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3675500/894eba56-8bf4-bec7-926d-b4020d72ffa1.png)

**手順はこちら**です。

https://github.com/rbenv/rbenv?tab=readme-ov-file#basic-git-checkout

### ※上記の手順を実施してもrbenvの設定が反映されない
私は**ウィンドウを再読み込みしても反映されなかった**ので、下記を実施しました。

**・rbenvのPATHを追加**
「PCにrbenvの場所を改めて教えてあげる」というイメージです。
```
 $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
 ```
 
 **・設定ファイル再読み込み**
 通常は新しいターミナルを開いたときに自動的に読み込まれるようですが、改めて。
 ```
 $ source ~/.bashrc
 ```

  **・ターミナルを再起動する**
新しい設定を確実に反映させるために行いました。
```
$ exec $SHELL -l
```

 **・rbenvファイルの詳細情報を確認してみる**
 原因の解決と少し逸れますが、
 出力された`lrwxrwxrwx`は、ファイルの権限（誰がどんな操作できるか）を示しています。
 自分のWorkSpace配下にrbenvファイルが存在しており、かつ認識されていることを無事確認できました。
```
$ ls -l ~/.rbenv/bin/rbenv
```

 **・rbenvファイルを実行可能にする**
 rbenvをコマンドとして使えるように直接指示してあげます。
 `chmod +x`は「実行権限を追加する」という意味だそうです。
```
$ chmod +x ~/.rbenv/bin/rbenv
```
**・最終確認**
rbenvのバージョンが表示されていればインストール成功です！
```
$ rbenv -v
```
# おわりに
今回設定を反映させるためにやったこととしては、ざっくり下記の2つになります。
もしrbenvのインストールが上手くいかなければ、参考にしてください。

**・PATHの設定と反映
・実効権限の付与**
# 参考

https://zenn.dev/tm_hack/articles/93fc83db270d78
github copilotにログインできない。超初歩的なミス、プログラミング超初心者向け。

github copilotにログインできない。これについて、とても初歩的だったミスでしたが一応書いておきます。github copilotについてのサイトで登録をすることをしていなかったため、ログインができていなかったようです。
解決策は、https://github.com/login?return_to=%2fgithub-copilot%2fsignup
のサイトにアクセスするだけです。

これで解決すればもう大丈夫です。
私の場合、vscodeから表示→コマンドパレットを開き→ユーザー設定を開くで、
setting.jsonを開き、github copilotに関する記述を削除したのでそちらも一応書いておきます。プログラミングに詳しくないので、全然違うかもしれません。
Math.max で 糞長いパラメータを食わせてみるテスト

https://qiita.com/mogamoga1337/items/7b1055c36330231a0aa1

にて

> 配列がクソ長いとエラーがでるかもしれない。

とあったので試してみた。

## Microsoft Edge

### バージョン

Microsoft Edge for Business バージョン 131.0.2903.51 (公式ビルド 64ビット)

![Microsoft Edge for Business バージョン 131.0.2903.51 (公式ビルド 64ビット)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32143/e1629efc-fc33-6f41-81b2-4245229cb1e6.png)

試したのは F12 のコンソールにて。

### do it.

```text
> Math.max(...Array.from({length:125467}, (v,index)=> index))
<- 125466
> Math.max(...Array.from({length:125468}, (v,index)=> index))
VM2349:1 Uncaught RangeError: Maximum call stack size exceeded
    at Math.max (<anonymous>)
    at <anonymous>:1:6
```

確かに発生を確認できた。

```text
> Math.max.apply(null, Array.from({length:125466}, (v,index)=> index))
<- 125465
> Math.max.apply(null, Array.from({length:125467}, (v,index)=> index))
VM2671:1 Uncaught RangeError: Maximum call stack size exceeded
    at max (<anonymous>)
    at <anonymous>:1:10
```

range 展開の方がいろいろ食いそうなのに apply の方が 数が少なくてエラーになるの何故……。

## Firefox

### バージョン
Firefox 123.0.2 (64ビット)
![Firefox 123.0.2 (64ビット)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32143/6424c8b6-7c51-caac-be23-80f15508092d.png)

### do it.

```text
> Math.max(...Array.from({length:500000}, (v,index)=> index))
<- 499999
> Math.max(...Array.from({length:500001}, (v,index)=> index))
Uncaught RangeError: too many function arguments
    <anonymous> debugger eval code:1
```

引数限界ぽいエラー

```text
> Math.max.apply(null, Array.from({length:500000}, (v,index)=> index))
<- 499999
> Math.max.apply(null, Array.from({length:500001}, (v,index)=> index))
Uncaught RangeError: too many arguments provided for a function call
    <anonymous> debugger eval code:1
```

また違ったエラーになる……？

というか firefox だと apply もそうじゃないのも同じ数でエラーになってる？
.NET 開発においてSystem.InvalidOperationException



#### 1. `System.InvalidOperationException` の発生

WPF アプリケーションで `Microsoft.Extensions.DependencyInjection` を利用している場合、例外 `System.InvalidOperationException` がスローされるケースがあります。このエラーは、通常、DI コンテナの設定や依存性の解決に問題がある場合に発生します。

**発生するエラーメッセージ:**

```
例外がスローされました: 'System.InvalidOperationException' (Microsoft.Extensions.DependencyInjection.dll の中)
```

**原因:**

このエラーの主な原因は、DI コンテナが期待している型がコンストラクタで解決されない場合です。例えば、以下のように引数を持つコンストラクタがある場合、DI コンテナが適切な依存性を提供できなければ例外が発生します。

#### 2. `xaml.cs` でのコンストラクタに引数が渡されなかったケース

特定のウィンドウやコントロールで、コンストラクタに引数を持つ形で定義している場合、`App.xaml` の `StartupUri` を使用して起動した際に、引数が渡されず例外が発生します。

**コード例:**

```csharp
public partial class MainWindow : Window
{
    private readonly SomeService _service;

    public MainWindow(SomeService service)
    {
        _service = service;
        InitializeComponent();
    }
}
```

この場合、`App.xaml` の `StartupUri` で直接 `MainWindow` を指定すると、DI コンテナが `SomeService` の依存性を解決できず例外が発生します。

**解決方法:**

1. **DI コンテナを通じた解決**  
   DI コンテナを利用してウィンドウを起動する場合、`App.xaml` の `StartupUri` を使用せず、`App.xaml.cs` で以下のように明示的にウィンドウを起動します。

   ```csharp
   public partial class App : Application
   {
       private readonly IServiceProvider _serviceProvider;

       public App()
       {
           var services = new ServiceCollection();
           services.AddSingleton<SomeService>();
           services.AddTransient<MainWindow>();
           _serviceProvider = services.BuildServiceProvider();
       }

       protected override void OnStartup(StartupEventArgs e)
       {
           var mainWindow = _serviceProvider.GetRequiredService<MainWindow>();
           mainWindow.Show();
           base.OnStartup(e);
       }
   }
   ```

2. **引数なしのコンストラクタを追加する**  
   DI を使用せず、単純なアプリケーションの場合は、引数なしのコンストラクタを追加することでエラーを回避できます。

   ```csharp
   public MainWindow() : this(new SomeService())
   {
   }
   ```

### まとめ

- `System.InvalidOperationException` は、DI コンテナが適切に設定されていない場合に発生する可能性があります。
- `App.xaml` の `StartupUri` で起動するウィンドウは、引数なしのコンストラクタを持つ必要があります。
- 依存性注入を使用する場合は、`App.xaml.cs` で明示的に起動するようにしましょう。
11/20 zlibのインストール

# 11/20日記
### zlibのインストール

このページを参考にしている
https://www.kkaneko.jp/tools/win/cuda.html#cudnn84

```
cd /d c:%HOMEPATH%
rmdir /s /q zlib
git clone https://github.com/madler/zlib
cd zlib
del CMakeCache.txt
rmdir /s /q CMakeFiles\
cmake . -G "Visual Studio 17 2022" -A x64 -T host=x64 -DCMAKE_INSTALL_PREFIX=c:/zlib
cmake --build . --config RELEASE --target INSTALL
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";c:\zlib\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
powershell -command "[System.Environment]::SetEnvironmentVariable(\"ZLIB_HOME\", \"C:\zlib\", \"Machine\")"
```

このコマンドを順に実行した。

```
cmake --build . --config RELEASE --target INSTALL
```
このコマンドでエラーが出る。

一時ファイルの保存先は、このように変更した。
![スクリーンショット 2024-11-20 145606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3928446/3c381f87-ebb8-e2f8-417b-c8d3eb3e7431.png)

今出ているエラーは、おそらくvscoden関連のパスに日本語が含まれているからだと思う。

```
C:\Users\Ec5-30ec32116l(長岡高専)\AppData\Local\Programs\Microsoft VS Code\bin
```

改善方法として、vscodeを別のディレクトリに再インストールしてみる。
謎構成のサーバで、稼働するポートに待ち受けるプロセスを特定する方法

# 前書き
この文章は、受け渡されたサーバで何か稼働してるかわからないときに、サービス内容(ポート番号)からプロセスを特定する方法について述べる。
プロセスを特定後はその設定ファイルを調べるなどして更に調査を進めることができるため、稼働しているプロセスを特定することは現状把握において重要な手順となる。
稀に使ってないソフトがインストールされていて無駄に時間を過ごすことになることがあるため、稼働中プロセスの特定は重要である。

また、主題とは異なるが作業前にhistoryコマンドで作業前のコマンドログを保全するよう心掛けたほうが良い。

# 具体的手順

## 1. ポートを待ち受けるプロセスIDを特定する
`lsof` コマンドを用いてポートを使っているプロセスを特定することができる

```bash
$ sudo lsof -i:25
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
master  2850 root   13u  IPv4  21521      0t0  TCP localhost:smtp (LISTEN)
```

## 2. プロセスIDからプロセスを分析する
`ps` コマンドを用いてプロセスの情報を入手する

```bash
$ ps 2850
  PID TTY      STAT   TIME COMMAND
 2850 ?        Ss     2:02 /usr/libexec/postfix/master -w
```

# その後の動き
今回は25番ポートでpostfixが稼働していることが分かったため、`/etc/postfix/main.cf` などの設定ファイルを分析することで25番ポートの挙動を推測、分析できる
スプレッドシートにオリジナルの関数を追加する

# はじめに

Googleスプレッドシートには SUM関数 や AVERAGE関数 などの組み込み関数以外にも Google Apps Script (GAS) を使って独自に関数を追加することができます。

# カスタム関数の追加方法

GASを使ってユーザ定義のオリジナル関数を追加する方法は以下の通りです。

1. スプレッドシートを開く
    新規または既存のGoogleスプレッドシートを開いてください。

1. GASのエディタを開く
    メニュー欄から「拡張機能」→「Apps Script」と選択してGASの開発環境（Apps Script Editor）を開きます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/cae15938-c52e-7d42-9686-37a6b4b53ff2.png)

1. カスタム関数を作成する
    エディタで次のような関数を定義して「Ctrl + S」で保存します。

    ```javascript
    /**
     * 引数inputで与えられた数値を2倍にして返す関数。
     * @param {number} input 数値
     * @return 引数inputの2倍の数値
     * @customfunction
    */
    function DOUBLE(input) {
      return input * 2;
    }
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/5c20d810-a3be-2162-cf69-662553c251fb.png)

1. カスタム関数を使う
    Apps Script Editor上で定義・保存したカスタム関数はスプレッドシートですぐに利用可能になります。

    スプレッドシートのタブに戻って「=DOUBLE(」と入力するとユーザ定義の関数が使い方のヒントも含めて表示されるはずです。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939665/6ed8673e-34dc-3562-fe1d-758614b99bc5.png)

    :::note info
    #### カスタム関数の命名規則
    <details>
    ユーザ定義のカスタム関数を作成する際、関数はJavaScriptの標準的な命名規則に加えて以下のルールを守るようにしてください。

    - 既に存在する SUM() などの組み込み関数とは異なる名前にする
    - Apps Scriptのプライベート関数を意味するアンダースコア(_)で終わらせない
    - ```let func = () => {...}```等ではなく```function func() {...}```の形式にする
    - 必須ではないが、伝統的に大文字で命名する
    </details>
:::
Azure Devopsを使っていて急にプッシュできなくなった

## 問題
azure devopsでリポジトリを管理しているのですが、プッシュをしようとするとぐるぐる状態になって正常に動作しませんでした。
再度、`git clone`しようとすると、`git@ssh.dev.azure.com's password:`でパスワードを求められてしまう。

## 確認したこと
ひとまず、SSH Public Keysを覗きに行きました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/c6295f70-0022-af44-218e-745c9e0a1668.png)
すると、statusの所が ***expired*** になっていました。（画像は更新後なのでActiveです）
（期限は2か月に切れていたのにここ1か月くらい正常に動作していたのはなぜ・・）

## やったこと1
`ssh-keygen`でSSHキーの再作成とAzure Devopsへの再登録です。
[参考 : ssh-keygen](https://atmarkit.itmedia.co.jp/ait/articles/1908/02/news015.html)

しかし、私の場合、`git clone` をすると、まだ`git@ssh.dev.azure.com's password:`と表示されてしまいました。

## やったこと2
`.ssh`フォルダの`id_rsa.pub`,`id_rsa`,`config`を一度削除しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/cf93bf6e-bb71-fb6a-20ca-0f2767ab0876.png)

その後、再度`ssh-keygen`を実施しました。
configファイルを作成します。中身は以下のようにしました。
```bash
Host ssh.dev.azure.com
    IdentityFile ~/.ssh/id_rsa 
```

このままだと `Git: Public key authentication failed` というエラーになってしまったので以下のコマンドを実行します。
```bash
chmod 0400 ~/.ssh/config
```
[参考 : Git: Public key authentication failed(stack overflow)](https://stackoverflow.com/questions/52696564/git-public-key-authentication-failed)


これで正常な状態に戻りました！！
CloudFormationの関数!Refと!Subについてまとめてみる

## はじめに
CloudFormationテンプレートを書く際に組込関数を使用することでテンプレートをより柔軟かつ再現性を高くしてくれて構成管理を効率化できます。
実際にテンプレートで値を参照する際によく使用するRefとSubの違いについてまとめてみました。

## RefとSubについて
### !Ref

- !Refは、指定したリソースやパラメータの値を参照するために使用
### 主な用途
    リソースの物理IDを取得:
        例: AWS::EC2::InstanceではインスタンスIDを返す
        例: AWS::S3::Bucketではバケット名を返す
    パラメータの値を取得:
        テンプレート内で定義したパラメータの値を取得

### 使用例
```
Parameters:
  MyBucketName:
    Type: String
    Default: "example-bucket"

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref MyBucketName
```
- 上記の例ではMyBucketNameの値を!Refを使用して参照している

### !Sub
- !Subは、文字列をテンプレート化し、リソースの値やパラメータを埋め込むために使用

#### 主な用途

    文字列の組み立て:
        プレースホルダーを使って、値を埋め込んだ文字列を生成
    リソースやパラメータの値の埋め込み:
        ${}形式でプレースホルダーを定義し、動的に値を挿入

#### 使用例
```
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "my-bucket-${AWS::Region}-${AWS::AccountId}"
```
- 上の例ではリージョンとアカウントIDを含むバケット名を返しています

 ## 違いのまとめ
 
|特徴  |!Ref  |!Sub  |
|---|---|---|
|基本用途  |単純な値の参照  |動的な文字列の生成  |
|戻り値  |物理IDやパラメータの値  |プレースホルダーを埋め込んだ文字列  |
|文字列の操作  |不可  |${}形式で埋め込み可能  |
|使用シンプルさ  |簡単  |若干複雑  |
|動的生成の柔軟性  |制限あり  |柔軟  |


## 最後に
単純にパラメータやリソースを参照したいときは!Ref、値を埋め込んで複雑な文字列を作りたいときは!Subというように状況に応じて使い分けるのがよさそう
ActiveJobのrescue_fromから例外が発生してもretry_onが動かない

`rspec`で`retry_on`のテスト書いて、ジョブクラスをリファクタしたら動かなくなりました。

## 環境
- 以下の環境で発生しました。

| - |Version|
|:---|:---|
|ruby|3.3.5|
|rails|7.2.2|
|rspec|3.13|

## 本題
- ジョブクラスで`rescue_from`を使っていると、`retry_on`が少なくとも動きませんでした。
- 本番環境で再現するかわかりませんが、気をつけないといけないポイントかと思います。

### retry_on が動作する
```ruby
class BaseJob < ApplicationJob
  queue_as :default

  retry_on RetryError, wait: 30.seconds, attempts: 4

  def perform
    # 何かしらの処理
  rescue ActiveRecord::LockWaitTimeout => e
    raise e if e.message.exclude?('try restarting transaction')

    raise RetryError
  end
end
```

### retry_on が動作しない
```ruby
class BaseJob < ApplicationJob
  queue_as :default

  retry_on RetryError, wait: 30.seconds, attempts: 4
  rescue_from ActiveRecord::LockWaitTimeout, with: :error_handler

  def perform
    # 何かしらの処理
  end

  def error_handler(e)
    raise e if e.message.exclude?('try restarting transaction')
    raise RetryError
  end 
end
```
New Relic を活用する上での基礎的なコンテンツをインデックス化してみた

ここ最近、**New Relicを活用するための基礎的なコンテンツを公開**していますが、一覧でみれる場所があると参照しやすいと思い、こちらの記事を**インデックスとして公開**したいと思います。**基礎的なコンテンツは随時追加**していきます！

**New RelicのQiita Organizationの記事全体の一覧**は下記を参照ください。

https://qiita.com/organizations/newrelic/items

# :one: 事前準備編



## サインアップ
まずはサインアップが必要です。下記を参考に**無料サインアップ**をしてください。

https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa

## ネットワーク要件の確認
お使いのPCから**New Relicの画面を表示**したり、監視対象のホストやアプリケーションから**テレメトリーデータをNew Relicに送付**する際に必要となる**ネットワークの要件**を確認ください。

https://qiita.com/T_OMORI/items/4b08d73cba29167dd72c

## アカウント管理
**ユーザーを追加**したり、**グループやロールを使って権限を制限**したり、**アカウント構成を変更**したりすることが可能です。

https://qiita.com/T_OMORI/items/508777b51d1ba36e6d41

https://qiita.com/T_OMORI/items/4ee7b85a0427843f6d4a

https://qiita.com/T_OMORI/items/a62dd067fad084d4443a

https://qiita.com/T_OMORI/items/a2fca1af2274d16ccb51

https://qiita.com/T_OMORI/items/f67c21c2cee73876f7e2

# :two: セットアップ編

## インフラ
インフラ関連の監視の情報をまとめています。

### クラウド連携
https://qiita.com/nr-mito/items/ec595a70336ceb1db84a

https://qiita.com/nr-mito/items/81639ea20889d5d069be

### ホスト監視
https://qiita.com/nr-mito/items/b11c4645cfc3f5ad6d8a

https://qiita.com/nr-mito/items/7ab8f9d69b12943a8a0b

### コンテナ監視
https://qiita.com/nr-mito/items/a600b109a356defa85e8

https://qiita.com/nr-mito/items/4084aea3f7ad6b25d6e1

### 3rd Partyのソフトウェア監視
https://qiita.com/nr-mito/items/c14647f651bb0e1a7113


## バックエンド
バックエンドの情報をまとめています。

https://qiita.com/nr-mito/items/74bf587bc97128403d9e

https://qiita.com/nr-mito/items/4fcdef036777e6d28787

## フロントエンド

フロントエンドの情報をまとめています。

https://qiita.com/T_OMORI/items/c23c739bf414ad91c857

## 外形監視

外形監視の情報をまとめています。

https://qiita.com/ume67026265/items/02e602b8af21078366f9

https://qiita.com/ume67026265/items/7e1ef6119a246a7425bf


# :sparkles: その他
New Relicでは、新しい機能やその活用方法について、QiitaやXで発信しています！
無料でアカウント作成も可能なのでぜひお試しください！

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

:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::
AWS CloudFormation を CLI から生成だけ行なって自動実行させない方法

# これなに

- 単なる初学者のメモです
- CLI から実行しても CloudFormation が自動実行されないなあと思ったけど、そういうオプション指定してたのでそりゃそうだという学習メモ


# CloudFormation を実行せずに生成だけを CLI で行う手順

- `--no-execute-changeset` オプションを付加するだけ
- サンプルコマンドは以下の通り

```zsh
$ aws cloudformation deploy --template-file ${ymlファイルパス} --stack-name su3hokkaido-app --capabilities CAPABILITY_NAMED_IAM --no-execute-changeset
```

# 記事作成の背景

- VPC, subnet, ルートテーブル, ECR の作成を CloudFormation を使って CLI 経由で実行しようとした
- しかし、全く実行される気配がなくて何が原因かわからなかった
- 参考にして実行したコマンドにオプションを指定しているのにそれがわかってなかった

### 生成された Stack

ずっとレビュー中になってる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/d4287bba-9405-220b-9b40-d3609aba23e2.png)

### 実際のコマンドライン

ちょびっとテキトーな値に書き換えてますが、大体こんな感じです。
実行した yml ファイルの中身は割愛します。

```zsh
$ aws cloudformation deploy --template-file 2_cloudformation_vpc.yml --stack-name su3hokkaido-app --parameter-overrides $(cat dev.cfg) --capabilities CAPABILITY_NAMED_IAM --no-execute-changeset

Waiting for changeset to be created..
Changeset created successfully. Run the following command to review changes:
aws cloudformation describe-change-set --change-set-name arn:aws:cloudformation:ap-northeast-1:999999999999:changeSet/awscli-cloudformation-package-deploy-1732077013/aa1e1a24-2365-4320-a767-e6b0092bc252
$ 
```

### 実際の解決

#### 1: `--no-execute-changeset` を外して実行する

これが一番簡単な方法

#### 2: GUI から実行

- CloudFormation > Stacks から生成した Stack を開いて Change Sets のタブを開く
- タブの中に表示されている生成済みの Change Set を選択して Execute change set で実行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/cc6792ea-b7d0-688b-d9a3-4b2a4786561c.png)

#### 3: CLI から実行

生成された Stack 名称を確認

```zsh
# command: aws cloudformation list-change-sets --stack-name ${Stack名称}
$ aws cloudformation list-change-sets --stack-name su3hokkaido-app
{
    "Summaries": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:999999999999:stack/su3hokkaido-app/22990a90-a6f8-11ef-885b-065399c40a55",
            "StackName": "su3hokkaido-app",
            "ChangeSetId": "arn:aws:cloudformation:ap-northeast-1:999999999999:changeSet/awscli-cloudformation-package-deploy-1732077013/aa1e1a24-2365-4320-a767-e6b0092bc252",
            "ChangeSetName": "awscli-cloudformation-package-deploy-1732077013",
            "ExecutionStatus": "AVAILABLE",
            "Status": "CREATE_COMPLETE",
            "CreationTime": "2024-11-20T04:30:13.543000+00:00",
            "Description": "Created by AWS CLI at 2024-11-20T04:30:13.305774 UTC",
            "IncludeNestedStacks": false
        }
    ]
}
```

以下のコマンドで実行する

```zsh
# command: aws cloudformation execute-change-set --stack-name ${Stack名称} --change-set-name ${ChangeSet名称}
$ aws cloudformation execute-change-set --stack-name su3hokkaido-app --change-set-name awscli-cloudformation-package-deploy-1732077013
```


# 最後に

自戒のため記事作成しました。
ちゃんとひとつひとつのメソッド、コマンド、オプションなどを理解して作業しないと取り返しのつかない問題に直面する可能性もあるので慎重にやっていきましょう！

あー恥ずかしい！
`pyquaternion.Quaternion`で回転行列を指定したときに、"ValueError: Matrix must be orthogonal, i.e. its transpose should be its inverse"というエラーが発生した

# 環境
* Python 3.12.4
* pyquaternion 0.9.9

# 内容
回転行列からクォータニオンを生成しようとしたら、`ValueError`が発生しました。

```
In [438]: np.array([[-0.9878369, -0.0169982, -0.1545619],
     ...:      ...:        [ 0.0140767, -0.9997013,  0.0199772],
     ...:      ...:        [-0.1548553,  0.0175585,  0.9877811]])
Out[438]:
array([[-0.9878369, -0.0169982, -0.1545619],
       [ 0.0140767, -0.9997013,  0.0199772],
       [-0.1548553,  0.0175585,  0.9877811]])

In [439]: from pyquaternion import Quaternion

In [440]: Quaternion(matrix=matrix)
---------------------------------------------------------------------------
ValueError: Matrix must be orthogonal, i.e. its transpose should be its inverse
```

回転行列は直行行列でないといけないのですが、直行行列でなかったようです。


https://github.com/KieranWynn/pyquaternion/blob/99025c17bab1c55265d61add13375433b35251af/pyquaternion/quaternion.py#L180-L181


```
        if not np.allclose(np.dot(R, R.conj().transpose()), np.eye(3), rtol=rtol, atol=atol):
            raise ValueError("Matrix must be orthogonal, i.e. its transpose should be its inverse")
```

トレランスのデフォルト値は以下の通りです。
* `atol` : 絶対誤差（`1e-8`）
* `rtol` : 絶対誤差（`1e-5`）


https://github.com/KieranWynn/pyquaternion/blob/99025c17bab1c55265d61add13375433b35251af/pyquaternion/quaternion.py#L160C35-L160C48

以下の通り`atol`を指定することで、クォータニオンを生成することができました。

```
In [442]: Quaternion(matrix=matrix, atol=1e-7)
Out[442]: Quaternion(0.007792803681116881, -0.07759405485330212, 0.009413009893299702, 0.9969101388791268)
```


ドキュメントには`atol`, `rtol`の説明がありません。また、`Quaternion.__init__`には具体的な引数は記載されていない（`*args, **kwargs`だけ）ので、ソースコードを見る必要がありました。
jetbrains系ideでなんか真っ赤になる時の対処

# 概要
jetbrains系ideでなんか真っ赤になる時の対処法。

とりあえず [Repair IDE](https://www.jetbrains.com/help/go/repair-ide.html) する。

`File` -> `Repair IDE`で選択できるはず。
これでindex貼り直しなりしてくれる。
ひずみエネルギとそれを使った材料力学 基本例題8.26 P284 「材料力学演習(20221021)」をsympyでやってみたい。

・申し訳ありません。**例題番号が間違っていました。**(2024-11-25)
ひずみエネルギとそれを使った材料力学 ~~基本例題8.28~~ P284 「材料力学演習(20221021)」をsympyでやってみたい。
　　　↓
ひずみエネルギとそれを使った材料力学 **基本例題8.26** P284 「材料力学演習(20221021)」をsympyでやってみたい。



・申し訳ありません。?小細工だらけです。いい方法をアドバイスをいただけると幸いです。
・作図もできていません。

~~**パイソニスタの方へ**~~
~~・教えて下さい。~~

# オリジナル
[基本例題8.26 P284 (pdf)](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=289)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　

# sympyで
・ver0.1 p284 基本例題8.26
```python
# ver0.1 p284 基本例題8.26
from sympy import *
var('P,l,a,b')
var('MB,PC')
MAB_str ="(MB-P*a-PC*l)+(P+PC)*x"                                                   ;print("#",MAB_str)
MBC_str = MAB_str                + "-P*(x-a)-MB"                                    ;print("#",MBC_str)
U       = "1/(2*EI)*integrate((" + MAB_str+")**2,(x,0,a))+" \
         +"1/(2*EI)*integrate((" + MBC_str+")**2,(x,a,l))"                          ;print("#",U)    
rep1={MB:0,PC:0}
rep2={l :a+b}
tB      =     "1/EI*integrate("  +str(diff(sympify(MAB_str)**2,MB)/2) +",(x,0,a))"  #;print("#",tB)    
tB      =sympify(tB).subs(rep1)                                                     #;print("#",tB)    
print()
# ? 手抜き
tB      =diff(sympify(U),MB).subs(rep1)                                              ;print("#",tB)    
vC      =diff(sympify(U),PC).subs(rep1).subs(rep2).expand()                          ;print("#",vC)    
# (MB-P*a-PC*l)+(P+PC)*x
# (MB-P*a-PC*l)+(P+PC)*x-P*(x-a)-MB
# 1/(2*EI)*integrate(((MB-P*a-PC*l)+(P+PC)*x)**2,(x,0,a))+1/(2*EI)*integrate(((MB-P*a-PC*l)+(P+PC)*x-P*(x-a)-MB)**2,(x,a,l))

# -P*a**2/(2*EI)
# P*a**3/(3*EI) + P*a**2*b/(2*EI)
```
・ver0.2 p284 基本例題8.26
・入力と出力だけにしました。
```python
# ver0.2 p284 基本例題8.26
from sympy import *
var('P,l,a,b')
var('MB,PC')
MAB_str ="(MB-P*a-PC*l)+(P+PC)*x"                                                   ;print("#",MAB_str)
MBC_str = MAB_str                + "-P*(x-a)-MB"                                    ;print("#",MBC_str)
U       = "1/(2*EI)*integrate((" + MAB_str+")**2,(x,0,a))+" \
         +"1/(2*EI)*integrate((" + MBC_str+")**2,(x,a,l))"                         #;print("#",U)    
rep1={MB:0,PC:0}
rep2={l :a+b}
tB      =diff(sympify(U),MB).subs(rep1)                                             ;print("#",tB)    
vC      =diff(sympify(U),PC).subs(rep1).subs(rep2).expand()                         ;print("#",vC)    
# (MB-P*a-PC*l)+(P+PC)*x
# (MB-P*a-PC*l)+(P+PC)*x-P*(x-a)-MB
# -P*a**2/(2*EI)
# P*a**3/(3*EI) + P*a**2*b/(2*EI)
```

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

# いつもと違うおすすめです。

https://qiita.com/mrrclb48z/items/9aa2644f04aa8e46c013

#### 参考文献

~~＞一部に等分布荷重を受ける単純支持はり~~
~~＞JSME p89~~
　
~~＞単純支持ばり 7)~~
~~＞構造力学公式集 p136~~
[JavaScript] 配列の最小値・最大値を求める（二番煎じ）


## 元ネタ

https://zenn.dev/progate_users/articles/c86f2d1fb855e0

## 本文

これでもいける

```js
console.log(Math.min(...[1, 3, 8, 7, 5]));
console.log(Math.max(...[1, 3, 8, 7, 5]));
```

メリットはワンライナーで書けることくらい。

配列がクソ長いとエラーがでるかもしれない。

数ミリ秒も無駄にしたくないならfor文で比較演算子で確認するのが速いと思われ。
アプリ系のプログラミングでそんな場面はないとは思うが。

<!--

## どうでもいいが

ZennってQiitaと違って記事の編集履歴見れないよね（多分）。

そうなると、仮にコメ欄で指摘しても、記事を編集して、「書いてありますけど？節穴なんでちゅか？（笑）」みたいなムーブができるから、うーんって感じ。

別にこの記事に対して言っているわけではないので勘違いしないように。

-->
1次テイラー展開とニュートン法による方程式の解の計算機的解法

## 前提
### 概要
ニュートン法による方程式の解の近似的解法は1次テイラー展開から導出される手法です。当記事では$f(x)$と$f(x+h)$のテイラー展開に基づく1変数のニュートン法について確認を行いました。


### 1変数のテイラー展開
点$x=a$を中心とする$f(x)$の1次テイラー展開は下記のような数式で表されます。

```math
f(x) \simeq \frac{f(a)}{0!} + \frac{f'(a)}{1!}(x-a) \qquad (1)
```

同様に点$x$を中心とする$f(x+h)$の1次テイラー展開は下記のような数式で表されます。
```math
f(x+h) \simeq \frac{f(x)}{0!} + \frac{f'(x)}{1!}h \qquad (2)
```


## 1変数のニュートン法
### $f(x)$のテイラー展開に基づくニュートン法
$(1)$式について$(式の右辺)=0$を$x$について解き、$x$を$x_{n+1}$、$a$を$x_{n}$で置き換えることで1変数のニュートン法を導出することができます。まず$(式の右辺)=0$は下記のように解くことができます。

```math
\begin{align}
\frac{f(a)}{0!} + \frac{f'(a)}{1!}(x-a) &= 0 \\
x - a &= -\frac{f(a)}{f'(a)} \\
x &= a - \frac{f(a)}{f'(a)}
\end{align}
```

上記の$x$を$x_{n+1}$、$a$を$x_{n}$で置き換えると下記の式を得ることができます。

```math
x_{n+1} = x_{n} - \frac{f(x_{n})}{f'(x_{n})}
```

上記の式はニュートン法における漸化式に一致します。この式の解釈にあたっては、「点$(x_{n},f(x_{n}))$における$f(x)$の接線が$(x_{n+1},0)$を通る」ことを抑えておくと良いです。



### $f(x+h)$のテイラー展開に基づくニュートン法
$(2)$式については下記のように解くことができます。

```math
\begin{align}
\frac{f(x)}{0!} + \frac{f'(x)}{1!}h &= 0 \\
h &= -\frac{f(x)}{f'(x)}
\end{align}
```

上記の式の解釈にあたっては「点$(x,f(x))$における$f(x)$の接線が$y=0$となる点が$x+h$となる」と解釈すればよいです。よって、ニュートン法の漸化式は下記のように得ることができます。

```math
h_{n+1} = h_{n} - \frac{f(x+h_{n})}{f'(x+h_{n})}
```
iOS: unknown ISA PBXFileSystemSynchronizedRootGroup に関するエラーの解決法

# Xcode エラー対策: [PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup]

最近、Xcodeでの開発中に以下のエラーが発生しました。

> PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup

## 結論

本エラーは、特定のフォルダーを「グループ」形式に変換することによって解決可能です。具体的には、対象フォルダーを右クリックし、「グループに変換」を選択することで、通常通り使用できるようになります。

## 詳細

### エラーの原因
このエラーは、XcodeのバージョンやCocoaPodsとの互換性に起因することが多く、特にXcodeのベータ版を使用している場合や、特定のバージョンにおいて新しいISA（クラス識別子）タイプが導入されると発生する可能性があります。

### 解決方法
1. **対象フォルダーを右クリック**
   - Finderでプロジェクトを開き、Xcodeのプロジェクトナビゲータ内で対象のフォルダーを見つけます。
  
2. **「グループに変換」を選択**
   - 右クリックメニューから「グループに変換」を選択します。
  
3. **再度ビルドを試みる**
   - 作業を続け、プロジェクトを再ビルドして、エラーが解消されたかを確認します。

### 引用
このエラーに関する詳細な議論や解決策については、以下のGitHubリポジトリをご参照ください。
[GitHub Issue #12456](https://github.com/CocoaPods/CocoaPods/issues/12456)

## まとめ
本エラーは通常の操作によって簡単に解決可能です。しかし、問題が解消しない場合は、XcodeまたはCocoaPodsのバージョンが互換性を持っていることを確認し、必要に応じて再インストールを検討することをお勧めします。

他にご質問があれば、お気軽にお尋ねください。
【Ruby】正規表現の\A・^と\z・$の違い

# はじめに
こんにちは！アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
前回正規表現についての記事を書きましたが、コメントでいくつか指摘をいただき理解できていない部分があることを知り改めて勉強になりました。
その中で、 `\Aと^`の違い、`\zと$`の違いについて触れていただけて知ってはいるものの、理解度を深めるために簡単ではありますが、記事にまとめようと思いました。

# `\A と ^` の違い
`\A` は「文字列の先頭」にのみ一致します。
一方、`^` は「行頭」に一致します。
理解度を上げるために具体例を見てみましょう
```Ruby
text = "Hello world\nThis is Ruby"

# \A の場合
puts text =~ /\AHello/ # => 0（文字列の先頭 "Hello" にマッチ）
puts text =~ /\AThis/ # => nil (文字列の先頭ではないのでマッチしない)

# ^ の場合
puts text =~ /^This/   # => 12（2行目の行頭 "This" にマッチ）
puts text =~ /^Hello/  # => 0（1行目の行頭 "Hello" にマッチ）
```
`\A` は「文字列全体の先頭」でしかマッチしないため、`This` にはマッチしません。
一方、`^` は行頭にマッチするので、複数行に対応し、各行の最初の文字にマッチしていることがわかります。

# `\z と $` の違い
`\z` は「文字列の末尾」にのみ一致します。
一方、`$` は「行末」に一致します。
上記同様、具体例を見てみましょう。
```ruby
text = "Hello world\nThis is Ruby\n"

# \z の場合
puts text =~ /Ruby\z/  # => nil（"Ruby" の後に改行があるため一致しない）
puts text =~ /\n\z/    # => 21（改行が文字列の末尾なので一致）

# $ の場合
puts text =~ /Ruby$/   # => 17（2行目の行末 "Ruby" にマッチ）
puts text =~ /\n$/     # => 21（改行が行末にマッチ）
```
`\z` は「文字列の末尾」にしかマッチしないため、Rubyではなく`\z`にマッチしています。
改行の`\n`も含めての「文字列の末尾」なので注意しましょう。
`$` は各行の末尾に対応し、改行前や行末に一致します。

なお、`$`の行末の扱いについては、わたしからではなく、以下の記事を見ていただくと理解度が深まるとおもうので参考にしてみてください。

https://qiita.com/scivola/items/132200d5dbe52ff33c9f

# まとめ
今回はちゃんと自分が理解できているかの確認と、違いがわからずに進んでいる方向けにそれぞれの違いを書いてみましたので最後にまとめておきたいと思います
* `\A`
文字列の先頭にマッチする
* `^`
各行の行頭にマッチする
* `\z`
文字列の完全な末尾にマッチする
* `$`
各行の行末または文字列の末尾にマッチする
Svelte の組み込み要素について

## Svelteの組み込み要素

- `<svelte:self>`

    自分自身をインポートすることはできないため、`<svelte:self>`を使用して再起的にコンポーネントを使用できる。

    <br>

- `<svelte:component this={component}>`

    selectなどと組み合わせて、表示させるコンポーネントを切り替えることができる。

- `<svelte:element this={element}>`

    elementに入った値に応じた要素に変更される。'h1'が入ればh1タグで囲っている時と同じように表示される。

- `<svelte:window>`

    windowオブジェクトへのイベントリスナーの適応ができる。bindをかけることもできる。

- `<svelte:body>`

    bodyへのイベントリスナーの適応が可能になる。マウス関係のイベントを使用する際に便利。

- `<svelte:document>`

    上記のdocument版。

- `<svelte:head>`

    head何の要素の追加が可能。

- `<svelte:option>`

    レンダリング時のコンポーネントの挙動等の設定ができる。

- `<svelte:fragment>`

    `<span slot="name"></span>` を使用するとspanタグごと要素が送られてしまう。`<svelte:fragment>`を使用することで、タグで囲った内部だけを送ることができる。
【Svelte】slotについて

## Slot

子コンポーネントに`<slot />`タグを持たせることで、親コンポーネントから子コンポーネントに要素の受け渡しができる。

```html:Child.svelte

<div class="">
    <slot />
</div>
```

```html:Parent.svelte

<Child>
    <span>この内容がこコンポーネントの要素として受け渡される</span>
</Child>
```

名付けをしてこ要素に受け渡すこともできる。
親コンポーネントでは`<span slot="名前">受け渡したい値</span>`、子コンポーネントでは`<slot name="名前"/>`のように指定して受け渡しができる。

```html:Child.svelte

<div class="card">
	<header>
		<slot name="telephone" />
		<slot name="company" />
	</header>
	
	<slot />

	<footer>
		<slot name="address" />
	</footer>
</div>
```

```html:Parent.svelte

<main>
	<Child>
		<span>Patrick BATEMAN</span>
		<span>Vice President</span>

		<span slot="telephone">212 555 6342</span>

		<span slot="company">
			Pierce &amp; Pierce
			<small>Mergers and Aquisitions</small>
		</span>
		
		<span slot="address">358 Exchange Place, New York, N.Y. 100099 fax 212 555 6390 telex 10 4534</span>
	</Child>
</main>
```

スタイルに関しては、親コンポーネントで指定するか、子コンポーネントの中で`:global(タグ名)`を指定してスタイルの変更ができる。

slotタグの中に要素を入れることで、受け渡されなかった場合に出力する値を指定することができる。

```html:Child.svelte

    <slot>
        <i>何も受け渡されなかった場合、この文章が表示される</i>
    </slot>
```
Pyxelでシューティングゲーム作ってみた

## Pyxelでシューティングゲームを作ってみた

<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3850890/9c52e2a3-03ec-3f42-5eb5-767b4281d679.png>

　Pyxelでシューティングゲームを作ってみました。
　
| 操作方法 | 操作内容 |
|:-----------|:------------|
| Fキー または Aボタン       |攻撃         |
|→     | 右に移動      |
| ←       | 左に移動        |

　~~スマホにも一応対応してます。Aボタンっぽいやつ押せばタイトルスキップとかできるはず。~~
　スマホでもできました。SwitchのコントローラーでいうところのAとBが逆っぽいですが。
　敵の出現がかなり大雑把な乱数出現なので、全然出現しない時とかあるかもしれません。スコアに比例して出やすくなってるので、時間経過で大量出現はします。
　当たり判定は感覚より大きいかも。

https://at3388.github.io/Shooting-Game/shooting.html

追記：激ヤバ版

https://at3388.github.io/Shooting-Game/shooting_crazy.html

## 制作にあたって
　元々はフォント描画にPyxelUniversalFontを使っていたのですが、htmlでは使えないので、このバージョンではpyxresファイルに直接描画内容を書き込んでいます。その際、スクリーンショットの縮小画像を読み込むという荒っぽい方法をとっているため、描画が粗いです。
　githubにPyxelUniversalFontを使ったバージョンのpyxappもあげているので、pyxelが使える環境の方はそちらもどうぞ。

https://github.com/At3388/Shooting-Game
【イベントレポート】JAWS-UG東京 ランチタイムLT会 #17

いつも記事を読んでいただきありがとうございます！
モブエンジニア（[@mob-engineer](https://qiita.com/mob_engineer))です！

今回は11/20（水）に参加した**JAWS-UG東京 ランチタイムLT会 #17**のイベントレポートをブログとしてアウトプットいたします。

サクッと読めるように執筆を心がけておりますので、お気軽に読んでいただければ幸いです。

# 目次
- LT
    - ショートセッションAWS Ambassadorが語る、AWS認定全冠の先
    - LT① AWS新規資格の出題ボットを作ろう！
    - LT② 個人でもIAM Identity Centerを使おう!
    - LT③ SSM Runbook作成の勘所
- まとめ

## イベント概要（connpassより）

https://jawsug.connpass.com/event/334931/

## LT

### ショートセッションAWS Ambassadorが語る、AWS認定全冠の先
- 自己紹介
    - JAWSUG山梨 運営メンバーの方
    - AWSアンバサダー
- AWS認定意味ある/ない戦争
    - JAWSUG山梨のセッションで話したら反響が大きかった
    - AWS全冠は把握している限りで約1100名いる
    - AWS認定取得自体に意味があるかといわれたら...
- 論争が起きる理由
    - 資格を保有していなくてもITエンジニアとして活躍できる
    - キャリアステージによって資格の重みが変わってくる
        - ベテランだと資格以外の経験が重視される
    - ポジショントークによって変わってくる
- AWS認定全冠=AWS完全に理解したではない
    - 全冠認定の先に人材育成、PJ推進、価値提供などがある
- 全冠認定のメリット
    - 複数のソリューションを思いつくようになった
    - 多くの人から相談を受けるようになった
    - 継続的な勉強を行うようになった
    - 生成AIハッカソンやBot開発をアウトプットとして行っている
- 資格取得は良い
    - ゴールが明確
    - 錯覚資産として使える
    - 体系的に知識を学べる
- まとめ
    - 経験と知識のブロックを伸ばしていくことが大切
    - 持続可能なペースで継続して学んでいく

## LT① AWS新規資格の出題ボットを作ろう！
- 自己紹介
    - 現在はインフラっ設計構築を行っている
- 対象者
    - 資格取得を目指している方向けの助けになってもらいたい
- 今までの学習スタイル
    - 問題演習を行ってから分からないところをキャッチアップしていたが、演習がない
    - 試験ガイドから問題生成ができるのではないか？
- 出題ボット技術スタック
    - Difyを用いてBOT開発
    - 学習ガイドを読んで要約した内容をCSV化させた
- まとめ
    - Botを活用して勉強を行っていく

## LT② 個人でもIAM Identity Centerを使おう!
- 自己紹介
    - 日本ラッドのエンジニア
- AWSへのログインどうするか
    - IAMユーザを使ってログイン
    - IAM Identity Centerを通じてログイン
        - 昔はAWS Single Sign-Onの名前だった
- IAM Identity Center
    - AWSアカウント内のユーザー/グループに対してアクセス許可セットを設定する
    - AWS Organizations配下にないAWSアカウントも設定可能
    - サードバーティのSaaSアプリケーションを設定できる
- まとめ
    - 個人利用であればAWS Organization外のAWSアカウント＋SaaS利用がオイシイ

## LT③ SSM Runbook作成の勘所
- 自己紹介
    - AWS整備や運用業務を行っている
    - 前職は学校の先生
- Systems Managerとは
    - EC2に様々なことができるサービス
    - ドキュメント形式で機能を制御できる
- 苦労したところ
    - パラメータ設定のお作法がややめんどくさい（{など）
    - 正規表現を使う場面が多い
    - 実行画面と確認画面が異なる
    - 処理途中で型変換したいときは内部処理が必要（StringしかList型に対応していない）
        - executeScriptを使えばうまく行える
    - コードを書きながら可視化が可能
- まとめ
    - 構文が微妙にイラっとする場合がある
    - 可視化して書いていけるのが良き
    - パラメータに関して型変換が行えるので工夫ができる

## まとめ
本LT会を通じて、**資格取得のモチベーション**を上げることができました（私自身がAWS SOAチャレンジ中でしたので、頑張っていきたいと思いました）

引き続き、JAWS主催のイベントに参加してAWSに関する**スキルキャッチアップ**を行っていきたいと思いました。

最後まで、記事を読んでいただきありがとうございました。
引き続き、AWSに関する記事を執筆していきたいと思いますので、温かい目で見ていただければと思います！
Mbed Studioをデスクトップアイコンから！

# はじめに
こんにちは、kazuです。
今回は前の記事の続きとしてデスクトップアイコンから引数付きでアプリケーションを起動できるようにしたいと思います

https://qiita.com/kzs321kzs/items/4c054abd2b4d53694e86

# やりかた
`mbed-studio --no-sandbox`を一発で起動できるようにします

1. desktopに `mbed-studio.desktop`を作成します
2. 以下をコピペします
    ```desktop
    [Desktop Entry]
    Type=Application
    Version=1.0
    Name=Mbed Stuio
    Comment=Mbed Studio
    Exec=mbed-studio --no-sandbox
    Terminal=false
    ```
3. デスクトップに生成されたやつを右クリックし、`実行を許可`を押します

# かんせい！！
デスクトップのアイコンをクリックしたらmbed studioが起動すると思います。

# アイコンを変更
1. 右クリックー＞プロパティでプロパティを開きます
2. アイコンをクリックします
3. 隠しファイル表示をオフにしている場合はファイルアプリで有効にします
4. 通常は `~/.local/share/icons/hicolor/1024x1024/apps/mbed-studio.png`にあります

# 最後に
jarの引数もりもり起動とかが楽にできそうだなと思いました。
GROWI 7.1.2リリースノート

[オープンソースのWikiであるGROWI](https://growi.org/ja/)の最新版、7.1.2がリリースされました。大きな変更点はありませんが、リリースノートとして主な変更点を紹介します。

## 追加機能

### ハッフルパフテーマにアナグマが復活！

ライトモード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/3aaba822-4e76-db18-3802-5355bc9e87ba.png)

ダークモード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/349f0824-ad5b-3b34-58c4-e8382c41eca0.png)


## 改善点

### AIモデルの変更

デフォルトが `gpt-4o-mini` になり、モデル変更機能が追加されました。GROWIのAI機能であるナレッジアシスタントについては、[ナレッジアシスタント \| GROWI Docs](https://docs.growi.org/ja/guide/features/ai-knowledge-assistant.html#%E3%83%8A%E3%83%AC%E3%83%83%E3%82%B7%E3%82%99%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88%E3%81%A8%E3%81%AF)をご覧ください。

他、幾つかの不具合修正と各種メンテナンスも行われています。詳細は[Release v7.1.2 · weseek/growi](https://github.com/weseek/growi/releases/tag/v7.1.2)を参照してください。

## まとめ

GROWIはオープンソース、かつDocker composeなどで手軽に導入できます。ぜひ社内・研究室・自宅などで利用してみてください。

[OSS開発wikiツールのGROWI | 快適な情報共有を、全ての人へ](https://growi.org/ja/)
React NativeでFirebase Realtime Databaseを使ってみた 

## はじめに

この記事は、[Udemy の React Native, Firebase, Expo でアプリ開発をゼロから始めよう！](https://www.udemy.com/course/react-native-ios-android/?couponCode=CMCPSALE24JP)
を終えた後にFirebase Firestore からFirebase Realtime Database に変えてみたことに関する記事になります。

初めてReact Native を触ってみた方におすすめの講座になっていますので、講座終了にちょっと変えてみたいという方に見てもらえればなと思います:grin:

## Firebaseプロジェクトの作成
まず、Firebaseコンソールで新しいプロジェクトを作成しました。プロジェクトの作成は非常に簡単で、数クリックで完了します。その後、Realtime Databaseを有効にしました。

## Firebase SDKのインストール
React NativeプロジェクトにFirebaseを追加するために、以下のコマンドでfirebase をインストールします。

```bash
npm install firebase
```

このコマンドで、FirebaseのJavaScript SDKをインストールします。

## Firebaseの初期化

Firebaseを初期化するために、Firebaseコンソールから取得した設定情報を使用しました。
設定は`src/config.ts`に記載しました。

```ts
import { initializeApp } from 'firebase/app'
import { getDatabase } from "firebase/database"

const firebaseConfig = {
  apiKey: process.env.EXPO_PUBLIC_FB_API_KEY,
  authDomain: process.env.EXPO_PUBLIC_FB_AUTH_DOMAIN,
  projectId: process.env.EXPO_PUBLIC_FB_PROJECT_ID,
  storageBucket: process.env.EXPO_PUBLIC_FB_STORAGE_BUCKET,
  messagingSenderId: process.env.EXPO_PUBLIC_FB_MESSAGING_SENDER_ID,
  appId: process.env.EXPO_PUBLIC_FB_APP_ID,
  databaseURL: process.env.EXPO_PUBLIC_FB_DATABASE_URL,
}

const app = initializeApp(firebaseConfig)
const database = getDatabase(app)

export { app, database }
```

## データの書き込み

データベースにデータを書き込むのは非常に簡単で、以下のコードでユーザー情報をデータベースに保存できます。

```ts
import { ref, set } from "firebase/database"
import { auth, database } from "../../config"

const dbRef = ref(database, `users/${auth.currentUser.uid}`)
set(dbRef, {
    name: 'John Doe',
    age: 30
})
.then(() => {
    router.back()
})
.catch(() => {
    Alert.alert('更新に失敗しました')
});
```

## データの読み取り
データの読み取りも簡単に行え、以下のコードでデータを取得できます。

```ts
import { get, ref } from "firebase/database"
import { auth, database } from "../../config"

const dbRef = ref(database, `users/${auth.currentUser.uid}`)
get(dbRef)
.then((snapshot) => {
    if (snapshot.exists()) {
        const RemoteBodyText = snapshot.val().bodyText
        setBodyText(RemoteBodyText)
    } else {
        Alert.alert("ユーザが存在しません")
    }
})
.catch(() => {
    Alert.alert("ユーザデータの取得に失敗しました")
})
```

## セキュリティルールの設定

開発中はテストモードを使用しましたが、公開前には適切なセキュリティルールを設定することが重要です。Firebaseコンソールで簡単に設定できます。

```
{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
      }
    }
  }
}
```
この設定では、readとwriteは作成者本人のみが可能です。

## 使ってみた感想

Firebase Realtime Databaseは、リアルタイムでデータを同期する必要があるアプリに非常に適しています。設定も簡単で、すぐに使い始めることができました。ただし、セキュリティルールの設定には注意が必要です。デフォルトのままでは誰でもデータにアクセスできるため、公開前に必ず設定を見直すことをお勧めします。また、Firebase Realtime Databaseをサービスとして使っていく場合の料金が気になりますね...orz

## まとめ

Firebase Realtime DatabaseをReact Nativeで使用する方法を紹介しました。リアルタイムなデータ同期が必要なアプリを開発する際には、ぜひ試してみてください。
エンジニアリング組織を強くするためのヒント - 書籍からの学び

# はじめに

はじめまして。
リンクラフト株式会社の代表の石山です。

社員のみんなが毎年アドベントカレンダーで盛り上がっているので、今年は仲間に入れてもらいました！
そして出しゃばりにも初日の記事を担当させてもらいます。
「[エンジニアリング組織論への招待](https://www.amazon.co.jp/%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%84%E7%B9%94%E8%AB%96%E3%81%B8%E3%81%AE%E6%8B%9B%E5%BE%85-%E4%B8%8D%E7%A2%BA%E5%AE%9F%E6%80%A7%E3%81%AB%E5%90%91%E3%81%8D%E5%90%88%E3%81%86%E6%80%9D%E8%80%83%E3%81%A8%E7%B5%84%E7%B9%94%E3%81%AE%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E5%BA%83%E6%9C%A8-%E5%A4%A7%E5%9C%B0/dp/4774196053)」という書籍から学んだことの一部を紹介したいと思います。

この記事を書くにあたり著者の広木様にも書籍の紹介を確認させて頂いたところ、快諾頂きました。ありがとうございます。
また、実際の社名を記載させて頂いたトライビート様にも快諾頂き、お礼申し上げます。

# この本との出会い

遡ること2019年。
昔から仲良くさせていただいている[株式会社トライビート](https://tribeat.com/)の方から、「とあるイベントに行かない？」と誘って頂き、あまり細かいことを調べずに快諾したのが始まりです。

そのイベントは「Engineer’s Recruiting #1 これからのエンジニア採用における経営者の役割」というものでした。
そのイベントにこの本の著者である広木さんが登壇されていました。

講演後の広木さんと名刺交換させていただいたのですが、大変失礼ながらこの時点では私は本を読んでおらず、、
その後に直ぐに拝読いたしました。

# 個人的に学んだこと

この書籍はエンジニアリングに関わる多くの方々に是非実際に読んでいただきたいと思っています。
なので、具体的な内容紹介は控えつつ、個人的に学んだことの一部を紹介したいと思います。

# 私達の仕事は不確実性を減らすこと

プロジェクトがスタートするタイミングではこの不確実性がとても高いため、
エンジニアも含めてプロジェクトメンバーは不安が高い状態となる。
そして、この不確実性は大きく分けると以下の3つに分けることができる。
方法不確実性
目的不確実性
通信不確実性

この不確実性はそもそも「何が起こるか分からない」というものなので、
特定することが難しいが、不確実性が見え隠れしたときに、
しっかり明るみに出して向き合う必要がある。

会社を経営していても同じだなと思う瞬間は多々あります。
なので、トライアンドエラーを繰り返して方法不確実性を下げたり、
自社・業界・社会を知って目的不確実性を下げたり、
組織づくりを推進して通信不確実性を下げたりしてるのかな〜、なんて思いました。

# 能力は習慣の積分、習慣は行動の積分

行動→習慣→能力→成果が人の成長サイクル。
個々の部分はまさにという思いで読んでいました。
例えば、ビジネス書などを読んで、自分の足りない部分を知って、
目標ができればそれだけで思考や行動をアップデートする必要があると思います。
これを繰り返すうちにやがて習慣となり、成長につながる可能性が高まります。

そして最終的にその本の価格が高いのか、安いのか定まるんだと思います。
なので、ビジネス書などを読むときはいつも貧乏根性を発揮して「元を取ってやるぞ！」という思いで読んでます（笑）

# さいごに

当時、会社でも7〜8冊購入し、社員に配ったり、この書籍を題材に勉強会をしたりと事業活動の中でも活用させていただきました。

少しでも興味がある方は是非読んでみてください！
仕事を通じて他者との関わり合いがある以上、多くの方の参考になるのではないかと思います。

---


**一緒に働く仲間を募集中です！** 

リンクラフト株式会社では、組織拡大に伴い積極的な採用活動を行っています。
少しでも興味がある方はぜひご連絡ください。

▽会社ホームページ
https://lincraft.co.jp/
▽Instagram
https://www.instagram.com/lincraft.inc/
▽ご応募はこちらより
https://lincraft.co.jp/recruit

※カジュアル面談も受付中です。ご希望の方はHPの[お問い合わせフォーム](https://lincraft.co.jp/recruit)よりご連絡ください。
【OpenAI】Tier 1 でも使えるようになった o1-mini / o1-preview の API を curl から使ってみる【生成AI】

この記事は後から、「[生成AI Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kagai)」の 4日目の記事としても登録しました（記事は 11月の後半に書いたものです）。

## はじめに
以前、以下の記事を書いていた o1-preview / o1-mini の API の利用制限に絡む話です。

●【OpenAI】o1-preview（と o1-mini）の API の利用条件が「Tier 5 ⇒ Tier 3 〜 5」になっている話と Tier の公式情報 #ChatGPT - Qiita
　https://qiita.com/youtoy/items/52b115700d4448a1a929

上記の記事で取り扱っていた制限の話について、2024/11/20 に「Tier 1 で OK」となったらしいです（※ 以下のポストで「all paid usage tiers」と書いてある）。
そこで、早速 API を curl から使ってみて、記事を書いてみました。

https://x.com/OpenAIDevs/status/1858609150999359559

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

### API でのやりとり
#### 送った内容
送った内容は、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/227ff916-afdc-f052-ad54-1686baeb7e41.png)

```zsh
curl https://api.openai.com/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer 【ご自身のAPIキーをご利用ください】" \
  -d '{
    "model": "o1-mini",
    "messages": [
      {
        "role": "user",
        "content": "ブラウザにおけるシェーダーとは？"
      }
    ]
  }'
```

#### API のレスポンス
レスポンスは以下でが、レスポンスの中に記載されたモデル利用情報の部分で「"model": "o1-mini-2024-09-12",」となっていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/362b0968-2777-60ab-3024-dcb57a211355.png)

また、トークンの情報が書いてある usage などの部分は、以下となっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/559ac8c8-d0a8-9a64-3d58-a034813a4647.png)

#### 自分のアカウントのページでの確認
また自分のアカウントの API 利用状況が見られるページで、o1-mini の利用があったと記録されていることも確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5281c1a5-7bb2-6623-bd4e-147fd27b4240.png)

## 公式の関連情報
公式のヘルプセンターをあらためて見たら、以下のページが本日更新されていて、Tier の制約に関する記載が書きかわっていました。

●OpenAI o1-preview and o1-mini Usage Limits on ChatGPT and the API | OpenAI Help Center
　https://help.openai.com/en/articles/9824962-openai-o1-preview-and-o1-mini-usage-limits-on-chatgpt-and-the-api

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/498fb915-03df-c5ae-dc31-36e5c5594dc7.png)

以下は、前の記事にも掲載していた「Free、Tier」に関する公式の記載です。

●Rate limits - OpenAI API
　https://platform.openai.com/docs/guides/rate-limits/usage-tiers

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/80a44f8c-a560-3c5d-c17c-18c27e21b91a.png)
WordPress 「All-in-One WP Migration and Backup」で移行できない大量の画像の移行について

## 概要
Wordpressの移行でプラグインである「All-in-One WP Migration and Backup」で移行をする際に、大量の画像がある場合など500MBを超える場合がある。

## 移行手順
### STEP.1 画像以外の移行
#### 移行元環境
「All-in-One WP Migration and Backup」でエクスポートする際に、メディアを除外してからエクスポート
### 移行先環境
前項のエクスポートデータをインポート。

### STEP.2 画像の移行方法
移行元、移行先サーバのコマンド画面で以下を実施します。

#### 移行元サーバ
・cdでWordpressのuploadsフォルダに移動
・uploadsフォルダで、「　tar -cf archive.tar.gz ./　」を実行し、uploadsフォルダ内に圧縮ファイル生成。
・archive.tar.gzファイルをFTP等でダウンロード

#### 移行先サーバ
・archive.tar.gzファイルをFTP等でWordpressのuploadsフォルダにアップロード
・cdでWordpressのuploadsフォルダに移動
・uploadsフォルダで、「　tar -xf archive.tar.gz　」を実行し、uploadsフォルダ内に圧縮ファイルを展開
・archive.tar.gzファイルを削除


※その他の方法として、単純にFTPでuploadsフォルダにアクセスして、旧⇒新へデータを移行することも可能ですが、ファイルが数GBあると時間がかかる可能性があります。