OmniAICreator/Qiita-1.07M huggingface dataset:
【12-3】Next.js app routerのチュートリアルやってみる(React Server Actionsを使ったデータ削除処理)

# はじめに

Next.js app routerのチュートリアルの第12-2章のアウトプットをします。

https://nextjs.org/learn/dashboard-app/mutating-data

<details><summary>前の記事</summary>

【01】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/af58da3d20cbc790e767

【02】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/edf450b3ee135e83d1e8

【03】Next.js app routerのチュートリアルやってみる
https://qiita.com/naoyuki2/items/612221eac233aa9cbb74

【04】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/62f9beccbfe36eaf7f90

【05】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/8b71b1d1df7c9435a9c9

【06】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/58130c3cfbaf8a573de2

【07】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/2c2da0f8071e60454679

【08】Next.js app routerのチュートリアルやってみる

https://qiita.com/naoyuki2/items/45f45fcb9cc14506f79f

【09】Next.js app routerのチュートリアルやってみる(loading.tsxとSuspenseでストリーミング)

https://qiita.com/naoyuki2/items/717694288ec6017a3af2

【10】Next.js app routerのチュートリアルやってみる(部分的な事前レンダリング)

https://qiita.com/naoyuki2/items/8062f755b0679fe925b1

【11-1】Next.js app routerのチュートリアルやってみる(URLパラメーターを利用した検索機能)

https://qiita.com/naoyuki2/items/2be9503ac80fc4a1fa6a

【11-2】Next.js app routerのチュートリアルやってみる(URL パラメータを利用したページネーション)

https://qiita.com/naoyuki2/items/fd00dc2b376e7d87fb44

【12-1】Next.js app routerのチュートリアルやってみる(React Server Actionsを使ったデータ作成処理)

https://qiita.com/naoyuki2/items/04ffef203ae798f8c7bc

【12-2】Next.js app routerのチュートリアルやってみる(React Server Actionsを使ったデータ更新処理)

https://qiita.com/naoyuki2/items/41f16ef69a50171d9d86

</details>

# 第12-3章 データの変更

この章では以下を学びました。

- データの削除(Delete)

# データの削除(Delete)

サーバー アクションを使用してデータを削除するには、`<form>`要素で削除ボタンをラップする。

そして、`bind`を使用し、引数に`id`を指定して`action`属性に渡す。

bindについては[前回の記事](https://qiita.com/naoyuki2/items/41f16ef69a50171d9d86)に少し書きました。

```diff_tsx:/app/ui/invoices/buttons.tsx
+import { deleteInvoice } from '@/app/lib/actions';
 
// ...
 
+export function DeleteInvoice({ id }: { id: string }) {
+ const deleteInvoiceWithId = deleteInvoice.bind(null, id);
 
  return (
+   <form action={deleteInvoiceWithId}>
      <button className="rounded-md border p-2 hover:bg-gray-100">
        <span className="sr-only">Delete</span>
        <TrashIcon className="w-4" />
      </button>
+   </form>
  );
}
```

`actions.ts`に`deleteInvoice`関数を定義します。

```diff_tsx:/app/lib/actions.ts
export async function deleteInvoice(id: string) {
  await sql`DELETE FROM invoices WHERE id = ${id}`;
  revalidatePath('/dashboard/invoices');
}
```

この処理は`/dashboard/invoices`パス内で呼び出されるため、リダイレクトは必要ありません。

`revalidatePaht`だけ呼んで、テーブルを再レンダリングしましょう。

# おわりに

React Server Actions の使い方がなんとなく分かった。

フロントとバックの分離が難しそう。

# 次の記事

https://qiita.com/naoyuki2/items/41585b11448036aec74a
DIVをスムーズに追加するアニメーション

# 1. はじめに
div要素をスムーズに追加するアニメーションを作りたくて、少し調査しました。

ソースは下記のitem_insert。（ほかのcssの練習をすることができるように、適当に大きな名前にしてあります。）

https://github.com/yo16/css_animation_sample


# 2. 課題
下記のように、黄色の内側に青があるという包含関係にあるDIV要素に対して、box1のさらに上へbox2、box3・・・と追加していくことを考えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/722610/16712654-1189-383f-bae1-9861c3e531a8.png)

このときbox2を追加したら、box2は上から降りてきて、box0とbox1は下に押し出される、というアニメーションを作りたいです。

こうかなーと適当にやると、box2を追加したとき、すでにあるbox0とbox1が最終的な位置に瞬間移動してしまいます。その押し出されるアニメーションをどうやるか。


# 3. 解決方法
結果的にこういう方法にしました。
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="BabOVrb" data-user="yo16" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yo16/pen/BabOVrb">
  Untitled</a> by yoichiro ikeda (<a href="https://codepen.io/yo16">@yo16</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## 3.1. 解決方法の概要
div要素を追加したら、上方向に瞬間的に飛ばします。CSSとしては、`top`にマイナス値を入れます。そのあと`top`をゼロにします。CSSの`transition`を使って、マイナス→ゼロの変化は時間をかけることで、アニメーションで降りてきます。

## 3.2. 工夫した点
ポイントが３つあります。

１つ目は、CSSの`top`の値を更新するタイミング。追加したときの`top`のマイナス値への変化時には`transition`は使わず、ゼロにするときには生かしたいです。なので、それぞれ生かしたいときに設定し、使いたくないときにはゼロ秒にしてます。

```JavaScript
// 追加した直後の、マイナスの位置設定
function initializeMoveBoxes() {
    const boxes = document.querySelectorAll(".box");
    boxes.forEach(box => {
        box.style.top = `${initial_top}px`;
        box.style.transition = "top 0s";        // マイナス位置に、すぐ変更してほしい
    });
}

// じんわりと移動した結果の位置設定
function smoothMoveBoxes() {
    const boxes = document.querySelectorAll(".box");
    boxes.forEach(box => {
        box.style.top = "0px";
        box.style.transition = "top 0.5s ease";    // 0pxに、じんわりと変更してほしい
    });
}
```

２つ目は、`top`への値の代入を上から順番に連続的に呼ぶだけだと、最後に入れた値になってしまって、`transition`が効かないです。なので`setTimeout()`を使って、非同期でちょっと後に呼び出していること。こうすることで、２回目の`transition`が効きます。

```JavaScript
initializeMoveBoxes();
setTimeout(()=>{smoothMoveBoxes();}, 10);  // 10ms後に非同期呼び出し
```

３つ目は、初期位置の座標値。`height`と`padding`と`border`と`margin`の関係で、上へずらす座標値が変わります。ちょっとでも間違ってると、ひっかかったような動作になってしまいます。`margin`は要素と要素の間の距離なので1カウント、それ以外は2カウント。CSSに合わせてJavaScriptで`const`で定義して計算してます。忘れないように。。

```JavaScript
const box_height = 32;
const box_padding = 10;
const box_border = 8;
const box_margin = 5;
const initial_top = (-1)*(
    box_height + 
    box_padding *2 + 
    box_border *2 + 
    box_margin
);
```


# 4. まとめ
アニメーションのライブラリを使ったいい方法があるかもしれないですが、こういう書き方を編み出すのも勉強になるし、読み込むコード量は少ないはずです。位置調整のために数字をいじらないといけないことになったものの、一応ロジックで定義できたし、`position:absolute`でやらないといけないかも・・嫌だ・・・とずっと思いつつ、回避でできたので、自分的には及第点です。

JavaScriptとcssで、高さの数字とかを二重で持っちゃってる部分は、JavaScriptからcssを設定すればいいと思います。ここではわかりやすいようにしてあるのと、実際に使うときは、汎用的に書かず、数字直打ちでもいいかもしれない。

あとアニメーションの技術は、検索する方法が難しいですね。今回の課題をググるにはどうしたらいいか、なかなか苦戦しました。いい方法があったら是非コメント欄で教えてください！
HelloWorld本 第5章

# プログラム実行の流れ

- _start()
- __libc_start_main()
- exit(main())

# _start()

[glibc/sysdeps/i386/start.S](https://github.com/lattera/glibc/blob/master/sysdeps/i386/start.S)に定義される。

```
# _start()はエントリーポイントであり、テキストセグメントの先頭に配置される。
# edxはatexit()に登録される関数ポインタを持ち、espは引数や環境変数を指すが、他のレジスタは規定されない。
_start:
    # 最外フレームを明示する為、フレームポインタをクリアする。
    xorl %ebp, %ebp

    # esiにargc、ecxにargvを設定する。
    # envpは__libc_start_main()で設定される。
    popl %esi
    movl %esp, %ecx

    # SSE命令は16バイトのアライメントを要求する。
    # 28バイト使用する為、4バイトのパディングを行う。
    andl $0xfffffff0, %esp
    pushl %eax

    # スタックとatexit()に登録される関数ポインタを渡す。
    pushl %esp
    pushl %edx

    # .initと.finiを渡す。
    pushl $__libc_csu_fini
    pushl $__libc_csu_init

    # argcとargvを渡す。
    pushl %ecx
    pushl %esi

    # main()のアドレスを渡す。
    pushl $main

    # __libc_start_main()を呼ぶ。
    call __libc_start_main

    # exit()で終了しない場合はクラッシュさせる。
    hlt
```

# __libc_start_main()

[glibc/csu/libc-start.c](https://github.com/lattera/glibc/blob/master/csu/libc-start.c)に定義される。

```
# LIBC_START_MAINは__libc_start_mainに置き換わる。
#define LIBC_START_MAIN __libc_start_main

static int LIBC_START_MAIN(int (*main)(int, char **, char **),
                           int argc, char **argv,
                           int (*init)(int, char **, char **), void (*fini)(void),
                           void (*rtld_fini)(void), void *stack_end) {
    # 環境変数を設定する。
    __environ = &argv[argc + 1];

    # 関数を登録し、初期化を行う。
    if(rtld_fini) {
        __cxa_atexit(rtld_fini, NULL, NULL);
    }
    if(fini) {
        __cxa_atexit(fini, NULL, NULL);
    }
    if(init) {
        init(argc, argv, __environ);
    }

    # exit(main())を呼び出す。
    exit(main(argc, argv, __environ));
}
```

# exit()

_exit()はhlt命令を含む為、アーキテクチャ依存のアセンブラを調べる。
[glibc/sysdeps/unix/sysv/linux/i386/_exit.S](https://github.com/lattera/glibc/blob/master/sysdeps/unix/sysv/linux/i386/_exit.S)に定義される。

```
_exit:
    # ステータスをシステムコールに渡す。
    movl 4(%esp), %ebx

# exit_groupを実行する。
# ENTER_KERNELはシステムコールを実行するマクロである。
#ifdef __NR_exit_group
    movl $__NR_exit_group, %eax
    ENTER_KERNEL
#endif

    # exit_groupが存在しない場合、exitを実行する。
    movl $__NR_exit, %eax
    int $0x80

    # プログラムが終了しない場合はクラッシュさせる。
    hlt
```

exitは呼び出したスレッド、exit_groupは全スレッドを終了させるシステムコールである。
_exit()はexitやexit_groupを実行し、プログラムを終了させるシステムコールラッパーである。
exit()はatexit()に登録された関数を実行した後、_exit()を呼び出す。

# APIとABI

カーネルはシステムコールのABIであるexitやexit_groupを提供し、glibcはPOSIXのAPIであるexit()や_exit()を実装する。
FreeBSDにはexit_groupは存在しないが、カーネルの差はシステムコールラッパーで埋められる。

# カーネル側の処理

glibcを見てきたが、カーネル側の処理も確認する。
UNIXライクなシステムでは、fork()とexec()でプログラムを開始する。
exec()はexecveを呼び出し、以下の処理を行う。

- 実行ファイルを仮想メモリに配置する
- 引数やデータ領域、環境変数を準備する
- エントリーポイントにジャンプする

# コマンド

- manのカテゴリ1はコマンド、カテゴリ2はシステムコールラッパー、カテゴリ3はライブラリ関数である
- straceを使用するとexit_groupの呼び出しが確認できる
CBD Dr Oz Gummies for Diabetes Blood Sugar (Real Consumer Reports) Do Not Buy Until You Read This!

As of my last update in January 2022, I don't have specific information about a CBD gummies product endorsed by Dr. Oz. However, it's common for various CBD products, including gummies, to be promoted by different influencers or personalities, including celebrities like Dr. Oz.

When considering CBD products, it's essential to research and ensure you're purchasing from a reputable company that provides third-party lab testing for potency and purity. Additionally, consult with your healthcare provider to CBD Dr Oz Gummies if CBD products are suitable for you, especially if you have any existing health conditions or are taking other medications.

If there have been developments or endorsements since my last update, I recommend checking recent sources or news for the most up-to-date information.

CBD (cannabidiol) gummies, like other forms of CBD products, are often touted for various potential benefits. However, it's important to note that the research on CBD is still evolving, and many of these benefits are based on preliminary studies or anecdotal evidence. Here are some commonly suggested benefits associated with CBD gummies:

Pain relief: CBD is believed to interact with the body's endocannabinoid system, which may help alleviate pain by reducing inflammation and impacting neurotransmitter activity.

Anxiety and stress reduction: Some people use CBD gummies to help manage anxiety and stress. CBD is thought to influence serotonin receptors in the brain, which may help regulate mood and reduce anxiety.

Improved sleep: CBD gummies are sometimes used to promote relaxation and improve sleep quality. Research suggests that CBD may help alleviate insomnia and improve sleep patterns, although more studies are needed to confirm these effects.

Anti-inflammatory properties: CBD has been studied for its potential anti-inflammatory properties, which may make it beneficial for conditions such as arthritis and inflammatory skin conditions like acne.

Neuroprotective effects: Some research suggests that CBD may have neuroprotective properties, which could make it beneficial for conditions like epilepsy and multiple sclerosis. However, more research is needed to fully understand these effects.

Official Website: -
https://www.deccanherald.com/brandspot/sponsored-health/cbd-dr-oz-gummies-for-diabetes-blood-sugar-exposed-dr-oz-gummies-2024-bioheal-cbd-gummies-dr-oz-read-before-buying-2869289
[AIX] iconvによる文字コード変換テーブルのカスタマイズ方法

### iconvによる文字コード変換テーブルのカスタマイズ方法

日本語文字コードにはローマ数字のようにIBM拡張文字とNEC選定文字の両方に定義されている文字があります。
同じ文字として定義されてしまっており完全な相互変換は不可能なため、AIXではIBM拡張文字への変換が優先されています。

そのため、NEC選定文字に対してiconvを実行するとIBM拡張文字に変換されます。
```
# perl -le 'print pack("H*", "875487558756")' | iconv -f IBM-943 -t IBM-943 | od -xc
0000000     fa4a    fa4b    fa4c    0a00
          Ⅰ  **  Ⅱ  **  Ⅲ  **  \n
# perl -le 'print pack("H*", "8ff3ab8ff3ac8ff3ad")' | iconv -f IBM-eucJP -t IBM-943 | od -xc
0000000     fa4a    fa4b    fa4c    0a00
          Ⅰ  **  Ⅱ  **  Ⅲ  **  \n
```

この文書ではカスタマイズの例としてNEC選定文字への変換を優先する文字コード変換テーブルの作成方法を記載します。

まず、bos.loc.adt.iconvをインストールします。
下記ファイルが配置されたことを確認したら、ファイルの中を確認します。
```
/usr/lib/nls/loc/uconvTable/IBM-943.ucmap
```

下記のように同じUTFの文字コード(U+XXXX)に対して、2つのSHIFT-JIS文字コード(\xXX\xXX)があることを確認します。
```
<U2160>         \xFA\x4A
<U2160>         \x87\x54
```
こちらの例の場合は\xFA\x4AがIBM拡張文字です。
重複文字の一覧は下記のコマンドで確認できます。
```
# awk '{ print $1 }' /usr/lib/nls/loc/uconvTable/IBM-943.ucmap | grep "^<U" | sort | uniq -c | grep "^ [ ]*2" | awk '{ print $2 }'
```

ここからがカスタマイズ手順になります。
始めにucmapファイルをコピーします。
```
# cd /usr/lib/nls/loc/uconvTable/
# cp IBM-943.ucmap IBM-943_NEC.ucmap
```

次にvi等でファイルを開き、先ほどの重複文字の順番を逆にします。
```
# vi IBM-943_NEC.ucmap
例)
<U2160>         \xFA\x4A
<U2160>         \x87\x54
```

編集が終わったらuconvdefコマンドで変換モジュールを作成します。
```
# uconvdef -f IBM-943_NEC.ucmap IBM-943_NEC
```

新しく作成したモジュールでNEC選定文字に変換されることを確認します。
```
# perl -le 'print pack("H*", "875487558756")' | iconv -f IBM-943_NEC -t IBM-943_NEC | od -xc
0000000     8754    8755    8756    0a00
          Ⅰ  **  Ⅱ  **  Ⅲ  **  \n
# perl -le 'print pack("H*", "8ff3ab8ff3ac8ff3ad")' | iconv -f IBM-eucJP -t IBM-943_NEC | od -xc
0000000     8754    8755    8756    0a00
          Ⅰ  **  Ⅱ  **  Ⅲ  **  \n
```

### 参考:
uconvdef コマンド
https://www.ibm.com/docs/ja/aix/7.3?topic=u-uconvdef-command
uconvdef ソース・ファイル・フォーマット
https://www.ibm.com/docs/ja/aix/7.3?topic=formats-uconvdef-source-file-format
日本語コード一覧表
https://public.dhe.ibm.com/systems/power/docs/aix/53/nl/ja/jp_codebook.pdf

### 注意:
IBM-943などの事前定義の変換モジュールを置き換えることはサポートされないため、必ず別名で変換モジュールを作成します。
Jetson Orin NanoのGPIOヘッダにあるUARTでシリアル通信

Jetson (Orin) Nanoにシリアルでやりとりするデバイスをぶら下げる場合，USBシリアルのアダプタは必ずしも必要ではありません．GPIOヘッダを流用するならば．

まずはGPIOヘッダのUART用ピンの確認から．

https://jetsonhacks.com/nvidia-jetson-orin-nano-gpio-header-pinout/
によると，以下の割当になっています．

ちなみに，Jetson Orin Nanoの開発者ボードでは，USB-Cポートに近い側が若番のヘッダになっています．
(ヘッダの両端に1 2とか39 40とか打ってあるのでわかりやすい！)

- Pin 6: GND
- Pin 8: UART1 Tx
- Pin 10: UART1 Rx

jetson-ioで変更している場合は注意が必要ですが，デフォルトではこの割当です．
UART1はデバイスとしては`/dev/ttyTHS0`として見えています．

-----------

で，上記のシリアルポートですが，たぶんデフォルトでは`nvgetty`のサービスが動いていて，シリアルコンソールになっています．
なので，これを無効にしないとJetson上から普通にシリアルデバイスとして使えません．

以下で無効にして，再起動すると普通のシリアルポートとして使えるようになっているはずです．

```bash
sudo systemctl disable nvgetty.service
```

-----------

ちなみに，`dialout`グループに自分を入れておくとパーミッションも問題無いかと思います．
実行後に再起動をおわすれなく，

```bash
sudo gpasswd -a $(whoami) dialout
```
【大人数向け】パルワールド 専用サーバーを数クリックで立てる方法

# はじめに
大人数でパルワールドをわいわいプレイしたい！
けど、サーバーを用意するのが面倒くさいという方のために、
早い、安い、上手い？方法で構築する方法をまとめたいと思います。

# サーバー情報
どのスペックのサーバーを用意すれば良いのか悩ましいですが、
実はアリババクラウドには既に大人数向けのテンプレートが用意されています。
![スクリーンショット 2024-02-07 18.18.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/d25436b8-289a-43e6-3aa0-b01df395868b.png)

しかも、(2024年2月7日現在)キャンペーン中で、初月のみですが、
10人以下用サーバーなら税抜4.99USD(約738円)、10人以上なら税抜10.99USD(約1627円)と超激安価格となっています。今後も続けるかわからないけど、一度試してみたい！という方には最高のキャンペーンですね。

アリババクラウドに馴染みがない方も多いかと思いますが、簡単に構築できるのでこの機会に触ってみましょう！

# 構築
構築はめちゃくちゃ簡単です。5ページほぼクリックするだけで構築完了します。
※アリババクラウドのアカウントが必要です。無料で作成できるのでまだの方は[こちら](https://account.alibabacloud.com/register/intl_register.htm?spm=a2c45.11132017.9219519220.2.66ac79f4bfiOB4 "アカウント作成")から作成して下さい。

1. キャンペーンページへアクセス
https://www.alibabacloud.com/ja/campaign/palworld?mtm_source=35zkd4
![スクリーンショット 2024-02-09 15.04.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/6bf4ae2b-e64b-077f-4eed-a235e190660d.png)

2. 構築したいサーバーを選択
下にスクロールして、以下のボタンをクリックします。
![20240209150624.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/318be419-1c92-90bf-7965-8a1fb0891be4.jpeg)

3. サーバーの情報を入力
設定項目はたったの4つです。
- インスタンス名: 好きな名前を入力して下さい。
- リージョン: 東京リージョンにすると一番通信が早くなると思います。
- サーバータイプ: 最初は10名以上向けを選択します。もし少人数の場合は一番左のタイプを選択して下さい。
- パスワード: 好きなパスワードを入力してください。
![20240209151240.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/9916f5fc-dc8d-53ee-86a3-0586b28beef7.jpeg)
![20240209153023.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/7ff73a02-266d-bf5b-ebf7-0ae4c62bb815.jpeg)

4.サーバーの情報の確認&作成
![20240209153515.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/c30d8334-9dba-cc7f-163e-dadb6c593251.jpeg)

5.IPアドレス確認
![20240209154133.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/a58dd2de-c259-e2b2-0d89-ff799708be81.jpeg)
![20240209155040.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/9f96afa2-5a21-6244-6606-7bb268cc3b2a.jpeg)

6.サーバーへ接続
あとはゲームを起動し、「マルチプレイに参加する（専用サーバー）」を押下して、サーバのIPアドレス:8211 に接続したら完了です。
【PHP】PHPで使うfor文って何？

## for文って何？
同じ動作を繰り返し行う場合には、ループ処理がよく使われます。
ループ処理を使用することにより、コードがシンプルになり作業効率が向上します。
そのループ処理を行う文の1つがfor文です。
for文は繰り返す回数が決まっているときに使用します。

### どう記述するの？
```php:for文
for (式1; 式2; 式3){
    //ここに処理を書く
    }
```
0から5までの数字を表示させる場合
```
for ($i = 0; $i < 6; $i++){
    echo $i;
    }
```
① **$i =0 ;** ここでは、式1を0で設定します。
② **$i < 6;** ここでは、式2で$iが6より小さい間繰り返す指示をしています。
③ **$i++;** ここでは、式3に処理を1回するたびに初期値に+1する指示を出しています。
④ **echo $i;** ここでは、処理を1回するたびに$iを出力する指示を出しています。
echoした結果 012345 が表示されます。

### 2つのfor文を連動させる、2重ループ
for文の中にfor文を入れ込むことで、2重ループが出来るようになります。
```php:2重ループ
外側 for ($i = 0; $i < 6; $i++){
    内側 for($j = 0; $j < 6; $j++){
         echo $j;
         }
     echo "\n";
     }
```
この記述での出力結果はこうなります。

012345
012345
012345
012345
012345
012345

簡単に流れを説明すると
外側のループが1回まわるたびに、内側のループの**for(** **$** **j = 0;** **$** **j < 6;** **$** **j++)** が処理されるという流れです。
この処理の応用で出来ることはグッと広がります！
初期値、不等号の向き変えるだけでも楽しいです！

## 最後に ##
私自身、まだまだループ処理について知らないこと、理解できていないことが沢山あります。難しいと思うこともあります。
ですが、日々の勉強の積み重ねでいつの間にか出来るようになっていることもあると思います！挫けずに頑張りましょう！
【備忘】認証方式について少し踏み込んで調べてみた

近年、セキュリティの重要性がますます高まる中で、様々な認証方式が開発されています。
本記事では、主要な認証方式の種類やそれぞれの特徴について調べた内容をアウトプットがてら記載します。

### （改めて）認証とは
利用者本人の確認を行うこと
⇒「あなたは誰ですか？」 を確認するもの

ちなみに認可とは
利用者に正しい権限を与えること
⇒「あなたには、リソースにアクセスする権限がありますか？」 を確認もの

### 認証方式の種類
代表的な認証方式は以下８種類あり

1.パスワード認証
2.バイオメトリクス認証
3.二要素認証
4.多要素認証
5.メールアドレス認証
6.Google認証
7.OAuth認証
8.HTTP認証

#### 詳細 
上記認証方式を表にまとめてみた
| 認証方式         | メリット                                           | デメリット                                           | 使用例                                   | 使用場面                                                 |
|----------------|---------------------------------------------------|----------------------------------------------------|----------------------------------------|----------------------------------------------------------|
| **パスワード認証**     | - 簡単に設定可能<br>- 広く普及している               | - パスワードが盗まれるリスクがある<br>- 複雑なパスワードを記憶する必要がある | オンラインアカウントのログイン、コンピュータのロック解除 | ウェブサービスやデバイスへの一般的なアクセス                   |
| **バイオメトリクス認証** | - パスワード不要<br>- 高いセキュリティ                    | - ハードウェアが必要<br>- 認証エラーが発生することがある     | スマートフォンの指紋認証、顔認証        | スマートフォンやセキュリティアクセスなど                         |
| **二要素認証**        | - セキュリティ強化<br>- パスワード忘れのリカバリー支援          | - 手続きが煩雑<br>- 追加のデバイスが必要                      | オンラインバンキングのログイン、重要データへのアクセス  | 重要データやアカウントのセキュリティ向上                           |
| **多要素認証**        | - 高いセキュリティ<br>- 複数の要素を組み合わせた強力な認証       | - 負担が大きい<br>- 実装コストが高い                        | 金融機関のアカウントへのアクセス、機密データの取り扱い | 機密情報や重要なアカウントのセキュリティ向上                      |
| **メールアドレス認証**  | - 簡単に実装可能<br>- ユーザーにとって覚えやすい              | - メールアカウントのハッキングリスク<br>- セキュリティが低い     | ウェブサービスの登録、パスワードのリセット    | ウェブアプリケーションやウェブサービスの一般的な認証                  |
| **Google認証**      | - セキュリティ強化<br>- 二要素認証や多要素認証の利用可能            | - Googleアカウントへの依存度高い<br>- サービス利用不可時のリスク     | Googleアカウントを利用したサービスのログイン、Google Cloudへのアクセス | Googleサービスの利用やサードパーティーアプリへのアクセス                 |
| **OAuth認証**       | - 安全かつ簡単なアクセス認可<br>- サードパーティーアプリへの個人情報の安全な提供 | - アクセストークンの管理が必要<br>- 認証フローの理解が必要           | サードパーティーアプリへのアクセス、API利用     | 外部サービスやアプリケーションとの連携、APIの利用                      |
| **HTTP認証**        | - シンプルな実装<br>- 標準プロトコルとして広くサポートされる         | - セキュリティが低い（平文のパスワード送信）<br>- セッションの維持が難しい   | ウェブサイトやWebアプリケーションのログイン、APIアクセス | ウェブアプリケーションやAPIの一般的な認証                             |



### まとめ
認証方式は、情報セキュリティを確保し、不正アクセスからシステムやデータを保護するために重要で、それぞれの認証方式には、利点と欠点がありますが、使用する場面や必要なセキュリティレベルに応じて適切な認証方式を選択することが必要となる。
ALBがラウンドロビンに負荷分散することを確認する

## 背景
開発に携わるWebアプリケーションにおいて、AWS ALBを活用しての冗長化・負荷分散に対応させる対応が求められました。その過程で、各Webサーバへの負荷分散が正常に行われていることを確認する必要があったため、本対応を実施しました。

## 実施したこと
- クライアント（EC2:Amazon Linux）に httpd-toolsをインストールする

使用コマンド
```
yum install httpd-tools
```

- Appache Bench が使用できることを確認する
　※ Apacheで標準に付いているWEBサーバの性能を計測できるコマンドです。

使用コマンド
```
ab -h
```

- Appache Benchを使用して、ALBにリクエストを送付する

使用コマンド
```
$ ab -n 【リクエスト数】 -c 【同時接続数】 -v 1 【リクエスト先のパス】
```

- ALBにより負荷分散されたリクエストが、各Webサーバ（EC2）に均等に振り分けられていることをアクセスログで確認する

　 ※Webサーバにて別のリクエストを処理している状況の場合は、
　  　均等に振り分けられない可能性があります。


## 参考
https://qiita.com/flexfirm/items/ac5a2f53cfa933a37192
Macのメモリ使用量の見方

# Macのメモリはアクティビティモニタで確認できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/c6f953f0-231b-ee45-0808-1ab03a8a48e4.png)


## Macのアクティビティモニタのメモリ項目の詳細
上記画像について、Macのアクティビティモニタのメモリ項目について詳細を説明していきます。

### 1. 物理メモリ

Macに搭載されているメモリの総容量です。
画像では16.00GBと表示されています。
搭載されている物理メモリの容量は、Macの動作速度に大きく影響します。
### 2. 使用済みメモリ

現在、Macで使用されているメモリの合計量です。
画像では12.70GBと表示されています。
使用済みメモリが多いと、Macの動作が遅くなる可能性があります。
### 3. アプリケーションメモリ

アプリケーションによって使用されているメモリの合計量です。
画像では6.37GBと表示されています。
使用していないアプリケーションを終了すると、アプリケーションメモリを解放できます。
### 4. 確保されているメモリ

後で使用するために確保されているメモリの量です。
画像では1.34GBと表示されています。
確保されているメモリは、実際に使用されているわけではないので、Macの動作速度に影響を与えません。
### 5. キャッシュされたファイル

読み込み速度を向上させるために、ディスクからメモリに読み込まれたファイルの合計量です。
画像では3.08GBと表示されています。
キャッシュされたファイルは、必要に応じて自動的に削除されます。
### 6. 圧縮

空きメモリを増やすために圧縮されたメモリの合計量です。
画像では4.39GBと表示されています。
圧縮されたメモリは、必要に応じて自動的に解凍されます。
### 7. スワップ使用領域

物理メモリが不足している場合、ディスクの一部を使用してメモリとして利用する領域の量です。
画像では0バイトと表示されています。
スワップ使用領域を使用すると、Macの動作速度が遅くなります。
メモリ使用量の確認方法

Spotlight検索を開きます。(⌘ + スペースキー)
アクティビティモニタと入力して、アプリを開きます。
メモリタブを選択します。
メモリ使用量を減らす方法

使用していないアプリケーションを終了する。
ブラウザのタブを閉じる。
メモリを多く使用するアプリを軽量な代替アプリに置き換える。
Macの起動時に自動的に起動するアプリを減らす。
Macのメモリを増設する。
参考情報

Macのアクティビティモニタでメモリの使用状況を表示する - Apple Support: https://support.apple.com/ja-jp/guide/activity-monitor/actmntr1004/mac
### 補足

上記の説明は、一般的なものですので、Macの環境や設定によって、表示される値や動作が異なる場合も考えられます。



## 上記説明を踏まえると、このPCのメモリの余りは1GBもないという事になるのか？

### ■結論：画像に基づくと、現在使用可能なメモリは約1GBと言える

### 詳細

* 物理メモリ: 16.00GB
* 使用済みメモリ: 12.70GB
* 確保されているメモリ: 1.34GB
* 圧縮: 4.39GB
* キャッシュされたファイル: 3.08GB
* スワップ使用領域: 0バイト
* 空きメモリ量の計算

1. 空きメモリ = 物理メモリ - 使用済みメモリ - 確保されているメモリ
1. 空きメモリ = 16.00GB - 12.70GB - 1.34GB
1. 空きメモリ = 2.06GB
ただし、圧縮されたメモリとキャッシュされたファイルも考慮する必要があります。

1. 空きメモリ = 空きメモリ - 圧縮 - キャッシュされたファイル
1. 空きメモリ = 2.06GB - 4.39GB - 3.08GB
1. 空きメモリ = 約1GB

### メモリ使用量が少ない場合の影響

* アプリケーションの起動が遅くなる
* 動作が重くなる
* フリーズする

### メモリ使用量を減らす方法
* 使用していないアプリケーションを終了する
* ブラウザのタブを閉じる
* メモリを多く使用するアプリを軽量な代替アプリに置き換える
* Macの起動時に自動的に起動するアプリを減らす
* Macのメモリを増設する
【GAS】Unexpected error while getting the method or property openById on object SpreadsheetApp.の対処

<H1>事象</H1>

GAS(Google Apps Script)でopenByIdで既存のspreadsheetを開く処理で以下のエラーになる。

> Exception: Unexpected error while getting the method or property openById on object SpreadsheetApp.

<H1>原因</H1>
Google Spreadsheetの「ID」を勘違いしていた。

SpreadsheetのIDは、docs.google.com/spreadsheets/d/
の直後に付いている40文字くらいの長い文字列。

URLの最後についている10桁前後の数字(gid=xxxxxxxxxx)ではない。

<H1>解決方法</H1>

```Javascript
var ss = SpreadsheetApp.openById(xxxxxxxxxx);
```

の「xxxxxxxxxx」を
docs.google.com/spreadsheets/d/
の直後に付いている長い文字列に変更する。

もしもIDが長すぎてエラーになる場合には、openByIdの代わりにopenByUrlを使う。
JavaScriptでなんちゃって演算子オーバーロード---四則演算子

# はじめに
前回は自作の数値計算ライブラリの実行用(フロントエンド)を紹介した。
この数理計算ライブラリには複素数、ベクトル、行列クラスなどがある。
そうなると欲しくなるのが四則演算`+,-*,/`などの演算子オーバーロードである。
JavaScriptは演算子オーバーロードはサポートされていないがトランスパイラであるBabelのPluginを使うことで擬似的に作ることができる。
その方法を、備忘録を兼ねて記事にする。

## Babel Plugin
Babelは言わずとしれたトランスパイラである。
Babel Pluginはこ のBabelの処理の途中に独自の処理を加えてソースコードを書き換えるものである。
その処理には元JSからAST(抽象構文木)に変換してそれを元に別のJSに変換するのもである。
そのため、この処理をより深く理解するためにはASTの知識が合ったほうがいいがその知識は参考文献にしておく。

白状するとこの記事はほぼこの記事、[JavaScriptで演算子オーバーロードしてみる(BabelでAST)](https://qiita.com/taqm/items/1eb858db245344574c47)、のパクリです。

### 下準備
複素数クラスやベクトル、行列クラスにはそれぞれ`+.-.*./`に対応する`add,sub,mul,div`等のメソッドを定義しておく
更にそれを橋渡しする関数`mul(a,b)`等を以下のように定義する。

```js:mul.js
const mul=(a, b=void 0)=>{
    if( typeof(a)==='number' && typeof(b)==='undefined' ) return a;
    else if( typeof(a)==='number' && typeof(b)==='number' ) return a*b;
    else if( typeof(a)==='object' && typeof(a.mul)==='function' ) return a.mul(b);
    else if( typeof(b)==='object' && typeof(b.mul)==='function' ) return b.mul(a);

    throw new Error('!!! mul invaild !!! undefined calculation');
}

export mul;
```
つまりnumberとnumberであればそのまま、一つがオブジェクト(クラス)であり`add`メソッドがあればそれを呼ぶ用にする。
つまり各クラスの掛け算の実体はクラスメソッドに定義しておく。

### Pluginの登録
今回の使い方ではブラウザのJavaScript上で動かすのでブラウザ上で動かすので
`<script src="node_modules/@babel/standalone/babel.js"></script>`
のように読み込んでおく、これをすると`Babel`オブジェクトが定義されるのでそれにPluginを登録する。

登録の本体は以下のようにする。
```js:operator_overload.js
Babel.registerPlugin('operator_overload', ({ types: t })=>{
    return {
        visitor: {
            Statement(parentPath){
                parentPath.traverse({
                    BinaryExpression(path){
                        const { left, right, operator } = path.node;
                        let fname;
                        if( operator==='+' ) fname=t.identifier('add');
                        else if( operator==='-' ) fname=t.identifier('sub');
                        else if( operator==='*' ) fname=t.identifier('mul');
                        else if( operator==='/' ) fname=t.identifier('div');
                        else return;

                        path.replaceWith(t.callExpression(fname, [left, right]));
                    }
                });
            }
        }
    }
});
```
ここで`{ types: t }`はBabelの識別子などを生成するコンテキスト(オブジェクト)であり、これを通じてコードなどを生成する。
ここで`BynaryExpression`は二項表現でいわゆるオペレーターで２つの変数等をつないだものである。
`callExpression`は普通の関数呼び出しで第一引数が関数名であるがこれらは`t`から生成されたものでないといけない。
つまり、二項表現でさらに`+,-,*,/`の場合だけ
```js:befor.js
a+b;
a+b+c;
```
```js:after.js
add(a, b);
add(a, add(b, c));
```
のように書き換えている。

### 使用例
使うときはこのようにする。
```js:run.js
function run(){
    const { code }=Babel.transform(original_code, { presets: ['env'], plugins: ['operator_overload'] });
    const f=Function(code);
    f();
}
```

# 最後に
Babel pluginの簡単な例として演算子オーバーロードの例を解説した。

より体系的な解説などは[ここ(Babel Plugin Handbook)](https://github.com/jamiebuilds/babel-handbook/blob/master/translations/ja/plugin-handbook.md)にあると思います
WSLgのGUIにWindows IMEで日本語入力してみたい

まだ寒いのですが、花粉はちゃんと飛ぶようですね。花粉症なので薬を処方してもらうために近くの病院へ行きました。最近はマイナンバーカードを保険証として利用するための機器がどの病院でも設置されているのですが、あからさまにマイナンバーカードを使わせない病院もあるようです。WSLgのGUIがWindows IMEからの入力を拒否するように。
機械まで置いてあるのに使わせないって、なんか日本語表示できるのに入力できない、と同じ感じしませんか？

# WSLgで日本語入力
"WSLg 日本語入力" くらいで検索すると見つかります。個人的には日付の新しいものを参照するようにしています。
要は、WSL側に fcitx, mozcなどでX window の場合のように、環境を整えるというものです。これはこれで使えると思います。

# WSLgに日本語入力
でも、本当は Windows 側のIME使いたいですよね。個人的には使いたいです。
Windowsからの日本語入力を受け付けないWSLgですが、一点入力できるものがありました。コピペです。Windows側で日本語を含むテキストをコピーして、WSLg上のGUIで貼り付けるとうまく入力できます。
なので、fcitxだのmozcだの準備するの面倒で、でもその場しのぎで何とかしたい場合は、メモ帳などのエディタを開いてテキストを入力しておき、そこからコピペすればなんとかなりそうです。

# コピペするアプリ
でも、なんとなく面倒です。いや、変なアプリ作る方が面倒だと言われたら身も蓋もないのですが、適当にテキストを入力できて、最後にEnterを押すと適当なところに、ペーストするアプリを作ってみました。処理の手順としては、
1. 一度 clipboard にテキストを挿入
1. ペースト先にフォーカスを移動させる
1. キーイベント"^v"を送る

フォーカスを移動させる方法をちょっと悩みましたが、自分が起動する直前のアプリが入力先であるということにし、自分を一瞬消すことで自然に元のアプリにフォーカスを移動させることにしました。
そのため、ホットキーで起動できるようにしてあります。
ソースは[こちら(GitHub)](https://github.com/ishikawakouji/PushToWSLg)です。

自分を隠して、ペーストするしくみはこのあたりです。
```Form1.cs
// send key event
private async void SendKeyEventToAnotherWindow(string etext)
{
    POINT cursorPos;
    this.Hide();

    await Task.Delay(200);

    if (GetCursorPos(out cursorPos))
    {
          // カーソル位置にクリップボードのテキストを挿入
          SendKeys.SendWait(etext);
    }
    
    this.Show();
}
```
200ms待つとか細かいことやっていますが、時間は適当です。ウィンドウがきりかわるのに時間がかかる場合は、調整してみてください。
また、キーイベントはいろいろ送ることができるので、矢印キーとかも元のGUIに戻らなくても使えるようにしています。

https://learn.microsoft.com/ja-jp/dotnet/api/system.windows.forms.sendkeys.send?view=windowsdesktop-8.0

# おわりに
自分を隠してフォーカスを移動させているので、Enterを押したときの挙動が不思議な感じですが、もし他に目的のウィンドウにキーイベントを送るうまい方法があれば、そちらに修正するのがよさそうです。
これでバンバン日本語を入力できるようになる、というわけではないですし、メモ帳起動させておくのと比べてどうよと言われたら、まぁ、変わらないかも。
Unity Polatith AI Pro 自動で動く敵を簡単に作る　その２

前回までの話。

https://qiita.com/sebunwork009/items/882df1ce57c88d5a829d

基本的な使い方からさらに別の移動方法について説明する。

## いろんな目標物への移動の仕方

AIM Arriveという目標物の前で止まるような移動の仕方をしたいとき
前回のオブジェクトをコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/bdff7c2d-4651-39e8-cf02-c2e98e0f64aa.png)

AIM FollowとAIM Arriveを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/5560d403-5d95-dbbe-1cb5-dd14e9108095.png)

AIM　Stabilizationは削除する。これがあると目標物の更新が一定時間固定になるため、止まらないといけない場所についても動いてしまいうまくいかなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/4a0a0e0b-79ea-8499-e0db-658be5dcf358.png)
AIM　Simple Controller2DのSpeedを25くらいまで上げる。この設定は環境によって違うかも。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/eb4af576-54ab-9a83-537c-e0e6d1192a0b.png)

AIM　FollowとArriveにInterrestを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/258eb274-eb5a-8d48-b332-b76ab48a178f.png)

〇のタブでもInterrestを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/4bd621ed-d857-9754-4e36-efec830f5a63.png)

目のマークでGizmoを見えるように設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/bc752bc9-e26f-d4c6-9d02-a386ea08e0d5.png)

これでInner RadiusとOuterRadiusが見えるようになるため止めたい位置までInnerRadiusを大きくし、見つけることのできる範囲までOuterRadiusを大きくする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/758f4fad-1b77-de4a-1280-9fdf8ea5c42e.png)

これで実行すると円が中心になったところで止まることが出来る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/07be295d-3eb4-329b-2a89-20cbb9915999.png)

Arriveについての公式

https://polarith.com/docs/ai/component-aim-arrive.html

## パスを設定して動かす
新しくオブジェクトを作成　Aim LinewrPathを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/bd1c848e-816a-eb59-7df4-f74e9a15cbaa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/02d5ad5b-74f7-6a0b-b4ed-2f6f6f5759dc.png)
ショットカットを開くと簡単にパスを追加できる方法が載っている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/cd6a8d85-1cc4-d5d8-9599-9fd9069e6ede.png)

動かしたいオブジェクトに　AimFollowWaypointを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/4880d757-78d9-257a-3ec3-7a6c3802cab4.png)

〇で　Aim LinewrPathを持ったオブジェクトをアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/cb4a82e8-50e5-7093-39cb-4350869ff333.png)

実行するとPathに沿って動き始める。動き方はここで切り替える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/5140b541-3643-dda7-6621-808995e871c1.png)

ぐるっと一周するのかや、往復するなど切り替えることができる。

## 応用的な使い方

ここまでできるようになると、初めはパスに沿って移動していき、キャラクターを発見したら追いかけるようにAIM　Seekに切り替えるようにすれば簡単な敵キャラの動きを作ることができる。
Databricksのボリュームからテーブルを作成

こちらのアップデートです。

https://docs.databricks.com/en/release-notes/product/2024/february.html#create-tables-from-files-in-volumes

> You can now use the UI to create Unity Catalog managed tables from data files stored in Unity Catalog volumes. See Create table from volumes.

> Unity Catalogボリュームに格納されるデータからUnity Catalogのマネージドのテーブルを作成するためにUIを使うことができます。[ボリュームからのテーブル作成](https://docs.databricks.com/ja/catalog-explorer/manage-volumes.html)をご覧ください。

カタログエクスプローラからボリュームにアクセスして、ファイルのコンテキストメニューを開きます。**テーブルを作成**を選択できるようになっています。
![Screenshot 2024-02-09 at 13.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/53aae5ef-51fa-4ec5-b393-158c78ef9218.png)

ダイアログが開くのでターゲットのカタログ、スキーマ、テーブル名を指定します。
![Screenshot 2024-02-09 at 13.25.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/01f7309f-50fd-bcdd-dcee-190e3fd7e769.png)
![Screenshot 2024-02-09 at 13.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c391f143-6686-d390-bfa2-d6d5522a72ae.png)

テーブルが作成されました。お手軽です。
![Screenshot 2024-02-09 at 13.26.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7dddcf4f-f12a-e549-c33f-c8d99110ec63.png)
![Screenshot 2024-02-09 at 13.26.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3568ce68-0992-d7d2-d2f9-0cc4b599be0e.png)

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
アプリ内からiPhoneの「設定」アプリの通知設定画面に遷移する方法 (iOS 16~)

アプリからiPhoneの設定アプリを開くには `UIApplication.openSettingsURLString` を使いますが、そこから先のアプリごとの通知設定画面へ遷移させるようなURLは以前は提供されていませんでした。

しかしiOS 16から `openNotificationSettingsURLString` が追加されており、iPhoneの設定アプリ内にあるプッシュ通知の設定画面へ一発で遷移できるようになりました。
Appleありがとう。（みんなURLScheme使ってリジェクトされたりしてましたよね。。）

https://developer.apple.com/documentation/uikit/uiapplication/4013180-opennotificationsettingsurlstrin

使い方
```swift
if let url = URL(string: UIApplication.openNotificationSettingsURLString) {
    await UIApplication.shared.open(url)
}
```

※ ちなみに中身は `app-settings:notifications` という値になっていました。
```swift
print(UIApplication.openSettingsURLString)
// app-settings:

print(UIApplication.openNotificationSettingsURLString)
// app-settings:notifications
```

`openNotificationSettingsURLString` 使っていきましょう。
初心者のためのSubstance Painterセミナー

株式会社クリーク・アンド・リバー　大阪支社様にて
Substance Painter のビギナー向けセミナーを行わせていただきました。
https://www.creativevillage.ne.jp/category/event-list/seminar/144134/

##### セミナーで使用したスライド資料をアップしました。

https://www.docswell.com/s/BonChan_3DCG/KLLP37-SP_Webinar240127

なるべく楽に作業を進められるような基本点を抑えた内容です。
スライドは３つの章になっております。

難しい内容ではございませんが、
まだSubstance Painterに触れたことがない方が一度に読むと読み疲れてしまうかもしれません。
スローペースでゆっくりやっていきましょう～～

アンケートでも理解しやすかったという声を多数頂き安心しました:grin:


##### モデルは今回のセミナーのために作成しました。
![SnapCrab_No-1165.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2973089/49351c63-0ac8-6ce0-6bb2-276b285276f4.jpeg)

![SnapCrab_No-1253.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2973089/c048be8d-74a1-0592-47e2-01f61fc84c77.jpeg)


今回は簡潔にこれにて以上！
AOTプロジェクト開発の注意点

AOTプロジェクトには特別なテンプレートがあり、現在AOTをサポートするテンプレートにはMini APIとgRPCがあります。Mini APIのAOTプロジェクトにはいくつかの違いがあり、以下は開発に関する違いを簡潔に説明したものです。
- `CreateSlimBuilder()` APIを使用して、デフォルトで基本機能のみを有効にし、アプリのデプロイサイズを最小限に抑えます。
- HTTPのみをリッスンするように設定します。HTTPSトラフィックは通常、クラウドネイティブデプロイメントのエントリーサービスによって処理されます。
- プロジェクトファイルに`PublishAot`を追加します。<PublishAot>true</PublishAot>。
- JSONシリアライザーのソースジェネレーターを有効にします。ソースジェネレーターは、ビルド時にシリアライズコードを生成するために使用され、ネイティブAOTコンパイルに必要です。
- 動的リフレクションは不可、動的なファイルのロードや動的コンパイルをサポートしない。
- .NETの多くのサードパーティライブラリー、公式のJsonシリアライザーを含む、リフレクションを使用しているため、開発時にはこれらのサポートされないライブラリーの使用を避ける必要があります。
- 簡単な例を挙げると、通常のリフレクションは使用可能です。リフレクションされたクラスが明示的であれば問題ありませんが、型が暗黙のものである場合、例えばジェネリックタイプのリフレクションをすると、結果がnullになります。実際には`type.GetMembers()`を一度呼び出し、コンパイラに型メンバーを残してもらうことで、ジェネリックリフレクションを使用できます。つまり、型の構成を事前に知っておき、後でリフレクション時に使用することができます。この場合、すべての型メンバーを事前に取得することをお勧めしません。むしろ、すべての型メンバーをソースジェネレーターで事前にリソースファイルに抽出し、対応する機能でそのリソースファイルを使用する方が良いです。
- また、`[JsonConverter(typeof(JsonStringEnumConverter))]`を使って列挙型を表記しても効果がありません。`[JsonConverter(typeof(JsonStringEnumConverter<Sex>))]`のように性(Sex)を明示的に指定する必要があります。
- もう一つ重要な点は、AOTプロジェクトのデバッグモードの挙動とリリース後の挙動が一致しないことです。上記の2つの点は、VS内で実行すると問題ないのですが、リリース後に実行すると、挙動が一致しないことが分かります。これも一つの問題点ですが、AOTが成熟するにつれて、改善されることを期待しています。
全体として、AOTプロジェクトを開発する際には、一つの機能が完成するたびにリリースして、問題がないかを早期に発見して改善することをお勧めします。第二に、使用するライブラリーについて十分に理解し、これらのライブラリーがAOTを完全にサポートしていることを確認することが重要です。第三に、プロジェクトの信頼性を検証するために性能テストを実施することが必要です。

(Translated by GPT)
AOTに適しているプロジェクト

どのプロジェクトがAOTに適しているのでしょうか？まず、AOTプロジェクトのメリットとデメリットを見て、これらのメリットとデメリットに基づいて自分のプロジェクトがAOTモードの開発に適しているかどうかを判断できます。

以下は、公式が提供する.NETサービスのネイティブリリースとAOTの比較です。Linux下では、サイズが元の1/10近く、起動後の作業メモリは元の半分以下、起動時間は元の1/4で、RPSの損失はわずか1/10です；Windows下では、リリースのサイズがさらに進み、8.87Mしかありませんが、メモリは元の半分以上で、初回起動時間もやや長く、元の1/4程度で、失われたRPSは約5％ですが、AOTプロジェクトがもたらす改善は非常に明らかで、特にアプリケーションをコンテナに公開する際、使用するリソースが明らかに減少し、これはコンテナのスケーリングに大きな利点があります。

![alt 画像](https://mmbiz.qpic.cn/sz_mmbiz_png/4CAA63nvHRBGcXdZA5Uqn7Fpiclb4zFD2CoBsY4ibEpst842FZ7zItTdlCJvhJxwqWh8ax2IKz3UkYmLXFHBwy5w/640?wx_fmt=png&from=appmsg)

上記からわかるように、AOTのプロジェクトはより小さく、つまりパッケージされたプログラムパッケージや公開されたImageもより小さいです；二番目に少なく、実行時に使用するメモリが少なく、これにより複数のアプリケーションインスタンスに貴重なメモリリソースが節約されます（つまりお金を節約します）；三番目に、初回起動がより速い、つまり冷起動がより速い、これによりいくつかのFuncationサービスの開発が可能になります。

メリットについて話した後、今度はデメリットについて話しましょう。まず、AOTプロジェクトは反射、シリアライズ、元の開発とは大きく異なるため、ワンクリックで切り替えることはできません。次に、デバッグモードでは、ソフトウェアのパフォーマンスがAOTで公開された後のパフォーマンスと異なる可能性があります。デバッグモードでは、実行コードではなくているからです。これら2点は、AOT開発の最大の障害であり、ほとんどすべての機能がAOTで公開された結果に基づいているため、開発効率は以前ほど高くありません。もう一つのポイントは、現在のリリースは非常に遅く、コーヒーを淹れる時間が余るくらいです。

上記の分析を要約すると、以下の3種類のアプリケーションがAOT方式での開発と公開に適していると言えます。

FaaS型サービスでは、いくつかの複雑なアルゴリズム、独立した計算型の小規模サービスにAOTを使用して公開できます。

いくつかの基本的なサービスでは、呼び出し頻度が高く、より高いコストパフォーマンスが求められます：リソースの使用が少なく、出力が多い、例えば上の画像のLinuxで、AOTを使用して公開した場合、2つのPodを起動しても、使用するリソースは元の半分以下ですが、RPSは大幅に増加します。これは非常にコストパフォーマンスの高い選択です。

また、いくつかのシンプルで単一機能のビジネスサービスもAOTで公開することを検討できます。なぜなら、ビジネスが複雑なサービスでは、必要な技術が複雑になるため、現段階のAOT開発にはある程度の開発コストが生じます。少し待って、VSがAOTプロジェクトの開発、デバッグ、公開に大きな改善を行う可能性があります。なぜなら、最初にカニを食べる人は、口を挟まれる可能性があるからです。



(Translated by GPT)
Javaにおける乱数の生成

# 始めに
Javaでは乱数を生成する事が出来ます。
乱数を生成するには、Mathクラス、またはRandomクラスを用います。

# Math.random()を利用する方法
Math.random()は0.0以上1.0未満の実数を生成するメソッドです。
そのままだとdouble型。

Math.random()に様々な数値を加算、乗算する事で、乱数の範囲を調整する事が可能になります。

~~~ :0.0以上x未満の実数を生成
Math.random()*x
~~~

~~~ :y以上(y+1.0)未満の実数を生成
Math.random()+y
~~~

また、int型でキャストすると整数を生成出来ます。

~~~ :y以上(x+y)未満の整数を生成
(int)(Math.random()*x+y)
~~~


# java.util.Random()を利用する方法
java.util.Random()はjava.util.Random()nextInt()のように表記する事で乱数を生成します。

また、nextInt()に引数を設定する事が可能で、その場合は0以上、(引数-1)未満の乱数が生成されます。

~~~ :0以上10未満の整数を生成
java.util.Random()nextInt()
~~~
Intの部分はDoubleなど他の型も利用出来ます。
ただし、頭文字は大文字にする必要があり、使用する型は宣言文の型と一致している必要があります。
AWS EC2 でMySQLにログインできない

EC2で
```shell
sudo apt install mysql-server mysql-client
```

をインストールしてもrootでログインできない。

ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)
ERROR 1698 (28000): Access denied for user 'root'@'localhost'

場合の対処法。

```SQL:SQL
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password
```

ubuntuのログインユーザとrootの名前が違うことが原因ぽい
Discord鯖 運営歴4年の鯖主が語るサーバー運営で大事なこと。

はじめまして、匿名のZeroです。様々なDiscord界隈で活動しています。

サーバー運営を始めてから早4年が経ちました。この経験を元に、皆さんにサーバー運営で重要なポイントについてお話ししたいと思います。
## 悪い治安の影響
雑談サーバーなどで、治安の悪いサーバーを見かけることがありますが、それは長期的な運営にとって困難な状況です。なぜなら、治安が悪いと、メンバーが「何でもしていい」と解釈し、不適切な行動が増えるからです。未成年者がいる場合、問題が大きくなる可能性もあります。また、治安が悪いと鯖民側の反乱が起きることもあります。
## 良い治安を維持する方法
治安を良くするには、具体的に何をすればいいのでしょうか？まず、ルールを厳格に守ることが大切です。また、ルール違反をしたメンバーには速やかに処罰を行うことも重要です。ルール違反者を放置すると、問題が大きくなる可能性が高まります。

## 結論
サーバー運営は、治安の良さで継続しやすくなります。
言っておきますと、治安を悪くして1年以上持つサーバーもありますが、結局崩壊に繋がります。
それでは、良いサーバー運営ライフをお楽しみください。
CentOS Stream 9 で Let’s Encrypt のSSLサーバ証明書が自動更新されない原因

# 原因

CentOS系管理者の思い込み。
CentOS 7, 8, CentOS Stream 8 では自動更新される、と思い込んでいる。

- SSLサーバ証明書そのものは自動更新される。
- snapd 管理の certbot は apache を再起動しない。
- apacheの再起動を行わないと古いSSLサーバ証明書が参照された状態が続く。
- CentOS Stream 9 の logrotate はデフォルトで起動されない。
- apache の logrotate の際に、apache は reload される。

つまり、これまでのOSでは、logrotateのおかけで apache が reload され SSLサーバ証明書が再読み込みされた結果、自動更新されていた。

CentOS Stream 9 の logrotate は cron ではなく systemd の timer ユニットで管理されるようになり、デフォルトで起動しないようになっていた。

```

# systemctl status logrotate.timer
○ logrotate.timer - Daily rotation of log files
     Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; disabled; preset: enabled)
     Active: inactive (dead)
    Trigger: n/a
   Triggers: ● logrotate.service
       Docs: man:logrotate(8)
             man:logrotate.conf(5)

```

```

# systemctl start logrotate.timer
# systemctl enable logrotate.timer
Created symlink /etc/systemd/system/timers.target.wants/logrotate.timer → /usr/lib/systemd/system/logrotate.timer.

# systemctl status logrotate.timer
● logrotate.timer - Daily rotation of log files
     Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; disabled; preset: enabled)
     Active: active (waiting) since Tue 2024-02-13 12:16:59 JST; 32s ago
      Until: Tue 2024-02-13 12:16:59 JST; 32s ago
    Trigger: Wed 2024-02-14 00:00:00 JST; 11h left
   Triggers: ● logrotate.service
       Docs: man:logrotate(8)
             man:logrotate.conf(5)

# systemctl list-timers
NEXT                        LEFT          LAST                        PASSED       UNIT                         ACTIVATES
・・・
Wed 2024-02-14 00:00:00 JST 11h left      Tue 2024-02-13 11:42:10 JST 39min ago    logrotate.timer              logrotate.service
・・・

```

SSLサーバ証明書の管理も大事ですが、ログの管理もしっかりしなければなりません。
gitのブランチ補完

## gitのブランチの補完
https://zenn.dev/aruneko/articles/26815f95ea2124

これ見ながら実施しました。

## gitのコマンド
```shell:
mkdir -p ~/.zsh/completions
$ cd ~/.zsh/completions
$ wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash
$ wget -O _git https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh
```
:::note info
wgetはbrewコマンドからinstall可能
:::


```zsh:zshに追記する
fpath=(
  ${HOME}/.zsh/completions
  ${fpath}
)
autoload -Uz compinit
compinit
```
宝くじ

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/lottery

なかなか難しかったですね。。。

```py
b = input()
n = int(input())
#2位の当選リスト
c = ['1' + str(i) + b[-4:] for i in range(10) if '1' + str(i) + b[-4:] != b ]
#3位の当選リスト
d = []
for i in range(100):
    if i < 10:
        d.append('10' + str(i) + b[-3:])
    elif i > 10:
        d.append('1' + str(i) + b[-3:])

#3位のリストから1等や2等にあるものを抜く
for i in d:
    if i == b:
        d.remove(i)
    for j in c:
        if i == j:
            d.remove(i)

flag = False
#宝くじ
for _ in range(n):
    cur_num = input()
    
    if cur_num == b:
        print('first')
        flag = True
        break
    elif cur_num == str(int(b)+1) or cur_num == str(int(b)-1):
        print('adjacent')
        flag = True
        break
    
    for i in c:
        if cur_num == i:
            print('second')
            flag = True
            break
    
    for i in d:
        if cur_num == i:
            print('third')
            flag = True
            break
    
    if flag == False:
        print('blank')

```

あかんかったです。
タイムアップしてしまったので、
答えを見ると言われてみればそうだ＝＝＝と思ってしまいました。
なるほど。。。まだまだです。

python以外だと、下４桁が一致しているかどうかは10000で割った余りが同じになればOK
下３桁は1000ですね。
余りの性質をよくわかっていなかったです。。。


```py
a = input()
n = int(input())

for i in range(n):
    b = input()

    if a == b:
        print("first")
    # 絶対値の差が１だったらadjacent
    elif abs(int(a) - int(b)) == 1:
        print("adjacent")
    # 2位の条件というのはそもそも３番目から下が同じになればいいので
    # 文字列で比較すればよかった
    elif a[2:] == b[2:]:
        print("second")
    # ３位の条件というのはそもそも４番目から下が同じになればいいので
    # 文字列で比較すればよかった
    elif a[3:] == b[3:]:
        print("third")
    else:
        print("blank")

```
文系出身エンジニアの成長法：未経験からの転職で学んだ3つの秘訣

## はじめに
とある会社でバックエンドエンジニアをやっているcourse_kです。歴としてはもうすぐ丸6年になります。
エンジニアとして働いていますが、もともと大学はゴリゴリの文系で、新卒から3年間塾講師をやっていました。

そこから未経験でITエンジニア職に転職し、5年働いたあと、二度目の転職をして2023年7月から今の会社で働いています。

今回はQiitaのキャンペーンに参加し、自身のエンジニアとしての成長について振り返ります。これまでの経験から得た3つの重要な学びを、具体的なエピソードを交えて振り返ります。
なお、個別具体的な技術の話ではなく、仕事全般に対しての姿勢の話になっています。

## 学び1:信頼を積み重ねる
未経験者や経験の浅い人が仕事を任せてもらうためには、信頼を築くことが不可欠です。経験がない場合、ポテンシャルで判断されることがほとんどであり、その基盤は信頼にあります。

信頼を得るためには、依頼された仕事をこなすだけでなく、期待を超える成果を上げることが必要です。

以前所属していた会社では、課題をこなすことで基礎的な開発知識を身につけられる充実した研修プログラムがありました。
私は最大で4ヶ月かかるカリキュラムを、爆速で終わらせるために業務時間外の勉強などを重ねることで、2ヶ月で終わらせました。
別にカリキュラム通り4ヶ月かけても良かったのかもしれませんが、中途未経験だった自分が使える人材であることを示すためには圧倒的にやるしか無いと思い、やりきりました。

また、入社1年目の間にベンダー系の資格を6つ取得し、自らの能力を示す努力もしていました。
資格を取得したからといって即実力の証明にはなりませんが、当時の私は経験がなくても出来ることを模索し、出来ることはすべてやる、という気持ちで取り組んでいました。

さらに、以下のような点にも注意しました。
* 事務的な締切がある依頼は後回しにせず、すぐ対応する
* チャットやメールへの返信は即レス

そのかいあってか、入社2年目には産学連携のプログラムを任せてもらえるようにまでなります。
また、入社4年目で新しい支社を立ち上げるメンバーにも抜擢されました。

ここまで色々書き連ねてきましたが、要は凡事徹底です。
ただそれを人と同じようにやるのではなく、人よりも多く、早くやる、ということです。

そうして信頼を積み重ねることで「あいつは仕事を任せたら確実にやってくれる」と思ってもらえれば経験がなくてもチャンスを掴むことができます。

## 学び2:積極的に発信する
賛否両論あるかもしれませんが、私の肌感覚では、エンジニアの中には自己主張を控えめにする傾向があるように感じます。技術力があっても、自分の考えや意見を表明することに消極的な人が多いようです。

しかし、発信しなければ何も始まりません。自分の存在を示すためには、積極的に意見や考えを表明することが必要です。特に未経験での入社では、自己紹介や自分の価値を伝える機会が限られているため、自ら発信することが重要です。

発信する内容は何でも構いません。会議での質問やチャットでの技術情報の共有など、小さな行動から始めることができます。

私は以前の会社で、会議に参加するたびに少なくとも1回は発言するように心がけていました。また、勉強会の改善案を提案したり、気になる技術について社内チャットで話題にしたりすることで、自ら発信する習慣を身につけました。

それは今の会社でも変わっていません。入社して8ヶ月が経過しようとしていますが、色々な形で発信できるよう意識しています。

また、自己発信は自己責任とも密接に関係しています。
口先だけの人にならないよう、自然と努力して自己変革するようになるからです。加えて、自分の考えや意見を表明することで、他者とのコミュニケーションが活発化し、自己成長にもつながります。
何も言わないことで失うものはありませんが、発信することで新たなチャンスを掴む可能性が広がります。

未経験であるからこそ、自分の考えや挑戦を積極的に表明することが重要です。

## 学び3:自分の価値を可視化する
いままでの2つはどちらかというと組織に属したあと、爆速でパフォーマンスを上げていくための方法ですが、初めましての環境では通用しません。
自分を全く知らない人に、自分のスキルを理解してもらうには何らかの形で目に見えるものが必要です。
スキルシートや資格もその一つですが、実際に何が出来るのか、の証明としては少し弱いです。
やはり、githubなどに上げたコード、ポートフォリオ、Qiitaや個人ブログなどのWeb記事がわかりやすく、説得力があります。

私が今の会社に入る前、スキルの可視化の不足を痛感した場面があります。
今の会社と、もう一つ別の会社が最終面接まで進んでいました。
その最終面接にて、今までの自身の取り組みやスキルチェンジしたいことなどを伝えましたが、VPoEに「大学生なら頑張ってるなって感じだけど、その勉強の仕方じゃ全然足りないね」と言われました。

自分の中では頑張っているつもりでしたが、あくまでも「お勉強」をしているだけで、実際に何が出来るのかの証明にはなっていなかったのです。

それから半年くらい経つわけですが、いま時点で私がなにか自分の実力を示せるものはできていません。
Qiitaの記事をポツポツあげるなどしていますが、まだまだ実務で通用するレベルには達していません。
これは私が今できている、というよりも今後の課題としてこれからさらに磨きをかけていきたい学びです。

## まとめ
私が未経験でエンジニアに転職して、今に至るまでの大事だと感じてきた
* 信頼の積み重ね
* 積極的な発信
* 価値の可視化
の3点について書いてみました。

これが完全に正しい、というわけではありませんが、私は少なくともこれらを意識して努力することでうまくできた実感があります。これらはどれか一つだけ、というより複合的に絡み合っていると思っています。

信頼の積み重ねのためには発信も欠かせませんし、そうして積み上げてきた価値を見える形にすることで、より信頼の構築に繋がっていきます。

もちろんまだまだ不足している部分（特に価値の可視化）はあるので、もっともっとやっていく必要があるとも感じています。

自分自身未熟な部分が多くありますが、同じような環境の人たちにすこしでも参考になれば幸いです。
【2024年最新！】Discord.js v14でBOTを作る方法！！

こんにちは、Discord界隈にて活動している匿名のZeroと言います。
この記事では、Discord.js v14でBOTを作る方法について解説しています。

それではやっていきましょう。
# discord.jsとは
Discord.jsは、DiscordのAPIを操作するためのJavaScriptライブラリです。Discord.jsを使用することで、Discordボットやクライアントを開発することができます。このライブラリは、Node.js上で動作し、Discordの機能を使ってチャットボットや自動化されたプロセスを作成するための豊富な機能を提供しています。

Discord.jsを使用することで、メッセージの送受信、ユーザーの操作、サーバーの管理など、Discordのさまざまな機能をプログラムから操作することができます。また、Discord.jsは、イベント駆動型のアーキテクチャを採用しており、ユーザーがDiscord上で何かが起こったときに、それに応じて反応することができます。
## discord.js v14コードの書き方
まず、Node.jsのプロジェクトを作成し、Discord.js v14をインストールします。
```bash:install
npm install discord.js
```
次に、Discord.jsを使用してボットを作成します。
```javascript:bot.js
// 必要なモジュールをインポート
const { Client, Intents } = require('discord.js');

// Discord.jsクライアントを作成
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.MESSAGE_CONTENTS] });

// ボットが起動したときの処理
client.once('ready', () => {
    console.log('Ready!');
});

// メッセージを受信したときの処理
client.on('messageCreate', message => {
    // メッセージが「!ping」だった場合に「Pong!」と返信
    if (message.content === '!ping') {
        message.reply('Pong!');
    }
});

// ボットをDiscordに接続
client.login('YOUR_TOKEN_HERE');
```
このコードでは、Discord.jsのClientクラスを使用して新しいクライアントを作成し、必要なインテントを指定しています。その後、ボットがDiscordにログインするためのトークンを使用してloginメソッドを呼び出します。

ボットがメッセージを受信すると、messageCreateイベントが発火し、メッセージを処理するためのコールバック関数が呼び出されます。この例では、メッセージが`!ping`という内容の場合に「`Pong!`」と返信するようにしています。
## Starlight APIを使用した荒らし自動BAN BOT
Starlight APIとDiscord.js v14を連携することで、荒らしが入ってきたらサーバーからキックするBOTを実装できます。
詳しくはこちらの記事をご覧ください。
https://qiita.com/zero8347/items/89f2099f7d4cad58b7f9



最後までご覧いただきありがとうございました。
使えそうなライブラリのインストール方法まとめ

# ライブラリ

- MUI
- react-hook-form
- dayjs

# MUI

デフォルトのインストール方法で十分使える（[公式サイト](https://mui.com/material-ui/getting-started/installation/#default-installation)）

```
npm install @mui/material @emotion/react @emotion/styled
```

# react-hook-form
[公式サイト](https://react-hook-form.com/get-started)

```
npm install react-hook-form
```

# dayjs

[公式サイト](https://day.js.org/docs/en/installation/installation)

```
npm install dayjs
```

# react-router-dom

[公式サイト](https://reactrouter.com/en/main)

```
npm install react-router-dom
```
初学者がCursorエディタで開発する際に役立つ３つの機能

# はじめに

新しい言語やＦＷを学ぶ際、初学者がつまずきやすい３つのポイントがあるかと思います。
1. 機能や特性がわからない
1. エラーの解決方法がわからない
1. 構文（IFやLOOPなど）の記述方法がわからない

これらの課題を解決する検索コストを削減するための、
Cursorエディタの便利な機能を３つご紹介します。

## 1.機能や特性がわからない
### Cursorで「公式ドキュメントの読み込み」を利用しましょう

開発に使う言語やＦＷの公式ドキュメントをCHAT欄の@Docsで「Add new doc」を選択し、
![スクリーンショット 2024-02-09 100517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213832/2741bb06-6cc2-d12b-6535-3f7c3e5a957b.png)
URLの入力欄に公式ドキュメントのURLを入力します。
![スクリーンショット 2024-02-09 092016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213832/e4835bbb-029a-985f-1eab-a9088b0dbfbf.png)

読み込み完了後、@Docsで読み込んだドキュメントを選択して関連する内容を質問することで、
詳細な情報を得られます。

従来は「対象の言語やＦＷ ＋ 実現したいこと」などでググっていましたが、
この機能を使うことで自然言語で質問することができるので、
検索コストを削減できます。

## 2.エラーの解決方法がわからない
### Cursorでエラーのスクリーンショットを貼り付けて質問しましょう

エラー内容をコピー＆ペーストするか、
エラー内容のスクリーンショットを添付して質問しましょう。
![スクリーンショット 2024-02-09 092738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213832/0a57f304-3aea-6df9-50d9-8bf02da476b9.png)

従来は「対象の言語やＦＷ ＋ エラー内容」で検索していましたが、
Cursorを使用することで、自然言語で質問したりエラー情報を直接質問することができ、
検索コストを削減できます。

## 3.構文（IFやLOOPなど）の記述方法がわからない
### Cursorで雑に気軽にじゃんじゃん質問しましょう

例：「JavaScriptの「For Loop」の構文やショートハンドの書き方を教えて」
![スクリーンショット 2024-02-09 101020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1213832/c96874d3-51e5-59df-8685-d3377375cf57.png)

自然言語で質問するだけで、必要な情報を得られます。
検索するよりも、Cursorで直接質問する方が効率的です。

# おわりに
Cursorエディタを活用することで、初学者が躓きやすい様々な課題を効率的に解決することができます。
これらの機能を活用し、新しい言語やＦＷにどんどん取り組んでいきましょう！

どなたかのお役に立てば幸いです。
最後までご覧いただきありがとうございました。