OmniAICreator/Qiita-1.07M huggingface dataset:
DynamoDBのカーディナリティが高いとは？

## はじめに
DynamoDBの勉強中、パーティションキーはカーディナリティの高いものを選択することが重要だよ、とAWS公式ドキュメントに書いてあったのを見ました。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/data-modeling.html

いや、そもそもカーディナリティが高いって何？と前提から理解できていなかったので、
カーディナリティとは何なのかというところから調べました。
結果、カーディナリティについて理解できたので共有します。

## 想定読者
カーディナリティについてあまり分かっていない人

## カーディナリティとは
カーディナリティとは、カラムに格納されるバリエーションの数を指します。
つまり、カーディナリティが高いほど、カラムには多くの異なる値が格納されていることを意味します。

#### カーディナリティが低い例・高い例
以下に示すような、フルーツの収穫テーブルがあったとします。

| Harvest Date | Fruit Name |
|--------------|------------|
| 2021/01/01   |   Apple    |
| 2021/01/02   |   Apple    |
| 2021/01/03   |   Apple    |
| 2021/01/04   |   Banana   |
| 2021/01/05   |   Banana   |
| 2021/01/06   |   Banana   |

例えば、フルーツ名をパーティションキーとした場合、
フルーツ名には、Apple・Bananaの2種類しかないので、バリエーションが無いですよね。
つまり、カーディナリティが低いと言えます。
逆に、収穫日をパーティションキーとした場合、
収穫日は2021/01/01 - 2021/01/06の6種類あるので、バリエーションがあります。
つまり、カーディナリティが高いと言えます。

## カーディナリティが高いことによるメリット
カーディナリティが高いと、パフォーマンスが向上します。
これは、データの分散が均等に行われることによって、クエリの実行時にデータの検索範囲が狭まり、効率的な検索が可能となるためです。
例として、パーティションキーをフルーツ名とした時と
収穫日とした時の比較をしてみます。
パーティションキーがフルーツ名の場合、"Apple"で検索をすると3件取得できます。
それに対しパーティションキーが収穫日の場合、"2021/01/03"で検索すると1件取得できます。
こうして数値化してみると、カーディナリティの高い方が検索のヒット数が少なくなり、検索コストが下がる為、より効率的に検索出来ていることが分かります。

## カーディナリティが低いとどうなるのか
パーティションキーのカーディナリティが低い場合、ホットパーティションになる可能性があります。
ホットパーティションとは、読み込みや書き込みなどリクエストが集中するパーティションのことで、アツいパーティションということです。
こうなった場合、パーティションの制限（3000RCU と 1000 WCU/秒）を超えるとスロットリングが発生するようになります。
また、全体のパフォーマンス低下にも繋がります。
なので、低カーディナリティは避けましょうということですね。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/TroubleshootingThrottling.html

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-partition-key-uniform-load.html

## さいごに
カーディナリティについて大分理解出来ました。
だからタイムスタンプがパーティションキーになったりするんですね。
CSSの4原則についてまとめてみた

# 1. はじめに
CSSはウェブ開発において不可欠な技術であり、ウェブサイトやアプリケーションの見た目を決定づける重要な役割を果たします。
しかし、成長し続けるプロジェクトにおいて、CSSの管理は複雑になりがちです。
コードが増えるにつれ、スタイルの予測、再利用、保守、拡張が難しくなります。この課題に対処するため、CSSを書く際に「予測しやすい」「再利用しやすい」「保守しやすい」「拡張しやすい」という四つの原則を念頭に置くことが重要です。
本記事では、この原則を具体的なコード例とともに紹介し、より効率的で持続可能なウェブ開発を目指すための方法を紹介いたします。


# 2. この記事を読んで欲しい人
- 効率的なCSSの書き方を学びたい初心者エンジニア。
- 大規模なプロジェクトやチームでの作業において、CSSのコード品質を向上させたい方。
- 「予測しやすい」「再利用しやすい」「保守しやすい」「拡張しやすい」という原則を具体的に理解し、実践したい方。



# 3. 予測しやすい
### 概要
CSSセレクタをシンプルに保ち、具体性を高め過ぎない、また、クラス名は明確でわかりやすい命名規則に従うことです。

### 実現方法
CSSの命名規則を使い（BEM、SMACSSなど）、コードがどのように機能するかを予測しやすくします。

```css
/* BEM命名規則の例 */
.button {
  background-color: #007bff;
  border: none;
  color: white;
}

.button--large {
  padding: 10px 20px;
  font-size: 18px;
}

.button--block {
  display: block;
  width: 100%;
}
```

# 4. 再利用しやすい
### 概要
コードの重複を避け、コンポーネントを簡単に再利用できるようにすることです。

### 実現方法
汎用的なクラスを作成して、複数の場所で使用できるようにする。コンポーネントベースのアプローチを採用します。

```css
.button {
  padding: 10px 20px;
  border-radius: 5px;
  color: white;
  background-color: blue;
}
.button--primary {
  background-color: navy;
}
```

# 5. 保守しやすい
### 概要
コードを簡単に更新または修正できるようにすことです。
（既存の書かれたコードに対して、更新や修正がしやすくなることです。）

### 実現方法
コメントとドキュメントを充実させ、コードの構造を整理します。
また、CSS変数を使用して、色やフォントなどのテーマを一元管理します。

```css
:root {
  --primary-color: blue;
  --secondary-color: green;
}
.button {
  background-color: var(--primary-color);
  padding: 10px 15px;
  border: none;
  cursor: pointer;
}

/* モディファイア - 大きなボタン */
.button--large {
  padding: 15px 20px;
  font-size: 18px;
}

.alert {
  color: var(--secondary-color);
}
```

# 6. 拡張しやすい
### 概要
将来的に新しい機能やスタイルを簡単に追加できるようにすることです。

### 実現方法
コンポーネントベースのアプローチを採用し、スタイルを小さな再利用可能な単位に分割します。
CSS変数を使用してを利用して、テーマやスタイルの変数を簡単に変更できるようにします。

```css
.card {
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  border-radius: 5px;
}
.card--with-header {
  padding-top: 20px;
}
```

# 7. まとめ
CSSを「予測しやすく」「再利用しやすく」「保守しやすく」「拡張しやすく」することは、効率的でサステナブルなフロントエンド開発の鍵です。
この記事では、この原則を実現するための具体的な方法とコード例を紹介しました。
このアプローチを取り入れることで、どのような規模のプロジェクトでも、CSSのコードをより管理しやすく、将来的にも拡張しやすい形で維持することが可能になります。
効果的なCSSの管理は、開発プロセスをスムーズにするために、非常に価値のあるスキルと考えます。
マークダウン説明書（自分用）

Markdownは、シンプルで読みやすいテキスト形式で文章を書くための軽量マークアップ言語です。以下に、一般的なMarkdown記法の一覧を示します：


# 1:見出し
```
# 見出し1
## 見出し2
### 見出し3
```

# 見出し1
## 見出し2
### 見出し3

---

# 2:強調
アスタリスク(*)またはアンダースコア(_)でテキストを囲むことで強調できます。
```
*イタリック*
_イタリック_
**太字**
__太字__
```
*イタリック*
_イタリック_
**太字**
__太字__
---

# 3:リスト:
順序なしリスト: - もしくは * を使います。
```
- アイテム1
- アイテム2
  - サブアイテム
```
- アイテム1
- アイテム2
  - サブアイテム
---
# 4:リンク: 
[リンクテキスト](URL) を使ってリンクを作成します。
```
[Google](https://www.google.com/)
```
[Google](https://www.google.com/)
---
# 5:画像: ![子犬の画像](画像URL) を使って画像を挿入します。
```
![ロゴ](https://user0514.cdnw.net/shared/img/thumb/TS0529003_TP_V.jpg)
```
![ロゴ](https://user0514.cdnw.net/shared/img/thumb/TS0529003_TP_V.jpg)
---
# 6:コードブロック: `バッククォート` もしくは```バッククォート3つ```でコードブロックを作成します。
```
```
# ```　でコードを囲む
---

# 7:水平線: 3つ以上のハイフン(-)、アスタリスク(*)、アンダースコア(_)を使って水平線を作成します。
```
---
```

---
# 8:引用: > を使って引用を表現します。
```
> 先日はありがとうございました。
```
> 先日はありがとうございました。
---
[翻訳転載] Golang Tip #21: ポインタレシーバの推奨

# はじめに

https://qiita.com/a10a/items/5063899c9f4a3bf4a2f2

本記事は以下のツイートの翻訳転載です。

https://x.com/func25/status/1758085077211443304?s=20

値レシーバ、またはポインタレシーバのどちらを選択すべきか、という内容になります。

```go
// 値レシーバ
func (c Cat) meow() { ... }

// ポインタレシーバ
func (c *Cat) meow() { ... }
```

個人的にはこの辺よくわかっていないので、とりあえずポインタレシーバを使ってきました。

が、このTipを読んでもあんまり腹落ちした感じではないです。多分実際に「ああここは値レシーバ/ポインタレシーバを使っておくべきだった」という体験が無いからかなと思います。

# Golang Tip #21: ポインタレシーバの推奨

以下リンクはポインタレシーバと値レシーバについての簡単な説明です。

- https://twitter.com/func25/status/1757759982354026636

Goでは、「変更を伴う場合はポインタレシーバを、そうでない場合は値レシーバを使用する」というルールは白黒はっきりしない。

### ポインタ・レシーバーを選択するのはどのような場合か？

- レシーバの状態を変更する場合
- レシーバが大きい構造体の場合
  （[上記で書いている](https://twitter.com/func25/status/1757759982354026636)ように、「大きい」は主観的な場合があります）
- レシーバとなる構造体に`sync.Mutex`のような同期フィールドが含まれている場合
  （ポインタレシーバを使用することでロックのコピーを避けることができます）

![image](https://pbs.twimg.com/media/GGXyFtjbQAAhgu7?format=png&name=medium)

- 確信が持てない場合は、ポインタレシーバに寄せておく方が賢明かもしれません

### 値レシーバーが適しているのはどのような場合か

- レシーバとなる型が小さく、また変更されない場合
- `map`、`func`、`channel`、またはサイズやキャパシティが変更されないスライスの場合（スライスの要素は変更されても良い）

> なぜサイズやキャパシティが変更されないスライスなのか

値レシーバを通してスライスの要素等[^1]を変更することはできますが、メソッド内でスライスのサイズやキャパシティの変更を行なってもメソッド外へ影響しないからです。

[^1]: `the elements of the slice or the content of the underlying array`

以下は例です。

- https://twitter.com/func25/status/1731181436282208375

最後に、一貫性が重要です。

一貫性を保つために、ある構造体に対して値レシーバ/ポインタレシーバを混在させないようにします。

一般的に、ある構造体について一部ポインタレシーバを使用する必要がある場合は、全てのメソッドのレシーバをポインタレシーバにするほうが良いです（ほとんどが値レシーバで十分であるとしても）。

これについて私が思いつく理由は以下です。

- 両方を使用すると、その構造体のインスタンスがどのように操作されるかに混乱や矛盾が生じるため
- インターフェースとオブジェクトの関係の一貫性とわかりやすさを保つため
  （参照: https://x.com/func25/status/1757760004768354346?s=20）
Azure Cloud Shell を使用して静的な HTML の Web アプリを作成する

# はじめに
Azure Cloud Shellを使用して静的なwebアプリを作成する方法を説明します。Azure Cloud Shellとは、Aブラウザからアクセスできる対話形式の認証されたターミナルです。 Azure リソースを管理するために使用できます。

## step1： ディレクトリを作成する
Shell上で以下のcommandを実行して、ディレクトリを作成します。
```bash:bash
mkdir htmlapp

cd htmlapp
```


ディレクトリの中にファイルを作成していき、アプリを開発していきます。今回は、すでに完成しているものをcloneしていきます。

```bash:bash
git clone https://github.com/Azure-Samples/html-docs-hello-world.git
```

リソース グループとアプリ名を保持する変数を設定します。

```bash:bash
resourceGroup=$(az group list --query "[].{id:name}" -o tsv)
appName=az204app$RANDOM
```

## step2：Web アプリの作成

サンプルコード上にあるhtml-docs-hello-world.htmlを以下のcommandを使ってApp Serviceにデプロイします。

```bash:bash
cd html-docs-hello-world

az webapp up -g $resourceGroup -n $appName --html
```

「az webapp up」は、ローカルディレクトリにあるアプリケーションを Azure App Service にデプロイします。もし必要なリソース（リソースグループ、App Service プラン、Web アプリ）が存在しない場合は、これらを自動的に作成します。

「-g $resourceGroup」はデプロイするリソースグループを指定するオプションです。resourceGroupにデプロイすることができます。


「-n $appName」は作成するwebアプリの名前を決めるオプションです。今回の場合はappNameがwebアプリの名前になります。

「--html」 このオプションは、デプロイするアプリケーションが HTML アプリケーションであることを指定します。Azure App Service は、アプリケーションのタイプに基づいて最適な設定を自動的に適用します。

コマンド全体の動作をまとめると、指定されたリソースグループ内に新しい Web アプリを作成し、現在のディレクトリにある HTML アプリケーションを Azure App Service にデプロイします。このプロセスにより、アプリケーションはインターネット経由でアクセス可能になります。

このコマンドを実行すると、以下のような表示が現れます。

```bash:bash
{
"app_url": "https://<myAppName>.azurewebsites.net",
"location": "westeurope",
"name": "<app_name>",
"os": "Windows",
"resourcegroup": "<resource_group_name>",
"serverfarm": "appsvc_asp_Windows_westeurope",
"sku": "FREE",
"src_path": "/home/<username>/demoHTML/html-docs-hello-world ",
< JSON data removed for brevity. >
}
```

ここで表示されるURLをブラウザで検索すると、デプロイしたwebアプリを表示することができます。

## step3：アプリの更新と再デプロイ

以下のcommandでエディタを開きます。
```bash:bash
code index.html
```
すると、index.htmlが表示されます。`<h1>`タグ内や`<p>`タグ内などを編集することができます。編集して、以下のcommandを実施することで再デプロイができます。

```bash:bash
az webapp up -g $resourceGroup -n $appName --html
```
AWS CLF入門 - スケーリング編

## はじめに
AWS CLF (AWS Certified Cloud Practitioner) を取得した際の学習記録をアウトプットとして以下に記す。

## リンク
[ネットワーク](https://qiita.com/yashiuri/items/31b2c9c3c49c2584cd01)
[セキュリティ](https://qiita.com/yashiuri01/items/73e5310b09ff41912862)
[コンピューティング](https://qiita.com/yashiuri01/items/9eaf71a1590e7815f9ef)
[コンテナ](https://qiita.com/yashiuri01/items/708b57ee179ae29e72a9)
[スケーリング](https://qiita.com/yashiuri01/items/79050093aff66b0f0665)
[ストレージ](https://qiita.com/yashiuri01/items/6d48d81f5a1651dcc999) 
[データベース](https://qiita.com/yashiuri01/items/159ea63b197f7a836d1c)
[メッセージ](https://qiita.com/yashiuri01/items/d98772b540ef2201c4e2)
[モニタリング](https://qiita.com/yashiuri01/items/64f6dbf38603cdb4828a)
[デプロイ](https://qiita.com/yashiuri01/items/85151311897d6afd429c)
[コストとサポート](https://qiita.com/yashiuri01/items/bac23130a43d62677330)
[移行とイノーベーション](https://qiita.com/yashiuri01/items/6e327034a7c50d56ca88)
[AWS用語集](https://qiita.com/yashiuri01/items/bd36c99623ca596b76e4)


## スケーリング
### **Amazon EC2 Auto Scaling**

- アプリケーションの需要の変化に応じて EC2 インスタンスを自動的に作成または削除
- スケールアップ/ダウン (性能の増/減) とスケール アウト/イン(台数の増/減)が即座に可能
- 動的スケーリング - 変化する需要に対応
- 予測スケーリング - 予測された需要に基づいて、適切な数の EC2 インスタンスを自動的に用意
- Auto Scaling グループとして最大最小インスタンス数を設定

### **ELB (Elastic Load Balancing)**

- アプリケーションへのトラフィックを、EC2 インスタンスなどのリソースへ自動的に分散
- Auto Scaling グループのインスタンスに対する通信の、代表の通信先として機能
Vuetify3 の goTo を使いたい

## 概要
Vuetify3 で画面スクロールしてくれるボタンを実装します
https://vuetifyjs.com/en/features/scrolling/#usage

## 背景
Vuetify 3.5.0 から goTo が使えるようになりました！  
- 何かしらのトリガーで、ページをスクロールさせる機能です  
- 例えば画面の下の方にスクロールしたあと「ページトップに戻るボタン」を押すと、ページの先頭に勝手にスクロールしてくれるやつとか…

## 実装
1. まずはドキュメントにしたがって実装してみます
必要なところだけ抜き出すとこんな感じになりますが、なんとエラーになります
    ```vuejs
    <template>
      <v-sheet rounded="b" border>
        <div id="goto-container-example" />
          <v-sheet>
            <v-btn
              text="Back to Top"
              @click="goTo(0, { container: '#goto-container-example' })"
            >
            </v-btn>
          </v-sheet>
        </div>
      </v-sheet>
    </template>
    
    <script>
      import { useGoTo } from 'vuetify'
    </script>
    ```
    実際にドキュメントそのままにプレイグラウンドで試してもエラーになります
    
    ![スクリーンショット 2024-02-19 11.56.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043470/34edd5f2-86eb-7085-8256-42437edd3ec0.png)
    
    そもそも `@click="goTo(0, { container: '#goto-container-example' })"` で記述されている `goTo` が宣言されていません <br />

1. ということで、ここでは別途作成した関数を呼ぶようにします
    ```vuejs
    <template>
      <v-sheet rounded="b" border>
        <div id="goto-container-example" />
          <v-sheet>
            <v-btn
              text="Back to Top"
              @click="onClick"
            >
            </v-btn>
          </v-sheet>
        </div>
      </v-sheet>
    </template>
    
    <script>
    import { useGoTo } from 'vuetify'
    
    export default {
      methods: {
        onClick() {
          const goTo = useGoTo();
          goTo(0, { container: '#goto-container-example' });
        },
      },
    }
    </script>
    ```
    
    `onClick` で `useGoTo()` を呼んで `#goto-container-example` という id が振られているコンテナに飛べるようにします  
    すると、エラーになります！
    
    ![スクリーンショット 2024-02-19 12.06.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043470/a01b7e82-a35c-1332-99ab-967327ce204e.png)
    ![スクリーンショット 2024-02-19 12.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3043470/b5dc220b-4b6c-8f9a-fb87-85bd4136a502.png)



1. goto instance を作るのは `setup()` でやらないとダメそうです
ならばその通りに実装してみます
    ```vuejs
    <template>
      <v-sheet rounded="b" border>
        <div id="goto-container-example" />
          <v-sheet>
            <v-btn
              text="Back to Top"
              @click="onClick"
            >
            </v-btn>
          </v-sheet>
        </div>
      </v-sheet>
    </template>
    
    <script>
    import { useGoTo } from 'vuetify'
    
    export default {
      setup() {
        const goTo = useGoTo();
        return goTo;
      },      
      methods: {
        onClick() {
          this.goTo(0, { container: '#goto-container-example' });
        },
      },
    }
    </script>
    ```

      これで動くようになりました！
## まとめ
Vuetify3 で `goTo` を使いたければ、インスタンスの作成は `setup()` でしよう！
【AWS CLF-C02】AWS Certified Cloud Practitioner受験合格体験記

## はじめに
2024年2月 AWS Certified Cloud Practitioner(CLF-C02)に合格しましたので、受験合格体験記を記載します。
何かの参考になれば幸いです。

## 試験学習開始時の状況
試験学習開始時の状況は以下の通りです。
- AWSの実務経験は1年程度
- 2～3年ほど前にSAA(ソリューションアーキテクト–アソシエイト)の試験学習をしていたことがある
- インフラエンジニアとして従事

## 試験学習でやったこと
試験学習は2023年11月下旬頃から開始しました。
試験受験までの実質的な学習期間は1ヶ月位かと考えています。

また、以前SAAの学習をしていたこともあり、ある程度はAWSについて既に把握している所は多々ありましたので、その時の内容を思い出しながら進めて行きました。

※AWS Well-Architected Frameworkの柱は、5本だったはずでしたが6本目の柱が追加されている等の新たな発見が有りました。

以下に試験対策として行った事項を時系列で記載していきます。

### テキストの購入
2023年9月に、C02へ試験改定が行われています。
11月の学習開始時に、このC02へ対応しているテキストは、まだ少なかったため対応している以下のテキストを購入しました。

なおこちらは、以下に記載するAWS公式のトレーニング動画を一通り見終わった後に、この本を一読しています。
 
https://www.shuwasystem.co.jp/book/9784798071374.html


### AWS公式のトレーニング動画での学習
学習の手始めとして、先ずAWS Skill Builderに有るトレーニング動画で学習しました。

https://explore.skillbuilder.aws/learn

:::note info
学習したコース
AWS Cloud Practitioner Essentials (Japanese) (Na) 日本語実写版
:::
Skill Builderトップページの検索ボックスで「AWS Cloud Practitioner Essentials (Japanese)」を検索すると出てきます。

こちらは、無料で受講可能です。
なんと無料でありながら、6時間の超大作です。
この動画を見ることで、AWSについて一通りの理解はできるかと思います。
先ずは、この動画を見てみることをオススメします！

コーヒーショップを例に、とても分かり易く説明してくれます。
また、チャプター毎に確認問題も出題されます。

余談ですが、所々での講師の先生のウィンクが気になりました。
まぁ良いんですけどね～
何のことか分からない方も居るかと思いますが、こちらは見て頂ければ分かるかと思います。

### 購入したテキストの読み込み
トレーニング動画を見終わった後、購入したテキストを読みました。
予め動画を見ていたことで、テキストに記載されている内容はスムーズに読み進められました。

その後、巻末に付いている練習問題を、期間を開けて2周やっています。
問題を解いて合っているかだけではなくて、間違いの選択肢の解説も読み、知識を定着させました。

この時2回目も間違えた所は、弱い部分ですので重点的に復習しました。

### AWS公式のCLF-C02バージョン対応問題集の実施
こちらもSkill Builderにあるものとなります。
もちろん無料です。

:::note info
学習したコース
AWS Certified Cloud Practitioner Official Practice Question Set (CLF-C02 - Japanese) 
:::

問題数は、実際の認定試験とは異なり20問だけとなりますが、実際の認定試験の形式となっています。
こちらは何度も模擬試験を受験できますが、出題される問題は固定されており、20問の出題順番が変わるだけです。

模擬試験の出題問題が、AWS試験での独特な日本語の言い回しもされていますので、試験本番前の対策としても良かったと思います。

### AWSサービス用語の学習
テキストの最終章に有った、AWSサービス用語を暗記しました。
CLF-C02バージョンで出題されるサービス名称は、以前のC01と比較して倍以上になっているとの事で、多数あるAWSサービスの概要だけでも覚えておいた方が、良いと考えた為です。

## 試験受験

### 試験申し込み
現在は、テストセンターでの受験以外に、自宅等でのオンライン受験もできる様ですが、調べて見たところ色々と受験環境の事前準備やトラブル発生した際の対応など大変そうだったので、素直にテストセンターで受験しました。
私は、Pearson VUEのCBTは初めてでしたので、結果としてテストセンター受験で良かったと思います。

### 試験受験本番
平日の夜での受験です。
試験時間である90分いっぱいの最後まで、回答の見直しをしていました。

率直な感想としては、結構回答に迷った問題があったなぁ～という感じでした。
そのため、終了時に確実に合格したという自信はありませんでしたが、結果無事に合格できました。
(合否結果は受験終了時に、画面に表示されます)

もしかしたら全65問のうち、15問はスコアに影響しない採点対象外の問題との事ですので、難しいと感じた問題が対象外だったのかもしれません。

## まとめ
受験が終わって感じたことは、やはりAWSのサービス名称は、最低限サービス概要だけでも抑えておく必要があると強く感じました。
仮に分からない問題が有った場合でも回答選択肢の中で、これは明らかに違うサービスだと分かれば、消去法で回答を絞ることができます。

後、選択肢の中で似たような紛らわしい選択肢が含まれていることが有ったので、惑わされないようにする必要があります。

今回Cloud Practitioner受験準備にあたって、書籍購入を除いてudemy等の有償教材は一切利用しませんでした。
個々人に依るかと思われますが、無料で提供されているものだけでも十分に対応可能なのではないかと思います。

## 最後に
これから受験される方、頑張ってください！
なお、不定期にキャンペーンが行われているようですので、適宜チェックしてみてください。

今回は、ちょうど行なわれていた以下キャンペーンを利用しました。
万一不合格でも、再試験１回無料ですので安心材料として助かりました。

:::note info
今ならプロモーションコードを取得して、2024年4月15日までにPearson VUEで受験予約を行うと、もし不合格の場合でも2024年6月30日までの再試験が無料になるキャンペーンをやっています。
:::
https://www.pearsonvue.co.jp/aws/freeretake?trk=33a6398d-378e-42ce-99fb-579fae3fbe57

「ピアソン VUE お支払いの受領通知」メールの明細に「AWS 2024 グローバル再受験」が0円で記載されていることを確認してください。
【ChatGPT有＋DALL-E3】同じセッションを続けると重くなる。


　どうも、カーブミラーです。

　今回は、同じセッションを続けると重くなる、という話です。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はありません。あっ、無料版
も使ってますね。　あしからず。
:::

　“同じセッションを
　　続けると重くなる”、と
　　　書きましたが、
　　　　連続して描画している分には
　　　　　大丈夫です。

　何が問題なのか。

　私はスマホ操作なので
　　それで顕著なのかもしれません。
　　　パソコンでは、
　　　　起こらないのかもしれません。

　アプリ版もWeb版も
　　セッション選択時、
　　　セッション読み込みに
　　　　時間が掛かります。

　画像生成をした
　　セッションは
　　　特に、です。

　これは
　　なんの不思議も
　　　ありません。

　文字データだけならば
　　たいした量ではありませんが、
　　　画像データとなると
　　　　比較にならないほどの
　　　　　データ量になります。

　これを読み込むには
　　それなりの時間が必要なのは
　　　わかるかと思います。
***
　さて、
　　それはわかっていても
　　　通信環境下にあっては
　　　　早くはなりにくい。

　でも
　　考えてみてください。

　そのセッションの
　　すべてが必要ですか？

　もちろん、
　　同じパターンが必要ならば、
　　　そのまま続けるべきでしょう。

　そうでない場合、
　　新しいセッションに
　　　切り替えましょう！
***
　“NewChatするの？”と
　　思われる方もおいででしょうね。
　　　わかります。

　基本的に
　　セッションが変われば、
　　　これまでのやり取りは
　　　　継承されませんからね。

　それを
　　多少なりとも
　　　継承しましょう。
***
　まずは、
　　テキストだけの
　　　セッションについてです。

　ここには
　　ChatGPTの無料版や
　　　GPT3.5Turboも
　　　　GPT-4も
　　　　　含めます。

　以下のプロンプトで
　　やり取りについて
　　　まとめてもらいます。

**“これまてのやり取りをまとめてください。”**

　これで
　　やり取りが
　　　一覧になります。

　場合によっては、
　　セッション最初に
　　　プロンプトを書いていることも
　　　　多々ありますね。

　このプロンプトと
　　一覧をコピって、
　　　新しいセッションを
　　　　開く。

　プロンプトをペーストして
　　ChatGPTからの回答を待ち、
　　　次のプロンプトを入力。

**“これまで、以下のやり取りをしていました。それを加味した上で、私からの文章を最初のプロンプトに従ってください。
###”**

　このあとに
　　やり取りをペーストします。

　このときに
　　注意するのは、
　　　入力枠には
　　　　入力制限があることです。

　そこから
　　考えると、
　　　セッションを
　　　　長々続けるものじゃない、
　　　　　と言えますね ｲﾀﾀ

　ともかく、
　　あとは継続するだけです。

　もちろん、
　　すべてをこれで
　　　継承できる、などと
　　　　言えません。

　いくつもの
　　プロンプトを
　　　やった場合などは、
　　　　そのプロンプトを
　　　　　必要な分だけ
　　　　　　コピー、改良する
　　　　　　　必要があるでしょう。
***
　さてはて、
　　今度は画像です。
　　　画像が扱えるのは
　　　　GPT-4ですね。

　画像！
　　これこそが、問題！

　文章どころじゃない
　　難易度ですからね！

　とはいえ、
　　ChatGPTさんは、
　　　作成した画像の
　　　　プロンプトを
　　　　　提供してくれます。

　以下のプロンプトで
　　作成を依頼しましょう。

**“英語プロンプト出力”**

　これで作成されたプロンプトを
　　コピーして、新しいセッションに
　　　ペーストすれば、
　　　　かなり近い画像が
　　　　　生成されます。

　もちろん、
　　近い場合は多くても
　　　全然違うこともあります。

　リトライを重ねるか、
　　修正を指示するか、
　　　あるいは、
　　　　新しいセッションを開くか、
　　　　　になるかと思います。

　場合によっては
　　諦めることもあるでしょうね。
　　　諦めたくはありませんが。

　何度かやって
　　それでもダメならば、
　　　すっぱり諦めましょう！

　ダメなことに
　　時間を取られるなんて
　　　馬鹿らしいですから。

　**時間は、有限です。**

　これが
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
【Mongoose】つながらないMongoDB Node.js Driver の代わりに使ってみた

## 概要
なぜかMongoDB Node.js Driverを使用したNode.jsからMongoDBへの接続ができなかったので、試行錯誤の末に、よくわからないままMongooseを使ったら接続成功した話です。
UbuntuもNode.jsもDBも初心者なので、間違いがあればご指摘いただけると嬉しいです。
### 状況
- 接続が成功した場合はコンソールに「connected」というログを吐き、失敗した場合はエラーが出るはずだが、ログもエラーすらも表示されない
- MongoDBの設定は基本デフォルトのまま、UFWはポート27017を許可
- 確認のためLinuxの`nc`コマンドを使用したところ、こちらでは接続が成功したのでモジュールとの相性が悪いのではと考察
### 実行環境
- MacBook Pro 12,1 - Ubuntu 22.04.4 LTS
- Node.js 20.11.1, npm 10.4.0
- MongoDB Node.js Driver 6.3.0
- Mongoose 8.1.3

## 問題のあるコード
```js:index.js
const MongoClient = require("mongodb").MongoClient;
const assert = require("assert");

client = new MongoClient("mongodb://127.0.0.1:27017");
client.connect((error) => {
  assert.equal(null, error);
  console.log("connected");

  const db = client.db("test");
  client.close();
});
```
ちなみに、下記のようなMongoClientのインスタンスを作らず接続する方法も試しました。
https://qiita.com/one-kelvin/items/c0c036f774f0b3b98ae5

### コンソール出力
```console
$ node index.js

```
（何も表示されないので）

## やけくそでMongooseを使ってみた
```js:index.js
const mongoose = require("mongoose");

mongoose.connect("mongodb://127.0.0.1:27017/test").then(() => {
  console.log("connected");
  mongoose.disconnect();
});
```

### コンソール出力
```console
$ node index.js
connected
```
つながった！！

## 感想
Mongooseで接続が確認できた後、コレクションの操作などを試してみましたが無事成功しました。知識が足りないのもあって原因が皆目見当もつきませんが、とりあえずつながって良かったです。
Pythonの基本④【配列操作メソッド】

# Pythonでよく使う配列操作メソッドまとめ
この記事では、よく使われる配列操作メソッドについて備忘録的に紹介します。

## 配列操作の必要性
配列操作は、データを整理し、処理するために不可欠です。配列操作を使用することで、データの検索、追加、削除、変更などが容易になります。しかし、**特定の操作をforループと組み合わせる際**には注意が必要です。例えば、`remove()`メソッドをforループ内で使用する場合、予期せぬ動作を起こす可能性があります。

## よく使う配列操作と使用例
`append()`: 要素をリストの末尾に追加します。
```python
numbers = [1, 2, 3]
numbers.append(4)
print(numbers)  # Output: [1, 2, 3, 4]
```

`extend()`: 他のリストを現在のリストに結合します。

```python
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
numbers1.extend(numbers2)
print(numbers1)  # Output: [1, 2, 3, 4, 5, 6]
```

`insert()`: 指定した位置に要素を挿入します。
```python
numbers = [1, 2, 3]
numbers.insert(1, 5)
print(numbers)  # Output: [1, 5, 2, 3]
```

`remove()`: 指定した値と一致する要素を削除します。
```python
numbers = [1, 2, 3, 2]
numbers.remove(2)
print(numbers)  # Output: [1, 3, 2]
```

:::note warn
ただし、forループと組み合わせる際には注意が必要です。これについては以下の記事でまとめています。
:::
https://qiita.com/jay_42tokyo/items/b10eaa32e8c43129a7a0

`pop()`: リストから指定したインデックスの要素を取り出し、削除します。
```python
numbers = [1, 2, 3, 4]
last_number = numbers.pop()
print(last_number)  # Output: 4
print(numbers)  # Output: [1, 2, 3]
```

`index()`: 指定した要素のインデックスを取得します。
```python
numbers = [1, 2, 3, 4, 2]
index = numbers.index(2)
print(index)  # Output: 1
```

`count()`: 指定した値と一致する要素の数を返します。
```python
numbers = [1, 2, 3, 2, 2]
count = numbers.count(2)
print(count)  # Output: 3
```

`reverse()`: リストの要素を逆順に並べ替えます。
```python
numbers = [1, 2, 3, 4]
numbers.reverse()
print(numbers)  # Output: [4, 3, 2, 1]
```

`sort()`: リストをソートします。
```python
numbers = [3, 1, 4, 1, 5, 9, 2]
numbers.sort()
print(numbers)  # Output: [1, 1, 2, 3, 4, 5, 9]
```

`copy()`: リストのコピーを作成します。
```python
numbers = [1, 2, 3]
numbers_copy = numbers.copy()
print(numbers_copy)  # Output: [1, 2, 3]
```

`clear()`: リストのすべての要素を削除します。
```python
numbers = [1, 2, 3]
numbers.clear()
print(numbers)  # Output: []
```

## まとめ
Pythonのリストは多くの便利な配列操作メソッドを提供しています。これらのメソッドを駆使することで、データの操作や処理がより効率的に行えます。ただし、特に`remove()`などの要素を削除するメソッドをforループと組み合わせる際には、コピーを使用するなどの注意が必要です。
【Oracle Analytics】ダッシュボードのエクスポート設定の注意事項

## 概要
ダッシュボードページのエクスポートの見落としがちな設定について記載します。
ダッシュボードページをデフォルト設定のままエクスポートした場合、ダッシュボードに表示されている内容がそのままエクスポートされ、ブラウザに表示されていない内容はエクスポートされません。
ダッシュボードに表示されていないダッシュボードページ内容（表示制限の5,000行以内）をエクスポートする方法ついて記載します。

<dl>
<dt>データについて</dt>
  <dl>データは、Autonomous Data Warehouse（ADW）サンプルSales History (SH)スキーマの下記テーブルを利用しています。</dl> 
  <dd>PRODUCTS</dd> 
  <dd>SALES</dd> 
  <dl>※サンプルスキーマについては下記マニュアルを参照</dl> 
</dl>

https://docs.oracle.com/cd/E96517_01/comsc/introduction-to-sample-schemas.html#GUID-844E92D8-A4C8-4522-8AF5-761D4BE99200

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582570/d65325aa-4066-e510-d8e2-be280195b5fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582570/f671e3cd-c445-4797-724e-0102fee72dfa.png)


## 設定内容
#### 1. ダッシュボードページの設定
ページオプションからダッシュボード編集画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582570/a3c4eb99-ff98-6151-ce4a-2f57a9ea057b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582570/5c5a58cb-1e11-385a-68b2-991d64c868e4.png)


[印刷とダッシュボードページのオプション]を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582570/3188fa7f-29db-9576-7606-0c2f1ec3dd94.png)

[印刷行]の設定値を以下に変更します。
　表示可能　⇒　すべて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582570/036cd433-76a5-c81c-31c4-48c0c9ebe65b.png)


#### 2. 動作確認
ページオプションからダッシュボードページのエクスポートを行い、すべての内容がエクスポートされることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582570/71c85c30-1efb-0287-99de-260ff1816a1d.png)

## ご案内
株式会社ジールは、Microsoft Azure やAWS（Amazon Web Services）、Google Cloud Platform（GCP）、Oracle Cloud Infrastructure（OCI）など、多彩なクラウドプラットフォーム構築・運用の知見を有しています。そのため、複数のクラウドサービスを組み合わせるマルチクラウド環境においても、ベンダーロックインを回避し、お客様のご要望に応じた最適なクラウドプラットフォームの構築・運用への対応が可能です。
https://www.zdh.co.jp/products-services/cloud-data/
NFS v4でディレクトリ共有

# 概要
検証目的で、NFS Server/Clientを構築する機会がありました。  
NFSのバージョンは v4 です。   
本記事はその記録となります。 

# 環境
NFS ServerとClientはどちらも次の通りです。  
マシン：Amazon EC2  
OS：Ubuntu 22.04

# NFS Server作業

NFS Serverをインストールします。
```
$ sudo apt install nfs-kernel-server
```

ディレクトリの共有設定をします。
```
$ sudo vi /etc/exports
```

ファイルの最下部に次のように記載して下さい。  

```
<共有するディレクトリのフルパス> <Client IP>(rw,crossmnt,fsid=0,no_subtree_check)
```
> **補足説明**  
> `fsid=0` とすることで、共有ディレクトリはclientからはルートディレクトリ(/)として認識されるようになります。`fsid=0`とするのはNFS v4の約束事のようです。

設定を反映します。
```
$ sudo exportfs -ra
```
反映されたかどうか確認します。下記は例になります。
```
$ sudo exportfs -v
/home/ubuntu/nfs
172.16.xxx.xxx(sync,wdelay,hide,crossmnt,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)
```

# NFS Client作業

NFS Clientをインストールします。
```
$ sudo apt install nfs-common
```

任意のディレクトリ名にて、マウントポイントを作成します。  
```
$ mkdir <任意のディレクトリ名> 
```

NFSマウントを実施します。
```
$ sudo mount <NFS Server IP>:/ <マウントポイント>
```

マウントされたことが確認できれば完了です。  
以下は例になります。
```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  1.6G   28G   6% /
tmpfs           475M     0  475M   0% /dev/shm
tmpfs           190M  872K  190M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/xvda15     105M  6.1M   99M   6% /boot/efi
tmpfs            95M  4.0K   95M   1% /run/user/1000
172.16.xxx.xxx:/    29G  1.6G   28G   6% /home/ubuntu/nfs
```

## オプション
必要に応じて、OS起動時のNFS自動マウント設定も実施下さい。
```
$ sudo vi /etc/fstab
```

ファイルの最下部に次のように記載して下さい。  
```
<NFS Server IP>:/   <マウントポイント>        nfs     defaults         0      0
```
マシンを再起動後にログインし、自動的に共有ディレクトリがマウントされていることを確認して下さい。

# 参考
次のページを参考にさせていただきました。   
https://coush.jp/250.html  
https://kitani3.blogspot.com/2016/03/nfs-v4.html
ActiveStorageでBlobをアップロードする

# 前提

1. AWS ECS Fargate等の使用で、コンテナ内にファイル生成ができない環境を使用している
1. `ActionDispatch::Http::UploadedFile` オブジェクトではない方法でファイルを受信している


# 方法

以下はBase64形式でPNG画像を受信した時、一時ファイルを生成せずにActiveStorageでアップロードする方法です。


```ruby
image = "data:image/png;base64,xxxxx"
mime_type = image[%r/(image\/[a-z]{3,4})|(application\/[a-z]{3,4})/]
extension = mime_type[%r{\b(?!.*/).*}]
contents = image.sub(%r/data:((image|application)\/.{3,}),/, '')
decoded_data = Base64.decode64(contents)
blob = ActiveStorage::Blob.new(key: ActiveStorage::Blob.generate_unique_secure_token, filename: "image.#{extension}", content_type: mime_type)
blob.upload(StringIO.new(decoded_data, "rb"))

# ActiveRecord　に ActiveStorage Objectをアタッチする場合は以下も記載
# ここでは Model　を model, ActiveStorage をアタッチするカラムを image とする
# model.image.attach(blob)
```
コミットを簡単にまとめる方法

# コミットをまとめたい場合
まず、vimで編集はやりづらいので以下のコードを実行してエディタ上で編集できるように修正する。
```
git config --global core.editor 'code --wait'
```

次に、以下のコマンドで編集できるようにします。
```
git rebase -i --root
```

コミットファイルが表示されたら ```TEXT TO```ボタンを押下します。
まとめたいコミットの次から```pick``` を ```squash```して保存します(まとめたい最初のコミットはpickのままにする)

編集したファイルを閉じるとコミットメッセージを編集するファイルが開くので、不要なコメントを削除して、コメントを編集します。
セーブ後ファイルを閉じると、まとめたコミットに対してコメントが正しく反映されます。

最後にセーブしてファイルを閉じたらpushして作業完了です。
(git push --force-with-lease origin <ブランチ名>)
dockerを`docker compose up -d`で起動時にうまく起動しないことがあった（`error:exec "/sbin/tini": star /sbin/tini: no such file or directory error`）

dockerを`docker compose up -d`で起動時にうまく起動しないことがあった（`error:exec "/sbin/tini": star /sbin/tini: no such file or directory error`）

```sh
error:exec "/sbin/tini": star /sbin/tini: no such file or directory error
```

いつもは`/sbin/tini`で起動していたが、`find`してみると存在しない

```sh
$ find / -name tini
/usr/share/doc/tini
/usr/bin/tini
```

代わりに`/usr/bin/tini`をexecして解決

# 更に以下のエラーに直面した

```
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:756)
	at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
	at java.net.URLClassLoader.defineClass(URLClassLoader.java:473)
	at java.net.URLClassLoader.access$100(URLClassLoader.java:74)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:369)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
	at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)
```

javaが古い(java8)ためにエラーが出ているようで、java11以降にアップデートが必要な様子

https://www.jenkins.io/blog/2022/06/28/require-java-11/
> Therefore, it is critical to upgrade both the controller and agents to Java 11 or newer prior to upgrading Jenkins to 2.357 or 2.361.1. Use the Versions Node Monitors plugin to verify that agents are running a compatible version of Java.
> したがって、Jenkins を 2.357 または 2.361.1 にアップグレードする前に、コントローラーとエージェントの両方を Java 11 以降にアップグレードすることが重要です。 Versions Node Monitors プラグインを使用して、エージェントが互換性のあるバージョンの Java を実行していることを確認します。


https://community.jenkins.io/t/java-11-required-for-jenkins-2-357/2848

https://www.publickey1.jp/blog/22/jenkinsjava_8java_11java_17.html

# 参考

https://github.com/jenkinsci/docker/issues/629

https://stackoverflow.com/questions/57915230/command-with-2-paths-when-running-a-docker-container

https://qiita.com/Masashi9410/items/768223611b9286847f58
【QuickSight】招待メールからログイン出来ないUserがいた場合の確認ポイント

# はじめに

Amazon QuickSightの招待メールを関係者に送付してログイン確認をお願いした際に、1名のみ招待メールからどうしてもログインができず解決に苦戦しておりました:worried:

そこでサポートに問い合わせた結果、原因と解決方法が盲点でしたのでこの学びをTipsとしてまとめておきたいと思います:pencil2:

# 発生した事象

新規アドレス宛に招待メールを送付していましたが、「ユーザー名はこのアカウントに既に存在します」のエラー文が表示されました。

そこで、一度ユーザーから削除し再度招待メールを送付しログインを試みましたが同じ結果でした:tired_face:

▼QuickSightのログイン画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/83900ea9-f1a3-a5db-d787-528054a9b45a.png)

▼QuickSightの管理画面
何度確認しても、ログインした形跡はありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/eb22bf13-3594-c2ee-8307-f0917d39bc6c.png)

サポートセンターに聞いてみました:point_up:

# 原因

サポートセンターへの問い合わせで原因が判明しました:eyes:

原因は、
**QuickSightユーザーのユーザー名が、ルートユーザーのメールアドレスと同一の為**でした。

現状、ルートユーザーのメールアドレスとQuickSight ユーザーのユーザー名が一致する場合、「ユーザー名はこのアカウントに既に存在します」のエラーメッセージが表示され、サインインできない挙動になっているとのことでした:pensive:

# 解決策

1. ユーザーの招待のポップアップ表示で、入力欄にルートユーザーで登録しているメールアドレス以外を入力し、プラスマークかエンターキーで追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/79937142-0695-481f-c876-8d00ad09b64f.png)

2. その後、任意のメールアドレスを入力する。ルートユーザーで登録しているメールアドレスも設定できます！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550351/121d93b6-928d-4280-df16-dc4ad0ada293.png)

ホワイトペーパーのリンクは以下になりますので、合わせてご確認ください。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/managing-users.html#inviting-users


# さいごに

QuickSightへのユーザー追加や権限設定は比較的同じ機能しか利用していなかった為、
変な設定をしてしまっているのではないか？等を疑い解決まで時間を要してしまいました:fearful:

ルートユーザーとして登録しているメールアドレスが起因する可能性に気づくことが出来なかったので非常に勉強になりました:hatched_chick:

QuickSightを活用されている方で同じような事象が発生している方の参考になりましたら幸いです。


# 弊社では一緒に働く仲間を募集中です:robot:
現在、様々な職種を募集しております。
カジュアル面談も可能ですので、ご連絡お待ちしております！

募集内容等詳細は、是非採用サイトをご確認ください。

https://engineer.po-holdings.co.jp/
DXライブラリ学習のための下準備

# はじめに
開発効率を上げるためにはデバッグやテストのしやすさが重要です。ウィンドウモードでの作業はアプリケーションの動作を確認しながら、プログラムの変更をテストできるため大きなメリットがあります。この記事ではウィンドウモードへの切り替え方法と、アプリケーション終了後、すぐにウィンドウが閉じてしまう対策を紹介します。

## 関連記事

https://qiita.com/yokan/items/788d352ccb72182f87bb

# 開発環境
- Windows11
- Visual Studio 2022
- DXライブラリ Ver3.24d

# ウィンドウモード
フルスクリーンモードはゲームを遊ぶのに適していますが、開発の初期段階ではデバッグ作業において不便を感じることがあります。ウィンドウモードなら複数のアプリケーションを同時に表示できるため、プログラムの修正と結果の確認を素早く行うことができます。まずはウィンドウ化をするために`ChangeWindowMode`関数を使います。

```cpp
#include "DxLib.h"

int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpcmdLine, _In_ int nCmdShow )
{
    // ウィンドウモード
    ChangeWindowMode( TRUE );

    // DXライブラリの初期化
    if( DxLib_Init() == -1 )
    {
        // -1ならエラーとしてゲーム終了
        return 0;
    }

    // DXライブラリの破棄
    DxLib_End();

    return 0;
}
```
ChangeWindowMode関数の引数に`TRUE`を指定するとウィンドウモードになります（`FALSE`を指定するとフルスクリーンモード）また、この関数を呼び出さなかった場合はフルスクリーンモードで起動します。

ChangeWindowMode関数はDxLib\_Init関数より先に呼び出すことをお勧めします。DxLib\_Init関数の後でこの関数を呼び出すとアプリケーションが一度フルスクリーンモードで起動した後にウィンドウモードに切り替わるため、動作としてはやや不自然です。

# プログラムの一時停止
現状では何か画面に表示されるプログラムを書いてもすぐに終了してしまうため、これもデバッグには不便です。以下のように`WaitKey`関数を使うとプログラムを一時停止できるようになります。

```cpp
#include "DxLib.h"

int WINAPI WinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpcmdLine, _In_ int nCmdShow )
{
    // ウィンドウモード
    ChangeWindowMode( TRUE );

    // DXライブラリの初期化
    if( DxLib_Init() == -1 )
    {
        // -1ならエラーとしてゲーム終了
        return 0;
    }

    // プログラムの一時停止
    WaitKey();

    // DXライブラリの破棄
    DxLib_End();

    return 0;
}
```
WaitKey関数は何か入力があるまでプログラムを一時停止します。これで実行結果を確認できるようになりました。

:::note
WaitKey関数はKeyという名前がついていますが、実際はマウスやコントローラーの入力にも反応します。
:::
Tooling APIを使ってコンポーネントが使用されている場所の調査する


+ [Apex Classで未使用のメソッドを見つける方法](https://qiita.com/Keiji_otsubo/items/54c6940df3fd539722a4)

+ [コンポーネントが使用されている場所の調査](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YvgTC)
+ [LWCでToolingAPIを使用:"errorCode":"INVALID_SESSION_ID"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007YviaO)

:::note
Apex上でエンドポイントをべた書きするのではなく、以下の設定方法で動作しました。

①指定ログイン情報に
https://私のドメイン.my.salesforce.com/
ではなく
https://私のドメイン.my.salesforce.com/services/data/v60.0/tooling/query/
まで記載

②Apex上で
callout:指定ログイン情報名
でエンドポイントを設定したところ動作しました!

また、確認の中でToolingAPIに対してセッションIDは認証として関係無いという記事も見つけることが出来ました。
:::


sapleAuraというコンポーネントのMetadataComponentIdが分かっていれば、依存関係を検索できるとは思います。

組織内のメタデータコンポーネント間の依存関係を表します。書き込みを実行できますメタデータコンポーネントの依存関係API バージョン 43.0 以降の Tooling API を使用するか、API 49.0 以降の Bulk API 2.0 を使用します。

[メタデータコンポーネントの依存関係（ベータ）](https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/tooling_api_objects_metadatacomponentdependency.htm?q=MetadataComponentId)

https://salesforce.stackexchange.com/questions/347125/how-to-find-the-action-override-with-its-id

Postmanを使ってMetadataComponentIdが検索できる。

 

以下のクエリで DeveloperName='toastTest' 太字のところを探したいコンポーネントにすれば検索できると思います。

```
select+Id,FullName,DeveloperName+from+AuraDefinitionBundle+where+DeveloperName='toastTest'
```

検索結果はこんな感じです。このidを使えばいいのかな？

```Json
{
    "size": 1,
    "totalSize": 1,
    "done": true,
    "queryLocator": null,
    "entityTypeName": "AuraDefinitionBundle",
    "records": [
        {
            "attributes": {
                "type": "AuraDefinitionBundle",
                "url": "/services/data/v59.0/tooling/sobjects/AuraDefinitionBundle/0Ab5i0000014DkdCAE"
            },
            "Id": "0Ab5i0000014DkdCAE",
            "FullName": "toastTest",
            "DeveloperName": "toastTest"
        }
    ]
}
```

実際にAuraコンポーネントをアクションのボタンにしているものを検索してみました。

ボタンと言うよりはアクションを設定しているオブジェクトが検索されていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/6b47499a-079c-9759-fed9-22b533982d57.png)


何故、LWCのコンポーネントはここで検索されないのかは私では分かりませんね。

ただ、興味深いことに同じようなことが質問されてました。
ベータ版なので完ぺきではないのかな？

@sfdcfox I managed to find the view, in which the component was previously used, via MetadataComponentDependency, and this salesforcecodex.com/salesforce/… My problem now is that I don't understand why that is the case? I pulled down the digital experience bundle, and looked though the view, but cannot find the property i want to delete. It does not exist? so why does it show up as a dependcy?

https://salesforce.stackexchange.com/questions/413863/deleting-property-tags-specified-in-lwc-meta-cannot-be-deleted


# 今回使ったクエリの覚え


```
select+Id,FullName,DeveloperName+from+AuraDefinitionBundle+where+DeveloperName='fkd_kenmei_Action'
```

```
SELECT+MetadataComponentName,MetadataComponentType,RefMetadataComponentName,RefMetadataComponentType+FROM+MetadataComponentDependency+Where+MetadataComponentId='0Ab10000000HLIUCA4'
```
【flutter】よく見るようになった用語を深掘りしたい

こんにちは！
今回は、最近私がflutter開発をする中でよく見るようになったflutter用語を4選紹介したいと思います！
今回も最後まで読んでいただけたら、嬉しいです！

## 1, final
finalは、変数が一度値を代入された後に再代入できないことを示します。つまり、一度初期化された後に値を変更できない変数を定義する際に使用されます。
以下はfinalを使用した変数の宣言の例です。
```php
final int age = 35;
final String name = '〇〇';
final List<String> colors = ['red', 'white', 'black','blue'];
```
このように、finalで宣言された変数は、その後のコード内で再代入することができません。たとえば、以下のようにage変数に新しい値を代入しようとするとエラーが発生します。
```php
age = 40; // エラー: final変数に値を再代入できません
```
finalは、一度初期化した変数の値が変更されないことを保証するために使用されます。特に、変更されないことが明確な場合には、finalを使用することで、コードの読みやすさと安全性を向上させることができます。

## 2, late
lateは、遅延初期化（Late Initialization）を示します。つまり、変数が初期化される前に使用されることがあり、実行時エラーを回避するために、宣言時に初期化する必要がない場合に使用されます。

以下はlateを使用した変数の宣言の例です。
```php
late int age;
late String name;
late List<String> fruits;
```
これらの変数は、宣言時に初期化されず、後で初期化されることを示しています。例えば、以下のように変数に値を代入することで初期化できます。
```php
void initializeVariables() {
  age = 35;
  name = '〇〇';
  colors = ['red', 'white', 'black','blue'];
}
```
lateを使用することで、変数が初期化される前に使用される可能性がある場合でも、コンパイルエラーが発生せず、実行時エラーを回避できます。

## 3,async/ await
Flutterでは、非同期プログラミングに対応するためasyncとawaitキーワードが利用されます。これらのキーワードを使うことで、非同期関数の実行を制御し、非同期操作の完了を待つことができます。
 ### async/awaitの基本的な使い方
 asyncキーワードは非同期関数を宣言するために使用されます。このキーワードを関数の前に付けることで、その関数内で非同期処理を行うことができます。また、awaitキーワードは非同期処理の完了を待つために使用されます。
 ```php
 Future<void> fetchData() async {
  // 非同期でデータを取得する
  await Future.delayed(Duration(seconds: 1));
  print('データを取得しました');
}

void main() {
  fetchData();
  print('処理を続行します');
}

 ```



## 4,initState
initState()メソッドは、ウィジェットの状態が初期化された直後に呼び出されます。このメソッドをオーバーライドして、ウィジェットの初期化に必要な処理を実行することができます。例えば、ウィジェットの初期データの取得、リスナーの登録、アニメーションの開始などが含まれます。
また、initState()はウィジェットが初期化された直後に呼び出されるため、このメソッド内で行う処理は一度だけ実行されます。つまり、ウィジェットの状態が変更されても再度呼び出されることはありません。そのため、ウィジェットの初期化に関連する処理は、ここで行うのが適切です。

```php
class MyWidget extends StatefulWidget {
  @override
  _MyWidgetState createState() => _MyWidgetState();
}

class _MyWidgetState extends State<MyWidget> {
  @override
  void initState() {
    super.initState();
    // 初期化処理を行う
    fetchData();
  }

  void fetchData() {
    // データの取得処理
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      // ウィジェットのビルド
    );
  }
}

```

## 最後に
今回の記事は以上になります！
今回も最後まで読んでいただき、ありがとうございました！
では、また次の記事で〜！
変革を牽引するクラウドネイティブエンジニアのすすめ

## はじめに
最近、ビジネスとテクノロジーの交差点にある『トリリオンゲーム』を読んで、感銘を受けています。その深い洞察に感銘を受けました。特にエンジニアの方々には、新しい視点を得るためにも一読をお勧めします。

はい。ということで、どーも、のぶこふです。


さて、ﾍｰｼｬは代表が言っている通り「クラウドネイティブなエンジニアの育成」に力を入れています。
本記事では、このクラウドネイティブなエンジニアとは何か、そしてなぜそれが現代のビジネスにおいて不可欠なのかについて、私の視点を交えて深く掘り下げていきたいと思います。

## クラウドネイティブとは
さて、クラウドネイティブの定義から始めましょう。
この用語は、技術者だけでなく、ビジネスリーダーにも理解され始めています。
そこで私が日頃から頼りにしているAIアシスタント「GPT-4 Turbo」に基本的な定義を尋ねてみました。
※本記事も十二分に活用させていただいています。
※タイトルも考えてもらっているので、いつもよりも堅苦しいかも

---

のぶこふ「クラウドネイティブとはなんでしょうか？」
のぶこふ「また、クラウドネイティブなエンジニアとはなんでしょうか？」

wrtn「クラウドネイティブとは、アプリケーションやシステムを設計、構築、運用する際に、クラウドの特性を最大限に活用するアプローチのことを指します。」
wrtn「具体的には、スケーラビリティ、柔軟性、迅速なデプロイメントなどのクラウド環境のメリットを生かして、サービスをより効率的に提供するための方法論や技術の集合体です。」
wrtn「マイクロサービスアーキテクチャ、コンテナ化、DevOps、継続的インテグレーション（CI）/継続的デリバリー（CD）、インフラストラクチャーとしてのコード（IaC）などがクラウドネイティブを支える重要な概念や技術です。」
wrtn「クラウドネイティブなエンジニアとは、上述したクラウドネイティブの原則に沿ってアプリケーションを開発・運用できる技術者のことを言います。」
wrtn「彼らはクラウドサービスに精通しており、その特性を活用して効率的なシステムを設計・構築することができます。」
wrtn「マイクロサービス、コンテナ技術、オーケストレーションツール、CI/CDのプロセス、監視・ログ管理などのスキルを持っていることが一般的です。」

---

数十秒で得られるこのような即時性と的確性は、私たちが生きるデジタル時代の象徴的な例ですね。

重要なのは、クラウド環境が提供する利点を最大化し、それをサービス提供の効率化や品質の向上に結びつける方法論や技術を駆使すること。これにより、ビジネスのアジリティが飛躍的に向上します。

さらに詳しく分析すると、以下のような重要な要素が浮かび上がってきます。
* アイデアをどれだけ早く、かつ具体的なサービスへと変換できるか？
* 開発したサービスをいかに迅速に市場に投入できるか？
* ユーザーのフィードバックをどのように素早く製品に反映させるか？
* これら全ての過程で迅速かつ正確な意思決定を行い、必要に応じて戦略を転換（ピボット）できるか？

クラウド技術の利用により、これまで時間とコストを要していたリソースの確保が、ほんの数クリックで完了する時代になりました。これは、ビジネスサイクルを加速させる大きな要因となっています。

### People、Process、Technologyのフレームワーク
「リソースの確保が迅速になった」というのは、インフラの調達が速早くなるだけでなく、改修やアップデートにかかる時間が大幅に短縮されることを意味します。

この考え方は、DevOpsやモダンアプリケーションの実践において重要な「People、Process、Technology」のフレームワークから来ています。
クラウドネイティブを支える「マイクロサービス」や「CI/CD」といった技術は、このフレームワークの中で「Process」と「Technology」の領域を強化します。

しかし、このフレームワークの中心にあるのは「People」、つまり人間です。
技術やプロセスは優れていても、それを活用し、革新を推進するのは人間の役割であり、その能力や協働が最終的な成功を左右します。
AWSの「[２Pizza Teams](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_What-is-Modernization_0430_v1.pdf)」という概念は、小規模チームが大きな成果を出すための環境を整えるというこのフレームワークの実践例です。

弊社では、技術者のスキルアップだけでなく、協働とイノベーションを促進する文化を育んでいます。
勉強会の開催、仮想プロジェクトによるモダンアプリケーション開発など、実践的な取り組みを通じて、新しい技術やプラクティスに対する理解を深め、実際のプロジェクトへと活かしています。

#### ここで宣伝
:::note info
弊社では、充実した働きやすい環境を提供し、新しい挑戦を楽しむ仲間を積極的に募集しています。
私たちとともに、クラウドネイティブな未来を切り開くエンジニアになりませんか？
興味をお持ちいただける方は、[こちら](https://job.rikunabi.com/2025/company/r442830056/)まで。
:::

## おわりに
今回は、クラウドネイティブなエンジニアの役割について、その重要性とともに解説を行いました。
次回は、より詳細に弊社のクラウドネイティブへの取り組み、特に「モダンアプリケーション開発」にフォーカスを当て、そのプロセスについてお話しします。

テクノロジーが進化し続ける中で、クラウドネイティブなアプローチはもはや一つの選択肢ではなく、必須の戦略となっています。この流れに乗り遅れないよう、日々の学びと実践を怠らないことが肝心です。

ありがとうございました。

### 参考資料
* [モダナイゼーションとは Modernization⼊⾨シリーズ AWS Black Belt Online Seminar](https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_What-is-Modernization_0430_v1.pdf)
バブルソート

https://paiza.jp/works/mondai/sort_naive/sort_naive__bubble


```py
def bubble_sort(A, n):
    for i in range(0,n-1):
        for j in range(n-1,i,-1):
            if A[j-1] > A[j]:
                A[j-1], A[j] = A[j], A[j-1]

        print(*A) 
            
n = int(input())
A = list(map(int,input().split()))
bubble_sort(A,n)
```
０）バブルソートは「左の要素と比較し、左の方が大きければ交換する」のが基本。
１）バブルソートは基本的に一番奥からなので、
　　１番目のループは左の要素と考えるので、０〜全要素-2までになる。
  　４１３５２からはじめるとして、たとえばiが０なら、n-2番目は「５」になる。
２）２番目のループは右の要素で、n-1つまりこの場合は2から初めて、0番目の4まで回す。
        で、A[j-1]、最初はA[3]とA[4]の比較となる。A[3]が大きければスワップ。
        次はA[2]とA[3]、次はA[1]とA[2]、。。。の繰り返しで、最後まで比較していく。
３）これが全部終わった時点でプリントし、次へ。
４）この時点で、一番左は確定しているため、要素が０数えの１からになる。で、jも
　　一番奥から２番目までをループで回すことになる。この繰り返し。

理屈はわかったけど、コードにできるまでが時間がかるなと思います。
ちょっと混乱するなぁ。。。
理系大学院生が統計検定2級をギリギリ合格した件

## 1.はじめに
　先日、1回目の受験で統計検定2級を62点(合格点ギリギリ)で合格しました。この記事では、統計検定2級を取る上でのアドバイス的なことができればなと思います。ルール上、試験内容を直接伝えることはできないので遠回しで曖昧な表現になる部分もあります。

## 2.筆者のプロフィール・受験のきっかけ
プロフィール
・理系大学院(2024年4月に修士課程卒業予定)
・学部1年で「線形代数学」や「解析学」、学部2年で「確率統計」という科目を履修
・卒論、修論では画像分類に関する研究に取り組んだ

受験のきっかけ
・「確率統計」を履修して区間推定・検定などで事象を疑うところが興味深いと感じていたから。
・データサイエンティストとしての就職が決まり、統計学とかが使えるかなと思ったから。

## 3.統計検定とは
　統計検定とは、統計に関する知識や活用力を評価する全国統一試験で、種別が10個に分けられている。その中でも統計検定2級は、大学基礎科目レベルの統計学の知識の習得度と活用のための理解度を問うために実施される検定で、データサイエンティストとしては最低限持っておくべきと言われている・・・らしい。

https://www.toukei-kentei.jp/about/

## 4.勉強法・用意したもの・出費
　勉強には、「統計WEB」「とけたろうさんのサイト」「公式問題集(過去問)」を使いました。まず、統計WEBで内容をざっと勉強し、公式問題集で問題を解いてみて分からないとことを統計WEBで復習。復習して分からない場合に、とけたろうさんのサイトの記事や動画を見て理解を深めようとしました。

 統計WEB
https://bellcurve.jp/statistics/course/

とけたろうさんのサイト
https://toketarou.com/

公式問題集
https://amzn.asia/d/aktGdJT

電卓
https://amzn.asia/d/gUk3kMU

**出費**
・受験料(学割)　5000円
・公式問題集2013~2015年(同級生から安い値段で頂いた)　500円
　**↑**持っておくといいかも(＾ω＾)
・公式問題集2017~2019年(同級生から安い値段で頂いた)　150円
・公式問題集2018~2021年(新品)　1980円
・電卓　1760円
・交通費(往復)　1300円くらい
合計すると1万円はかからないくらい(＾ω＾)

## 5.受験してみて
　初めての統計検定の受験でしたが、不満も含めて感想を述べます。
### 計算用の水性ペンとラミネート用紙、止めませんか？
　本番では、ラミネート加工された用紙に水性ペンでメモをしたり計算したりしますが、こすったら文字が消える、手が汚れる、小さく文字が書けないなど利便性が悪いです。
　あと、始めから2枚渡されて書ききれなくなったら交換するというルールなのですが、交換した場合は交換前の用紙を見られなくなるので、時間が余って見直そうと思っても序盤の内容はもう一回最初から解かないといけなくなります。字を小さくして節約しようにも水性ペンは小さく書きにくいし。。。

### 過去問(公式問題集)と感じが違うぞ？
　公式問題集の過去問はPBT(筆記試験)のときの過去問なので、CBT(パソコン)のタイプとは問われ方が多少異なる問題があります。特に回帰分析のところは注意が必要。

### 選択肢の数字をキーボードで打ち込む問題いる？
　マウスで選択肢から回答を選ぶだけでなく、キーボードで数字を入力する問題がありますが、計算結果ではなく選択肢の番号を打ちます。②を選ぶなら「2」とキーボードで打つ、という感じです。なんの意図が？？？

### えｗギリギリやんｗ
　受けた段階で、「あれ？これやばいかも・・・」ってなり受験直後に出力される結果を見たら、ギリギリすぎて一人で軽く笑いましたｗ

## 6.受験に向けてのアドバイス
　ここからが本題でしょうかね(笑)心得て欲しいことが2つあるので伝えておきます。特に1つ目は大事だと思います。
### ①「過去問の点数≠本番の点数・実力」
　X(旧Twitter)を見ると、勉強してそうなのに落ちてる方をちょくちょく見ます。私の考察ですが、こういうタイプの人は、**過去問で点数取れて自信を持って受験したが、思った点数が取れなかった**んじゃないのかなと思います。
　なんとなく察して頂きたいなと思いますが、勉強するときは **「点数を取ること」** よりも **「統計学を理解すること」** を意識した方がいいのかなと思います。過去問での点数が高いからと油断しないことです。私も過去問で8~9割ほどで本番で6割だったのも油断したのが原因だと思います。

### ②落ち着いて受験！
　初めての人はPCでの受験になれていなかったり、慣れない環境で焦ったりする方もいるんじゃないかなと思います。 **普段の勉強してるときみたいに落ち着きましょう！** ちなみに私は「やばいよやばいよ」と焦ってました(笑)

## 7.まとめ
　これから統計検定2級を受験する人の助けになればなと思います。気になることがあれば言える範囲でお答えしますので、コメントお願いします！
　私の今後ですが、統計学の勉強を引き続き勉強しつつ、統計検定データサイエンス基礎・発展、統計検定準1級などの資格を取りたいと思います。みなさんも一緒に頑張りましょう！最後までありがとうございました！
2024/2月に気になったPower Automateの記事

[Microsoft 365の活用ネタのまとめに戻る](https://qiita.com/Keiji_otsubo/items/5ddec87d5f1fd4e9f4af)

+ [Power Automateのフローを複数のリストで再利用するテクニック](https://qiita.com/tenda_ueta/items/bda9ba0a79982453f072)
+ [Power Automate で SharePoint Online のリストアイテムをユーザ列を使ってフィルタしつつ取得する方法](https://qiita.com/nanoka/items/8e9f4cc48023e1ec8b9d)


+ [【Power Automate】SharePoint のアクセス権に関するアクションについて](https://www.live-style.jp/powerautomate_sharepoint_accessright/)
+ [Power Automate を使用して Microsoft リスト フローの所有者とユーザーを管理する](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/guidance/manage-list-flows)
+ [【sharepoint】リストの権限を設定して重要なデータや文書を守ろう！](https://www.sg-plus.jp/blog/20230619)
+ [【PowerAutomate】手動実行フローで「実行専用ユーザー」を使う際の注意点](https://qiita.com/yuki_asa/items/acef14c87e2e8241db59)

+ [PowerAutomate: フロー並行処理追加と結合](https://qiita.com/baku2san/items/bd60c4cf7a52e47e86a1)


+ [PowerAutomateの動作１件に対して、承認通知が複数件表示される](https://answers.microsoft.com/ja-jp/msteams/forum/all/powerautomate%E3%81%AE%E5%8B%95%E4%BD%9C%EF%BC%91/da2b5873-2123-41d5-a744-b8da3fd2b719)

+ [「Number of concurrent requests exceeded the limit of 52」＝「同時リクエスト数が52の制限を超えたため」というメッセージです。](https://tana-techlog.net/?p=334)

+ [Power Automateで「Apply to each」の仕組みと動作を理解しよう](https://ascii.jp/elem/000/004/086/4086845/)


+ [【業務効率向上】PowerAutomateで並列ではない2段階以上の承認のフロー作成方法](https://mimulife.com/power_automate_multiapproval/)


+ [PowerAutomateからは見えないSPOリスト「サイトのページ」と「イベント」](https://qiita.com/mizukyf/items/81aa3a370cd40f501162)

+ [SharePoint Onlineでサイトページからページ一覧を取得するために管理しているリストのIDを取得したい。](https://qiita.com/DaddyDaddy/items/1918c4fcd68ae93546e7)
Kaggleコンペ振り返り 〈Detect AI Generated Text〉

# この記事の目的
本記事は2023/11/01〜2024/01/23の間に開催された[Detect AI Generated Text](https://www.kaggle.com/competitions/llm-detect-ai-generated-text/overview)コンペの振り返り記事です。

今回の課題は「与えられた文章が生成AIによるものか？それとも人間が実際に書いたものか？」を当てるというものです。

# Q. クイズ
皆さんは次の二つの文章どちらがAIでどちらが人間のレポートか判別つきますか？

#### お題：「電気自動車の発展について注目すべき点をまとめ、小論文を書きなさい」
#### 回答１
> 電気自動車の進化において、最も注目すべき要素はバッテリー技術の進化です。例えば、2030年には期待される固体電池技術は、航続距離の向上と充電時間の短縮に寄与する見込みです。これにより、一般ユーザーにとってもEVがより利便性の高い選択肢となります。バッテリー技術の進歩は、従来車との性能差を縮め、消費者がEVを積極的に選ぶきっかけとなります。そのため、EV市場の拡大と継続的な発展において、バッテリー技術の進歩は不可欠です。

#### 回答２
> 今後の電気自動車(EV)の発展について、注目すべきは販売価格の低下です。現在、EVの市場規模は年々拡大しているものの、その価格はガソリン車に比べ非常に高価であり、富裕層にしか行き届いていないという課題に直面しています。市場競争や政策による補助などを通じ、販売価格が低下することでより多くの人がEVの購入を検討し、ガソリン車からの乗り換えが起こると考えられます。したがって今後のEVの発展には販売価格の低下は必須の要素と言えます。

<details><summary>解答はこちら</summary>
1:生成AI
2:筆者
</details>

# コンペのモチベーション
- 宿題をChatGPTにやらせる
- 就活のESを書かせる
- 詐欺メールの文面の高度化

など生成AIの悪用について議論がある現状、「与えられたテキストがLLMによるものかどうか判定する技術」は大事になりそうです[^KEY]。

# コンペで主流となった解法
### 1. tf-idfベクトル&勾配ブースティング
今回のコンペで最も採用されていたのが「tf-idfによる文章のベクトル化」と「勾配ブースティングによるベクトルの分類」です。

[tf-idfベクトル化](https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html)によって、入力の文章に頻出する重要なパターンをベクトルで表現し、このベクトルを[lightgbm](https://lightgbm.readthedocs.io/en/stable/)等の分類器にかける流れです[^KEY2] 。

非常に精度が高く、学習も軽いためコンペ上位の解法含め多くの人が採用していた模様です。

### 2. 各種LLMのfine tune
[transformer](https://www.kaggle.com/code/thedrcat/detectai-transformers-baseline)や[mistral 7b](https://www.kaggle.com/code/hotchpotch/infer-llm-detect-ai-comp-mistral-7b)など多数のモデルが利用されていました。しかし、モデルの種類による精度差は今回重要なファクターではなかったとの報告[^KEY3][^KEY4] が多かったです。

# コンペ攻略のキーポイント
### データセットの拡充
本コンペティションでは、上述にもあるとおりモデルの精度やハイパラ調整よりもデータセットの拡充が大きな戦略の要でした。
![スクリーンショット 2024-02-19 9.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/697865/fec2e343-3468-d82e-259c-1ff179b3b82c.png)
評価されているディカッションも皆データセット周りですね！

### データの作成方法


[^KEY]: https://news.yahoo.co.jp/articles/2add11397898873d64b988ee27a58dd47c9f9de6

[^KEY2]: https://www.kaggle.com/code/x75a40890/ai-generated-text-detection-quick-baseline

[^KEY3]: https://www.kaggle.com/competitions/llm-detect-ai-generated-text/discussion/470395

[^KEY4]: https://www.kaggle.com/competitions/llm-detect-ai-generated-text/discussion/470395
wslでelixir その139

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookで、グローバルIPから緯度経度を求めて、地図表示せよ。

# セットアップ

```
Mix.install([
  {:req, "~> 0.3.0"},
  {:floki, "~> 0.35.2"},
  {:kino_maplibre, "~> 0.1.10"}
])

```

#  サンプルコード

```
html = Req.get!("http://checkip.dyndns.org").body

ip_address =
  html
  |> Floki.parse_document!()
  |> Floki.find("body")
  |> Floki.text()
  |> String.replace("Current IP Address:", "")
  |> String.trim()

ip_info = Req.get!("https://ipinfo.io/#{ip_address}/geo").body

coords =
  ip_info
  |> Map.get("loc")
  |> String.split(",")
  |> Enum.map(fn x ->
    {value, _} = Float.parse(x)
    value
  end)
  |> Enum.reverse()
  |> List.to_tuple()

MapLibre.new(style: :street, center: coords, zoom: 10)
```

以上。