OmniAICreator/Qiita-1.07M huggingface dataset:
【LeetCode in TypeScript】141.Linked List Cycle

## 問題
Given head, the head of a linked list, determine if the linked list has a cycle in it.

There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next pointer. Internally, pos is used to denote the index of the node that tail's next pointer is connected to. Note that pos is not passed as a parameter.

Return true if there is a cycle in the linked list. Otherwise, return false.

<br>
headが与えられたとき、そのリンクリストにサイクルが存在するかどうかを判定せよ。

リンクリストにサイクルがあるとは、リスト内のあるノードに、次のポインタをたどることで再び到達できる場合を指す。内部的には、tailの次のポインタがどのノードに接続されているかを示すためにposが使われる。ただし、posは引数として渡されない。

サイクルが存在する場合はtrueを返し、そうでない場合はfalseを返せ。

---
### Example 1:
- Input: `head = [3,2,0,-4], pos = 1`
- Output: `true`
- Explanation: There is a cycle in the linked list, where the tail connects to the 1st node (0-indexed).

### Example 2:
- Input: `head = [1,2], pos = 0`
- Output: `true`
- Explanation: There is a cycle in the linked list, where the tail connects to the 0th node.

### Example 3:
- Input: `head = [1], pos = -1`
- Output: `false`
- Explanation: There is no cycle in the linked list.


## 解答
```typescript
function hasCycle(head: ListNode | null): boolean {
    const check = new Set<ListNode | null>()
    let res: boolean = false
    
    while (head && !res) {
        check.has(head) ? res = true : check.add(head)
        head = head.next
    }
    return res
}

```

## 解説

この問題は、リンクリストにサイクルがあるかどうかを判断する問題です。サイクルが存在する場合、あるノードに再び到達できることになります。サイクルがない場合は、リストの終端に到達します。

***ハッシュセットを使用するアプローチ***
- リストを一つずつ進めながら、ノードをハッシュセットに追加していく
- もし、現在のノードがすでにハッシュセットに存在する場合、サイクルがあると判断できる
- リストの終端に到達した場合、サイクルは存在しないと判断する
- このアプローチの時間計算量はO(n)であり、空間計算量もO(n)
 ※ノードの数だけハッシュセットに保存するため
***

https://leetcode.com/problems/linked-list-cycle/
EC2 amazon linux にPythonを入れてみよう　入門２　仮想環境やライブラリ構築

Amazon EC2のAmazon LinuxインスタンスにPythonライブラリをインストールする方法を説明します。以下の手順に従ってください。

1. **EC2インスタンスに接続**:
   ```bash
   ssh -i "your-key.pem" ec2-user@your-ec2-instance.amazonaws.com
   ```

2. **パッケージインデックスを更新**:
   ```bash
   sudo yum update -y
   ```

3. **Python3をインストール**:
   ```bash
   sudo yum install python3 -y
   ```

4. **仮想環境を作成**:
   ```bash
   python3 -m venv myenv
   ```

5. **仮想環境を有効化**:
   ```bash
   source myenv/bin/activate
   ```

6. **pipを使用してライブラリをインストール**:
   例えば、`requests`ライブラリをインストールする場合:
   ```bash
   pip install requests
   ```

7. **仮想環境を無効化**:
   ```bash
   deactivate
   ```

この手順で、EC2インスタンス上にPython環境を整え、必要なライブラリをインストールできます。: [Amazon Linux 2でのPythonインストール方法](https://repost.aws/ja/knowledge-center/ec2-linux-python3-boto3)
²: [QiitaのPython3インストールガイド](https://qiita.com/kenta1984/items/2403ad9cb240522f6d1e)
³: [Free Hero BlogのPython3.8インストール方法](https://freeheroblog.com/ec2-python38/)

Source: Conversation with Copilot, 9/15/2024
(1) Amazon Linux 2 で Boto 3 ライブラリを使用して Python 3 環境を作成する. https://repost.aws/ja/knowledge-center/ec2-linux-python3-boto3.
(2) 【2020年版】AWSのEC2にPython3をインストールする方法 #Python - Qiita. https://qiita.com/kenta1984/items/2403ad9cb240522f6d1e.
(3) 【AWS】EC2にpython3.8をインストールして使えるようにする | Free Hero Blog. https://freeheroblog.com/ec2-python38/.
(4) 【AWS・EC2】python3の仮想環境構築と.pyファイル実行 & 対話モードに入る方法. https://prograshi.com/platform/aws/ec2-python3/.
EC2 amazon linux にPythonを入れてみよう　入門

AWS EC2 インスタンスに Python をインストールする方法についてです。

以下の手順に従ってください。

### Amazon Linux 2 の場合

1. **パッケージリストの更新**:
   ```bash
   sudo yum update -y
   ```

2. **Python 3 のインストール**:
   ```bash
   sudo yum install python3 -y
   ```

### Ubuntu の場合

1. **パッケージリストの更新**:
   ```bash
   sudo apt update
   ```

2. **Python 3 のインストール**:
   ```bash
   sudo apt install python3 -y
   ```

3. **pip のインストール**:
   ```bash
   sudo apt install python3-pip -y
   ```

### Python と pip のバージョン確認

インストールが完了したら、以下のコマンドでバージョンを確認できます。

```bash
python3 --version
pip3 --version
```
サンプル画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1333535/df94c46c-705c-13b8-fb60-e7a2b7bb66df.png)


これで、EC2 インスタンスに Python と pip がインストールされ、使用できるようになります

Source: Conversation with Copilot, 9/15/2024
(1) Easily install Python 3 and Pip on an EC2 Instance. https://towardsthecloud.com/amazon-ec2-install-python-pip.
(2) 【AWS】EC2にPython3の環境を構築する方法ご紹介。. https://tomoblog.net/programing/aws/ec2-python3/.
(3) 【2020年版】AWSのEC2にPython3をインストールする方法 #Python - Qiita. https://qiita.com/kenta1984/items/2403ad9cb240522f6d1e.
(4) 【AWS】AWSのEC2でPythonのFlaskサーバーを構築する方法。. https://tomoblog.net/programing/aws/ec2-python-flask/.
Oracleの統合監査とは？

Oracleの統合監査（Unified Auditing）は、Oracle Database 12c以降で導入された監査機能で、従来の標準監査に比べて、より効率的で統一された監査ログ管理を提供します。統合監査は、複数の監査機能（標準監査、ファイングレイン監査、RMAN監査、データベース Vault監査など）を一つのフレームワークに統合し、パフォーマンスを向上させつつ、監査の一元管理を実現します。

**主な特徴**
**1. 一元的な監査フレームワーク:**
- 従来の標準監査やファイングレイン監査を含む複数の監査タイプを統合し、すべての監査データを単一の監査トレイル（`UNIFIED_AUDIT_TRAIL`）に格納します。
- これにより、監査データの管理が簡素化され、監査設定やクエリの実行が容易になります。

**2. パフォーマンスの向上:**
- 統合監査では、監査データの記録が以前の方法よりも効率的で、パフォーマンスへの影響が低減されています。データベースのトランザクション処理とは独立して監査データを収集するため、アプリケーションのパフォーマンスに悪影響を与えにくくなっています。

**3. 監査ポリシーの柔軟な定義:**
- 統合監査では、監査ポリシーを定義し、どの操作やイベントを監査するかを柔軟に設定できます。これにより、特定の操作やユーザー、権限などに対してきめ細かい監査を行うことが可能です。
- 監査ポリシーは`CREATE AUDIT POLICY`文を使用して作成します。

**4. ログの一元管理:**
- 監査データは全て`UNIFIED_AUDIT_TRAIL`というビューに格納され、ここでログを管理・参照できます。これにより、監査ログのクエリが簡素化され、すべての監査データに対して統一的な検索や分析が可能です。

**5. デフォルトの監査ポリシー:**
- Oracleにはデフォルトでいくつかの監査ポリシーが提供されており、たとえばセッション作成や権限の使用に関する監査が標準で有効化されています。

**統合監査の設定**
**1. 統合監査の有効化:** 統合監査は、データベースの作成時に有効にするか、既存のデータベースで有効化することが可能です。データベースの作成時に統合監査を有効にするには、DBCA（Database Configuration Assistant）を使用して統合監査を選択します。

既存のデータベースに対して統合監査を有効化するには、次のコマンドを使用します：
```ruby:bash
$ sqlplus / as sysdba
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database open;
```
**2. 監査ポリシーの作成:** 統合監査では、監査ポリシーを定義して監査する内容を指定します。例えば、特定のユーザーや特定の操作に対して監査を行いたい場合、以下のようなコマンドを使用します：

- `SELECT`文を監査するポリシーの作成：
```ruby:sql
CREATE AUDIT POLICY my_select_audit
ACTIONS SELECT ON employees;
```
- 特定のユーザー（例えばSCOTTユーザー）に対する監査を有効化：
```ruby:bash
AUDIT POLICY my_select_audit BY scott;
```

**3. 監査ログの確認:** 監査ログは、`UNIFIED_AUDIT_TRAIL`ビューを使用して確認できます。このビューは、すべての統合監査のログを一元的に管理しています。
```ruby:sql
SELECT * FROM UNIFIED_AUDIT_TRAIL;
```
これにより、監査された操作、ユーザー、実行されたSQL文、実行時刻などの詳細情報を確認することができます。

**統合監査のメリット**
**1. 管理の簡素化:** 従来の複数の監査手法を一元化することで、監査ポリシーやログの管理が大幅に簡素化され、複雑な設定やログの分散を防ぎます。

**2. パフォーマンスへの影響が少ない:** 統合監査はパフォーマンスへの影響が小さく、特に大規模システムや高トランザクションシステムにおいて有効です。

**3. 包括的な監査機能:** 統合監査では、データベースのSQL文実行だけでなく、Oracleのさまざまなコンポーネント（例：RMAN、Oracle Data Pump、ファイングレイン監査など）に対しても監査を行うことができます。

**4. 高度なセキュリティ要件に対応:** 統合監査は、企業のセキュリティ要件やコンプライアンス要件に対応するために設計されており、特に法規制に準拠した監査証跡を確保するために有効です。

**まとめ**
Oracleの統合監査は、データベースのあらゆる操作やイベントに対する監査を一元的に管理し、パフォーマンスを向上させながら高度な監査機能を提供するシステムです。これにより、企業はデータベースのセキュリティを強化し、コンプライアンス要件を満たすことが可能になります。統合監査の導入により、複雑な監査要件にも柔軟に対応できるため、監査の管理が一層効率的になります。
firebase authで投稿した本人かどうかを判別する

# はじめに
認証にFirebase Auth、DBにsupabaseを利用したアプリで投稿した本人だけが削除や編集などの処理を行えるようにする方法を書いていきます。(ライブラリはReactです)
# 手順
firebase authでなくても似たような処理になるかと思います。
```
① Firebase Authから今ログインしているユーザーのユーザーIDを取得
② 何かをDBに追加する際(例えばTODO)に一緒にユーザーIDもDBに入れる
③ もし今ログインしているユーザーIDと投稿に紐ずくユーザーIDが同じなら処理できるようにする
```
前提としてfirebase authでの認証処理は実装済みでDBにはsupabaseを利用しているものとします。今回は簡単にTODOっぽいアプリで見ていきます。

### 1. firebase authで現在ログインしているユーザーのIDを取得
```App.tsx
import React from 'react';
import { getAuth } from 'firebase/auth';

const App = () => {
  // firebase authで現在ログインしているユーザーのIDを取得
  const auth = getAuth();
  const currentUserId = auth.currentUser?.uid;

  return (
    {/* 省略 */}
  );
};

export default App;
```
### 2. TODOを追加する際に一緒に現在のユーザーidも入れる
TODOのタイトル、詳細と一緒にuser_idもDBに入れます。supabaseでの関数でいうと以下のようになるかと思います。
```supabasefunctions.ts
export const addTodo = async (title:string,description: string,user_id: string) => {
    await supabase.from("TODO").insert({title,description,user_id})
}
```
### 3. もし今ログインしているユーザーIDとTODOに紐ずくユーザーIDが同じなら削除等のボタンを表示させる
先ほどのApp.jsxにTODOのコードを追加します。
```App.tsx
import React from 'react';
import { getAuth } from 'firebase/auth';

const App = () => {
  const [todos, setTodos] = useState([]);
  
  // Firebase authで現在ログインしているユーザーのIDを取得
  const auth = getAuth();
  const currentUserId = auth.currentUser?.uid;

  // supabaseのDBからTODO表示、追加、削除の関数も記述(今回は省略)

  return (
    <div>
      <ul>
        {todos.map((todo, index) => (
          <li key={todo.id}>
            <p>{todo.title}</p>: {todo.description}
            {/* todo追加の際のuser_idと現在ログインしているuser_idが同じなら
            　　　　　　　　削除ボタンを表示する */}
            {todo.userId === currentUserId && (
              <button 
                onClick={() => onClickDeleteTodo(todo.id)} 
              >
                削除
              </button>
            )}
          </li>
        ))}
      </ul>
    </div>
  );
};

export default App;
```
詳細にTODOアプリのコードを記述するとかなり長くなってしまうので、今回は省略しました。

# おわりに
自分だけでなく複数のユーザーが使うアプリになると結構必要になる気がします。supabaseの認証機能もいつか使ってみたいです。
ノーズカーブとニュートンラフソン法

# はじめに
変圧器のタップ切り替えによる電圧不安定現象はノーズカーブを用いて説明することができる。そこで今回は、受電電力から受電端電圧を導出する関数を用いて、受電端電圧が与えられているという条件のもとで受電電力の有効電力成分を方程式を解くことでノーズカーブを描写する。ただし、方程式の解の近似値を求めるために、本記事ではニュートンラフソン法を用いるものとする。

# モデル
## 方程式の導出
以下のような短距離送電モデルを考える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/20c4ba40-5c1f-5570-a2e7-fd74624e10b0.png)

受電端電力を$\dot{S_r}=P_r+jQ_r$とおくと、

```math
\dot{S_r}=V_r\bar{I}
```

と表すことができる。したがって、

```math
\bar{I}=\frac{\dot{S_r}}{V_r}=\frac{P+jQ}{V_r}
```

となる。ここで、両辺の共役複素数を取ると以下のようになる。
ただし、$V_r$は位相の基準であるとする。（つまり実数なので共役を取っても実数のままで変化しない）
```math
\dot{I}=\frac{P-jQ}{V_r}=\frac{P-j(Ptan\theta)}{V_r}
```
ただし、$\theta$は負荷の力率角であるとし、解析中は一定の値であるとする。

次に、キルヒホッフの法則より、

```math
\dot{V_s}=V_r+jx\dot{I}
```

となることから、

```math
\dot{V_s}=V_r+jx(\frac{P-jQ}{V_r})=V_r+jx\frac{P-j(Ptan\theta)}{V_r}
```

と$\dot{V_s}$を表現することができる。ここで、送電端電圧と受電端電圧の位相差を$\delta$として、$V_s$を一定の値とすると以下のことが成立する。


```math
\dot{V_s}=V_s e^{j\delta}
```

ゆえに、

```math
|\dot{V_s}|-V_s=0
```

これは、複素数平面上では円を表す。

以上の考察より以下の方程式が成立する。
```math
f(P)=|V_r+jx(\frac{P-jPtan\theta}{V_r})|-V_s=0
```

したがって、$V_r$が与えられている場合、$P$に対する方程式$f(P)=0$を解くことができれば$P$が経験上一意に決まるので、ノーズカーブを描写することができると考えられる。

ここで、上記の$P$に対する方程式を解く方法を考える。

今回は、二分法とは異なり、初期解を一つ定めるだけで解を推定することができるニュートンラフソン法を用いて解くこととする。

## ニュートンラフソン法について
ここで、簡単にニュートンラフソン法についておさらいする。

初期解付近で単調な関数(初期解付近に解がただ一つしか存在しないような関数)の方程式の解を推定することを考える。つまり、以下のような方程式である。

```math
g(x)=0
```
ここで、以下のような漸化式を考える。ただし、$x_1$は初期解であり、人為的に決定する。


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

という数列を考えたとき、$x_n$は$n$が十分に大きければ方程式の解とほとんど等しくなる。
# プログラム
そこで、以下のようなプログラムを作成した。

``` python nose_newton.py
import numpy as np
import matplotlib.pyplot as plt
import math
import japanize_matplotlib
h=1.0*10**-10
n=100
x=1.0
r=0.0
V_s=1.0
theta=math.pi*60/180
def equation(P,V_r):
    Q=P*np.tan(theta)
    I=(P-1j*Q)/V_r
    V_s2=V_r+1j*x*I
    return abs(V_s2)-V_s
# V_r=0だと、Iの分母が0になるので、V_r=0.01からスタート
V_r_array=np.linspace(0.01,1,n)
P_array=[]
for i in range(n):
  V_r=V_r_array[i]
  # ニュートンラフソン法
  # 初期値P=1.0[p.u.]
  P=1.0
  while abs(equation(P,V_r))>1.0*10**-13:
    diff_equation = (equation(P+h,V_r)-equation(P,V_r))/h
    P=P-equation(P,V_r)/diff_equation
    #print(x)
  P_array.append(P)
plt.title("ノーズカーブ")
plt.xlabel("P")
plt.ylabel("V_r")
plt.plot(P_array,V_r_array)
plt.savefig("ノーズカーブ_ニュートンラフソン法.png")
plt.show()
```

このプログラムを実行すると以下のようになる。

![ノーズカーブ_ニュートンラフソン法.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/9ef906b6-9460-9745-0a3e-beee12eb2b6f.png)

このグラフの上半分は電圧安定状態の範囲であり、下半分は電圧不安定の範囲である。

例えば、グラフの上半分を満たすような負荷を接続して、$P$を増やす、つまり重負荷にした場合を考える。その場合、上半分の領域では、受電端電圧$V_r$が低下するので、結果として$P$も低下する。このように、$V_r,P$に対して負のフィードバックが働くため、結果として安定になる。この考え方は制御工学を参照されたい。


# まとめ
今回は、複素数とニュートンラフソン法を用いて、受電電力と受電端電圧の関係式（高次方程式）を解析することでノーズカーブを描写することを試みた。その結果、$V_r>0$の範囲において見事にノーズカーブを描写することができるということが分かった。この高次方程式は、複素数の絶対値と円の関係を用いた式であり、応用すると電力円線図も描写することができる。また、後半ではそのノーズカーブは、上半分の領域は電圧安定領域を示していて、下半分は電圧不安定領域を示している。これは、変圧器のタップ切り替えによる電圧不安定現象の基本的な原理であることを負のフィードバックと合わせて説明した。
Go初心者でもNext.jsとGoでWebアプリを作りたい！その3

# 写真の保存
今回はフロント側で撮った写真をバックエンドに送信し、保存する処理について取り扱います。

### 1. バックエンド側でupload処理を実装
```golang:usecase/upload_img.go

package usecase

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"net/http"
	"path/filepath"
)

func UploadImg(c *gin.Context) {
	file, err := c.FormFile("file")
	if err != nil {
		c.String(http.StatusBadRequest, "get form err: %s", err.Error())
		return
	}

	savepath := filepath.Join("./images", file.Filename)

	if err := c.SaveUploadedFile(file, savepath); err != nil {
		c.String(http.StatusBadRequest, fmt.Sprintf("upload error: %s", err.Error()))
		return
	}
	c.String(http.StatusOK, fmt.Sprintf("success", file.Filename))
}
```
この処理の流れとしてはformで送られてきたデータから、file=画像データを取得し、imagesフォルダ内に画像を保存するようになっています。

この処理をmain関数内で呼び出します。
```golang:main.go
package main

import (
	"fmt"

	"github.com/gin-gonic/gin"
	"next_go_app/backend/usecase"
)

func main() {

	router := gin.Default()

	router.GET("/", func(c *gin.Context) {
		fmt.Println("Hello")
		c.JSON(200, gin.H{
			"message": "Hello",
		})
	})

	router.POST("/upload", func(c *gin.Context) {
		usecase.UploadImg(c)
	})

	router.Run(":8080")
}
```
### ポイント
他のパッケージで実装した関数を別のパッケージで使用したい時
1. 関数を実装したファイルがあるフォルダをimport
```golang:main.go
import (
	"fmt"

	"github.com/gin-gonic/gin"
	"next_go_app/backend/usecase"
)
```

2.関数を使用する際は【パッケージ名.関数名】の形で呼び出す
```golang:main.go
//usecaseがパッケージ名

usecase.UploadImg(c)
```

## 2. フロントから画像を送信

### 課題
- `webcamRef.current?.getScreenshot()`で取得できる情報は画像のBase64形式のデータであるため、Blob形式に変換する必要がある

変換するための関数base64ToBlobをフロントで定義する
```javascript/page.tsx
const base64ToBlob = (base64: string) => {
    //Base64文字列のデータ部分を取得
    const byteString = atob(base64.split(",")[1]);

    //MIMEタイプの取得
    const mimeString = base64.split(",")[0].split(":")[1].split(";")[0];

    //バイトデータを格納
    const ab = new ArrayBuffer(byteString.length);
    const ia = new Uint8Array(ab);
    for (let i = 0; i < byteString.length; i++) {
      ia[i] = byteString.charCodeAt(i);
    }

    return new Blob([ab], { type: mimeString });
  };
```
このコードの内容は難しいです。
簡単にまとめるとatob()でBase64をバイナリデータに加工し、UTF-16文字コードに変換します。その後、UTF-16の文字列を引数として、Blobに変換するという流れになります。

次にフロントからバックエンドにデータを送る実装です。

```javascript/page.tsx
const sendImg = async () => {
    if (!url) {
      console.error("No image URL found");
      return;
    }

    const formData = new FormData();
    const blob = base64ToBlob(url);
    formData.append("file", blob, `${uuidv4()}.jpg`);

   try{
    await axios.post("http://localhost:8080/upload", formData, {
      headers: {
        "Content-Type": "multipart/form-data",
      },
    });
   }
   catch (e) {
     console.error(e);
   }
  };
```
写真をformDataに入れてaxiosを用いることでバックエンドに送信しています。ちなみにaxiosはfetchよりもpostとかを簡単に実装できるライブラリです。




### 参考サイト
https://qiita.com/fghyuhi/items/ff259f0068c08d2986a6
filemakerを利用する際のWindowsPCでのタスクスケジューラ設定方法

別端末のタスクスケジューラで実行していたfilemakerの処理を新規購入したWindows 11 Pro のデスクトップPCへ載せ替えたところ、実行できなくなったということがありました。そこであくまで自身の環境ベースにはなりますが、その際の検証結果に基づく設定方法をメモ的に記載しておきたいと思います。

以下２つのパターンについてそれぞれ記載します。
- A：Windowsへのログオンなしで起動したい場合
- B：Windowsへのログオンありで起動したい場合

## A：Windowsへのログオンなしで起動したい場合　※FMのバージョン19までしか出来ない
### 【環境】OS:Windows 11 Pro 23H2　FileMaker:FileMaker Pro 19

#### 全般タブの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872452/3a7b4aa5-d6da-0e56-c5cb-9365400fec3f.png)

#### 操作タブの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872452/212022c7-9e70-1d30-6a9c-79853b2f8c0f.png)

#### 設定タブの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872452/407b7f02-c6f2-432d-695d-2b6c1778b819.png)

## B：Windowsへのログオンありで起動したい場合　※FMのバージョン20以降はログオンなしでは起動出来ない
### 【環境】OS:Windows 11 Pro 23H2　FileMaker:FileMaker Pro 21

#### 全般タブの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872452/e6f97a83-bb06-b48e-5b9e-a2fe8951d402.png)

#### 操作タブの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872452/3b8f6004-1bd8-bc4c-ad30-c639188d9ad4.png)

#### 設定タブの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3872452/742848e0-54e2-32da-225d-117f25792484.png)
スコアが爆上がりしたAWS認定試験勉強法を紹介！

# はじめに
最近、AWSのAssociate認定資格を3冠しました！
（DEAとMLAから目をそむける）

スコアなどはこんな感じです！

|資格|取得時期|勉強期間|スコア|
|:-:|:-:|:-:|:-:|
|SAA|2024/4/20|1ヶ月（50h）   | 812  |
|SOA|2024/8/11   |2週間（20h）   |  **927** |
|DVA|2024/9/15|1週間（10h）   | **940**  |

最初にとったSAAと比べると、
DVA、SOAはかなり**高得点/短期間**でパスしていることが分かります。

実は、この2つの資格ではSAAと勉強方法を変えています。

そのおかげで、短期間で高得点を得ることができるほど、
効率的に、楽しく知識がインプットできました。

私がどんなやり方で勉強したかを紹介します！！！

# 結論
ずばり、**qiitaにアウトプットすること** です！！！
アウトプット最強！！
この結論に至った経緯を少し書きます。

## SAA取得時の勉強方法
SAAを勉強していた時は以下を4週ループし、試験に挑みました。

問題を解く → 解説を見る → ノートに物理メモする → 最初に戻る → … 

私の心は疲弊しました。得たものもありますが、遠回りだったように感じます。

## SOA, DVA取得時の勉強方法
以下を2週ループし、試験に挑みました。

問題を解く → 解説を見る
　→ qiita下書きにメモする → 気になった点のやってみた記事を書く
　　→ メモ下書きを追記・公開する → 最初に戻る → … 

勉強期間中、常に私はハイでした。
試験勉強をしているというより、知りたいこと・やってみたいことが、無数に湧き出てくるような心地でした。言い過ぎかもしれません。

しかし実際、問題集をループする数が減ったにも関わらず、
より高得点で認定試験をパスできたので、私にはかなり合っていた勉強方法だったんだと思います。

# アウトプット形式の紹介
上記した通り、勉強期間中は2つの形式でのアウトプットを行っていました。
ここからは、それぞれの形式について紹介していきます。

## ①「やってみた」系アウトプット
こんな感じのやってみた記事をいくつかアウトプットしました！

**SOAとるときのやつ**

https://qiita.com/suiwave/items/f0c492103f4797719a96

https://qiita.com/suiwave/items/fcb24640a631c74aa0ee

**DVAとるときのやつ**

https://qiita.com/suiwave/items/61b0ba11ef62f65dc5a3

https://qiita.com/suiwave/items/74ed9fe407124e333c81

qiitaにやってみた系のアウトプットすることのメリットは大きく二つあると思っています！

### メリット1：実際にやってみるとより詳細に理解できる
当たり前ですが、やってみた、はサービスの理解を加速させます！

文字で仕様を読むだけで記憶できることは少ないと思いますし、限界があります。
実際に触って、記事化するだけで、学びは何倍にもなります！！

また、実際に触ることで、サービスについて、
問題集の解説では書かれていなかった別の特徴を知るきっかけにもなると思います。
（Cognitoのユーザープール機能を試そうとした際に、ホストされたUI機能の存在を知る、、、など。）

しかも、実際にどう操作するのか？まで分かれば、
「資格なんて飾りでしょ～」派にもアンサーできるようになります！

### メリット2：試験勉強なのに楽しい

**ただ暗記するだけの試験勉強ってつまらなくないですか？**

SAA取得後、私の心は試験勉強へのヘイトで埋め尽くされました。
暗記だけの試験勉強、ツマラナイ・・・。もうやりたくない・・・。

SAAからSOA取得までに4か月あいた原因が、主にこれでした。

暗記知識もインプットしつつ、ガス抜きに手を動かすことで、ストレスなく勉強できると思います！

### ①「やってみた」系アウトプットのまとめ
- **実際に手を動かすことでより深い理解、より広い知識を得ることができる！**
- **暗記し続ける勉強とおさらば！**

以上です！
続けて2つ目のアウトプットの形を紹介します。

## ②「ざっくりメモ」系アウトプット
こんな感じのざっくりメモ記事をいくつかアウトプットしました！

**SOAとるときのやつ**

https://qiita.com/suiwave/items/9a2608733165efb3a11e

**DVAとるときのやつ**

https://qiita.com/suiwave/items/f4d45b0dc52201d7ded7

qiitaにざっくりメモ系のアウトプットすることのメリットは大きく二つあると思っています！

### メリット1：URLを一緒にメモしておける
これは物理メモにない最強のメリットだと思っています。

![cap1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/a525c959-3fde-abf1-f470-913ccca19d42.png)

私の記事の例です。
AWSの公式ドキュメントや、ネット上の参考記事を張り付けてます。

qiitaに記事を書くということは、ブラウザを開いているということです。
新しいタブで気軽に検索できますよね！！

リンクがあることで、いつでも簡単にふりかえりができますし、
ドキュメントなどを詳しく探す動機になります。

### メリット2：ネット上に残しておけるので、いつどこでも参照できる
これも物理メモと比べていいトコロだな～と思っています。
スマホでアクセスできるので、どこででも復習できます！

ちょっと弱いように聞こえるかもしれませんが、
メモをふりかえるハードルをぐっと下げてくれます。

![smartphone_gorogoro_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654730/07cf56c6-8033-af08-df28-7ed6eaea4ddb.png)

寝ころんだままでも見れます。

### ②「ざっくりメモ」系アウトプットのまとめ
- **せっかくなら・・・と、詳しいソースを添えたくなる！**
- **いつでも、どこでも、どんな端末からでもチェックできる！**

以上です！

# まとめ
まとめるほどのことを書いてるわけではない気がしますが、以上です！
とにかく、
- **実際にサービスを利用する**
- **アウトプットしてみる**

など、暗記だけで終わらせない方法で、
**楽しく**試験勉強してみて、うまくいきましたーという~~自慢~~ 報告でした！
Go初心者でもNext.jsとGoでWebアプリを作りたい！その2

# カメラ機能
今回はreact-webcamを使ってカメラを起動させていきます。
詳細は以下のサイトをご覧ください
https://www.npmjs.com/package/react-webcam


### 1.　react-webcamのインストール
```
npm install react-webcam @types/react-webcam
```
### 2.　page.tsxを変更する
```javascript:
"use client";

import { useRef, useState } from "react";
import Webcam from "react-webcam";
import Image from "next/image";

const videoConstraints = {
  width: 500,
  height: 500,
  facingMode: "user",
};

const Page = () => {
  const webcamRef = useRef<Webcam>(null);
  const [url, setUrl] = useState<string | null>(null);

  const capture = () => {
    const imageSrc = webcamRef.current?.getScreenshot() ?? null;
    setUrl(imageSrc);
  };

  return (
    <div>
      <Webcam
        audio={false}
        width={500}
        height={500}
        ref={webcamRef}
        mirrored={true}
        screenshotFormat="image/jpeg"
        videoConstraints={videoConstraints}
      />
      <button onClick={capture}>撮影</button>
      {url && (
        <Image
          src={url}
          width={500}
          height={500}
          alt="description of the image"
        />
      )}
    </div>
  );
};

export default Page;
```
これで、パソコンのカメラで撮影し、その写真がカメラの下の部分にプレビューとして表示できるようになりました。
(ちなみにこの実装では、facing modeをuserとしているので内カメラになっています。）

### 3.　http://localhost:3000/ にアクセスし、カメラを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862561/fe7aa2dc-c9e7-35ff-0d90-e5107f684d7d.png)

上部分がうちカメラになっており、下部分が直前に撮影した写真が表示されるようになっていたら、成功です！



### 参考サイト
https://dev.classmethod.jp/articles/get-image-with-react-webcam-and-typescript/
Oracleの標準監査とは？

Oracleの標準監査（Standard Auditing）は、Oracleデータベースにおける監査機能の一つで、特定のデータベース操作やSQLステートメントを追跡・記録するために使用されます。これにより、セキュリティやコンプライアンスを目的として、データベース上の重要な操作やユーザーの活動を監視することができます。

**主な特徴**
**1. SQLステートメントや操作の監視:**

- **SQL文レベルの監査:** 特定のSQL文（例: `SELECT`, `INSERT`, `UPDATE`, `DELETE`）が実行された際にその内容を監査することが可能です。

- **権限・オブジェクトレベルの監査:** 特定のデータベースオブジェクトに対してアクセスが行われたときや、ユーザーが権限を行使した場合も監視可能です。

**2. 監査の有効化と設定:**
- 監査を有効にするには、Oracleデータベースの初期化パラメータ`AUDIT_TRAIL`を設定します。例えば、データベースに監査データを保存する場合は`DB`、オペレーティングシステムのファイルに保存する場合はOSを設定します。
- 監査は以下のコマンドで個別に設定できます。
```ruby:sql
AUDIT <SQL文やオブジェクト> BY <ユーザー>;
```
**3. 監査データの出力先:**
- 監査データは、データベーステーブルやOSの監査ファイルに保存できます。
  - データベースに保存する場合: `AUD$`テーブルに記録されます。
  -  OSに保存する場合: 監査ログはファイル形式で、Oracleサーバの指定されたディレクトリに保存されます（通常は`$ORACLE_BASE/admin/<DB_NAME>/adump`）。

**4. 監査対象の柔軟な選択:**
- 監査はデータベース全体、特定のユーザー、あるいは特定のオブジェクト（テーブルやビューなど）に限定して実行することができます。
- 例えば、ある特定のユーザーが`SELECT`文を実行した場合のみ監査することも可能です。

`設定例`
- **セッションの作成に対する監査:**
```ruby:sql
AUDIT CREATE SESSION;
```
- **特定のオブジェクトに対するSELECT文の監査:**
```ruby:sql
AUDIT SELECT ON employees BY scott;
```
- **すべてのユーザーによるINSERT、UPDATE、DELETEの監査:**
```ruby:sql
AUDIT INSERT, UPDATE, DELETE ON employees;
```
**監査ログの確認**
監査が有効になった後、監査データは`DBA_AUDIT_TRAIL`ビューなどで確認できます。例えば、次のクエリで監査ログを確認します。
```ruby:sql
SELECT * FROM DBA_AUDIT_TRAIL;
```
このビューには、ユーザー名、実行された操作、実行時刻などの監査情報が含まれます。

**メリットと用途**
- **セキュリティの強化:** データベースへの不正アクセスや操作を検出し、監査証跡を残すことで、内部および外部からの攻撃に対する防御を強化します。
- **コンプライアンス対応:** 企業の内部統制や法的要求事項に基づいて、適切な監査ログを収集・保存できます。

**まとめ**
Oracleの標準監査は、データベース内の活動を詳細に追跡するための強力なツールです。データベースの安全性を確保し、監査要件を満たすために使用されます。標準監査はシンプルで導入しやすいですが、大規模な環境や複雑な要件を持つ場合には、より強力な統合監査（Unified Auditing）が推奨されることがあります。
SplunkでOracleの監査ログを取得する方法

SplunkでOracleデータベースのコマンド実行に関する監査ログを取得するには、Oracleの監査機能とSplunkのデータ収集機能を組み合わせる必要があります。以下にその基本的なステップを紹介します。

**1. Oracle監査ログの設定**
まず、Oracleデータベース側で監査を有効化する必要があります。Oracleには、標準監査と統合監査の2種類の監査方法があります。

**a. 標準監査 (Standard Auditing)**
Oracleの標準監査を使用すると、SQL文や特定の操作を監視できます。

- 監査を有効にするには、次のコマンドを実行します。
```ruby:sql
AUDIT CREATE SESSION;
AUDIT SELECT, INSERT, UPDATE, DELETE ON <table_name>;
```
- 監査ログの出力先は、`AUDIT_TRAIL`パラメータによって決まります。ファイルベースやデータベーステーブルに監査ログを保存することができます。監査ログの出力をファイルにするには、Oracle初期化パラメータを以下のように設定します。
```ruby:sql
ALTER SYSTEM SET AUDIT_TRAIL=OS SCOPE=SPFILE;
```
これにより、監査ログがOracleサーバーのファイルシステム上に出力されます。

**b. 統合監査 (Unified Auditing)**
Oracle 12c以降では、統合監査が使用可能です。統合監査では、複数の監査タイプを一元的に管理できます。

- 統合監査を設定する場合、次のように監査ポリシーを作成します。
```ruby:sql
CREATE AUDIT POLICY my_audit_policy
  ACTIONS SELECT, INSERT, UPDATE, DELETE ON <table_name>;

AUDIT POLICY my_audit_policy;
```
**2. Oracle監査ログの収集**
監査ログがファイルに保存されている場合、Splunk Forwarderを使ってそれらのログファイルを収集します。監査ログがデータベーステーブルに保存されている場合、Splunk DB Connectアプリを使用して直接データをクエリすることができます。

**a. ファイルベースの監査ログを収集**
1. Oracle監査ログの保存場所を確認します（通常は`$ORACLE_BASE/admin/<DB_NAME>/adump`）。
2. Splunk Universal Forwarderをインストールし、`inputs.conf`を設定して監査ログファイルを収集します。
3. Splunkサーバー側でデータをインデックスします。
```ruby:conf
[monitor:///path/to/audit/logs/*.aud]
index = oracle_audit
sourcetype = oracle_audit_log
```
**b. DB Connectを使った監査ログの収集**
1.  Splunk App for DB Connectをインストールします。
2.  Oracleデータベースに対する接続を設定し、監査ログが保存されているテーブル（通常は`SYS.AUD$`や`UNIFIED_AUDIT_TRAIL`）に対するクエリを作成します。
3. DB Connectで収集したデータをインデックスに保存します。

**3. Splunkでの監査ログの分析**
Splunkに監査ログが取り込まれたら、ダッシュボードやアラートを設定して分析を行います。

- Oracleの監査ログをフィルタリングするためのクエリ例
```ruby:splunk
index=oracle_audit sourcetype=oracle_audit_log | table _time, user, action, object, status
```
監査ログには、ユーザーが実行したSQLコマンド、実行時間、影響を受けたオブジェクト、操作の結果などの情報が含まれます。これを利用して、不正なアクセスや不正操作を監視することが可能です。

**まとめ**
1.  Oracle側で監査ログの設定を行う。
2.  Splunk ForwarderまたはDB Connectを使用して監査ログを収集する。
3.  Splunkでデータを可視化し、監視や分析を行う。

これらの手順を通じて、Oracleコマンドに関する監査ログをSplunkで効率的に管理することができます。
[CSS] backdrop-filterを設定する場所に気を付ける　backdrop-filterの適用にラグがあるときの改善策

## この記事の概要
親要素にtransition: opacityなどを設定していて、backdrop-filterの適用にラグが発生したときの改善策です。

![vid.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795435/e7393843-4ba1-7e22-271e-d954f7aa92cc.gif)

:::note info
結論：**transitionを設定している要素にbackdrop-filterを設定しましょう。**
:::

## コード例

```html:html
<div class="container">
  <img src="https://.jpg" alt="backdrop-filterがかかる画像" />
  <div class="parent-element">
    <div class="child-element" />
  </div>
</div>
```
:::note info
ラグが軽減する書き方

```css:css
.parent-element {
  backdrop-filter: blur(1rem);
  -webkit-backdrop-filter: blur(1em);
  
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 7rem;
  opacity: 0;
  z-index: 1;
  transition: opacity 0.3s;
}
.child-element {
  width:100%
  height:100%
}
@media (hover: hover) {
  .parent-element:hover {
    opacity: 1;
  }
}
```
:::
:::note alert
ラグが発生しやすい書き方

```css:css
.parent-element {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 7rem;
  opacity: 0;
  z-index: 1;
  transition: opacity 0.3s;
}
.child-element {
  backdrop-filter: blur(1rem);
  -webkit-backdrop-filter: blur(1em);
  
  width:100%
  height:100%
}
@media (hover: hover) {
  .parent-element:hover {
    opacity: 1;
  }
}
```
:::

最初はtransitionと同じ要素にbackdrop-filterを設定していても、構造の変更作業により別要素となってしまったときに起きやすいミスかと思います。
ラベルの使い方

for文でcontinueするときにラベル構文を使用すればデフォルトの場所とは別の場所にジャンプできる。ジャンプする場所は指定でき、continueの横に`ラベル名@`で指定した名前を記述する。
下記コードはラベル構文でcontinueする部分を指定している。

```kotlin
val towDArray: List<List<Int>> = listOf(
    listOf(1, 2, 3, 4, 5, 6, 7, 8),
    listOf(9, 10, 11, 12, 13, 14, 15, 16)
)

loop1@ for (firstItem in towDArray) {
    loop2@ for (secondItem in firstItem) {
        if (secondItem == 6) continue@loop1
        if (secondItem == 13) continue@loop1

        println(secondItem)
    }
}
// 1,2,3,4,5,9,10,11,12
```
ラベル構文はforの他にもforEachやwhile文などのループでも使用できる。
```kotlin
(1..10).forEach loop@{ }

loop@ while(x < 3){ }
```
#### 参考

https://www.miracleave.co.jp/contents/2175/post-2175/

https://midsatoh.github.io/kotlin/basic/
ABC371回答メモ

# 0.はじめに
　企業名を冠していないノーマルコンテスト。
　C問題が難しいと言うかめんどいと言うかだったので
　D問題を見たら簡単で解けました。
　と、いうわけでABDの3問クリアでレートは+21となりました。


# 1.A - Jiro
　しょっぱなからややこしい問題。
　最初はIF文で条件分けしようと思いましたが
　取りうる値が少ないので＜＞を３つtupleで辞書のkeyにし
　key毎に次男となる人を値に保持し
　読み込んだ値をもとに辞書の値を表示するようにしました。

~~~
#辞書の値
D[("<","<","<")]="B" #CBA
D[("<","<",">")]="C" #BCA
#D[["<",">","<"]]="x" #xxx　矛盾した組み合わせ
D[("<",">",">")]="A" #BAC
D[(">","<","<")]="A" #CAB
#D[[">","<",">"]]="B" #xxx　矛盾した組み合わせ
D[(">",">","<")]="C" #ACB
D[(">",">",">")]="B" #ABC
~~~

　https://atcoder.jp/contests/abc371/submissions/57744701

# 2.B - Taro
　凄い決まりのある国だなと思いつつ回答。
　太郎が生まれた家を保持する辞書を用意し
　太郎が生まれた＝辞書にない家で男が生まれたら
　Yesを出力して、辞書に家を追加
　それ以外ならNoを出力とし、AC。
　Aより簡単な気はしました。

　https://atcoder.jp/contests/abc371/submissions/57749316


# 3.C - Make Isomorphic
　試験中は解き方はなんとなくわかるものの、ちゃんと組み上げる
　自信がなく、D以降に流れてしまいました。
　コンテスト後、解説を見ても、思ったような面倒な解法でしたが
　回答をなぞって一応ACを取って置きました。

　辺を比較しやすくするため、2次元表に持ち、
　それと対応するようにコスト表を整形し
　itertools.permutationsで、H表の全パターン毎に
　辺を全列挙しながら、差異がある辺を比較していくという
　流れで実装しました。

　https://atcoder.jp/contests/abc371/submissions/57797220

# 4.D - 1D Country
　競プロで典型的な問題。
　XとPのリストと、Pを元に累積和を格納したSのリストを用意
　クエリのLとR毎に、X列から該当の位置を探し
　累積和をもとに間の村の人数合計を表示する感じでACとなりました。

　https://atcoder.jp/contests/abc371/submissions/57760470


# 5.E - I Hate Sigma Problems
　コンテスト中にCをあきらめたので、Dの後取り掛かりましたが
　正直さっぱりでした。

　コンテスト後解説を見て、答えは数字毎の連続部分列の個数の合計という説明を
　見て、目からうろこでした。
　【実装】
　　1.NとリストAを読み込む
　　2.辞書Dを初期化（D:キー＝リストAに存在する文字種、値＝キーがリストA内に現れる位置のリスト）
　　3.リストAを読み込み、辞書Dにキーと値を登録
　　4.解答用変数ansを0で定義
　　5.変数iに、Dのキーが無くなるまで読み出し
　　　-1.iが含まれる部分文字列をセットする変数sumをN×(N+1)÷２(N個のリストに存在する総連続部分列数)で初期化
　　　-2.リストpを[0]+D[i]+[N+1]で初期化(Aの先頭と後ろにiが存在するようリストを設定)
　　　-3.１～pの要素数の間、jを1ずつ繰り上げして繰り返す
　　　　-1.sumから、(p[j]-p[j-1]-1)*(p[j]-p[j-1])÷2(iが存在しない区間の総連続部分列数)をマイナス
　　6.ansを出力して終了

　https://atcoder.jp/contests/abc371/submissions/57802807


以上
rspecを実行したらWebdrivers::VersionError:になった

自分用備忘録
（初心者のため、間違っていたら教えていただけると幸いです。）

課題のクローンしたアプリケーションに記載されていた
rspecで書かれたテストを実行したらWebdrivers::VersionError:となったので、原因を探した。

chromeのバージョンは、128.0.6613.138

[解決策]
webdriverのgemを消して、再度インストールし、selenium-webdriverを使うことにした。

gemlockには
selenium-webdriver (4.24.0)
webdirverがあったので、webdriverを削除
bundle installする


bundle update selenium-webdriver capybara
をして最新バージョンにする。

Installing capybara 3.40.0 (was 3.35.3)
Bundler attempted to update selenium-webdriver but its version stayed the same
Bundle updated!
(seleniu-webdriverは既に最新バージョンでした。)

rspecを実行したら無事できました。

他にもエラーに書かれていた
Webdrivers::Chromedriver.required_version = "128.0.6613.138"をrspec_helper.rbに記載してみたが、変わりませんでした。

このエラーに関して色々な記事があったので、参考にしてみたい！
ネット回線の速度はエンジニアの生命線です

# はじめに
インターネットは、現代の業務において欠かせないインフラの一つです。特にネット回線の速度は、業務の質や効率に直接影響を与えます。本記事では、エンジニアの視点から、ネット回線の速度が業務効率にどのような影響を与えるかを記載します。（タイトルはちょっと大げさかもしれませんが、賛同いただける方も多いはず…）

# 作業に与える影響
## 日常的に行う業務
エンジニアだけでなく、多くの職種に共通する日常教務では、回線速度が重要な役割を果たします。以下は、ネット回線が関与する主な作業の例です。

- メールやチャットの送受信、内容確認
- クラウドサービスの利用（自分メモや報告、翻訳など）
- ビデオ会議・リモート会議
- 技術情報の収集や調査・検索

## エンジニア特有の業務
一方、エンジニアに特有のネット依存作業があります。これらは、特に回線速度の影響を受けやすい作業です。

- 開発環境の構築（apt や pip でのパッケージインストール）
- GitHubなどからコードのpull/push
- 大容量ファイルのダウンロード（AIモデル、フリーソフトなど）

## 効率低下とストレス
ネット回線の速度が遅いと、さまざまな作業に悪影響が出ます。作業効率の低下はもちろん、ストレスの原因にもなります。ここでの「遅い」とは、ダイアルアップ程度の速度を指しています。

### メールやチャットの送受信
遅延は大きくないものの、数秒のラグが毎回・日々積み重なると、結果的に無視できない時間ロスが生じます。

### クラウドサービスの利用
ネットワークの遅さにより、入力した文字が反映されなかったりすることで修正作業が発生し、生産性が低下します。また、ストレスも増します。例えば、「あ**い**うえお」と入力したのに、非同期通信により「あうえお」と反映される場合です。漢字変換を必要とする場合は、再入力することになります。

### ビデオ会議・リモート会議
音声や映像が途切れたり、会議の進行が滞ったりすることで重要な議論が中断されたりします。これは、出席者全員の時間が無駄になります。また、コミュニケーションミスが発生するリスクも発生します。

### 技術情報の収集や調査・検索
ウェブ検索の遅延により、調査がスムーズに進まないことで、作業が効率的に進まなくなります。また、リソースを遅延ロードするページも多く、スクロールなどももたつきストレスになります。

### 大容量データの送受信
エンジニア特有の作業では、数十MBから数GB規模のファイルを扱うことが多く、ネットワークの遅延があると、作業全体が大幅に遅れ、順序の入れ替えや追加作業が必要になります。

例えば、操作のタイムアウトが発生したり、ハンドシェイクや認証に失敗したりするため、回線速度が混雑していない深夜帯にダウンロードするスクリプトやcronなどをセットする追加作業を余儀なくされます。

# 効率化と回線速度の盲点
## 業務効率化の取り組み
近年、多くの企業が「業務効率化」や「DX（Digital Transformation）」に取り組んでいます。
※DXをただの「デジタル化」と勘違いしている場合が多いことは一先ず置いておきます

例えば、勤怠入力やワークフローがオンライン化されたり、ローカルサーバからクラウド環境への移行なども進んでいるでしょう。

## 回線速度が見落とされている現実
オンライン化により、プロセス自体は効率化されているものの、回線速度への配慮が欠けているように感じています。特に、従来のローカルサーバからクラウドへの移行が進む中、貧弱な回線環境では作業効率が逆に低下してしまうこともあります。

# 回線速度が遅い原因
## 理想的な速度
ネット回線の理想的な速度は用途によって異なると思いますが、[BUFFALO社の記事](https://www.buffalo.jp/topics/select/detail/wifi-speed.html)によると、以下のようです。

- すべてが快適（100Mbps）
- 高画質動画が快適（30Mbps）
- 標準画質動画・ブラウジングが快適（10Mbps）
- テキスト送受信が快適（1Mbps）

全てを快適に、、、と贅沢は言いませんが、数GBクラスのデータ送受信を行うケースもあるため、30Mbpsくらいは欲しいところです。単純計算だと、同時アクセス330人程度で10Gbpsのプラン契約、ぐらいが理想と言えそうです。

## 実際の環境での問題点
回線速度は、契約プランや使用人数によって大きく変動します。また、導入されている環境（wifi、proxyやVPNなど）によっても変動するため、原因を一概にコレとは言えません。

例えば、10 [Gbps] のプランを契約していても、1,000 人が同時に使用するのであれば、単純計算で一人当たり10 [Mbps] の割り当てとなります。10,000 人だと1 [Mbps]です。複数端末を常時利用している場合は、もっと低くなります。

また、HTTP時代に複数人の利用下で活躍していたproxyですが、今はHTTPSが主流。速度の観点では全く寄与しません。逆に、社外への通信がproxyサーバに集中するため、低スペックなサーバや負荷分散していない場合だと、通信速度を遅くするボトルネックである可能性すら出てきます。

# おわりに
ネット回線の速度が業務効率に与える影響は無視できないものです。遅い原因は会社や環境によって様々だと思いますのが、自社の回線速度やネットワーク環境について再考するきっかけとなれば幸いです。

ちなみに、私の会社の回線速度は、混雑時（主に定時内）に「bbps～数百kbps」です（タイポではなく「バイト」です）。作業効率を著しく下げている要因だと日々感じており、本記事を投稿しました。

他の会社ではどのようなものか、皆さんの職場での回線速度や改善事例などがあれば、是非コメントで教えていただけると幸いです。「○時にXXXサイトを見ると、YY [bps] でした！」など、可能な範囲で共有ください。
Docker コマンド + 学習したことの備忘録 

### 実行中のコンテナを確認
```
docker ps -a
```

### docker imageの作成（dockerfileを作成して）

```
# IMAGE名は小文字で記述する

docker build -f ./Dockerfile -t IMAGE:TAG .
docker build -f ./Dockerfile -t opencti:bash .

#もしくわ

docker build -f ./Dockerfile -t opencti:latest .
```

### コンテナの起動

```
docker run -it IMAGE
```

### すべてのコンテナを停止
```
docker stop $(docker ps -aq)
```

### コンテナの一括削除（コンテナを停止してから）
```
docker rm $(docker ps -aq)
```

### 1行で実行
```
docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
```

### Processを切ってコンテナから出る

```
exit
```

#### exitしたらコンテナを削除する

```
docker run -it -rm containerID TAG
```

### Processを残したままコンテナから出る

```
docker detach
```

### コンテナの再起動

```
docker restart
```

### 実行中のコンテナ内でコマンドを実行する

```
docker exec containerID command
```

### commitして更新する

```
docker commit containerID IMAGE:update
```

### Imageを別名で保存する

```
docker tag IMAGE:update userName/repoName
```

### Docker Hubにpushする

```
docker push userName/repoName
```

---
### docker インストラクション

#### FROM -> OSを指定する

#### RUN -> RUN毎にレイヤーが追加される

最小限のレイヤーにするためにコマンドは&&で繋ぎ、\で改行する

インタラクティブなインストールにはオプションの-yを指定する。

#### USING CACHE

docker fileはCACHEを使って作成し、

コマンドが通るのを確認してからRUNにまとめて書く。

#### COPY -> ファイルのコピー

COPY文は&&繋げない

```
COPY fileName PATH
```

#### ADD

tarファイルをコピーして解凍する

#### CMD -> ファイルの最後に記述する

```
# CMDと[]の間にはスペースが必要

CMD ["COMMAND","PARAM1","PARAM2"]
```

#### WORKDIR

実行ディレクトリを変更する

```
WORKDIR 絶対PATH
```

#### ENV -> 環境変数の設定

```
ENV key value
```

---
### ホストとコンテナの関係

ホストのファイルシステムをコンテナにマウントする

```
# DIR=任意の名前、newDir/にホストにあるファイルが見える（コンテナにファイルがあるわけではない）
# ホストのファイルを更新するとプロンプトにupdatedと表示される
# dirの作成はdockerが行ってくれる（:/newDir）

docker run -v ~Desktop/DIR:/newDir IMAGE TAG
```

#### ユーザIDとグループIDを指定してコンテナをRUNする

```
docker run -it -u $(id -u):$(id -g) -v ~Desktop/DIR:/newDir IMAGE TAG

# コンテナではユーザIDを認識しない(I have no name)
```

#### ホストとコンテナをポートを指定して繋げる

```
docker run -p 8888:8888 IMAGE TAG
```

---
### :sunglasses:　Memo

#### コンテナは実行環境として使用し、ホストのファイルシステムをコンテナにマウントする

#### DockerHubで命名するリポジトリ名は - で繋ぐ

```
my-repo123
```

#### docker build -t でimage名を指定しないとダンクリングイメージが生成される

```
# ダングリングイメージは<none>と表示される

<none> 

# そのため、docker build -t でimage名を指定してimageを作成する
```

#### ファイルサイズを考慮して作成する

---
#### build context（docker_dir）について

- buildに使わないファイルはbuild contextに格納しない。

- 大きいファイルはtarで圧縮してADDで解凍する

- オプション -f（dockerfileが複数ある場合）

```
docker build -f PATH/fileName .
```

---
#### パーミッション（アクセス権限）

```
# Iから始まるのはシムリンク、dから始まるのはディレクトリ、-から始まるのはファイル

# r:読み取り、w:書き込み、x:実行

# 所有者、所有グループ、その他の順に表示される
```

### コンテナがアクセスできる上限のCPUを設定

```
# 重要度の高いコンテナ: 2-4コア
# 中程度の重要度のコンテナ: 1-2コア
# 軽量なコンテナ: 0.5-1コア

docker run --cpus=2 your-image
```

### コンテナがアクセスできる上限のメモリを設定

```
# 大規模なアプリケーション: 32-64GB
# 中規模のアプリケーション: 8-16GB
# 軽量なアプリケーション: 1-4GB

docker run --memory=16g your-image
```
### ログ管理
命令型プログラミングと宣言型プログラミングの違いをまとめてみた

Reactを学び始めたときに、「JSは命令型プログラミングなのに対し、Reactは宣言型プログラミングです。」という説明を受けてもピンとこなかったので、もう少し噛み砕いてみることにしました。

### 命令型と宣言型の違いをピザ:pizza:で例えると？
イメージがつきやすいように、料理に例えてみましょう。

**命令型プログラミングを例えると**
- シェフにピザの作り方を手順ごとに指示するようなものです。生地を作り、ソースを塗り、チーズを載せ、オーブンで焼くまで、**すべてのステップを詳細に伝えます**。
![imperative-j1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875835/3cd4c5f7-f31f-0ff8-5cd9-a5fa25a12f06.png)

**宣言型プログラミングを例えると**
- **ピザを注文するようなもの**です。何を食べたいかだけを伝え、具体的な作り方はシェフに任せます。シェフはその指示に従って、最適な方法でピザを作ってくれます。
![declarative-j1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875835/4048a611-f2b1-58ea-4d95-c2bf762d602d.png)


### 命令型プログラミングとは？
では、改めてそれぞれの特徴を具体的なコードで確認していきます。

命令型プログラミングとは、開発者が **「どうやって」特定のタスクを実行するかを、細かい手順で指示する**スタイルです。このアプローチでは、一連の手続きを順次指示し、最終的な結果を得ます。

例：HTMLの`h1`タグにテキストを追加
```jsx
const h1Element = document.createElement('h1');
h1Element.textContent = 'Hello, World!';
document.body.appendChild(h1Element);
```
ここでは、`h1`タグを作成し、テキストを設定し、それをページに追加するという一連のステップを逐一指示しています。このように、**命令型プログラミングでは、コンピュータが何をどうすべきかを詳細に定義する**必要があります。

![imperative-j2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875835/11e02013-e757-0ad7-df6e-e1d02ae53f2c.png)

### 宣言型プログラミングとは？

一方、宣言型プログラミングでは、**「何を」達成したいかをコンピュータに伝えるだけ**で、具体的な手順を記述する必要はありません。ユーザーインターフェースに何が起きてほしいかをReactに伝えると、Reactが開発者に代わってDOMを更新する手順を判断します。

例：HTMLの`h1`タグにテキストを追加

```jsx
function App() {
  return (
    <h1>Hello, World!</h1>
  );
}
```

このコードでは、`h1`タグを作成してテキストを設定することだけを宣言しており、DOMにどのように追加されるかはReactが自動で処理してくれます。開発者は、**ページに表示したい要素を宣言するだけで済む**ため、作業がシンプルになります。

![declarative-j2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875835/f0907a0f-2d68-22e1-15db-4457829a74b7.png)


### まとめ

- **命令型プログラミング**：「どのように実行するか」を細かく指示する。
- **宣言型プログラミング**：「何を達成したいか」を伝えるだけで、具体的な方法はシステムに任せる。

Reactのような宣言型ライブラリは、開発者が複雑なUI操作をシンプルに表現できるように設計されているため、　JavascriptでのDOM操作よりも効率的な開発が可能になるということでした。
システム開発におけるBFFの役割と開発の流れ

### システム開発における他の領域から単純に見たBFFの役割
フロントエンドとバックエンド間のギャップを埋めること。

### BFF開発の流れ（成果物ベースで簡単に）
1. **フロントエンド向けのBFFのAPI仕様を決定**
   - フロントエンドのAPI仕様に基づいて、必要なデータやエンドポイントを定義する
   - 成果物:
     - 要件定義書
     - API仕様書（YAML or JSONでも代用可能）
     - アーキテクチャ設計書
     - シーケンス図（業務ロジックが少ないので複雑なAPIのみ作成）
     - セキュリティ設計書
     - テスト計画書
     - 開発環境設定書
     - プロトタイプ

2. **フロントエンドへのMock提供準備**
   - フロントエンドの開発が滞らないようにフロントエンド向けにBFFのAPI仕様に基づいたMockサーバやMockデータを提供する
   - 成果物:
     - Mockサーバ設定（YAML or JSONから生成可能）
     - Mockデータファイル

3. **BFFの設計書を作成**
   - BFFのAPI仕様を記載した設計書を作成する
   - 成果物:
     - API仕様書（YAML or JSONでも代用可能）

4. **BFFのAPIを開発**
   - API仕様を実現するため、バックエンドのAPIを適宜呼び出し、データを加工してフロントエンドに提供するBFFのAPIを実装・テストする
   - 成果物:
     - プログラムファイル
     - 設定ファイル（YAML or JSON）
     - テストケース

やることと成果物は以上。
ただ、実際に開発を進めると思い通りに進まないことが多い。

事項からは現実的なBFFの仕様決定における立場と
その環境下での想定される現実的な開発の流れを考えてみる。

### システム開発におけるエンドポイント決定の主導権
フロントエンドの機能を実現するため、フロントエンド、BFF、バックエンドのエンドポイントを決定する必要がある。
ただ、BFFはフロントエンドとバックエンドの間に位置し両者の仕様に依存するため、
BFFがエンドポイントを決める主導権を握ることは難しい。

#### エンドポイントの決定方法
想定されるエンドポイント決定の流れは以下の**1～3**のパターン。
一般的には**3**になることが多い。
ローコード開発やパッケージ開発により、
生産性が高い、変更への耐性が強い、API仕様があらかじめ決まっているなどの特性があれば**1**や**2**が採用されることもある。

1. **フロントエンドからAPI仕様を決める**:
フロントエンドの要件に基づいてAPI仕様が決まる。
この場合、フロントエンドの開発者が必要なデータやエンドポイントを定義し、その後バックエンドとBFFが実装される。
2. **バックエンドからAPI仕様を決める**:
バックエンドの要件に基づいてAPI仕様が決まる。
この場合、バックエンドの開発者が提供するデータやエンドポイントを定義し、その後フロントエンドとBFFが実装される。
3. **フロントエンドとバックエンドが同時並行してAPI仕様を決める**:
フロントエンドとバックエンドの開発者がAPI仕様を決定する。
両者の要件をバランスよく取り入れることができ、ボトルネックを回避しやすい。
また、仕様決定待ちによる開発のボトルネックを回避できる。

#### 開発の流れ（前提を置いて簡単に）
「**フロントエンドとバックエンドが同時並行してAPI仕様を決める**」場合における開発の流れを考える。

1. **フロントエンド向けのBFFのAPI仕様を決定**
終わりが見えず最も難しい作業。
API仕様の策定に必要なフロントエンドとバックエンドの要件を収集する。
要件に従いAPI仕様を策定する。
ただし、フロントエンドとバックエンドの要件は開発過程において
修正中やそもそも未作成など、仕様が未確定であることが多い。
その場合、なんとなくの入力と出力に基づいてAPI仕様を策定する。
2. **フロントエンドへのMock提供準備**
なんとなくの入力と出力に基づいた作成するMockになるので
フロントエンドのエンドポイント変更に対して迅速に最新を提供する。
3. **BFFの設計書を作成**
本来の設計書作成だけでなく、フロントエンドとバックエンドのAPI仕様の修正に合わせて
随時、設計書を修正する。
4. **BFFのAPIを開発**
本来の実装・テストだけでなく、フロントエンドとバックエンドのAPI仕様の修正に合わせて
随時、実装・テストを修正し、再テストを実施する。

### 考察
BFFの開発で一番苦労するのは**1. 仕様把握**であると感じる。
仕様変更による手戻りは不可避と考えてBFFの開発では基本的なこと以外を用意するのが良さそう。

以下の対策を考えていきたいと思う。
「仕様変更の影響を受けにくい考え方」：
業務に依存しない非機能や絶対に変わらない機能の大枠でAPI仕様を作成。
「仕様変更に対応しやすい仕組み」：
仕様変更の対応手順の作成や補助ツールなどを用意して仕様変更にすぐに対応できる方法を用意。
[Rider]JetBrains AI Assistantの解答言語を日本語にする

# 概要
RiderなどのJetBrains製IDEではチャット欄は日本語で質問すると日本語で返事をしてくれます。
でもコード上で右クリックして機能を選んだ場合は英語で返事が返ってきます（この後「日本語で答えて」とか指定すれば翻訳してくれますが一手間かかってしまいます）
設定を変更することでダイレクトに日本語で答えてくれるようになります。
# 本文
RiderのメニューからJetBrains Rider→設定（Windowsの場合はファイル→設定）
設定ダイアログが表示されたら、ツール→AI Assistant→自然言語→カスタム言語でAI Assistantチャットの応答を受け取るにチェックを入れます。
その下の入力欄に「Japanese」と手入力します。
![スクリーンショット 2024-09-15 13.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/c88bf752-b103-9caf-8949-3bf61274d045.png)


これでコード上から右クリックでAI Assistantの機能を選んだ場合の返答も日本語になります！
![スクリーンショット 2024-09-15 13.08.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/759e9698-9637-666a-c080-e251a7e4dd9a.png)
Ubuntu24.04でIsacSimを動かそうとした話② サンプル読み込み編

# 概要
お勉強でIsaacSimの環境を作ることを目指す。
この記事では, IsaacSimのサンプルを読み込むところまでを目指します。
※IsaacSimのCG系に興味あるので, ROSとかそのへんは踏み込まないです.

# 前回
Isaac Simを動かす前のOmniverse Launcherの
インストールについてはこちらを参考ください
https://qiita.com/Dennou_yugi/items/8b4d3f9dd9d963c54410

# 環境
- Ubuntu 24.04.LTS
- Omniverse Launcher 1.9.13
- Isaac Sim 2023.1.1
- Omniverse CACHE 2023.2.3
- NVIDIA RTX 3060Ti(だいぶギリギリっす)

# 手順
こちらを参考にしました。
動作はWindows版での記事ですが、Ubuntuでも一緒です
https://qiita.com/bebebefu/items/cae6f99e1bbec35c5405



- Cacheをインストール
Omniverse Launcher上部のEXCHANGEタブを選択し, Omniverse Cacheをインストール 
※イマイチこれを何に使っているのかがわからん
![Screenshot from 2024-09-15 13-01-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870090/0af1ce0c-9e93-a3ab-ac7c-68ee89377f5d.png)

- Nucleusのローカルサーバを作成
Omniverse Launcher上部のNUCLEUSタブを選択し "Add Local Nucleus Service"をクリック
※下図では既に操作後ですが, Local Nucleus Service 2023.2.3になっているとこに上記の"Add Local Nucleus Service"が存在します.


![Screenshot from 2024-09-15 13-07-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870090/f3df1be2-ee6c-84d6-e546-7bd8898f53e3.png)
※この操作自体は, ローカルに色々な環境を作っているとかだった気がします.

"Add Local Nucleus Service"をクリックするとユーザ名や, パスワードなどを入力する画面が表示されます.
入力していってください(スクショ取るの忘れちゃった(^o^))

入力後, NUCLEUSの左メニュー->Omniverseという場所にlocalhost(ユーザ名)というものが出るはずなんですが, 私の場合は出なかったので, Add Serverからサーバ名をlocalhostにして自分で出しました
(これもスクショ取るの忘れちゃった(^o^))

- Isaac Simをインストール
EXCHANGEタブでISAAC SIMを見つけられると思います.
インストールしてください.

![Screenshot from 2024-09-15 13-19-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870090/14140838-a9dc-ad64-b091-aac99d8c3d7d.png)

- Isaac Sim起動
インストール後に, Launchを押せばIsaac Simが起動するはずなのですが, 私の場合は一回目途中で停止してしまい, 再度起動し直しました.
![Screenshot from 2024-09-15 13-21-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870090/2d4b0d59-cc68-2501-1dfb-f4e953075d3a.png)

- サンプルを開く
ここでは下記のサンプルを開きます.
omniverse://localhost/NVIDIA/Assets/Isaac/2023.1.1/Isaac/Samples/ROS2/Scenario/carter_warehouse_apriltags_worker.usd

Isaac Simの画面下部のContentタブに, ファイルパスを入力する場所があるので, そちらに上記のパスを入力して, サンプルを開いてください.
※usdファイルをダブルクリック -> Open Original Fileでサンプルは開けます.

GPUのスペックにもよるかもしれないですが, めちゃくちゃ時間かかるか, 再起動が必要かもです.

# 実行結果
![Screenshot from 2024-09-15 13-31-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3870090/6e8e9034-3631-baf5-37ce-45e4f265b126.png)

やはりというか、めっちゃ綺麗ですね.
次回はサンプル内の3Dファイルを見ていくのと, 自作した3D(USD)をインポートする方法を試します.
※こっちがメイン目的

# 所感
Omniverse系は無駄に環境作成に必要なツールが一杯あったり, ツール名称がコロコロ変わったり, NVIDIAの事情に振り回されている感が半端なくて触ってて疲れます.コンテナ関連に詳しかったら, この辺スパッとやれたりするんですかね(｀；ω；´)
AWS AmplifyでReactアプリを公開する。環境変数の設定。

## ReactアプリをAmplifyでデプロイする。
### 手順
１．GithubにReactアプリをアップロードする。
　　この際、フォルダ直下に.envのファイルを作成しておく。
　（※Purivate,Publicはどちらでも構わない。）
２．AWS Amplifyにて新しいアプリを作成する。
３．Githubを選択し、使用するアカウントでログインを行う。
４．リポジトリとブランチを選択する。
５．アプリケーションの設定で、任意の名前をつける。
　　Reactアプリの場合は、フレームワークが自動検出されるハズ。
  ６．確認画面から、保存してデプロイ。

:::note warn
■ 補足
上記でうまくいかない場合は、Github側で接続を許可していない可能性がある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882866/e6bc5160-635d-6dae-8bd7-cef45b7b75eb.png)
:::


## Amplifyで環境変数を設定する
:::note info
ソースコードには書きたくない環境変数の設定をAmplifyで設定する手順について
:::
### 手順
１．フォルダ直下に.envのファイルを用意されているものとする。[Github]
２．ソースコードでは、使用したい変数を以下のように定義するとする。[Github]
```
const API = process.env.REACT_APP_API;
```
３．Amplifyにて作成したアプリを開き、ホスティング\環境変数を開く[Amplify]
４．以下の画像のように、任意の値を設定する。[Amplify]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882866/b83cebf8-143a-17d7-1b7a-8137e6203dde.png)
###
５．ホスティング\ビルドの設定にて、echoコマンドで変数を追加する一文を追加する。[Amplify]
```
    build:
      commands:
        - yarn run build
        - echo "REACT_APP_API=$REACT_APP_API" >> .env
```
###
６．アプリ画面より、本番稼働のブランチを開き、再デプロイを行う。[Amplify]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3882866/c090bd0b-8e41-f312-ef8a-0f55e040670d.png)
###
７．デプロイ完了後、ドメインを開いて環境変数の設定ができていることを確認する。
[Salesforce]会計年度の設定



## 初めに

こんにちは、初めまして。
記事を開いていただきありがとうございます。

久々にSalesforceを設定する機会があり、会計年度の設定でちょっと疑問に思ったところがあったので、
確認した内容を書き残します。

同じ疑問でつまずいた方へのヒントになれば幸いです。

注：この記事は、24'SummerのDeveloper Editionで検証した内容となります。

## Salesforceの会計年度設定について

Salesforceの会計年度設定では、１会計年度の開始月・終了月や、年度の表記法に関する設定を行うことができます。
Salesforceでは、このページに記載している会計年度の設定を参照して、データの属する年度を自動で計算してくれます。
そのため、年度別売上の集計などにかかわる重要な設定です。

会計年度の設定は基本的には１回設定すれば終わりですが、
逆に言うと１つの組織で１回しか設定しないので、うっかり設定を忘れないようにしたい内容となります。

## Salesforceの会計年度に関係する設定

会計年度に関係する設定は設定画面で以下のメニューから行います。

[設定] - [会社の設定] - [会計年度]

Salesforceでは、会計年度の設定として、
大きく分けて「標準会計年度」と「カスタム会計年度」の２パターンの設定が可能です。
それぞれの設定は以下の通りです。

* 標準会計年度
１年のうちの特定の月を開始月として、そこから12月を１単位とした会計年度です。
こちらは直感的にイメージしやすいと思います。

* カスタム会計年度
標準会計年度ではフォローしきれない個別のパターンに対応するためのもののようです。
今回の環境では標準会計年度で事足りたので、カスタム会計年度の設定については調べていません。

標準会計年度の設定内容をみていきたいと思います。

## 標準会計年度で設定可能な項目

標準会計年度では以下の２つの設定を行うことができます。

* 会計年度期首月
* 会計年度の表記

## 会計年度期首月
__会計年度期首月__ は __1月～12月__ の中から１つを選択します。

__会計年度期首月__ は、会計年度の始まる月を指定します。
例えば、日本の公立小中学校や役所であれば __４月から翌年の３月まで__ が１会計年度になるので、
この場合は __4月__ を選びます。

## 会計年度の表記

__ 会計年度の表記__ は、 __期末月に合わせる__ 、 __期首月に合わせる__ のいずれかを選択します。

ぱっと見では__会計年度の表記__ の設定をどちらにするべきかよくわかりませんでした。

まずは設定についてお話して、その後、具体例を交えて説明をしたいと思います。

## __会計年度の表記__ の設定内容について

* 期末月に合わせるを選択
会計年度の末月の年が会計年度の年表記となります。

* 期首月に合わせるを選択
会計年度の開始月の年が会計年度の年表記となります。

## 実際にどのような挙動になるのか検証

会計年度期首月を「4月」とした場合、
2024年4月1日～2025年3月31日が１つの会計年度となります。

この状態で「期末月に合わせる」を選択した場合
上記期間のデータの会計年度は、 __2024年__ となります。

「期首月に合わせる」を選択した場合
こちらは __2025年__ となります。

実際のデータで確認する場合は、日付項目をグループ化したレポートを作成し、
集計期間単位を __会計年度__ に指定するとわかりやすいです。

## 最後に

Salesforceの会計年度の設定は頻繁に変更するものではありません。
ただ、設定を誤った場合の影響はそれなりに大きいと思います。

売上の予実比較や、年度単位の集計のベースになる設定なので、必ず確認が必要な設定だと思います。

年度表記だけなら、 __金額は正しいけれど、会計年度が１年ずれる。__ ので、
発見から原因の特定まで比較的容易にたどり着けそうですが、
期首月の設定から誤っている場合、 __年度毎の集計結果が想定している結果と合わなくなる__ ため、
会計年度の設定以外にも別のロジックが怪しいんじゃないか？など色々な原因が浮かんでくるので、
原因の特定に時間がかかるかもしれません。

Salesforceは多様なお客様のビジネスに対応できるため、設定が詳細かつ多岐にわたります。
Salesforceの導入コンサルティングを行っている企業であれば、ヒアリングシートなども準備されていると思いますが、導入前や導入直後には会計年度の設定を確認しておくのが良いとおもいました。

今後もSalesforceをはじめとしたIT系の諸々で、気になったポイントは書き留めていきたいと思います。
とりとめのない文書を読んでいただきありがとうございました。
家の中での地震の避難指示アプリ作ってみた

## はじめに
本記事は、高専ハッカソン@鈴鹿第1回において行った開発のまとめ記事となっています。

↓↓↓Androidの人は今すぐインストール！！！↓↓↓
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/b67dd5dc-37f1-e3f6-d66d-ce524ba231df.png">

## 概要
チーム名 : KOMIT
アプリ名 : HomeEscape

### アプリの概要
#### 課題1 : 地震時の避難経路を把握できるようにする
##### 問題点
* 家から避難所までの経路も大事だが、まずは家の中の避難経路の確保が大事
* 災害時に混乱して、家の中でもけがをしてしまう可能性がある

### こんなアプリを作りました！
* 事前準備ですべきことをわかりやすく把握できるアプリ
* 緊急時の避難指示を誰でも把握できるUIのアプリ

### 詳細
#### アプリの背景
* チェックシートにより、事前準備すべきことの可視化
* 避難時の指示を表示することで、緊急時でも落ち着いて行動できるようになる
* 地震が起こると通知をユーザーに送り、ユーザーはそこから避難指示をすぐ確認できる

### アプリの紹介
::: note warn
現在はandroid版のみのリリースです。
:::
::: note warn
アプリはハッカソンによって開発された不完全版であるため、潜在的なバグが発生する可能性あります。アプリのテスト等は自己責任でお願い致します。
:::


#### テストダウンロードQRコード
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/62c0ef79-33d4-de72-0c31-e0d0157de8fd.png">


### アプリの詳細
#### スタート画面
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/5984f2d2-fa71-cadc-2d94-9d99580c50fe.png">


アプリ起動時に表示される画面
画面をタップするとログイン or 新規登録画面へ遷移
既にログイン済みであればチェックリスト画面へ遷移

#### ログイン or 新規登録画面

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/9d8d284d-a911-34ec-e7e5-cdee822e132b.png">
<p> </p>
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/5398c753-f4b8-5499-7392-0c40640fa6e1.png">


入力中はフォームボックス枠線の色が緑になる

メールアドレスとパスワードを入力して、ユーザーを新規作成orログイン


#### チェックリスト画面
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/314e7ab7-6583-d1a3-10c0-82a64742e410.png">

TODOチェックリスト画面

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/d17807a5-d75e-9fd7-7ded-48d9e5f87e44.png">

防災グッズチェックリスト画面


家の避難経路を確保するためのチェックリストと、防災グッズのチェックリストを確認できる


#### 避難指示画面
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/ddb3874b-916e-9374-45e7-f3ce3905874c.png">

地震発生時と収まったときの指示を確認できる
緊急時における家の中の避難手順を表示する画面


#### アカウント画面
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/1a11c272-798f-43d4-3d1d-c9e7f9be4a39.png">

ユーザー自身のアカウント情報を確認できる
自宅の所在地を変更可能


#### 通知
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3731339/8b225e3d-c500-44fd-4299-ca1975502695.png">

地震が発生すると、ユーザーへ通知を送る
通知をタップするとアプリが起動

## こだわり

* 危険色の赤だと緊張感が高まるので、柔らかくしたオレンジでUIのメインカラーとした
* どんな人でも使えるようにUIと操作感はシンプルかつ見やすくを意識


## 今個の展望
* チェックリストの編集機能
* チェックリストの完了具合に合わせて避難指示を変える
* 年齢などの情報も保存できるようにし、その情報によって避難案内も変更する
* 緊急時の通知からのアクセスでは即避難指示を開くようにする
AWS S3で制御文字を含むファイルを削除する方法

AWS S3に制御文字を含むファイルをアップロードしてしまうことがままあります（あるんです）が、制御文字によってはTransmitやCyberduck、CloudBerry Explorerでそのファイルを含むフォルダーが表示できなくなってしまいます。

そんな時はaws cli。
Access Key IdとSecret Access Key、bucket名でアクセスして、オブジェクトのリストを取得します。

```shell
% aws s3api list-objects --bucket [BUCKET NAME] --prefix root/images
...},
{
    "Key": "images/icon\u0003.png",
    "LastModified": "2024-12-24T00:00:00+00:00",
    "Size": 30000,
    "StorageClass": "STANDARD",
},
{....
```
```images/erroedfile\u0003.png```を削除したいのですが、
```
aws s3api delete-object --bucket [BUKET NAME] --key 'images/icon\u0003.jpg'
```
では消せません。aws cliのエスケープシーケンスに従って、以下のようにして消しましょう。
```
aws s3api delete-object --bucket [BUKET NAME] --key 'images/icon'$'\u0003''.jpg'
```