OmniAICreator/Qiita-1.07M huggingface dataset:
Salesforce 権限とプロファイル: 廃止予定

**Salesforce Advent Calendar 2024 13日目**

Salesforce は今年初め、プロファイルの権限のサポート終了日がSpring '26 リリースに予定されていることを発表しました。2024年09月12日に少し内容を整理しましたが、もう少し調べておきたいと思います。

+ [Salesforce 権限とプロファイル: 最新の廃止アップデート](https://qiita.com/Keiji_otsubo/items/b7c0b0f1ffef67799bc0)

+ [プロフィールに権限を設定](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeKQwSAN)

# プロフィールには何が残りますか?

前述のとおり、プロファイルは引き続き存在し、すべてのユーザーにプロファイルが必要です。プロファイルに残る構成は次のとおりです。

+ 1対1の関係: ログイン時間/IP範囲
+ デフォルト: レコードタイプ/アプリ
+ ページ レイアウトの割り当て: 将来は App Builder/Dynamic Forms になるため、Salesforce はページ レイアウトの割り当てを権限セットに導入することに投資しません。

# 権限セットでのみ利用可能になるものは何ですか?

これらの権限は、Spring '26 リリース後に権限セットに移動されます。

+ ユーザー権限（システムとアプリの権限）
+ オブジェクト権限 (オブジェクトの作成、読み取り、更新、削除)
+ フィールド権限（フィールドレベルセキュリティ）
+ タブ
+ レコードタイプ（デフォルトではない）
+ アプリ（デフォルトではない）
+ 接続されたアプリへのアクセス
+ Apex クラス
+ Visualforce ページ
+ カスタム権限

# プロファイルに権限セットを割り当てる(アイデアに上がっているけど本当は完了してない)

+ [プロファイルに権限セットを割り当てる](https://ideas.salesforce.com/s/idea/a0B8W00000GdikSUAR/assign-a-permission-set-to-a-profile)

以下のように回答されていいます

ユーザー アクセス ポリシーは、Summer '24 で GA (一般提供) になりました。プロファイルに割り当てられたユーザーに、権限セット、権限セット グループ、公開グループ、キュー、権限セット ライセンス、管理パッケージ ライセンスを割り当てることができます。ユーザーの作成時や更新時、または移行時に、これを自動的に実行できます。

ユーザー アクセス ポリシー H&T: https://help.salesforce.com/s/articleView?id=sf.perm_user_access_policies.htm&type=5

リリース ノート: https://help.salesforce.com/s/articleView?id=release-notes.rn_permissions_uap_ga.htm&release=250&type=5

現在のアクセス ポリシーは、実際にはアクセスを許可することに関するものであり、取り消すには反対の基準を持つまったく新しいアクションが必要です。これは、Salesforce の使用方法とはまったくかけ離れており、ユーザーは永久に同じロールに留まるか、以前のロールから権限を継承してもかまわないと想定しています。「ユーザーは誰にどのようにアクセスするのか?」という質問に答えるために、すでに複数の場所を調べる必要があります。アクセス ポリシーは、管理する別の領域にすぎません。元の要求は、プロファイルに権限セットを割り当てることでした。これは提供されたものではありません。




# User Access and Permissions Assistant

+ [【ヘルプ】User Access and Permissions Assistant](https://help.salesforce.com/s/articleView?id=sf.perm_uapa.htm&type=5)

# おまけ ... 

Known Issues のサイトですが検索するときに　ANDとORが使えるみたい。

このヘルプを見ていたら分かりました

[MuleSoft を Java 17 にアップグレードする: 包括的なガイド](https://help.salesforce.com/s/articleView?id=002139151&type=1)

+ [Java 17 固有の既知の問題](https://issues.salesforce.com/#q=(java%2017%20OR%20JDK17%20)%20AND%20MuleSoft&sortCriteria=%40sfcreateddate%20descending&numberOfResults=50)- Java 17 MuleSoft の既知の問題については、このサイトを参照してください。 

しかし、遅くて動かない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e61f4641-a363-2923-a720-f4ca1f38635b.png)
Template-Triggered Prompt Flow

**使っているクラウドなどの小ネタ Advent Calendar 2024 5日目**

+ [【Spring 24】テンプレートトリガープロンプトフローでEinsteinにデータを提供する](https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_prompt_template_flow.htm&release=248&type=5)

これで、Flow Builder でテンプレート トリガー プロンプト フローを構築し、Prompt Builder のプロンプト テンプレートと統合できるようになりました。フローは動的なロジックとアクションを実行して、関連付けられたプロンプト テンプレートの解決にマージされる出力テキストを生成します。

+ [テンプレートトリガープロンプトフロー](https://help.salesforce.com/s/articleView?id=platform.flow_concepts_trigger_prompt_template_capability.htm&type=5)

テンプレートによってトリガーされるプロンプトフローは、Winter '24 で作成されたプロンプトテンプレートと互換性がありません。

+ [フィールド生成テンプレートトリガープロンプトフローの例](https://help.salesforce.com/s/articleView?id=platform.flow_concepts_trigger_prompt_template_capability_example.htm&type=5)

# 質問

+ [プロンプトトリガーフローは Flex テンプレートでのみ使用できるということですか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000P9Ne0AK)

:::note
リンクを確認してください。

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007igHVUSA2

 はい、フローベースのトリガーがサポートされている場合は、FlexCard やその他のテンプレートでプロンプトトリガーフローを使用できます。 
:::

# エラー

+ [テンプレートトリガープロンプトフロー開始要素のFlexプロンプトテンプレートタイプオプションが置き換えられます](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Kg3Ps)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/54c6225f-5bef-a474-a353-1edb1300398c.png)


:::note alert
Flex prompt template type options for the template-triggered prompt flow Stat element are being replaced. To future-proof this flow, select manual inputs instead of automatic inputs. 
:::

:::
謎が解けた。 

手動入力に切り替えた後、recordId 変数を「入力可能」として作成します。 

次に、プロンプト テンプレートで、同じ API 名を使用してテキスト入力を作成します。 

私の場合、変数名は recordId だったので、テキスト入力 API 名を recordId として作成しました。 

(はい、入力変数は一度作成すると更新できないため、新しいテンプレートを作成する必要があります...) 

テキスト入力を追加すると、リソースにプロンプ​​ト フローが表示されました。 
:::

+ [the testing environment having a lot of issues please help](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KD0sg)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/2a04f98f-6b34-a161-53b6-edbde16850fc.png)

:::note
Template-Triggered Prompt Flow 
to be visible we need to turn on the "Einstein setup" from Setup. 
:::

+ [no template triggered prompt flow](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KDVzi)
paiza.ioでc# その11

# 概要
paiza.ioでc#、やってみた。
練習問題やってみた。

# 練習問題
hashsetを使え。

# サンプルコード

```
using System;
using System.Collections.Generic;

internal class Program {
    static void Main(string[] args) {
        //HashSet
        var hst1 = new HashSet<int>() { 4, 1, 3, 8 };
        var hst2 = new HashSet<int>() { 3, 5, 2, 4 };
        hst2.ExceptWith(hst1);
        Console.WriteLine("hst1とhst2の差集合：[{0}]", string.Join(" ", hst2));
        //SortedSet
        var sst1 = new SortedSet<int>() { 4, 1, 3, 8 };
        var sst2 = new SortedSet<int>() { 3, 5, 2, 4 }; 
        sst2.ExceptWith(sst1);
        Console.WriteLine("sst1とsst2の差集合：[{0}]", string.Join(" ", sst2));
    }
}



```

# 実行結果

```
hst1とhst2の差集合：[5 2]
sst1とsst2の差集合：[2 5]
```

# 成果物

https://paiza.io/projects/hRtK5iX8-SML7YNtHYYj8A


以上
python 3.13t GIL無効化設定 - ②CPU-Bound実行時間計測

# はじめに
2024年10月、GIL無効化設定が可能のpython 3.13が正式にリリースされました。
GIL有効・無効により、CPU-Bound処理の実行時間を計測してみました。

## 環境
- python: 3.13
  python3.13をinstallした後、python.exeとpython3.13t.exeが作成されます。後者はfree-threadingのGIL無効版です。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/eda561df-5e83-b854-fb5d-ad0f78059ef2.png)
- OS: windows 11
- other: Powershell

# Single-thread
## CPU-Bound
### Code(single_thread_cpu.py 疑似CPU-Bound)

```python
from threading import Thread

COUNT = 5000000
def countdown(n):
    while n>0:
        n -= 1
if __name__ == '__main__':
    countdown(COUNT)
```


### GIL有効の場合
```
PS C:\> python.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: True

PS C:\> measure-command {python.exe single_thread_cpu.py} | findstr TotalMilliseconds
TotalMilliseconds : 144.5156
```

### GIL無効の場合
```
PS C:\> python3.13t.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: False

PS C:\> measure-command {python3.13t.exe single_thread_cpu.py} | findstr TotalMilliseconds
TotalMilliseconds : 210.0626
```
GIL無効の場合、実行時間が長くなりました。

## Multi-threads
### Code(multi_threads_cpu.py 疑似CPU-Bound)

```python
from threading import Thread

def countdown():
    n = 5000000
    while n>0:
        n -= 1
   
def cpu_bound_multi():
    t1 = Thread(target=countdown)
    t2 = Thread(target=countdown)

    t1.start()
    t2.start()

    t1.join()
    t2.join()

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

### GIL有効の場合
```
PS C:\> python.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: True

PS C:\> measure-command {python.exe multi_threads_cpu.py} | findstr TotalMilliseconds
TotalMilliseconds : 249.4991
```

### GIL無効の場合
```
PS C:\> python3.13t.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: False

PS C:\> measure-command {python3.13t.exe multi_threads_cpu.py} | findstr TotalMilliseconds
TotalMilliseconds : 232.4705
```
# まとめ
- 5000000回の繰り返し処理の実行時間(Libraryのimportコスト込み)

|GIL  |Single-Thread  |Multi-Threads  |
|---|---|---|
|有効  |144ms  |249ms  |
|無効  |210ms  |232ms  |

- GIL有効の場合、Multi-Threadsの実行時間(249ms)がSingle-Thread(144ms)の約２倍ですので、並列処理できていないことが分かりました。
- 一方で、GIL無効の場合、Multi-Threads(232ms)とSingle-Thread(210ms)の実行時間に大差がないですので、並列処理が可能であることを理解できました。
- しかし、Single-Threadの場合、GIL有効と比べると、GIL無効での実行時間が長くなりました(144ms⇒210ms)。当面はGIL無効化によるパフォーマンスの低下が避けられないです。
少し暇ができたのでずっとReact Nativeをさわってみた

さわってみたいとずっと思いながら手を出せていませんでした。
少し暇ができたので休憩がてらこれまでやってこなかったことをやってみよう！
ということで『React Native」をさわってみたいと思います！

## 何をするのか？
ドキュメントの通り進めたいと思います！

https://reactnative.dev/docs/environment-setup

### `npx create-expo-app@latest`を実行

実行するとターミナルは下記のような表示をしてくれます。
```bash
Need to install the following packages:
create-expo-app@3.0.0
Ok to proceed? (y) y
```

`y`を打ち込むと`What is your app named?`と聞かれるので今回は`firstApp`と打ち込んで進めると下記のようになります！

```bash
- cd firstApp
- npm run android
- npm run ios
- npm run web
npm notice
npm notice New minor version of npm available! 10.7.0 -> 10.9.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.9.0
npm notice To update run: npm install -g npm@10.9.0
npm notice
```

無事ディレクトリができたので移動しておきます。

```bash
cd firstApp
```

## 開発環境を整える
ほんとに何もわからないので一旦簡単そうな`Expo Go`で環境設定していきたいと思います！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/e0f770fb-1ae6-c44e-7970-8e21809b972b.png)

セットアップにはアプリが必要なようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/75f0986b-9afe-ee57-6cef-a45ee34f48d2.png)

ダウンロードして開くと下記のような画面が表示されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/4bb25485-5790-5435-219f-926a244f9c7f.jpeg" alt="" 
 width="375" />

### 開発環境の立ち上げ
作成したディレクトリでサイトに書かれている立ち上げコマンド`npx expo start`を実行したいと思います。

https://docs.expo.dev/get-started/start-developing/

実行するとQRコードが表示されるのでQRコードを読み取ります。
するとエラーになりました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/15d59389-1605-87c9-ae93-f94a9b2a9b8e.jpeg" alt="" 
 width="375" />

`npm install`を実行してpackageをインストールし、もう一度`npx expo start`を実行します。

```
The global expo-cli package has been deprecated.                        │
│                                                                           │
│   The new Expo CLI is now bundled in your project in the expo package.    │
│   Learn more: https://blog.expo.dev/the-new-expo-cli-f4250d8e3421.        │
│                                                                           │
│   To use the local CLI instead (recommended in SDK 46 and higher), run:   │
│   › npx expo <command>   

This command requires Expo CLI.
Do you want to install it globally [Y/n]? Y
Installing the package 'expo-cli'...

Error: Cannot find module 'expo/config-plugins'
```

グローバルな`expo-cli`は非推奨になったようなので対処します。

`npm uninstall -g expo-cli`が完了したら`npm install expo-cli`でプロジェクトにインストールします。
`npm install`を実行してpackageをインストールし、もう一度`npx expo start`を実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146612/9ac99fb8-2b17-ed28-0905-d13f0aeba65c.png)

画面が表示されました！
ターミナルに表示されたQRコードをスマホで読み取るとスマホの方でも表示されるようになりました！

現時点だと環境を整えるのに少しクセがありましたが、これで開発準備が整いました！

## 参考記事
- https://qiita.com/Akihiro0711/items/bf9e96c36cc808052094
- https://gedem-blog.vercel.app/blog/expo-error-1/
- https://github.com/expo/expo/tree/main/packages/%40expo/cli
- https://zenn.dev/ohbashunsuke/scraps/79dbb5c3f597c2
- https://docs.expo.dev/
- https://stackoverflow.com/questions/70617115/cannot-find-module-metro-src-lib-terminalreporter-in-expo-react-native-project
-
python 3.13t GIL無効化設定 - ①CPU-Bound並行実行

# はじめに
2024年10月、GIL無効化設定が可能のpython 3.13が正式にリリースされました。
GIL有効・無効により、CPU-Bound・IO-Bound処理の動作を検証してみました。

## 環境
- python: 3.13
  python3.13をinstallした後、python.exeとpython3.13t.exeが作成されます。後者はfree-threadingのGIL無効版です。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/eda561df-5e83-b854-fb5d-ad0f78059ef2.png)
- OS: windows 11
- other: Powershell


# 並行実行(Concurrency)
## CPU-Bound
### Code(multi_threads_cpu_print.py 疑似CPU-Bound)

```python
from threading import Thread
import sys

execution_log = []

def countdown(obj, n1):
    while n1>0:
        execution_log.append(obj)
        n1 -= 1

def cpu_bound_multi():
    t1 = Thread(target=countdown, args=("a",5000))
    t2 = Thread(target=countdown, args=("bb",500))

    t1.start()
    t2.start()

    t1.join()
    t2.join()

if __name__ == '__main__':
    cpu_bound_multi()
    with open(sys.argv[1], "w") as file:
        file.write("\n".join(execution_log))

```

### GIL有効の場合、CPU-Bound処理の並行実行ができない
```
PS C:\> python.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: True

PS C:\> python.exe multi_threads_cpu_print.py output_cpu_gil_true.txt
```
- output_cpu_gil_true.txt
Thread-1の処理が完了した後、Thread-2の処理が開始したことを確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/174aea5b-c582-03c9-55c9-21d89ccd490b.png)


### GIL無効の場合、CPU-Bound処理の並行実行ができる
```
PS C:\> python3.13t.exe -c "import platform,sys; print(f'{platform.python_version()}, GIL: {sys._is_gil_enabled()}')"
3.13.0, GIL: False

PS C:\> python3.13t.exe multi_threads_cpu_print.py output_cpu_gil_false.txt
```
- output_cpu_gil_false.txt
Thread-1とThread-2の処理が交替に実行されていたことを確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/c773f54e-570f-1c4c-53b4-8488fb6fdded.png)

## IO-Bound
### Code(疑似IO-Bound)

```python
import time
from threading import Thread
execution_log = []
def sleep_(obj):
    n = 5

    while n>0:
        execution_log.append(obj)
        n -= 1
        time.sleep(0.1)

def io_bound_multi():
    t1 = Thread(target=sleep_, args=("a",))
    t2 = Thread(target=sleep_, args=("bb",))

    t1.start()
    t2.start()

    t1.join()
    t2.join()

    
if __name__ == '__main__':
    io_bound_multi()
    print(execution_log)

```

### GIL有効・無効と関係なく、IO-Bound処理の並行実行ができる
```
PS C:\> python.exe multi_threads_io_print.py
['a', 'bb', 'a', 'bb', 'a', 'bb', 'a', 'bb', 'a', 'bb']

PS C:\> python3.13t.exe multi_threads_io_print.py
['a', 'bb', 'a', 'bb', 'a', 'bb', 'a', 'bb', 'a', 'bb']
```
【初めまして Vue.js】 v- ** 一体何者？

📝今日も変わらず、ちゃんと理解しておきたい`Vue`の色々について、書いていきます。
今日は、早速、よくわからなくなってきた「`v-****`」、その辺りを調べてみようと思います。

公式を見て、おお〜ってなりました。
色々な種類の `v- ***` があるんですね。

せっかくなので、ひとつひとつ見ていきます。

# `v-text`

要素に文字列を表示させるための命令。
これを使用すると他の要素が全部上書きれるため、他のHTMLタグや子要素があっても無視される。
HTML要素を無視して、全てを文字列として認識して出力する具体例↓。
```vue:samaple
<p v-text="'<strong>強調</strong>されたテキスト'"></p>
<!-- 表示結果: <strong>強調</strong>されたテキスト -->
```

# `v-html`
要素のinnerHTMLを更新する。プレーンなHTMLとして挿入される。

:::note warn
XSSの攻撃対象にもなりうる → 適用させるのは絶対的に信頼できるコンテンツのみに限定し、外部からの提供コンテンツには`v-html`は使用しない。
:::

# `v-show`
式の値の真偽値に基づいて、要素の可視性を変化させる。
要素の表示/非表示の切り替えに使用するディレクティブ。
- `true`: 要素を表示する
- `false`: 要素を非表示にするが、DOMからは消えない
```vuejs
<template>
  <div>
    <button @click="isVisible = !isVisible">
      {{ isVisible ? '非表示にする' : '表示する' }}
    </button>
    <p v-show="isVisible">このテキストは表示・非表示が切り替わります</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isVisible: true
    }
  }
}
</script>
```

# `v-if`
要素を表示するかどうかを決める命令。
-  `true`: 要素が表示される
-  `false`: 要素はDOMから削除される

```vuejs:sample
<template>
  <button @click="showMessage = !showMessage">
    {{ showMessage ? '隠す' : '表示する' }}
  </button>
  <p v-if="showMessage">このメッセージは表示されます</p>
</template>

<script>
export default {
  data() {
    return {
      showMessage: false
    }
  }
}
</script>
```

## 💡 `v-show`と`v-if`の違い
- `v-if` : 要素を追加、削除する
- `v-show` : 要素を見えないようにするだけで消さない

# `v-else`
`v-if`、`v-if`/`v-else-if`チェーンの"elseブロック"を表示する。
直前には、`v-if`または`v-else-if`が兄弟要素として必要。
`<template>`で使用するとテキストや複数の要素を含む条件ブロックを構成できる。
```vuejs:sample
<div v-if="Math.random() > 0.5">
  Now you see me
</div>
<div v-else>
  Now you don't
</div>
```

# `v-else-if`
`v-if`に対する`else if`ブロックを構成する。連鎖可能。
直前には兄弟要素として`v-if`、`v-elese-if`が必要。
`<template>`に使用すると、テキストや他の複数の要素を含んだ条件ブロックを構成できる。
```vuejs:sample
<div v-if="Math.random() > 0.5">
  Now you see me
</div>
<div v-else>
  Now you don't
</div>
```

次は`v-for`から、同様に公式を参照しつつ勉強していきます📚
何か間違いや誤解を生みそうな表現がありましたら、大変お手数ではございますがご指摘をいただけますと幸いです。
ワークスペースごとにスニペットを設定する方法

## 設定ファイルの作成
ワークスペースに`.vscode`フォルダを作成したあとその中に`***.code-snippets`というファイルを作成します。
***の部分はわかりやすいように言語に応じた名前にします。
(C++のスニペットの場合、cpp.code-snippetsなど)

```rb
mkdir .vscode
touch .vscode/***.code-snippets
```

## ディレクトリ構造

```
.vscode
├── cpp.code-snippets
```

ファイルができたらその中にスニペットを書く

### 例

```cpp.code-snippets
{
  "Hello World": {
      "prefix": "hello",
      "body": [
          "#include <iostream>",
          "",
          "int main() {",
          "    std::cout << \"Hello, World!\" << std::endl;",
          "    return 0;",
          "}"
      ],
  }
}
```

これで完成
![snippet.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3915504/7b7c310f-16ee-db36-423f-b3df5aec03e0.gif)
SQLパズル　p55 13.２人かそれ以上か、 解法その２メモ

# 概要
SQLパズル　p55 13.２人かそれ以上か、それが問題だ。その２のメモです。
テーマとしては、CASE文と集約関数の使い方が肝です。


# 要件
行から列に変換したい。
行の数が２行の場合　２列目は２行目の値が入る
行の数が１行の場合　２列目は空欄（null）
行の数が３行の場合　２列目は--More--

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/4e8a8cd6-f222-77d5-aa5c-ba1161d54af3.png)



# SQL

## DDL
```sql
DROP TABLE IF EXISTS register;
CREATE TABLE register
(course_nbr integer NOT NULL,
student_name CHAR(20) NOT NULL,
teacher_name CHAR(20) NOT NULL
);

INSERT INTO register values
-- 古文の講座には先生が3人いる
(1,'古文の生徒A','kobun_teacher_1'),
(1,'古文の生徒A','kobun_teacher_2'),
(1,'古文の生徒A','kobun_teacher_3'),
-- 数学の講座には先生が2人いる
(2,'数学の生徒A','数学先生1号'),
(2,'数学の生徒A','数学先生2号'),
-- 物理の講座には先生が1人いる
(3,'物理の生徒A','物理先生1号')
;


```



## 答えのSQL
```sql
-- 13 02
-- teacherが２人いる場合　MINとMAXの値が違うことを利用している。
-- MINとMAX逆でも問題なし
-- １人のときは NULLにしているので問題なし
SELECT course_nbr,student_name,MIN(teacher_name),count(*) as total_count
    CASE COUNT(*) WHEN 1 THEN NULL
                  WHEN 2 THEN MAX(teacher_name)
                  ELSE '--More--' END
    FROM register
    GROUP BY course_nbr,student_name;
```




# 参考

SQLパズル　p55 13.２人かそれ以上か、それが問題だ。その２

SQLパズル　サポートページ
https://mickindex.sakura.ne.jp/database/db_support_sqlpuzzle.html#LocalLink-p13


達人に学ぶSQL徹底指南書第２版　p3 単純CASE式　簡潔にかけるが、できることが限られる。
達人に学ぶSQL徹底指南書第２版　p18 CASE文の中で集約関数を作る
達人に学ぶSQL徹底指南書第２版　p22 参考問題

postgresql caseについて
https://www.postgresql.jp/document/7.3/user/functions-conditional.html

postgresql 集約関数


github コミット文
https://github.com/RYA234/SQL_Puzzle_Learning/commit/dc053de4e9484988cdd4538903792e59c53409fe
paizaラーニングスキルチェック「B108:観覧車の稼働状況」を解いてみた結果

▼問題

以下のリンクを「B108:観覧車の稼働状況」で検索してください

https://paiza.jp/challenges/ranks/b/info

▼結果

https://paiza.jp/challenges/share/TZScqJYJOO8vhFT_y8ogYz5BiYFQ2loBE4-eq_NYwVM?source=social
初心者向けTableauの検証方法まとめ

## 背景
Tableauを導入する際、システムやデータの検証作業は非常に重要なステップです。しかし、過去に人事部門へのパッケージシステム導入を支援した際の経験から、**システム部門出身でない方にとっては「検証」といっても何をどう進めればよいか分からない**という課題を感じました。また、他社の事例を見ても、初心者向けにTableauの設定方法を教えるサポートは多い一方で、**検証方法を体系的に教える機会は意外と少ない**ようです。

そこで、私の経験をもとに、初心者向けのハードルでTableauの検証方法をまとめました。これからTableauの導入・運用を行う初心者の方に、少しでもハードルを下げていただければと思います。

## Tableau検証方法

以下、初心者の方でも実践しやすい3つの検証方法を紹介します。

### 検証方法1：理論値との比較
#### 概要
Tableauの出力が正確かどうかを確認するために、**元データ（例：Excelファイル）を基にした理論値と比較する**のが最も基本かつ正確な検証方法です。具体的には、明細データをベースに、Tableauで設定したフィルタや集計条件と同じ条件を元データ側で再現し、同じ集計結果が得られるかどうかを確認します。

#### 具体的な検証手順
1. 元データ（Excelなど）を開き、Tableauで使用しているのと同じフィルタや集計条件を設定します。
2. Tableauのビジュアライゼーションの値とExcelの計算結果を比較し、一致するかを確認します。
3. 差異があった場合は、Tableauの設定を再確認し、フィルタや計算が正しく適用されているかを見直します。

この方法は**最も正確な検証方法**であり、特に重要なデータや信頼性が求められる場面では必ず行うべきです。

#### メリット・デメリット
- メリット：最も正確に検証が行える。
- デメリット：正解データが存在しない場合には使えない。

### 検証方法2：閾値前後の確認
#### 概要
理論値との比較が難しい場合には、**閾値の境目や条件が切り替わる箇所**での動作を確認するのが有効です。例えば、ある数値が一定の閾値を超えた時にレコードがフィルタリングされる仕様であれば、その閾値ギリギリの値で意図通りのフィルタリングが行われるかどうかを確認します。

#### 具体的な検証手順
1. フィルタや計算フィールドに使用されている閾値付近のデータを見つけます。
2. Tableau上でその閾値前後のデータに対してフィルタや条件が適切に適用されているかを確認します。
3. 条件分岐が正しく行われていない場合は、条件設定やフィルタ設定に問題がないかを確認します。

#### 注意点
この方法はロジックに依存するため、そもそも条件設定に誤りがある場合には気づきにくいという点に注意が必要です。そのため、可能であればまず**理論値との比較**を優先し、こちらの方法は補完的に使用するのが良いでしょう。

#### メリット・デメリット
- メリット：正解データがなくても検証が行える。
- デメリット：条件設定に問題があっても気づきにくい。

### 検証方法3：極端なケースへの注意
#### 概要
データ分析やビジュアライゼーションの開発では、**極端な値（null値、ゼロ、非常に大きな値など）**が想定外の結果を引き起こすことがよくあります。特にTableauでは、nullや欠損レコードの扱いが難しいことがあり、これらを考慮せずに集計や計算を行うと意図しない結果になることがあります。

#### 具体的な検証手順
1. データソースにnullやゼロの値が含まれていないかを確認します。
2. 極端な値が含まれる場合は、Tableauのフィルタでnullを含むようにしたり、レコード数を確認します。
3. Tableauで極端な値が意図通りに処理されているか、特に計算フィールドやフィルタが正しく動作しているかを確認します。

#### 注意点
特に**平均値や中央値を用いた計算**では、nullや極端な値が含まれていると、正しい結果が得られないことがあります。また、数値だけでなくカテゴリデータにもnullが含まれることがあるため、こうしたレコードをきちんと処理することで信頼性が高まります。

#### メリット・デメリット
- メリット：極端なケースに対してのチェックを行うことで、ロジックの漏れを防ぐ。
- デメリット：特になし

## 検証方法の優先順位
基本的には、**1. 理論値との比較**を最優先に行い、極端な値のチェック（検証方法3）を行うと良いでしょう。理論値がない場合に限り、**閾値前後の確認**（検証方法2）を使用することで、検証の精度と効率を高められます。

## まとめ
初心者にとって検証作業は、設定方法と同様に重要ですが、手間がかかりがちです。しかし、上記の手順を踏むことで、Tableauを使用したデータ分析が正確で信頼性のあるものになります。特にシステムに慣れていない方でも、これらの方法を取り入れることで検証作業を無理なく行えるようになるでしょう。ぜひTableau初心者の方は参考にして、データの正確性を高めてください。
【Swift】ユニコードの操作について

先日、ユニコードに関する問題を解く機会がありました。その際のメモを少し残したいと思います。
言語は、Swift です。

# ユニコードとは
TBD

# ユニコードから文字列を取得する
ユニコードから文字、つまり Character 型を取得します。

```swift
func changeChara(for asciiCode: Int) -> Character {
    guard let unicodeScalar = Unicode.Scalar(asciiCode) else { return "?" }
    return Character(unicodeScalar)
}
```

https://developer.apple.com/documentation/swift/unicode/scalar

`Unicode.Scalar()` は、`UnicodeScalar` として使うこともできます。
`unicodeScalar` は、TypeAlias です。

https://developer.apple.com/documentation/swift/unicodescalar

# 文字からユニコードを取得する
ユニコードから文字列を取得するより、こちらの方が簡単に取得することができます。

```swift
func changeInt(for text: String) -> [UInt8] {
    let asciiCodes = text.compactMap{ $0.asciiValue }
    return asciiCodes
}
```
`compactMap` は、各要素に対して、指定された変換を呼び出した結果のうち、`nil` ではないものを含む配列を返します。つまり、配列のデータから `nil` を取り除いた配列を返します。
`map` でも良いのですが、`[UInt8?]` となり、後々面倒なので、今回はこの場合を紹介します。
Unityにおけるコルーチンとasync/awaitの違いとは

## はじめに
**コルーチン** と **async/await** はどちらも非同期処理を行うための仕組みですが、それぞれの目的や使用法、動作に違いがあります。以下に、両者の違いについて説明します。

## コルーチン
- **使用される環境**: 主に Unity で使用され、IEnumerator インターフェースを使って記述します。
- **実装方法**: IEnumerator を返すメソッド内で yield return を用いて実装します。
- **制御の流れ**: コルーチンは、Unity エンジンのフレーム更新と密接に関係しています。yield return を使って、次のフレームまで処理を一時停止することができます。
- **スレッド**: コルーチンは メインスレッド で実行され、マルチスレッドではありません。
- **主な用途**: フレーム単位での待機や、ゲームオブジェクトのアニメーション、待機処理に利用されます。
- **例外処理**: コルーチンでは例外が発生してもキャッチが難しいため、例外処理に制約があります。

### 使用例
```C#
IEnumerator ExampleCoroutine()
{
    Debug.Log("Coroutine started");
    yield return new WaitForSeconds(1); // 1秒待機
    Debug.Log("Coroutine finished after 1 second");
}

// 使用
StartCoroutine(ExampleCoroutine());
```

## async/await
- **使用される環境**: C# 全体で使用される非同期処理の標準機能。Task と組み合わせて使います。
- **実装方法**: async キーワードをメソッドに付け、await を使って非同期処理の完了を待機します。
- **制御の流れ**: await キーワードで非同期処理の完了を待機し、処理が完了すると続きが実行されます。
- **スレッド**: async/await では、非同期処理はバックグラウンドスレッドで実行される場合もあり、CPU バウンドな処理と I/O バウンドな処理に適しています。
- **主な用途**: 外部サービスとの通信、データの読み書き、ファイル I/O などの非同期処理に適しています。
- **例外処理**: 非同期メソッドの中で例外が発生した場合も、通常の try-catch 文で例外をキャッチできます。

## 使用例
```C#
async Task ExampleAsync()
{
    Debug.Log("Async method started");
    await Task.Delay(1000); // 1秒待機
    Debug.Log("Async method finished after 1 second");
}

// 使用
await ExampleAsync();
```

## コルーチンと async/await の違い
| 項目         | コルーチン                         | async/await                           |
|--------------|-----------------------------------|---------------------------------------|
| 主な用途      | Unity のフレーム管理、時間経過      | 一般的な非同期処理、I/O バウンドな処理  |
| 実装方法      | IEnumerator と yield return       | Task と async / await                |
| スレッド      | メインスレッド                     | マルチスレッドも可能                   |
| 例外処理      | 例外処理は難しい                   | try-catch が利用可能                   |
| 適用範囲      | 主に Unity 環境                   | C# 全体                               |
| 使用例        | ゲームオブジェクトのアニメーションや待機 | ファイル I/O、ネットワーク通信          |


## まとめ
- **コルーチン** は、Unity のメインスレッドでの時間やフレームに依存した処理に適しており、IEnumerator と yield return を使って制御します。
- **async/await** は、スレッド管理や並行処理が必要な非同期タスクに適しており、await で非同期処理が完了するまで待機します。

Unity では async/await も使用できますが、await はフレーム待機や時間待機の機能は持っていないため、Unity 特有のフレーム依存の処理では、IEnumerator を使ったコルーチンの方が便利です。
ちなみにKotlinのコルーチンはマルチスレッド環境で非同期処理を簡単に実装するためのものなので、仕組みは異なります。
macOS上で間違えて `rm -rf /*` してしまった

# 起きた現象

masOS上で間違えて  `rm -rf /*` してしまったときの話。

やらかした瞬間は特に異変がなかったが、再起動しログインすると、以下のような画面になり、動かなくなった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2601747/21e1f4ab-50d9-fb91-7bbe-a59fd8fb3c4d.png)
画像引用: https://support.apple.com/ja-jp/102675


# 解決方法

基本的には[ここ](https://support.apple.com/ja-jp/101666)に書いてある手順でなんとかなる。


`⌘` + `R` を押しながら、Macの電源を入れる。するとリカバリーモードに入るので、Disc Utilityに入る。

私の場合は、MachintoshHD DataがなぜかUnmountedになっていたので、再度マウントし直してからFirst Aidを行った。
First Aid終了後に再起動すると、再度動くようになった。


# 教訓

私のMacは日本語キーなのだが、最近イキってUSキーを使っている。USキーと日本語キーのずれにより、「.」を打ったつもりが「/」を打ってしまい、今回のようなミスに至った。

幸い気づいたのが早かったので、ユーザ領域はほぼ無傷で済んだが、今後はコマンドをしっかり確認するようにしたい。また、なるべく `rm -rI` を使うようにする。
【読了記事】プログラムを読む技術（岩松洋さん著）

チャプターごとに感想などを書いていきます。

https://bookplus.nikkei.com/atcl/catalog/24/09/11/01598/

## Chapter1 : なぜプログラムを読む力が必要か
　Chapter1では、プログラムを読むシーンの具体例と、「プログラムを読む力」の重要性について述べられています。
 　読者をやる気にさせてくれる言葉が転がっていて気分が少し上がりました。
## Chapter2：他人のプログラムを読むのが難しい理由
　Chapter2では、プログラムの作者と読者の思考や認識の相違に着目して、他人のプログラムを読むことが困難な理由が7つ述べられています。
　個人的には「知っている or 知らない」が結局一番大きな要因だと感じていますが、本書では「考え方の違い」「使っている技術の違い」など、基本的に両者の「違い」に焦点を当てています。
 >コメントは「プログラムの実行されないコード」ということもできます。

　良い感じの名言も出てきました。

　コラムや筆者の体験談など、具体的な技術以外のところもけっこう面白いです。

 ## Chapter3：「入力」と「出力」を探すのがコツ
 　Chapter3ではプログラムの基本構成と読み方の手順の概要が述べられています。
 　プログラムの基本構成は「入力→処理→出力」であり、すべてのプログラムはこの基本構成の組み合わせである、という考え方がChapter3で登場します。
  　むむっ、確かに。
　そりゃそうだろって感じかもですが、今読んでる箇所の入力と目的をおざなりにしたまま解読しようとしてちぐはぐになってしまうことが今までにあったような気がしてきました。
 　プログラムの読み方に関しては極々当たり前のことが書かれていますが、それを実行するための技術がChapter4以降で述べられているはずです（読みながら書いている）。

 ## Chapter4：プログラム全体を把握する
 　Chapter4では、プログラム全体を把握することについて、具体例や手順、サンプルコードを交えて述べられています。
　「プログラムを読む前にすること」の節では、ドキュメントについてや、実装した人に質問する際の準備事項などの説明があり、かなり実践的(現場的)です。
 　個人的には
  >プログラムの目的から実装をイメージする

  　が良いなと感じました。受け取るだけよりも、自分自身がプレイヤーになる方が理解が深まります。

 ## Capter5：効率良く1行ずつ読んでいくコツ
　Chapter5では、プログラム全体を捉えた後、詳細に解読していくために必要なポイントが述べられています。
 >1行ずつ読むときにもその行に入力、処理、出力があるという目線が必要です

 　プログラムの基本構成で行単位まで分解出来るという思想のもとで説明と実習が続きます。少し窮屈に感じましたが、どこまでも機械的に追っていける状態を目指せるのであれば頑張ってついき行きたいところです。

## Chapter6：「実習」プログラムを読む（入門レベル）
　Chapter6からは実践編です。入門レベルとはいえ、真面目にやると結構大変です。

## Chapter7：Pythonのモジュールを読む
　Chapter7は実習の特別編です。ちょっとガチっぽいコードも登場します。モジュールのソースコードを取得する関数があるというのは初知りでした。

## Chapter8：「実習」業務システムを読む
　Chapter8は実習の応用編です。ここはかなりイージーでした。

## まとめ
　読み切りやすい分量とレベル感だった思います。
 　結局「コードをたくさん読むしかない」とはなりますが、それを実感できるだけでも読む価値十分でした。
  　コラムや筆者の体験談など、ほっと落ち着ける箇所があったのがすごく好きです。
Qiitaの記事ページ下部にあるトレンド記事欄を消すカスタムCSS

## 手順
お使いのブラウザにStylebot等の適当なカスタムCSS拡張機能をインストールし、以下のコードを`qiita.com`に適用する。
```css:CSS
article + div > section:first-child + section {
  display: none;
}
```
## なんでこんなこと？
胡散臭い記事ばっかり表示されているから。
公式Viz拡張機能「Tableau Table」がすごい！！！

## サマリ（忙しい人向け）

Tableau2024.3のリリースに伴って追加されたViz拡張機能「Tableau Table」がこのように（添付動画参照）とても便利です！
一度お試しあれ！！！

![tableau_table_test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/3cf401e6-fbf5-b847-0384-6ab02cb69b52.gif)

「Tableau Table」によって具体的に以下の実現が可能となりました。

1. **ユーザーが自由に探索できるテーブルの提供**
1. **より表現の自由度が高い表の実装**

本記事では実装方法やより具体的な機能について紹介させていただきます。
※「Tableau Table」は2024.2以降のverでのみ利用可能です。

## 目次
- [「Tableau Table」の利用開始方法](#tableau-tableの利用開始方法)
- [「Tableau Table」の基本的な使い方](#tableau-tableの基本的な使い方)
  - [表の作成方法](#表の作成方法)
  - [テーブル全体の設定の変更方法](#テーブル全体の設定の変更方法)
  - [カラム別の設定の変更方法](#カラム別の設定の変更方法)
  - [Excelへの出力方法](#excelへの出力方法)
- [気になる機能検証いくつか](#気になる機能検証いくつか)
- [嬉しい点いくつか（既存の表では実装が難しかった箇所）](#嬉しい点いくつか既存の表では実装が難しかった箇所)
- [留意点いくつか](#留意点いくつか)
- [まとめ](#まとめ)



## 「Tableau Table」の利用開始方法
下記方法で利用可能です。

1. マークよりViz 拡張機能「+ 拡張機能の追加」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/d7a289ca-3cc2-890c-f6cf-32295e8d1292.png)

2. Featuresより「Built by Tableau + Salesforce」を選択する
2. 「Tableau Table」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/359357f1-ea8d-c3e5-cf27-abe0c08968fd.png)

## 「Tableau Table」の基本的な使い方
直観的な操作が可能となっているため概要のみ紹介します。

### 表の作成方法
マークの「詳細」にフィールドをドラッグすることで表を実装できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/eaf98f9a-99d3-4a30-798b-b58a8a4d5ddf.png)

### テーブル全体の設定の変更方法

添付画像赤枠箇所よりテーブル全体に対する設定を変更できます。
ツールバー、カラム別フィルターの表示/非表示を選択できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/44b6d9ba-8ca3-0a71-85e1-9ca6f053a9fd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/037bc6af-bbfd-71a5-a6ff-028c351568b8.png)

### カラム別の設定の変更方法
カラムごとに書式設定などを変更可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/a39b3742-a41b-94a3-0afc-0ed4bd556cc1.png)

### Excelへの出力方法
.xlsx形式での出力が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/b09634f9-8ade-448e-d8f4-7248f39316dd.png)

こちらの機能を実装したくない場合は拡張機能の「Show Excel Download」をオフにすることで実現可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932930/db5ef863-6a30-61bb-933f-7593f1657df2.png)

## 気になる機能検証いくつか
1. **他シートへのアクションフィルターは問題なくかかる (注意点あり）**
※カラム名検索のフィルターのみ他シートに反映されない仕様となっている。
1. **メジャーネーム/バリューは問題なく使える**
1. **積み上げ棒グラフは実装できない**

## 嬉しい点いくつか（既存の表では実装が難しかった箇所）



1. **ディメンションの色付け/自由度の高い色付けの実現**
一応できないわけではないですが結構面倒だった
またカラースケールだけでなくRuleベースでの色付けが可能

1. **メジャーのディメンション前設置**
棒グラフをディメンションで挟めるようになった

1. **扱いやすいダウンロード機能の実装**
既存機能では特定の表に紐づけてダウンロードボタンを設置する形ではなく、ダウンロードボタンを選択後出力元の表を選択する形なのでややわかりにくかった




## 留意点いくつか
1. 「ビュー全体」「幅をあわせる」「高さをあわせる」は使用できない
1.  カラムの色付けに他のカラムは参照できない

## まとめ
以上、Tableau Tableの紹介でした！
ユーザーフレンドリーな表の実装を可能とするTableau Tableをこの機会に使ってみましょう。
ざっくり解説stripeとsubscriptionの概念

# stripeとは
システムで決済を行う際に決済代行会社の選定は悩みます。
本記事で扱うstripeは海外のサービスでありながら、各国の税制に対応していたりと、グローバルなサービスには強い特徴があります。
また、PHPのフレームワークであるLaravelでは、楽に導入できます。
本記事では、そんなstripeの難しい概念をざっくりと解説しようと思います。

より詳しい解説は公式ドキュメントをご覧ください。
https://docs.stripe.com/?locale=ja-JP
https://docs.stripe.com/api

# 本記事の対象
ざっくりとstripeの概念を解説します。
そのため、本記事の対象は「はじめてstripe使うけど、複雑でよくわからない！」という方になります。
かなり割愛した内容なので、技術書でいうところの入門書の入門書です。

## Customer
所謂、ユーザーや会員と同義です。
customerに支払い方法やサブスクリプションが紐付きます。

## PaymentMethod
支払い方法です。
Customerは複数の支払い方法を持てます。
ここでの支払い方法はカード決済といった支払い方法だけでなく、カードそのもののことです。

## Subscription
定期購入・継続購入のことです。
指定された期間(毎月・毎年)に決められた金額を自動で決済します。
Customerは複数Subscriptionを持てます。
また、ステータスも存在し、トライアル状態、アクティブ、決済施行中、キャンセルetc..が存在します。

## Price
商品という呼ばれ方をしています。
Subscriptionに紐付きます。
前項で記載した、
- 指定された期間
- 決められた金額
はPriceで設定します。
SubsctiptionではなくPriceで期間や金額を持つことにより、Subscriptionのプラン変更が容易にできる印象です。

## Invoice
請求のことです。
毎月決済を行うSubscriptionが設定されている場合、毎月Invoiceが作成されます。

# 使い方
Customerに対して、Priceを設定してSubscriptionを作成します。
Priceで設定した期間ごとにInvoiceが作成されます。
カード等をPaymentMethodに設定していた場合、自動で決済が行われます。

# おまけ
ここからは、stripeからは少し離れて、3Dセキュア認証についてざっくり解説します。

## 3Dセキュアとは
3Dセキュアとは、不正利用防止の本人認証のことです。
ECサイト等で買い物をしたときに、カード会社のページに遷移してSMS送信されたパスコードを入れたり・・・とするアレです。
https://www.meti.go.jp/press/2023/03/20240315002/20240315002.html
2025年3月末までにEC事業者は対応が必須とされています。

## 自動決済の場合の対応
カード番号を入力して、3Dセキュアで認証して決済。
通常の決済は確かに良いのですが、Subscriptionの場合は自動決済のため、できないのではないかという疑問が発生します。
その疑問に対して、stripeでは「本人認証が発生する場合があります」と表明(?)しています。
既に作成されたSubscriptionに紐付くInvoiceに対して、本人認証を別途行う必要があります。

余談ですが、fincodeやPGマルチペイメントの場合には「自動決済では本人認証が発生しない」と表明(?)しています。
しかし、支払い方法の設定時に3Dセキュア認証が発生する場合があります。(stripeでは支払い方法の設定では発生しない)

# 最後に
ざっくりと解説しました。
本当にざっくりです。
詳細に解説しようとすると、各パラメーターや、そもそもアカウントの種類、その他概念等々・・・・日が暮れてしまいますので、本当にざっくりにしました。
外部サービスってサービス毎に概念理解しなくてはいけなくて大変ですよね・・・・
Go で Iota 識別子を使用して列挙 (enum) 的な実装をする

# Go には列挙型が存在しない

Java などに存在する列挙型ですが、Go にはそのような仕様がありません。
Go では列挙的な実装をしたいときに Iota 識別子が使用できるようです。
今回はシンプルなタスクのステータスを列挙する実装を例に Iota 識別子を使用する方法を考えます。

# Iota 識別子

Go には Iota (イオタと読むらしい) という識別子があります。

## 言語仕様

https://go.dev/ref/spec#Iota

> It can be used to construct a set of related constants

言語仕様にもこのように説明があるので、列挙的な実装をしたいときに使うことが想定されていると受け取れます。

# Iota 識別子を使用した列挙的な実装

どのような実装が可能なのか、いくつか試してみます。

## 定数に int 型の値を設定する

### 実装

```main.go
package main

type TaskStatus int

const (
	notStarted TaskStatus = iota
	inProgress
	done
)

func main() {
	println("notStarted: ", notStarted)
	println("inProgress: ", inProgress)
	println("done: ", done)
}
```

### 実行結果

```shell
go run ./main.go
notStarted:  0
inProgress:  1
done:  2
```

0を最初としてインクリメントされた整数が定数の値として設定されていることが分かります。

## 定数に設定する値を0以外の任意の整数にする

### 実装

先ほどのコードに少し変更を加えます。

```main.go
package main

type TaskStatus int

const (
	notStarted TaskStatus = iota + 1
	inProgress
	done
)

func main() {
	println("notStarted: ", notStarted)
	println("inProgress: ", inProgress)
	println("done: ", done)
}
```

### 実行結果

```shell
go run ./main.go
notStarted:  1
inProgress:  2
done:  3
```

先ほどとは異なり、1を最初としてインクリメントされた整数が定数の値として設定されていることが分かります。

## 定数に float64 型の値を設定する

float64 の値を設定することもできるようです。

### 実装

```main.go
package main

type TaskStatus float64

const (
	notStarted TaskStatus = iota
	inProgress
	done
)

func main() {
	println("notStarted: ", notStarted)
	println("inProgress: ", inProgress)
	println("done: ", done)
}
```

### 実行結果

```shell
go run ./main.go
notStarted:  +0.000000e+000
inProgress:  +1.000000e+000
done:  +2.000000e+000
```

int 型の値を設定したとき同様、インクリメントされた値が設定されていることが分かります。

# 定数に設定する数値に意味がある場合、Iota 識別子は使用してはならない

いくつかの実装を試して、Iota 識別子により定数にインクリメントされた値を設定できることが分かりました。
このインクリメントされた値ですが、意味を持つことは危険です。

先ほどの例を振り返ります。

```main.go
package main

type TaskStatus int

const (
	notStarted TaskStatus = iota + 1
	inProgress
	done
)

func main() {
	println("notStarted: ", notStarted)
	println("inProgress: ", inProgress)
	println("done: ", done)
}
```

この実装により設定される整数に以下のように意味を持たせ、整数をアプリケーションロジックで扱うことを想定します。

- タスクステータス `1` = NOT STARTED
- タスクステータス `2` = IN PROGRESS
- タスクステータス `3` = DONE

ここでタスクステータスに新しい概念「PENDING」を追加したくなった際はどうでしょう。

新しい概念「PENDING」を扱うために以下の実装に変更しました。

```main.go
package main

type TaskStatus int

const (
	notStarted TaskStatus = iota + 1
	inProgress
	pending
	done
)

func main() {
	println("notStarted: ", notStarted)
	println("inProgress: ", inProgress)
	println("pending: ", pending)
	println("done: ", done)
}
```

実行してみます。

```
go run ./main.go
notStarted:  1
inProgress:  2
pending:  3
done:  4
```

定数 `done` の値が `3` から `4` に変わることでタスクステータス3は DONE ではなくなりました。
タスクステータス `3` = DONE としてアプリケーションロジックで扱っていた場合、アプリケーションロジックでこの変更に対応しない限りバグを生む可能性があります。

Iota 識別子は列挙的な実装が可能になる便利な言語仕様ですが、こういったリスクを意識して適切に使っていきたいですね。
【VSCode】スニペットを簡単に作成できるようにする方法


Snippet Generatorという拡張機能を使用すると簡単にスニペットを作成できます。

https://marketplace.visualstudio.com/items?itemName=wenfangdu.snippet-generator

![スクリーンショット 2024-06-22 23.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/1e0b64a1-b4d7-43a9-bbd2-74217ec89703.png)

スニペットを作成したいコードを選択してコマンドパレットから`Generate Snippet`を実行し、必要事項を入力するとスニペットを設定するためのオブジェクトがクリップボードに保存されます。

`Snippets Configure User Snippets`を実行します。

![スクリーンショット 2024-06-23 0.01.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/cccfb97c-6f77-ce0e-3f96-f49b1fc78078.png)


開いた設定ファイルにクリップボードの内容を貼り付けるとスニペットを使用できるようになります。

以下のようにショートカットキーを設定すると`Generate Snippet`の必要事項を入力した後に`Snippets Configure User Snippets`が実行されファイル選択できるようになり、より簡単に作成できます。

```jsonc:keybindings.json
{
  {
    "key": "任意のキー",
    "command": "runCommands",
    "args": {
      "commands": [
        "snippet-generator.generate-snippet",
        "workbench.action.openSnippets"
      ]
    }
  }
}

```
人生行き詰った記事を読んだらまったく行き詰っていなかった

ネットサーフィンしていたら以下の記事が目に留まりいろいろ思うところがあったので所感を書く。

https://qiita.com/saoyagi2/items/2c0bb9647ee9e16b7f4b

まず思ったことはまったく行き詰っていないということ。

> トータルで約 30 年のキャリアがあるわけですが、ほぼ全てでエンジニアでしたし、今後もエンジニアを続けたいと思っています。

こう思えること自体すばらしいことだと思う。これだけ技術が進化した30年という歳月の中でエンジニアを続けられるのは間違いなくその方の技術力の証だ。

> ウェブ系で主にサーバサイドのエンジニアをしていますが、その中で特に何が得意というものがありません。過去の経験でも、言語もフレームワークもばらばらです。

こういう方がいると現場はとても安心する。困ったらとにかく一番に相談しようと思える。とても頼りになる存在。

> 特定の言語やフレームワークの経験者として転職しても、会社によって細かなやり方の違いはどうしたってあります。業務知識も必要になります。なので転職して最初のうちは言われたことを言われたとおりにこなすメンバーレベルの業務になります。

メンバーレベルの業務をこなすことができるだけでリーダー層にとっては大いに助かるはずだ。

> 短期転職を繰り返したことで、履歴書の職歴欄が入りきらないくらいの量になってしまいました。履歴書を書くのが大変というのもありますが、採用側から見たら「どうせすぐに辞めるよね」って判断されがちなのはありそうです。

私が採用側だったらそうは思わない。この方がどうすれば続けてくれるかを考える。

> そもそも自分が何をしたいのかを突き詰めて考えていなかったという問題もあります。何をしたいかを見定め、それを実現できる職場に転職するとか、プライベートでスキルを磨くとか出来ていればよかったんですよね。そういったことをせず、ただ単に状況に流されるままに過ごしてきたために今があるとしたら、自分の仕事人生に軸が無さ過ぎたのだなという反省があります。

「そもそも自分が何をしたいのかを突き詰めて考えていなかった」ということに果たしてどれだけ問題があるのだろうか？未来は予測できない以上状況に応じて対応するしかないと思う。突き詰めて考えたからといって理想の人生を歩めるとは限らないし、理想の人生を歩んでいる人は全員突き詰めて考えていたわけでもないと思う。理想の人生を歩めた人は努力できる環境とその努力を評価してもらえる環境がたまたま揃っていた「運が良い人」だともいえる。

持病のある人がどれほどの時間と労力をその克服に費やさねばならず、しかもその努力が社会で評価されるわけでもない。社会で「普通」とされるものに向かって進むことの虚しさを知っている人もいるだろう。そもそも「自分が何をしたいのかを考える自由」さえない人もいる。

この方が「状況に流されるままに過ごしてきた」ことや「自分の仕事人生に軸がない」ことも「人生が行き詰った」という結論にはつながらないように思える。

とても素晴らしいエンジニアだと思う。私はこういう方に同じプロジェクトにいてほしいと思う。
権限周りのエラー解消: 他ユーザーのテーブルの参照権限を付与する方法

# 権限周りのエラー解消: 他ユーザーのテーブルの参照権限を付与する方法

## 前提条件・背景
Oracleデータベースを使用していると、他のユーザーが所有するテーブルを参照する際に権限に関するエラーが発生することがあります。この問題を解決するために、特定のオーナーのテーブルに対して他のユーザーに参照権限を付与する方法をまとめました。

## 1. 権限を付与する目的
他のユーザーが所有するテーブルにアクセスするためには、適切な権限を持っている必要があります。権限が不足している場合、次のようなエラーが発生します。

```
ORA-00942: テーブルまたはビューが存在しません
```
又は
```
ORA-01031: 権限が不足しています
```

このエラーを解消するためには、対象のテーブルに対して参照権限を付与する必要があります。また、権限の設定が適切でない場合、特にストアドプロシージャ内でエラーが発生することがあります。

## 2. 具体的な手順

### 2.1 特定のオーナーのテーブル名を取得
まず、特定のオーナー（例: `OWNER_A`）が所有するテーブル名を取得します。以下のSQLクエリを使用します。

```sql
SELECT OBJECT_NAME 
FROM ALL_OBJECTS 
WHERE OWNER = 'OWNER_A' AND OBJECT_TYPE = 'TABLE';
```

### 2.2 PL/SQLを使って権限を付与
次に、取得したテーブルに対して、他のユーザー（例: `OWNER_B`）に`SELECT`権限を付与するためのPL/SQLブロックを作成します。

```sql
-- 実行ユーザー: OWNER_A
BEGIN
    -- OWNER_Aのテーブルをループして、OWNER_BにSELECT権限を付与
    FOR r IN (SELECT OBJECT_NAME 
              FROM ALL_OBJECTS  (※ないしはDBA_OBJECTS)
              WHERE OWNER = 'OWNER_A' AND OBJECT_TYPE = 'TABLE') 
    LOOP
        -- 動的にGRANT文を実行
        EXECUTE IMMEDIATE 'GRANT SELECT ON OWNER_A.' || r.OBJECT_NAME || ' TO OWNER_B';
    END LOOP;
END;
```

### 2.3 スクリプトの実行
このPL/SQLブロックを`OWNER_A`として実行します。これにより、`OWNER_A`が所有するすべてのテーブルに対して、`OWNER_B`に`SELECT`権限が付与されます。

## 3. 注意点
- このスクリプトは、権限を付与するための権限を持つユーザー（ここでは`OWNER_A`）として実行する必要があります。
- 事前に、`OWNER_B`が正しいユーザー名であることを確認してください。
- ※参照権限が不足している場合、他のオブジェクト（ビューやストアドプロシージャ）へのアクセスも制限されることがあるため、関連する権限をすべて確認することが重要です。

## 4. まとめ
Oracleデータベースにおける権限管理は非常に重要です。特に他のユーザーのテーブルを参照する際には、適切な権限を付与することでエラーを回避できます。権限付与していなくてテーブル参照出来ない際にはぜひご活用ください。
## 採用拡大中！
アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニア仲間を大募集しています！
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう！
お問い合わせはこちらから↓
https://official.assisteng.co.jp/contact/
エラー発生　画像が表示されない（解決済み）

## はじめに
前回同様ペット健康管理アプリの続き。
日記ページに写真とコメントを投稿したいがページに表示してくれない。
JPGファイルの写真を張りつけ各項目を入力しSENDを押すと以下エラーが出る。
```
NoMethodError in Diaries#index
app/views/diaries/index.html.erb where line #7 raised:

undefined method pet' for #<Diary id: 1, comment_text: "主人の帰りを待つ", pet_id: 1, room_id: nil, image: nil, created_at: "2024-11-11 13:20:54.224497000 +0000", updated_at: "2024-11-11 13:20:54.246260000 +0000", text: nil>
Extracted source (around line #7): 
5　　<%= image_tag diary.image if diary.image.attached? %> 
6 　<p><%= diary.comment_text %></p>
7　 <span class="name"><%= diary.pet.pets_name if diary.pet.present? %></span>
8 　</div> 
9 　<% end %>
10 　<% else %>
```
このエラーは、Diary モデルに pet という関連が定義されていないために発生。Diary モデルに Pet モデルとの関連付けが必要。
Diary モデルに belongs_to :pet を追加する
```app/models/diary.rb
class Diary < ApplicationRecord
  belongs_to :pet       #追記箇所
  has_one_attached :image  
  validates :comment_text, presence: true
end
```
## おわりに
アソシエーションもしっかり考えて実装します！
Java(Spring Boot)の単体テストはどのアノテーションを使えばいいか整理してみる

## はじめに
Spring Bootの単体テストを行う際、PJ先によって異なるな～と思ったので
どのテストパターン（アノテーション）で作成することが推奨されているのか整理してみました。

- 環境
    - 言語：Java
    - フレームワーク：Spring boot、JUnit、Mockito
- 対象
    - コントローラ
    - サービス
    - リポジトリ

## 結論
[公式ドキュメント](https://spring.pleiades.io/spring-boot/reference/testing/spring-boot-applications.html "公式ドキュメント")に全て書いてました。

ざっくり整理すると以下になります。
- コントローラ　→　＠WebMvcTest
- サービス　→　＠MockBean
- リポジトリ　→　＠DataJpaTest 

＠SpringBootTestでいいのでは？とも思ったのですが、一応SpringBootTestは”統合（結合）テスト”に分類されるものなので、PJや人によっては使い分けた方がいいという意見が出そうです。
今度骨組みとしていくつかパターンを書いてみようと思います。
kubuntuでDMM(FANZA)のゲームをする。

まず、wineを入れます。
```
sudo apt install wine
```
dll不足用にWinetricks
```
sudo apt install winetricks
```
次にdosbox
```
sudo apt install dosbox
```
ソフト電池確認をするのでmfc42をインストール
```
winetricks mfc42
```
そして日本語も
```
winetricks cjkfonts
```
![kubuntu [実行中] - Oracle VM VirtualBox 2024_11_11 21_36_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191607/4f00184a-21a9-a049-118c-ed43806e42e4.png)
こんな汚いメッセージが出ます。
ソフト電池はlinuxで動かない上、ガバガバ設計な悪い子なので消します。
```
hexdump --canonical [エロゲの名前].EXE | grep MZ
```
もしくは
```
hexdump --canonical [エロゲの名前].EXE | grep MZの後、MZ................のようなものを見つけます。それが次のMZです。今回はMZPです。
```
を実行します。
この中の、MZ
![kubuntu [実行中] - Oracle VM VirtualBox 2024_11_11 21_39_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1191607/74d1c180-d6d7-3e1a-18d5-bbaa53a3930b.png)
そしたら、MZ関連が出てきます。[00000000]~[次のMZオフセット]までがソフト電池です。
なので、
```
dd bs=1 skip=[次のMZオフセット] if=[エロゲの名前].EXE of=[エロゲの出力先].EXE
```
で削除できます。
そしたら起動OKです。
線形回帰についてまとめてみました

線形回帰（Linear Regression）は、データの間の線形な関係をモデル化するための基本的な統計手法の一つで、特定の変数（独立変数）に基づいて他の変数（従属変数）を予測するために使用されます。特に、変数間に線形関係があると仮定できる場合に有効です。

## 線形回帰の基本的な考え方

線形回帰では、次のような数式でデータの関係を表します：

```math
y = b_0 + b_1 x + \epsilon
```

ここで、
$・yは従属変数（目的変数）です。 $
$・xは独立変数（説明変数）です。 $
$・b_0は切片で、回帰直線がy軸と交わる点を示します。$
$・b_1は回帰係数で、独立変数 \( x \) の変化に伴う従属変数 \( y \) の変化量を表します。$
$・  \epsilon \ は誤差項で、モデルが説明できないランダムな要素を含みます。$

## 線形回帰の種類

### 1. 単回帰分析
   1つの独立変数と1つの従属変数の間の関係をモデル化します。例えば、ある商品の価格と販売数の関係を予測する場合などに用いられます。

### 2. 重回帰分析
   複数の独立変数が存在する場合の回帰分析です。例えば、住宅の価格を予測する際に、広さ、立地、築年数など複数の変数が関係する場合に用います。

## 回帰係数の求め方（最小二乗法）

線形回帰では、与えられたデータに最もよくフィットする回帰直線を見つけるために、**最小二乗法（Ordinary Least Squares, OLS）** を用います。最小二乗法では、次のように誤差の二乗和（Residual Sum of Squares, RSS）を最小化することで、最適な \( b_0 \) と \( b_1 \) を求めます。

```math
\text{RSS} = \sum_{i=1}^{n} (y_i - (b_0 + b_1 x_i))^2
```

これにより、データに最もよくフィットする直線が得られます。

## 線形回帰モデルの評価方法

### 1. 決定係数
   回帰モデルがデータをどの程度説明できているかを示す指標です。決定係数$\( R^2 \)$の値は0から1の範囲で、1に近いほどモデルがデータに適合していることを示します。

### 2. 平均絶対誤差（MAE）
   実際の値と予測値の差の絶対値の平均で、モデルの誤差の大きさを示します。

### 3. 平均二乗誤差（MSE）と二乗平均平方根誤差（RMSE）
   誤差の二乗平均を取ることで、外れ値の影響を受けやすくなりますが、モデルの精度を評価するのに有効です。

## 線形回帰の仮定

線形回帰モデルは以下の仮定の下で成り立っています：

1. **線形性**：独立変数と従属変数の間の関係が線形である。
2. **独立性**：観測値間に相互依存がない。
3. **等分散性（Homoscedasticity）**：誤差の分散が一定である。
4. **正規性**：誤差項が正規分布に従う。

これらの仮定が成り立っていないと、モデルの精度や解釈が難しくなることがあります。

## 線形回帰の応用例

- **マーケティング**：広告費と売上の関係を予測する。
- **経済学**：GDPと消費支出の関係を調べる。
- **金融**：株価の動きを予測する。
- **医学**：健康指標と病気のリスクの関係を分析する。

## まとめ

線形回帰は、変数間の線形関係をシンプルにモデル化し、予測や分析に広く活用される手法です。データの背後にある関係性を明らかにするために有効ですが、仮定が成り立つことや適切な評価指標を用いることが重要です。
Power Platformで1環境に複数のDLPポリシーを適用した場合の動作と影響

# DLPポリシーの作成ができるセキュリティロール
基本的に、DLPポリシーの作成および適用は、Power Platform管理者や環境管理者など特定の管理者ロールが割り当てられたユーザーのみ可能です。また、Power Platform管理者は組織テナント単位で、環境管理者は環境単位でDLPの作成が可能です。詳細は、以下記事をご確認ください。

https://learn.microsoft.com/ja-jp/power-platform/admin/prevent-data-loss#tenant-level-policies


また、Teamsのチーム所有者でも、Dataverse for Teams環境に対してDLPポリシーの作成ができます。Dataverse for Teams環境上で、チーム所有者はシステム管理者が自動的に割り当てられます。詳細は、以下記事をご確認ください。

https://learn.microsoft.com/ja-jp/power-platform/admin/about-teams-environment#role-assignments

# 1環境に複数のDLPポリシーを適用した場合の動作

ここで以下のように、Dataverse for Teams環境に対して、Power Platform管理者がポリシーAを作成、チーム所有者がポリシーBを作成、と１環境に複数のDLPポリシーを適用した場合、どのような動作と影響が得られるのか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/b1ccf295-5b00-07fa-8c6f-13dd59a2c68b.png)

実際に、Power Platform管理センターで上記のポリシーを適用すると、以下の4グループに分類されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/5ff297c0-7f46-d939-0c4f-ad0522340b43.png)

個々のグループのコネクタのみを接続でき、4つの異なるグループ間でコネクタを接続することはできません。例えば、（ビジネス、非ビジネス）の場合、グループ内のコネクタ同士は接続および実行ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/6aee1dca-2dce-ac81-0f67-ded59917f501.png)

しかし、異なるグループのコネクタを接続しようとすると、DLPポリシー違反のエラーが表示されます。他のグループでも同様の動作になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3640497/615f8577-032c-4957-dcab-bb5418c05a15.png)


# 1環境に複数のDLPポリシーを適用した場合の影響
１環境に複数のDLPポリシーを適用すると、コネクタのグループが複雑に断片化されるロジックになっています。したがって、特定の環境に最小限のDLPポリシーを適用することを推奨します。詳細は以下記事をご確認ください。

https://learn.microsoft.com/ja-jp/power-platform/admin/dlp-combined-effect-multiple-policies#businessnon-business-classification-impact-across-multiple-policies
Sassを使ったレスポンシブ対応

# はじめに
学んだことを忘れないように備忘録として残しています

Sassを使い始めたらかなりレスポンシブの効率が上がったので、本記事ではその方法を紹介していきます！

## Sassとは
Sassは、CSSをより効率的に書くための拡張言語です。
変数やネスト、mixin、継承などの機能を使って、CSSコードを簡潔で再利用しやすく管理できます。Sassで書いたコードは最終的に通常のCSSにコンパイルされ、Webブラウザで使えるようになります。


## Sassを使用したレスポンシブ
例：スマホからPC・タブレットサイズのレスポンシブ

【元の記述】
```scss
  .top_news-ttl {
    font-size: 18px;
    font-weight: bold;
    margin-top: 10px;

    @media (min-width: 1080px) {
      font-size: 24px;
    }
  }
```


【Sassを使用した記述】
**1.mixinでブレイクポイントと＠mediaの記述を定義しておきます。**

```scss

$md: 768px;
$lg: 1080px;
$xl: 1200px;

@mixin mq($bp) {
    @media (min-width: ($bp)){
       @content; 
    }
}

```

※`@content` はmixin を呼び出したときに指定したスタイルをその場に挿入するためのものです。具体的には、mixin を使う側で書いたスタイルを `@content` の場所に差し込むことができます。

**2.style.scssにレスポンシブの記述をする**

```sass
.top_news-ttl {
    font-size: 18px;
    font-weight: bold;
    margin-top: 10px;

    @include mq($md) {
        font-size: 20px;
    }
    @include mq($lg) {
        font-size: 24px;
    }
  }
```

## まとめ
Sassを活用することで、効率的にレスポンシブ対応を実装できるようになります。
特に、mixinを使ってブレイクポイントを管理すると、メディアクエリの記述が簡潔になり、コードの再利用性も向上します。
Next.jsで実装する場合に、セキュリティ面で気を付けること

# はじめに

以下のYoutubeで解説されていた内容が勉強になったのでまとめた。

https://www.youtube.com/watch?v=LolugLiLhHs

# ポイント

・Propsで渡す情報に気を付ける

・SeverActionsに注意する

・認証チェックをする場所について

## Propsで渡す情報に気を付ける

Next.jsでは、サーバーコンポーネントと、クライアントコンポーネントがある。

例として、サーバーコンポーネント内で、ユーザー情報を取得して、クライアントコンポーネントにその値を渡してしまった場合、本来見られてはいけないユーザー情報がブラウザで見ることが可能になるので、とても危険な状態となる。

対策としては、「クライアントコンポーネントに余計な情報は渡さない。」ということ。

具体的な対策としては、以下の2点が挙げられる。

・SQLのSELECTのフィールドを必要最低限にする。

・DTOを使う。DTOについては以下のサイトに詳細が記載されている。

　https://qiita.com/RINYU_DRVO/items/112957b84ec8c2a4711a

## SeverActionsに注意する

具体的には、ServerActionsに渡す引数に注意する。ServerActionsは、ブラウザからAPIをfetchしているに過ぎないので、引数にユーザー情報(ユーザーID)などを渡して、それを元に処理を行う関数を実装してしまうと、クライアントからそのAPIに対して、自分以外のユーザーIDを渡して、ServerActions内の関数を呼べることができてしまうため、とても危険な実装といえます。

なので、ServerActionsを利用する場合は、権限やセッションのチェックなどは外部で行わず、関数内でチェックをするようにするのが良い。

## 認証チェックをする場所について

ログインなどの機能があった場合に、認証、認可のチェックをどこで行うべきか？

middleware、layout component、page componentなどの選択肢があるが、基本的には各page componentで行うのが、一番確実な方法となる。

理由としては、以下が挙げられる。

- Middlewareファイルでは、Edge Runtimeという、Web標準の機能でしか動かないようになっているため、~~Node.jsの全ての機能が使えず、SQLを実行することができない。~~
→Next.js15.2のアップデートで、Node.jsの機能がMiddlewareで使えるようになりました。
- layout componentは、page componentの後にレンダリングされるため、layout componentで認証や認可のチェックをしていない場合、画面上は動くかもしれないが、一時的にでもチェックを通過しないと見られないデータが、クライアントで取得されてしまうので、とても危険である。
また、layout componentは、ページ遷移しても再レンダリングされないため、画面遷移した時に、チェックがされないため、それも危険な要因の一つとなる。

以上の理由から、認証や認可のチェックは、各page componentで行うことが確実となる。

また、「updateUser」のような関数があった場合は、その情報操作をする関数内でチェックを行うのが良い。

# まとめ
Next.jsは、とても便利なフレームワークだが、使い方や機能をしっかり理解していないと、とても危険なアプリケーションを作成することができてしまうため、改めてしっかりキャッチアップする必要があるなと思った。

# 最後に
他にも色々な記事を書いているので、よければ読んでいってください！

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
開発を実際に行ってみて...

# 二年目を迎えて
仕事を始めて二年が経とうとしているので、これまでを振り返ってみようかと思います。去年はあまり書くことがなかったのですが、今年は今までの業務を通して学んだことや思った事を書いていこうかと思います。

今年の四月までは、コードをバリバリ書くということがありませんでした。
テストをやったり手順書通りにコードの修正を行ったりしていたのですが、なぜか自信に満ち溢れていましたが、開発の案件を実際にやってみてその自信は見事に打ち砕かれました。（笑）

## 最近の業務を通して感じたこと
今までの現場では設計書や仕様書がありとても分かりやすかったのですが、現在携わっている業務では基本テンプレートがなく実際にコードや仕様書を書くときはフリーフォーマットなので難しく感じます。その中で自分が感じたことや学んだことを今回は書いてきたいと思います。
# 今後作るときに気を付けること
テスト仕様書を書くときに、コードを読みながら書いているとたまに何を書いているかわからなくなってしまう時がありました。なので、テストする機能に対してどういう処理を追加したのいったん書き出して整理してから作ると、テスト項目の漏れや何を書いているのかわからなくなることが減ったので、テスト仕様書に限らず設計書や仕様書を作る際はしっかりと活用していきたいです。
次に、ソースコードについてです。今まではそんなに長いプログラムを書くことがなかったので、インデントや変数名は自分でわかればいいと思って作っていました。
しかし、業務ではほかの人が作ったプログラムを修正する作業などもあり色々なコードに触れましたが、インデントがしっかついていなかったり、変数名をａ，ｂ，ｃといった感じにつけているコードもあり初めて見たときにとてもわかりづらく感じました。なので、今後ソースコードを作るときはインデントであったり命名する時の約束ごとが業務上なくても自分の中でルールーを設け統一性があり、なおかつわかりやすくソースコードを作成していきたいです。
最後に、業務で使う資料についてです。業務をしていく中で資料を作成する場面などがありますが、チーム内で共有したりお客様への説明の際に使う資料を作成する際は相手が見てもわかるように資料を作成することを心がけています。しかし、自分の理解が深まるにつれてこの情報は載せなくても大丈夫かなと思うラインがどんどん下がっていき、しまいには説明を載せないとわかりずらい箇所まで省いている時がありました。今後、資料を作成する際に初めて資料を見る人でもわかるように資料の作成をしていきたいです。また、見せる資料だけではなく自分しか見ない資料でも意識しながら作成していきたいです。
# 最後に
この二年間を振り返ってみて、できるようになったことも多くあると感じる一方できていない事や、詰めが甘い箇所を知ることができたので、これからはしっかりと修正していきながらできることを増やしていきたいです。