OmniAICreator/Qiita-1.07M huggingface dataset:
本の整理 (paizaランク A 相当)：Python3解答例

[ 本の整理 (paizaランク A 相当)](https://paiza.jp/works/mondai/real_event/book_sort)

https://paiza.jp/works/mondai/real_event/book_sort

## 背景
あなたはパイザ図書館で働く図書館員です。

パイザ図書館には N 冊の蔵書があります。この蔵書はすべて 1 段からなる本棚で管理されています。そして、それぞれの本には 1 から N までの相異なる整数の ID がついています。本棚の本は ID 順に並んでいます。

しかし、ある日、あなたが蔵書の点検をしていると、本棚の本がバラバラに並べられていることに気づきました。

![スクリーンショット 2024-08-24 16.15.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527611/fa1ac61c-c8bd-50ed-041d-40bc7850d73b.png)
そこで、あなたは、次のルールに従って本を並び替えることにしました。

次の手順を N 回繰り返す。

1. i (1 ≦ i ≦ N) 回目の手順では、まず本棚の左から i 番目の位置に立つ。
2. 左から i 番目の位置にある本から、本棚の右端にある本までのうち、最も ID が小さい本の位置を歩きながら見つける。この位置を j とする。
3. i = j なら、何もしない。 i ≠ j なら、i 番目の本と j 番目の本を入れ替える。


本を取り出して入れ替えるのには時間がかかります。そこで、このルールに従って本を整理するときに、何回本を入れ替える必要があるのかを計算してください。

:::note info
例)

5 冊の本が、本棚に次の順番で並んでいたとします。ただし、数字はそれぞれの本の ID を表します。

5 4 3 2 1

このとき、ルールに従うと、次のように本が整理されます。

i = 1 のとき (1 番目の本と 5 番目の本の位置が入れ替わる)

1 4 3 2 5

i = 2 のとき (2 番目の本と 4 番目の本の位置が入れ替わる)

1 2 3 4 5

i = 3 のとき

1 2 3 4 5

i = 4 のとき

1 2 3 4 5

i = 5 のとき

1 2 3 4 5

本の交換は i = 1 のときと i = 2 のときのみ起こっているので、このときの出力は 2 となります。
:::

このコードは、パイザ図書館でバラバラに並べられた本棚の本をID順に並べ替える際に、何回本を交換する必要があるかを計算するプログラムです。

### コードの説明

1. **入力の受け取りと前処理**:
   ```python
   N = int(input())
   shelf = [int(x) - 1 for x in input().split()]
   ```
   - `N` は本の冊数を表します。
   - `shelf` は本棚に並んでいる本のIDのリストを0ベースに変換して格納します。例えば、入力が `1 3 2` の場合、`shelf` は `[0, 2, 1]` になります。

2. **位置情報の初期化**:
   ```python
   pos = [-1] * N
   for i in range(N):
       pos[shelf[i]] = i
   ```
   - `pos` リストは各本のIDの現在の位置を記録するために使用します。
   - `pos[shelf[i]] = i` により、本のID `shelf[i]` の現在の位置 `i` を記録します。

3. **本の交換の計算**:
   ```python
   ans = 0
   for i in range(N):
       if shelf[i] == i:
           continue

       ans += 1
       shelf[pos[i]] = shelf[i]
       pos[shelf[i]] = pos[i]
   ```
   - `ans` は本の交換回数をカウントする変数です。
   - `for i in range(N)` ループを使って、各本のIDがそのインデックス `i` と一致するかを確認します。
   - 本のIDが正しい位置にない場合、交換を行います。
   - `ans` を1増やし、`shelf` と `pos` の情報を更新します。

4. **結果の出力**:
   ```python
   print(ans)
   ```
   - 最後に、交換回数 `ans` を出力します。

### 例の説明

例えば、入力が次のような場合：
```
5
5 4 3 2 1
```

この場合の処理は以下のようになります：

1. **初期状態**:
   - `shelf` = `[4, 3, 2, 1, 0]`（本のIDを0ベースに変換）
   - `pos` = `[4, 3, 2, 1, 0]`（各IDの位置）

2. **交換のステップ**:
   - `i = 0` のとき、`shelf[0] != 0` なので、交換を行います。`shelf` と `pos` を更新します。交換回数 `ans` を1増やします。
   - `i = 1` のとき、`shelf[1] != 1` なので、交換を行います。再び `shelf` と `pos` を更新し、交換回数 `ans` を1増やします。
   - `i = 2, 3, 4` のときは、すでに正しい位置にあるので、交換は行いません。

結果として、交換回数は `2` となり、これが出力されます。
Csvファイル読み込みプログラム

![1000024378.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842203/c0401594-8b3e-71e5-09bf-98a1be65201e.png)


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSVファイル処理</title>
</head>
<body>
    <!-- CSVファイルを選択するためのファイル入力 -->
    <input type="file" id="csvFileInput" accept=".csv" />

    <!-- ラジオボタンでスクリプトの選択肢を表示 -->
    <div>
        <label><input type="radio" name="scriptOption" value="A"> Option A</label>
        <label><input type="radio" name="scriptOption" value="B"> Option B</label>
        <label><input type="radio" name="scriptOption" value="C"> Option C</label>
    </div>

    <!-- 選択したスクリプトを実行するためのボタン -->
    <button id="executeButton">実行</button>

    <!-- スクリプト実行結果の表示エリア -->
    <div id="result"></div>

    <!-- JavaScriptファイルの読み込み -->
    <script src="script.js"></script>
</body>
</html>



// CSVファイルが選択されたときにファイルを読み込む処理
document.getElementById('csvFileInput').addEventListener('change', function(e) {
    const file = e.target.files[0];
    const reader = new FileReader();

    reader.onload = function(event) {
        const text = event.target.result;
        const data = csvToArray(text);
        localStorage.setItem('csvData', JSON.stringify(data));  // データをローカルストレージに保存
    };

    reader.readAsText(file);
});

// 実行ボタンがクリックされたときに、選択されたオプションのスクリプトを実行
document.getElementById('executeButton').addEventListener('click', function() {
    const selectedOption = document.querySelector('input[name="scriptOption"]:checked').value;
    const data = JSON.parse(localStorage.getItem('csvData'));  // 保存されたデータを取得
    processCSVData(data, selectedOption);
});

// CSVを配列に変換する関数
function csvToArray(str, delimiter = ",") {
    const rows = str.split("\n");
    return rows.map(row => row.split(delimiter));
}

// CSVデータを処理し、選択されたオプションに応じてスクリプトを実行する関数
function processCSVData(data, selectedOption) {
    data.forEach(row => {
        const [condition, value] = row;

        if (condition === selectedOption) {
            switch(selectedOption) {
                case 'A':
                    runScriptA(value);
                    break;
                case 'B':
                    runScriptB(value);
                    break;
                case 'C':
                    runScriptC(value);
                    break;
                default:
                    console.log('Unknown option');
            }
        }
    });
}

// スクリプトAの内容
function runScriptA(value) {
    document.getElementById('result').innerText = 'Running Script A with value: ' + value;
    // ここにスクリプトAの処理を記述
}

// スクリプトBの内容
function runScriptB(value) {
    document.getElementById('result').innerText = 'Running Script B with value: ' + value;
    // ここにスクリプトBの処理を記述
}

// スクリプトCの内容
function runScriptC(value) {
    document.getElementById('result').innerText = 'Running Script C with value: ' + value;
    // ここにスクリプトCの処理を記述
}
(4話) 熱波師おかんがsnowflakeでSQLに挑戦！クエリってなんやねん？

こんにちは、サウナ熱波師を目指しながらsnowflake勉強中アキコです！IT初心者のブログに今日もお付き合いありがとうございます。3話までの記事にいいねつくけて下さっているのに気がついて、飛び上がるほどうれしいです。本当にありがとうございます！

私は未開拓のサウナを探すのも楽しみの一つになってます。今は日本に住んでる外国の方々の生活をサポートする仕事を続けているんですが、将来的には熱波師になる夢を持っていて、そのための視察と勉強を兼ねて、いろんなサウナを巡っているんです。

先日も、「ここは絶対にいい！」と思えるサウナを見つけたんです。自分が楽しむのが80割、将来のためのこっそり視察2割も兼ねてます。先日テレビでフィンランド式サウナの特集をみかけて大興奮。もう行く前からワクワクしてました。ヴィヒタ（本場フィンランドで使われる、葉っぱ）もあるのか～、って。水風呂もバッチリそうで、勝手にスケジュールくんで期待してたんです。

で、現地に着いて、受付で予約を確認しようとしたら、なんとそこ、男性専用やったんです…。その瞬間のがっかり感、わかりますでしょうか。まるで子どもが目の前のケーキを見て「いただきます」と思った瞬間に、親から「ダメ、これは大人専用」って言われたような感じでした。心の中で「なんでやねん！」と叫んでしまいました（受付の方には言ってません）。

次こそはちゃんと確認してから行かないとあかんなと反省しつつも、こういうアクシデントも含めて、サウナ探しは楽しいですね。でも、やっぱり女性も利用できる素敵なサウナがもっと増えてくれたら嬉しいなぁと、切に願ってます。


さて、今回はSQLについてです。当たり前ですが、最初はさっぱりわかりませんでした。「最初は」と書きましたがこれを書いているいまもさっぱりわかっていません。
SQLですが私は最初エスキューエルと呼んでいました。今度の記事で紹介する外国の方の講座では「シークェル」と発音していたのを知り、へえ～と思っていたのですが、友人に聞くとエスキューエルじゃない？とのこと。どちらが正しいのでしょう。少し検索するとどっちでもいいみたいですね。

勉強しはじめは、「図解まるわかり データベースのしくみ」という本を手に取りました。絵が多くて、なんとなく雰囲気はつかめたけど、それでもまだわからん…。
でも、中身はとてもいい本です、こんな私でもイメージがついたくらいいい本です！

https://www.shoeisha.co.jp/book/detail/9784798166056


次に、本で出てきた言葉をより詳しく理解するためにインターネットでSQLについていろいろ調べました。でも、どうにもピンとこない。基礎の基礎を理解できてないからですよね。

そんななか、佐々木　真さんのブログはすごくわかりやすかったです！

https://wa3.i-3-i.info/word133.html

ほかにもなんでやろうと考えたら、これは実務経験がないからや！と気づきました。むりやりかもですが。SQLって、理屈だけじゃなくて実際に使ってみないと分からんもんなんですね。と自分を納得。


そこで、私は考えを切り替えました。「これは試験の中で落としてもしゃあないな」と。完璧を目指すのは大事やけど、できひんところを無理にやろうとしてもストレスがたまるだけやし、得意な分野をつくって点を取ればいいんやって。なので、SQLの基本操作についてはさらっと勉強しつつ、Snowflake特有の機能についてもっと深く理解することにシフトしました。実務として本業でやっていくにはそんな考えではあかんと思うんですが、そうしました。

ということで、SQLの基本操作や文法については、私にとってはちょっと異次元の世界。理解して噛み砕いて説明するのは完全にギブアップです。正直、SQLをわかりやすく説明できる日が来るかはわかりませんが、その時には熱波師として汗をかきながら解説しているかもしれません！

私はこれからも、自分が理解できた範囲で、試験対策のポイントにフォーカスしてお話ししていきますので、どうぞお付き合いください。それでは、引き続き頑張りましょう！
AspectRatioFilterのaspectRatioを動的に変更する

## はじめに
AspectRatioFilterは縦横比を維持しながら画面に隙間なくImageを表示するためのコンポーネントですが、表示するImageの縦横比を前もって設定する必要があります。なので縦横比が違う画像を動的にImageに設定するなどの場合は当然そのままでは縦横比が合わなくなります。僕自身ここで詰まってしまったので解決方法を書こうと思いました。
## 結論
Sprite.texture2d.width,Sprite.texture2d.heightを使います。

:::note warn
Sprite.texture2d.width,Sprite.texture2d.heightはint型なので縦横比を求める際は(float)をつける必要があります。
:::

#### 実装例

SourceData.LoadBackGround[]: AssetReference[]
```c#:Test
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cysharp.Threading.Tasks;
using UnityEngine.AddressableAssets;
using UnityEngine.UI;
using UnityEngine.ResourceManagement.AsyncOperations;
namespace Test
{
    public static class LoadManager 
    {
        private static AsyncOperationHandle<Sprite> handle;
        public static async UniTask LoadActionAsync(SourceData data, Image image, GameObject obj, AspectRatioFitter filter)
        {
            int num = Random.Range(0, data.LoadBackground.Length);
            handle = Addressables.LoadAssetAsync<Sprite>(data.LoadBackground[num]);
            await handle.Task;

            if (handle.Status == UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationStatus.Succeeded)
            {
                image.sprite = handle.Result;
                var texture2d = image.sprite.texture;
                float aspect_ratio = (float)texture2d.width / (float)texture2d.height;
                filter.aspectRatio = aspect_ratio;
                obj.SetActive(true);
            }
            else
            {
                Debug.LogError($"Failed to load Json: {handle.OperationException.Message}");
            }

            await UniTask.Delay(System.TimeSpan.FromSeconds(2));
        }
    }
}
```
【日記】AWSで作ったものが消えてて焦った話

# ネタバレ
作ったものはリージョン毎に管理されているらしい。
普段から使ってる人からしたら当たり前なんだろうけど、焦ったぁ……😣

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1773132/4956bb0d-9871-a457-112a-68d8ed4be958.png)

おわり
VBAのLong型は大抵のプログラミング言語のint型

# はじめに
仕事でVBAを使うことも多いのでVBAの数値型について記事にします

## VBAのLong型は大抵のプログラミング言語のint型
VBAのLong型の定義は以下になります。

>Long (長整数型) 変数は、-2,147,483,648 から 2,147,483,647 までの符号付き 32 ビット (4 バイト) 数として格納されます。

大抵のプログラミング言語のint型の定義ですね

## VBAのInteger型の定義
VBAのInteger型の定義は以下になります。

>整数型の変数は、-32,768 から 32,767 の範囲の 16 ビット (2 バイト) の数値として格納されます。

JavaやC#ではshort型ですね

## 最後に
数値のデータ型について簡単にまとめました。
webクライアント側のテーブル

+---------+-----------+--------------+--------+
| タスクID | タスク名    | 期日         | ステータス |
+---------+-----------+--------------+--------+
|    1    | タスク1    | Sun Sep 01 2024 | 未完了   |
|    2    | タスク2    | Mon Sep 02 2024 | 完了     |
|    3    | タスク3    | Tue Sep 03 2024 | 未完了   |
+---------+-----------+--------------+--------+


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Task Manager</title>
</head>
<body>
    <h1>作業リストとスケジュール管理</h1>
    <table border="1" id="taskTable">
        <thead>
            <tr>
                <th>タスクID</th>
                <th>タスク名</th>
                <th>期日</th>
                <th>ステータス</th>
            </tr>
        </thead>
        <tbody>
            <!-- タスクがここに表示されます -->
        </tbody>
    </table>

    <script src="script.js"></script>
</body>
</html>

*//script.js source//*
class Task {
    constructor(taskID, taskName, dueDate, status) {
        this.taskID = taskID;
        this.taskName = taskName;
        this.dueDate = new Date(dueDate);
        this.status = status;
    }

    updateStatus(newStatus) {
        this.status = newStatus;
    }
}

class TaskManager {
    constructor() {
        this.tasks = [];
    }

    loadTasks(taskData) {
        taskData.forEach(task => {
            const newTask = new Task(task.TaskID, task.TaskName, task.DueDate, task.Status);
            this.tasks.push(newTask);
        });
        this.renderTasks();
    }

    renderTasks() {
        const tableBody = document.getElementById('taskTable').getElementsByTagName('tbody')[0];
        tableBody.innerHTML = ''; // テーブルを初期化

        this.tasks.forEach(task => {
            let row = tableBody.insertRow();
            row.insertCell(0).innerText = task.taskID;
            row.insertCell(1).innerText = task.taskName;
            row.insertCell(2).innerText = task.dueDate.toDateString();
            row.insertCell(3).innerText = task.status;
        });
    }

    updateTaskStatus(taskID, newStatus) {
        const task = this.tasks.find(t => t.taskID === taskID);
        if (task) {
            task.updateStatus(newStatus);
            this.renderTasks(); // ステータス更新後、再レンダリング
        } else {
            console.log(`Task ${taskID} not found`);
        }
    }
}

// エクセルデータのシミュレーション
const excelData = [
    { TaskID: 1, TaskName: "タスク1", DueDate: "2024-09-01", Status: "未完了" },
    { TaskID: 2, TaskName: "タスク2", DueDate: "2024-09-02", Status: "完了" },
    { TaskID: 3, TaskName: "タスク3", DueDate: "2024-09-03", Status: "未完了" }
];

const taskManager = new TaskManager();
taskManager.loadTasks(excelData);

*//script.js source//*
Time.timeScaleの変更ではまった

## はじめに
最近Unityでゲーム作成をやり始めたので、備忘録としてはまったところを記載しようと思います。
今回はUnityで一時停止するときに使うTime.timeScaleについて記載します。

## Time.timeScaleとは
上記にも書いた通り、ゲームを一時停止するときに利用する。
Time.timeScale=0にすれば、時間経過が止まりオブジェクトなどが移動しなくなる。
※ただ気を付けないといけないのは、Update()自体は止まっているわけではない。

Time.timeScale=1にすれば、時間が戻って、オブジェクトを再度動かせる。

## はまった問題
Update内にて、ある条件のとき、Time.timeScale=0にして一時停止
ボタンクリック（再開ボタン）を押したときに、
Sceneを再読み込み、Time.TimeScale=1にして動きを再開させる設計とした。

Time.deltatimeが0のままで、オブジェクトが動かなくなった。

## 解決方法
Sceneを読み込んだあとの、オブジェクトのStart()内で、Time｡timeScale=1にすればTime.deltaTimeも正常に更新されるようになった。

## 原因
今回、同じスクリプト(再起動ボタンのクリック処理)でSceneを読み込むことと、timeScale=0をｓｙした。おそらくこれだと、読み込む前のSceneでtimeScaleを更新して、新しく読み込んだSceneではその内容が反映されなかったのかと思われる。
今回は再起動目的で同じSceneを読み込む処理だったため、気付くのが遅れた。
mruby/cのタイマー

mruby/cは複数のスクリプトを実行することができます。そのためMRBC_NO_TIMERを指定しない場合、時分割するために1msecのタイマー割り込みを使用します。

通常のスクリプトを一本実行しているときは、割り込みと通常処理が動いています。通常処理ではmrubyタスクを実行しています。

![RX-WAKE2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b9315e7e-ee3d-0eb4-bce2-33138f3d3d60.png)

割り込み処理ではmrbc_tick()を呼んでmruby/cの処理をします。

mruby/cにはデフォルトで組み込みmethodのsleepとsleep_msがあります。

sleepすると処理対象のmrubyタスクがなくなるので通常処理でhal_idle_cpu()を呼んで次の割り込みまで省電力モードに入ります。RXマイコンの場合waitというインストラクションを使います。

![RX-WAKE1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/a375d36a-398d-90fb-0275-6dab9ca012e2.png)

sleepが終了するとwaitは呼ばれなくなります。

テストスクリプトを書いてみました。

```ruby
#
# built in method sleep test
#

def print(val)
  val.to_s.each_char do |n|
    serial_write(n.ord)
  end
end

begin
  serial_init
  loop do
    serial_write(0x2a)
    sleep 1
  end
rescue StandardError => e
  print e
end
```

動かしたところRX210でもRX631でも止まってしまいます。

RXマイコンのwaitは特権命令でユーザーモードで実行すると例外が発生していました。このためユーザーモードに入らないようにすることがitocさんの資料にあり、それで解決しました。

組み込み用途では常に特権（スパーバイザー）モードが一般的のようです。

mruby/cの複数の処理を動かせる仕組みはリアルタイムOSを意識したものなのかもしれません。

RX210はこれで動いたのですが、RX631はUSBの処理が動かなくなったので、hal.hの割り込み制御を外しました。正しい修正かどうかはわかりません。ユーザーモードと特権モードでは割り込みの制御が違うのかもしれません。
WSL2でmnt以下のディレクトリでLaravelを使って開発していたら良くなかった話

WSL2環境で作業するときに、Windowsがインストールされているディレクトリ(WSLのホームディレクトリがある、ローカルディスクCのこと）は容量がいっぱいになってほしくなかったので、外付けのHDD(`/mnt/e`)以下で作業をしていたら色々不具合がでてきたときの備忘録です

# 結論
`/mnt/`以下のディレクトリで作業しないで、WSL2のホームディレクトリ(`~/`)以下で作業をする！！！

以下の記事にどういった理由なのかをまとめたので、気になる方はどうぞ！

https://qiita.com/curacao/items/1aa5b0be8f8485d1fb1a


# 環境
- WSL2
- Windows11
- 外付けHDDにディレクトリを作り作業をしていた
- `/mnt/e/`の中にプロジェクトを作っていた
- 外付けHDDのファイルシステムは**NTFS**だった

# 終わらない処理、謎のエラーからの脱出
まずは事の発端を。
Windowsがインストールされているストレージ(ローカルディスクC)容量がいっぱいになってほしくなく、外付けHDDでプロジェクトを作成して作業をしていた。
そんな時、Laravelを使う案件があり、調べながらやっていたところ何故か処理が完了しない・・・
具体的には
1. `composer create-project laravel/laravel hoge-app`をした
2. 途中までは進むが途中で以下のようなエラーがでる
```
install of fakerphp/faker failed
    Install of nesbot/carbon failed
    Install of league/commonmark failed
    Install of laravel/framework failed
    Install of nikic/php-parser failed
    Install of psy/psysh failed
    Install of hamcrest/hamcrest-php failed
    Install of mockery/mockery failed
    Install of nunomaduro/collision failed
In Filesystem.php line 314:
  Could not delete /mnt/e/hoge-app/vendor/composer/5178dda8/briannesbitt-Carbon-bbd3eef/src/Carbon/Lang:  
```
という感じになり、
これは何回やっても同じ結果になった

## 色々調べて試したこと
調べると全く同じというのは見つけれなかったが、いくつか試せそうなことはあったので色々試してみた
- `composer clear-cache` : キャッシュのクリア
- `composer self-update` : アップデート
- `php -d memory_limit=-1 /usr/local/bin/composer create-project laravel/laravel hoge-app` : メモリの制限を一時的に開放
- プロジェクトを作成するディレクトリの権限確認
- WLS2の設定を作成してメモリリミット解除(~/.wslconfig)
- 失敗してもあきらめずにプロジェクトのルートに移動してしつこく`composer install`
・・・等々。。。
他にも調べて出てきたことは一通り試したが、結果は変わらず。

## Windows Desktop Dockerのおかげ
何もやってもうまくいかず、もう燃え尽きた状態でした。
そこで別の作業を一旦やったら何か変わるかも!!!(エンジニアあるあるだと信じたい)と期待を込めて、`Docker`も使ってみたかったのでインストールしたり環境構築をしていました。
すると設定項目の中に **WSLと統合** というワードがでてきました。
ここでふと思いまして、もしかしてWSLとWindowsでは何か壁があるのでは？と思い調べました

## WSLのホームディレクトリ以下でプロジェクトを作成
今までは単純に`/mnt/e`のような外付けHDDで作業をしていましたが、一旦何か変わるかもと思い`~/projects`で新たに`composer create-project laravel/laravel hoge-app`のコマンドでLaravelプロジェクトを作成。そうすると、
**何も問題なくあっさり完了**　してしまいました。

何故？という点に関してなのですが、こちらは別記事にまとめたので気になる方は見てみてください！

https://qiita.com/curacao/items/1aa5b0be8f8485d1fb1a

# 終わりに
今まではWordpress関連の制作が多く、ローカルでテストするにしてもシンボリックリンクでApacheの公開ディレクトリに繋げていました。
Laravelなどは普段使っていなかったので全くこの問題に気づくことがなく数年過ごしていました。
是非同じ悩みを抱えてる人がいたら、役に立てたらと思います！！！
WSL2を使う時には、ホームディレクトリ(~/)以下にプロジェクトを作った方が良いという話

WSL2のUbuntuを使って開発を行っている時には、WSLのホームディレクトリ(~/)にプロジェクトを作って開発をした方がいいよ！という話です。

# WSLとは？WindowsとWLSは別々のシステム(OS)
そもそもWSL(Windows Subsystem for Linux)とは、**Windows上でLinux環境を使える仕組み**です。
なのでWindows上でLinuxが動いているだけで、これらは別々のシステムです。

# WSLとWindowsとの壁
そもそも違うシステムなので円滑なやり取りが難しく、パフォーマンスが落ちます。
WSLならWSL同士、WindowsならWindows同士のやり取りの方が早いです。
では実際どのような場合に壁が出てきて、何が壁になっているのか？

## ファイルシステムの違い
WSLはLinuxなので、Linuxに適したファイルシステム(ext4など)
Windowsも同様に、Windowsに適したファイルシステム(NTFS)
それぞれに最適化されています。
NTFSとLinuxのファイルシステムでは、それぞれ処理の方法が異なるため、WSLからNTFSにアクセスすると様々な問題が発生することがあります。

### パフォーマンスについて
例えば日本語と英語を例にしてみるとわかりやすいかもしれません。
WSLは英語を読み書きできます。
Windowsは日本語を読み書きできます。
お互い相手の言語はわからないので、コミュニケーションや、やり取りをする際には、間に翻訳機能が必要になるイメージです。
この場合には、会話にラグなどが発生したり、ひと手間必要だったりとパフォーマンスが落ちます。
最短距離で目的に到達することはできないので、遠回りしているイメージですね、そのため時間もかかります(I/Oのオーバーヘッド)

### ファイル監視について
先ほどの例のように、お互いが理解している言語が違うとすべてを理解できないので、いくら翻訳機能を使っていてもニュアンスの違いやネイティブなものは見逃してしまったり誤った解釈をすることもあるでしょう。
WSLからNTSFを見ている時にも同様に、気づけない事があります。それが変更の検知などです。
例えば、`vite`や`Webpack`のようなもので`watch`機能（ファイルの更新を検知して処理する）を使いたくても正しく動作しない(検知ができないことがあります。

# 解決策
ここまででわかったように、WSLとNFTSでのやり取りには、１つ手間がかかりパフォーマンスが悪くなるという事でした。
これを解決するためにいくつかの方法があるので紹介してみます

## WSL環境のホームディレクトリで作業をする
Linuxのファイルシステム内で作業をすると、間に無駄がないので余計な処理をする必要がなく早く正確にやり取りをすることができます。
実際にはホームディレクト(`~/`)以下で作業ディレクトリを作って開発を行うといいでしょう

## WSLと理想の形でやり取りが可能なファイルシステムを導入
具体的にはHDD/SSDの増設です。増設時にNFTSではなく、Linuxのネイティブファイルシステムであるext4でフォーマットします。
これによりWSLからのアクセスなどのパフォーマンスを下げることなく作業ができます。

Microsoftの公式でもやり方があるので、気になる方は参考にしてみてください!
[Linux ディスクを WSL 2 にマウントする](https://learn.microsoft.com/ja-jp/windows/wsl/wsl2-mount-disk)

# 終わりに
WSL2で作業するときにはきちんとWSL2の管理下で作業しようねって話ですね！
調べてもなかなかここにたどり着けなかったので、誰かの役に立てればと思います！
Qiitaのメールアドレス認証が出来ない

# はじめに
Qiitaのメールアドレス認証メールは正常に届いたものの、認証リンクをクリックしても認証が完了せず、困ってしまいました。

# エラーの原因
Qiitaアカウント作成時に登録したメールアドレスで認証する前にメールアドレスを変更してしまったことが原因です。

- その結果、変更後のメールアドレスで認証を試みても、エラーメッセージは表示されないが、認証がされない状態になります。

# 解決方法
1. Qiitaの登録メールアドレスを<font color="DeepSkyBlue">_アカウント作成時のメールアドレス_</font>に戻します。
1. <font color="DeepSkyBlue">_アカウント作成時のメールアドレス_</font>で、メールアドレス認証を行います。
1. 認証が完了したら、Qiitaの登録メールアドレスを変更し、<font color="MediumSpringGreen">_新しいメールアドレス_</font>で認証を行います。

- 次の記事で同じのエラーに直面しているので参考にしました。

https://qiita.com/Teba_eleven/items/a042569ebdba2ff62486

# 終わりに
今回のケースとは異なる状況でも、Qiitaのメールアドレス認証が失敗することがあるようです。
参考として幾つかの記事を載せておきます。
初投稿の記事のため、読みづらい箇所があるかもしれませんが、何卒ご容赦ください。

# 参考記事

https://qiita.com/Teba_eleven/items/a042569ebdba2ff62486

https://qiita.com/FUKUTAKA7938/items/694218049f54efc6cd83

https://qiita.com/Kawaguchi410/items/b60f40f3c261ea770877
VSCodeの鬱陶しい設定を排除する方法

## VSCodeのありがた迷惑な機能。。

### 1.サジェスト機能
ちょっとしたMTGのメモなどで使うことも多いVSCodeですが、サジェスト機能というものがあります。
特に(個人的)一番厄介なのが中黒などの記号に反応してサジェストしてくるヤツ↓
![スクリーンショット 2024-08-25 011523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/341cc99e-7ea2-7b0c-b415-cfc196ebe211.png)
ここでは3行目に中黒を打っただけで、1行目の内容が出てきて、しかも大体のサジェスト機能は使用する際のキーがTabなことが多いですが、VSCodeは初期設定でEnterのため、確定しようとすると勝手にサジェスト内容が採用されてこうなる、、、↓
![スクリーンショット 2024-08-25 011507.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/6cafd280-a9f3-007a-4fe6-d49756e4bb1b.png)
これ、急いでるときとか地味にいらいらしますよね。
これの削除方法は、VSCode上の検索欄に>OpenUserSettings(JSON)と入力し、settings.jsonを開く
↓
jsonなので、適当な場所に下記記述を追加することで余計なサジェストがなくなり普通に使うことができます。
```:json
"editor.quickSuggestions": {
	"other": false,
	"comments": false,
	"strings": false
}
```

### 2.制限モード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/e60706f7-9c1c-2c2a-f9e8-62d2171e8932.png)
先ほどのサジェストと違って、こちらは保護するためのモードなので一概に悪と決めつけることはできない機能ですが、ファイルサーバーなどのファイルを編集しても出てくるので正直邪魔なことが多いです、制限モードで開かれると拡張機能が使えなくなったりといろいろ不便なのでわざわざ手動でManage→trustとしなくてはなりませんが、いろんなサーバーを行き来する必要がある場合は邪魔なので消したくなります。
解決策は、こちらもsetting.jsonに下記記述を追加することで制限モードで開かれることはなくなります。
```:json
"security.workspace.trust.untrustedFiles": "open",
```

## おわりに
今回紹介した2つは、個人的に特に邪魔なものを紹介しました。
ほかにも「○○は許可されているホストのリストにありませんでした」がサーバーごとに出てきたりしますが、これを消すのは公式非推奨となるので、いったん書かないでおきます。
ほかにも邪魔かつ消すのに苦労した設定があれば追記していきます！
ソケットファイルとは？

## ``` 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)```というエラーに遭遇した。

>env：rails5 mysql5.7.32
>
>As a supplement, I also encountered the problem 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)', but the reason for the error was caused by the socket files
>
>database.yml
>
>default: &default
  socket: /tmp/mysql.sock
login mysql mysql -uroot -p then show variables like 'socket';
>
>+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| socket        | /var/run/mysqld/mysqld.sock |
+---------------+-----------------------------+
so change database.yml
>
>default: &default
  socket: /var/run/mysqld/mysqld.sock # The line can also be deleted
  
https://stackoverflow.com/questions/41200297/mysql2error-cant-connect-to-local-mysql-server-through-socket-tmp-mysql-so#:~:text=Add%20a%20comment-,8,/mysqld/mysqld.sock%20%23%20The%20line%20can%20also%20be%20deleted,-Share

ソケットファイルの変数を`show variables like 'socket'`で調べて変更するといいらしい。
`mysqladmin --socket=/path/to/socket version`で動作しているか確認できるらしいが
パスワードがなかったからアクセスできなかった。
また今度にしたい。

## ソケットファイルとは？
>サーバーがローカルクライアントと通信するために使用する UNIX ソケットファイル
>
>UNIX の一部のバージョンでは、/tmp ディレクトリ内のファイル、または一時ファイルに使用されるほかの同様のディレクトリ内のファイルをだれでも削除できます。 ソケットファイルがシステム上のそのようなディレクトリに配置されている場合は、問題となることがあります。

https://dev.mysql.com/doc/refman/8.0/ja/problems-with-mysql-sock.html#:~:text=%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8C%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB,%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

socket:電球などの〕受け口、ソケット　出典　英辞郎

### unixドメインソケットとは
>UNIXドメインソケットです。このソケットは一つのマシン上のプロセスのみを通信させる方法です。

https://gihyo.jp/book/2022/978-4-297-13148-7

>通常インターネットで利用しているソケット通信（INETドメインソケット通信）とは異なり、ネットワーク経由ではないローカルマシン上のプロセスが利用するソケットが、UNIXドメインソケットである。

https://mypage.otsuka-shokai.co.jp/contents/business-oyakudachi/words/unix-domain-socket.html#:~:text=%E9%80%9A%E5%B8%B8%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E9%80%9A%E4%BF%A1%EF%BC%88INET%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E9%80%9A%E4%BF%A1%EF%BC%89%E3%81%A8%E3%81%AF%E7%95%B0%E3%81%AA%E3%82%8A%E3%80%81%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E7%B5%8C%E7%94%B1%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%9E%E3%82%B7%E3%83%B3%E4%B8%8A%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8C%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E3%81%8C%E3%80%81UNIX%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82

# 感想
通信するために使うものなのか。
【新時代の開発環境】Haystack-editorでモニター数をかさ増しする

## Haystack-editorとは

[公式ページ](https://haystackeditor.com/#home)

![tmp2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/e10396a1-da52-c425-23cc-40efc77d92f6.gif)
なんだか，VRみたいなIDEですね。

- VSCodeからForkされているのでExtensionsや設定が引き継げる。
- Mac OS, Linux, Windowsで使える。
ということなので導入は割と容易そうです。

> Does Haystack log or send my code anywhere?
> We do not store ore log your code anywhere. We do sedn snippets of your code to Open AI as input for our navigational copilot if you opt into it. BY default, you are opted out.
> Haystackは私のコードをどこかに記録したり送ったりしますか？
> あなたのコードをどこかに保存したり、ログに残すことはありません。私たちは、あなたがそれを選択した場合、私たちのナビゲーション・コパイロットの入力として、あなたのコードのスニペットをOpen AIに送信します。デフォルトではオプトアウトされています。

ということなので，企業でも安心して使えそうです。

---

## Download and install

[公式ページ](https://haystackeditor.com/#home)からダウンロードできます
自分はUbuntuを使っているのでLinux版を選択しました。
zipを解答後に

```
./Haystack+Editor+Linux/Haystack/bin/haystack-editor 
```
を実行したら動きました。
VSCodeのExtensoinsはとりあえず，全部引き継いでみましたが，何個か動かないのはありそう

---

## 使ってみる

とりあえず，Extensionsを開いて見ましたがきちんと全画面スクロールができました。
今までだとExtensionsの説明を見ながら，settings.jsonをいじろうとすると画面分割する等しないといけませんでしたが，Heystackをつかえば1画面を効率的に使えそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/c2a8bcc0-e007-9784-e933-be971004aee4.png)

また，関数の実装が知りたくて，関数の実装にジャンプする時があると思うのですが，Haystack-editorを使うとミニエディタを同じ画面上で開いて表示してくれるかつ線でどこの実装か示してくれるのですごくコードを読むのが捗りそう。

---

## VSCodeと設定を共有するのをやめたいとき
- ~/.haystack-editor/を消したら設定がリセットできた。


## 困っているところ

- 現状vim/NvimのExtensoinsを入れるとActivate Extensoinsがでて文字が打てなくなる。
→解決したら追記予定
MAFFT - TrimAl - RAxML-NG - FigTree を使って分子系統樹を作る

## インストール等

```
brew tap brewsci/bio
brew install mafft
brew install raxml-ng
conda install -c bioconda trimal 
conda install -c bioconda modeltest-ng
```

Figtreeのインストール
Figtreeは系統樹ファイルの可視化と編集ができるソフトウェア
http://tree.bio.ed.ac.uk/software/figtree/


ちなみに
ETE toolkitでワークフローを簡略化しようと思ってやってみたけどinstall errorでete3を起動できない，python3.5以降だとだめっぽい，pipでもanacondaでもダメ
参照：https://qiita.com/aical/items/2231198d3d75e72bee39



まあ系統樹作るだけならそんなに手間じゃないのでいっか

### 配列を適当にとってくる
NCBIでrat, torafugu, medakaのsodium chanel voltage-gated alpha subunitを調べる
大体9-10個くらいの遺伝子がある，aaが違いそうなバリアントも含めてアミノ酸配列をとってくる
ついでに外群としてdrosphiaのsodium chanelをとってきた


### 前処理
mafftでアライメント
`mafft --auto input.txt > align_res.aln`

trimalでトリミング
`trimal -in align_res.aln -out out_trimal.aln -htmlout out.html -automated1`

モデルの選定
`modeltest-ng -i out_trimal.aln -o test_res -T raxml -t ml -r 123413 -p 12 -d aa`
 
☆オプション
-T　後解析で用いるsoftware（指定しなくても良い）
-t ml 最尤法
-r　random seed
-p thread数
-d nt/aa

```
                         Model         Score        Weight
----------------------------------------------------------
       BIC               LG+G4    37887.7915        0.5968
       AIC             LG+I+G4    37506.8821        0.8959
      AICc             LG+I+G4    37516.8821        0.8392

```

LG+I+G4がいいのかな？
本当はRAxMLで自動でモデルを推定してtree作成するPROTGAMMAAUTOがあるはずなのだが，今回はmodelTest-NGで最適モデルを推定してみた

MEGA10でモデル推定してたときより圧倒的に速い，100配列くらいいれても数分で終わる，神


いよいよRAxMLで系統樹を作る
`raxml-ng --msa out_trimal.aln --all --model LG+I+G4    --bs-trees 100 --threads 16`

すぐ終わる，速い，神
なんかいっぱいファイルが出来た
.phylip.raxml.supportをFigtreeで開く，node labelsにチェックを入れてlabelを選択するとbootstrap値が表示された系統樹を得ることができる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352860/a5fd4335-ab28-c4f3-374b-cd0169d16a1b.png)

色を変えたり，進化距離を表すスケールバーを表示したり，rootを変えたり，枝を回転したり，etcできる

まあ形だけ決めて，後はイラレなどのやり慣れた編集ツールで手直しするのがいいらしい（伝聞）
【C#】【Dapper】Sequence contains no elementsにはまった話

## 環境
C# 12.0
.NET 8.0.4
Dapper 2.1.35
Visual Studio 2022 (17.9.6)

## ある日エラーが発生する

ある日を境にAPIが500 Internal Server Errorを返すようになりました。

出力されているエラーメッセージを見ると

```text
sequence contains no elements
```
「シーケンスに要素が含まれていない」と怒られています。

## 原因は？

```C#
QueryFirst<T>
```
を使って1件だけ取得していた部分で
```text
InvalidOperationException
```
上記の例外を送出していたことでした。

`QueryFirst<T>` の仕様を詳しく見てみると、

1. 取得したデータが1件以上あるときは先頭のデータをT型にマッピングして返す
2. <font color="red">データが0件の場合</font>は`InvalidOperationException` 例外を送出する

ということでした。

データが0件だったため例外を送出していたということです。

## どうやって修正するか

方法1:取得データが0件であることが仕様として正しい場合
`QueryFirstOrDefaultAsync<T>` を使う。
`QueryFirstOrDefaultAsync<T>` は取得できたデータが0件の場合、nullが返ってくる。
そのため、nullデータを適切に処理すればOK

方法2:取得データが0件であることが仕様として間違っている場合
例外処理をする
```C#
catch( InvalidOperationException ex)
```
で例外を受け取って適切な処理をする


## まとめ
データを1件だけ取得したいけど、0件の時もある場合は `QueryFirstOrDefaultAsync<T>` を使おう
そして仕様はちゃんと確認しよう(戒め)

## 参考文献

https://www.learndapper.com/dapper-query/selecting-single-rows#dapper-queryfirstasync
動的計画法（Dynamic Programming）Vol.1

## 自己紹介
こんにちは！buridaikonです。ド素人の私が勝手に備忘録を残しているだけなので、温かい目で見ていただければ幸いです。
## 内容
<h3>このページの説明</h3>

　ここは動的計画法を用いる問題を集めた記事です。[アルゴ式](https://algo-method.com/)の問題を引用させていただきました。

<h3>動的計画法（以下DPと略記）とは何か？</h3>
　<d1>DPとはアルゴリズム設計技法のひとつです。問題の小さな部分問題を解いていくことで大きな部分の問題を解くことができることを目的としています。</d1>

<h2>問題</h2>

[問題「数値の例」](https://algo-method.com/tasks/302)

**例１**
```:入力例１ 
6 1 1
```
```:出力例１
8
```
**例２**
```:入力例２
31 41 59
```
```:出力例２
49
```

<h4>解答</h4>

```cpp
/* 「「　動的計画法　」」*/

#include <bits/stdc++.h>
#include <algorithm>
#include <vector>

using namespace std;

int main() {
    int n, x, y;
    cin >> n >> x >> y;

    vector<int> vec(n);

    vec[0] = x, vec[1] = y;

    for (int i = 2; i < n; i++) {
        vec[i] = (vec[i-2] + vec[i-1]) % 100;
    }

    cout << vec[n-1] << endl;

    return 0;
}
```

問題を見ると[再帰関数](https://qiita.com/drken/items/23a4f604fa3f505dd5ad)を用いて処理することを考えてしまうかもしれませんが、そうすると計算量が多くなってしまい、[TLE](https://atcoder.jp/contests/abc074/glossary?lang=ja)になる可能性が高いです。
 この問題では、3項間にわたる処理を一つにまとめることで、簡潔にしています。再帰的な求め方ではなく、DPの考え方で工夫をしたため計算量を減らせていることに着目してください。
 </d1>
ここまで読んでいただき、ありがとうございます！
今回はC++のみで記述しましたが、機会があれば他の言語でも解説していきたいと思います
**実際に手を動かして**やってみましょう！
PythonのCeleryを試してみた

## これは何?
- pythonのCeleryパッケージをローカルにて動かしてみます。
- 今回はDockerのRedisを使用し、Celeryが動作することを確認できました。


### Celeryとは

 Celeryのイメージ

![Celery.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/5c2dbda5-71cc-2002-11d9-02c2e0a70102.png)


- Task
    - Celeryでの実行のために作成されるタスク。
- Broker
    - 作成されたタスクの置き場所。タスクはWorkerに実行されるまで、ここで待機する。
- Worker
    - Brokerからタスクを持ってきて実行する。Celeryのインスタンスが役割を担う。
- Backend
    - 実行されたタスクの結果を保存する場所。

図にもある通り、Celeryを実行するWorkerはTaskを作成するAppとは別になります。そのため、Appと分けた非同期処理を簡単に実現することができます。

### Celeryの実装

今回は、brokerとBackendにRedisを利用します。

以下の4つをそれぞれDockerとして作成します。

- Taskを作成する元のpython Application
- Broker、BackendとなるRedis
- Celery workerを実行するpython環境
- Celeryのモニターを行う `flower` を実行するpython環境

### 実際に試してみる

Githubディレクトリからコードをクローンし、以下を実行します。

https://github.com/ZawaPaP/Celery-demo

```jsx
// dockerを立ち上げ
docker compose up --build

// python実行コンテナに入る
docker exec -it [container ID] bash

// python実行コンテナでTaskを実行してみる
python create_first_task.py
```

Flowerでworkerの確認ができます。
タスクの詳細も確認可能です。

[`http://localhost:5555/`](http://localhost:5555/)

![スクリーンショット 2024-08-24 22.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/92eab890-0257-97f0-6a79-dbc043b541d3.png)


---
続いて非同期処理していることも確認してみます。

以下のタスクは10秒sleepして returnする関数を2回実行します。

```jsx
python create_multi_task.py

// stdout
First task added to queue
Second task added to queue
```

実行してすぐにFlowerを見ると、タスクが `Active` 状態となっており、 `Succeed` になっていないことがわかります。

![スクリーンショット 2024-08-24 23.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386347/c3c1d3d5-3f16-5646-2324-3a29685848e2.png)



今回はCeleryを使ってみることがゴールのため、ここまでとしますが実際には、Celeryの様々な機能を追加していくことができます。
Celeryは業務でも使用するため、今後より詳細を調べる時間も取れればと思います。
ABC368回答メモ

# 0.はじめに
　ちょっと業務時間と被っていましたが、こっそり参戦。
　点数的にもD問題も易しめだったためか、A～Dまで解けましたが
　D終わった時点で22:30近くとなっておりE以降まで手が届きませんでした・・・。
　レートは+22で711と700台に復帰しました。


# 1.A - Cut
　スライスの問題。
　まずは適当に作ってみて、結果を見て微調整・・・。
　最初に作ったときは、上からK枚とって後ろにつなげるようになっていたり
　1枚ずれてたりしましたが、微調整してACとなりました。
　
　https://atcoder.jp/contests/abc368/submissions/57035502


# 2.B - Decrease 2 max elements
　手順がややこしい問題。
　心を無にして問題通りにコーディングを行いました。
　【実装】
　　1.変数NとリストAを入力
　　2.リストAを降順ソート
　　3.変数ansを0で初期化
　　4.以下リストA[1]が0以下なるまで繰り返し
　　　-1.A[0]から1マイナス
　　　-2.A[1]から1マイナス
　　　-3.ansに1加算
　　　-4.リストAを降順ソート
　　5.最後にansを出力して終了

　https://atcoder.jp/contests/abc368/submissions/57040210


# 3.C - Triple Attack
　C問題ともなると問題通りにコーディングしてもダメそうなので
　敵の体力が5以上の時は、3回の攻撃を1セットでダメージ5として
　4以下まで体力減らして・・・・という感じで考えつつ実装。
　あとで解説見たらスマートな感じでしたが
　泥臭く場合分けして実装しました。
　【実装】
　　1.変数NとリストAを入力
　　2.変数T(今何回目の攻撃か)を0で定義
　　3.以下iを0～N-1まで繰り返し
　　　-1.A[i]が5以上の時
　　　　-1.変数TP(3回攻撃を1セットとし、何セット攻撃するか)にA[i]//5をセット
　　　　-2.TにTP×3を加算
　　　　-3.A[i]からTP×5を減算（A[i]に残った敵の体力が入っている）
　　　-2.A[i]>0の時(敵の体力がまだ残っている時)
　　　　-1.Tに1加算(とりあえず1回は攻撃必要)
　　　　　～このタイミングでTに加算することで、残った敵の体力を減らす攻撃が
　　　　　　3の倍数かどうかをこの後計算しやすくなる
　　　-3.A[i]が2の時（A[i]が1の場合は3-2-1.で加算した1回の攻撃で体力が0になる）
　　　　-1.T%3が0でない時(3-2-1.の攻撃が3倍撃ではない時)
　　　　　-1.Tに1加算
　　　-4.A[i]が3の時
　　　　-1.T%3が1の時(あと2回攻撃しないと3倍撃にならない時)
　　　　　-1.Tに2加算
　　　　-2.T%3が2の時(あと1回の攻撃で3倍撃になる時)
　　　　　-1.Tに1加算
　　　-5.A[i]が4の時
　　　　-1.T%3が1の時(あと2回攻撃しないと3倍撃にならない時)
　　　　　-1.Tに2加算
　　　　-2.T%3が2の時(あと1回の攻撃で3倍撃になる時)
　　　　　-1.Tに1加算
　　4.最後にTを出力して終了

　https://atcoder.jp/contests/abc368/submissions/57057776


# 4.D - Minimum Steiner Tree
　木の問題であきらめかけましたが、E以降も解ける気がしなかったので
　頑張りました。
　
　よく読めば、Vのリストにない木の頂点を除去していき、除去できなくなったら
　その頂点数が答えだなと気づきました。
　
　【考え方】
　　・リストPに頂点毎に接続される辺の数を保持
　　・辞書Dに、頂点毎につながっている頂点を保持
　　・以下、除去される頂点がなくなるまで繰り返し
　　　・リストPから値が1の頂点iを抽出
　　　　・頂点iが、リストVにない場合、木から除去
　　　　　→リストP[i]の値を1マイナスし、辞書Dから除去
　　　　　　合わせて、辺でつながっている先の頂点についても
　　　　　　リストPの値を1マイナスし、辞書Dの値からiを除去
　　・最後にP[i]の中で、1以上の値の数をカウントし、出力して終了
　
　【実装時の問題と解決法】
　　・例３のように、最後に点しか残らない場合、P内の値がすべて0になる
　　　→Vを読み込んだ際、Vにある頂点はPの値に1加算しておく
　　　　(頂点につながる辺の数が+1されていても回答に影響ない。)
　　・辞書Dの値をリストで持っていたら、TLEになる
　　　→cPythonで提出したりやC++に翻訳したりと悪あがきするもNG
　　　　デフォルト辞書のリスト型を、辞書型にしたところ
　　　　TLEせずに行けました。
　
　久々に難問を解いた達成感が味わえました。

　https://atcoder.jp/contests/abc368/submissions/57084508


以上
Arch linuxにvscodeをインストールする恣意的ノート

軽量テキストエディタであるplumaのハイフネーションがどうしても取れなかったため、この際リッチなテキストエディタであるvscodeに乗り換えることに決め、インストールをした次第でございます。
```
yay -S code
```
あとは、
・VScodeVimのプラグインをインストールして、キーバインドをvimライクにする。
・.vimrcを読み込むようにする。"vim.vimrc.enable": true,	"vim.vimrc.path": "/home/gar/.config/nvim/init.vim",
・固定幅フォントは"Myrica M"と、"源ノ角ゴシック","BIZ UDゴシック"がずれません。あとのは、どうしてだかずれるようです。どうも、"BIZ UDゴシック"が一番いいようです。
・設定ファイルに"editor.stickyScroll.enabled": false,を追加。スティッキースクロールは邪魔なので。
・設定ファイルに"editor.wordWrap": "on",を追加。テキストを右端で折り返す。
・信頼するディレクトリに/home/$USER/を入れる。

設定ファイルはこんな感じでいいかな。

```~/.config/Code - OSS/User/settings.json
{
	"workbench.settings.useSplitJSON": true,
	"editor.formatOnSave": true,
	"emmet.variables": {
		"lang": "ja",
	},
	"window.zoomLevel": 0,
	"workbench.startupEditor": "newUntitledFile",
	"editor.fontSize": 20,
	"editor.tabSize": 4,
	"editor.fontFamily": "BIZ UDゴシック",
	"editor.fontLigatures": true,
	"editor.detectIndentation": false,
	"editor.insertSpaces": false,
	"editor.wordWrap": "on",
	"editor.stickyScroll.enabled": false,
	"html.format.extraLiners": "",
	"html.format.preserveNewLines": false,
	"editor.renderWhitespace": "boundary",
	"editor.minimap.showSlider": "always",
	"editor.quickSuggestions": {
		"strings": true,
	},
	"editor.suggest.insertMode": "replace",
	"files.eol": "\n",
	"vim.vimrc.enable": true,
	"vim.vimrc.path": "/home/gar/.config/nvim/init.vim",
	"window.newWindowDimensions": "inherit",
	"workbench.editor.empty.hint": "hidden"
}
```

VScodeはかっこいいけど、慣れるのは大変そう。とりあえず。これでOK。
単振り子の直交座標による運動式表示とシミュレーション

# はじめに
単振り子の運動方程式は未知の張力を考慮しなくて済む極座標によって記述されることがほとんどである。そのときに、三角関数が多用される。しかし、直交座標による運動方程式の叙述は、未知の力である張力を考慮に入れなければならないため複雑になる。そこで、今回は単振り子の運動方程式に直交座標系を導入し、Pythonの差分法で単振り子の運動をシミュレーションすることを目的とする。



# 条件設定
-y方向に重力が働いているxy座標系の原点に糸が吊り下がっていて末端におもり$m$が存在しているものとする。このとき、おもりに対する運動方程式は以下のように表すことができる。ただし、糸の長さを$R$、張力を$T$とする。$T$は未知数である。

```math
\begin{equation}
\left\{ \,
    \begin{aligned}
    & a_x = -T \frac{x}{mR} \\
    & a_y = -g-T \frac{y}{mR}\\
    \end{aligned}
\right.
\end{equation}

```

一方で、円の方程式より以下のことが成立する。


```math
y=-\sqrt{R^2-x^2} (y<0)

```
一方で以下の等式も成立する。

```math
x^2+y^2=R^2
```

ゆえに、これを$t$で微分すると、

```math
2x\ddot{x}+2y\ddot{y}=0
```

整理すると、

```math
x\ddot{x}+y\ddot{y}=0
```

もう一度$t$で微分すると、

```math
(\dot{x}^2+x\ddot{x})+(\dot{y}^2+y\ddot{y})=0
```

したがって、

```math
\ddot{x}=-\frac{\dot{x}^2+\dot{y}^2+y\ddot{y}}{x}(=-T \frac{x}{mR})
```


以上の考察により、張力を位置、速度、加速度で表すと以下のようになる。

```math
T=\frac{mR(v_x^2+v_y^2+y a_y)}{x^2}
```

これにより、おもりの直交座標表示に関する運動方程式が叙述されることとなる。

# プログラム
ゆえに、以上のことから、差分法を用いて運動方程式を数値解析するプログラムを作成した。

```python simple_pendulum_xy.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import japanize_matplotlib
import math

# アニメ
fig = plt.figure()
ims = []

# パラメータと定数
g=9.8
# 振り子の長さ
R=1.0
# 振り子の質量
m=1.0
#時刻の初期値
t=0
# 位置の初期値
x=0.99

# 速度の初期値
v_x=0.0
v_y=0.0
# 加速度の初期値
a_x=0.0
a_y=0.0

# 位置、速度、加速度のリスト
X=[]
Y=[]

V_X=[]
V_Y=[]

A_X=[]
A_Y=[]


#微小時間
dt =0.01
while(t<10):
    # 束縛条件
    y=-(R**2-x**2)**0.5
    # 張力の大きさ
    T=m*R*(v_x**2+v_y**2+y*a_y)/(x**2)
    # 張力の大きさの上限
    if T>10:
        T=10
    # 運動方程式
    a_x= -T*x/(m*R)
    a_y=-g-T*y/(m*R)

    # 速度の更新
    v_x=v_x+a_x*dt
    v_y=v_y+a_y*dt
    # 位置の更新
    x = x + v_x*dt
    y= y + v_y*dt


    A_X.append(a_x)
    A_Y.append(a_y)

    V_X.append(v_x)
    V_Y.append(v_y)
    
    X.append(x)
    Y.append(y)
    # 時刻を更新
    t = t + dt
    # プロット
    
    im = plt.plot([0,x],[0,y],marker='o',color='b')
    ims.append(im)
# 10枚のプロットを 100ms ごとに表示
ani = animation.ArtistAnimation(fig, ims, interval=100)
#保存
ani.save("simple_pendulum_xy.gif", writer="pillow")
plt.show()
```

これを実行すると以下のようなgifが出力される。

![simple_pendulum_xy.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/53bc45f2-590c-f6bb-39c9-2978a80a2a10.gif)

このように、上手く単振り子の振動を表現することができている。しかし、課題として$x=0$付近だと張力$T$が発散してしまうため、上限を設けることで簡易的に対応した。

# まとめ
今回は、単振り子の運動方程式をxy座標系で叙述し、差分法によりPythonで数値解析し、シミュレーションすることを試みた。おもりが原点の真下にあるとき張力が発散するので、上限を設けて対処した。結果、単振り子の振動の様子を上手くシミュレーションすることができた。

# 参考文献
https://hooktail.maxwell.jp/bbslog/9938.html
このASでどんなアドレスブロックが使われてるんだっけ？を確認する

# はじめに

ASの中でどんなアドレスブロック（≒サブネット）が使われているのかを確認する方法を紹介します。bgpq4コマンドで，IRRを参照します。

# 予備知識
- BGPとは
BGPは、インターネット上で異なるネットワーク（自律システム、AS）同士が経路情報を交換するためのプロトコルです。

- IRRとは
IRR(Internet Routing Registry）は，インターネット上の経路情報を管理・公開するためのデータベースです。

- bgpq4とは
IRRの情報を参照して，ルータのBGPの経路フィルタ設定を生成するツールです。以前はirrtoolsetコマンドが使われていたようですが，メンテナンスが止まっています。


# 準備
ubuntu（今回は2204）で，bgpq4コマンドをインストールしておきます。
```
$ sudo apt install bgpq4
```

# bgpq4の簡単な使い方

- IPv4を調べる
```
$ bgpq4 ASXXXX
# XXXXにAS番号を入れる
```
オプションを指定しない場合，Cisco IOSに対応したprefix-listの許可リストが出力されます。

- IPv6を調べる
-6オプションを使います。
```
$ bgpq4 -6 ASXXXX
# XXXXにAS番号を入れる
```


- JSONで出力する
-jオプションを使います。
```
 $ bgpq4 -j ASXXXX
```

- その他
JuniperやOpenBGPDに対応したオプションもあります。詳しくは```man bgpq4```で。

# 出力結果を検証
では，取得結果を検証します。
AS番号はあらかじめJPNICのサイトで調査しておきます。
https://www.nic.ad.jp/ja/ip/as-numbers.txt

自宅のOCNのIPv4アドレス153.181.XX.XXとIPv6アドレス2400:415X:....はAS4713（OCN）の中に存在しました。
```
$ bgpq4 AS4713
no ip prefix-list NN
ip prefix-list NN permit 27.114.0.0/17
...
ip prefix-list NN permit 153.128.0.0/10
...
```

```
$ bgpq4 -6 AS4713
no ipv6 prefix-list NN
...
ipv6 prefix-list NN permit 2400:4000::/22
...
```


モバイルで利用しているIIJmioのIPv4アドレス133.159.XX.XXとIPv6アドレス2001:24::...はAS2497（IIJ）の中に存在しました。
```
$ bgpq4 AS2497
no ip prefix-list NN
ip prefix-list NN permit 45.95.66.0/24
...
ip prefix-list NN permit 133.159.0.0/16
...
```
```
$ bgpq4 -6 AS2497
no ipv6 prefix-list NN
ipv6 prefix-list NN permit 2001:240::/32
...
```

4件ほどのサンプル調査ですが，参照できる情報は正しかったです。

# まとめ
- ASの中の人でなくても，IRRを使えばAS番号からアドレスブロックの情報を参照できます。
- bgpq4コマンドを使うと，AS番号からアドレスブロックを検索できます。
- IRRというデータベースで，AS番号とアドレスブロックが管理されています。
- IRRに問合せするためのbgpq4コマンドが，apt installで使えます。

# 参考情報
https://www.nic.ad.jp/ja/irr/

https://github.com/bgp/bgpq4

https://github.com/irrtoolset/irrtoolset

https://qiita.com/snumano/items/f776cb8c5f539d76b927
うんこ爆撃！

こんにちは　なまこです。

嫌いな人のパソコンに嫌がらせしたいなって思ったことありませんか？
今回はそんな方のために「うんこ爆撃」のやりかたをご紹介します！

:::note warn
(悪用厳禁でお願いします。痔になります)
:::


# step1　メモ帳を開く

# step2　以下のコードをメモ帳に貼り付ける
~~~~~~~~~~~~~~~~
@echo off

for /l %%i in (1,1,100) do (
    type nul > unko%%i.txt
)

echo 直ちにトイレに行ってください
pause > nul
~~~~~~~~~~~~~~~~


# step3　拡張子を.batにして文字列コードをANSIで保存する
# step4　保存したファイルをダブルクリックで実行！



以上です。
用法、用量に注意して使ってください
DateComponentsを使って現在の年月を表示する

DateComponentsを使って現在の年月を表示する方法です。

# 完成イメージ

![Simulator Screenshot - iPhone 15 Pro - 2024-08-15 at 14.57.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/6af09567-2df8-1177-1cd1-8b7f7a43e44a.png)

# 実装方法
`DateComponents`の`extension`を作成します
```.swift
extension DateComponents {
    func getYearMonthFormat() -> String {
        if let monthString = month, let yearString = year {
            return String(format: "\(yearString)-%02d", monthString)
        }
        return ""
    }
}
```
これによって`DateComponents`から年月の表示を楽にすることができます。


```NextLastDateViewModel.swift
class NextLastDateViewModel: ObservableObject {
    @Published var text: String = ""

    init() {
        let component = Calendar.current.dateComponents(in: TimeZone.current, from: Date())
        text = component.getYearMonthFormat()
    }
}
```
`Calendar.current.dateComponents`で`Date()`を渡しているので現在の`DateComponents`が取得できます。
先ほど作成した`extension`を利用して年月を表示できます。

ViewModelとして今回は作成しました。
表示したいViewにtextを表示させれば完成です。
[Google Cloud]Colab Enterprise 使ってみた

# はじめに
Google CLoudのColab Enterpriseを利用したので、備忘含め使い方などをメモしておきます。

# Colab Enterpriseとは？
以下のサイトが大変参考になります。

https://zenn.dev/cloud_ace/articles/1085659bb87dfe

# Colab Enterpriseの使い方

### Google CloudコンソールからColab Enterpriseを開く
vertex AIの中にColab Enterpriseがあります
初めて利用する場合はAPIの有効化が必要な場合があります

![スクリーンショット 2024-08-24 23.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866216/ea971b49-6677-47cf-79a7-e659dde68c27.png)

### ランタイムテンプレートを作る
ヘッダーの「ランタイムテンプレート」をクリックする
「ランタイムテンプレートを作成」からランタイムテンプレートを作る

![スクリーンショット 2024-08-25 0.17.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866216/31fc08ea-b768-01fb-6122-a04ca222f2d0.png)

:::note info
ノートブックから「接続」をクリックすることでランタイムを起動できますが、
デフォルト設定のランタイムが起動してしまうので、
ランタイムテンプレートから作る方をお勧めします

※特に外部IPを付与したランタイムを起動したくない場合は、
ランタイムテンプレートから作りましょう
:::

基本情報を入力する
|項目|説明|
|:--|:--|
|表示名|任意の値を入力する|
|リージョン|Colabの実行環境(Coumpute Engine)が起動するリージョンを選択する|

![スクリーンショット 2024-08-25 21.15.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866216/8a8c8e92-ed63-f516-e230-ec6f7c6f5034.png)

:::note info
リージョンによって起動できるマシンタイプが異なるため、注意してください
特にこだわりがなければ東京リージョン選択でOKです
:::

コンピューティングの構成を入力する
|項目|説明|備考|
|:--|:--|:--|
|マシンタイプ|目的に沿ったマシンタイプを選択する|今回はGPGPU目的のため、GPUが使えるマシンにしています|
|アクセラレータタイプ|GPUの種類を選択する|マシンタイプがGPUの時のみ|
|アクセラレータ数|GPUの枚数を選択する|マシンタイプがGPUの時のみ|
|ディスクタイプ|ディスクタイプを選択する||
|ディスクサイズ|ディスクサイズを選択する||
|セキュアブート|セキュアブートのON/OFFを選択する||
|暗号化|暗号化に用いる鍵を選択する||
|アイドル状態でのシャットダウン|自動シャットダウンを何分で行うかを選択する||

![スクリーンショット 2024-08-25 22.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866216/f38d0d6e-3860-59b2-66ba-1dc518325ee9.png)

ネットワークとセキュリティを入力する
|項目|説明|備考|
|:--|:--|:--|
|ネットワーク|ランタイムが起動するVPCを選択する|基本情報のリージョンで選択します|
|サブネットワーク|ランタイムが起動するサブネットワークを選択する||
|公共のインターネットアクセス|ランタイムに外部IPを付与するかどうか選択する||
|エンドユーザー認証|IAMでランタイム実行を制御するか選択する||

![スクリーンショット 2024-08-25 22.22.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866216/c127a9b4-1f3c-fd93-6c8c-a3c806450012.png)

:::note info
外部IPを付与しない場合```pip install```などでモジュールをダウンロードできません
Cloud Router+Cloud Nat構成でインターネットに出られるようにしましょう
:::

### ランタイムを起動する
「ランタイム」タブに移動する
「ランタイムを作成」からランタイムを作成する
先ほど作成したランタイムテンプレートを選択する

![スクリーンショット 2024-08-25 22.32.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866216/c3d51b02-695c-9cb8-b75d-71d7f404fe44.png)

### ノートブックを作成してランタイムに接続する
「ノートブック」タブに移動する
「ノートブックを作成する」からノートブックを作成する
「接続」の横にある「▼」から「ランタイムに接続」を選択する
「既存のランタイムに接続」から先ほど起動したランタイムを選択する

![スクリーンショット 2024-08-25 22.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3866216/bf92bedc-51eb-f110-b5cf-72e289a0fac2.png)

# 最後に
仕事でGPGPU、特にcudfを利用した開発をする場面があり、
手元にGPUの搭載されたマシンがなかったので、Colab　Enterpriseを使ってみました
（仕事だったので、野良のGoogle Colabでやるのは憚られましたので）

GPUが使えるCompute Engineを起動して、Jupyterlab or VSCodeのRemote-SSHの案もありましたが、
環境構築の手間が不要なので、さらっと触りたい人にはお勧めです。
【週末お掃除】Android emulator のパフォーマンス改善

# これなに
- Android emulator パフォーマンスが出ない問題について対応したメモです
- 多分いろんな先人達がやり尽くしていると思われるので、参考程度まで
- とりあえずこれやったら体感だいぶ速くなった


# 解決方法
### Device Manager から対象の AVD の Show on Disk を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/9f2aed00-31c7-72ad-415a-374d219e0bbc.png)

### config.ini を編集する
- GPU mode の変更, RAM と heap はデフォルト値の4倍に修正
- GPU: auto => host
- RAM: 2048 => 8192
- heap: 256 => 1024

```ini
hw.gpu.mode=host
hw.ramSize=8192
vm.heapSize=1024
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/5054bca2-fea1-78e5-d7fa-95aac7ced692.png)


# 今回の話で困ったこと
なぜか上記の設定値は GUI で編集できなかったので、仕方なくファイルを直接変更して対応してみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2819748/97ebba43-280b-f82b-7161-9b6e45a69243.png)
未経験からスタートアップ企業に転職して１週間の振り返り

## はじめに
初めましてこんにちは！！きょうへいと申します！！

以前までは、オンラインプログラミングスクールにて学習を行なっていたのですが、つい最近未経験からスタートアップ企業への転職をいたしました！！

普段はQiita記事の拝見をするだけだったのですが、先日、先輩エンジニアから１週間で感じたことを記事にすると自分の成長を感じられると言うアドバイスをいただきましたので、初めての記事投稿をさせていただきます！！

拙い文章ではございますが、お付き合い頂けますと幸いです！

## どんな学習を行なっていたか
オンラインプログラミングスクールではRuby on Railsを中心とした学習を行なっておりました。

そのほかにもGit、Docker、Next.jsなどの言語を学習しており、チーム開発などの経験をしておりました！

## 転職した会社
私が転職を行なった企業は正社員全体で15人程度、その中でも正社員のエンジニアは僕を含めて2人のみといった本当にこれから色々なフェーズを経ていくだろうという環境です。

開発にはNext.js及びExpress.jsを使用してAWSやGCPなどを活用しております。

## 実際に経験したこと
入社後すぐに先週の成果報告及び現状のすり合わせを行うMTGに参加。
その後、環境構築を行ない、初日からすぐに割り振りをしていただいたタスクの実装を開始しました。
ちなみに、初手からフルスタック開発です！笑
でも、実戦で力をつけていくというスタンスでは圧倒的なスピードで成長ができると思うので、とても嬉しく感じています！

開発では初めて扱うフレームワークでの開発な上、データ構造や設計、どう言った機能があるのかもわからないまま手探りでの開発を行なっております。

しかも、今まで扱ったことのないような規模のソースコードで開発を行なっており、どこにどの機能があり、どう言った使用方法を行うのかも全くわかりません笑

少し開発を行なっていた感覚としては、PFとして作成したアプリの１００倍とか１０００倍くらいの量のソースコードがあるんじゃね！？と思いました。
（正確にはわからないのですが、本当に訳わからなくなるくらいのコードの量なのです...）

なので、開発の７割８割はどこにどう言ったコードがあり、どういう構造になっているかの理解に費やしているような状況です。

悲しいことに、僕の力不足で１週間で１つのタスクしか行うことができず、プルリクエストも返却されているので次週はその修正を行なっていくところから始まります。

本当にスピード感が半端ではなく、１つのタスクを終えられない状況でもタスクは無限に増えていきます笑
個人的にタスクのシャワーを浴びていると言う表現が一番しっくりくるなと思っています笑

スクールでもある程度開発はしてきたと自負はしていたのですが、全く歯が立たないなと言う歯痒さを感じているうちに、あっという間に１週間が経っていました。

Next.jsもExpress.jsもtypescriptも本当に難しい！！
必死に開発をしていないとついていけないなと感じています！
半年後にはある程度一人前になることを求められているので強くなるぞ！

## やっていてよかったこと
オンラインプログラミングスクールで経験できることは全部やってやると言う気持ちでやっていたのは本当に良かったと思います。

特にフロントエンドとバックエンドを分離した開発、チーム開発、基本的なアーキテクチャの理解、データの通信の理解、GitやGitHubの使用、Dockerでの開発、DB操作などは少しでもわかるようにしていて良かったなと思いました。
そもそもで、やったこと無かったら開発自体が行えていないなって思います笑

また、自分がスクールで経験できることはほとんど経験してきたと思っているのですが、それは全て基礎知識であり、経験しているのが当たり前、現場ではさらにもう一歩踏み込んだ知識や経験、コーディングのスキルが必要だなと感じました。

## 感想
最後に感想として、僕はこの会社に入社をすることができて本当に良かったなと思っております。
誰もが本気でその企業のために行動しており、お互いにお互いを尊敬しているのを感じています。
本当に良い会社です！！

そして、この環境で過ごしていれば「**必ず強くなれる**」と確信しています。

スタートアップには色々な経験をすることができる、本気で色々なことに挑戦することができる。
そんな魅力がいっぱい詰まっていると感じました。

人によっては辛い環境だねと思われるかもしれませんが、本当に楽しいのです！

今後は色々な経験をしていき、会社に貢献できるエンジニアへなりたいなと思っています。
少しでも前へ、その時、一瞬一瞬を本気で過ごしたいものですね！！

私の拙い文章にお付き合いいただき本当にありがとうございました！！
また、お会いできることを楽しみにしています！！
【Next.js】Server Actionsに追加の引数を渡す方法

Server Actionsに追加の引数を渡すには `bind` を使用します。

```tsx
'use client'
 
import { updateUser } from './actions'
 
export function UserProfile({ userId }: { userId: string }) {
  const updateUserWithId = updateUser.bind(null, userId)
 
  return (
    <form action={updateUserWithId}>
      <input type="text" name="name" />
      <button type="submit">Update User Name</button>
    </form>
  )
}

```

上記のように記述すると `updateUser` に `userId` を渡せます。

```ts
'use server'
 
export async function updateUser(userId, formData) {}
```

`userId` は第一引数として記述する必要があります。
【勉強ノート #1】トグルスイッチ力学系に関する線形安定性解析

# 概要

"トグル・スイッチ力学系に関する線形安定性解析" という勉強ノートを作成しました．ノートは [本記事の最後](#勉強ノート) に置いてあります．

### 収録内容
- トグル・スイッチ力学系とは？
- 固定点 (平衡点) の計算
- 時間領域および周波数領域での線形安定性解析
- 作図に用いたpythonプログラム

# はじめに
- トグル・スイッチ (toggle switch) 力学系は双安定性を有する力学系です
- この力学系は例えば，生物学分野の遺伝子発現モデルの一例として知られています
- 具体的には，遺伝子１と２が互いの発現を抑制する場合であり，遺伝子１が発現する (オン) と，遺伝子２が発現しにくくなる (オフ) ような機構のモデルとして使用されます
- ちょうどトグル・スイッチ (レバーでオン・オフを制御する装置) に似ていることが名前の由来らしいです

# ノートのまとめ
#### ■ 考える式系
```math
\begin{align}
\frac{dp_{1}}{dt}&=\frac{\alpha}{1+p_{2}^{2}}-p_{1} \\
\frac{dp_{2}}{dt}&=\frac{\alpha}{1+p_{1}^{2}}-p_{2}
\end{align}
```
ここで，$p_{1}, p_{2}$は遺伝子1と2に含まれるたんぱく質の濃度 (発現量)，$\alpha$は生成量に関するパラメータです．各式の右辺第一項は生成，第二項は分解を表します．生成に関する項は，相手の濃度が高い場合に小さくなるため，互いの発現を抑制する作用を持ちます．

#### ■ 平衡点周りの安定性
上式の平衡点 (定常解) を計算すると，以下の図のようになります (計算の詳細は[ノート](#勉強ノート)をご参照ください)．ただし，$p_{1}$は実数なので，図には実数解のみを描きました．$\alpha=2$を境にして，実数解が1つから3つに増えることが分かります．

それぞれの平衡点に関して線形安定性解析を行うことで，各平衡点が安定なのか不安定なのかを見ることができます．ただし，線形安定性解析では解くべき式を"線形化"しているため，平衡点に十分近い領域でのみ有効であることに注意してください．

下図のうち実線は安定な平衡点，破線は不安定な平衡点を表します．このような分岐はピッチフォーク分岐 (熊手型分岐) と呼ばれます．

詳しくは[ノート](#勉強ノート)をご覧ください．

<img width="75%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471691/2f7ad97c-c6ba-297c-85d5-a513363fdb2a.png">


# 勉強ノート
勉強ノート (pdf) は以下に置きました．
内容に誤りを含む可能性がありますので，取り扱いにはご注意ください．

https://drive.google.com/file/d/13UiZAYzHvLcrNoFwCAtz_QwzYeaUemIj/view?usp=drive_link