OmniAICreator/Qiita-1.07M huggingface dataset:
【独学1ヶ月（40日）】CISM（公認情報システムマネージャー）合格体験記 

# はじめに
CISM（公認情報セキュリティマネージャー）に合格しました。（2024/8/19）
CISMの認知度を上げるため、実際に受験した感想を残しておこうと思います。

# CISM（Certified Information Security Manager）とは
>CISMは、情報セキュリティマネジメントの知識と経験を認定する国際的資格であり、日本語名称を『公認情報セキュリティマネージャー』と呼称します。ISACAにより、2002年に資格制度が創設され、2003年度より試験が開始されました。 情報セキュリティマネジメントのチームプレイヤーからリーダーへ、ステップアップしたい方に最適な認定資格です。

（ISACA東京支部のサイトから引用）

https://www.isaca.gr.jp/cism/

## 試験内容
### 試験範囲
| ドメイン| 割合|
|:-:|:-:|
| 情報セキュリティガバナンス  |  17% |
|情報リスクの管理   |  20% |
|情報セキュリティプログラムの開発と管理|  33% |
|  情報セキュリティのインシデント管理 | 30%  |

### 試験形式
<table>
    <tr>
      <td>制限時間</td>
      <td>240分</td>
    </tr>
    <tr>
      <td>問題数/出題形式</td>
      <td>150問　4肢択一</td>
    </tr>
    <tr>
      <td>合格ライン</td>
      <td>450/800点（56%）</td>
    </tr>
    <tr>
      <td>受験料</td>
      <td>760ドル（ISACA会員は575ドル）</td>
    </tr>
 </table>


# 受験のきっかけ
この資格を取ると年収が1000万円になるという記事を読んで欲しくなりました。

https://www.skillsoft.com/blog/top-paying-it-certifications

# 学習リソースと勉強方法
## CISM Review Questions, Answers & Explanations Manual, 10th Edition | Print | Japanese

https://store.isaca.org/s/store#/store/browse/detail/a2S4w000005FRB3EAO

こちらはISACAが公式で出している問題集で、1000問掲載されてます。

私はこの問題集を3周しました。

1周目は問題を解いて、回答の解説を全て目に通しました。

2周目は分からなかった問題のみ納得するまで回答の解説を読んだり、分からない用語を調べたりしました。この時点で9割は答えを暗記しました。

3周目はゲーム感覚で解きました。
問題集解くの楽しいので趣味にもってこいだと思います。

4周目は新幹線の中で100問だけ解きました。
それ以降は……
てことで3周しか出来なかったのは反省ですが、受かる確信はあったので良しです✌️

**この問題集の問題を根拠を持って回答できるようになれば余裕を持って合格できると思います。**

**※ISACA会員だと、価格が159→129ドルになるので、入会後に購入した方が良いかもしれません。**

# 試験当日
当日午後の試験を予約したのにも関わらず前日まで旅行していた影響か午前中はずっと寝ていました。
勉強してないことでちょっと不安はありましたが、少し早めに着いたので高田馬場テストセンターの下にあるガストでご飯を食べつつ勉強しよう。
そう思ってたのですが、意外と人が並んでおり入るのに一苦労……
勉強は諦めて、唐揚げ定食をむしゃむしゃしてました。

高田馬場テストセンターは初めてだったのですが、秋葉原より綺麗で快適にテストを受けることが出来ました。

試験は、55分で150問解き終え、見直しを15分くらいしました。
めちゃくちゃ難しかったですが、1周目はてきとーに、2周目は消去法を駆使しつつ真剣に取り組みました。

アンケートを終え、ロード中のぐるぐるを眺めながら祈ること体感30分 無事合格の文字を見ることが出来たので良かったです！！！

結果は10日後メールで届くので、のんびり待ちたいと思います。

※一応PSIから合格したか確認できます（正しいかは分かりません）
![IMG_4010.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803960/d0067bc8-ade8-4f2e-b7bb-a6baa53bd36d.jpeg)

**2024年8月30日追記**
スコアが届きましたので追記いたします。
![IMG_4050.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3803960/1527e835-886c-7999-147a-d1f6c7aa6619.jpeg)

結構余裕かと思っていたら、ギリギリで冷や汗が……
469点で一応合格したので、今後の継続学習を経て立派な公認情報セキュリティマネージャーになりたいと思います。

# 感想
CISAよりは難しく、CASP+やCISSPよりは難易度が低いと感じました。

CISA<CISM<CASP+<<<CISSPかなと思います。

問題集を全て暗記し、出てくる用語の意味を理解すれば余裕を持って合格出来ると思います。

今後、CISM的な考え方であったり、資格で得た知識をどのように活用していくかなどをアウトプットしていこうと考えてます。
次の記事をお待ちください多分やります💪

CISM君のいい所は転職市場で評価されることです。
セキュリティ関連の求人を見てみて欲しいのですが、基本的にCISSP、CISA、CISMが歓迎要件となっている企業様が多いです。
取るだけで評価されるお得な試験なので是非お試しを✨✨✨

# さいごに
最後まで読んでいただきありがとうございました。
**めちゃくちゃ楽しい試験なので皆さん是非受けましょう！！会社や、転職市場で評価されるのでぜひ！！！**
**合格してCISM仲間になりましょう！！**
VMware上で起動したUbuntuの時刻同期

# 概要
VMWare WorkStationでUbuntu22.04LTSをインストールし、起動後の時刻が9時間ずれているため、色々試した結果うまく行ったので備忘録程度に記事を記載

# タイムゾーンが正しいのに時刻がずれている
timedatectlコマンドで時刻を確認したが、タイムゾーンがちゃんとJSTになっているのに9時間時刻がずれている、というかUTCが正しい時間でタイムゾーンのせいでずれていることがわかった。
```bash
ubuntu:~$ timedatectl status 
               Local time: 水 2024-08-21 19:43:28 JST
           Universal time: 水 2024-08-21 10:43:28 UTC
                 RTC time: 水 2024-08-21 10:43:28
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: no
              NTP service: active
          RTC in local TZ: no
```

# とりあえず色々試してみた
## timesyncd.confにNTPサーバーを記載
googleのNTPサーバーを記載してtimesyncdを再起動したがダメだった
```bash
ubuntu:~$ sudo vim /etc/systemd/timesyncd.conf
[Time]
NTP=time.google.com
#FallbackNTP=ntp.ubuntu.com
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

ubuntu:~$ sudo systemctl restart systemd-timesyncd
```

## ハードウェアクロックを疑った
hwclockコマンドで設定してみたがこれもうまくいかず
```bash
ubuntu:~$ sudo hwclock --verbose --systohc --localtime 
```
> 参考文献: [hwclockコマンドでLinuxとWindowsの時刻のズレを修正する方法](https://ubiqlog.com/archives/11842)

# 最終的に解決した方法
探しても治らないから最終的にchatgptにきいてみたらこんな回答が返ってきた(解決した方法だけ抜粋してます)
```
自分：補足すると、WindowsからVMWare Workstationを使ってubuntuを起動しています、それが影響しているのでしょうか？

ChatGPT:
ChatGPT
VMware Workstation上でUbuntuを動作させている場合、ホストOS（この場合はWindows）の時刻設定やタイムゾーンの影響を受けることがあります。VMwareはデフォルトでホストの時刻をゲストOSに同期させる設定になっているため、この設定が原因で時刻にズレが生じる可能性があります。

VMware Toolsの影響
VMware Toolsがインストールされている場合、ホストの時刻とゲストOS（Ubuntu）の時刻を自動的に同期する機能が有効になっている可能性があります。これがタイムゾーンの設定に影響を与えている可能性があります。

対処方法
VMware Toolsの時刻同期を無効にする

VMware Toolsの時刻同期機能を無効にすることで、ホストの時刻に依存せず、ゲストOSが独自に時刻を管理できるようになります。

以下のコマンドを実行して、VMware Toolsの時刻同期を無効にします。

bash
コードをコピーする
sudo vmware-toolbox-cmd timesync disable
```

なるほど？と思い、一度確認したら無効と表示されていたので同期を逆に有効にしてみました
```bash
ubuntu:~$ vmware-toolbox-cmd timesync status 
無効
ubuntu:~$ sudo vmware-toolbox-cmd timesync enable
ubuntu:~$ vmware-toolbox-cmd timesync status
有効
ubuntu:~$ ubuntu:~$ timedatectl status
               Local time: 水 2024-08-21 11:05:56 JST
           Universal time: 水 2024-08-21 02:05:56 UTC
                 RTC time: 水 2024-08-21 11:05:56
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no
```
治りました、どうやらホスト側と同じ時刻を同期してくれるみたい
＃35　PHP CSVを読み込み、文字化けさせずに配列で出力する

## はじめに
今回はPHPでCSVを読み込み、配列として一行ずつ出力する方法について紹介します。
データのやり取りによく使われるCSVについてや、使用する関数について簡単に解説していますので、最後までご覧いただけましたら幸いです。

## CSVを用意する
### CSVとは
Comma Separated Valueの略で、カンマでフィールドを区切ったテキスト形式のファイルです。
ソフトウェア同士での互換性が高く、手元でのデータの修正ができたりのとデータの管理しやすくなります。

#### sample.csv
```plaintext
商品名,値段
チョコレート,"100"
クッキー,"200"
ケーキ,"3,000"
```
先頭行が表の見出し、2行目以降がデータとなります。

#### ダブルクオーテーションの意味
ダブルクオーテーション(")で囲まれた文字列は、区切り文字があっても区切らず、一つの値とみなします。
例えば『10,000』という値があるときそれぞれ以下のようになります。
```
『10,000』　→　『10』『000』
『"10,000"』　→　『10,000』
```

## 文字コードについて
### fgetcsv()とロケール
今回使用するfgetcsv()はロケールの設定に依存します。
そのためロケールとCSVの文字コードが異なると、以下のように区切り文字を正しく認識できないことがあります。
```
『"おこづかい","10,000"』
→　『おこづかい",10』　『000』
```

### 5C問題
また、文字コードがShift-JISのCSVを直接fgetcsv()で読み込むと、
文字の2バイト目が「5C」になる文字がエスケープ文字「\」と判断され、CSVの形式が崩れてしまうことがあります。

これらの問題を避けるため、ロケールとCSVの文字コードを変換してからファイルを読み込ませます。

## PHPでCSVを読み込み、配列を出力する
CSVを用意出来たら、早速読み込んでみましょう。

### コード
```php
<?php
// phpプログラムが扱うロケールを「ja_JP.UTF-8」に設定します。
setlocale(LC_ALL, ".UTF8");

// sample.csvの中身を取得し文字列に変換します。
$file = file_get_contents('sample.csv');

// $fileの文字コードをUTF-8に変換し$utf8_dataに格納します。
$utf8_data = mb_convert_encoding($file, 'UTF-8');

// テンポラリファイル$tmpを作成します。
$tmp = tmpfile();

// $utf8_dataの中身を$tmpに書き込みます。
fwrite($tmp, $utf8_data);

// $tmpのファイルポインタの位置を先頭に戻します。
rewind($tmp);

// $tmpを一行ずつ読み込み、出力します。
while ($data = fgetcsv($tmp)) {
    print_r($data);
}

// $tmpを削除します。
fclose($tmp);
?>
```

### 解説
setlocale(ロケール設定により影響を受ける関数のカテゴリ, "ロケール名");
```
ロケール情報を設定する
カテゴリに LC_ALL を指定すると全てのロケールの環境設定を一括で上書きできる
```

file_get_contents('ファイル名')
```
ファイルを読み込み、中身のデータを文字列として返す
```

mb_convert_encoding('ファイル名','変換したい文字コード')
```
ファイルを今の文字コードから別の文字コードに変換する
```

tmpfile()
```
読み取り/書き込み用のテンポラリファイルを作成し、ファイルポインタを返す
ファイルを fopen() したときと同様のファイルポインタが返される
```

fwrite(ファイルポインタ, 文字列やデータ);
```
文字列やデータをファイルに書き込む
```

rewind(ファイルポインタ)
```
ファイルポインタの位置を先頭に戻す
```

fgetcsv(ファイルポインタ)
```
ファイルポインタの位置からデータを一行分読み込み、添字配列にして返す
「"」を外し、区切り文字（指定がなければ「,」）でフィールドごとにデータを分ける
処理の後、ファイルポインタは次の行に移動する
ファイルの終端に達するとfalseを返す
```

while(条件式){ 繰り返したい処理 }
```
条件式がtrueを返す間処理を繰り返し、falseになったときループを抜ける
```

print_r(変数)
```
指定した変数に関する情報を解りやすく出力する
```

fclose(ファイルポインタ)
```
オープンされたファイルポインタをクローズする
※テンポラリファイルの場合、fcloseを呼ぶと自動的に削除される
```

### 出力結果
上記のコードを実行すると以下のように出力されます。
```
Array
(
    [0] => 商品名
    [1] => 値段
)
Array
(
    [0] => チョコレート
    [1] => 100
)
Array
(
    [0] => クッキー
    [1] => 200
)
Array
(
    [0] => ケーキ
    [1] => 3,000

)
```
CSVの中身を一行ずつ配列として出力することができました。

### 余談
今回は、テンポラリファイル$tmpを作成しfgetcsv()を使ってデータを読み込みましたが、
str_getcsv()を使うとCSV形式の文字列を配列として読み込むことができるので今後紹介できたらと思います。

## 最後に
今回は、PHPでCSVのデータを配列として出力する方法についてご紹介しました。
応用するとDBとのやり取りなど便利に使えるので、参考になれば幸いです。
ご覧いただきありがとうございました。

出典：
https://www.php.net/manual/ja/book.filesystem.php
https://qiita.com/Ken_tk/items/5f3715d7f97c620fa42c
Paiza×Qiitaキャンペーン Javaで解説してみた【C 残り物の量 編】

# 問題へのリンク

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

# 解答コード

<details><summary>詳細</summary>

~~~

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		final int M = scanner.nextInt();
		final int P = scanner.nextInt();
		final int Q = scanner.nextInt();

		double numerator = M * (100 - P) * (100 - Q);
		double denominator = 100 * 100;

        double answer = numerator / denominator;

		System.out.println(answer);
		scanner.close();
	}
}


~~~

</details>

<details><summary>10進数計算</summary>

~~~

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		final BigDecimal M = BigDecimal.valueOf(scanner.nextLong());
		final BigDecimal P = BigDecimal.valueOf(scanner.nextLong());
		final BigDecimal Q = BigDecimal.valueOf(scanner.nextLong());

		BigDecimal unsolded = sold(M, P);
		BigDecimal answer = sold(unsolded, Q);

		System.out.println(answer);
		scanner.close();
	}

	private static final BigDecimal HUNDRED = BigDecimal.valueOf(100);

	private static BigDecimal sold(BigDecimal food, BigDecimal salePercentage) {
		BigDecimal remainingPercentage = HUNDRED.subtract(salePercentage);
		BigDecimal unsolded = food.multiply(remainingPercentage).divide(HUNDRED,4,RoundingMode.HALF_UP);
		return unsolded;
	}
}

}


~~~

</details>

# 解説

<details><summary>詳細</summary>

## 誤差について(基本情報技術者試験合格や高ランクを目指す人向け)
人間はこじらせている人以外は10進数で計算を行いますが、コンピュータは2進数で計算を行います。循環小数になる条件が10進数と2進数で異なる為、基本的に整数計算で行い、最後に除算を行うと誤差が最小限に抑えられます。
具体的には、分母・分子が整数かつ約分済み分数表記を行った際に、分母が2の乗数でないならば循環小数になります。10進数の場合は、分母が2と5の乗数で構成できない場合に、循環小数になりますので条件が緩いわけですね。

### 誤差をあまり気にしたくないなら
そういった誤差を最小限におさえるコツは、可能な限り整数計算で行うことです。
今回は、分子と分母を求め、最後に除算しています。

## 解法
Cでは誤差はさほど気にしなくても許容範囲内に収まることがほとんどですが、今のうち意識する癖をつけた方がいいです。
80%売れた場合、残りは20%になります。
言い換えれば80%売れた場合、(100-80)%残ります
(100-80)%残るということは、元の値を(100-80)倍して、100で割ると残量になります。

つまりMの(100-P)%残るということは
M * (100 - P) / 100
残るということです。
更にQも計算すると
M * (100 - P) / 100 * (100 - Q) / 100
が解答になります
できる限り整数計算を行う場合
M * (100 - P) * (100 - Q) ...分子
から
100 * 100 ...分母
を割るといいでしょう

</details>

<details><summary>10進数計算</summary>

銀行の基幹システムなど、10進数と2進数の違いが許されないパターン対応です。2進数計算と比較して、メモリに無駄が出る、パフォーマンスが落ちるといった弊害が出ますので。使用は最小限にしましょう。
BigDecimalは10進数かつ、有効桁数を自由に設定できるクラスです。ただ、有効桁数を設定しない状態で循環小数となる場合、例外が発生してしまいますので注意しましょう。
今回は小数点以下4桁あれば誤差は出ないのでスケールは4にしてます。

</details>
超AWS初学者向けにAmazon Qをわかりやすく解説

## はじめに

この記事では、AWSが提供する新しいジェネレーティブAIアシスタント「Amazon Q」について、超AWS初学者でも理解できるよう詳しく解説します。

### ジェネレーティブAIとは？

ジェネレーティブAIは、新しいコンテンツ（テキスト、画像、音楽など）を生成できるAI技術です。
最近の研究では、ジェネレーティブAIを活用することで、仕事の効率性や質が大幅に向上し、生産性が平均30%以上向上する傾向すると言われています。
### Amazon Qとは？
Amazon Qは、AIを活用して企業の業務効率を支援するツールです。
クラウド上でデータから洞察を得て、業務の効率化を図ることができます。

### Amazon Qはどんな課題を解決するのか？

従来のジェネレーティブAIアプリケーションは、顧客のコンテキストやデータ、組織のセキュリティやプライバシーを考慮できていないケースが多くありました。
Amazon Qは、これらの課題を解決するために開発されたサービスです。

### Amazon Qの2つの機能：Amazon Q BusinessとAmazon Q Developer

Amazon Qは、大きく分けて2つの機能を持っています。

**1. Amazon Q Business:**

- 企業データから質問に答え、洞察を引き出し、タスクを効率化
- 会話型の検索機能で、企業内のあらゆるデータを探し、必要な情報に簡単にアクセスできる
- Zendesk、Salesforce、Jiraなどのツールと統合し、ワークフローやチケット作成を自動化
- 管理者向けの機能も充実しており、アクセス権限を細かく設定ができる
- データのサイロ化問題を解決し、あらゆる情報を統合してより自然な形で利用できる

**2. Amazon Q Developer:**

- ソフトウェア開発ライフサイクルを加速させるAIアシスタント
- コードの記述、デバッグ、テスト、セキュリティチェック、トラブルシューティング、コード変換などを支援
- AWSの豊富なサービス情報に基づいて、開発に関するベストプラクティスを提案
- 開発者は、Q Developerを活用することで、時間と労力を大幅に削減
- 
### 利点と安全性
Amazon Qは、セキュリティとプライバシーを重視した設計が施されています。
これにより、企業が安心してデータを活用しながら業務を推進することが可能です。

### Amazon Qはどのように役立つのか？

**例1：エンジニア**

- 自分のアカウントで利用可能なAWSリージョンやサービスを簡単に調べることができます

**例2：マーケティングマネージャー**

- コンテンツを要約し、ソーシャルメディアに投稿するための画像を生成できます

**例3：データサイエンティスト**

- 複数のデータセットを分析し、結果を簡単にまとめることができます

### まとめ

Amazon Qは、ジェネレーティブAIの力を活用して、ビジネスの効率性と生産性を向上させる革新的なサービスです。
AWSを活用している企業にとって、Amazon Qは非常に強力なツールとなり、さまざまな業務の効率化や開発の加速に貢献します。

## 関連資料
[Amazon Q | AWS Events](https://youtu.be/S9lWUz6-UyI?si=Ul4dsQ23RAf9kpv8)
Loocker Studio：データベースに登録された誕生日から年代別のデータを出したい

# データベースに登録された誕生日から年代別のデータを出したい

## 概要
データベースに誕生日を登録しているので、Loocker Studioで年代別の円グラフを作成し表示する。
* データベースにbirthdayのカラムがあり、値は1986/07のようになっている
* 誕生日未設定の人は、1900/01が登録されている
* 年代の幅は、40以下、50〜54、55〜59、60〜64、65〜69、70以上


## 準備
対象のテーブルをリソースに追加しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595849/b3235af9-fcf2-3ac2-1193-2f68fc77b243.png)

## 計算フィールドの追加
「フィールドを追加」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595849/d213a8d2-76c1-7e28-0da1-6d5873b32770.png)

「計算フィールドを追加」を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595849/2e18c171-ff5c-a283-ec23-1a187550b668.png)

入力項目は、
* フィールド名
* 数式

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595849/18d15f69-896a-bc62-4f43-9309d78ae5d4.png)


数式には以下のコードを入れました
```
CASE
  WHEN birthday = "1900/01" THEN "未設定"
  ELSE
    CASE
      WHEN (YEAR(CURRENT_DATE()) - CAST(SUBSTR(birthday, 1, 4) AS NUMBER)) * 12 + (MONTH(CURRENT_DATE()) - CAST(SUBSTR(birthday, 6, 2) AS NUMBER)) <= 49 * 12 THEN "49歳以下"
      WHEN (YEAR(CURRENT_DATE()) - CAST(SUBSTR(birthday, 1, 4) AS NUMBER)) * 12 + (MONTH(CURRENT_DATE()) - CAST(SUBSTR(birthday, 6, 2) AS NUMBER)) BETWEEN 50 * 12 AND 54 * 12 THEN "50歳〜54歳"
      WHEN (YEAR(CURRENT_DATE()) - CAST(SUBSTR(birthday, 1, 4) AS NUMBER)) * 12 + (MONTH(CURRENT_DATE()) - CAST(SUBSTR(birthday, 6, 2) AS NUMBER)) BETWEEN 55 * 12 AND 59 * 12 THEN "55歳〜59歳"
      WHEN (YEAR(CURRENT_DATE()) - CAST(SUBSTR(birthday, 1, 4) AS NUMBER)) * 12 + (MONTH(CURRENT_DATE()) - CAST(SUBSTR(birthday, 6, 2) AS NUMBER)) BETWEEN 60 * 12 AND 64 * 12 THEN "60歳〜64歳"
      WHEN (YEAR(CURRENT_DATE()) - CAST(SUBSTR(birthday, 1, 4) AS NUMBER)) * 12 + (MONTH(CURRENT_DATE()) - CAST(SUBSTR(birthday, 6, 2) AS NUMBER)) BETWEEN 65 * 12 AND 69 * 12 THEN "65歳〜69歳"
      ELSE "70歳以上"
    END
END

```

`(YEAR(CURRENT_DATE()) - CAST(SUBSTR(birthday, 1, 4) AS NUMBER)) * 12` 
で誕生年と現在年の差を月数に換算します。

`(MONTH(CURRENT_DATE()) - CAST(SUBSTR(birthday, 6, 2) AS NUMBER))` 
で誕生月と現在月の差を計算します。

これらを合計して、誕生日からの経過月数を計算し、対象年齢に対応する月数と比較します。
例えば、「49歳以下」の条件は、49歳×12ヶ月 = 588ヶ月以下の人に該当するようにしています。

## 円グラフの追加

編集ページの「グラフを追加」で円グラフを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595849/968e68c7-d917-6d24-70ef-9407194d6217.png)

グラフをクリックすると「設定」がでるので、
* データソースの選択
* 期間のディメンション（created_atなど）
* ディメンション　→　作成した計算フィールド「年代別」を選択
* 指標を選択（idのカラムなど）


表示結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/595849/70c29ffb-0fbc-c0e9-c70e-2a02ddf8b42d.png)


これで表示できました。
curl コマンドを SOCK Proxy ( ssh コマンドによるサーバー経由  ) で実行する

# 例

## SOCK Proxy の起動

この例では 

- ssh ユーザー : user
- ssh サーバー: ssh-server.example.com
- PORT: 8888 

でPROXYを起動する

```
ssh -vND 8888 user@ssh-server.example.com
```

## curlコマンドの実行

- `-x` で SOCK Proxy を指定する
- てきとうなページにcurlリクエストする

```
curl https://example.com -x socks5h://0:8888
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
React NativeアプリをiPhoneの実機で動かす

## 用意するもの
- Mac
- iPhone
- MacとiPhoneを繋ぐケーブル
- Xcode

## 1. React Native CLIを使ってプロジェクトを作成
`newApp`という名前のReact Nativeアプリを新規作成する。
```shell
npm install -g @react-native-community/cli@latest
npx @react-native-community/cli init newApp
cd newApp
```

## 2. パッケージをインストール
`newApp`ディレクトリ直下に**空の`yarn.lock`ファイルを作成**し、パッケージをインストール
```shell
yarn
```

## 3. CocoaPodのインストール
```shell
cd ios
pod install #初回は時間がかかる
```
※npmやyarnでJavaScriptパッケージを追加する度に、`cd ios && pod install`でios用のパッケージもインストールする。

## 4.Xcodeでアプリを起動

iPhoneをケーブルでMacと繋ぐ。

Xcodeを起動し、　`newApp`　> `ios` > `newApp.xcworkspace` を開く。
※`.xcodeproj`の方ではないので注意!

`Target` > `newApp`の`Singing & Capabilities`タブをクリックし、
`Team`を`None`から事前に登録したアカウント名に、`Bundle Identifer`をドメイン名など一意の値に設定。
![Xcode01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/9aa5f297-d865-c6da-b7d6-2e4a7df97725.png)

同じ作業を、 `Target` > `NewAppTest`でも繰り返す

![Xcode02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/1739a87a-546a-0038-7c0a-2c262bc76099.png)


## 5.iPhoneをデベロッパーモードで起動

iPhoneの　`設定` > `プライバシーとセキュリティ` > `デベロッパーモード`をタップし、デベロッパーモードをオンにする。
iPhoneの再起動を問われるので、再起動する。
![iPhon01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/e262864a-dd31-04ff-0ff0-21eb9dccf92b.png)
![iPhon02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/42a03465-ac1b-7a6b-fb00-394635b61223.png)


iPhoneが再起動したら、デベロッパーモードをオンにするか聞かれるので、パスコードを入力してオンにする。

iPhoneの　`設定` > `一般` > `VPNとデバイス管理`　をタップし、`Apple Development:自分が設定した開発者アカウント を信頼する`　をタップする
![iPhon04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/35beca0b-c8c5-3597-75d6-f49af58baabd.png)
![iPhon05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/646d7bfe-baa6-6215-206b-4b41b0a2b842.png)



MacのXcodeに戻り、出力先として繋いだiPhoneを指定する。
※この時、MacとiPhoneが同一ネットワーク上にあるか確認する。
![Xcode03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/6d1bb9a7-82d2-027c-ab28-cb009c4d1d15.png)


## 6.XCodeでアプリを起動
MacのXCodeで`Cmd + R`でアプリを起動。
もしくは、React Nativeアプリのディレクトリで`yarn start`による起動でもOK。


![iPhon06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/0af89252-08a6-d00a-d7ee-187e0d6cbdac.png)
![iPhon07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781928/53169596-a797-2de9-2913-d5ddbf93a1b9.png)
IdeaVim の設定方法

:::note
この記事は [Vim 駅伝](https://vim-jp.org/ekiden/)、2024年8月20日の記事です。
前回は、[kyoh86さん](https://zenn.dev/vim_jp/articles/5a95805896d6cf)でした。
:::

最近、自分は相対行番号の設定にハマっています。Vim/Neovim だけでなく、モバイルアプリ開発で使っているIDEにもこの設定をしています。

この記事では完全なVim/Neovim の話ではなく、JetBrains IDE や AndroidStudio で　 Vimのキーバーインドが使える IdeaVim の設定について紹介します。

# IdeaVim とは
IdeaVim とは JetBrains社がメンテナーをやっている、JetBrains IDE 用のVimエンジンです。

https://github.com/JetBrains/ideavim

InteliJ IDEA  をベースに作られた AndroidStudio でも使うことができます。

## 導入方法
AndroidStudioを前提に導入方法を説明します。
といっても、導入方法はとても簡単で、IDEを起動して、Pluginsから "IdeaVim" と検索、Install すると導入完了です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/82094841-7934-45a1-2112-177b8cb44b2f.png" width=300>

https://plugins.jetbrains.com/plugin/164-ideavim

# 設定方法
IdeaVim は Vim の `.vimrc` と同様に、設定ファイルを作成することができます。

```
touch ~/.ideavimrc
```

で準備完了です。

`.vimrc` と同様に、
```vimscript:.ideavimrc
set number "行番号
set relativenumber "相対番号
```
と設定し、IDEを再起動すると反映されます。

また、自分が愛用している `.vimrc`　をそのまま反映させることもできます。
`.ideavimrc` に以下のように設定し、IDEを再起動すると反映されます。

```vimscript:.ideavimrc
source ~/.vimrc
```

# プラグイン

IdeaVimではプラグインを設定することができます。
`.ideavimrc` で以下のように追加することができます。

```vimscript: .ideavimrc
Plug '<plugin-github-reference>'
```

愛用の `.vimrc` ファイルを使用している場合、Ideavim は、vim-plug または vundle を使って定義されたプライグインを解析、有効にすることができます。
`.vimrc` で有効になっているプラグインを無効にしたい場合は、`~/.ideavimrc` で

```vimscript: .ideavimrc
set no<plugin-name>
```

とすると無効化されます。


使えるプライグインは、
- [NERDTree](https://github.com/preservim/nerdtree)
- [easymotion](https://github.com/easymotion/vim-easymotion)
- [sneak](https://github.com/justinmk/vim-sneak)
- [commentary](https://github.com/tpope/vim-commentary)

などがあります。詳細は以下をご覧ください。

https://github.com/JetBrains/ideavim/wiki/IdeaVim-Plugins#easymotion

# みんなの設定

IdeaVim の Discussions には "Share your ~/.ideavimrc" というディスカッションがあります。

ここでは、みんなが設定した `.ideavimrc` を紹介し合う場所です。ぜひ見ていってください。

https://github.com/JetBrains/ideavim/discussions/303

# 参考資料

https://github.com/JetBrains/ideavim?tab=readme-ov-file
[QNX] Linuxより何が良いか?

# 概要
仕事でQNX(OS)を使う事になり、Linuxより何が良いのかを個人的に理解できる範囲でまとめてみた。
QNXを導入するのにlicenceコストや開発コストが掛かるため、何故Linuxではダメなのかという批判的な観点で考えてみる。

# Security
### Memory Address Isolation
Application毎にmemory addressを割り振る
- applicationが互いに干渉しなくなる
- 重要な情報などを他のapplicationから情報を抜き取る事を防ぐ事が出来る

LinuxでもMemory Address Isolationは出来ると聞いたことがあるが、Securityまわりは詳しくないので、勉強が必要

# Task Scheduling
###  Task(Application) Schedulingについての事前知識
Dynamic Scheduling: OnlineでProcessor(CPU Core)の空き状況によって、DynamicにScheduleを組む
Static Scheduling: OfflineでTaskの実行時間を計測し、Scheduleを組む。
Deterministic Scheduling: Static Schedulingの一部でTaskのPriorityとDeadlineを元にOfflineでScheduleを組む。

### QNXでのTask Scheduling
RTOS(QNX専用のruntime OS)はDeterministic Schedulingを取り入れているので、TaskのDeadlineが重要なSystemにおいてメリットがある。しかし、RTOSを使った場合のメリットであって、QNX単体のメリットではない。ROSなどの他のRuntime OSを使った場合はQNXを使う意味がない。Determistic Schedulingはlinuxでも出来るはず。


# 安全認証
LinuxなどのOpen Sourceのsoftwareは安全認証がされていないため、自社で安全認証する必要が出てくるらしい。QNXを使えば、安全認証が既に済んでいるので、その分のコストと時間を短縮出来る。

# まとめ
QNXが産業システムにどうしても必要な理由はSecurityと安全認証がされている為だと感じた。Deterministic SchedulingはLinuxでも出来るのではないかと思っているので、QNXが必須だとは感じなかった。もっと勉強して、詳細な事がわかったらupdateしたいと思う。個人的にはLinuxで開発を完結出来るようになって欲しい。

# Reference
[QNX Homepage](https://blackberry.qnx.com/ja/industries/industrial-control)
[RTOS](https://blackberry.qnx.com/en/products/foundation-software/qnx-rtos)
オープンソース機械学習関数

[teradataml Open-Source Machine Learning Functions - テラデータ オープンソース機械学習関数](https://docs.teradata.com/r/Enterprise_IntelliFlex_VMware/Teradata-Package-for-Python-User-Guide/teradataml-Open-Source-Machine-Learning-Functions) [2024/08/21時点]の翻訳です。

:::note information
各機能の詳細な説明に関しては、段階的にリンクを追加していきますので、リンクから詳細ページを参照してご利用下さい。
:::

## オープンソース機械学習関数とは？
<img width="700" alt="Scikit-learn.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/0cd7062f-8512-2ed7-2143-e385e7188130.png">

- データサイエンティストは、人気のあるオープンソースの機械学習機能であるScikit-learnとLightGBMを Teradata Vantage 上で実行できます。
- オープンソース機械学習関数は、Teradata VantageをPythonから操作するためのライブラリteradataml[^1]の機能として利用できるため、teradatamlをpipインストールするだけで利用できます。
- VatangeCloud EnterpriseとVantageCoreではSTO[^3]として動作します。
- VantageCloud LakeではOAF[^2]として動作します。
- Td_sklearn関数を利用して、Scikit-learnとほぼ同様のインタフェースで利用することができます。
- トレーニング＆スコアリングともデータを Teradata　Vantage から取り出す必要はありません
- オープンソース アルゴリズムを使用したマイクロモデリング (水平スケーリング) などの Vantage のスケーラビリティ機能
2024年4月12日現在では、Scikit-learnのクラスの94 パーセント、クラスメソッドの91％に対応しています。


[^1]: teradatamlは、Teradata Vantageの操作・分析を実施するためのpythonライブラリです。
[^3]: STO=Script Table Operator(スクリプトテーブル演算子)の略で、インデータベースでPythonやRを使用する機能のことです。
[^2]: OAF=Open Analytics Frameworkの略語で、オートスケールするデータベースクラスター上で、コンテナかされたpytyhonやRのアプリケーションを実行する機能のことです。


## オープンソース機械学習関数の特徴
Teradataml のオープンソース機械学習関数は、オープンソースによる分析をTeradata Vantage上で直接実行できるようにするものです。

<img width="900" alt="Scikit-learn.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/15763175-84d4-22d7-7a96-3b087b477e04.png">

## オープンソース機械学習関数の記述方法

#### 標準のSCIKIT-LEARN の実行方法
<img width="600" alt="Scikit-learn.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/718b5812-953f-6a3e-ca4c-3d7e8b6040e1.png">

#### terdatamlから SCIKIT-LEARN 関数の呼び出し
<img width="700" alt="Scikit-learn.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2740723/585b832c-aa71-791d-aa3f-c8b3c6593cd6.png">

## おわりに
:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradataへのお問合せ
[Teradataへのお問合せ](https://www.teradata.jp/About-Us/Contact)
Custom error messages : カスタムエラーメッセージ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

フローでもApexトリガーと同じことができるようになったとの認識です。

# Salesforceのヘルプ記事

+ [設定可能なセルフ登録ハンドラーのカスタムエラーメッセージの作成](https://help.salesforce.com/s/articleView?id=sf.external_identity_self_registration_custom_error.htm&type=5)
+ [レコードトリガーフローでのカスタムエラーメッセージの作成](https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_create_custom_error_messages_in_record_triggered_flows.htm&release=246&type=5)

新しいカスタムエラーメッセージ要素を使用して、エンドユーザー向けに何が問題であったかや、どのように修正するかを説明する、対象を絞ったエラーメッセージを作成します。エラーメッセージは全体のレコードページに表示されるか、特定の項目にインラインエラーとして表示されます。関連付けられたレコード変更はロールバックされます。エラーメッセージは保存前フローと保存後フローに作成できます。この機能は、IdeaExchange のアイデアのおかげで実現しました。

# 関連する質問

+ [Do Custom Error Notifications make Validation Rules Obsolete?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ifemr)


please check the link;
https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000A7reESAR

 Validation rules are best for simple, field-level checks and provide immediate feedback. Use them for straightforward validations. Custom error notifications are for more complex scenarios needing tailored handling or multi-step logic. Don’t replace all validation rules with custom flows; use validation rules for basic needs and custom flows for advanced requirements. 

 検証ルールは、単純なフィールド レベルのチェックに最適で、即時のフィードバックを提供します。簡単な検証に使用します。カスタム エラー通知は、カスタマイズされた処理や複数ステップのロジックを必要とする、より複雑なシナリオに使用します。すべての検証ルールをカスタム フローに置き換えるのではなく、基本的なニーズには検証ルールを使用し、高度な要件にはカスタム フローを使用してください。 

 

Custom error messages are more advanced than validation rules. While validation rules are primarily for data integrity, custom error messages can be used for a wide variety of scenarios.

One example is that a validation rule can only trigger an error when you are editing a contact by checking something on the account. However, the opposite is not possible with validation rules but is achievable with custom error messages.

カスタム エラー メッセージは検証ルールよりも高度です。検証ルールは主にデータの整合性を目的としていますが、カスタム エラー メッセージはさまざまなシナリオで使用できます。

一例として、検証ルールでは、アカウントで何かをチェックして連絡先を編集しているときにのみエラーをトリガーできます。ただし、検証ルールではその逆は不可能ですが、カスタム エラー メッセージでは実現可能です。
コンポーネントとモジュールの違い

## はじめに
コンポーネントとモジュールはどちらも部品という意味で呼び出して使うものと理解していたのですが、どういう違いがあるのか理解できていないかったのでまとめていきたいと思います。
わかりやすくまとまってる記事を見つけたのでぜひこちらも参考にしてみてください。
[モジュールとは？ライブラリ、コンポーネントとの違い](https://medium-company.com/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB/)

## それぞれの定義
### コンポーネントとは
UIを独立した再利用可能なピースに分割したもの。例えば、ヘッダー、フッター、メインコンテンツ、サイドバー、ボタンなどに分割したものをコンポーネントと言います。
コンポーネントは呼び出して使うもので、単体で使うことは目的としておらず、単体では機能しません。

### モジュールとは
アプリケーション内の異なる部分で共有される機能やデータをまとめるものです。例えば商品管理をするアプリケーションであれば、商品の在庫データなどをまとめているものや、商品登録の機能などをモジュールと言います。
モジュールは呼び出して使うもので、単体で使うことは目的とされてませんが、単体でも機能します。

## Atomic Design（アトミックデザイン）
コンポーネントやモジュールはAtomic Designという考え方で使用されているみたいです。
Atomic Designとは、コンポーネントやモジュールよりももっと小さな単位に分割してコードを再利用する方法です。
気になる方はこちらの記事を参考にしてみてください。
[Atomic Design(アトミックデザイン)とは](https://zenn.dev/bizlink/articles/b5c8985af8407a)

## まとめ
- コンポーネント：呼び出して使うもので、単体としては機能しない
- モジュール：呼び出して使うもので、単体でも機能する

どちらも呼び出して使うものではあるが、単体として機能するかしないかに違いがあるみたいですね。
間違いや補足などあればコメントなどで教えていただきたいです。

## 参考記事
[Vue公式](https://ja.vuejs.org/guide/essentials/component-basics)
[モジュールとは？ライブラリ、コンポーネントとの違い](https://medium-company.com/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB/)
[Atomic Design(アトミックデザイン)とは](https://zenn.dev/bizlink/articles/b5c8985af8407a)
CodeceptJSでREST APIをテストする

## 初めに
自動化しないままにしてしまった課題を解決し、メモしていきたいと思う。
本記事では複数のアカウントのやり取りで進むシナリオを検証する方法を考える。
（手動テストを繰り返すのは大変…）

## 記事の対象
REST APIの実行を含むシナリオのCodeceptJSを用いたE2Eテストをしたい方

## この記事のゴール
- CodeceptJSを用いてREST APIを実行する
- その結果を検証する
- システムを通して正しい挙動をしているかを検証する

## CodeceptJSでREST APIをテストする
[公式ドキュメント](https://codecept.io/helpers/REST/)を参考にする。

### 設定
```codecept.conf.js```にある```exports.config```の```helpers```にドキュメントを参考に設定を追記する。
各プロパティの説明は[こちら](https://codecept.io/helpers/REST/#properties)。

```js
    // REST APIの設定
    REST: {
      // REST APIのエンドポイントを設定
      endpoint: 'https://{Domain}/{Path}',
      // ログ出力を整形する
      prettyPrintJson: true,
    },
```

### テストを作成する
REST APIのPOSTメソッドでメッセージを送信し、送信されたメッセージがシステムから閲覧できることをテストするコードを作成する。

```js
Feature("API実行");

const ScenarioPost = "POST";

Scenario(ScenarioPost, async ({ autoLogin }) => {
  // メッセージをAPIで送信
  await I.sendPostRequest('/message/post', { "message": "I want this book." });
  // エラーなく終了することを確認
  I.seeResponseCodeIsSuccessful();

  // システムにログイン
  await autoLogin("hiraUser");
  // メッセージ確認画面へ遷移
  I.amOnPage(sendMessageUrl);
  I.waitForText("メッセージ送信", 10);

  // 最新のメッセージが送信されたメッセージと一致していることを確認
  I.see("I want this book.", "$message-0");
});
```

## 最後に
APIを実行しシステム上に正しく反映されることのテストを自動化することができた。
過去に課題とは思っていたものの、調査コストを惜しんでしまい手動テストで済ませてしまった。
こういった技術的負債が残ることで開発スピードが著しく損なわれる。
次は各メソッドの設定方法、レスポンスの内容の確認方法をまとめていきたい。
時系列データの管理に関する覚書

## この記事で扱う内容

時系列データの管理に関して、以下の２点について扱います。この二つの観点は関連しています。

 - 分散環境における管理方法
 - データ保存期間

## 分散環境における時系列データの管理方法

分散データベースでは、データのパーティショニング（あるいはシャーディング）が行われます。
このパーティショニングは、（明示的にであれ、潜在的にであれ）何らかの値をもとに行われます。

Apache Cassandraでは、明示的に、パーティションの基準とする値に用いるキーを指定します。

時系列データを管理する場合のパーティションキー設計のパターンとして「タイムバケッティング(time bucketing)」があります。

```sql
CREATE TABLE device (
  deviceid INT,
  monthbucket TEXT,
  timestamp TIMESTAMP,
  ...
  PRIMARY KEY ((deviceid,monthbucket),timestamp));
```

ここで`monthbucket`には、例えば`202308`のように`timestamp`値を構成する年と月のデータを格納することが考えられます（これは、あくまで例であり、後述のデータ保存期間との関係で、異なる粒度を選択することが考えられます）。

このような設計にすることにより、以下の２点の効果があります。

 - 検索性能
 - データ分散

 ### 検索性能

データ検索時に限られたパーティション（/ノード/物理サーバ）にアクセスすれば済むため、検索性能があがります。

### データ分散

上述の検索性能を実現するだけであれば、`timestamp`カラム自体をパーティションキーにすることが考えられます。しかし、少し考えればわかるように、これはパーティションキーの種類が、すぎに膨大になり、無限に増殖することを意味します。一般にこのようにタイムスタンプ値自体をパーティショニングの基準にすることはアンチパターンといえます。「タイムバケッティング(time bucketing)」の手法を用いることで、このアンチパターンを回避しつつ、時系列情報を検索に用いることができます。

### 実例

以下は、クエリの例です。`monthbucket`を検索に用いると同時に`timestamp`でより詳細な時間を指定します。そのために、`timestamp`カラムは検索可能なカラム（Cassandraにおけるクラスタリングキー）として設定されている必要があります。

```sql
SELECT * FROM device
WHERE deviceid='123' AND monthbucket='202303'
AND timestamp >= '2023-03-01 00:00:00-0500'
AND timestamp < '2023-03-16 00:00:00-0500';
```

## 分散環境における時系列データの保存方法

### 問題

時系列データの管理においては、データが持続的に増え続けることへの考慮が必要です。
つまり、特に何の配慮も行わない場合、検索性能は、（どれだけ技術的な最適化が行われていたとしても）論理的に下がり続けることになります。

ここでは、時系列データを管理するためのひとつのパターンについて紹介します。

データ管理において、よくある考え方としては、古いデータを退避する、というものがあります。このことによって、そのテーブルのデータの量は一定量に保たれ、検索性能について、一貫した性能を期待することができます。

よくある手法では、テーブルから古くなったデータを抽出し、オブジェクトストアなどの他の環境に保存し、元のテーブルから削除するという方法があります。この場合、以下の２点について考慮する必要があります。

 - データの退避（移動）方法（ETLなどの活用）
 - （退避先からの）データの検索方法（データベースとは別の検索方法）

これらは、時系列データを管理するデータベースとは、他の技術によって実現することになります。

### TTL利用

Apache Cassandraのように、データベースにはテーブルのデータに有効期限/TTL(time to live)を指定することによって、一定期間の後に、有効期限が過ぎたデータを削除する機能があります。

データの格納時に、TTLが設定されたテーブルと、TTLが設定されていないテーブルの二つにデータを格納することによって、上述の二つの問題を同時に解決することができます。

この二つのテーブルは、以下のようなイメージになります。

 - `LATEST_DATA_WITH_TTL`
 - `HISTORICAL_DATA_WITHOUT_TTL`

例えば、このテーブルへのクエリを行う要件の大部分（90%以上など）が、過去１か月のデータへのクエリである場合、TTLとして２か月程度（単純に現在時点から１か月前ではなく「先月のデータ」という要件も考慮すべき）を設定することが考えられます。このTTL期間設定は、クエリ要件と照らし合わせて、設計することになります。

この手法は、過去のデータをつねに（多少の検索性能は犠牲としても）アクティブな状態にしておきたいという要件を（オブジェクトストアへの別の検索手段を講じずに、たんに検索先テーブルを変更するだけで）満たすことができます。

また、このような手法と、従来の外部へのデータ退避とを組み合わせることも考えることができます。例えば、数か月前のデータを`HISTORICAL_DATA_WITHOUT_TTL`に移すことで、クエリの90%は、`LATEST_DATA_WITH_TTL`へのクエリとして予想された性能を確保します。その後、`HISTORICAL_DATA_WITHOUT_TTL`へのクエリ要件において、数年前のデータへのクエリ要件が例えば、1%以下であれば、その期間を超えるデータは、オブジェクトストアへ退避して、データベースの無制限のデータ容量を避けながら、1%以下のデータ検索の要件に対しては、マニュアル操作によるデータ復帰プロセスを含めて、例えばリクエストから一週間でデータ提供、といったサービスレベルを定めることが考えられます。

また、このことによりデータ退避処理期間中にテーブルへの検索性能が下がるといった問題についても、（検索要件の90%で）避けることができます。


## 参考情報

https://stackoverflow.com/questions/36048660/cassandra-partition-key-for-time-series-data
dbtでsnowflake に作成してあるUDF(ユーザ定義関数)を呼び出したい

#### 予めsnowflake環境にfunctionが作成してあって、それをdbt cloudから呼び出したい
```sql
create or replace function my_db.my_schema.func_fujiyama (kome_id int)
    returns varchar
    AS
    $$
        SELECT 'Ha!Ha!Ha!' || to_char(kome_id)
    $$
;
```

#### dbt で呼び出すマートを作成する
```sql
SELECT 
  func_fujiyama(kome_id) AS go_funk
FROM {{ ref('kome_table') }}

```
→ Preview は結果が表示される
→ Build すると、エラーになる。
```
002140 (42601): SQL compilation error:
  Unknown function func_fujiyama
```

#### 解決した方法
```sql
SELECT 
  {{target.schema}}.func_fujiyama(kome_id) AS go_funk
FROM {{ ref('kome_table') }}

```
Build先スキーマとfunctionが置いてあるスキーマが同一なら、いったんこれで解決。
別スキーマにfunctionがある場合等は引き続き調査が必要。（情報をお待ちしております。）
【Flutter】画面遷移に使えるRoutemasterとNavigatorの基礎知識まとめ

# Routemaster
### 機能
アプリ全体のルートをまとめて管理。URLや複数の画面遷移を計画的に設定。
### 役割
ドラえもんが一日の移動計画を全部まとめて決めるように、アプリ全体のルートを事前に管理。
### メリット
- 全体管理がしやすい
    - 画面遷移のルールを一元管理できるため、大規模なアプリで複雑なナビゲーションが必要な場合に便利
- URLベースのルーティング
    - Webアプリでのページ管理や深いリンクへの対応が簡単
### デメリット
- 初期設定が複雑
    - 導入と設定がやや複雑で、学習コストがかかる
- 柔軟性が低い
    - 動的にルートを変更する際には、制限がある場合がある
### 使い方のポイント
- 大規模なアプリや複雑なルーティングが必要な場合に適している。Webアプリや複数のエントリーポイントがあるアプリでは特に有効
- 一日の全ての移動を事前に計画する必要があるとき（複雑なルートを管理したいとき）に使う
### 例
Routemasterは、ドラえもんが「どこでもドア」を使って、のび太の一日の移動計画を全体的に管理するようなもの。たとえば、家から学校、友達の家、そしてまた家に帰るまでの全てのルートを最初に設定して、計画通りに移動する。



# Navigator
### 機能
画面ごとの遷移を個別に処理。ユーザーの操作に応じてその場でルートを決める。
### 役割
ドラえもんがその場でのび太を一歩一歩案内するように、必要なときに画面遷移をサポート。
### メリット
- シンプルで柔軟
    - 小規模なアプリや簡単な画面遷移に適しており、動的なルーティングも比較的簡単に実装できる
- 使いやすい
    - Flutterの標準機能なので、初心者にも使いやすい
### デメリット
- 規模が大きくなると管理が大変
    - 多くの画面があるアプリでは、遷移の管理が複雑になりがち
### 使い方のポイント
- 小規模なアプリや単純な画面遷移が多い場合に適している。シンプルな構造のアプリで効果的
- その場で柔軟に進むべき道を決めたいとき（シンプルで小規模な移動）に使う
### 例
Navigatorは、のび太が「どこでもドア」で設定された各場所に着いた後、実際にその場所でどの道を進むかを一歩一歩案内してくれるドラえもん。たとえば、学校に着いたら教室までの道を教える役割。
Databricksノートブックで行の折り返しがサポートされました

これも地味ですが、嬉しいアップデート。

[Line wrapping](https://docs.databricks.com/en/notebooks/notebook-ui.html#line-wrap)

> ノートブックセルの行の折り返しの有効化、無効化ができるようになり、複数行に折り返す、あるいは水平スクロールによる単一業のままにすることができるようになりました。
>
> 1. 全てのページの右上のプロファイルアイコンで、設定をクリックします。
> 1. 開発者 > 行の折り返し をクリックします。 

これまでは1行が長い場合、水平スクロールバーが表示されていました。
![Screenshot 2024-08-21 at 8.07.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a4cde552-2bdb-fc8e-43fc-c48d3fce97cf.png)

設定画面でLine Wrappingを有効化・無効化します。デフォルトでオンになっていました。(翻訳の修正は依頼済みです)

![Screenshot 2024-08-21 at 8.07.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/530df8c0-135b-4b72-f112-9706603aacbc.png)

有効化されている場合、セル内の行が折り返されます。
![Screenshot 2024-08-21 at 8.08.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fe3bc3fb-8d40-c9a5-3654-b5835ca174fe.png)


### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.12 (3拍子、口笛、スキャット、そよ風と木漏れ日を感じる編曲)【動画 2分56秒】【YouTubeチャンネルからの転記です】

この記事は、わたしの[YouTubeチャンネル](https://bit.ly/Yamanaka-YouTube "Living without things. 持たない生き方 手放す生き方")にある公開動画を転記しております。
( どこかのタイミングで、プログラミング-Google Apps Script or iPaaS-Zapier をつかって自動転記させる予定です )

転記のための時間コストを少なくしたいので、文字装飾( Markdown記法 )を極力つかわずに書いております。

こちらが動画内容です👇

***

![01 YouTube再生中の画像 Suno AI _ しろぶりゅーの歌 ver.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386308/6665e877-e6be-e3f1-332a-8fa63e8a2f8e.png)



* # 動画URL
    * https://youtu.be/unZZDagi2OI

<br>

* # 動画タイトル
    * 【Suno AIでつくった楽曲】しろぶりゅーの歌 ver.12 (3拍子、口笛、スキャット、そよ風と木漏れ日を感じる編曲)【動画 2分56秒】

<br>

* # 動画の説明欄(一部を抜粋)

📅撮影日 = 2024-08-09(金)

Suno AIとは、文章から音楽を生成することができるAI( Text-to-Music-AI )です。
わたしは、2024-04-02(火)に初めてSuno AIで有償プランを契約してから、時々楽曲をつくって遊んでいます。

🎦【Suno AI】文章から音楽を生成するAI( Text-to-Music-AI )で、3分間で2曲、6分間で4曲作りました【試聴可能】1)伴侶の曲 2)税理士の曲【動画 16分11秒】
https://youtu.be/QKfhk4HgQ_g

🎦“Suno AIでつくった楽曲”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe

🎦“効果的にSuno AIを活用するヒント”シリーズ
https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


今回は、Suno AIでつくった曲を WAV で出力してから、動画編集いたしました。

スロージョギングの途中に、早朝の中目黒で偶然出会った「しろぶりゅー」-ShiroBrew-のテーマソング( イメージソングは和製英語です )を、1人のファンとして自主的につくりました。
つまり「しろぶりゅー」のファンメイドテーマソングです。

ぜひ聴いてみてください。
そして、ぜひみなさんも、あなたが大好きなお店やブランドや企業のために楽曲をつくってみてください！

作曲日:
2024-07-20(土)

Suno AI 契約の種類:
Pro Plan

楽曲の正式名称:
しろぶりゅーの歌 #12

Suno AI Library URL:
https://bit.ly/ShiroBrew-12

Custom Mode: On

Audio Inputs: Not Used

With Vocals:


---


Lyrics(without Meta tags):

真っ白な心

そよ風感じる

コーヒーの香りと
真っ白な心


---


Lyrics & Meta tags:

[Break]

[Intro]

[Whistling]

[Verse]
真っ白な心

[Verse 2]
そよ風感じる

[Chorus]
コーヒーの香りと
真っ白な心

[Whistling]

[Chuckles]

[Outro]


---


Suno AIへの指示文章( プロンプト/Prompt ): Custom Modeの場合は”Style of Music”を指定します。


🇬🇧English

[Waltz][200 seconds][Lo-fi][Female voice][Ballad][Romantic]


🇯🇵日本語訳

[ワルツ][200秒][ローファイ][女性ボイス][バラード][ロマンチック]


---


Suno AI 公式URL
https://accounts.suno.ai


SHIROノMONO 公式URL - Instagram
https://www.instagram.com/shiro_nomono


---


✓ 🎥この動画と関連が強いわたしの動画 ↙
　・“Suno AIでつくった楽曲”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghMLdiSVqwvSs_Z5y0H4VGOe


　・“効果的にSuno AIを活用するヒント”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPuaNOVZn-N53wVvsBkeHdI


　・“Suno AIで3拍子”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghNy-xIeeMZV6D2YAnax9Nzw


　・“しろぶりゅー ファンメイドソング”シリーズ
　https://www.youtube.com/playlist?list=PLpQhBHT4oghPk5-_YwWl499DNAOVKlcvZ


✓ 🎥Shortened URL for this video | この動画の短縮URL ↙
　https://bit.ly/4cnS57M
CloudFunctionsが正常に動いているかの確認

自分の備忘録として書いています。

# この記事でやること
CloudFunctionsが正常に動作しているかを確認します。
前提として、下記記事で作成してバッチが正常に動いているかを確認します。

https://qiita.com/taku-ll/items/2f6a7a2e69eba52bb169

# 1. Google Cloud Consoleでのログの確認
Google Cloud Consoleでは、Cloud Functionsのログを確認することができます。ここでは、エラーが発生しているか、バッチ操作が正常に動作しているかなどを確認することが可能です。

1. Google Cloud Consoleにアクセス
Google Cloud Consoleにアクセスし、Firebaseプロジェクトにログインします。
1. Cloud Functionsのリストを確認
左側のメニューから「Cloud Functions」を選択し、もしくは検索バーから「Cloud Functions」を検索・選択し、Cloud Functionsの一覧を表示します。
1. 関数の詳細ページに移動
確認したい関数の名前をクリックして、詳細ページに移動します。
ここには、関数の実行回数、最終実行時間、失敗回数などが表示されます。
1. ログの確認
詳細ページにある「ログ」タブをクリックします。ここで、関数の実行履歴やエラーメッセージを確認できます。
console.logやconsole.errorを使って関数内で出力したログメッセージもここに表示されます。

# 2. Firebaseコンソールでのログの確認
Firebaseコンソールでも、Cloud Functionsのログを簡単に確認することができます。

1. Firebaseコンソールにアクセス
Firebaseプロジェクトにログインし、Firebaseコンソールにアクセスします。
1. Functionsセクションに移動
左側のメニューから「Functions」を選択します。ここで、デプロイされているすべてのCloud Functionsを確認できます。
1. ログの確認
確認したい関数の横にある「ログを表示」をクリックします。Google Cloud Consoleにリダイレクトされ、関数のログが表示されます。

# 3. バッチ処理が正常に動作しているか確認する方法
バッチ処理が正常に動作しているかを確認するためには、バッチの実行結果や、Firestoreデータの更新状況をチェックすることが重要です。

### ログでの確認
console.logを使用して、バッチ操作のステータスや、バッチが更新したドキュメント数などを出力することができます。

**例: バッチ処理の成功/失敗のログ確認**
```
const batch = db.batch();
snapshot.forEach(doc => {
    batch.update(doc.ref, { isDisplayed: true });
});
await batch.commit().then(() => {
    console.log('Batch commit successful, updated documents:', snapshot.size);
}).catch(error => {
    console.error('Batch commit failed:', error);
});
```
成功時には「Batch commit successful」というメッセージが、失敗時には「Batch commit failed」というエラーメッセージがログに出力されます。

# 4. 関数のパフォーマンスをモニタリング
Google Cloud Consoleの「Cloud Monitoring」セクションで、Cloud Functionsのパフォーマンスをモニタリングすることができます。関数の実行時間やエラー率など、詳細なメトリクスを確認できます。

1. Google Cloud Monitoringにアクセス
Google Cloud Monitoringにアクセスし、プロジェクトを選択します。
1. メトリクスの確認
Cloud Functionsのメトリクスを確認するために、メトリクスエクスプローラーを使用します。ここで、関数の実行時間、失敗率、メモリ使用量などのデータを確認することができます。

# まとめ
- Google Cloud ConsoleまたはFirebaseコンソールの「ログ」タブで、関数のログを確認し、エラーやバッチの状態をチェックできます。
- console.logやconsole.errorを使用して、バッチの進行状況やエラーを記録することで、正常に動作しているかを確認できます。
- Cloud Monitoringを使って、関数のパフォーマンスやエラー率を確認することもできます。

これにより、Cloud Functionsが正常に動作しているかどうかを簡単に確認することができます。
C#でvisitorパターンのコード例

# シナリオ
「ショッピングカートに複数の商品があり、それぞれの商品に対して異なる割引計算を行う」というシナリオで考える。各商品には異なるタイプがあり（例えば、食品や家電など）、割引の計算は商品タイプごとに異なる。

# コード例
~~~c#
using System;
using System.Collections.Generic;

// Visitor interface - 割引を適用するためのインターフェース
interface IDiscountVisitor
{
    void Visit(FoodItem item);
    void Visit(ElectronicsItem item);
}

// ConcreteVisitor - 具体的な割引計算を行うクラス
class DiscountVisitor : IDiscountVisitor
{
    public void Visit(FoodItem item)
    {
        // 食品に10%の割引を適用
        Console.WriteLine($"Applying 10% discount to food item: {item.Name}");
        item.Price *= 0.9;
    }

    public void Visit(ElectronicsItem item)
    {
        // 家電に15%の割引を適用
        Console.WriteLine($"Applying 15% discount to electronics item: {item.Name}");
        item.Price *= 0.85;
    }
}

// Element interface - 商品のインターフェース
interface ICartItem
{
    void Accept(IDiscountVisitor visitor);
    string Name { get; }
    double Price { get; set; }
}

// ConcreteElementA - 食品の商品クラス
class FoodItem : ICartItem
{
    public string Name { get; private set; }
    public double Price { get; set; }

    public FoodItem(string name, double price)
    {
        Name = name;
        Price = price;
    }

    public void Accept(IDiscountVisitor visitor)
    {
        visitor.Visit(this);
    }
}

// ConcreteElementB - 家電の商品クラス
class ElectronicsItem : ICartItem
{
    public string Name { get; private set; }
    public double Price { get; set; }

    public ElectronicsItem(string name, double price)
    {
        Name = name;
        Price = price;
    }

    public void Accept(IDiscountVisitor visitor)
    {
        visitor.Visit(this);
    }
}

// Client code
class Program
{
    static void Main(string[] args)
    {
        List<ICartItem> cartItems = new List<ICartItem>
        {
            new FoodItem("Apple", 100),
            new ElectronicsItem("Laptop", 1000)
        };

        IDiscountVisitor discountVisitor = new DiscountVisitor();

        foreach (var item in cartItems)
        {
            item.Accept(discountVisitor);
            Console.WriteLine($"{item.Name} after discount: {item.Price:C}");
        }
    }
}
~~~
# クラス図
![勉強 - Visitorパターン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14345/7753d4e1-c5e8-c880-dd0a-c612be099f3c.png)
# 説明
この具体例では、Visitorパターンを使うことで、商品ごとの異なる割引ロジックをクラスに変更を加えることなく柔軟に追加できている。
# どんなケースで有効か
ビジターパターンは、データ構造が比較的安定しており、操作が頻繁に追加・変更される場合に特に有効。この場合、ビジターパターンを利用することで、データ構造クラスに手を加えることなく新しいビジターを追加するだけで、異なる操作を実装できる。これにより、クラスの保守性が向上する。
### コンパイラやインタプリタの開発
ケース: 抽象構文木（AST）を使ってプログラムを解析、最適化、コード生成する。
ビジターパターンの利点: 各解析フェーズ（型チェック、コード生成など）を別々のビジターとして実装できるため、新しい解析処理を追加しやすい。
### グラフィック描画
ケース: 異なるグラフィック要素（線、円、矩形など）を複数の描画エンジンや出力形式（画面表示、印刷、SVGなど）に対応させる。
ビジターパターンの利点: 各描画エンジンや出力形式ごとにビジターを作成することで、描画方法を柔軟に拡張できる。

# 他記事
Visitorパターンで型によるswitchやif判定を消す
https://qiita.com/toRisouP/items/d96a09fab827af17fb37

【C#】データ構造と処理を分離するVisitorパターンを学ぶ
https://www.hanachiru-blog.com/entry/2021/02/18/120000
WindowsでGitコマンド補完を有効にする方法

# はじめに
　WindowsのPowerShellで、Gitコマンドの補完を有効にする方法を紹介する。Visual Studio CodeのターミナルでもGit補完が有効となる。

# 動作確認環境

* Windows 10 64bit
* PowerShell

# 方法
　Git自体は既に導入されているものとする。Gitは、[インストーラ](https://git-scm.com/downloads)から簡単に導入可能。
　Git補完するために、[posh-git](https://github.com/dahlbyk/posh-git)というツールを利用する。posh-gitは、PowerShellでGit補完を有効にするためのツールである。

1. 管理者権限でPowerShellを開く
2. 下記コマンドでposh-gitをインストールする
    現在のユーザのみインストールする場合
    ```powershell
    Install-Module posh-git -Scope CurrentUser -Force
    ```
3. PowerShellのプロファイルに以下をposh-gitを有効にする設定を追加する
    1. プロファイルの場所を確認する
        ```powershell
        $PROFILE
        ```
        以下のようなパスが取得できることを確認する。
        ```powershell
        C:\Users\{username}\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
        ```
        もしプロファイルが存在しないエラーとなる場合は、下記をコピーして現在ユーザのプロファイルを作成する。
        ```powershell
        if (!(Test-Path -Path $PROFILE)) {
            New-Item -ItemType File -Path $PROFILE -Force
        }
        ```
        PowerShellのプロファイルの詳細は以下を参照。
        * https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.4#how-to-create-a-profile
        * https://zenn.dev/yuta28/articles/powershell-profile
        
    2. メモ帳などで上記プロファイル(Microsoft.PowerShell_profile.ps1)を開いて、下記設定を追記する
        ```powershell
        Import-Module posh-git
        ```
    
4. PowerShellを再起動して、Gitコマンド補完が有効になっていれば成功


# まとめ
　WindowsでGitコマンド補完を有効にする方法を紹介した。Visual Studio Codeのターミナルでも有効になるため、Windows上でのプログラミング開発の効率化に役立つ。

# 参考

https://zenn.dev/torakm/articles/8a52dcc49a5845

https://qiita.com/masakinihirota/items/30767a29d947d7db8f80
supabase_vector_[アプリ名] container is not ready: unhealthy エラー対処方法 Supabaseローカル開発環境

このエラーは、Dockerのコンテナとボリューム、イメージを全削除し、全く新しい場所にNext.jsとSupabaseをインストールしても再現されたので、記事を書いておきます。
(複数回同じ環境をインストールすると再現されました。)

```terminal
Dockerを綺麗にする。
すべてのコンテナを表示
docker ps -a

Docker すべてのコンテナを停止します。
docker stop $(docker ps -q)

コンテナをすべて削除します (rmコマンドは起動中のものは削除できない)
docker rm $(docker ps -aq)

未使用のVolumeを一括削除
Volumeはコンテナを削除しないと消せない
docker volume prune

```

ターミナル
<font color="red">**supabase_vector_[アプリ名] container is not ready: unhealthy**</font>

Supabaseのローカル開発環境のDockerでの👆エラーで困ってたけど

https://github.com/supabase/cli/issues/2588

に解決方法が載ってたので

analyticsの👇 `enabled = false` にします。

```configi.toml
[analytics]
enabled = false
port = 54327
# Configure one of the supported backends: `postgres`, `bigquery`.
backend = "postgres"

```

ローカル開発環境だから `analytics` いらないよねってことで無効化。
【リミット１２】１２時間で投稿ポイントが消えるＷｅｂ地図を作りました。

【リミット１２】
https://chosashi-data.org/shirado/limit12/
１２時間で投稿ポイントが消えるＷｅｂ地図を作りました。

通常利用としては、楽しいクチコミ（美味しい・楽しい）や、ちょっとしたメモを自由にプロットできます。
現在は、テスト運用中なのでログイン等は不要で表示・投稿できます。
※ログインタイプに変更を予定しております。


＜目　的＞
　・気軽に楽しいクチコミなどをＷｅｂ地図に表示したい
　・災害時などは支援情報（避難所・給水所など）を共有したい

＜仕　様＞
　・Ｗｅｂ地図（ＷｅｂＧＩＳ）のため、ソフトのインストールが不要
　・ブラウザ動作のため、ＰＣ・タブレット・スマホのなんでもＯＫ
　・地図上の任意の場所をダブルクリック（ダブルタップ）することで投稿（ＰＯＳＴ）が可能
　・最新情報（１０件）は左上にリスト表示（展開が必要）
　・１分ごとに最新情報を更新（現在は１分ですが、後で変わるかもしれません）

＜特　徴＞
　・シンプルな機能で使いやすい
　・１２時間でデータが投稿（ポスト）が消えるため、管理不要
　・１２時間でデータが消えることから、データ鮮度が保たれる
 　　（古い情報は自動的になくなる）

＜用　途＞
　・日常の楽しいクチコミを投稿し、多くの人で共有する。
　・地図上にプロットされた投稿の近くにコメントを残すこともできる。
　・災害時は支援情報（避難所・給水所など）を多くの人で共有することが可能。

＜技　術＞
　・ＷｅｂＧＩＳはオープンソースのMapLibre GL JSを使用
　・サーバーはさくらインターネットのスタンダードプランを使用（MySQL）
　・背景地図は、国土地理院最適化ベクトルタイルを使用
　・地点情報は、Overture Mapsを使用

 
＜課　題＞
　・Overture Mapsに合わせてグリフを設定しているが、全角のアルファベットや数字、記号は地図上に表示されない。
　　※どうしたら良いものか・・・。

　・Overture Mapsの情報が古かったり、間違っていたりする。
　　※無料なので文句は言えないが、、、、

　・人が嫌な気分になる投稿は遠慮下さいと書いてあるが、場合によってはそういった問題も考えなくてはいけない。
　　※どうしたら良いものか・・・。

　・データ削除機能及び権限をどのようにするか。
　　※まだまだ未完成。

　・人気が出ちゃったら、サーバーが耐えられるのか？？？
　　※人気が出てから考えよう。

 
＜今後の期待＞
　平常時にこういったクチコミＷｅｂ地図に慣れておくことで、災害時にスムーズにＷｅｂ地図で調べることが可能になると思われます。多くの方の利用を期待します！！



まだまだ、未完成なＷｅｂ地図ですが、たくさん利用し、改良していければと思っています。ぜひ、楽しいクチコミ等をお気軽に投稿ください！！
AWS DVA-C02 合格体験記

## はじめに
無事DVA-C02の取得ができたので、勉強した内容などを記載します。

## 前提
- AWSの業務利用は無し。(VPCフローログ見るくらい)
- CLF、SAA、SOAは取得済み。
- アプリケーションの開発経験は無し。

## 試験のスコア
819点

## 学習期間
1ヶ月くらい

## 学習リソース
- [AWS公式試験ガイド](https://d1.awsstatic.com/ja_JP/training-and-certification/docs-dev-associate/AWS-Certified-Developer-Associate_Exam-Guide.pdf)
- [AWS Skill Builderデジタルトレーニング](https://explore.skillbuilder.aws/learn/course/18618/exam-prep-standard-course-aws-certified-developer-associate-dva-c02-japanese)
- [AWS Skill Builder模擬問題](https://explore.skillbuilder.aws/learn/course/14060/aws-certified-developer-associate-official-practice-question-set-dva-c02-japanese)
- [WEB問題集(CloudTech)](https://kws-cloud-tech.com/)
- [Udemy問題集](https://www.udemy.com/course/dva-c02aws-2024/?couponCode=SKILLS4SALEJP)
- [参考書](https://amzn.asia/d/9SFHhMo)

## 学習順序
学習順序は、
①AWS公式試験ガイド
②参考書
③AWS Skill Builderデジタルトレーニング
④AWS Skill Builder模擬問題
⑤WEB問題集(CloudTech)
⑥Udemy問題集
の順になります。

## 学習内容
##### ①試験ガイドの参照
試験で問われる内容と範囲を確認します。
そこまで深く確認する必要はありませんが、各分野に記載されている対象スキルと対象サービスは確認しておきましょう。
横文字が多く、最初は何を言ってるかわからない人もいると思いますが、重要な単語になってくるのでChatGPTなどを活用してもいいと思うので、どういう言葉なのか概念を抑えておきましょう。

##### ②参考書の参照
参考書で主要なサービスの重要な機能や設計で必要な考え方を抑えます。
利用した参考書は、試験ガイドに合わせた章立てになっており、
各章の終わりに理解度テストがあったのでそこで自身の理解度を確認することができました。
とりあえず、1週して問題集などで躓いたサービスを再度確認するような使い方をしました。

##### ③AWS Skill Builderデジタルトレーニングの参照
だいぶ聞き流していましたが、学習コースの中で別のコースを参照するものがあるので、今まで利用してこなかったサービスは別のコースも参照するようにしました。

##### ④AWS Skill Builder模擬問題の実施
AWS公式の模擬問題(20問セット)です。
いつも初回は正答率が50%くらいなのでここで焦ります。
正解でも不正解でもすべての選択肢の解説を読んで、なぜその選択肢が正解なのか、不正解なのかを確認します。

##### ⑤WEB問題集(CloudTech)の実施
ここらで概要だけは抑えているレベルになるはずなので、問題集をひたすら解いていきました。
公式模擬問題と同じように、正解でも不正解でも必ず解説を読みます。
解説を読んでも理解できないものに関しては、CloudTechのレッスン動画を確認しました。
すべてのサービスのレッスン動画が用意されているわけではないので、用意されていないサービスに関しては公式ドキュメントやBlackBelt、ChatGPTを活用しました。

##### ⑥Udemy問題集の実施
CloudTechでは、264問の模擬問題が用意されていますが、念には念をということでUdemyも実施しました。
ここも公式問題集やWEB問題集と同様の学習方法です。

## 学習のポイント
学習していく中で大事になってくるのが、「サービスの特徴を掴む」ということです。
サービスのできること・できないことを理解することで、正解を導く力が付きます。

一例ですが、Secrets ManagerとParameter Storeでは、両方セキュアな情報を保管することができますが、ローテション機能を有しているのはSecrets Managerです。
一方、Parameter Storeにはローテーション機能はありませんが、無料枠があるためセキュアな情報を保管する際にコストを抑えることができます。

例えば、「DBの接続情報をAWSサービスで保管し、定期的に情報のローテーションが必要なるが、どうすればいいか」という問いがあった際に、上記のように特徴とできること・できないことを知っておくことで、回答の選択肢を絞っていくことができます。

このできることとできないことを抑える学習方法は、実務に活かせる学習方法だと思っているので、「資格を取ることが目的になってしまっているなぁ・・・」と感じている人は今一度意識してみることをおすすめします。

## 感想
開発経験がなかったので、難しいんじゃないかなーと思っていましたが、思いのほか難易度は低かったので安心しました・・・。

## おわりに
年内にSAPの取得を目指して頑張ります。
Linux。tomcat10。起動でエラー。メモリ不足。メモリ割り当て減らす

omcat 10 の起動時にメモリ不足のエラーが発生する場合、以下の手順でメモリの割り当てを減らすことができます。

1. setenv.sh ファイルの作成または編集
Tomcat のメモリ設定は、setenv.sh というファイルに記述するのが一般的です。このファイルが存在しない場合は、新しく作成します。setenv.sh は Tomcat の bin ディレクトリ内に配置します。

2. JAVA_OPTS の設定
setenv.sh に以下のような内容を追加して、メモリの割り当てを制御します。

```sh
export JAVA_OPTS="-Xms512m -Xmx1024m"
```
ここで:

-Xms512m: 初期ヒープサイズを 512MB に設定
-Xmx1024m: 最大ヒープサイズを 1024MB に設定
これにより、Tomcat のメモリ使用量を制限できます。ヒープサイズの値は、サーバのメモリ容量に応じて調整してください。

3. Tomcat の再起動
設定を保存した後、Tomcat を再起動して変更を適用します。

```sh
./catalina.sh stop
./catalina.sh start
```
4. 設定の確認
Tomcat 起動時のログを確認し、メモリ設定が反映されているかを確認します。ログは通常 logs/catalina.out に出力されます。

これで、Tomcat がメモリ不足エラーを起こさずに起動できるようになるはずです。メモリ割り当てを減らしても問題が解決しない場合は、サーバの全体的なメモリ使用状況や、他のプロセスがメモリを大量に使用しているかどうかも確認してください。










ChatGPT の回答は必ずしも