OmniAICreator/Qiita-1.07M huggingface dataset:
Databricksの生成AIと大規模言語モデル(LLM)を整理してみた

# 背景・目的
Databricks上で生成AIを扱うための情報を整理します。

# まとめ

|特徴 |説明|
|:--|:--|
|生成AIとは|画像、テキスト、コード、合成データ等のコンテンツを作成する機能に焦点を当てた人工知能の一種<BR>生成AIアプリケーションは、LLMと基盤モデルの上に構築されている|
|LLM|言語処理タスクに優れている<BR>大量のデータセットを使用してトレーニングするディープラーニングモデル<BR>トレーニングデータに基づいて、自然言語を模倣するテキストの新しい組み合わせを作成する|
|ファウンデーションモデル|具体的な言語理解と生成タスクに合わせて、微調整をすること意図して事前にトレーニングされた大規模な機械学習モデル<BR>入力データ内のパターンを識別するために使用される|
|できること|・画像生成<BR>・テキスト文字起こし<BR>・翻訳<BR>・質問/回答の生成<BR>・テキストの意図や意味の解釈などの音声タスク|
|設計パターン|・プロンプトエンジニアリング<BR>・RAG<BR>・ファンチューニング<BR>・事前トレーニング|
|AIライフサイクルの統合|・MLFlow<BR>・特徴量エンジニアリングとサービス提供<BR>・Databricksモデルサービング<BR>・Vector Search<BR>・Lakehouse Monitoring<BR>・AI Playground|


# 概要
[Databricksの生成AIと大規模言語モデル(LLM)](https://docs.databricks.com/ja/generative-ai/generative-ai.html)を元に整理しています。

## 生成AIとは
> 生成AIは、コンピューターがモデルを使用して画像、テキスト、コード、合成データなどのコンテンツを作成する機能に焦点を当てた人工知能の一種です。
生成AI アプリケーションは、大規模言語モデル (LLM) と基盤モデルの上に構築されています。

- 画像、テキスト、コード、合成データ等のコンテンツを作成する機能に焦点を当てた人工知能の一種
- 生成AIアプリケーションは、LLMと基盤モデルの上に構築されている

> - LLMは 、言語処理タスクに優れているために、大量のデータセットを使用してトレーニングするディープラーニングモデルです。 トレーニングデータに基づいて、自然言語を模倣するテキストの新しい組み合わせを作成します。
> - ファウンデーションモデルは 、より具体的な言語理解と生成タスクに合わせて微調整することを意図して事前にトレーニングされた大規模な機械学習モデルです。 これらのモデルは、入力データ内のパターンを識別するために使用されます。

- LLM
    - 言語処理タスクに優れている
    - 大量のデータセットを使用してトレーニングするディープラーニングモデル
    - トレーニングデータに基づいて、自然言語を模倣するテキストの新しい組み合わせを作成する
- ファンデーションモデル
    - 具体的な言語理解と生成タスクに合わせて、微調整をすること意図して事前にトレーニングされた大規模な機械学習モデル
    - 入力データ内のパターンを識別するために使用される

> これらのモデルが学習プロセスを完了すると、プロンプトが表示されたときに統計的に可能性の高い出力が生成され、次のようなさまざまなタスクを実行するために使用できます。

> - 既存の画像に基づいて画像を生成するか、1つの画像のスタイルを利用して新しい画像を変更または作成します。
> - テキストの文字起こし、翻訳、質問/回答の生成、テキストの意図や意味の解釈などの音声タスク。

- 下記タスクを実行するために使用できる
    - 画像生成
    - テキスト文字起こし
    - 翻訳
    - 質問/回答の生成
    - テキストの意図や意味の解釈などの音声タスク

> 生成 AI には、次の設計パターンがあります。
> - プロンプトエンジニアリング:LLMの動作を導くための特殊なプロンプトの作成
> - 検索拡張世代(RAG):LLMと外部知識検索の組み合わせ
> - ファインチューニング:事前学習済みのLLMをドメインの特定のデータセットに適合させる
> - 事前トレーニング:LLMをゼロからトレーニングする

- プロンプトエンジニアリング
- RAG
- ファンチューニング
- 事前トレーニング

## Databricks上で生成型 AI と LLM を開発する
> Databricks は、データの収集と準備から、モデル開発と LLMOps、サービス提供とモニタリングまで、AI ライフサイクルを統合します。 次の機能は、生成AI アプリケーションの開発を容易にするために特別に最適化されています。

- Databricksでは、AIライフサイクルを統合している

> - モデル開発の追跡と LLM 評価 のための MLflow 。
> - 特徴量エンジニアリングとサービス提供。
> - Databricks モデルサービング (LLM をデプロイするためのもの)。 モデルサービングエンドポイントは、基盤モデルへのアクセス専用に構成できます。
     - 基盤モデルAPIsを用いた最先端のオープンLLM
    　　- Databricks の外部でホストされているサードパーティ モデル。 「Databricks モデルサービング」の「外部モデル」を参照してください。
> - Databricks Vector Search は、埋め込みベクターを格納し、ナレッジ ベースに自動的に同期するように構成できるクエリ可能なベクター データベースを提供します。
> - Lakehouse Monitoring :推論 テーブルによる自動ペイロードロギングを使用して、データモニタリングとモデルの予測品質とドリフトの追跡を行います。
> - Databricks ワークスペースから基盤モデルをテストするための AI Playground。プロンプトを表示、比較、およびシステム プロンプトや推論パラメーターなどの設定を調整できます。

- MLFlow
- 特徴量エンジニアリングとサービス提供
- Databricksモデルサービング
    - 基盤モデルAPIsを用いた最先端のオープンLLM
    - Databricksの外部でホストされているサードパーティモデル
- Vector Search
- Lakehouse Monitoring
- AI Playground

# 考察
今回は、Databricksの生成AIとLLMを整理してみました。
次回以降は、実際に手を動かしてみたいとおもいます。

# 参考
https://docs.databricks.com/ja/generative-ai/generative-ai.html
【TypeScript】ユニオン型から指定した値のみのユニオン型を作成する方法


以下のように記述するとユニオン型から指定した値のみのユニオン型を作成できます。

```ts
type T1 = "A" | "B" | "C" | "D" | "E"
type T2 = Extract<T1, "E">

// T2 = "E"
```

https://www.typescriptlang.org/docs/handbook/utility-types.html#extracttype-union
【応用情報技術者】データベース正規化

# はじめに
現在、応用情報技術者試験に向けて勉強をしているひよっこエンジニアです。
データベースの正規化について、復習の意味で記事にまとめたいと思います。
勉強中の初学者ですので、誤りなどがありましたら訂正していただけますと幸いです。

# 参考書籍
資格の勉強にはこちらの書籍を使用しています。

https://gihyo.jp/book/2023/978-4-297-13865-3

# 正規化とは
データベースのデータの更新（挿入、削除、修正など）を行なったとしても、データの整合性を保てるようにすることを目的とした操作です。

正規化した表のことを正規形といい、これには第1正規形から第5正規形までがあります。一般的なデータベースであれば第3正規形までで十分だと言われているみたいなので、今回は第3正規形までをまとめます。

# 第1正規化
非正規形から第1正規形にする、
> 繰り返し部分を排除する操作

です。言葉だけだとよくわからないので、実際のデータベースの例を示します。

今回例として考えたデータベースは、複数の店舗を持つチェーン飲食店の中央注文管理システムです。実際の店舗でこのようなデータベースが存在するのかはわかりませんが…

まずは、正規化されていない非正規形の表です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712912/e7dc1519-2aca-2e48-14d7-e42678abf33d.png)

これに第1正規化の操作を行なって、以下のような第1正規形にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712912/a87b3606-f0c0-4525-925c-80da9b6fce17.png)

非正規形だとセルを結合している部分がある、つまり、平坦な2次元になっていません。これでは関係データベースで定義できません。そこで、「商品番号」より右の繰り返し部分を別の表に分解しました。これによって平坦な2次元になりました。
売上明細表の主キーは「注文番号」と「商品番号」の複合キーで、「注文番号」は売上表の「注文番号」を指す外部キーです。

# 第2正規化
第1正規形から第2正規形にする、
> すべての非キー属性が、主キーに完全関数従属である状態にする操作

です。

この操作を行なった第2正規形です。段々と画像の文字サイズが小さくなってきました…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712912/c839a397-2822-7caa-c2dd-6aca3f97c7a6.png)
第1正規形だと、売上明細表の「商品名」と「単価」が、主キーに完全関数従属ではなく、主キーの一部である「商品番号」に部分関数従属している状態でした。

### 関数従属
Xの値が決まるとYの値も決まるとき、YはXに関数従属するといいます。
X->Y と表現します。
### 部分関数従属
Xの属性が複数ある（X1, X2とする）とき、X->Yであり、X1->Y または X2->Y である場合に、YはXに部分関数従属するといいます。
### 完全関数従属
Xの属性が複数ある（X1, X2とする）とき、X->Yであり、X1->Y でも X2->Y でもない場合に、YはXに完全関数従属するといいます。

# 第3正規化
第2正規形から第3正規形にする、
> 非キー属性間の関数従属をなくし、どの非キー属性も主キーに直接に関数従属している状態にする操作

です。

この操作を行なった第3正規形です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3712912/7f78b65e-5d82-7ba8-bb07-e6c434029ca2.png)
売上表に注目します。第2正規形では「店舗名」は「店舗番号」に関数従属で、非キー属性間の関数従属が存在したため、店舗表に切り分けます。

### 推移的関数従属
X->Y、Y->Z であり、Y->X でないとき、ZはXに推移的関数従属しているといいます。
第2正規形では X=注文番号、Y=店舗番号、Z=店舗名 としたときに成り立つので、「店舗名」は「注文番号」に推移的関数従属していると言えます。

# おわりに
以上でデータベース正規化手順の説明を終わります。
分かりづらい箇所がありましたら修正いたします。
最後までご覧いただきありがとうございました。
なぜAPIをRESTで作るのか

# 1. はじめに
Web APIについて勉強していると「RESTとは何か」「RESTでAPIを作れ」という記述を見かけますが、「なぜRESTなのか」についてはあまり見かけなかったので経緯を簡単にまとめてみました。（参考にした文献は最後に記載しています）

# 2. REST以前の時代
・1999年まで、API開発に決まったプロトコルは無かった（RPC（Remote Procedure Call）というプロトコルはあったが、派生の型が沢山生まれていた）
・1999年にSOAP（Simple Object Access Protocol）、2000年にREST（Representational State Transfer）が登場した

# 3. SOAPとREST
・API開発の初期には、SOAPが広く採用された。SOAPは、XMLベースで、アプリケーション間で構造化された情報をやり取りするためのプロトコルとして開発されている
・SOAPの強みは、高度な構造化・強い型付けによる堅牢性だったが、メッセージが冗長になりやすくネットワーク帯域幅の影響を受けやすい、仕様が厳格で開発者にとっては扱いづらいといった欠点があった
・一方、RESTはシンプルさに重点を置き、使いやすいという利点があった。GET、POST、PUT、DELETEのような標準的なHTTPメソッドを使うことができ、またクライアントとサーバーを分離することで、内部のメンテナンスや新機能の導入を容易にした。
・RESTはその後広く普及し、現在SOAPはあまり使用されなくなっている

# 4. RESTの課題と今後
・RESTでは以下の3つの課題がある
➀オーバーフェッチング（エンドポイントを叩いたときに不要なデータまで取得してしまうことがある）
⓶アンダーフェッチング（必要なデータを得るためのエンドポイントが複数に分かれている場合、その分リクエストを送る必要があり、負荷が増加、レスポンスが悪化することがある）
③アプリケーションの仕様が複雑だったり、色々なユースケースに対応したりするためには、エンドポイントを多く作る必要があり、管理が難しくなる
　
・上記のRESTの課題を解決するため、2015年にFacebookがGraphQLを公開した。エンドポイントを管理する必要がないなど優れている点があるが、学習コストが高い、歴史が浅く情報が少ないといった課題もあり、今でも（2024年時点）RESTが広く使われている

# 参考
・REST APIとGraphQLの歴史を分かりやすくまとめてみる
https://www.engilaboo.com/rest-api-graphql-history/
・From SOAP to REST: Tracing The History of APIs
https://blog.treblle.com/from-soap-to-rest-tracing-the-history-of-apis/
・The History of REST APIs
https://blog.readme.com/the-history-of-rest-apis/
隠しリンクの見つけにくさをちょっとだけ上げる方法？ (逆効果かも)

# クランドからの挑戦状

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【クランドからの挑戦状】<br><br>豪華でお得なヒミツの酒ガチャを<br>ページのどこかに隠しました。<br><br>画像の謎を解ければ、<br>隠しリンクの場所が分かります。<br>ぜひ探してみてください。<br><br>「酒ガチャ感謝祭」<br>▼ ページはコチラ ▼<a href="https://t.co/gWNeit8C7c">https://t.co/gWNeit8C7c</a><a href="https://twitter.com/hashtag/%E3%81%AA%E3%81%9E%E8%A7%A3%E3%81%8D?src=hash&amp;ref_src=twsrc%5Etfw">#なぞ解き</a> <a href="https://twitter.com/hashtag/%E8%AC%8E%E8%A7%A3%E3%81%8D?src=hash&amp;ref_src=twsrc%5Etfw">#謎解き</a> <a href="https://t.co/SOOwcpbm06">pic.twitter.com/SOOwcpbm06</a></p>&mdash; 「クランド」クラフト酒のお店 (@KURAND_INFO) <a href="https://twitter.com/KURAND_INFO/status/1760632970740904020?ref_src=twsrc%5Etfw">February 22, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

> 画像の謎を解ければ、
> 隠しリンクの場所が分かります。

と主張している。
とはいえ、**命題とその裏の真偽は必ずしも一致するとは限らない。**
画像の謎が解けなくても、隠しリンクの場所が分からないとは限らない。

指定のページ
[酒ガチャ感謝祭 | 酒・日本酒の通販ならKURAND（クランド）](https://kurand.jp/pages/kanshasai)
を開き、Tab キーをたくさん押すことで、いずれ該当の隠しリンクにフォーカスが当たる可能性がある。

実際に試してみたところ、Tabキーを100回弱押すことで該当の隠しリンクにたどり着くことができた。

なお、このキャンペーンは **2024年3月6日 (水) 23:59** までである。

# リンクを Tab キー連打で発見されなくする方法

HTML タグに属性 `tabindex` を設定することで、Tab キーでこの要素にフォーカスを移すことができるかどうかを設定できる。
属性 `tabindex` の値を `-1` (などの負の値) に設定することで、Tab キーでフォーカスを移せないようにできる。

[tabindex - HTML: ハイパーテキストマークアップ言語 | MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/tabindex)

```html
<a href="https://example.com/" tabindex="-1">Tab キーでフォーカスが移らないリンク</a>
```

# 発見されにくくする方法としては逆効果かも

`tabindex` 属性を用いることで、隠しリンクを「Tab キーの連打で」発見されなくすることができる。
しかし、**「発見されにくくする」方法としては逆効果**の可能性がある。
なぜなら、リンクを表す `a` 要素に属性 `tabindex` を設定するのは普通のことではないので、CSS の属性セレクターにより発見されやすくなってしまう。

[属性セレクター - CSS: カスケーディングスタイルシート | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/Attribute_selectors)

隠しリンク以外のリンクに `tabindex` 属性を指定すると、以下のような問題が生じる。

* 負の値を設定すると、Tab キーでフォーカスを移せなくなるので、アクセシビリティが下がる
* 非負の値を設定すると、負の値を設定した隠しリンクと区別される

JavaScript で以下のようにすることで、属性セレクターにより値が `-` で始まる (すなわち、負の値が設定された) `tabindex` 属性がついた `a` タグを取得できる。
(たとえば、開発者ツールのコンソールでこれを実行する)

```javascript
links = document.querySelectorAll('a[tabindex^="-"]'); 
```

# 結論

今回の場合、Tab キーを数十回連打するよりも素直に謎を解くほうが簡単だと考えられるので、無理に今より見つけにくさを上げる意味は薄いと考えられる。

隠しリンクをどのように設定するかは、それをどの程度不正に見つけられたくないかなどを考え、コストやアクセシビリティなどとのバランスのいい方法で設定するのがいいだろう。
RMANやSQLPLUSの日付データを日時表示にする

■日付を日時に整形する

--sqlplusの場合
alter session set nls_date_format = 'yyyy/mm/dd hh24:mi:ss';

※RMANの場合は以下のOSコマンドで事前に実行する。

--OSコマンドの場合
export NLS_DATE_FORMAT='YY-MM-DD HH24:MI:SS'



■おまけ

「ORA-01843: 指定した月が無効です。 ORA-06512:」

上記エラーが表示された場合、DBのデフォルト言語を以下に設定する必要がある。

alter session set NLS_LANGUAGE='AMERICAN';
「Visual Studio Code」の音声入力が日本語対応したので少しだけさわってみた

2024年2月29日に[「Visual Studio Code」のアップデート（v1.87）](https://code.visualstudio.com/updates/v1_87)がきました。

エディターでの音声入力（ディクテーション）が
日本語でも利用できるようになったようなので、少しだけさわってみました。

他にもスティッキースクロールが既定で有効化されたり、
リファクタリングで適用される変更を確認できるマルチ差分エディター（嬉しい）や、「Copilot」を用いた名前の変更候補の改善（とても嬉しい）等があるようですが、
これはまた別の機会に・・・


## インストール
[VSCodeのマーケットプレイス](https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-speech)で「VS Code Speech」をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/ce1237b3-600f-78ed-0abc-8762192e7b81.png)

もしくはアプリから
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/d230eebf-f149-f9e6-b285-3db77ce10e47.png)

## 英語でやってみた
設定を変える前に一度、デフォルトの英語で音声入力をしてみました。
（音声入力は　［Ctrl］＋［Alt］＋［V］で起動。[Esc]で中止）
![英語版.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/66ceeb4f-976d-8053-1291-0b87ace401bb.gif)

私の拙い英語も聞き取ってくれました・・・

## 設定を日本語に変える
設定画面からExtension Settingsを選択して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/829e9fa7-bac6-bef4-6223-567bf17e731d.png)

AccessibilityのVoiceをJapanese(Japan)に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/bd8ccc4b-08ad-51cd-eae2-ff2e5d558a82.png)

エディターを開いて、音声入力を始めようとすると拡張機能のインストール画面が表示されるので、そのままインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/7aa9f86d-8c1f-7e19-c4e1-4ef36c491253.png)

## 日本語でやってみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/1ee1f318-067d-f70c-d3e8-d3204e34ea46.png)

これ以外にも色々話してみましたが、かなりの精度で認識してくれている印象です。
漢字の変換だけがたまに残念・・・

英語は基本的に画像の通りになってしまいましたが、極まれに英語として認識してくれたので、きっと発音の問題ですね。
![日本語.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726019/63022eb5-13bc-4441-c18a-018d2e276183.gif)

## さいごに
これでGithub Copilotとやりとりができる等、
Copilotの拡張機能もいくつか気になっているので、その内さわりたいなと思っています！
ぼっちコミュ障AWSど初心者がJAWS DAYS 2024に参戦してみた感想


![JAWS_DAYS_2024_LOGO.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3687568/c6de8dc6-7e80-f083-ea8a-31ca809359f8.jpeg)

2024年3月2日に東京・池袋のサンシャインシティで行われたJAWS DAYS 2024に参戦したレポートです。
Qiitaでもたくさんの人が同じ題材の記事を投稿されていますが、他の人とはちょっと違う感想になってるかなと思います。
Qiita初投稿のため、読みづらい記事になってしまうかもしれませんがよろしくお願いします。

# ご挨拶
初めまして！馬太郎と申します。
現在、私は愛知県にあるとある製造業の会社で情報システム部門に所属し、いろいろなシステムの管理や簡単な内製開発を行っています。いわゆる社内SEというやつです！
(愛知の製造業といっても、自動車関連の企業ではないです。)

今の会社に入ってからは2024年3月時点ではまだ1年たっておらず、
小さめのシステム会社と大手の独立系SIerで合計8年ほど主に業務系Webアプリの開発を行っていました。

正直、AWSのことはまだ何も知りません。
SIerやっているときも、AWSどころかクラウドのクの字も聞かない界隈にいました。
そして、今の会社もこれからはクラウドの時代だ！ということで、2か月ほど前に導入したばかりという状況です。
導入したといっても、自分たちで何かすることもなく、管理はすべてベンダーさん任せです。
rootアカウントはもちろん、IAMユーザもEC2の電源オン/オフする権限のみ持っているようなアカウントしかベンダーさんからもらえません。

# 1. JAWS DAYS 2024とは
JAWS DAYSとは、AWSユーザ会のJAWS-UG（AWS User Group – Japan）が主催している全国のユーザ会の交流イベントです。
今年は2024年3月2日に池袋のサンシャインシティにて、リアルイベントで行われました。

**JAWS-UG**

https://jaws-ug.jp/

**JAWS DAYS 2024**

https://jawsdays2024.jaws-ug.jp/

# 2. 参戦したきっかけ
ここまでにも書いた通り、会社に2か月ほど前にAWSが導入されました。
**しかし、会社でAWSについて知っている人は誰もいません！**

このままではせっかくのAWSが宝の持ち腐れになってしまう...
**それなら俺がAWSの人になってやろう！** 
という思いの中で、AWSを学んでいくにはどうすればいいかをAWSの担当営業の方に相談してみたところ、ユーザー会があるから興味あったら参加してみれば？といわれて、いろいろ調べてみると直近に大きそうなイベントを見つけたので、勢いで申し込みしました。

# 3. 参戦するにあたって
私はひとりで参戦しました。**AWSド初心者がひとりで。**
会社内でもでもプライベートを削ってまでAWSを勉強していこいう人も見当たらなし、名古屋からの参戦なので安くない交通費(+宿泊費)もかかってしまうため、気軽に誘えるような人もいませんでした。

一応、事前にいくつかの支部のオンラインイベントには参加して、JAWS-UGってどんな話をするのだろう？という予習はしていきました。

# 4. 参戦した感想
ぼっちコミュ症AWSド初心者のトリプル役満な人間にはちょっと難しいところだなと思ったのが正直な感想です。
各セッションでいろいろは話を聞いたり、ワークショップにも参加してみましたが、
ほとんど内容が理解できず、聞いた内容をあれこれ一緒に話せる人もいない状況でした。
**そして、何よりもみなさまの熱気に押されてしまいます。笑**

特に懇親会は、みなさん集まって話しているグループが多く、みんなもともと知り合いなのか、その場で声掛けして話しているのかもわかりませんが、楽しそうに集まっておしゃべりしている方が多かった印象です。
ちなみに、私は懇親会の途中で撤退しました。

と、ここまでネガティブな感想を記載していますが、<font color="red">**実際はそれでも参加してよかったと本当に思っています。**</font>
セッションはわからないなり話を聞いているのは楽しかったし、ワークショップで実際に手を動かして体験できたのもすごくよかったです。会場のネットワークの状態が安定していなかったので、ワークショップはその場では最後までできませんでしたが、AWSを仕事で触るわけでもなく、何ができるかわからない初心者にとって自分で調べて、何かをやってみるはやっぱりハードルが高いで。
たくさん刺激も受けて、こんなQiitaの記事まで投稿しちゃってますしね。笑


# 5. まとめ
「JAWS DAYS 2024」へは勇気を出して参加してみてよかったと思います。
たしかに、一人ぼっちで疎外は感じましたし、一緒にやっていく仲間がいた方が学びやすく楽しいのだろうな思います。
ただ、それでもたくさんのことを学べたことやモチベーションアップになったことは間違いないです。

Qiitaへの投稿もJAWS DAYSに行って刺激を受けたからこそです。
これからAWSを学んでいくうえで、会社ではAWSを直接さわれずアウトプットしていく場がなかなかないので、アウトプットしていく場として、投稿をしていきたいなと思っています。

来年もJAWS DAYSが開催されるなら参加したいと思っています。またひとりぼっちで。笑
もし、私のようにぼっちコミュ障で参加をためらっている人も一度勇気を出して参加してみることをお勧めします。
出入りは自由なので、行ってみてつまらなかたらすぐ帰れば大丈夫！笑
(自分から声かける勇気はありませんが、声かけしてもらえれば喜んでお話しするので、だれか声をかけてくれると嬉しいです。笑）

みなさんどうやってコミュニティをひろげているんだろうなぁ...
Mavenプロジェクトの依存ライブラリを確認する(dependency:tree)


```
mvn dependency:tree
```
ファイル出力
```
mvn -DoutputFile=mvn_dependency_tree.txt dependency:tree
```
出力対象の絞り込み
```
mvn dependency:tree -Dincludes=org.terasoluna.*
```


## 参考
https://maven.apache.org/plugins/maven-dependency-plugin/tree-mojo.html#includes
初期化パラメータが静的か動的か確認する方法

■Oracle公式サイトで確認する方法（見方）
めっちゃ分かりにくいけどOracleの公式ページで確認できる。

項目：変更可能（ or 変更の可/不可）
　⇒ 変更不可                        ＝ 静的パラメータ
　⇒ ALTER SYSTEM ( or ALTER SESSION ) ＝ 動的パラメータ

[サンプルページ（CONTROL_FILE_RECORD_KEEP_TIME）](https://docs.oracle.com/cd/F19136_01/refrn/CONTROL_FILE_RECORD_KEEP_TIME.html#GUID-58479E43-2CE8-4FFD-BD1C-CE3F8C583A75)



■SQLで確認する方法
【構文】
select name, issys_modifiable from v$parameter where name='<パラメータ名>';


サンプル１）
col name format a30
select name, issys_modifiable from v$parameter where name='job_queue_processes';

サンプル２）
col name format a30
select name, issys_modifiable from v$parameter where name='undo_tablespace';

IMMEDIATE ・・・ 即時
DEFERRED　・・・ 以降のセッションで有効になる
FALSE　　　・・・ 以降のインスタンスで有効になる

★注意！★
パラメータ名は小文字で指定すること！


結果例）

SQL> select name, issys_modifiable from v$parameter where name='open_cursors';

NAME                     ISSYS_MOD
'----------------------- ---------
open_cursors             IMMEDIATE
【JSTQB ALTM】シラバスまとめ（第7章）

<iframe src="https://www.slideshare.net/slideshow/embed_code/key/hy7598JCPSvpDw?hostedIn=slideshare&page=upload" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>

:::note warn
筆者（私）独自の解釈・理解をまとめた資料のため、誤りがある可能性があることにご留意ください
:::
onKeyUpでe.target.selectionStartの型が見つからない対処

## 問題点
以下のようなコードがあるとき、onKeyUp内の`e.target.selectionStart`のみ型エラーが生じる
```ts
 <MainTextarea
        text={text}
        onChange={e => {
          setText(e.target.value);
          setSelectionStart(e.target.selectionStart);
        }}
        onFocus={e => {
          setSelectionStart(e.target.selectionStart);
        }}
        onKeyUp={e => {
          setSelectionStart(e.target.selectionStart);
        }}
      />
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562718/51562d96-c854-6d3e-47de-ba33c4619ddb.png)


## 解決方法
`e.tareget.selectionStart`ではなく`e.currentTarget.selectionStart`を使用する


## 参考
https://stackoverflow.com/questions/66710037/property-selectionstart-does-not-exist-on-type-eventtarget
RMANバックアップに関するメモ


### OSコマンド関連
```
--RMANで表示する日時のフォーマットを整形する(日付⇒日時）
$ export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss';

# RMANに接続する（oracleユーザー）
$ rman target /
```

### RMANコマンド一覧
```
--バックアップサマリー情報を表示する
list backup summary;

--バックアップ情報を表示する
list backup

--（バックアップではない）アーカイブログ情報を表示する
list archivelog all;

--バックアップされたアーカイブログ情報を表示する
LIST BACKUP OF ARCHIVELOG ALL;

--RMAN全ポリシー設定値確認
show all;

--バックアップファイルに対してクロスチェックを行う
crosscheck backup;

--アーカイブログに対してクロスチェックを行う
CROSSCHECK ARCHIVELOG ALL;

※CROSSCHECKはRMANが認識できない（又はアクセスできない）ファイルの
レコードに対して「EXPIRED」としてマークする。
「認識」できない理由としては、以下のケースが考えられる。
　・手動でファイルが削除されている。
　・権限（パーミッション等）関連でファイルにアクセスできない。
　・ネットワークトラブルによりファイルにアクセスできない。
　・ストレージのトラブルによりファイルにアクセスできない。等

--データベース（DBF）をバックアップする
backup database;

--データベース（DBF）とアーカイブログをバックアップする
BACKUP DATABASE PLUS ARCHIVELOG;
```


■ SQLPLUS（DB）
```
--制御ファイル内の再利用可能なレコードを再利用するまでの最小経過日数の確認
SQL> show parameter control_file_record_keep_time

NAME                                 TYPE       VALUE
------------------------------------ ---------- ---------
control_file_record_keep_time        integer    7

※control_file_record_keep_timeはバックアップやアーカイブログのレコードが
　コントロールファイルに保持される最小期間（日単位）であり、
　バックアップファイルの保有日数がこの設定値を過ぎたからといって
　バックアップレコードが「EXPIRED」や「OBSOLETE」になるわけではない。
```

### ■RMANバックアップの進行状況を確認する
```
--日付フォーマットの変更（日付⇒日時）
alter session set nls_date_format = 'yyyy/mm/dd hh24:mi:ss';

--カラム設定
col OPNAME for a40
col TIME_REMAINING for 99,990

--バックアップ進行状況の確認
SELECT SID, SERIAL#, OPNAME, START_TIME,TRUNC(TIME_REMAINING/60) TIME_REMAINING_MIN, CONTEXT, SOFAR, TOTALWORK,ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE" FROM V$SESSION_LONGOPS WHERE  OPNAME LIKE 'RMAN%' AND OPNAME NOT LIKE '%aggregate%' AND TOTALWORK != 0 AND SOFAR <> TOTALWORK;

＜出力例＞
SQL> SELECT SID, SERIAL#, OPNAME, START_TIME,TRUNC(TIME_REMAINING/60) TIME_REMAINING_MIN, CONTEXT, SOFAR, TOTALWORK,ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE" FROM V$SESSION_LONGOPS WHERE  OPNAME LIKE 'RMAN%' AND OPNAME NOT LIKE '%aggregate%' AND TOTALWORK != 0
  2  AND SOFAR <> TOTALWORK;
  
       SID    SERIAL# OPNAME                                   START_TIME          TIME_REMAINING_MIN    CONTEXT      SOFAR  TOTALWORK %_COMPLETE
---------- ---------- ---------------------------------------- ------------------- ------------------ ---------- ---------- ---------- ----------
      1297       1779 RMAN: archived log backup                2022/06/10 22:47:24                 20          1  352241887  448329279      78.57
      2064      45892 RMAN: incremental datafile backup        2022/06/10 23:55:35                 24          1    3037439   13107200      23.17
      
TIME_REMAINING_MIN：完了までの残り時間（分）

```

※「BACKUP DATABASE;」単体では制御ファイル、SPFILEはバックアップされないので訂正。（2024/08/05）
FontAwesome 6をSwiftUIで使う

## 公式からデスクトップ版をDLする
下記から「For The Desktop」の方をDLする。(投稿時点では6.5.1)
[https://fontawesome.com/download](https://fontawesome.com/download)

## otfsの中にある「*.otf」をプロジェクトに追加する
Fontsディレクトリを作成し、その中に

* Font Awesome 6 Brands-Regular-400.otf
* Font Awesome 6 Free-Regular-400.otf
* Font Awesome 6 Free-Solid-900.otf


をコピーして追加する。

::: note warn
追加時に「add to target」にチェックを入れてください。
:::

![スクリーンショット 2024-03-04 22.49.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723727/21a39ed6-7177-5c10-b849-afb4f16e8d2a.png)



## info.plistに「Fonts provided by application」を追加する。
info.plistに「Fonts provided by application」を追加します。
配列なので各値に先ほど追加した下記のファイルを拡張子まで含めて追加します。

* Font Awesome 6 Brands-Regular-400.otf
* Font Awesome 6 Free-Regular-400.otf
* Font Awesome 6 Free-Solid-900.otf

![スクリーンショット 2024-03-04 22.49.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723727/0c7e7d2c-e620-73b2-2c21-979eef3a3abc.png)


## 使い方

下記からアイコンを探して右上のCopy Glyphから使用します。
[https://fontawesome.com/search](https://fontawesome.com/search)

![スクリーンショット 2024-03-04 22.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3723727/94c69819-4f32-e7b1-cb54-f6ec3d552daa.png)

```swift:書き方
Text("コピーしたテキスト")
    .font(.custom("FontAwesome6Free-Solid", size: ２４))
```

ファイル名からスペースと数字を取る必要があるみたいです。

* Font Awesome 6 Brands-Regular-400 →　FontAwesome6Brands-Regular
* Font Awesome 6 Free-Regular-400 →　FontAwesome6Free-Regular
* Font Awesome 6 Free-Solid-900 →　FontAwesome6Free-Solid

structにしておいたほうが便利です。

```swift:CustomFonts.swift
struct CustomFonts {
    static let FABrandsRegular = "FontAwesome6Brands-Regular"
    static let FAFreeRegular = "FontAwesome6Free-Regular"
    static let FAFreeSolid = "FontAwesome6Free-Solid"
}
```


```swift:書き方
Text("コピーしたテキスト")
    .font(.custom(CustomFonts.FAFreeSolid, size: ２４))
```
C++ でどうしても Rust みたいに let で変数定義したい人のための記事

# はじめに

下のコードで `let` と `let mut` が使えます。
それぞれ C++ の `const auto` と `auto` に対応します。

```cpp
namespace rust_like_variable_definition {
	struct dummy_for_mut {};
}

#define rust_like_variable_definition_dummy_impl2(counter)  rust_like_variable_definition_dummy_##counter
#define rust_like_variable_definition_dummy_impl(counter)  rust_like_variable_definition_dummy_impl2(counter)
#define rust_like_variable_definition_dummy()  rust_like_variable_definition_dummy_impl(__COUNTER__)

#define let  const auto
#define mut  rust_like_variable_definition_dummy() [[maybe_unused]] = rust_like_variable_definition::dummy_for_mut{}; auto

int main() {
	let x = 1;
	// x = 2;  // error!
	let mut y = 3;
	y = 4;  // ok
}
```



# おわりに

おわりです。

# おまけ

仕組みを知りたい人のために軽く説明します。

```cpp
int main() {
	let x = 1;
	let mut y = 3;
}
```

このコードはマクロを展開すると以下のようになります。

```cpp
int main() {
	const auto x = 1;
	const auto rust_like_variable_definition_dummy_0 [[maybe_unused]] = rust_like_variable_definition::dummy_for_mut{}; auto y = 3;
}
```

`let` はそのまま `const auto` に展開されるだけです。

問題は `let mut` で、これを `auto` に展開したいわけですが、 `let` が `const auto` に展開されるので、 `mut` がそれを打ち消すようなコードに展開される必要があります。
そこで、**ダミー変数**を作って変数定義を一度終わらせてしまいます。
そのあとに `auto` を置いておけば、 `let mut` が `auto` に展開されたかのように動きます。

```cpp
#define mut  rust_like_variable_definition_dummy() [[maybe_unused]] = rust_like_variable_definition::dummy_for_mut{}; auto
//           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//           この変数定義を終わらせに来た！！！（ドン！！）
```

ダミー変数の変数名には一意じゃないと、スコープごとに1回しか `mut` を使えないことになるので、困りますね。
そこで、 **`__COUNTER__` マクロ**を使って一意な識別子を生成します。
`__COUNTER__` マクロは数値に展開され、その数値は展開されるたびにインクリメントされます。それを、ほかの識別子と衝突しないように長いプレフィックスと繋げて、変数名として使います。

参考： [__COUNTER__マクロ - yohhoyの日記](https://yohhoy.hatenadiary.jp/entry/20121211/p1)

```cpp
#define rust_like_variable_definition_dummy_impl2(counter)  rust_like_variable_definition_dummy_##counter
#define rust_like_variable_definition_dummy_impl(counter)  rust_like_variable_definition_dummy_impl2(counter)
#define rust_like_variable_definition_dummy()  rust_like_variable_definition_dummy_impl(__COUNTER__)
```

マクロ `rust_like_variable_definition_dummy()` がプレフィックス `rust_like_variable_definition_dummy_` と `__COUNTER__` の値を結合した識別子を返すのですが、なんか冗長に書いていますね。
これは**展開された** `__COUNTER__` とプレフィックスを結合するためです。
ここまでしないと `__COUNTER__` が展開されず `rust_like_variable_definition_dummy___COUNTER__` になってしまい、連続するアンダースコアを含むため、晴れて未定義動作です。
一度関数型マクロの引数に `__COUNTER__` 渡すことで `__COUNTER__` が展開され、  `rust_like_variable_definition_dummy_0` や `rust_like_variable_definition_dummy_1` といった識別子が生成されます。



# おまけのおわり

おわりです。
ハッシュ化とは？ETagとは？通信を効率化！

# はじめに
GoでAPIを作ってみた際に画像ファイル名をハッシュ化して保存しました。
**なぜハッシュ化するのだろう？クライアント側と通信の際のメリットとは何だろう？** という疑問が出てきたので、地元の勉強会でエンジニアの方々に質問したり、調べてみました。
# ハッシュ化とは
ハッシュ化とは特定の計算手法に基づいて、元のデータを不規則な文字列に置換する処理を指す。代表的な使用方法としては、パスワードをハッシュ化して保存・管理することが挙げられる。第三者が不正にパスワードへアクセスしたとしても、ランダムな文字列に変換されていることで、悪用されるのを防ぐために利用される。

今回の例では、Go言語のハッシュ関数を使用し、画像データをハッシュ化をすることで、ランダムな文字列のハッシュ値を生成した。ハッシュ関数は入力する元データによって異なるハッシュ値を返す。同じ元データからは同じ値が得られる。また、異なる元データからは別のハッシュ値が生成される。
例えば、下記のように**hinakkoIcon.jpg** という画像データがハッシュ化すると、**8dff57e....jpg**という**ハッシュ値**として保存することができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/9abe931d-02f1-e5d6-39aa-d74ee6edbb19.png" width=500>

# ETagとは
ETag （またはエンティティタグ）は HTTPのレスポンスヘッダーで、リソースの特定バージョンの識別子。ウェブサーバーは、コンテンツが変更されていない場合はレスポンス全体を再送する必要がないので、キャッシュがより効率的になり通信帯域を節約することができる。
### 初回
Client側からリクエストを受け、レスポンスヘッダーのETagにハッシュ値を付加して返す！例えば10Mダウンロードにかかり、`ETag:8dff57e....jpg`が返ってくる！
![b88bf8888cff92326069dac59b98145a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/e949525c-2d1e-96b2-053f-7490a77c603d.png)
### 2回目以降：Serverのハッシュ値変更なし
Client側からリクエスト and 初回時のETagのハッシュ値の情報を受け、「わたしこのデータ(ハッシュ値)をもってるんですけど更新されてたら新しいのをもらえますか？」とServer側に問い合わせる。
Server側のハッシュ値と同じであれば、ダウンロードする必要なし。Client側でキャッシュから取得する。ダウンロードする必要ないので、通信量が減少し、通信を効率化することができる。
![7665ee6f0377a8e706cc3621d5cfa689.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/be2d0bec-1c87-ab34-f56a-d410555d1e56.png)
### 2回目以降：Serverのハッシュ値変更あり
Client側からリクエスト and 初回時のETagのハッシュ値の情報を受け、「わたしこのデータ(ハッシュ値)をもってるんですけど更新されてたら新しいのをもらえますか？」とServer側に問い合わせる。
Server側のハッシュ値に変更があれば、ダウンロードする必要あり。例えば10Mダウンロードにかかり、`ETag:12cff89e....jpg`が返ってくる！
![323258a347fdd5ffee8f93cded270fba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/d3193237-50b1-94c0-6a99-b39e874c4ff3.png)

# おわりに
ハッシュ化は第三者からの不正アクセスされた場合に悪用されるのを防ぐために、行われるものであると思ったいましたが、今回紹介したように、ETagにハッシュ値を設定することでClient側とServer側の通信を効率化することにも使用されることがわかりました。



# 参考文献

https://eset-info.canon-its.jp/malware_info/special/detail/211013.html

https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/ETag

https://qiita.com/OmeletteCurry19/items/a84d6a7c91df50e7dcd6

https://qiita.com/YutaManaka/items/93444c803cf3087af2b5
laravel テストを書く前に簡単な用語を覚えよう

## 概要

laravelでテストコードを書くときに、知っておいて損は無い用語を簡単にまとめる。

## 用語集

### PHPUnit

PHP用のテストフレームワークの一種。laravelに最初から組み込まれてる。
laravelはPHPUnitを使ってテストを行う。使うと言ってもUIがあるわけではなく、PHPUnitのコードを使ってlaravelのコードをテストするイメージ

https://phpunit.de/index.html

### Mokery

モックオブジェクトフレームワークの一種。これもlaravelに最初から組み込まれている。
PHPUnitとの親和性が高い。
モック（「テスト中に呼び出されたらこれreturnして」みたいな設定）などを簡単に実装する事ができる。

https://github.com/mockery/mockery

### テストダブル

これから後述する「テストを実行するうえで使う仕組み」の総称

#### スタブ

あらかじめ応答を定義し、テスト内でスタブ呼び出し命令があったときに応答を返す。
外部APIのレスポンスなんかを指定することがセオリー

#### モック

あらかじめ応答をオブジェクト・メソッドと紐づけて定義し、テスト内でそのメソッドが呼ばれたときに応答を返す。
メソッド名の他に、呼び出し時の引数や回数によってreturnの内容を変えたりできる。
指定したメソッドはテスト時に実行されず、モックで定義したメソッドが実行される。

#### スパイ

オブジェクト・メソッドを指定し、呼び出しされたメソッドなどをあとから確認できる。
指定したメソッドはテスト時に実行される。
Laravelのnull・空文字判定まとめ

# はじめに
Laravelで条件分岐をする際に、null・空文字判定をよく使うため、改めてまとめてみようと思います。

# null・空文字判定

| 値 | if($value) | !if($value) | empty(!isset) | isset(!empty) | is_null |
|:-:|:-:|:-:|:-:|:-:|:-:|
| $value = ""  |  false  | true  |  true |  true |  false |
| $value = 0  |  false | true  | true  | true  | false  |
| $value = null  | false  |  true |  false | false  | true|
| $value = 1  | true  |  false |  false | true  | false  |

# さいごに
isset()は0と空の場合、trueを返すため、間違えないように使いたいと思います。
povo料金プランのデータ分析

### はじめに
十数年使ったauからpovoに乗り換えました。povoのプランは割とシンプルでわかりやすい反面、「どのプランが最も良いのか」を提案してくれるお店の方がいません。

povoのプランを半分真面目、半分おふざけでデータ分析をしてみました。

---
### 序論
携帯電話のプランが多様化している。特に各キャリアが提供する格安プランへ移行するユーザーが増加している。
今回はau回線を使用する格安プランpovo2.0におけるデータトッピングに関するプランを調査し、要求された特性を満たす最もコストパフォーマンスの高いプランを見つけることを目的としている。

### 分析対象と条件
2024/3/3時点でのpovo2.0におけるデータトッピングに関するプランを比較。
ユーザー要求性能として20GB/月以上が使用できることを条件とした。

### データクレンジング
#### データ形式について
povoではデータトッピングとして通信容量[GB], 使用期間[日], 料金[円], その他のおまけ有り無しの項目がアプリで確認できる。
![IMG_2475.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/d5304708-009e-8155-8f26-e839bf625926.jpeg)

今回分析に使用したデータは以下の通りである。

| プラン番号 | データ容量[GB] | 期間[日] | 料金[円] | その他 |
|:-:|:-:|:-:|:-:|:-:|
|1 | 0.5 | 1 | 248 | からあげクン1個 |
|2 | 120 | 365 | 20000 | アマプラ3か月 |
|3 | 300 | 180 | 19500 | アマプラ3か月 |
|4 | 40 | 30 | 3800 |  |
|5 | 365 | 365 | 29800 | アマプラ3か月 |
|6 | 150 | 180 | 12980 | アマプラ3か月 |
|7 | 30 | 30 | 3480 |  |
|8 | 60 | 90 | 6490 |  |
|9 | 20 | 30 | 2700 |  |
|10 | 60 | 365 | 13800 |  |
|11 | 3 | 30 | 990 |  |
|12 | 3 | 180 | 1860 |  |
|13 | 1 | 7 | 390 | 

#### データの標準化
povoから提供されているデータトッピングプランは期間が1日のものから365日のものまで様々提供されている。データを月あたりとすることで使用期間による影響を排除することができる。
一ヶ月を30日と定義し、データ容量と料金を一ヶ月で標準化した。
| プラン番号 | GB/月 | 円/月 |
|:-:|:-:|:-:|
| 1 | 15 | 7440 |
| 2 | 9.863013699 | 1643.835616 |
| 3 | 50 | 3250 |
| 4 | 40 | 3800 |
| 5 | 30 | 2449.315068 |
| 6 | 25 | 2163.333333 |
| 7 | 30 | 3480 |
| 8 | 20 | 2163.333333 |
| 9 | 20 | 2700 |
| 10 | 4.931506849 | 1134.246575 |
| 11 | 3 | 990 |
| 12 | 0.5 | 310 |
| 13 | 4.285714286 | 1671.428571 |

#### はずれ値の除外
縦軸に月あたりの料金、横軸に月あたり使用可能なデータ容量をプロットした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/ea094c77-c151-922d-ae3a-cbf74392edb1.png)
縦軸の値は小さければ小さいほど、横軸の値が大きければ大きいほど優秀なプランと考えることができる。

プラン1は期間1日のイレギュラーなプランであり、また月あたりの料金も非常に高いため、今回の分析対象からは除外することとした。

### 分析
プラン1を除いた12のプランをプロットした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/55321483-e312-512f-7c73-428161d3e604.png)
単位時間あたりにより多くのデータを使用するほど料金は上がるが、料金の上がり方は鈍化していく傾向がみられる。これは小ロット生産に比べ、大量生産のほうが単価を下げられることと同様の傾向と考えられる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2716347/a074f369-22e3-3c22-a389-94de81f08904.png)
要求性能である20GB/月を見ると2つのプラン(プラン8および9)が存在する。
プラン8および9は期間が90日、30日と異なっており、期間が90日のプラン8のほうが月あたりの料金は低い。

プラン8と同額の月あたり2163.3円となるプランかつ、月あたり20GB以上の使用が可能なプラン6は要求特性を満たす最も良いプランと考えることができる。さらにプラン6はプラン8に比べAmazonプライム3か月分の使用料を含んでいるためコストパフォーマンスではプラン8に対し明確に差別化できている。

しかしプラン6はデータ容量150GB, 期間180日と長期のプランとなるため、早期解約時のリスクが高いことや、長期での使用を見越した計画性が求められるプランである。

プラン6は期間限定で配信されているプランであるため、期間外では再度解析を要する。

### まとめ
povo2.0のデータトッピングプランについてラフ分析を実施した。
要求性能である20GB/月以上の使用が可能かつ、最も月あたりの利用料が少ないプランを見つけることができた。
最適プランに対するリスクとリターンを明確にした。
今後の分析ではその他のおまけ項目の価値を含んだコストパフォーマンスの定式化、長期保有のリスクを加味した際の最善プランの選定を実施したい。
本プランに追加して通話プランを入れるか悩んでいる。
homebrew環境にX-debugを設定

M1でPHP環境構築中、X-debugを設定しようとした。
しかし[X-debug](https://xdebug.org/wizard)で表示されたインストール手順ではできなかったので備忘録。
→ 実は書いてある（ https://xdebug.org/docs/install#pecl ）

### 参考にした記事

https://qiita.com/suin/items/84c0479054809f058f07

https://qiita.com/shota_tanaka/items/292ac743d5af66f381ae

### 環境
php@8.1をhomebrewでインストール済み


### やったこと

peclがインストール済みか確認
```
which pecl
/opt/homebrew/opt/php@8.1/bin/pecl
```

インストール
```
pecl install xdebug
downloading xdebug-3.3.1.tgz ...
Starting to download xdebug-3.3.1.tgz (258,953 bytes)
...
```

インストールできたか
```
php -m | grep Xdebug
Xdebug
```


下記をphp.iniに追記

```　
xdebug.mode=debug
xdebug.start_with_request=yes
```

できた！
classとstructの違いについて

## はじめに
コメントにて指摘いただきありがとうございます。🙇
編集いたしましたので再アップさせていただきます。


私は最近プログラミングスクールにて学習をスタートした初学者で、学習していく中で疑問が生じたので記事にしたいと思います。

**classとstruct**の違いについてです。

すごく似ているようで、何か違う、
そのモヤモヤが解決しましたので、記事として残しておきたいと思います。

間違っている部分等あるかもしれません。その時はご指摘いただけると幸いです。

## 『class』と『struct』の違い
結論から言いますと、値型or参照型の違いです。
また　値型→上書きできない。
　　参照型→上書きできる。

  という違いがあります。

classの場合は**上書きができます**↓↓

```swift:class

class Animal {
    var name = "イヌ"
}

var animal1 = Animal()
var animal2 = animal1

Animal1.name = "ネコ"
Animal2.name = "ハムスター"

print(Animal1.name) //ハムスター
print(Animal2.name) //ハムスター
 ```

 

structの場合は**上書きができません**↓↓

```swift:struct

struct Animal {
    var name = "イヌ"
}

var animal1 = Animal()
var animal2 = animal1

Animal1.name = "ネコ"
Animal2.name = "ハムスター"

print(Animal1.name) //ネコ
print(Animal2.name) //ハムスター
```

## おわりに

つまり
**class=参照型**はそのものにアクセスできる。
**struct=値型**は代入したその時のものにアクセスできる。
と言うことですね。

classとstructの違いに理解できたことは、初学者の私にとって大きな一歩でした。

他にも違いがあるかもしれませんが、追々学んでいこうと思います。
アプリクラウドRana8を使ってみた

「アプリのクラウドサービスがあるよ。そういうの好きでしょ？」と言われて[WebARENAのアプリクラウドRana8（ラナハチ）](https://web.arena.ne.jp/service/rana8poc.html)を使ってみました（実は初めて知りました）。現在、POC中のようで無料トライアル期間が5月31日まで（延長された）という事で、早速使って見ました。

https://web.arena.ne.jp/service/rana8poc.html

## 概要

ザクっといえばGCPのCloudRunの管理をラップして簡単に使えるようにしたサービスのようです。シンプルでメールアドレスを登録してサービスを作成するだけです。デプロイもGCPのツールである`gcloud`を使います。サービス設定は（現時点で）固定で、0.5CPU-1Gi、要求時のみコールドスタート設定、コンテナ数は0-2となっています。サービスを作成→デプロイの２ステップでサービスが起動できます。5コンテナ無料で使えます。

自作アプリやテスト用途だとそれほどアクセス数も無くほとんどスリープ状態なので、（事業者の）懐にも優しいサービスです。手順通りにやれば動かせます。

↓本当にこの手順のままです。

![スクリーンショット 2024-03-04 21.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/0d13280f-db33-6a42-e8c4-574809806e14.png)

ただ、デプロイのあたりがサクッとなので解説します。

# 手順

[Rana8の説明手順](https://web.arena.ne.jp/service/rana8poc.html)に従って、アカウントの設定＆サービス作成を行なってください。

後半のデプロイの説明に具体的なコードが無いので解説を追加します。

## gcloudインストール

Macの場合homebrewでインストールするのが便利です。
```shell
brew install --cask google-cloud-sdk
```
その他の方はこちら
https://cloud.google.com/sdk/docs/install?hl=ja

## デプロイ

簡単なサンプルアプリを作りました。Web Frameworkの[hono](https://hono.dev/)でテキストを返すだけの簡単なアプリです。

以下よりcloneします。
https://github.com/bellx2/rana8-sample

- hono-node - node版 (Buildpacks)
- hono-bun - bun版 (docker)

```shell
git clone git@github.com:bellx2/rana8-sample.git
cd rana8-sample
cd hono-node
```

管理画面よりダウンロードしたJSONファイルを使ってログインします
```shell
gcloud auth activate-service-account --key-file=XXXXXXX@rana8-poc.iam.gserviceaccount.com.json
```

```gcloud run deploy```コマンドでデプロイします。******-XXXXXXはサービス一覧の「サービスID」になります。
```
gcloud run deploy ******-XXXXXX --project rana8-poc --region asia-northeast1 --platform managed --source .

Building using Buildpacks and deploying container to Cloud Run service [sapidemo-rj4d93] in project [rana8-poc] region [asia-northeast1]
⠛ Building and deploying... Building Container.
　✓ Uploading sources...
　✓ Building Container...
　✓ Creating Revision...
　✓ Routing traffic...
Done. 
```

　これでデプロイ完了です。

# ポイント

- 待受ポートは8080固定。開けないと死ぬ。
- Buildpacksはnodeの場合`run start`できないと死ぬ
- DockerFileを使ったデプロイも可能（この場合も8080をEXPOSEして実行していないと死ぬ） → rana8-sample/hono-bun
- ビルドログの表示を管理から選ぶが、とにかく遅い＆時々エラー...
- コールド状態でもnodeコンテナは１秒弱くらいで起動する（CloudRunそのままですが）
- 仕様に5コンテナまでの制限があるが、同時利用５コンテナ（コールド中のは数えない？）なのか、５サービス（最大フル起動時10コンテナ）なのかよくわからない。

※死ぬ＝デプロイできない

# コメントなど

自分的には比較的分かりやすいのですが、初心者にはちょっと戸惑う部分が多いかもしれません。エラーログなども（CloudRunなので）分かりにくかったり表示が遅いので、慣れていないと大変かもしれません。

ちょっとしたプログラムを動かす実験場やCloudRunを使っていない人の体験として、気軽に実行できて面白いかと思います。ハッカソンとかのような一時的なサービス展開とか、コードのデモサイト置き場とか、価格が安かったり無料枠があれば良いですね。個人的には、Gitデプロイとか、GitHub連携などがあれば便利かもしれません。

サービスとしてはCloudRunの無料枠、最近のエッジ実行環境(Cloudflare Workers, deno deploy)との比較、VPS自鯖での構築、との戦いになりそうな気がします。

ビジネス的にはこの手のサービス系はいろいろ大変かもしれませんが、ちょっぴり期待してウオッチしたいと思っています。
モバイル網のAPIが気になる

# あらまし
ソフトバンクさんの報道発表を見て、通信事業者の共通APIというのが気になったので調べてみました。

https://www.softbank.jp/corp/news/press/sbkk/2024/20240222_01/

Linux Fundationでオープンソースとして開発中っぽい。

https://camaraproject.org/


登録されているAPIはGitHubで管理されている様子。

https://github.com/camaraproject/WorkingGroups/blob/main/APIBacklog/documentation/APIbacklog.md

# APIをかいつまんで読んでみた。
往年のClick to call、SMSでワンタイムパスを送る～支払い、ブロックチェインまで色々なAPIがあって面白そうです。

| API [family] name | memo | 
|:-----------|------------|
| Quality on Demand | モバイル接続の遅延とかジッタ等の品質をセットする |
|Simple Edge Discovery | 近くのMECを見つける |
|Device Location |　緯度経度を取得できそう |
|Device Status | roaming 非ローミング　サブスクリプションが確認できそう |
|Home Devices Quality on Demand |サービスクラスを設定するとDSCP値が設定されそう |
|SIM Swap | MSISDN（電話番号）を指定してSIMを切り替える |
|Number Verification | OAuth 2.0を使って電話番号を認証する |
|OTP Validation　|　SMSでワンタイムパスを送る |
|Carrier Billing Checkout |　支払い |
|Traffic Influence	|遅延が短くなる近場のEdge datacenter |
|Blockchain Public Address		| ブロックチェインのアドレスと電話番号を紐づける |
|Identity and Consent Management	| GDPR regulationとかの話っぽい |
|Device Identifier	|電話番号、IPアドレス、IMEI、TAC等を取得 |
|Click to Dial		|Webでクリックしたら電話が掛けられる |
|KYC Match	| モバイルの契約者情報とサービスプロバイダの持っている情報があっているか確認 |
|WebRTC | Webブラウザ経由でコミュニケーションが取れる |
|Network Slicing | Network Sliceを使う?? |
5年後、誰もGoogleを使ってない(生成AIの正確性をどう克服する？)

# はじめに

## 今の検索エンジン市場の状況

タイトルに関しては、割と断言できるくらいの確信があるけど、まず現状からまとめる。
検索エンジン市場は長らくGoogleの一人勝ち状態が続いていて、Googleは、その高度な検索アルゴリズムとユーザーフレンドリーなインターフェースにより、世界中のユーザーから圧倒的な支持を受けている(自分もその一人)。Googleの検索エンジンは、情報を迅速に見つけ出すことができる強力なツールとして、日々の生活に欠かせない存在となっている。

### Googleの現在の地位

Googleの成功の背景には、検索結果の精度と速度、広範な情報へのアクセス、そして利用者の利便性を最大限に考慮した設計がある。これらの要素が組み合わさることで、Googleは検索エンジン市場でのリーダーとしての地位を不動のものにしている。しかし、この支配的な地位にもかかわらず、新たな挑戦者?(完全な上位互換)が現れつつある。それが「Perplexity」である。

## Perplexityの登場

### Perplexityとは何か？

Perplexity AIは、AIを活用した対話型の検索エンジンであり、ユーザーが質問を入力すると、インターネット上から情報を収集し、その情報に基づいて回答を生成する。Perplexityは、最新の機械学習技術を駆使して開発された新世代の検索エンジンである。従来の検索エンジンとは一線を画すPerplexityは、ユーザーの検索意図をより深く理解し、より関連性の高い情報を提供することを目指している。これにより、ユーザーは求めている情報をより早く、より正確に見つけることができるようになる。

## Perplexityを使う前(最近まで)
### 生成AIを使ってきて感じていた限界

曲がりなりにも1年以上前からchatGPTなど生成を使っていた感想としては、「めちゃくちゃすごい！」と感じていた。それと同時に、どこまで行っても情報の正確性に不安があった。事実確認の必要があった。

### 正確性の保証のために自分がこれまで行っていたこと

正確性に不安がある中で自分が何をやっていたかというと、ある質問をchatGPTとClaudAIの両方に聞き答えを照らし合わせていた。より、情報のソースが欲しいときはbingのchatを使用していた。


### ぼんやりと思っていたこと

上に書いたやり方がくそめんどくさくて、どうにかならんかなあ。bingとchatgpt合わせたようなものないかなあ。と思っていた時に見つけたのがperplexity。

##  結局、Perplexityの何がすごい？

### Perplexityは、生成AIではなくAIを活用した対話型の検索エンジン

ここが一番の肝で、質問に対しての回答に必ずソースを示す。そもそもAIのモデルは何なん？と思われた方に補足すると、chaGPT,ClaudAIも選択できる。つまりさっき、言ってたchatGPTに検索機能で正確性を補完できる理想のサービスが実現する。自分の体感ではなんだかんだで生成AIの中でも総合力でOpenAIのchatGPTが一番いい感じ。

### もう、Googleいらんなくね？

もう、AIを活用した対話型の検索エンジンができた時点でGoogleいらんやんと自分は思った。なんでGoogleを使っていたかというと、生成AIに正確性に不安があるからという一つの理由からだけだったから。正確性＝ソースとして何かしらの記事、ブログ、サイトのメディを参照できる。だから、わざわざ検索フォームに文字を入力して、大量にあるサイトのタイトルを見分けて開いて内容を読んでいた。閉じて、開いて読んで閉じてを繰り返していたが。より分かりやすい要約を回答し、そのソースをいくつか示し、情報の透明性を保ってくれるなら、Googleでの情報収集は原始時代と言っても過言ではない。わざわざ使う意味がない。


## Perplexityのちょっとした情報

この記事読んでる人は、生成AIをすでに愛用してるような情報感度の高い人だろうから、詳しくは書かないけどいくつかポイントを書く。無料でも使えるが，月20＄を自分は払ってる。損はないと思う。ClaudAIも使えるから、ClaudAI単体に月20＄払っていたことが馬鹿らしく思った。いいと思ったところは、回答をしたときに質問の候補を3つ提示してくれる。これは、質問の考えるコストが減ってめちゃありがたい。プロンプトすら将来はサービスに組み込まれてるかも。


## 結論

5年後、検索エンジン市場は今日とは大きく異なる姿を見せているだろう。技術の進化、ユーザーの要求の変化、そして新たな競合の出現により、市場は多様化し、競争は激化している。その中でPerplexityは、革新的なアプローチにより、市場のリーダーとしての地位を確立する(別のAI活用型検索エンジンでもいい)。このPerplexityの台頭は、検索エンジン市場における新たな時代の到来を象徴し、そのユーザー中心のアプローチと技術的な革新は、他の検索エンジンに対して新たな基準を設定し、市場の構造を変えることになる。
CPENT試験　合格体験記

# はじめに

EC-CouncilのCPENT試験に合格したので、合格体験記として記載しようと思います。

試験の内容自体は以下の記事にまとめていますので、ご興味ある方は↓をご参照ください。

https://qiita.com/forest_moririri/items/103e7fabb37e1ac37cb3

# Who am i ?

しがないエンジニアです。ペネトレーションテストは業務でも趣味でも取り組んでいません。たまに面白そうなCTFが開催されていると取り組む程度です。

# この記事の想定読者

  - CPENT講座の受講を検討している方
  - CPENT試験の受験を考えている方
  - ペネトレーションテスト系の試験の受験を検討している方
  - その他


# そもそものCPENT試験の位置づけ

CPENTは、CEH MASTERの次のステップとして位置づけられています。EC-CouncilのペネトレーションテストやEthical Hacking系の中では一番ハードな試験と位置づけられており、色々WEBで検索する限りではOffSecのOSCPと概ね似たような難易度のようです。OSCPも回答に取り組める時間自体は24hなので、試験時間的にも変わりないですものね。12h×2で取り組めるのはCPENT独自の制度で大変良いかと思います。正直24hの一発勝負は集中力が持たないです。

https://www.eccouncil.org/wp-content/uploads/2022/10/CPENT-brochure-1.pdf

OSCPも同じようなのですが、ゼロデイの脆弱性を特定したり、FWやEDRなどのセキュリティ製品をバイパスしなければいけないような問題には遭遇しませんでした。この辺もOSCPを意識して作成されている感じを受けますね。

なお、OSCPの上位資格であるOSEPについてはセキュリティ製品をパイバスするような設問も登場するようです。そう考えるとOffSecの試験レベルがいかに高いかを実感させられます。

# 本題

CPENT試験の受講前に以下の講座を受講しました。講師の方は普段からペネトレーションテストに従事している方でOSCPホルダの方でした。OSCPを取得している方はCPENTも取得される方が多いという印象です。

https://www.gsx.co.jp/services/securitylearning/eccouncil/cpent.html

LABの内容を軽くさらった後に、CPENT独自のPractice Rangeという練習場で軽く練習を行い、試験に臨んだ感じです。試験勉強に費やした時間は講座を受講してから3週間くらいです。

先に記載してしまいますが、特に勉強しておくべき内容は以下かと思います。

 - バイナリエクスプロイトの作成
 - hydraなどのパスワードクラッキングツールの使い方
 - nmapなどのネットワークスキャンツールの使い方
 - 既知の脆弱性（Exploit DB等の利用）の特定
 - ファームウェアの脆弱性やOT環境の理解
 - その他（curlコマンドなど）

CEHの実技試験（CEH Practical）ではLABの内容がかなり重要で、LABの内容を一通り理解できていれば試験に困るといったことはほとんどありませんでしたが、CPENTの試験では講座の内容やLABの内容が直接試験に役立つかというとそんなことはなく。間接的に役立つ部分もありましたが、やはり自分の足で考えるということがテーマの一つになっているだけあって、その場で試行を繰り返さないとわからない問題が多かったです。Rabbit Holeに陥ってしまう（いわゆる沼にハマる）と無駄に時間を消費してしまうので、沼に陥ったら他の問題に取り組んだりして、時間を浪費しないようにしないといけないです。


# 当日の試験について

私は12h×2で取り組みましたが、色々とマシンを調査していると案外時間ないという印象です。試験が終わると暫定スコアが出て70%を超えるとレポートの提出に進めます。レポートの提出をすると一週間以内に正式な結果が着るらしいですが、１０日ほどかかったと記憶しています。また、レポートの提出で更にスコアが上がった（気がした）ので、ちゃんとレポートを書けば評価されるのかと思います（逆に減点される場合もあるんですかね？？）。レポートの提出ですが提出後の正式結果通知まで二週間は見込んだほうがいいと思います。結果が出たときはほっとしました。嬉しかったです。

なお、試験会場はホテルを予約しました。一泊二日を2日程確保しておいて試験に取り組んだ感じですね。かなり疲れました。暫定スコアも90%を超えることが出来てよかったです。9割を超えるとLPT MASTERと呼ばれます。

# 注意事項

EC-Councilのモニタリング有りの試験では毎度同じですが、パスポートは用意必須です。特にCPENT試験の場合は、チョコレートやコーヒーをたくさん用意しておくと良いかと思います。CEHの実技試験（CEH Practical）を経験したことある方ならわかるかと思いますが、あちらはWEBの環境なのですが、CPENTについては自分で用意したKaliなどの環境が使えるので、事前準備はしやすいかなと思います。当日VPN接続で試験環境に接続する感じです。ある種、事前準備が物を言うところはOSCPと同じかもしれませんね。なお、EC-CouncilはCEHの実技試験（CEH Practical）を取得していない場合はそちらを先に取得しておくことを推奨しているようです。コマンドアレルギーがある方はCPENTの前にCEH Practicalを受験されることをオススメします。

こちらは余談になってしまいますが、EC-CouncilのLAB環境ではParrotOSというKaliと似たようなDebianベースのLinuxOSで攻撃者のサーバを再現しており、LABと同じような環境で試験を受験したいという方はParrotOSの使用をオススメします。

https://www.parrotsec.org/download/

# 最後に

CPENT試験はOSCPと同じく気合と根性が求められるので、限られた時間で成果を出さないといけないのはプレッシャーを感じますね。次は何の勉強をしようかはまだ未定ですが、この記事が他の方の勉強の一助になれば幸いです。
CSS モジュールのせい（おかげ）で、名前が変わって Style 適用に困ったときは global css で対処した

# 背景

チャットボット作成時に、react の画面分割をしたくなった。
最初は自分で width を変数で制御しようとしたが、「こんな面倒なこと今どきやらないだろう」と思い直し、見つけたのが、react-split
使ってみると、簡単に画面分割は上手くいった

しかしながら、Style 適用で躓いたのでその記録

Front Engineer さんから怒られるかもな対処法ですが・・ :sweat: 

https://github.com/nathancahill/split/tree/master/packages/react-split

# 結論

- css Module で一意の名称にならないように、global css にして定義した。 :thinking: 

split 側の命名規則は以下にあり

https://github.com/nathancahill/split/tree/master/packages/splitjs#css

```css: gutter への sytle
:global(.gutter.gutter-horizontal) {
    background-color: azure;
    cursor: col-resize;
    width: 5px;
}

:global(.gutter.gutter-horizontal:hover) {
    width: 10px;
}
```

# 詳細

- gutter を見やすいようにしておきたかったので、reference を頼りに設定したものの、まったく反映されない。
    - F12 で調べてみると、分かったことは２つ
        - なにも適用されていない
        - 設定した css の名称に、なんか変なものがついている

https://github.com/nathancahill/split/tree/master/packages/splitjs#css

gutter すら何のことやらだった素人さんだったので、GPT さんに聞いたところ、class name が被らないようにしてくれる css module さんのお仕事だったという事が分かる。
で、回避方法として提案してくれたのが、

- html に直接 css 読み込み

ただ、その際の global css というキーワードに引っかかって確認してみたところ、:global() で指定することが出来ることを知る。

で、試してみたところ、結論にあるようにしたところ、class 名置換がされず、無事適用されるにいたった。

# あとがき

Azure 触ってたはずなのに、何故か Python / Typescript でこんなことやってたり。
とはいえ、昔は好きではなかった javascript がめっちゃ楽しく感じるので、ちょっと幸せだったり :laughing:
MISRA C/C++/AC 2023

C言語を習得する３つの方法
https://qiita.com/kaizen_nagoya/items/84cab0888c193bba429b

C言語(C++)が必要な人と必要ない人
https://qiita.com/kaizen_nagoya/items/2afe9e846b55b24cb6f1
# MISRAとつきあいはじめて２５年になる。

MISRAの当初は、プロセス関連の文書も発行していた。

misra　development　guidelines
https://ia800108.us.archive.org/26/items/misradevelopmentguidelines/misra_dev_guidelines.pdf

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# 文書
MISRA C++:2023
https://misra.org.uk/product/misra-cpp2023/

MISRA AC SLSF:2023
https://misra.org.uk/product/misra-ac-slsf2023/

MISRA AC GMG:2023
https://misra.org.uk/product/misra-ac-gmg2023/

MISRA C:2023 Third Edition, Second Revision
https://misra.org.uk/product/misra-c2023/

# 動画
MISRA C 2023について知っておくべきこと　TechMatrix SE事業部
https://www.youtube.com/watch?v=9KmoRZDuB9E&list=PLVw-64tNjOliE29zKBmVmZwszHuRL5Z3B

MISRA および静的コード分析に PC-Lint を使用する
https://www.youtube.com/watch?v=zzkcX-0mMHU

# 自己参照
MISRA C まとめ #include <misra_c.h>
https://qiita.com/kaizen_nagoya/items/f1a79a7cbd281607c7c9

MISRA C++, AUTOSAR C++について
https://qiita.com/kaizen_nagoya/items/3436fbd49865e0da7d35

MISRA C:2012追加文書
https://qiita.com/kaizen_nagoya/items/d08b2ae495b136f9638c

misra C 2012 permits（許可）を読む
https://qiita.com/kaizen_nagoya/items/af3095f79add36d0bcce

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

### 文書履歴(document history)
ver. 0.01 初稿 　20240304
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
認証情報の管理に Secrets Manager を利用したときの話

# HULFT-WebConnect、FTR通過

2023年12月、[HULFT-WebConnect](https://www.hulft.com/software/hulft-webconnect)は、AWS ファンデーショナルテクニカルレビュー (FTR) を通過して、「AWS 認定ソフトウェア (AWS Qualified Software)」となりました。  

FTRとは、セキュリティ、信頼性、優れた運用に関するリスクを低減するために、AWS のベストプラクティスに則っているかをチェックするためのレビューです。  
[AWS ファンデーショナルテクニカルレビュー](https://aws.amazon.com/jp/partners/foundational-technical-review/)

このFTRを通過するにあたって、AWSの提供するサービス Secrets Manager を利用しました。

# なぜ AWS Secrets Manager を利用したのか？
FTRを通過するにあたって、認証情報の管理方法を改善する必要があるため、AWSの Secrets Manager サービスを利用しました。  
AWS Well-Architected Framework の項目においても、シークレットを安全に保存して使用するための手法として、Secrets Manager の利用がガイダンスされています。
[SEC02-BP03 シークレットを安全に保存して使用する](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/framework/sec_identities_secrets.html)

※AWS Well-Architected フレームワークとは・・・
[AWS Well-Architected Framework](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/framework/welcome.html)

> （AWS Well-Architected Framework 抜粋）
> AWS Well-Architected フレームワークは、特定のアーキテクチャがクラウドのベストプラクティスと整合しているかどうかを理解するための一連の基本的な質問を文書化したものです。


# Secrets Manager とは
Secrets Manager とは、データベースやアプリケーションの認証情報を、管理、取得、ローテーションするためのAWSのサービスです。  
[AWS Secrets Manager](https://aws.amazon.com/jp/secrets-manager/)

利点として、以下があげられると私は理解しています。  
- 認証情報を安全に管理できる  
Secrets Manager を利用しない場合、認証情報を、コードや設定ファイルへハードコードすることになりますが、Secrets Manager 上へ保管することで、漏洩のリスクを軽減できます。
- 認証情報を一元管理できる  
記載の通り、個別に認証情報を管理することなく、Secrets Manager 上で一元的に管理できます。
- 認証情報をローテーションできる  
手動でローテーションすることなく、Secrets Manager で自動でローテーションできます。


# AWS Secrets Manager を実際に活用してみて
Secrets Manager の使い方自体はとてもシンプルで、簡単に言うと、認証情報を、AWS CLI または、AWS マネジメントコンソールを通じて、AWS上に保管し、必要な時に取得・利用できる、というものです。
HULFT-WebConnectの開発においては、Secrets Manager 導入前までは、開発環境、CI/CD環境、各種ツール・スクリプトにおいて、それぞれ個別に認証情報の管理・設定を行っていました。  

[Secrets Manager 導入前のイメージ]
![before2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071294/017ee129-687f-b704-0992-c712ac040c2b.png)



Secrets Manager を導入したことで、個別に認証情報を保持する必要がなくなり、全てAWS上で管理できるようになりました。  


[Secrets Manager 導入後のイメージ]
![after2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3071294/88161fe4-ae6f-55f4-24fc-784795c6a0e6.png)




このように、一元管理できるようになったことで、すっきりとしたシンプルな構成になりました。
ただ、対応にあたっては、認証情報の利用個所を全て洗い出し、全ての箇所に修正を入れる必要がありました。  
実際に対応する前までは、それほど手間のかかる作業だとは考えていなかったのですが、実際に対応してみると、思っていた以上に利用個所があって、全てを対応するのには苦労しました。  

# 早めの導入がおすすめ
仮に最初からSecretsManagerを利用していれば、このような洗い出しや改修は必要なかったと思うので、早い段階で利用しておけばよかったなと思いました。

FTR通過を検討している方はもちろん、そうでない方であっても、認証情報の管理方法を模索している方は、ぜひ、Secrets Manager を活用してみて下さい！
[備忘録] 研究ツールまとめ

# 1.はじめに
今回、研究してみて簡単な研究の流れを感じることができたのでここに集約しておきます。誰かの役に立てばラッキーということにしておきます。

# 2.ツール類
## 2.1　ChatGPT
- 言わずもがな便利。ないと研究できない。謝辞にChatGPTって書いていいですか？
- 月3000円を渋らずに出して課金しましょう。質はもちろん、GPTs使えるのがめっちゃ便利。
    - これとか　https://note.com/daichi_konno/n/nb1f1ac368a30
    - これとか　https://chat.openai.com/g/g-3hxXAJOHO-lun-po-kun
- GPT-3だとYes/Noで答えって言うと、基本的に肯定が多かった。GPT-4だとちゃんと違うとこは違うって教えてくれるし、論理破綻がないかとかチェックしてくれる。頼もしい。

## 2.2 Arc
- 今の所MacOSだけに対応しているブラウザ。メモリ使用率見てみると若干Chromeより多いけど、UIと言い、かゆいとこに手が届く機能が充実している。
https://arc.net/
- Sidekickに似ているけど、なんか違うらしい。作業の種類ごとにワークスペースって言ってブラウザの場所?を切り替えれるのが便利。
- Googleの拡張機能がそのまま使えるのが最高。もうChromeには戻れない。
- 日に日に蓄積していくブックマーク、ブラウザ上で綺麗に管理できるのがもう好き。
- 開発ならメモリ使用率加味してFirefoxの方がいいかな。

## 2.3 Zotero
- 論文管理ソフトウェア、無料。https://www.zotero.org/
- MendeleyとかPaperpileとかもあるらしいけど、有料でUIが好きくなかった。最小限のシンプルなUIが好きです。
- 後にもつながるのですが、その他アプリとの連携が便利で好きです。シームレスにサーベイからまとめる作業まで一貫してできるのが良い。
- Zotero Connectorというものを使うとPDFダウンロードしてインポートして...っていう作業が省略できる。ワンクリックでメタデータ自動で読み込んでZoteroに取り込んでくれる。

## 2.4 Elicit
https://elicit.com/?workflow=table-of-papers
- 論文を探すやつ。キーワードとか文章打ち込んだらそれに近い論文探してくれる。

## 2.5 ReserchRabbit
https://researchrabbitapp.com/home
- Connected Papersと同じ
- なんとなくこっちの使い心地が好きだっただけ
- Zoteroと連携できます。これが地味に便利。

## 2.6 Perplexity
https://www.perplexity.ai/
- Arcの検索エンジンとして設定することができるらしい、すげえ
- 生成AIが入った検索エンジン。使用感独特だけどソース明確にして教えてくれる。
- たまにこれで論文が見つかったりする。

# 3.資料作成
http://www.ams.eng.osaka-u.ac.jp/user/ishihara/?p=566

常識だけど

http://www.ams.eng.osaka-u.ac.jp/user/ishihara/?p=592

これも便利

https://www.slideshare.net/iTooooooooooooT/2022-250960325

これを参考にスライド作りました。

- 最初は質より量だと思うし、守破離に則ってやってみた。他人からのフィードバック受けたら一旦自分の中で反芻して"破”のフェーズに移行する

- スライドの文字色は真っ黒より4C4948が好き
- 文字大きさと書く場所は統一
Chef レシピを YAML で記述する

## YAMLレシピ

Chefバージョン 16.0.257 以降のChefでRubyだけでなくYAMLでもレシピが書けるようになりました。（[ReleaseNote リンク](https://docs.chef.io/release_notes_client/#16.0.257-yaml-recipes)）

```
---
resources:
  - type: "package"
    name: "httpd"
  - type: "template"
    name: "/var/www/html/index.html"
    source: "index.html.erb"
  - type: "service"
    name: "httpd"
    action:
      - enable
      - start
```

## YAMLレシピをRubyレシピに変換

`knife yaml convert [YAMLレシピファイル名]` コマンドでYAMLレシピをRubyレシピに自動変換することができます。

上記のYAMLレシピは、以下のRubyコードに変換されます。

```
# Autoconverted recipe from yaml_recipe.yaml

package "httpd" do
end

template "/var/www/html/index.html" do
  source "index.html.erb"
end

service "httpd" do
  action ["enable", "start"]
end
```

ChefやInSpecのライセンス取得や技術サポート/コンサルに関しては、以下の国内代理店へお問い合わせください。

www.chef-sec.com