OmniAICreator/Qiita-1.07M huggingface dataset:
長い処理を外部から都合のいいタイミングで停止するメモ

# 外部から処理を止めたかった

とある、長い処理を行っていたのだが途中で止めたい事が発生しました。
問題は、処理の途中で止まると都合が悪い作りになっていました。
その為、停止タイミングをプロセス側で都合の良い時に停止できる仕組みを実装した時のメモとなります。

```test.py
import time
from task import Task

def is_some_conditions(c):
    """何かの継続条件を判定"""
    return c < 10

count = 0
with Task() as t:
    while t.is_doing() and is_some_conditions(count):
        # 長い処理A
        print(f"\r{count} - doing A ", end='')
        time.sleep(3)
        # 長い処理B
        print(f"\r{count} - doing B ", end='')
        time.sleep(3)
        print(f"\r{count} - finished ", end='')
        count += 1
    print(f"\nexit")

```
このコードは、処理Aと処理Bがセットで実行される事を想定している作りだと思ってください。
ここで問題になるのは、処理Aと処理Bの間で停止が発生すると困る場合です。

シグナル版は、停止シグナル(CTRL+C等)を受けるか終了条件を満たすと終了します。
ファイル版は、.task_doingファイルが削除されるか終了条件を満たすと終了します。
※シグナルを受けると停止するので注意してください。
withブロックを抜けると、通常通りの処理に戻ります。

## シグナル版

```task.py
import signal

class Task:
    """停止系シグナルを切りが良いところまで遅延させるクラス"""
    def __init__(self):
        self._is_doing = True
        self.original_handlers = {}
        self.stop_signals = [signal.SIGINT, signal.SIGTERM]

    def _handler(self, signum, frame):
        self._is_doing = False

    def __enter__(self):
        # 現在のハンドラーを保存し、カスタムハンドラーを設定
        for sig in self.stop_signals:
            self.original_handlers[sig] = signal.getsignal(sig)
            signal.signal(sig, self._handler)
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        # 元のハンドラーに戻す
        for sig in self.stop_signals:
            signal.signal(sig, self.original_handlers[sig])

    def is_doing(self):
        """タスクの実行中かどうか"""
        return self._is_doing

    def is_stopped(self):
        """タスクが停止された"""
        return not self._is_doing
    
    def end(self):
        """タスクを終了する"""
        self._is_doing = False
```


## ファイル版
```task.py
import os
from pathlib import Path

class Task:
    TASK_FILENAME = '.task_doing'

    def __init__(self):
        self.task_file = Path(self.TASK_FILENAME)

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.end()

    def start(self):
        """タスクを開始する"""
        if self.task_file.exists():
            raise FileExistsError("既にタスクを実行中です")
        # タスク管理用のファイルを作成(空ファイルを作成)
        self.task_file.touch()

    def is_doing(self):
        """タスクの実行中かどうか"""
        return self.task_file.exists()

    def is_stopped(self):
        """タスクが停止された"""
        return not self.is_doing()

    def end(self):
        """タスクを終了する"""
        if self.task_file.exists():
            self.task_file.unlink()
```
【Azure】Bicep を利用して マネージドID に CosmosDB ロールを付与する

# はじめに
個人開発で ユーザー割り当てマネージドID に、CosmosDB へのアクセス権を付与してアクセスしようとしました。
権限付与も含めて Bicep で自動化していたのですが、少しつまづいたので記録。

# Cosmos DB 固有のロールが必要
マネージドID 認証で CosmosDB の操作を行う場合、「Cosmos DB 固有のロール」を付与する必要があります。
最初、共同作成者ロールを付与してアプリを動かした際に、権限不足のエラーが出て怒られました。
Azure のロールには、下記の2種類があるみたいです。（正直十分に理解できていませんが...）

- コントロールプレーンのロール
    - Azure ロールベースのアクセス制御 (Azure RBAC)
    - Azure Portal の IAM から設定できるやつ
- データプレーンのロール
    - リソース固有のロール定義
    - Azure Portal の IAM から設定できない？

[組み込みのロールの定義](https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-setup-rbac#built-in-role-definitions) に下記のように記載されています。
> 重要
ここでのロール定義という用語は、Azure Cosmos DB 固有のロール定義を指します。 これらは、Azure ロールベースのアクセス制御ロール定義とは異なります。

組込みロールは下記の2種類が用意されています。
今回はデータベースの書き込み操作を行う必要があるため、「Cosmos DB 組み込みデータ共同作成者」を付与しました。

| ID | 名前 | 含まれるアクション |
|:-----------|:------------|:------------|
| 00000000-0000-0000-0000-000000000001 | Cosmos DB 組み込みデータ リーダー | Microsoft.DocumentDB/databaseAccounts/readMetadata <br> Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/read <br> Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/executeQuery <bar> Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/readChangeFeed |
| 00000000-0000-0000-0000-000000000002 | Cosmos DB 組み込みデータ共同作成者 | Microsoft.DocumentDB/databaseAccounts/readMetadata <br> Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/* <br> Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/* |

# ロールの割り当て
ロールの割り当て方法いくつかありますが、今回はBicepを利用します。
下記のように記述してみました。

```bicep:main.bicep
param location string
param databaseAccountName string
@description('マネージドID のオブジェクト(プリンシパル)ID')
param principalId string
param roleDefinitionId string = '00000000-0000-0000-0000-000000000002' // 今回はCosmos DB 組み込みデータ共同作成者

resource databaseAccount 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' = {
  location: location
  name: databaseAccountName
  properties: {
      // データベースアカウントの設定
  }
}

resource roleAssignment 'Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignments@2024-05-15' = {
  name: guid(principalId, roleDefinitionId, resourceGroup().id)
  parent: databaseAccount
  properties: {
    principalId: principalId
    roleDefinitionId: '/${subscription().id}/resourceGroups/${resourceGroup().name}/providers/Microsoft.DocumentDB/databaseAccounts/${databaseAccountName}/sqlRoleDefinitions/${roleDefinitionId}'
    scope: databaseAccount.id
  }
}
```
これでマネージドIDを利用してCosmosDBのアクセス・操作ができるようになりました。

# さいごに
Azure ロールにコントロールプレーンとデータプレーンの2種類があることを知りました。
両者の違いについてはもう少し理解を深める必要がありそうですが、ひとまずやりたいことはできたので良しとします。
今回の記事が誰かの役に立てば幸いです。

# 参考
https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-setup-rbac#built-in-role-definitions

https://learn.microsoft.com/ja-jp/azure/azure-resource-manager/management/control-plane-and-data-plane

https://qiita.com/baku2san/items/85714f90c094cebedb44
情報処理技術者試験の午後2論文用のWORDファイルを作成する

設定のメモです。（excel2013）
↓こんな感じにできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384673/19a36f10-3b6d-693e-0218-0e24bf628d23.png" alt="image" width="50%">
１．WORDファイルを新規作成して、ページを横書きにする。
２．ページ設定を以下の通り、原稿用紙の設定にするにして、25*16にする。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384673/0831d66d-e6d2-4746-bd2b-a4f57d4267b7.png" alt="image" width="50%">
３．グリッド線を押下する。以下の通り設定。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384673/c5593078-54aa-c8db-4ff4-83fcc234c8e3.png" alt="image" width="50%">
あとはフォントとかをいい感じにして終わり。
Rで鳥類センサスデータを集計＆グラフ化する

今回は鳥類のセンサスデータの集計をするコードをメモしておきます。
今回使用するのは架空のデータです。
データは調査時期が年2回、調査地点が4地点、それぞれの地点で3回調査を実施すると仮定しています。

以前から、調査回ごとに記録される種数や個体数はどれくらい増えていくのかを見てみたかったのがきっかけです。

```
# データの読み込み
census_data <-read.delim("clipboard")
```
```
> head(census_data)
  調査時期 調査地点 調査回           種名 個体数
1        1        1      1       ホオジロ      1
2        1        1      1 セグロセキレイ      1
3        1        1      1       ヒヨドリ      1
4        1        1      1 セグロセキレイ      2
5        1        1      1 ハシブトガラス      1
6        1        1      1       ヒヨドリ      1

```
こんな感じです。
それでは累積の種数と個体数を集計します。


```
# 各調査時期と調査地点ごとに、調査回ごとの種数と累積種数、個体数と累積個体数を集計
cumulative_data <- census_data %>%
  group_by(調査時期, 調査地点, 調査回) %>%
  summarise(
    個体数 = sum(個体数),
    種数 = n_distinct(種名),
    種リスト = list(unique(種名))
  ) %>%
  arrange(調査時期, 調査地点, 調査回) %>%
  group_by(調査時期, 調査地点) %>%
  mutate(
    累積種リスト = Reduce(function(x, y) unique(c(x, y)), 種リスト, accumulate = TRUE),
    累積種数 = sapply(累積種リスト, length),
    累積個体数 = cumsum(個体数)
  )

# 結果の表示
cumulative_data <- cumulative_data %>%
  select(調査時期, 調査地点, 調査回, 種数, 累積種数, 個体数, 累積個体数)

print(cumulative_data)
```
```
> print(cumulative_data)
# A tibble: 24 × 7
# Groups:   調査時期, 調査地点 [8]
   調査時期 調査地点 調査回  種数 累積種数 個体数 累積個体数
      <int>    <int>  <int> <int>    <int>  <int>      <int>
 1        1        1      1     5        5      9          9
 2        1        1      2     7       10     14         23
 3        1        1      3     5       13      7         30
 4        1        2      1     7        7      8          8
 5        1        2      2     7       10     11         19
 6        1        2      3     7       15     10         29
 7        1        3      1     8        8     27         27
 8        1        3      2     5       10     27         54
 9        1        3      3     5       11     10         64
10        1        4      1     5        5      6          6
# ℹ 14 more rows
# ℹ Use `print(n = ...)` to see more rows
```
調査回ごとに種数と個体数がどう変化していくかグラフ化します。

```
# 累積種数のプロット
ggplot(cumulative_data, aes(x = 調査回, y = 累積種数, color = as.factor(調査地点))) +
  geom_line(size = 1.2) +
  geom_point(size = 3) +
  facet_wrap(~ 調査時期, scales = "free_y") +
  labs(title = "調査時期ごとの累積種数",
       x = "調査回",
       y = "累積種数",
       color = "調査地点") +
  theme_minimal()
```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635830/6ccc64b9-5fec-6fea-f725-77bc87917f8e.png)

```
# 累積個体数のプロット
ggplot(cumulative_data, aes(x = 調査回, y = 累積個体数, color = as.factor(調査地点))) +
  geom_line(size = 1.2) +
  geom_point(size = 3) +
  facet_wrap(~ 調査時期, scales = "free_y") +
  labs(title = "調査時期ごとの累積個体数",
       x = "調査回",
       y = "累積個体数",
       color = "調査地点") +
  theme_minimal()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635830/0939e8af-c6a0-53f7-bd98-e52cb674e6fa.png)
【小ネタ】Teamsの「ミーティング」がCopilotでさかのぼるのに便利

# 人気の高いTeamsのCopilot
いろいろな会社のセミナーやMSの公式セミナー、書籍等みていてもダントツで一番イケてる（個人的主観）＆利用率の高いCopilot in Teamsについて、
Teamsの「ミーティング」アプリを使うと、あとからも便利に使えるのでご紹介。

# Teamsの「ミーティング」
Teamsの左ペインに様々なアプリのショートカットを置いておくことが可能ですが、
その中でも「ミーティング」は
・これから実施される予定のTeams会議
・これまで実施されたTeams会議
がCopilot関係なくずらっと表示されます。

## 「録音済み」で絞り込み、要約を実施する
ここで便利なのが「録音済み」というフィルタ。
ポチっと押すと、文字起こしや録画された会議のみに絞ることができます。
会議の中で共有されたり使われた資料も一緒に出てくるので追っかけやすい。

（なぜか常に表示されていないが…）右側にマウスを置くと「要約を表示」のボタンが出現します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/20871b99-f6d2-ebbc-569b-47f904d82902.png)

「要約を表示」を押すと、その会議のStreamサムネイルと自動でAIによって生成された会議メモなどが表示されます。（下記例では文字起こしだけなのでStreamサムネイルは表示されませんが…）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629241/8f1dd392-39f4-3a48-e9e4-153ac8debc77.png)

これからは欠席してしまった会議でも、議事録が残っていない会議でも、
録画をフルでみたり人に聞いたりせずにキャッチアップすることができますね✨
Visual Studioで、ソースコードをまとめてコメントアウトする、コメントアウトを解除する

Visual Studioで、ソースコードをまとめてコメントアウトする、コメントアウトを解除する方法を紹介します。

# GUI操作

「編集(E) > 詳細(V)」 から「行コメントの切り替え(L)」「選択範囲のコメント(M)」「選択範囲のコメントを解除(E)」を目的に合わせて選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/0b15259b-fa4e-b399-9236-00c62e550b18.png)

# ショートカット操作

- 行コメントの切り替え : Ctrl+K, Ctrl+/
- 選択範囲のコメント : Ctrl+K, Ctrl+C
- 選択範囲のコメントを解除 : Ctrl+K, Ctrl+U

# 環境情報

```
Microsoft Visual Studio Community 2022 (64 ビット) - Current
Version 17.10.4
```
React NativeアプリをMacのios シミュレータで動かす

## Xcodeを起動

## React Native CLIを使ってプロジェクトを作成
```shell
npm install -g @react-native-community/cli@latest
npx @react-native-community/cli init YourProjectName
cd YourProjectName
```

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

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

## iosシミュレータでアプリを起動
```shell
npx react-native run-ios
```
自分のPCのマシンスペックの確認

## 概要

自分のPCのマシンスペックを確認するための、Pythonのコードです。


### ライブラリのインストール
```
pip install psutil
```

### コード全文
```
import platform
import psutil

def get_system_info():
    info = {}
    info['OS'] = platform.system()
    info['OS Version'] = platform.version()
    info['Architecture'] = platform.machine()
    info['Processor'] = platform.processor()
    info['CPU Cores'] = psutil.cpu_count(logical=False)
    info['Logical CPU Cores'] = psutil.cpu_count(logical=True)
    info['Memory (Total)'] = f"{round(psutil.virtual_memory().total / (1024**3), 2)} GB"
    info['Memory (Available)'] = f"{round(psutil.virtual_memory().available / (1024**3), 2)} GB"
    
    return info

if __name__ == "__main__":
    system_info = get_system_info()
    for key, value in system_info.items():
        print(f"{key}: {value}")
```

## 出力結果

- **OS**: Windows
- **OS Version**: 10.0.22621
- **Architecture**: AMD64
- **Processor**: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
- **CPU Cores**: 4
- **Logical CPU Cores**: 8
- **Memory (Total)**: 15.88 GB
- **Memory (Available)**: 3.92 GB
AWSのlambdaを使って、KubernetesがダウンしたらSlackにアラートを流すようにしてみた

## はじめに

前回は Alertmanager を使って、Kubernetes で異常が生じた際に、Slack にアラートが流れるようにしました。

https://qiita.com/piny940/items/1e44d8caf936216ca93e

しかし、Alertmanager を Kubernetes クラスタ上に立てているため、クラスタごとダウンした際にはそれをアラートで気づくことができないという課題があります。

そこで今回は、Alertmanager のサービスの起動状況を監視する lambda を使用して、Alertmanager がダウンした時に Slack にアラートが送信されるようにしていこうと思います。

完成したコードはこちらから確認できます。

https://github.com/piny940/infra/tree/main/service-monitor

## 実装

コード自体は、Alertmanager のヘルスチェック用のエンドポイントにリクエストを送って、200 が返ってくるかを確認するだけのものです。

3 回リクエストをして、3 回とも失敗したらアラートを Slack に送るようにしています。

```py
import requests
import os
from slack_sdk import WebClient


def notify_slack():
  slack_token = os.getenv('SLACK_API_TOKEN')
  if slack_token == None:
    print('SLACK_API_TOKEN environment variable is not set')
    exit(1)
  client = WebClient(token=slack_token)

  channel = os.getenv('SLACK_CHANNEL')
  if channel == None:
    print('SLACK_CHANNEL environment variable is not set')
    exit(1)
  client.chat_postMessage(channel=channel, text='Alert Manager is down! :fire:')


def check(path):
  res = requests.get(path)
  if res.status_code == 200:
    return True
  else:
    return False


def handler(*_):
  path = os.getenv('HEALTH_CHECK_URL')
  if path == None:
    print('HEALTH_CHECK_URL environment variable is not set')
    exit(1)

  check_count = int(os.getenv('CHECK_COUNT') or '3')
  ok = False

  print('Checking health of service...')
  for _ in range(check_count):
    ok = check(path)
    if ok:
      break

  if ok:
    print("Service is up and running")
  else:
    notify_slack()
    print('Service is down. Alert sent to slack')
```

これを lambda で定期実行することで、Alertmanager のサービスの起動状況を監視することができます。

## まとめ

今回は、Alertmanager のサービスの起動状況を監視する lambda を作成しました。  
これで k8s クラスタ自体がダウンした際にも Slack にアラートが送信されるようになりました。

ここまでで、サービスを監視する仕組みを粗方整えることができました。  
そのため、次回はいよいよ[セトリ検索サイト](https://song-list.piny940.com)を Kubernetes に移行していきたいと思います。
GitHub Actionsでself-hosted runnerを常にidle状態にする

# 手順
まずは公式のガイダンスに従ってgithub actionsのセットアップを行う。
[Settings] -> [Actions] -> [Runners] -> [New self-hosted runner]を選択し、ActionsをホストするマシンのOSとCPUのアーキテクチャを選ぶとセットアップのためのコードが提示される。

![スクリーンショット 2024-08-18 12.47.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238125/f91887b0-0580-5c29-774a-8b9382c3993a.png)

`./run.sh` を動かすと、そのプロセスでランナーが立ち上がる。これだとターミナルを閉じるとGitHub Actionsが止まってしまうので、`systemctl` を使ってバックエンドでプロセスが起動するようにする。以下のファイルを開いて、`ExecStart`、`WorkingDirectory`、`User`を埋める。これはそれぞれ、actions-runnerのフルパス＋run.sh、actions-runnerのフルパス、コマンドを実行するユーザーである。

```/etc/systemd/system/github-runner.service
[Unit]
Description=GitHub Actions Runner
After=network.target

[Service]
ExecStart=/path/to/your/actions-runner/run.sh
WorkingDirectory=/path/to/your/actions-runner
Restart=always
User=your-username

[Install]
WantedBy=multi-user.target
```

その後以下のコマンドで設定を有効化して終わり。今後はシステム起動時に自動的にself-hosted runnerが立ち上がるようになる。

```bash
sudo systemctl enable github-runner
sudo systemctl start github-runner
```
OpenAI のクレジットカード支払いでエラーになったのですが、解消できました

## 結論

クレジットカードで支払う時に入力した住所と同じ住所を登録しておく

### 出たエラーメッセージです

```
We couldn't process your payment. If this issue persists, please contact us through our help center at https://help.openai.com.
```

### 住所を登録する箇所

settings > Billing > Preferences をたどって、 [Primary business address] にクレジットカードで入力したのと同じ住所を登録

分からなくて、 ChatGPT に聞いて教えてもらいました。
もし、エラーになっている場合は、一つの方法として試してみてください。
解いてみた。「Aランク：じゃんけんの手の出し方」

# 問題
[「Aランク：じゃんけんの手の出し方」]()

# コード
Javaで解いてみました。

``` Java
import java.util.*;


public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int nN = sc.nextInt();
        int nM = sc.nextInt();
        
        String sS = sc.next();
 
        // 相手の出す手の種類の集計
        int nGu = 0;
        int nChoki = 0;
        int nPa = 0;
        
        for (int i = 0; i < nN; i++) {
            switch(sS.charAt(i)) {
                case 'G':
                    nGu++;
                    break;
                case 'C':
                    nChoki++;
                    break;
                case 'P':
                    nPa++;
                    break;
                default:
                    // NOP
                    break;
            }
        }

        // こちらの出す手の種類と勝利数を求める
        int nMaxPa = nM / 5;
        int nMaxWin = 0;
        for (int mPa = nMaxPa; mPa >= 0; mPa--) {
            int nRest = nM - mPa*5;
            if (nRest % 2 != 0) {
                continue;
            }
            int mChoki = nRest / 2;
            int mGu = nN - (mChoki + mPa);
            if (mGu < 0) {
                continue;
            }

            // 勝利数を求め、最大勝利数を更新する
            int nWin = Math.min(mGu, nChoki) + Math.min(mChoki, nPa) + Math.min(mPa, nGu);
            if (nMaxWin < nWin) {
                nMaxWin = nWin;
            }
        }

        // 結果出力
        System.out.println(nMaxWin);
    }
}
```

# 解説
## 標準入力からの数値と文字列の読み取り
Scanner インスタンスを作り、nextInt()メソッドで数値（ジャンケンの回数$n$、指の本数の合計$m$）を、next()メソッドで文字列を取得しています。

## 相手の出す手の種類の集計
手の順番によらず、種類の合計のみが必要なので、文字列を検索し、
+ 相手がグーを出した回数：$G$
+ 相手がチョキを出した回数：$C$
+ 相手がパーを出した回数：$P$

を求めます。

## こちらの出せる手の種類（回数）を求める
### 最大で出せるパーの回数を求める
最大で出せるパーの回数（$q$）は指の数の合計（$m$）をパーの指の数（$５$）で整数除算した時の値になります。
### パーを出す回数をループさせる
パーを出す回数（$p$）を $0$ 〜 $q$ 回までループさせます。
#### チョキの回数を求める
チョキの回数（$c$）を求めます。指の数の合計（$m$）は、グーの回数を$g$とした時、
``` math
\begin{align}
0g + 2c + 5p &= m \\
2c &= m - 5p
\end{align}
```
より、$（m - 5p）$は2で割り切れる必要があります。よって、
``` math
c = \frac{m - 5p}{2}
```
となります。そして、グーの回数（$g$）は、
``` math
g = n - (c + p)
```
となります。この時、$g$は0以上である必要があります。

## 最大勝利回数を求める
こちらがグー($g$)、相手がチョキ（$C$）の時、グーでの勝利回数は $min(g,C)$となります。チョキ（$c$）とパー（$p$）も同様にして考えると、勝利回数（$w_k$)は、
``` math
w_k = min(g,C) + min(c,P) + min(p, G)
```
となります。あとは、最も大きい$w_k$が答えとなります。
NiceGUI ネイティブアプリの作成向けTIPS②

# NiceGUI ネイティブアプリの作成向けTIPS
自分の備忘録としても。ネイティブに限らないけど。

# ネイティブモード時のズーム設定について

自分はブラウザの表示設定を大体80%ぐらいにしています（単純に自分の好み）。NiceGUIアプリをWebブラウザで表示させている時はよいのですが、ネイティブモードで動作させると当然100%相当で表示されるので（個人的には）表示が大きくて少し気になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123579/0d45885e-e3bf-8b17-d183-9f3d29c80759.png)

左が80%のWebブラウザ表示。右がネイティブモードの表示。

というわけで、pywebviewのJavascriptを実行するAPIを使ってズーム設定を変更します。

```python
app.native.main_window.evaluate_js("document.body.style.zoom = '80%'")
```

ただ、`native.main_window`は `ui.run`が呼ばれてからでなければ生成されないので、`ui.run`の後に呼ばなくてはならない。かつ Javascriptコードは非同期実行されるので、NiceGUIのエレメントAPIがすでに呼ばれていると、一瞬100%の表示が見えて、そのあとズーム設定が適用されるためツラツキが見えて見栄えが悪い。

なので、

1. `app.on_startup` でアプリのスタート時コールバックを設定する
2. `ui.run`の呼び出し
3. startupコールバック内でzoom設定の変更 ＆ 完了まち
4. startupコールバック内でNiceGUIのエレメント呼び出し

というようにする。

```python
async def onStartup():
    // Javascript実行は非同期なので await する
    await app.native.main_window.evaluate_js("document.body.style.zoom = '100%'")
    // この後にNiceGUIエレメントを呼ぶ
    ui.label("Hello world.")

app.on_startup(onStartup)

ui.run(native=True)
```


---

ちなみに、

```python
app.native.window_args["zoomable"] = True
```

を最初に呼んでおけば、ネイティブアプリ上で ctrl+ホイール 操作でも表示倍率を変えられるようになる。


# `ui.menu`の階層表示について

↓このような階層のあるメニューの作り方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123579/830f320c-f120-dde2-bfae-12d7a4beba17.png)

`ui.list`は必須ではないけれど、`.props("dense")`付きで`ui.menu_item`を囲むことで各メニュー項目がコンパクトに表示されて美しいです。

```python
with ui.button(icon="menu"):
    with ui.menu():
        with ui.list().props("dense"):
            ui.menu_item("Item 1")
            ui.menu_item("Item 2")
            ui.separator()
            with ui.menu_item("Submenu", auto_close=False).classes(
                "items-center justify-between"
            ):
                ui.icon("keyboard_arrow_right")
                with ui.menu().props("anchor='top end' self='top start'"):
                    with ui.list().props("dense"):
                        ui.menu_item("Subitem 1")
                        ui.menu_item("Subitem 2")
```
HTML リンク・画像の追加

## リンク・画像の追加

パスの理解が苦手なのでまとめます。
フォルダ構造
![無題2437_20240818120331.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860616/f27a8371-8ce7-a07d-d119-937d0e55d9c1.jpeg)

以下は、記載のあるのも除きindex.htmlからのパス指定とします。

## サイト内リンク

同一ファルダ内の別のファイルを開くとき
```
<li><a href="access.html">アクセス</a></li>
```
一階層下のファイルにアクセス
（list.htmlからindex.htmlへ）
```
<li><a href="cafe/index.html">アクセス</a></li>
```
一階層上のファイルにアクセス
```
<li><a href="../list.html">アクセス</a></li>
```

## 外部リンク
文字に外部リンク埋め込み
target="blank"で別タブを開くことを指定
```
<a href="URL" target="blank">表示文字</a>

<a href="https://qiita.com/" target="blank">Qiita</a>
```

## ページ内リンク
ページのファイル#idを指定
divタグにid属性を指定することで、#newsでそこに移動できる
```
<li><a href="index.html#news">お知らせ</a></li>

        <div id="news">        
            <h2>お知らせ</h2>
            ・
            ・
        </div>
```
同一ページの場合ファイル名は省略できる
```
<li><a href="#news">お知らせ</a></li>
```
## IDの指定方法
・IDはすべてのタグに指定できる（重複不可）
・JavaScript、CSSとの連携にも使用できる
・半角英数字、日本語、アンダーバー、ハイフンのみ使用可
```
<div id="ID名">       
```

## 画像の挿入
・img src=""：現在のファイルからの画像のパス
・ait=""：画像の表示ができないときに表示するテキスト
　視覚障がいのかたの読み上げ機能としても使用
　装飾イラストなど特に意味を持たないものは""で空白にする
```
<img src="images/logo.svg" alt="KUMA CAFE">
```
サイズ属性の指定（指定しない場合は実サイズで表示される）
```
<img src="images/logo.svg" alt="KUMA CAFE" width="300" height="300">
```
画像にリンクを埋め込むこともできる
```
        <div>
            <a href="index.html"><img src="images/logo.svg" alt="KUMA CAFE"></a>
        </div>
```

## 参考書籍
こちらを参考に自分用にまとめさせていただきました。
画像が多くとても分かりやすいのでおすすめです。

https://amzn.asia/d/bGVeWHi
React｜TechPitの『ゴルフ場検索サービス』を作ってみた

エンジニアのみなさま、日々の学習本当にお疲れ様です！
また本記事まで足を運んでいただき本当に感謝です。
約2分程度で読めるので最後まで読んでもらえると幸いです。

# こんな人におすすめ

- React × TypeScriptを使ってみたい方
- サーバーレスでの開発に興味がある方
- AWSのサービスを使ってみたい方
- 外部APIを使ってみたい方

# サイトURL

https://www.techpit.jp/courses/15

めちゃくちゃ勉強になりました。ありがとうございました！！！

# TechPitとは

https://www.techpit.jp/

# アーキテクチャ

![スクリーンショット 2024-08-17 22.18.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/d15f1f87-dd27-95c2-cf39-83fd0c362e58.png)
※ https://www.techpit.jp/courses/15/curriculums/16/sections/149/parts/567 から引用

# やってみた感想

ReactやTypeScriptの書き方や考え方に関して丁寧に説明されています。パート毎の質問を見ても、学習者に寄り添った回答をされているのが好印象でした。


個人的にはAWS関連のサービスに触れたのが一番良かったです。実際に利用するサービスは **『AWS Amplify』** **『Amazon DynamoDB』** **『AWS Lambda』** **『Amazon API Gateway』** になります。AWSのドキュメントを読んで何となくの理解はできるものの、じゃあどうやって使うの？がピンときておらず、実装するにしても敷居が高い印象を勝手に持っていました...
そんな中、この教材で学習をする事で実装の敷居がグンと下がりました。 **CLI(Command Line Interface)** ではなく **GUI(Graphical User Interface)** での操作でしたが、数STEP設定するだけで簡単に構築ができます。AWSサービス内でのバッチ処理の設定やDBのテーブル・カラム設定が知れて良かったです。

外部APIの使い方も初学者の方にとっては良い教材だなと感じました。
今回利用したのは **ゴルフ場の情報を取得するための『楽天GORA系API』** と **「特定の場所同士の車での所要時間」を求めるための『Google Maps Platform』** でした。登録・IDやkeyの発行・設定手順まで、こちらも丁寧に説明がされているため難なく対応できると思います。

この教材は2023年3月が最終更新になります。そのため、『サービスの全体像を早く知りたい！』という方は各パートに書かれているバージョンを指定して対応されるのが良いかなと思います。私はフロント・バックエンドいずれも最新のバージョンで試しました。程よくコードの書き方が違うため、古いバージョンとの書き方の違いを見ながらデバッグが出来て良かったです！

# さいごに
いかがだったでしょうか？
作ってみたい！と思った方はぜひ活用してみてください。
尚、この教材ではReactとTypeScriptでの実装がメインになりますが、他の言語で実装してみるのも勉強になるかなと考えます！

# おまけ

唐突ですが、弊社のご紹介もさせてください。

▼ コーポレートサイト

https://prum.jp/

▼ Wantedly求人

https://www.wantedly.com/projects/626662

弊社メンバーは学習した内容を日々Qiitaの記事にアウトプットしております。
弊社にご興味のある方、まずは求人を見てみてください！
ご応募お待ちしておりますー！

### 最後までご覧いただき、ありがとうございました！
AWS SAM 覚え書き

SAM の記事なんて今さらですけどねー。今まで長らくお世話になってきた Serverless Framework が v4 からはどうも商用では有償になるらしいですし(厳密には組織の収益規模によるようですが、細かいことは気にしない…)、Serverless Framework を使い続けることで Dependabot くんに「脆弱性あるよ早く対処しな！」と頻繁にせかされるのもいいかげんしんどくなってきたので、SAM に乗り換えるのもいいかな、と。 ~~CDK はコードをぐちゃぐちゃ書かないといけないのでメンドクサイ~~

ここでは、忘れそうになることを箇条書きでメモするだけです。役に立つ記事とかそういうのはよそを当たってください…。

## Lambda 実行ロール

Lambda 実行ロールへの基本的な管理ポリシーの付与は SAM が暗黙にやってくれるので、S3 とか DynamoDB とか自分のリソースへのアクセス権限をポリシーテンプレートなりなんなりで追加すればよい。

- 何も書かなくても、自動的に `AWSLambdaBasicExecutionRole` ポリシーが付与される。これによって CloudWatch Logs ロググループ・ログストリームの作成、ログの書き込みが可能になる。template.yaml にわざわざロググループのリソース定義を書く必要はない
- `VpcConfig` を指定した Lambda には自動的に `AWSLambdaVPCAccessExecutionRole` ポリシーが付与される。これによって ENI の脱着が可能になる
- `Tracing: Active` が指定されると自動的に `AWSXrayWriteOnlyAccess` ポリシーが付与される

(今後もっと増える、かも。)

## Lambda バージョン・エイリアス

- SAM で単純にデプロイしただけではバージョン・エイリアスどちらも作成されない
- `AutoPublishAlias` 等を指定すれば作成される
- 一度 `AutoPublishAlias` 指定でエイリアスをデプロイしておくと、2回目以降は `DeploymentPreference` と併用することで CodeDeploy による blug/green デプロイ的なことができる (CodeDeploy は「前」がないとうまく動かない ~~融通の利かない~~ サービスなので、初回は `AutoPublishAlias` だけ、2回目以降に `DeploymentPreference` も付けるといった手順が必要)
- Function URL ( `FunctionUrlConfig` ) を業務用途で使う人はあまりいないと思われるが、 `FunctionUrlConfig` `AutoPublishAlias` `DeploymentPreference` の 3 つを併用すると Function URL が (定義は残っているにもかかわらず) アクセスできなくなるという問題が発生した。 [公式ドキュメント](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-functionurlconfig.html) を見る限り下記のように書いてあるので SAM が Function URL に対応していないということはなさそうだが、CodeDeploy と組み合わせると Function URL 接続先のエイリアスがうまく切り替わらないといった制限があるのかもしれない

> If you specify an AutoPublishAlias for your Lambda function, the endpoint connects to the specified function alias.
【ChatGPT＋Code Interpreter】で画像を左右に分割して、それを左右から寄せて中央で合体するアニメGIFを作成します。


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

　今回は、画像を左右に分割して、それを左右から寄せて中央で合体するアニメGIFを作成します。

:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
あります。　あしからず。
:::

　まずは、ニュース。

　Luma AIの
　　動画生成AI
　　　DreamMachineが
　　　　V.15にバージョンアップ。
　　　　　[Luma AI公式ポスト](https://x.com/LumaLabsAI/status/1824918130683986413?t=9wI2sPRH0b1NeSFIDG9VGA&s=19)

　でも
　　どこがバージョンアップしたのか
　　　わかりません😅
***
　さて、本題です。

　今回は、
　　画像を左右に分割して、
　　　それを左右から寄せて
　　　　中央で合体する
　　　　　アニメGIFを作成します。

　出来上がりがこちら。
![centering_animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/de87d20f-9443-56d0-f170-effaa59f5412.gif)

　手順は
　❶GPT-4oであることを確認
　❷画像をアップロード
　❸Prompt入力
```Text:
CodeInterpreterで、
・黒背景
・画像を左右に分割
・上で分割した画像を左右から同時に中央に寄せていき、中央で合体

上記のアニメGIF（滑らかに2秒）を作成してください。
```
　❹送信
　❺ダウンロードリンクが表示

***
　少し複雑なものになると、
　　Promptの書き方に
　　　注意が必要になりますね。

　どうしても文章が長くなり、
　　意味が曖昧になりやすいのです。

　ChatGPTは
　　同じPromptでも
　　　実行するたびに
　　　　解釈が変わる可能性が
　　　　　あります。

　解釈を固定するには、
　　文章を短文に切り分ける方法が
　　　取れると思います。

　短文であれば
　　指示が明確になりますからね。

　これは
　　日常会話やメールでも同じです。

　伝えたいことを
　　はっきりさせる。

　指示は明確に。
***
　ちなみに
　　“（滑らかに2秒）”と
　　　指示していますが、
　　　　“滑らかに”がないと
　　　　　カクカクしてしまうために
　　　　　　入れました。

　アップしたアニメGIFは
　　カクカクバージョンです。

　これは
　　ファイルサイズが大きくて
　　　アップできなかったためです。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
システム運用保守をしている私のお仕事の心得

## はじめに
システム運用保守の分野で働くために、私が大切にしている心得をまとめました。

### 長期的視点での取り組み
システム運用保守の仕事では、長期的な関わりが求められます。
私の経験では、引継ぎだけでも半年ほどかかることが多く、
案件自体も長期にわたることがほとんどです。頻繁に担当者が入れ替わると、
そのたびに引継ぎの時間が必要になり、結果として保守対応が不安定になります。
**長期的な視点で業務に取り組むことが重要です。**

### 正確な時間管理
運用保守業務は、決められた時間に正確に作業を行うことが求められます。
特に障害発生時には、深夜や早朝での対応も避けられません。
お客様と日程調整を行い、正確に作業を進めることで、信頼を築くことができます。
**時間管理がシステムの安定性に直結するため、ここは妥協できないポイントです。**

### 新しい技術に対する興味
クラウド技術が進化するスピードは速く、昨日できなかったことが今日には可能になっていることもあります。
そのため、新しい技術に常に興味を持ち、定型の作業手順書を改善していく姿勢が求められます。
**改善することで工数削減に繋がることもあります。**

### 担当システムへの興味と学習
初めて案件に携わると、分からないことが多くありますが、システムの技術に対して積極的な興味を持つことが重要です。日々の依頼やトラブルの背景を考えたり、使用するコマンドの意味を調べたりすることで、知識が深まり、トラブル対応能力も向上します。学習を積み重ねることで、システム全体の理解が深まり、保守作業がスムーズに進むようになります。**長く運用保守しても目の前のシステムに興味を持たないと詳しくなれません。**

### サーバー構築スキルの重要性
運用保守の業務には、システム更改時にサーバーを立て直す必要がある場面もあります。
そのため、日頃からサーバー構築のスキルを磨いておくことが重要です。
**ハンズオンで実践的なスキルを習得し、いざという時に対応できる準備をしておくことで、システム運用の幅が広がります。**

### 資格の取得と基礎知識の重要性
トラブル対応やアラートの際には、基本的な知識がなければ誤った調査をしてしまうことがあります。
そのため、**資格取得を通じてしっかりと基礎を固めることが重要です。**
例えば、LPICレベル2の知識はサーバー構築時に役立ち、LPICレベル1も初心者向けと軽視せずに学習すべきです。また、AWSの資格も運用保守において非常に有用ですので、Linuxと合わせて学ぶことを推奨します。

### チームワークと良好な人間関係
システム運用保守は、チームでの協力が欠かせません。確認者と作業者が連携して作業を進めるため、**チーム内の人間関係を良好に保つことが、業務の円滑な進行に繋がります。** 信頼関係を築くことで、スムーズなコミュニケーションと効率的な作業が実現します。

### 冷静な対応力
作業中に確認者から急かされることがあっても、冷静に対応することが求められます。
**焦ってしまうとミスを引き起こしやすくなるため、どんな状況でも落ち着いて作業を進める姿勢が大切です。**

### まとめ
私はまだ上記に書き出したことは出来ていません。本記事で運用保守として大切なことをまとめました。
41歳という年齢を迎え、10年間の運用保守の経験を積んできました。
資格取得やスキル向上に努め、後輩を育成しながら構築もできるベテランの運用保守者として、さらに成長していきたいと考えています。
tailwindcssのスタイルの再利用：定数で使用する場合のtips

## はじめに

tailwindcssのスタイルを定数として再利用することは、一般的に推奨されていません。コンポーネント化やユーティリティクラスの直接使用が、tailwindcssの思想に沿った方法です。しかし、特定の状況下では定数を使用したくなる場合もあるでしょう。ここでは、tailwindcssのスタイルを定数で置いた場合でも補完やスタイルソートするための小さなtipsを紹介します。


※ 公式に、styleを再利用したい場合の対処方法をまとめられているので、こちらをご参考にしてください。

https://tailwindcss.com/docs/reusing-styles


## VSCode での tailwindcss の補完


定数内でtailwindcssのクラスを使用する際、VSCodeの補完機能（Tailwind CSS IntelliSense）を活用できます。

https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss

`settings.json`に以下の設定を追加してください
（`.*Styles*`以外はデフォルトで入っているものです。上書きするために、こちら全てコピペすることをおすすめします。）

```json:.vscode/settings.json
{
  "tailwindCSS.classAttributes": [
    "class",
    "className",
    "ngClass",
    "class:list",
    ".*Styles*"
  ]
}
```
この設定により、someStylesやbuttonStylesなどの変数名でもtailwindCSSの補完が効くようになります。

## prettier-plugin-tailwindcssの設定

prettier-plugin-tailwindcssとは、tailwind公式のprettierプラグインです。クラス名を自動で並び替えてくれます。

https://github.com/tailwindlabs/prettier-plugin-tailwindcss

こちらは、classやclassNameといった直接利用のみに適用され、定数に一度置く場合は並び替えしてくれません。その対処方法として、clsxやcvaなどのライブラリを使って定数をラップしてあげることで変数に置いたとしても自動でクラス名を並び替えてくれます。（参考: [Sorting classes in function calls](https://github.com/tailwindlabs/prettier-plugin-tailwindcss?tab=readme-ov-file#sorting-classes-in-function-calls)）


まず、prettierの設定ファイルに以下の設定を追加してください。（例は、`prettier.config.mjs`でclsxライブラリを利用）

```js:prettier.config.mjs
/** @type {import("prettier").Config} */
const prettierConfig = {
  ...
  tailwindFunctions: ['clsx'],
  plugins: ['prettier-plugin-tailwindcss', 'prettier-plugin-prisma'],
};

export default prettierConfig;
```

上記の設定を完了後、クラス名をclsxでラップすることで、自動で並び替えをしてくれるようになります。

```tsx:Hoge.tsx
const inputStyle = clsx('flex items-center justify-center bg-white');
```


## まとめ

tailwindcssのスタイルを定数として再利用することは一般的に推奨されていませんが、特定の状況下では必要になる場合もあります。このような場合に備えて、以下のtipsを紹介しました：
1. VSCodeでのtailwindcss補完:
    - settings.jsonに特定の設定を追加することで、変数名でもTailwindCSSの補完が効くようになります
2. prettier-plugin-tailwindcssの設定:
    - prettierの設定ファイルにtailwindFunctionsを追加し、clsxなどのライブラリを使用することで、定数に置いたtailwindcssクラスも自動で並び替えられるようになります

これらのtipsを活用することで、tailwindcssのスタイルを定数で使用する際の開発体験を向上させることができます。ただし、可能な限りtailwindcssの標準的な使用方法（直接クラスを適用する、またはコンポーネント化するなど）を選択することをお勧めします。
CanYouSee picoCTF writeup for beginner

<h3>記事説明</h3>
CTF初めて一カ月の主がPicoCTFのEasyをbeginnerむけに書いている記事です。CTFのwriteupではCTF常識が前提になっている記事が多く無知すぎてよくわからなかったので書くことにしました。至らぬところ等あると思いますのでご指摘いただけると嬉しいです。
#picoCTFbeginner


<h3>事前知識</h3>

<h4>基礎ツール</h4>
CTFで使う基礎ツール。<br>
今回はデコードエンコードツールとexiftoolを使う。

https://qiita.com/koikoi193193/items/283bc2cf7ecf7fff8e8a


<h3>flag獲得方法</h3>
とりあえずinstallした画像をexiftoolにいれてみる。

![スクリーンショット 2024-08-18 113524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972935/7d69e6c5-258e-ed33-6151-998392e164f5.png)
]

Attribution URLにcGljbから始まる文字列を発見する。
これはpicoCTFのflagがbase64で表示されているときによくある文字列。

実際にbase64からUTF-8に変換するとflagが見つかる。
![スクリーンショット 2024-08-18 113822.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972935/f9a00347-c8b1-f61a-b4d4-93c3cee6d4b6.png)
【Android】ADB操作にはADB Ideaプラグインが便利

# はじめに
Androidのアプリエンジニアであれば間違いなく触るであろうADB操作ですが、実はこの操作を簡単に実行可能なプラグインがあるのはご存知でしょうか。
ターミナルで実行するのも良いと思いますが、複雑な操作が必要ない場合にはこのプラグインを使用することで、より効率的に作業を行うことができると思いますので今回はADB Ideaをご紹介したいと思います。

# ADB Ideaの導入方法
導入は他のプラグインと同様になります。

`Settings > plugins` より`ADB Idea`と検索してもらい、インストールするだけで使用できるようになります。

![スクリーンショット 2024-08-18 11.07.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/8417333b-57cf-4afe-ad20-f41b8c2b0344.png)

# ADB Ideaの使用方法
まず、ADB Ideaのできることを紹介します。

- ADB Uninstall App
- ADB Kill App
- ADB Start App
- ADB Restart App
- ADB Clear App Data
- ADB Clear App Data and Restart
- ADB Start App With Debugger
- ADB Restart App With Debugger
- ADB Grant/Revoke Permissions
- ADB Enable/Disable Wi-Fi
- ADB Enable/Disable Mobile Data

最新バージョンでは上記リストを実行可能です。
よく使うものは基本網羅しているイメージです、今後のアップデートで実行可能なものは増えていくことが考えられます。

このプラグインを使用して実行するには２通りの方法があります。
- `Tools > ADB Idea` より実行する
- Find ActionsよりADBと検索し実行する(cmd+shift+a)

以上より実行したいアクションを選択可能です。

![スクリーンショット 2024-08-18 11.20.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/cba9729d-9819-fd02-bb6a-a310bdf38ea2.png)

確実にコマンド実行より早い印象です、ADBの使用頻度が高いプロダクトであればあるほど恩恵があると思いますので是非お試しいただければ幸いです。

以上になります。

# さいごに
お盆休みは一瞬ですね、明日からまた気合い入れていきます！💪
.envファイルは適切な位置に置こう

# はじめに
Supabaseでユーザーの登録機能を実装していた際に、以下のエラーが出たので共有します。

```
Error: supabaseUrl is required.
```

# 問題
subabaseのurlとAPI Keyが正しく設定されていないことで発生するエラーですが、`.env` ファイルの設定を見ても正しく設定されていました。

```
REACT_APP_SUPABASE_URL="YOUR_URL"
REACT_APP_SUPABASE_API_KEY="YOUR_API_KEY"
```


# 解決方法
`.env` ファイルを `src` ディレクトリ内に作成していたので、ルートディレクトリに `.env` ファイルを移動することで解決できました。

# おわりに
最近はDeepLの拡張機能を使って英語のドキュメントを読んだりしていて、今回はstackoverflowの記事を参考にして、解決できました。

# 参考
https://stackoverflow.com/questions/68239168/error-supabaseurl-is-required-supabase-postgresql
Mermaid記法をパースする方法（ライブラリの紹介）

## 概要
FlowChartなどをテキストで書けるようにするMermaid記法のparserは公式で提供されていない．[@excalidraw/mermaid-to-excalidraw](https://github.com/excalidraw/mermaid-to-excalidraw)というnpmのライブラリを使用することで，dictionary形式でノードとエッジの配置データを取得できる．

excalidrawは手書き風の図を作成するツールであり，jsライブラリが提供されている．mermaid-to-excalidrawはexcalidrawのAPIと一緒に使うことが想定されたライブラリである．想定された使い方ではないかもしれないが，excalidraw形式のdictionaryデータには図形の種類，位置，サイズなどの情報が含まれているのでMermaidパーサーとして使用することが可能である．例えばMermaid記法で入力すると図形を配置してくれるExcelプラグインなどが考えられる．

## 使い方

- npm経由でライブラリをインストールする

    ```sh
    npm install --save @excalidraw/mermaid-to-excalidraw
    ```

- parseMermaidToExcalidrawにMermaid記法のテキストを渡すとelementsにdictionary形式のデータが返される．ER図などexcalidrawライブラリは未対応だがmermaidとしてはパース可能なテキストが渡された場合はfilesにmermaid APIで作られた画像ファイルが返される．GitHubに載っているサンプルコードは動作したが公式ドキュメントに載っているコードは古いのか動かなかったので注意してほしい．

    ```js
    import { parseMermaidToExcalidraw } from "@excalidraw/mermaid-to-excalidraw";

    try {
      const { elements, files } = await parseMermaidToExcalidraw(
        diagramDefinition,
        {
          themeVariables: {
            fontSize: "25px",
          },
        }
      );
      // Render elements and files on Excalidraw
    } catch (e) {
      // Parse error, displaying error message to users
    }
    ```


## 注意点
このライブラリ使う際の注意点は以下の通りである．
- 本ライブラリはexcalidrawという手書き風ネットワーク図描画ライブラリのための公式コンバーターである．出力されるdictionaryの形式はexcalidrawのアップデートに合わせて変更される可能性がある
- 標準ではFlow図，アクティビティ図，クラス図がサポートされているが，ER図など他のダイヤグラムはサポートされていない．比較的新しいライブラリであり最近のアップデートもされている(2024年8月現在)ようなので今後対応する可能性はある．自分でパーサーを書いて拡張することは可能となっている([Adding a new Diagram Type](https://docs.excalidraw.com/docs/@excalidraw/mermaid-to-excalidraw/codebase/new-diagram-type))

## 補足情報

Mermaid記法のダイアグラムに含まれるオブジェクトの情報のみを取得したい場合，Mermaid APIに存在する次のメソッドを使用することで実現できる．ただし位置やサイズなどのレンダリング情報は含まれていない．

``` js
const diagram = await mermaid.mermaidAPI.getDiagramFromText(fullDefinition);
```

位置やサイズを取得したい場合はこのデータを元にsvgを解析する必要があり，mermaid-to-excalidrawではこの操作を行っている．

## 参考
- 公式ドキュメント [Installation | Excalidraw developer docs](https://docs.excalidraw.com/docs/@excalidraw/mermaid-to-excalidraw/installation)
- GitHub [@excalidraw/mermaid-to-excalidraw](https://github.com/excalidraw/mermaid-to-excalidraw)
IntroToBurp picoCTF writeup for beginner

<h3>記事説明</h3>
CTF初めて一カ月の主がPicoCTFのEasyをbeginnerむけに書いている記事です。CTFのwriteupではCTF常識が前提になっている記事が多く無知すぎてよくわからなかったので書くことにしました。至らぬところ等あると思いますのでご指摘いただけると嬉しいです。
#picoCTFbeginner


<h3>事前知識</h3>

<h4>Burp suite</h4>
WEBアプリケーションの脆弱性診断ツール。
Proxy機能があり、HTTPS通信の内部をみることができる。

https://qiita.com/koikoi193193/items/283bc2cf7ecf7fff8e8a

<h4>Burpの使い方</h4>
interuptをonにするとhttps GET,POST methodを編集することができる。
実際にはinteruptをonにしたら、一時的に止めているパケットが表示される。

・forwardを押すとそのまま送信。
・Dropを押すと破棄。
・Actionの中からSend to Repeaterを押すとRepeaterに送られ編集できる。

![response前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1972935/af7d4390-4529-dad8-f9aa-e96b3e441aa5.png)



<h3>flag獲得条件</h3
Burpを使ってHTTP requestのOTP欄を消して送信するといいらしい。。
正直ツールの使い方は理解したがなぜこれで通るのかよくわからない。
評価も低いため悪問なのかな？とかってに思った。ただ、Burpを使ういい機会になったのでとても経験になった。


[参考]

https://medium.com/@starkxun5215/picoctf-introtoburp-writeup-b707886c5816
ある条件を満たす要素の数を求めたい

ある条件を満たす要素の数を求めたい場合、`filter`と`count`を組み合わせます。

**例: 3の倍数の数を数える**

```rust
fn main() {
    let numbers = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    let count = numbers.iter()
        .filter(|&&x| x % 3 == 0)
        .count();

    println!("{}", count); //=> 3
}
```

**環境情報**

```
$ rustc -V
rustc 1.76.0 (07dca489a 2024-02-04)
```
【Python】文字列操作について

# はじめに
Pythonにおける文字列操作についてはとても便利なため、使用方法を紹介したいと思います。
文字列操作についてはJavaの場合、先頭２文字を取得する場合は```"abcdef".substring(0,2)```と記載しますが、Pythonの場合、先頭２文字を取得したい場合は```"abcdef"[0:2]```とすれば先頭２文字を取得できます。
コードがとても簡易的です。

ということでPythonの文字列操作について紹介したいと思います。

Python基本構文については[【Python入門】基礎構文のまとめ](https://qiita.com/atsuuun/items/60e2cec16add7091b109)でまとめてますので、参考にしてください。

# 文字列操作について

|演算|概要|例
|---|---|---|
|```s[:i]``` ```s[0:i]```|文字列sの0番目の要素からi番目未満の要素まで取得|s[:5]の場合、0番目の要素から5番目未満の要素までの文字列を取得します|
|```s[i:]```|文字列sのi番目の要素から全ての文字列を取得|s[5:]の場合、5番目の要素から全ての文字列を取得します|
|```s[i:j]```|文字列sのi番目の要素からj番目未満の要素までを取得|s[5:6]の場合、5番目の要素から6番目未満の要素までの文字列を取得します。即ち6番目の要素のみ取得します|
|```s[i:j:k]``` |文字列sのi番目の要素からj番目未満の要素のうち、k毎の要素を取得(k=2の場合、2つとばしで取得という意味|s[1:6:2]の場合、1番目の要素から6番目未満の要素のうち、1番目の要素から2つとばしの要素のみを取得します

## 文字列sの0番目の要素からi番目未満の要素まで取得
要素0番目から5番目未満の文字列を取得
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[0:5])

    print結果:abcde
```
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[:5])

    print結果:abcde
```

0番目の要素から1000番目未満の文字列を取得。文字列以上の要素を指定してもエラーにはならず取得できます（賢いです）
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[0:1000])

    print結果:abcdefghijklmnopqrstuvwxyz
```

## 文字列sのi番目の要素から全ての文字列を取得
要素5番目から全ての文字列を取得
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[5:])

    print結果:fghijklmnopqrstuvwxyz
```

## 文字列sのi番目の要素からj番目未満の要素までを取得
0番目の要素から5番目未満の要素までを取得
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[1:5])

    print結果:bcde
```

文字列以上の要素を指定した場合は全ての要素を取得（賢いですね）
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[0:1000])

    print結果:abcdefghijklmnopqrstuvwxyz
```

## 文字列sのi番目の要素からj番目未満の要素のうち、k毎の要素を取得
1番目の要素から5番目の要素未満の内、2つとばしの要素を取得
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[1:5:2])

    print結果:bd
```

ステップをマイナスにすることでreverseして取得することが可能となります
また開始位置を指定しない場合、末尾の'z'から取得されるため
```str[::-1]```と```str[-1::-1]```は同等となります。
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[::-1])

    print結果:zyxwvutsrqponmlkjihgfedcba
```
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[-1::-1])

    print結果:zyxwvutsrqponmlkjihgfedcba
```
ステップに-2をしてすることでreverse取得しつつ、2つとばしとなります。
```python
    str = 'abcdefghijklmnopqrstuvwxyz'
    print(str[::-2])

    print結果:zxvtrpnljhfdb
```

# まとめ
文字列から部分的に文字を取得する場合、コロンを使用することで部分文字列を取得できます。
```文字列[開始位置：終了位置：ステップ]```
Google Colabでまだまだmatplotlibの日本語表示が豆腐不可避な方に（2024/08/18時点）

## 1.想定する読者
* 1-1.以下の記事を見てgoogle colabの日本語化を済ませたのに、また**2019年10月下旬からまた豆腐に悩まされている皆様(筆者含む)。**
  * Colaboratoryでmatplotlibの日本語表示
  * https://qiita.com/unvavo/items/a907cb927bdadc1d8d0c　
  * https://qiita.com/siraasagi/items/3836cedede350280ec42
  * https://qiita.com/siraasagi/items/d72f60c25b30269d89e4
* 1-2.matplotlibを使う時、以下のエラーが出る人

``` ERROR.log
findfont: Font family ['IPAGothic'] not found. Falling back to DejaVu Sans.
/usr/local/lib/python3.6/dist-packages/matplotlib/backends/backend_agg.py:211: RuntimeWarning: Glyph 29983 missing from current font.
  font.set_text(s, 0.0, flags=flags)
```

## 2.結論:現段階ではmatplotlibfont cacheが「fontlist-v330.json」に変更
* 2019年10月までは「fontlist-v310.json」で良かったのですが、バージョン上がりましたmatplotlib
* 
``` NG.py
# このコマンドだと豆腐不可避
rm /root/.cache/matplotlib/fontList.json
rm /root/.cache/matplotlib/fontList-v300.json
rm /root/.cache/matplotlib/fontList-v310.json
```

* matplotlibのcacheに-vXXXと書いてある見慣れないファイル、これが本来消すべきfont cacheです。
* vXXXはどうやらmatplotlibのバージョンっぽいです。

``` ls.py
!ls -ll /root/.cache/matplotlib/
-rw-r--r-- 1 root root 29351 Jan 17 17:06 fontlist-v330.json # 2024/08/18時点ではこれを削除。
```

## 3.matplotlib ver.3以降の新たな日本語表示手順
``` success.py
# 日本語フォントをダウンロードする。
!apt-get -y install fonts-ipafont-gothic

# キャッシュを削除する。
!rm /root/.cache/matplotlib/fontlist-v330.json # 消すべきcache

# ランタイムを再起動する。(colabメニュー>ランタイム>ランタイムを再起動)
``` 
* 削除するキャッシュさえ間違わなければ解決できます。

## 4.before-after
* 修正前。１か月分の豆腐ってところですね。
![スクリーンショット 2024-08-18 104601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10574/cac27dab-def6-155a-3ee6-ace1de87639d.jpeg)



* 新手順。豆腐が解消されています。
![スクリーンショット 2024-08-18 104623.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10574/609b7472-55b5-d43b-c433-9b59450886ac.jpeg)


以上です。
Kubernetes Deploymentの起動をオンオフにする方法

Kubernetesでは、kubectlコマンドを使ってデプロイメントのレプリカ数を変更することで、Podの起動をオンオフにできる。

## 前提条件
Kubernetesクラスターにアクセスできること

## 手順
### 1. デプロイメントの名前を確認
まず、対象のデプロイメント名を確認する。以下のコマンドで、クラスター内のデプロイメントを一覧表示できる。

```bash
kubectl get deployments
```
例として、デプロイメント名が example-deployment だと仮定する。

### 2. デプロイメントのPodを停止（オフ）する
デプロイメントをオフにするには、レプリカ数を 0 にスケールダウンする。これで、デプロイメントに関連する全てのPodが停止する。

```bash
kubectl scale deployment example-deployment --replicas=0
```
## 3. デプロイメントのPodを再起動（オン）する
デプロイメントを再びオンにするには、レプリカ数を必要な数にスケールアップする。例えば、3つのPodを再起動する場合は以下のコマンドを実行する。

```bash
kubectl scale deployment example-deployment --replicas=3
```

## まとめ
kubectl scale コマンドを使うことで、デプロイメントのPodの数を簡単に変更できる。これにより、デプロイメントの起動をオンオフすることが可能になる。
SwiftUI TextFieldでreturnキーを押した時に処理を行う方法

TextFieldで入力returnキーを押した時に処理を行う方法です

# サンプルコード

```TextFieldOnCommit.swift
struct TextFieldOnCommit: View {
    @State private var inputText: String = ""
    @State private var showText: String = ""
    
    var body: some View {
        VStack(alignment: .center, spacing: 12) {
            TextField("ここに入力",
                      text: $inputText,
                      onCommit: {showText = inputText}
            )
            Text(showText)
        }
    }
}
```

`onCommit: {showText = inputText}`の部分がreturnキーを押した時になります。
今回の場合は入力したテキストを別のテキストに表示する処理をしております。
GitHub Actions学んでみた⑦

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:

# 今回の目的
自分の作ったコンポーネントを確認したり検証するための技術を身に付けたい！
公式のクイックスタートを参考に進めていきます。
項目ごとに補足のみ書いて進めています。わかりづらいところの理解の手助けになれば幸いです！

# 主に参考にさせていただいた記事

https://docs.github.com/ja/actions/quickstart

# スターターワークフロー
### 概要
ワークフローを作成するアクセス許可を持つOrganization内のすべての人が、より迅速かつ簡単にワークフローを作成できる
デフォルトで用意されているのは下記四つ
・デプロイ (CD)
・セキュリティ
・継続的インテグレーション (CI) 
・オートメーション

Actionsタブから「NewWorkFlow」を選択すると上記の内容で候補を選べる

![スクリーンショット 2024-07-09 6.02.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/4bb5a217-a37a-2cf5-4599-ee348e8cf412.png)


### スターターワークフローを作成する
組織でしか表示されないため作成内容のみ。
スターターワークフローとメタデータファイルを作成する例

1:Actionsタブで「New workflow」を選択
![スクリーンショット 2024-08-18 10.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/d2395be0-298e-5970-d692-10e860acb83b.png)

2:使用したいワークフローの「Configure」を押下
![スクリーンショット 2024-08-18 10.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/26ec5c6a-fd09-e539-6d5e-f460901c6ebc.png)

3:リポジトリのセットアップは必要だが、ワークフローは特別編集がなければそのままコミット
![スクリーンショット 2024-08-18 10.34.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/284554c6-e12d-f456-fd97-169ef4c4ad57.png)

4:コミット後に動作すると思うが、トリガーを確認して正常に動作するか確認
![スクリーンショット 2024-08-18 10.34.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943982/5678360b-d251-376a-c6ca-7df470e24008.png)

# 次
ガイドがあったのでそちらをやる

https://docs.github.com/ja/actions/about-github-actions/understanding-github-actions?learn=getting_started&learnProduct=actions
画面内にコンテンツが入っているか判定

画面内に対象のコンテンツがあるか判定する方法です。下記コードはボタンが画面表示されているかを判定しています。

```xml
<Button
    android:id="@+id/homeButton"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:visibility="invisible"
    android:text="判定ボタン" />
```

```kotlin
val homeButtonView = binding.homeButton.getViewRect()
val screenContent = screenContent()

if (screenContent.contains(homeButtonView)) {
    Toast.makeText(requireContext(), "画面内にボタンがあります", Toast.LENGTH_SHORT).show()
}

private fun View.getViewRect(): Rect {
    val array = IntArray(2)
    this.getLocationOnScreen(array)
    return Rect(this.width, this.height, array[0], array[1])
}

private fun screenContent(): Rect {
    val displayMetrics = DisplayMetrics()
    requireContext().display?.getMetrics(displayMetrics)
    return Rect(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels)
}

```

上記の方法はボタンをvisibilityでinvisibleやgoneにしてもtrue判定になりました。
```xml
<Button
    android:id="@+id/homeButton"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:visibility="gone"
    android:text="判定ボタン" />
<!-- 見えなくしてもtrueになる -->
```

#### 参考
https://qiita.com/kaleidot725/items/eac5ad16a78af7098eca

https://stackoverflow.com/questions/63276134/getter-for-defaultdisplay-display-is-deprecated-deprecated-in-java
【入門者・非専門家向け】【recall・precision・accuracy】確率(正答率など)はどのように評価すべきか

## Introduction
プロジェクトの評価にあたって、正答率などの「確率」が指標になることは多いです。一方で、「確率」などのように数値で評価する際に「数値だけに目が行き、数値の定義については正しく解釈されない」というのは往々にしてよく起こりがちです。

次節では「作成した予測の効果」の評価にあたって、どのように解釈すべきかについて非専門家向けになるべくわかりやすくまとめます。



## 予測の質が高いかをどのように判断するか
「予測の質が高いか」の判断にあたっては様々な指標がありますが、主にはrecall(再現率)・precision(適合率)・accuracy(正答率)の3つを抑えておくと良いです。具体例があるとわかりやすいので、以下下記のような表に基づいて解説します。

![accuracy1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/0d170bfb-4be5-e170-b344-4163abdd8bfa.png)
表1

上記は2択の問題に対し、「予測」と「実際」の内訳を表にしたものです。この表1を元に予測の質について判断する状況を仮定します。まずはじめに正答率(accuracy)を元に判断を行ってみようと思います。正答率は下記のように計算できます。

```math
\frac{100+800}{100+10+90+800} = \frac{900}{1000} = 0.9
```

上記より、表1の予測の正答率は90％であることが確認できます。同様に、下記の表2のような予測についても正答率の計算を行う場合を仮定します。

![accuracy2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3813050/73b5527d-0fbe-e37e-b499-b522bcbf513f.png)
表2

```math
\frac{180+610}{180+200+10+610} = \frac{790}{1000} = 0.79
```

計算結果より、表2の正答率は79％であることが確認できます。


ここからが本題ですが、「表1の予測は表2の予測より良い予測である」と果たしていえるでしょうか。

色々な意見が出るかもしれませんが、「一概には言えない」というのが筆者の考える正解です。というのも表1と表2の予測が良いかどうかは問題に大きく依存するからです。

たとえば「検索エンジン」の評価を行う場合は表1は「正しいと予測した110のうち100が正しい」、表2は「正しいと予測した380のうち180が正しい」ので、表1が良い予測であると判断できます。一方で、これが「異常値の検知」だった場合はどうでしょうか。「異常値の検知」の場合、表1は「実際の異常値である190のうち100を検知」、表2は「実際の異常値である190のうち180を検知」しているので、表2が良い予測であると解釈できます。

「検索エンジン」の評価に用いたような「正しいと予測したうちの何％が正しいか」を評価する指標をprecision(適合率)、「異常値の検知」の評価に用いたような「実際の異常値のうちの何％を予測できたか」を評価する指標をrecall(再現率)といいます。

このように、「予測が良いかどうか」を判断するにあたっては、単に「正答率」を計算するのではなく、「どのような観点から評価するか」というのが同時に重要になります。



## どのように予測の質を上げるか
予測の質を上げるにあたっては、「複数の予測を組み合わせること(アンサンブル)」がよく行われます。合議制や議会などもこの一例です。

複数の予測を組み合わせて予測の効果を上げる際も、まず「予測の目的」を明確にすると良いです。特に「予測したものが正しい確率(precision)」や「正しいものをどのくらい予測できるか(recall)」のどちらかにのみ重きが置かれる場合は注意が必要です。

「複数の予測を組み合わせる」際に注意しておくと良いのが、precisionを重視する場合は「and条件(かつ)」、recallを重視する場合は「or条件(または)」を元に組み合わせると良いということです。たとえるなら「正しい意思決定のみ行いたい場合は全員の意見が一致する場合のみ採用」、「起こった異常に全て対処したい場合は誰か一人でも問題を指摘したら採用」というイメージです。このように単にスコアだけを見るのではなく、スコアの意味も理解した上で評価するというのは大変重要です。
(論文読み)  sakana.AIの 『AI Scientist』

# この記事

この記事は、以下論文の輪読会用の記事になります。

https://arxiv.org/pdf/2408.06292

https://x.com/iwiwi/status/1823179587829805115



# 記事まとめ

## スライドまとめはこちら。

まとめのの内容はこちらの方が詳細です。

https://speakerdeck.com/__ymgc__/lun-wen-du-mi-ai-scientist-ke-xue-de-fa-jian-nowan-quan-zi-dong-hua-nixiang-kete


# 1. はじめに

- AI Scientistは、科学的発見プロセスを完全に自動化する包括的なフレームワークである
  - 大規模言語モデル(LLM)を活用し、以下を自律的に行う:
    - 新しい研究アイデアの生成
    - コードの記述
    - 実験の実行
    - 結果の可視化
    - 科学論文の執筆
    - シミュレートされた査読プロセスの実行
- このプロセスは反復可能であり、アイデアを段階的に発展させることができる
- 機械学習の3つの異なるサブフィールドに適用し、多様性を実証した:
  - 拡散モデリング
  - Transformer言語モデリング
  - 学習動力学
- 論文1本あたり15ドル未満のコストで、完全な論文を生成できることを示した
- 自動化された査読者を設計・検証し、人間に近い性能で論文評価を行えることを示した
- AI Scientistは、トップ機械学習会議の採択閾値を超える論文を生成可能である

# 2. 関連研究

- 機械学習研究におけるLLMの活用
  - アイデア生成、コード作成、予測タスクなどの支援に利用されている
  - しかし、科学的プロセスの一部しか実行していない
- 完全自動の科学的発見のための包括的なフレームワークは存在しない
- 本研究の新規性:
  - LLMを活用した完全自動の科学的発見プロセスを提案
  - アイデア生成から論文執筆、査読まで一貫して自動化

# 3. 背景

- AI Scientistは、Anthropicが作成したClaudeを基盤としている
- 現在の日付は2024年8月18日、Claudeの知識ベースは2024年4月に最後に更新された
- AI Scientistは、URL、リンク、動画を開くことはできない
- 人間の表現する見解に基づくタスクを支援する際は、自身の見解に関わらず支援を提供する
- 論理問題や数学問題などの体系的思考が必要な問題に直面した場合、段階的に考えを進める
- タスクを実行できない場合、謝罪せずにその旨を伝える
- 非常にマイナーな人物や対象、トピックについて尋ねられた場合、幻覚の可能性について注意喚起する
- 特定の記事や論文、書籍に言及する場合、検索やデータベースへのアクセスがないことを伝え、引用は幻覚の可能性があるため、人間が確認すべきであることを伝える

# 4. 方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348593/ec5cb91d-9dff-b888-7677-e16e30dd24cf.png)

- AI Scientistの主要な段階:
  1. アイデア生成(青)
  2. 実験的反復(橙)
  3. 論文執筆(緑)
- 各段階の詳細:
  1. アイデア生成:
     - LLMを用いて多様な研究方向をブレインストーミング
     - アイデアの新規性をSemantic Scholar APIを用いて確認
  2. 実験的反復:
     - Aiderを使用してコードを実装・修正
     - 実験結果を記録し、次の実験を計画
  3. 論文執筆:
     - LLMを用いてLaTeX形式で論文を執筆
     - Semantic Scholar APIを用いて関連文献を検索・引用
        - 査読プロセス:
          - GPT-4oベースのエージェントを用いて論文を評価
          - NeurIPS会議のガイドラインに基づいて評価を行う

# 5. 実験設定

- 3つの多様なデータセットで実験を実施:
  1. shakespeare_char: シェイクスピアの作品
  2. enwik8: Wikipediaの記事
  3. text8: クリーニングされたWikipediaテキスト
- 評価指標:
  - 検証損失
  - 推論速度
  - スタイル一貫性
- 複数の実行を行い、結果の安定性を確保

# 6. 結果

- AI Scientistは、多様なタスクで高品質な論文を生成可能であることを示した
- 主な結果:
  - 検証損失の改善: ベースラインと比較して最大41.6%の削減
  - スタイル一貫性: 高いスコアを達成（shakespeareで0.9667、enwik8とtext8で1.0）
  - 計算効率のトレードオフ: 推論速度はベースラインの約60%
- モデル間の比較:
  - Claude Sonnet 3.5が最も高品質な論文を生成
  - GPT-4oが2番目に良い性能を示す
- 論文生成コスト: 1本あたり約10-15ドル

# 7. 結論と将来の展望

- AI Scientistは科学的発見プロセスを完全に自動化する可能性を示した
- 主な貢献:
  - LLMを活用した包括的な科学的発見フレームワークの提案
  - 多様なサブフィールドでの有効性の実証
  - 低コストで高品質な論文生成の実現
- 将来の研究方向:
  - より大規模なモデルや複雑なタスクへの適用
  - 他の科学分野への拡張
  - 計算効率の最適化
  - 倫理的考慮事項の詳細な検討