OmniAICreator/Qiita-1.07M huggingface dataset:
Google Gemini：性能向上と価格引き下げで大幅アップデート

# GoogleのGeminiモデル：大幅な更新と価格改定

Google Developers Blogにて、Geminiモデルに関する重要なアップデートが発表されました。この記事では、以下のURLで公開された情報をまとめています：

[Updated production-ready Gemini models, reduced 1.5 Pro pricing, increased rate limits, and more](https://developers.googleblog.com/en/updated-production-ready-gemini-models-reduced-15-pro-pricing-increased-rate-limits-and-more/)

2024年9月24日、GoogleはGemini APIとGoogle AI Studioの上級プロダクトマネージャーであるLogan Kilpatrick氏とShrestha Basu Mallick氏の発表により、Geminiモデルの重要なアップデートを公開しました。このアップデートには、新しい本番用モデルのリリース、価格の大幅な引き下げ、パフォーマンスの向上など、多くの改善が含まれています。

## 主な更新内容

1. **新しい本番用モデルのリリース**
   - Gemini-1.5-Pro-002
   - Gemini-1.5-Flash-002

2. **価格の大幅な引き下げ**
   - Gemini 1.5 Proの価格が50%以上引き下げ（128K未満のプロンプトの入力と出力の両方）

3. **レート制限の引き上げ**
   - 1.5 Flashのレート制限が2倍に増加
   - 1.5 Proのレート制限が約3倍に増加

4. **パフォーマンスの向上**
   - 出力速度が2倍に向上
   - レイテンシが3分の1に低減

5. **デフォルトのフィルタ設定の更新**

## 品質の向上

新しいGemini 1.5シリーズは、テキスト、コード、マルチモーダルタスクにおいて幅広い性能を発揮するよう設計されています。具体的には以下のような改善が見られました：

- MMLU-Pro（より難易度の高いMMULUベンチマーク）で約7%の向上
- MATHとHiddenMath（内部の競技数学問題ホールドアウトセット）ベンチマークで約20%の改善
- 視覚理解とPythonコード生成を測定する評価で2〜7%の向上

また、モデルの応答の全体的な有用性も向上し、コンテンツの安全性に関するポリシーと基準を維持しながら、より多くのトピックで有用な応答を提供できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/0cee6cb9-4d24-327e-22fb-af58f64c70af.png)

## Gemini 1.5 Proの価格改定

2024年10月1日より、Gemini 1.5 Proの価格が大幅に引き下げられます：

- 入力トークンの価格が64%引き下げ
- 出力トークンの価格が52%引き下げ
- 増分キャッシュトークンの価格が64%引き下げ

これらの価格改定は、128K未満のトークンを持つプロンプトに適用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/7debc2db-b3fc-c871-9e94-1f62f7e01f3b.png)

## レート制限の増加

開発者がGeminiをより簡単に利用できるよう、有料プランのレート制限が以下のように増加されました：

- 1.5 Flash：2,000 RPM（従来の1,000 RPMから増加）
- 1.5 Pro：1,000 RPM（従来の360 RPMから増加）

今後数週間のうちに、さらなるレート制限の増加が予定されています。

## 出力速度の向上とレイテンシの削減

最新モデルの中核的な改善に加えて、過去数週間で1.5 Flashのレイテンシを大幅に削減し、1秒あたりの出力トークン数を大幅に増加させました。これにより、最も強力なモデルで新しいユースケースが可能になりました。具体的には以下の改善が見られます：

- 出力速度が2倍に向上
- レイテンシが3分の1に低減

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35782/a56637d5-d34e-a1f1-0fff-b90921003e87.png)


## 実験的な新モデル

"Gemini-1.5-Flash-8B-Exp-0924"という名称の改良版実験モデルもリリースされました。このモデルは、テキストとマルチモーダルの両方のユースケースにおいて大幅な性能向上を含んでいます。

## アクセス方法

これらの新しいGeminiモデルは、Google AI StudioとGemini APIを通じて無料で利用可能です。また、大規模な組織やGoogle Cloudの顧客向けには、Vertex AIでも利用可能です。

Googleは、これらの更新により、開発者がGeminiモデルを使用してより多くのイノベーションを生み出すことを期待しています。

## 関連書籍

- [生成AIで世界はこう変わる](https://amzn.to/3BgpwMJ)
- [実践　生成AIの教科書 ――実績豊富な活用事例とノウハウで学ぶ](https://amzn.to/4dpxiBb)
- [Google Gemini 1.5／LlamaIndex／LangChain 人工知能プログラミング実践入門](https://amzn.to/3XT9P70)
PHPのstaticとは？

## はじめに


現場で使ったことのないstaticについて勉強したのでアウトプットです。
いろいろアドバイス、訂正など教えてください！


## staticってなに？

staticを翻訳させると「静的」という意味になる。
確かにインスタンスを作ってインスタンス側で使うプロパティやメソッドに比べて
staticなプロパティやメソッドはクラス側で使うので動きは少ないが、、、

初学者の自分からすると結構動いてない？「動的」じゃないの？って思ってしまう。

　
ただ上記にも書いてあるが明らかな違いとしては、
インスタンス側にあるプロパティやメソッドはインスタンス毎にそれぞれのプロパティやメソッドを持てるのに対し、
staticで使うプロパティやメソッドはクラス側に持っているのでインスタンスがいくら作られても、1つだけ存在するということ。

#### 「インスタンス単位ではなく、クラス単位で値を保持する」時に使う。

## 動的と静的のコードの書き方の違い
　
定義↓
```diff_PHP
<?php
class MyClass {

    // インスタンスを作成して使用する「動的」
    public $property;
    public function method() {
     // 処理
    }
    
    // staticを使用する「静的」
    public static $staticProperty;
    public static function staticMethod() {
     // 処理
    }
}
```
　
使用するファイル↓
```diff_PHP
<?php

// インスタンスを作成して使用する「動的」
$class = new MyClass();
$class->$property = "Hello";
$class->method();

// staticを使用する「静的」
MyClass::$staticProperty = "Hello";
MyClass::mystaticMethod();
```

前の節でも説明したが
使用するときにインスタンスを作るか作らないかが大きな違いになっており、
staticなプロパティ、メソッドは「->」ではなく「::」が使われる
↓

```
クラス名::プロパティ名
クラス名::メソッド名
```



## 疑問
staticっていつ使うんだろうか？

これについて調べたが、
・安定して動く？
・PHPUnitで便利？
・カプセル化しにくい？

・・・？？

 　
Qiitaのつよつよエンジニアの意見はまだ理解できず、
今のところ別にstatic使わなくても困らないし実際に現場で使っていないのでイメージできず。
（静的ならconstで間に合いそう、、、）


今後、現場で使う機会があれば上司などに質問攻めしようと思いますｗ
その時はまた記事の方、アウトプットします。

※PHPつよつよエンジニア目指しております！
[paiza]レベルアップ問題集解答案(C#)【N 行 M 列のデータの入力】行ごとに要素数の異なる整数列の入力

意外と苦戦したので備忘録として…

# 問題
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_boss
>1 行目に整数 N が与えられます。
>2 行目から (N + 1) 行目までの先頭に整数 M_i (1 ≦ i ≦ N) が与えられます。それに続いて M_i 個の整数 a_1, ..., a_{M_i} が与えられます。
>上から i 番目、左から j 番目の整数は a_{i,j} です。
>N 行の a_1, ..., a_M をそのまま出力してください。
>>入力例1
3
1 8
2 8 1
3 8 1 3

>>出力例1
8
8 1
8 1 3

# C#解答案
```C#
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        int num = int.Parse(Console.ReadLine());
        //二次元リストの宣言
        List<List<string>> list = new List<List<string>>();

        //二次元リストに要素追加
        for(int i=0; i<num; i++){
            string[] inputstr = Console.ReadLine().Split(' ');
            List<string> list2 = new List<string>(inputstr);
            list.Add(list2);
        }

        //二次元リストの各行の先頭を除き、スペース連結で出力
        List<string> li = new List<string>();
        for(int m=0; m<num; m++){
            Console.WriteLine(string.Join(" ",list[m].Skip(1)));
        }
    }
}
```
コンパイル型言語とインタプリタ型言語（とスクリプト言語）について

違いがわかりにくいコンパイル型言語
とインタプリタ型言語について、まとめましたので参考にしていただければと思います。

＜コンパイル型言語 compiled language＞
一度に全てのソースコードを翻訳してからプログラムを実行する言語のこと。翻訳のことを「コンパイル」と呼び、コンパイルしたファイルはソースコードとは別に作成される。このときの別ファイルをファイルを「実行可能ファイル」や「モジュール」と呼びます。
一度に全てのソースコードを翻訳してからプログラムを実行するため、それが終わるまでは実行を待つ必要があります。ただし、これは主に開発作業中におけるデメリットです。開発作業中は何回もソースコードの作成と実行(テスト)を繰り返すため、僅かな時間ですがコンパイルを待つ必要があります。
しかし、実際に私たちがダウンロードして利用するアプリは、すでにコンパイルが済んでいる実行可能ファイルですので、ソースコードの翻訳を待つ必要はありません。

メリット・デメリット
    ・プログラムの実行速度が早い
    ・プログラム実行に手間と時間がかかる
    ・デバッグしづらい


言語例、Java・C++・Objective-C・Go・swift

＜インタプリタ型言語　interpreted language＞
コンパイル型とは異なり、少しずつソースコードを翻訳しながらプログラムを実行する言語のこと。

メリット・デメリット
    ・作成したプログラムの実行結果をすぐに確認できる
    ・デバッグしやすい
    ・実行速度が遅い
    ・基本的にはスクリプト型言語なので、可読性が高い

言語例、HTML・CSS・Ruby・Python・JavaScript・PHP

　＜スクリプト言語＞
 比較的簡単に書けるプログラミング言語を総称して呼ばれているもの。殆どのスクリプト言語は、インタプインタ型言語なので、ごっちゃになる。スクリプト言語という言葉は、インタプリンタ型やコンパイル型とは別視点の話なので、ここではあまり触れないでおきます。




～具体例で考えてみる～
例えばwebアプリケーションの場合、Webページ側(フロントエンド)はすぐに実行できることが求められるためインタプリタ型言語の JavaScript を採用する。（webページの下のほうは後から表示すれば良いので。）
バックエンド側は実行速度が求められるため、コンパイル型の言語を使用する。

もちろんですが、サービスの内容によって異なると思いますので、それらを踏まえてコンパイル型が良いか、インタプリンタ型が良いか選択していければと思います。

参照
https://magazine.techacademy.jp/magazine/30856
https://www.tokai-bs.co.jp/trends/column-350/
https://wa3.i-3-i.info/word188.html
https://wa3.i-3-i.info/word189.html
FletでMVCパターンを簡単に導入！「Flet-MVC-Template」を公開しました

# はじめに
こんにちは。今回は、PythonのGUIフレームワーク「Flet」を使って、簡易的にMVC（Model-View-Controller）パターンを導入できるテンプレート「Flet-MVC-Template」を作成したので紹介します。このテンプレートは非常にシンプルなものであり、現在のところ基本的な機能に留まっていますが、Fletを使ったプロジェクトの基盤として活用できるpublic templateとして公開しています。

GitHubリポジトリはこちらです：
https://github.com/n-koba0427/Flet-MVC-Template

サンプルアプリはこちらにデプロイされています：
https://flet-mvc-template-03c5ed9c5b93.herokuapp.com/

# Fletとは？
Fletは、FlutterのようなモダンなUIをPythonで簡単に作成できるフレームワークです。PythonでGUIを作る際、設計を整理しながら柔軟に開発できるツールとしてFletを利用し、このテンプレートを通してMVCパターンを適用することに挑戦しました。


# プロジェクトの目的
このテンプレートは、Fletを使ってPythonのGUIアプリケーションを効率的に開発するためのシンプルな土台を提供することを目的としています。特に、初心者向けに作成しており、MVCの概念を学びながら自分のプロジェクトに応用していくことができます。


# テンプレートの概要
現在のテンプレートは、非常に簡易的な構造となっており、以下の基本的な要素のみを含んでいます：

- Model: データやビジネスロジックの管理
- View: ユーザーインターフェースの構築
- Controller: ModelとViewをつなぐロジック

このテンプレートを使うことで、Fletプロジェクトにおいて基本的なMVCパターンを導入し、コードの整理や拡張がしやすくなります。


# 使用方法
1. プロジェクトをクローン
    まずはGitHubリポジトリをクローンします。
    ```bash
    git clone https://github.com/n-koba0427/Flet-MVC-Template.git
    ```
1. 必要なライブラリをインストール
    Fletを使用するために、必要なライブラリをインストールします。
    ```
    pip install -r requirements.txt
    ```
1. アプリケーションを実行
    次に、main.pyを実行してアプリケーションを起動します。
    ```
    flet run --web --port 8080
    ```
これで、シンプルなMVCアプリケーションが動作することを確認できます。


# ディレクトリ構成
テンプレートは以下のようなディレクトリ構造を持っています：
```
Flet-MVC-Template/
├── app/
│ ├── controller.py
│ ├── models.py
│ ├── urls.py
│ ├── utils.py
│ └── views.py
├── templates/
│ └── components.py
├── main.py
└── README.md
```


# 今後の展望
このテンプレートはあくまで簡易的なものであり、現時点では基本的なMVC構造の導入に焦点を当てています。今後、以下の機能を追加していく予定です：

- ORM（PeeweeやSQLAlchemy）によるデータベースとの連携
- エラーハンドリングの強化
- ユニットテストの導入
- さらなるUI改善

また、このテンプレートはプロジェクトの基盤として利用することを想定しているため、必要に応じて拡張し、自由にカスタマイズできる設計となっています。


# 最後に
Flet-MVC-Templateは、Fletを使って簡単にMVCパターンを導入できるシンプルなテンプレートです。現在はまだ非常に基本的な機能に留まっていますが、今後のアップデートで機能の拡張や改善を図っていきたいと考えています。ぜひフィードバックや提案などをいただけると嬉しいです！

GitHubリポジトリ：https://github.com/n-koba0427/Flet-MVC-Template

---

**この記事は、OpenAIのチャットGPTを活用して作成されました。**

テンプレートの作成や構造の整理、文章化において、効率的かつ体系的にアウトプットするために、チャットGPTを使用しました。特に、記事の全体構成や細かな説明部分で時間を短縮しつつ、明確かつ簡潔な内容を提供するために活用しています。今後の展開や改善についても、引き続きAIをサポートツールとして活用しながら進めていく予定です。

なお、この記事はあくまで**形式的な報告**であり、興味を持っていただいた方や、テンプレートに関する詳細な質問がある方とは、**メッセージにてしっかりとやり取り**をする意思がありますので、お気軽にご連絡ください。

---
TiDB関連イベント 10月分

9月も終わりになりました。少し寒くなり一気に秋らしい感じです。

恒例のイベント案内10月分です！

PingCAP主催のもの、コミュニティイベントに参加するものの両方を記載しています。
WebinarについてはJSTで6:00-24:00に開催されるイベントを記載しています。

イベント/社内勉強会でTiDBについて話してほしいというリクエストはお気軽に @bohnen ([X/@bohnen](https://twitter.com/bohnen)) までご連絡ください。

## 【お知らせ】TiDB User Dayのアーカイブ視聴が可能になりました！ 

https://pingcap.co.jp/tidb-user-day/

7月3日に行われたTiDB User Dayのセッションアーカイブが公開されました。是非登録して御覧ください。

## Database Engineering Meetup #4

https://scalar.connpass.com/event/330410/

今回は分散DBについての会ということで、東京在住TiDB/TiKVコミッタのTong MuさんがTiKVの進化について語ってくれます。それぞれの分散DBのコミッタの方々が話す面白い会になりそうです！

## ウェビナー: TiDBの紹介　分散型データベースの基礎からハンズオンまで

https://pingcap.co.jp/event/tidb-basics-to-hands-on/

最近は製品アップデートが多かったウェビナーですが、概要とハンズオンの回になりました。
初めての方も是非どうぞ。講師はおなじみPingCAP本田さんです。

## TiUG Meetup #3 大阪初上陸！TiDBを探索しよう

https://tiug.connpass.com/event/327074/

過去二回東京でやってきたTiDB User Groupのミートアップですが、今回はなんと大阪！
さくらインターネットさまのご厚意で新オフィスをお借りしての実施です！
まだLT枠埋まってないのでこの機会に発表しましょう！
WSL起動時に oh-my-posh: command not found となる

※この記事はoh-mu-poshのインストール方法は省略しています
bash設定でインストールされていることを前提とします

https://ohmyposh.dev/docs/installation/linux

ここら辺の記事を見てインストールしたが、ターミナル起動時にこうなってしまう...

```
oh-my-posh: command not found
```

# 対処法

まず、正しくoh-my-poshがインストールできているか確認します。
以下のコマンドを実行してください！
`ls ~/.local/bin/`
そこで `oh-my-posh` が表示されれば正常にインストールできています

こんな感じ★
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3653843/8c3a618f-87db-b2cb-5547-6b7400c381b3.png)

これがない場合は、正しくインストールできていません。(Bashでのインストールを前提としています)
[公式ドキュメント](https://ohmyposh.dev/docs/installation/linux)を見ながらインストールしなおしてください

## Ohmyposhが正しくインストールできているとき
以下のコマンドで一発解決するとおもいます
`sudo cp ~/.local/bin/oh-my-posh /usr/local/bin/`

これでも解決しない場合は `.bashrc` などに追加されるべきものができていないかもしれません
そこら辺については[公式ドキュメント](https://ohmyposh.dev/docs/installation/linux)にかいてあります

記事は以上です。ありがとうございました。
Rust(axum, sqlx)とReactでWebアプリ開発 - 備忘録4 shuttle Secrets.toml

## 関連記事
https://qiita.com/KMMT_h_m/private/fe7817ed5409c951699e

こちらの記事の補足。
shuttleにデプロイする際に、環境変数を読み込むようにした。

## 実装

shuttleの公式はかなり分かりやすく、ほとんどサンプル通りに組むことで実装できた。

https://docs.shuttle.rs/resources/shuttle-secrets#secrets

### コード

```toml:Secrets.toml
APP_URL = 'WEBアプリケーションのURL'
```

```rust:main.rs
#[shuttle_runtime::main]
async fn axum(
    #[shuttle_shared_db::Postgres] pool: PgPool,
+   #[shuttle_runtime::Secrets] secrets: SecretStore,
) -> shuttle_axum::ShuttleAxum {
    // loggingの初期化
    // RUST_LOG=debug cargo run
    let log_level = env::var("RUST_LOG").unwrap_or("info".to_string());
    env::set_var("RUST_LOG", log_level);

+   let app_url = secrets.get("APP_URL").expect("undefined [APP_URL]");

    sqlx::migrate!()
        .run(&pool)
        .await
    let app = create_app(
        TodoRepositoryForDb::new(pool.clone()),
        LabelRepositoryForDb::new(pool.clone()),
 +      app_url,
    );

    // axum 0.7.5
    let listener = tokio::net::TcpListener::bind("0.0.0.0:8000").await.unwrap();
    tracing::debug!("listening on {:?}", listener);
    axum::serve(listener, app.clone()).await.unwrap();
    Ok(app.into())
}

fn create_app<Todo: TodoRepository, Label: LabelRepository>(
    todo_repository: Todo,
    label_repository: Label,
+   app_url: String,
) -> Router {
    let allowed_origins = vec![
        "http://localhost:3001".parse().unwrap(),
        "http://127.0.0.1:3001".parse().unwrap(),
        "http://localhost:8080".parse().unwrap(),
        "http://127.0.0.1:8080".parse().unwrap(),
+       app_url.parse().unwrap(),
    ];

    let cors = CorsLayer::new()
        .allow_origin(AllowOrigin::list(allowed_origins))
        .allow_methods(Any)
        .allow_headers(vec![CONTENT_TYPE]);

    Router::new()
        .route("/", get(root))
        .route("/todos", post(create_todo::<Todo>).get(all_todo::<Todo>))
        .route(
            "/todos/:id",
            get(find_todo::<Todo>)
                .delete(delete_todo::<Todo>)
                .patch(update_todo::<Todo>),
        )
        .route(
            "/labels",
            post(create_label::<Label>).get(all_label::<Label>),
        )
        .route("/labels/:id", delete(delete_label::<Label>))
        .layer(Extension(Arc::new(todo_repository)))
        .layer(Extension(Arc::new(label_repository)))
        .layer(cors)
}
```

デプロイ時のコマンドは特に変更なく、`cargo shuttle deploy --no-test`でデプロイ完了した。
公式ドキュメントによると、開発環境と本番環境で分けたい場合は`--secrets [file]`のオプションを追加するとよさそう。


## 派生記事リンク
https://qiita.com/KMMT_h_m/private/1d7a9dccafa973812ed5

https://qiita.com/KMMT_h_m/private/fe7817ed5409c951699e

https://qiita.com/KMMT_h_m/private/33df79eaed29dd1a57a2
【Linux】Ubuntuのswap領域を弄ってみてわかったこと

## これは何?

Ubuntuでswap領域を増やしてみたのでやり方とか調べたことをまとめました。

### 環境

- Ubuntu20.04

---

## そもそもswapとは?

[Swapとは](https://beyondjapan.com/en/blog/2022/01/mame_swap/)個人的にわかりやすかったページを貼っておく。

コンピュータは基本的には
- CPU
- メモリ
- ストレージ
を使っている。

なぜ，メモリが必要なのかというと，ストレージよりも高速にアクセスすることができるためコンピュータの動作を早くすることができるためである。

では，swapとは何に使うのだろうか。
簡単に言うと，swapはストレージの領域を使ってメモリと同じように一時データを保存するのに使う領域である。
メモリが足りない際にメモリを増やすためにはハードウェア的にしか増やすことしかできないが，swapはストレージ領域を使うため簡単に増やすことができるのである。

そのため，メモリが足りないなと感じた際にはswap領域を増やしてやることでコンピュータのパフォーマンスを改善できる可能性がある。

---

## swapを開放してみる

メモリが余っている場合にはswap領域のデータをメモリに移すことでコンピュータのパフォーマンスが改善されることが期待できる。
そのため，swapを開放してみる。

やり方としてはswapを一度無効化して再度有効化するだけである。

```shell
sudo swapoff -a
sudo swapon -a
```
:::note info
-aはすべてを意味するオプション
:::

---

## swapの量を増やしてみる

### 適切なswapの量は?

一昔前はメモリの2倍のswap領域を確保するというのが主流な考え方だったらしいが，近年はメモリ自体の容量が増加して来たため，ベストプラクティス的なものは定まっていないらしい。

実際に[LinuCの解答](https://linuc.org/study/samples/1198/)を見ると以下のように記述がある。

> 「2. スワップスペースは、必ずメモリサイズと同じサイズで作成する」
スワップスペースのサイズは、任意で決めることができます。
適正なサイズは実メモリと同等、または2倍と言われていました。
これは慣例的に、メモリデータをディスクで扱った場合に、スラッシングを起こさない程度の値と言われています。
ただし、このサイズ設計は、メモリサイズが小さく、また高価だった頃の名残とも言えます。

> 現在では、32GBや, 64GB, 128GBなど、大量のメモリを搭載するハードウェアも珍しくありません。
このような場合には、システム・ソフトウェアの特徴を踏まえて、スワップスペースの設計が必要になります。

[RedHat Documentation1 4.2. システムの推奨スワップ領域](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/8/html/managing_storage_devices/recommended-system-swap-space_getting-started-with-swap)

によると以下が推奨されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/c6359e30-904c-4772-e0b8-a496e5f01b9a.png)

今回自分はハイバネートを使用しておらず，メモリが16 GBのため，4 GBで作成することにした。

:::note info
ハイバネートとは: コンピュータの電源を切る際に、現在のシステムの状態（メモリ内のデータ）をディスクに保存し、次回起動時にその状態を復元する機能

有効か確認するコマンドを実行したところ自分のシステムでは無効になっていた。

```shell
sudo systemctl status hibernate.target          127
● hibernate.target - Hibernate
     Loaded: loaded (/lib/systemd/system/hibernate.target; static; vend>
     Active: inactive (dead)
       Docs: man:systemd.special(7)
```

ちなみにハイバネートがサポートされているかは以下のファイルを参照すれば良いらしい。

```shell
cat /sys/power/state                            freeze mem disk
```
:::

---

## swapを増やしてみる。

まず，古いswapを削除した

```shell
sudo swapoff /swapfile # 古いswapファイルを無効化
sudo rm /swapfile
```

次に新しいswapを作成する。

```shell
sudo fallocate -l 6G /swapfile # swapファイルの作成
sudo chmod 600 /swapfile
sudo mkswap /swapfile # swapとして設定
sudo swapon /swapfile # swap領域としてマウント
free -h # 増加を確認
```
結構簡単にswap領域を増やすことができた。

---

## まとめ

- swapはメモリの補助として使う。
- swapはストレージを使うために読み書きはメモリより早くない。
- swapを増やすのはソフトウェア的な対応で実施できる。コマンド打つだけなので超簡単だしお金がかからない。

---

## 感想

今まで2GBのswap領域を使い切るようなことは特になかったですが，PCがカクつくことはあったのでswap領域の最大値を倍にしたことでシステムがswapをより使うようになり，動作が安定しないか期待しています。
後ほどわかりやすい変化があれば記事を更新します。
macOS Sequoia の .NET で HTTPS 開発者証明書エラーの回避策

macOS 15 Sequoia ではセキュリティ API に変更が加えられ、`dotnet` CLI で HTTPS 開発者証明書の生成と信頼ができなくなりました。

`dotnet dev-certs https` コマンドを実行すると、次のエラーメッセージが表示されます：

```
There was an error creating the HTTPS developer certificate.
```

詳細フラグ（`-v`）を付けて実行すると、より詳細なエラーが表示されます：

```
An error has occurred generating the certificate: Interop+AppleCrypto+AppleCommonCryptoCryptographicException: The specified item is no longer valid. It may have been deleted from the keychain.
```

## 影響

この問題により、macOS Sequoia 上の .NET 開発者が HTTPS 開発証明書を生成または信頼できなくなっています。これらの証明書がないと、HTTPS が必要な .NET アプリケーションの開発やデバッグができません。

# 回避策

[10月にリリース予定の修正がありますが](https://github.com/dotnet/runtime/issues/106775#issuecomment-2359877928)、以下の回避策（GitHub ユーザーの [pvasek](https://github.com/pvasek) さんと [kalebzettl](https://github.com/kalebzettl) さんに感謝）を今すぐ使用できます：

1. **念のため、現在存在する証明書を削除します。** ターミナルを開いて実行：`dotnet dev-certs https --clean`

2. **[.NET SDK パッケージ表](https://github.com/dotnet/sdk/blob/main/documentation/package-table.md) から "main" リリースの `tar.gz` ファイルをダウンロードします。** 以下のリンクから直接アクセスもできます。
   - [Apple Silicon](https://aka.ms/dotnet/9.0.1xx/daily/dotnet-sdk-osx-arm64.tar.gz)
   - [Intel](https://aka.ms/dotnet/9.0.1xx/daily/dotnet-sdk-osx-x64.tar.gz)

3. **ダウンロードしたファイルを解凍します。**

4. **解凍したフォルダから検疫属性を削除します。** ターミナルで実行：`xattr -d com.apple.quarantine -r <フォルダ名>` `<フォルダ名>` を解凍したフォルダの名前に置き換えてください。例：`xattr -d com.apple.quarantine -r dotnet-sdk-9.0.100-rc.2.24473.22-osx-arm64`

5. **解凍したフォルダに移動：** `cd dotnet-sdk-9.0.100-rc.2.24473.22-osx-arm64`

6. **このフォルダ内から、次のコマンドを実行して証明書を生成し信頼します。** `./dotnet dev-certs https --trust`

`dotnet` の前の `./` に注意してください。これにより、グローバルにインストールされたバージョンではなく、ダウンロードしたバージョンを使用します。

これで HTTPS 開発者証明書が正常に生成され信頼され、macOS Sequoia での .NET 開発を続けることができます。
[C#]Splitメソッドの戻り値(配列型)をリストに変換する

C#で、Splitメソッドを使うと、戻り値は配列（string[]）として返されますが、それをリスト（List<string>）に変換する方法はいくつかあります。

# 1. ToList メソッドを使う方法
最もシンプルな方法は、配列をリストに変換するために ToList メソッドを使うことです。

```cs
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string text = "apple,banana,cherry";
        string[] words = text.Split(',');
        
        // 配列をリストに変換
        List<string> wordList = words.ToList();
        // using System.Linq;を記載しない場合、以下のようにコーディングする必要あり
        //List<string> wordList = System.Linq.Enumerable.ToList(words);
        
        // 結果を表示
        foreach (var word in wordList)
        {
            Console.WriteLine(word);
        }
    }
}
```

特徴:
ToListメソッドは、配列を簡単にリストに変換できます。
メリット:
簡単: 1行でリストに変換できるのでコードがすっきりします。
デメリット:
ライブラリの追加: ToListメソッドを使うためには、System.Linqというライブラリをインポート（using System.Linq;）する必要があります。

# 2. コンストラクタを使う方法
リストには、配列をそのまま受け取ってリストを作るコンストラクタがあります。

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

class Program
{
    static void Main()
    {
        string text = "apple,banana,cherry";
        string[] words = text.Split(',');
        
        // コンストラクタを使って配列からリストを作成
        List<string> wordList = new List<string>(words);
        
        // 結果を表示
        foreach (var word in wordList)
        {
            Console.WriteLine(word);
        }
    }
}
```

特徴:
リストのコンストラクタに配列を渡すことでリストを作成します。
メリット:
追加のライブラリ不要: ToListメソッドを使わずに済むため、System.Linqをインポートする必要がありません。
デメリット:
少し長い: コンストラクタの使い方を理解するために少しコードが増える場合があります。

# 3. ループで手動でリストに追加する方法
配列の要素を1つずつループでリストに追加する方法です。

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

class Program
{
    static void Main()
    {
        string text = "apple,banana,cherry";
        string[] words = text.Split(',');
        
        // 空のリストを作成
        List<string> wordList = new List<string>();
        
        // 配列の各要素をリストに追加
        foreach (var word in words)
        {
            wordList.Add(word);
        }
        
        // 結果を表示
        foreach (var word in wordList)
        {
            Console.WriteLine(word);
        }
    }
}
```

特徴:
自分でリストを作り、配列の要素を1つずつリストに追加します。
メリット:
カスタマイズ性が高い: 追加する際に何か処理をしたい場合など、柔軟にコードを変更できます。
デメリット:
手間がかかる: 他の方法に比べて、少し長いコードが必要です。

# まとめ
ToList メソッド: 最も簡単でおすすめ。ただし、System.Linqを使う必要がある。
コンストラクタ: ライブラリ不要でスッキリしています。
ループで手動変換: 柔軟だが、他の方法に比べて手間がかかる。
初学者の場合は、ToListメソッドを使うのが一番簡単で扱いやすいのでおすすめです！

# 練習問題
[paizaレベルアップ問題集 【N 行 M 列のデータの入力】行ごとに要素数の異なる整数列の入力 (paizaランク D 相当)](https://paiza.jp/works/mondai/stdin_primer/stdin_primer__matrix_data_boss)
SwiftPMのプラグインを使ってSwiftLintを実行

## Xcodeの手順

- XcodeのSwiftPMからSwiftLintを追加

```sh
# 下記いずれか指定(READMEでは後者が推奨されている)
https://github.com/realm/SwiftLint
https://github.com/SimplyDanny/SwiftLintPlugins
```

>https://github.com/realm/SwiftLint
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198225/349448bd-1e39-47f2-9269-10cb2e1d0d44.png)

![image](https://i.imgur.com/1Z31els.png)

- `Add to Target`をNoneにしてAdd Package
- あくまでビルド時のツールとして利用するだけで、ビルドするバイナリには含めないため

![image](https://i.imgur.com/YYboC9v.png)

- `Run Build Tool Plug-ins`に追加

![image](https://i.imgur.com/uqdcMBv.png)

- `.xcodeproj`と同じ階層に`.swiftlint.yml`を配置

![image](https://i.imgur.com/esVQzX2.png)

- 以上でビルドを行ってwarningがでていればOK！

![image](https://i.imgur.com/FfCct2P.png)

## リモートのymlファイルは現状利用不可
- [Swift Package Manager Plugin SwiftLint Configuration Error: Unable to cache remote config \#4787](https://github.com/realm/SwiftLint/issues/4787)
    - 現状リモートに配置している`.swiftlint.yml`は利用できず、下記の設定はうまくいかない
    - [SwiftLint\-Config](https://github.com/pommdau/SwiftLint-Config?tab=readme-ov-file)
- Build Tool Pluginsの対応を待つ(これを自作すればいけるんでしょうか)

> I just ran into this issue again, and it looks like as of SwiftPM 5.9 a plugin can add a permission to allow network connections: https://developer.apple.com/documentation/packagedescription/pluginpermission/allownetworkconnections(scope:reason:)
> 
> This permission can only be added to Command Plugins. This issue is about Build Tool Plugins though.

## GitHub Actionsでの実行

- `<path-to-root>/.github/workflows/run-swiftlint.yml`を作成
- warningの場合も成功してしまうので、`swiftlint --strict`とオプションをつけている

```yml
name: SwiftLint

on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - main  # 実行したいブランチを指定

jobs:
  swiftlint:
    runs-on: macos-latest

    steps:
    - name: Check out the repository
      uses: actions/checkout@v3

    # Homebrewのキャッシュを利用
    - name: Cache Homebrew
      uses: actions/cache@v3
      with:
        path: /usr/local/Homebrew
        key: ${{ runner.os }}-brew-${{ hashFiles('**/Brewfile') }}
        restore-keys: |
          ${{ runner.os }}-brew-

    # SwiftLintのインストール
    - name: Install SwiftLint
      run: brew install swiftlint

    # SwiftLintを実行
    - name: Run SwiftLint
      run: swiftlint --strict
```
【react native × Crashlytics】CrashlyticsのログをIOS simulatorからうまく送信できなかった時にやったこと

# 前提とする環境
- react native 0.73.6
- expo 50
- firebaseを使用するためのセットアップが終わっていること

使用パッケージ
- @react-native-firebase/app 20.4.0
- @react-native-firebase/crashlytics 20.4.0

## 発生した問題
開発中のアプリでFirebase Crashlyticsにログが送られているかを確かめるため、ios simulatorでデバッグをしていたがいくらログを送信しようとしてもされなかった。

また、`crashlytics().crash()`を実行してもアプリがクラッシュしなかった。
Crashlyticsが有効化されているならクラッシュするはず。
 
よくみると以下のログがXCodeで出力されていた。

```
+[RNFBSharedUtils getConfigBooleanValue:key:defaultValue:] [Line 165] 
RNFBCrashlyticsInit crashlytics_debug_enabled final value: 0

+[RNFBCrashlyticsInitProvider isCrashlyticsCollectionEnabled] [Line 67] 
RNFBCrashlyticsInit isCrashlyticsCollectionEnabled after checking crashlytics_debug_enabled: 0
```

どちらも0となっていて、crashlyticsが有効化されていないことがわかる。
これをなんとか1(有効)に変えたいので、ググってでてきたそれっぽいのを片端から色々試してみた。

## 解決法
アプリのルートディレクトリに以下のファイルを作成、中身を記載
`firebase.json`
```json:firebase.json
{
  "react-native": {
    "crashlytics_debug_enabled": true
  }
}
```

この状態で`npx expo prebuild`後、`npx expo run:ios`実行。
XCodeでビルドして、以下のコードを実行させると、`Test error`の非重大ログ、クラッシュログが送信された。(アプリもしっかりとクラッシュした)

```ts
crashlytics().recordError(new Error('Test error'));
crashlytics().crash(); 
```

また、一部情報でXCodeを終了した状態でないとCrashlyticsにログが送信されないとあったが、今回においてはXCodeを終了せずともしっかり送信されていました。

## 今回試してみて意味がなかったこと
今回解決しなかっただけで、状況によっては解決につながる可能性があるため書いておきます。

- `GoogleService-Info.plist` に以下の記載
    
    ```tsx
    <key>FirebaseCrashlyticsCollectionEnabled</key>
    <true></true>
    ```
    

- XCode shemaに以下のフラグ記載
    
    ```tsx
    -FIRDebugEnabled
    ```
    

analyticsの場合だと、`-FIRAnalyticsDebugEnabled`を記載しないとダメだったがCrashlyticsの場合そうではないよう。

- Expoの`app.config.js`に以下の記載
    
    ```tsx
    {
      "expo": {
        "plugins": [
          [
            "@react-native-firebase/app",
            {
              "crashlytics_auto_collection_enabled": true ← これ
            }
          ],
        ]
      }
    }
    ```
    

- `crashlytics().setCrashlyticsCollectionEnabled(true)` の実行

- Podfileへの追記
    
    ```tsx
     pod 'Firebase/Crashlytics'
     pod 'Firebase/Analytics'
    ```
    
package.jsonに記載あれば多分いらない(Expoが処理してくれるため)



## 参考リンク
https://github.com/invertase/react-native-firebase/discussions/7459

↑解決に導いてくれた神issues

https://rnfirebase.io/crashlytics/usage

https://deku.posstree.com/react-native/firebase-crashlytics/

https://firebase.google.com/docs/crashlytics/test-implementation?authuser=0&platform=ios&hl=ja#swiftui

https://stackoverflow.com/questions/56421527/enabling-disabling-crashlytics-at-runtime-in-ios-app
【ServiceNow】Content Filtering機能について

# はじめに

みなさんこんにちは、三井情報株式会社です。
今回は、Flow Designerの「Content Filtering」について、概要と実装例をご紹介いたします。

# Content Filteringとは
ユーザのロールに基づいて、**ユーザがアクセスできるコンテンツを指定できる機能**のことです。

フィルタリングの対象リソースは以下の8項目です。
・フロー
・トリガー
・サブフロー
・フローロジック
・アクション
・ステップ
・UI要素とセクション
・変換関数

Content Filteringを設定するには以下を使用します。​
・Content Definitions： Flow Designerのリソースタイプを指定します
・Content Filtering Rules：コンテンツにアクセスするために必要なロールを指定します

Flow Designerには、いくつかのデフォルト定義とフィルタリングルールが含まれています。​
既存のルールを変更するか、独自のルールを作成して、Content Filteringを設定します。

# Content Filteringの実装例
## 概要
今回は、Workflow studioでフローを作成・編集する際、特定のロールを持つユーザのみがMicrosoft Teams Graph Actionを選択できるように設定を行います。
## 設定方法
1．フィルターナビゲーターから Process Automation > Flow Administration > Content Definitions を選択します。
2．デフォルト定義の「All Action Definitions」を選択します。
3．Conditions（”Application” “is not” “Microsoft Teams Graph Spoke”）を追加し、「Update」を押下します。
![2-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/c435f29c-55cc-c421-d51c-75bcf69ffbd2.jpeg)

4．Content Definitions一覧画面で「New」を押下し、独自のルールを作成します。
5．フィールドに必要事項を入力し、「Update」を押下します。
![2-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/646b3e38-2853-0003-45eb-7a2f7d274fa6.jpeg)

6．ユーザがアクセスできるリソースを指定するために、検証用ロール（content_filter_test）を作成します。
![2-7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/edd9eaf4-701c-8af1-fb00-9440d92e0458.jpeg)

7．フィルタリングの対象のリソースにアクセスできるユーザには、検証用ロール（content_filter_test）とflow_designerロールを割り当てます。
8．フィルタリングの対象のリソースにアクセスさせないユーザには、flow_designerロールのみを割り当てます。

:::note warn
ユーザに対しadminロールを付与してしまうと、フィルタリング対象リソースにアクセスできるようになってしまいます。
:::

9．フィルターナビゲーターから Process Automation > Flow Administration > Content Filtering Rules を選択し、「New」を押下します。
10．フィールドに必要事項を入力し、「Update」を押下します。
![2-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/517e42ba-67ac-b140-2156-30491d934e66.jpeg)

## 実装結果
・検証用ロール（content_filter_test）が割り当てられているユーザでは​、Flow編集時にMicrosoft Teams Graph Actionが表示されます。
![2-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/764b81a6-4162-75b7-20eb-208438a52e2d.jpeg)

・検証用ロール（content_filter_test）が割り当てられていないユーザでは​、Flow編集時にMicrosoft Teams Graph Actionが表示されません。
![2-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773072/7169a2c8-bbd2-523e-e7bb-dea93850c7ee.jpeg)

# 参考
本記事は、以下のドキュメントを参照しています。

https://docs.servicenow.com/ja-JP/bundle/washingtondc-build-workflows/page/administer/flow-designer/concept/content-filtering-flow-designer.html

https://docs.servicenow.com/ja-JP/bundle/washingtondc-build-workflows/page/administer/flow-designer/task/configure-content-filtering-rules.html

https://www.servicenow.com/community/workflow-automation-articles/securing-workflow-automation-products-part-2-designer-access/ta-p/2725019

# おわりに
本記事ではFlow Designerの「Content Filtering」についてご紹介させていただきました。
最後までお読みいただきありがとうございました。
URIとは？「URL」と「URI」の違い


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727869/15a06e36-607a-f08d-2d58-ca8dd4252c7e.png)

### URIは「Uniform Resource Identifier」の略で、Web上にあるあらゆるファイルを認識するための識別子の総称で、URNとURLで構成されています。

# URLとURIの違い①URLはWeb上での住所



# URLとURIの違い②URNはWeb上での名前

ただ、URNは一般ユーザーの目に触れることはほとんどありません。
とりあえず、URL＝Web上の住所、URN＝Web側で認識されている名前と覚える



:::note info
普段目にするURLは、正確には「URI」です。
:::
「http:(もしくはhttps:)」はURI側のパーツで、URLには含まれません。
なので、「 https://ferret-plus.com/ 」は、正確には「URI」と呼ばれます。
Webサイトについて思うこと

こんにちは。
今日はWebサイトについて思うことをつらつらと。
お気持ち表明みたいなものです。

## 凝った効果
これって何のためですか？
情報にアクセスしたいのに、情報にたどり着いたと思ったら、長ったらしいJavaScriptによる動き・・・
誰のためなのかわからないです。
Webエンジニアにとっては技術力を表すことができる絶好の機会かもしれない。
企業のHPならある程度の何かしらの指標を表しているのかもしれない。

でも、単純に調べたい人からすれば非常に煩わしいもので、「も～早く～」と焦らされている感覚です。
リーダー表示にしても見づらい、かといって5秒待つのも時間が無駄。
スクロールして今どの情報を見ているのか見当がつかないサイトだってあるので、業務改善やアクセシビリティーに携わっている身からすると悩ましい。

モバイルデータ通信料(ギガ)だって余分に消費する。

例えばAppleの製品紹介のページ。
iPhoneの前面→背面に切り替えるとき、何度もスクロールしてやっと背面が分かったと思えば画面上部で見切れていたり・・・
逆にスクロールしていてもページは止まったままサイト内のiPhoneがクルクル回る。
今では「そんなものだよね」と慣れているけど、やはりじれったい。
もったいないの一言に尽きる。
いいものを伝えるためにJavaScriptをふんだんに使わないと伝えられないのか？
高級感やブランドを表現するにはいい手段だろうが。

## それぞれのメリデメを総括
- デメリット
    - 動きの効果が大きすぎたり長すぎることによって、情報を得るために時間がかかる
    - 早く情報にたどり着くため、読みづらいリーダー表示に切り替えることも検討しなければならない
    - モバイルデータ通信料の肥大化
- メリット
    - 技術力が目に見えてわかる
    - 企業にとっては物差しにもなりうる
    - すごいとは思う(語彙力)

## まとめ
個人的には、JavaScriptの効果時間が0.5～1秒くらいなら許せる。
でも仕方ないよね！クライアントの意向だし！
じゃないよ、顧客満足はそこから始まるぞ。
そこも踏まえてコンサルやエンジニアは提案すべきでは？

というぼやきでした。
「Webサイトは動くな」ということではなくて、「Webサイトの本来の目的って何？」ということが言いたいのです。
動きはあってもいいけど、情報優先ではなくなっていて、「うちのサイトすごいだろ！」という品評会の時代だなと。
センシティブというか、あまり良いお話ではなかったかもしれませんが、ご容赦ください。
Software Design 2024年10月号に「Databricksとデータウェアハウス」を寄稿しました

2024/10/18に発行された[Software Design 2024年10月号](https://gihyo.jp/magazine/SD/archive/2024/202410)に、連載**Databricksで勝つデータ活用**の第7回として**Databricksとデータウェアハウス**を寄稿しました。

![IMG_0925.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b9f1c8ce-7e94-47ba-448b-767c923be7a2.jpeg)

雑誌に寄稿するのは生まれて初めてのことだったので、嬉しさのあまりポエム記事を書いてみます。

# 著者について

Databricksに入社して約4年になる50代のエンジニア。過去に[データブリックス クイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)を出版したり、[Apache Spark徹底入門](https://www.amazon.co.jp/dp/B0CVQ84T6J/)の翻訳に携わりましたが、雑誌に寄稿させていただくのは初めての体験です。長生きしてみるものです。

# きっかけ

同僚のエンジニアの方のお声がけで、すでに連載**Databricksで勝つデータ活用**がスタートしていましたが、当初は私は関与していませんでした。しかし、予定していた第6回まで進んだところ延長の打診があったとのことで、手を上げさせていただきました。

第6回まではデータエンジニアリングや機械学習、LLMなどのトピックをカバーしていたので、まだカバーしていなかったデータウェアハウスのトピックを書かせていただくことになりました。私の回はDatabricksにおけるデータウェアハウス、特にバックエンドにフォーカスしたものとし、次回の第7回ではダッシュボードなどフロントエンドにフォーカスした内容とすることになりました。

# 内容

以下の内容をカバーしています:

- Databricksとデータウェアハウスの関係は？(Databrickdでもデータウェアハウスのワークロードは普通に実行できます！)
- Databricksでデータウェアハウスの機能を担う[Databricks SQL](https://www.databricks.com/jp/product/databricks-sql)
- Databricks SQLが提供する様々なデータウェアハウス機能(主キー、地理空間情報、AI関数などなど)

書店に並んでいますので、是非お手に取ってみてください！102ページからです！
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/15127956-d713-6e22-0829-820dfcc59db1.png)


### はじめてのDatabricks

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

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
0から統計の勉強 条件付き確率とベイズの定理

# 学習サイト
統計web
- https://bellcurve.jp/statistics/course/

# 条件付き確率
- ある事象が起こるという条件のもとで、別のある事象が起こる確率のこと
- 事象Bが起こるという条件のもとで事象Aが起こる場合、この条件付き確率はP(A|B)と表され、次の式のより計算できる

```math
P(A|B) = \frac{P(A \cap B)}{P(B)}
```

例1：次の図の袋の中には、赤い玉が3つ、白い玉が3つ入っている。赤い玉のうち2つには「1」、残りの1つには「2」と書かれている。一方、白い玉のうち2つには「2」、残りの1つには「1」と書かれている。この袋の中から玉を1つ取り出す時、「1」と書かれた赤色の玉が取り出される確率はいくらか。

```math
6個の玉の中に「1」と書かれた赤色の玉は2個あるので、\frac{2}{6}=\frac{1}{3}となる
```

例2：例1と同じ袋の中から玉を1つ取り出した時、その玉は赤色だった。この赤い玉に「1」と書かれている確率はいくらか。

```math
\displaylines{
例1と同じように「玉は全部で6個あり、赤い玉で「１」と書かれた玉は2個あるから、\frac{2}{6}=\frac{1}{3}となると考えてはいけない。\\
今回は、すでに玉の色は赤色とわかっていることを考慮すう必要がある。\\
条件付き確率の式に当てはめて計算する。\\
・P(赤玉である) = \frac{3}{6}=\frac{1}{2} \\
・p(1と書いてある \cap 赤玉である) = \frac{2}{6}=\frac{1}{3} \\
したがって、求める確率は、\\
\frac{\frac{2}{6}}{\frac{1}{2}} = \frac{2}{3} \\
この結果から、3個の赤玉のうち1と書かれた玉は2個あるので、1が取り出される確率は\frac{2}{3}であることを意味する。
}
```

# 乗法定理
事象Bが起こるという条件のもとで事象Aが起こる条件付き確率P(A|B)は以下の式から求められることは上記で説明した通りである。


```math
P(A|B) = \frac{P(A \cap B)}{P(B)}
```

この条件付き確率の式の蝋編にP(B)をかけて変形した以下の式が<font color="Red">**乗法定理**</font>という。

```math
P(A \cap B) = P(B) \times P(A|B)
```

もしくは、AとBを入れ替えて次のように書くこともできる。

```math
P(A \cap B) = P(A) \times P(B|A)
```

例：4本の当たりを含んだ10本のくじがある。この中から太郎さんがくじを1本引き、そのくじを戻さずに花子さんがくじを引くとき、太郎さんも花子さんも当たりくじを引く確率はいくらか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1906633/4ccb4426-5799-e44a-cd69-463704fa2aea.png)

太郎さんの結果によって、花子さんの当たりくじをひく確率は変化するため、2つの事象は独立ではない。こういった時に乗法定理を用いる。

太郎さんが当たりくじを引く確率をP(A)、花子さんが当たりくじを引く確率をP(B)とする。

```math
\displaylines{
・太郎さんが当たりくじを引く確率P(A)=\frac{4}{10} \\
・太郎さんが当たりくじを引いた後で、それを戻さずに花子さんが当たりくじを引く確率P(B)=\frac{3}{9}
}
```

となることから、両者が当たりを引く確率は乗法定理を用いて次のようになる。

```math
P(A \cap B) = P(A) \times P(B|A) = \frac{4}{10} \times \frac{3}{9} = \frac{2}{15}
}
```

# ベイズの定理
- 結果からどういう原因か推定する際に用いる

```math
\displaylines{
事象Aが起こるという条件のもとで、k種類の事象B(B_1, B_2,・・・,B_k:ただしこれらは互いに排反とする)が起こるとする。\\
この時事象Aが起こるという条件のもとで事象B_iが起こる条件付き確率P(B_i|A)は次の式から求められる。\\
P(B_i|A) = \frac{P(A \cap B_i)}{P(A)}・・・① \\
ここで乗法定理P(A \cap B_i)=P(B_i) \times P(A|B_i)を①に代入する。\\
これがベイズの定理である。\\
P(B_i|A) = \frac{P(A \cap B_i)}{P(A)} = \frac{P(B_iP(A|B_i)}{P(A)}・・・② \\
P(A)は、P(A)=P(A \cap B_1)+P(A \cap B_2)+・・・+P(A \cap B_k)とかける。これは、以下の図のそれぞれの事象B_1, B_2,・・・,B_kにおける赤い事象Ano部分を足し合わせたものだと考えられる。
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1906633/d8d83afa-f058-383b-232c-8789a3381c61.png)

```math
\displaylines{
この式を②に代入する。\\
p(B_i|A) = \frac{(A \cap B_i)}{P(A)} = \frac{P(B_i)P(A|B_i)}{P(A \cap B_1)+P(A \cap B_2)+・・・P(A \cap B_k)}・・・③ \\
③にも乗法定理P(A \cap B_i) = P(B_i) \times P(A|B_i)を適用すると、次の式が導かれる。\\
P(B_i|A) \\
= \frac{P(B_i)P(A|B_i)}{P(A \cap B_1)+P(A \cap B_2)+・・・+P(A \cap B_k)+} \\
= \frac{P(B_i)P(A|B_i)}{\sum_{j=1}^kP(B_j)P(A|B_j)}
}
```
React(next.js)とかで開発してる時に深い階層のObjectデータをデバッグ用に吐き出すならconsole.log()ではなく、console.dir()

なんてことはない話なのかもしれないですが…こんな書き方知らなかったよ！ということで。
普通にフロントエンドのjavascriptならconsole.log()でいいんですよ。
ただ、reactなどのバックエンドjavascriptでは普通にconsole.log()を使うと多段の階層では表示されない問題が起きます。

結論で言うとこのように書けばOK。

```javascript
console.dir(targetVariable, {depth: null})
```

どうやら、`console.log("%o",targetVariable)` も行けたらしいんですが、第4階層までだったので、これじゃないと無理かなと。


### 参考にした記事とか
https://zenn.dev/kazuph/articles/dc323eca77398d

https://qiita.com/tsukasaI/items/dacc930125d7bd19845a
フロントエンド開発を効率化するツール：v0.dev

フロントエンド開発の効率を大幅に向上できるツールを最近発見しました。"v0.dev"と呼ばれるこのツールは、Cursorと組み合わせることで、開発プロセスを高速化できます。

v0.devの主な特徴は、高品質なUIを生成できることと、リアルタイムでプレビューを確認しながら調整できることです。例えば、ユーザーログイン画面の作成を依頼すると、Reactを使用した洗練されたUI画面を数秒で生成してくれます。⇩

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/97d25e42-2ccf-474b-5a74-e2fb02f7ed52.png)

さらに、生成された結果に追加要求を出すこともできます。例えば、"xxyc"というロゴの追加や背景画像の設定を指示すると、以下のような修正後UIが得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/ec7e9248-6a6a-8ad8-fcc3-d7bfd33768ab.png)

私の活用方法としては、CursorのComposerと組み合わせてv0.devを利用しています。具体的には、Cursorにv0.devのアドレスを指定し、必要なフロントエンドコードをv0.devで生成させ、それを現在開いているプロジェクトに統合しています。プロンプトの例は以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556459/794c6c71-d930-6654-e475-a4f6bd6bcc44.png)


興味ある方：

https://v0.dev/chat
スレッド処理

## スレッド処理
th1とth2のスレッドを作成し、実行する。
コンパイルの時に`-pthread`を付けて実行すること。
```c++
#include <stdio.h>
#include <iostream>
#include <thread>

void ThreadFunc(int num) {
  std::cout << "ThreadFunc " << num << std::endl;
}

int main() {
  std::thread th1(ThreadFunc, 1);
  
  auto func = [](std::string msg) {
    std::cout << "thread message : " << msg << std::endl;
  };

  std::thread th2(func, "Hello, World!");
  std::cout << "th2 id : " << th2.get_id() << std::endl;

  th1.join();
  th2.join();

  return 0;
}
```
実行結果
```
th2 id : 140081530832448
thread message : Hellow, World!
ThreadFunc 1
```

## 備忘録
`-pthread`でコメント来ていたので、備忘録
昔のことを忘れず、発生した時のために対応するメモ書き
現場によっては環境が古いなんてざらにある

https://qiita.com/yoh2/items/97821d3d1dbe3e024d4f
AWS CloudFormation の Mappings を活用してマルチリージョン展開について

AWS 環境でインフラストラクチャをコードとして管理する際、AWS CloudFormation は強力なツールです。
しかし、マルチリージョン展開を行う場合、特に AMI（Amazon Machine Image） などのリージョン固有のリソースを扱うときには注意が必要です。
CloudFormation の Mappings セクションを活用して、リージョン間で異なるリソースを動的に参照し、テンプレートの再利用性を高める方法について

### なぜ Mappings が必要なのか？

- AMI はリージョンごとに異なる
    AMI は EC2 インスタンスの OS やアプリケーション設定を含むイメージです。
    しかし、AMI はリージョンごとに異なる ID を持ちます。
    同じイメージでも、リージョンが異なれば AMI ID も異なります。

- 問題点
     テンプレート内で AMI ID をハードコードすると、そのテンプレートは
     特定のリージョンでしか動作しません。
    他のリージョンでスタックを作成しようとすると
    AMI ID が存在しないためエラーになります。

### Mappings セクションで解決する

- Mappings の基本
    Mappings セクションは、CloudFormation テンプレート内で固定のキーと値のペアを定義するためのセクションです。
    条件によって異なる値を取得する際に便利です。

- AWS::Region 疑似パラメータ
    AWS::Region は、テンプレートが実行されているリージョン名を自動的に取得するための疑似パラメータです。
    これを使用することで、テンプレートをリージョンに依存しない形で記述できます。

### 実装手順

### Mappings セクションを定義する

まず、テンプレート内で各リージョンに対応する AMI ID を定義します。

```
Mappings:
  RegionMap:
    us-east-1:
      AMI: ami-0abcdef1234567890
    us-west-1:
      AMI: ami-0fedcba0987654321
    ap-northeast-1:
      AMI: ami-0123456789abcdef0
    # 他のリージョンも同様に追加
```
	•	RegionMap：マッピングの名前
	•	us-east-1：リージョン名
	•	AMI：キーとなる属性名
	•	ami-xxxxxxxx：そのリージョンでの AMI ID

 ### リソース定義でマッピングを参照する

 次に、EC2 インスタンスなどのリソース定義で、AMI ID を直接指定するのではなく、Mappings から取得します。

 ```
 Resources:
  MyEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !FindInMap
        - RegionMap           # マッピング名
        - !Ref 'AWS::Region'  # 現在のリージョン名を取得
        - AMI                 # 取得したいキー名
      InstanceType: t2.micro
      # 他のプロパティ
 ```

 	•	!FindInMap [マッピング名, キー, サブキー]：Mappings から値を取得する関数
	•	!Ref 'AWS::Region'：現在のリージョン名を取得


### 動的な AMI ID の取得
上記の設定により、テンプレートがどのリージョンで実行されても、対応する AMI ID が自動的に選択されます。

### 補足：他のリソースでも活用可能
Mappings は AMI ID 以外にも、リージョンや環境ごとに異なる値を動的に設定する際に活用できます。

例：リージョンごとの S3 バケット名

 ``` 
Mappings:
  RegionBucketMap:
    us-east-1:
      BucketName: my-bucket-us-east
    us-west-1:
      BucketName: my-bucket-us-west
    ap-northeast-1:
      BucketName: my-bucket-ap-northeast
 ```

リソース定義で参照
  ``` 
 Resources:
  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: !FindInMap
        - RegionBucketMap
        - !Ref 'AWS::Region'
        - BucketName
 ```
SPA  MPA

### SPA: シングル（単一）ページアプリ
- 特徴: 1ページのみで、クリック時にページ全体を更新するのではなく、一部の内容だけを更新します。
- 長所: 速くて滑らかです。
- 短所: 初回の読み込みが遅く、SEOがあまり良くありません。

### MPA: マルチ（複数）ページアプリケーション
- 特徴: また、リンクをクリックすると新しいページがロードされます。
- 利点: 各ページが独立しており、フレンドリーなSEOです。
- 短所: ページの切り替えでリフレッシュが遅くなります。
ULIDを使ってユニークなIDを生成する


## 1. ULIDとは？

ULID（Universally Unique Lexicographically Sortable Identifier）は、タイムスタンプに基づきながらもランダム性を持った一意の識別子です。UUIDに似ていますが、ULIDはタイムスタンプ順にソートが可能で、可読性も高く、生成が効率的です。これにより、大量のデータを扱う場合でも、簡単に時系列で並べ替えることができます。

### 特徴：
- **一意性**: ULIDはグローバルにユニークです。
- **タイムスタンプ**: 生成時のタイムスタンプが埋め込まれ、時系列で並びやすい。
- **ランダム性**: 後半はランダムなデータで構成され、衝突のリスクが極めて低い。

## 2. ULIDをPythonで使う方法

### 必要なライブラリのインストール

まずは、Colab上でULIDを生成するためのライブラリをインストールします。

```python
!pip install ulid-py
```

### 3. ULIDの基本的な使い方

ULIDの生成は非常にシンプルです。以下のコードでは、現在のタイムスタンプを元にULIDを生成しています。

```python
import ulid
# ULIDを生成
new_ulid = ulid.new()
print(f"生成されたULID: {new_ulid}")
```
![スクリーンショット 2024-09-25 10.21.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/327d4f11-f044-cca4-f275-d6401cc967cb.png)


### 4. サンプルデータの生成

次に、ULIDをキーとするサンプルデータを作成してみます。例えば、ユーザーIDと注文情報を持つデータを生成します。

```python
import random
import pandas as pd

# サンプルユーザー名と商品リスト
usernames = ['Alice', 'Bob', 'Charlie', 'Diana', 'Edward']
products = ['Laptop', 'Headphones', 'Keyboard', 'Mouse', 'Monitor']

# サンプルデータの生成
def create_sample_data(n=10):
    data = []
    for _ in range(n):
        user = random.choice(usernames)
        product = random.choice(products)
        amount = random.randint(1, 5)  # 商品の個数
        price = random.randint(100, 1000)  # 価格
        ulid_key = ulid.new()  # ULIDの生成
        data.append({'ULID': ulid_key, 'User': user, 'Product': product, 'Amount': amount, 'Price': price})
    return pd.DataFrame(data)

# データ生成
sample_df = create_sample_data(10)
sample_df
```
![スクリーンショット 2024-09-25 10.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/ccbbb2c7-bda1-f269-a253-b880b2bf65b3.png)

### 5. ULIDを使ったソート

ULIDは時系列でソート可能です。例えば、上記で生成したデータをULID順に並び替えることができます。

```python
# ULID列でソート
sorted_df = sample_df.sort_values(by='ULID')
sorted_df
```
![スクリーンショット 2024-09-25 13.24.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/47c710ca-a5ae-d25e-5a35-d45642369aba.png)


## 6. まとめ

ULIDは、タイムスタンプに基づく一意の識別子を簡単に生成し、効率的にデータを管理・ソートするための強力なツールです。Colabを使用して簡単に生成・操作できるため、データ処理やログ管理、IDの管理に非常に役立ちます。
アンドロイドアプリを作ってみるその①

プログラミング自体は長くやってきたが、ゲームを作ることと実務についてからはWeb開発しか行っていなかったため、スキルアップのためにアンドロイドアプリを開発することにした。
まず、アプリを開発するためには何をすればいいかを考えた。もちろん技術面は必要にはなるが、それよりはアイデアが必要だろうということで、初週はアイデアを固めつつ、アプリ開発のいろはを学んでいくことにした。

## アプリ開発の勉強
家にある環境はChromebookのみなので、せいぜいAndroidアプリの開発しかできない。そのため、flutter開発よりも、より特化したkotlinの勉強を始めた。Javaは開発できる程度には触っていたので構造自体はまあなんとなく理解できたかなぁと思う。チュートリアルともいえるHello worldまではできた状態。ここで家に帰ってChoromebookを開いてみると、思っているよりも経年劣化と元のスペックが低かったようで、Android Studioを開くと落ちるという事態が発生したため、PCを新たに購入しなければならなくなった。ここ数年研究室から貸与されているものを用いて開発していたので盲点だった。そのため、PCを購入するまでは基礎の座学とアイデア出しで時間を使っていくことになる。

## アイデア出し
そもそも何のアプリを開発するか。趣味に近く自らが使うモチベーションの湧くものが良いだろうということで、趣味であるカードゲームのカードやデッキ管理のアプリを作成することにした。ぱっと思いついた機能をメモにまとめたうえで、周りの友人にどのような機能があるといいかというのを訊ね、以下のように分類。
絶対に作るべき機能
固有性を見出せそうな機能
後々でいいよねって機能
その中で今の技術でできそうなものを別にリストアップし、できないものは何を習得もしくは何ができる人を味方につければよいかということを把握した。
ここまで終え、続いて大まかなUIを考える。紙に各ページの構造、やりたいことを記述し、クリアファイルに詰めた。UI案まで作るとPCがない中でできることもないので、初週の作業はおしまい。

## 初週のまとめ
今まで学校からの機材で勝手に自由な開発していたことはなかなか恵まれていたことなんだと実感した。ちゃんと自宅での開発環境はこだわろうとおもったが、お金があるわけではないため、お金を稼げる手段を得るためにお金が必要な現代社会の仕組みを恨んでいる。まずは手元のお金になりそうなものを売るところから始めようと思う。

今週参考にしたサイト
https://developer.android.com/codelabs/basic-android-kotlin-compose-first-app?hl=ja#0
https://developer.android.com/codelabs/basic-android-kotlin-compose-text-composables?au[…]2Fcodelabs%2Fbasic-android-kotlin-compose-text-composables
抵抗あるだろうなRDB設計シリーズ・歴の扱い

# 歴とは
- 様々な理由からレコードの履歴を残しておく仕様

----
# 素朴な実装
- 歴番号を持たせる
- 歴番号はPKの一部にする

よく見かけるが様々な問題点がある

----
# 素朴な実装の問題点
- 最新レコードの取得にサブクエリが必要になる(最大歴番号を探す必要がある)
- INSERT時にもサブクエリが必要になる(最大歴番号+1)
- JOINキーが常に複数

とにかくSQLが面倒になるし、サブクエリは実行速度の面でも不利

----
# 代替案１：歴番号を逆順で持つ
- 最新が 0 になるようにする
- INSERTするときは、既存レコードの暦番号を+1でUPDATEしてから、最新レコードの暦番号を0でINSERT
- 利点：INSERTはやや手間がかかるが、SELECTがめちゃくちゃシンプルになる
- 問題点：歴番号をPKに含んでいる場合、PK値が変わってしまう
  → 対策：サロゲートキー(代替PK)の導入

----
# 代替案２：最新フラグ
- 歴番号に加えて最新レコードフラグを持ち、最新のものをtrueとする
- INSERTするときは、既存レコードのフラグをfalseにUPDATEしてから、最新レコードをINSERT
- 利点：INSERTは手間がかかるが、SELECTがめちゃくちゃシンプルになる
- 問題点：INSERT時に最大歴番号を取得する手間が解消されない

----
# 代替案３：歴テーブルの導入
- メインのテーブルには最新のレコードしか格納しない（歴番号は不要）
- 新しいレコードにUPDATEするときに、別テーブルに現在のレコードをコピーする
- 利点１：SELECTがこの上なくシンプルでミスが起こり得ない
  利点２：レコード数が最小
- 問題点：・・・テーブルが増える、くらいか？

考え方は論理削除にも適用可能！

----
# 最後に
- テーブルを再設計できる機会は少ないと思いますが、問題点を認識しておくのは大事
- 改善の機会が訪れたときに備えて、良い設計を勉強しておきましょう
- RDBの設計パターンってほんっと面白いですよ！
#65　Pythonで辞書型のリストをCSVファイルに出力してみた

## はじめに
今回は、Pythonのcsvモジュールを使用し、辞書型のリストのデータをCSVファイルとして出力させてみました。
CSVでのデータ出力はよく使われると思いますので、よかったら参考にしてみてください。

## コード
```python
# csvモジュールをインポート
import csv

# 辞書型のデータ
data = [
    {'Name': 'Ａさん', 'Age': 25, 'City': '札幌'},
    {'Name': 'Ｂさん', 'Age': 30, 'City': '小樽'},
    {'Name': 'Ｃさん', 'Age': 35, 'City': '函館'}
]

# CSVファイルの作成先のパス（環境に合わせて好きなパスを指定してください）
csv_file_path = r'C:\Users\{ユーザー名}\Desktop\テスト用フォルダ\data.csv'

# CSVファイルを書き込みモードで開く
with open(csv_file_path, 'w') as csvfile:
    # ヘッダ（列の名前）行を定義
    fieldnames = ['Name', 'Age', 'City']

    # DictWriterオブジェクトを作成
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    # ヘッダ行を書き込む
    writer.writeheader()

    # 各行のデータを書き込む
    for row in data:
        writer.writerow(row)
```

## コードの内容

### csvモジュール
CSVファイルの読み書きを行うための機能を提供してくれます。
参照：https://docs.python.org/ja/3/library/csv.html
今回はcsvモジュールの DictWriter を使用します。

### 詳細
```
# 辞書型のデータ
data = [
    {'Name': 'Ａさん', 'Age': 25, 'City': '札幌'},
    {'Name': 'Ｂさん', 'Age': 30, 'City': '小樽'},
    {'Name': 'Ｃさん', 'Age': 35, 'City': '函館'}
]
```
CSVに書き込みたいデータを辞書型のリストで定義します。
辞書型は　{'キー名': '値'}　の形で表記します。
各辞書は1行のデータを表し、'キー名'でヘッダ名を指定し'値'は列のデータとしてCSVに書き込まれます。
複数の辞書型のデータを扱うため、[]で囲いリスト化しています。
```
csv_file_path = r'C:\Users\{ユーザー名}\Desktop\テスト用フォルダ\data.csv'
```
CSVファイルの保存先のパスを定義します。
raw 文字列、`r`を使うと、バックスラッシュをエスケープ文字として解釈しないようになります。
参照：https://www.javadrive.jp/python/string/index4.html
```
with open(csv_file_path, 'w') as csvfile:
```
CSVファイルを書き込みモード`w`で開きます。
 `with` 構文を使うことで、ブロック内の処理が終了したら自動的にファイルを閉じてくれます。
```
fieldnames = ['Name', 'Age', 'City']
```
CSVファイルのヘッダをリストで定義します。
```
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
```
`csv.DictWriter` オブジェクトを作成し、CSVファイルへの書き込みを行う準備をします。
` fieldnames` パラメータで定義した順番でCSVファイルに書き込みを行います。
```
writer.writeheader()
```
CSVファイルの先頭にヘッダ行を書き込みます。
```
for row in data:
```
`data` リストから辞書を1つずつ取り出し、辞書の数だけループします。
```
writer.writerow(row)
```
取り出した辞書のデータをCSVファイルに書き込みます。

## 実行結果
指定したパスに `data.csv` という名前のCSVファイルが生成されます。
中身を開くと`data` で定義した内容が表示されています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843084/d226692d-0e91-5e06-d207-516f4cc77b2d.png)


## 最後に
今後もPythonの機能をいろいろ触っていけたらと思います。
ご覧いただきありがとうございました。
SOA-C02対策(モニタリング系)

# AWSモニタリング/監視サービス
* **Amazon Cloud Watch**
* **AWS Cloud Trail**
* **AWS Config**
* **AWS Personal Health Dashbord**

以下、詳細説明

## Amazon Cloud Watch
メトリクス、ログ、イベントの監視、収集する

### メトリクス
* **標準メトリクス**：CPU使用率やディスクI/Oなど
* **カスタムメトリクス**：アプリケーションごとのメモリ使用率やOS内部で取得する必要があるもの。カスタムメトリクスにはCloudWatchエージェントの導入が必要

#### Cloud Watchのアラーム設定
* **統計**：メトリクスを指定の期間で集計した値。平均/最大/合計/90%タイルなどから選択
* **期間**：統計を取得する時間のながさ。
* **アラームを実行するデータポイント**：アラーム実行のための閾値超過数。EX）「5/5」とした場合は5回連続して閾値が超過するとアラームが実行する

#### アラームステータス
* **OK** :定義した閾値を下回っている
* **ALARM**：定義した閾値を超えている
* **INSUFFICIENT_DATA**：アラーム開始直後であるが、メトリクスが利用できないかデータが不足している状態

### ログの監視
**CloudWatch Logsの利用**：Amazon API Gateway、AWS Lamdaなどのマネージドサービスは標準でCloud Watch Logsへログ収集機能がある。EC2ではCloud Watchエージェントの導入が必要。

* メトリクスフィルター：ログのパターンマッチングをおこなう。
EX） アプリケーションログに「ERROR」もしくは「WARN」が発生したとき(OR条件)
EX）アクセスログの応答時間が5000ms以上のとき(数値比較)
EX）アクセスログに記載されたステータスコードが404かつリクエストが「*.html」のとき(AND条件、ワイルドカード条件)

### イベントの監視
**Cloud Watch Events**：AWSリソースの変更を伴うシステムイベントをトリガーとして、対応したAWSサービスによるアクションの実行を自動するする。トリガーは以下の２つ
* **時間ベースのイベント**：毎朝08:00に前日の業務レポートを作成しメールをおこなうAWS Batchジョブの実行
* **システムイベントの例**：EC2インスタンスが起動されるたびにセキュリティグループのルールを確認し、0.0.0.0/0のインバウンド通信が許可されていた場合はEC2インスタンスを終了するLamda関数を実行する。


## AWS Cloud Trail
AWS Cloud TrailはAWSのAPI利用状況に関するログを記録することができる。
具体的には以下の状況に対して有用
* 特定インスタンスをシャットダウンしたユーザの特定
* セキュリティグループの設定を変更したユーザ特定
* 社外のIPアドレスかあら受信したAPI利用の有無を調べる
* アクセス権がないために拒否されたAPIリクエストの詳細を調べる　など

収集したログは「証跡(Trail)」として、**イベント履歴**機能により証跡の検索や表示が可能。S3やCloud Watch LogsやCloud Watch Eventに吐き出して一元管理や監視も可能。

## AWS Config
AWS Configはリソースの設定を記録して評価するサービス。CloudTrailで設定変更の履歴を確認できるが、大量のログの中から設定変更の証跡を分析する必要がある。
一方、Configの場合は設定変更に特化したサービスで時系列に変更点を確認できるためトラブルシュートやセキュリティ調査の際に役に立つ。また、変更の通知をトリガーにSNSに通知したりできる。

リソースの評価は**AWS Configルール**を設定して適切な設定内容の定義をおこなう必要がある。ルールは事前に設定された**マネージドルール**と独自の設定をおこなう**カスタムルール**がある。
また評価のタイミングは２つある
* **設定変更**：ルールの範囲に該当するリソースで設定が変更されると評価がトリガーされる
* **定期内**：指定した時間間隔で評価する

ちな、マネージドルールは公式ドキュメントあるので別途参照する。
カスタムルールはLamda関数にコードを記述して実装する。

Configルールに準拠しないリソースがあった場合は**修復アクション**を実行することで修復可能。**AWS System Manager Automation**で自動サービスに事前定義された運用タスクを実行可能。

## AWS Personal Health Dashboard
AWS利用者の環境に影響するAWSイベントの通知やメンテナンスへの対処方法が表示される。
具体的なユースケースを勉強したほうがいいかも。
配列による配列の並び替え

```ts
// 並び替えの基準となる配列
const baseArray: string[] = ["apple", "banana", "cherry", "date"];

// 並び替えたい配列 (基準配列より要素数が少ない)
const targetArray: string[] = ["cherry", "apple"];

// baseArrayの順にtargetArrayを並び替える
const sortedArray = targetArray
  .filter(item => baseArray.includes(item)) // baseArrayに存在しない要素を除外
  .sort((a, b) => baseArray.indexOf(a) - baseArray.indexOf(b)); // baseArrayの順に並び替え

console.log(sortedArray);
```
配列による配列ソート

```ts
// 並び替えの基準となる配列
const baseArray: string[] = ["apple", "banana", "cherry"];

// 並び替えたい配列
const targetArray: string[] = ["cherry", "apple", "banana"];

// baseArrayの順にtargetArrayを並び替える
const sortedArray = targetArray.sort((a, b) => baseArray.indexOf(a) - baseArray.indexOf(b));

console.log(sortedArray);
```
jetbrains ToolBoxを使ったAndroid Studioの導入方法メモ

jetbrains ToolBoxが、Android Studioの更新とかを手軽にすることが出来て便利だと知ったので、導入方法のサイトをメモ(   ･ω･)φ…

## ToolBoxのインストール

https://www.jetbrains.com/ja-jp/toolbox-app/

## Android Studioを入れる
（Android Studioだけが必要なら、サイトに書かれている「IntelliJ IDEA Community Edition」の導入は飛ばしてok）

https://qiita.com/TAKANEKOMACHI/items/5be6c9e7c3aa74270456

## Android Studioの日本語化

https://murui-no-neko-zuki.techblog.jp/archives/18369397.html