OmniAICreator/Qiita-1.07M huggingface dataset:
windowsのバッチファイルで年月日・時分秒の情報を取得する

# TL;DR;

```
@ECHO OFF

SET NOW_DATE=%DATE%
SET NOW_TIME=%TIME%

SET YEAR=%NOW_DATE:~0,4%
SET MONTH=%NOW_DATE:~5,2%
SET DAY=%NOW_DATE:~8,2%

SET HOUR=%NOW_TIME:~0,2%
SET MINUTES=%NOW_TIME:~3,2%
SET SECOND=%NOW_TIME:~6,2%

SET TIMESTAMP=%YEAR%-%MONTH%-%DAY% %HOUR%:%MINUTES%:%SECOND%

ECHO YEAR      : %YEAR%   
ECHO MONTH     : %MONTH%  
ECHO DAY       : %DAY%    
ECHO HOUR      : %HOUR%   
ECHO MINUTES   : %MINUTES%
ECHO SECOND    : %SECOND%
ECHO TIMESTAMP : %TIMESTAMP%

PAUSE   
```

実行結果:

```
YEAR      : 2024
MONTH     : 10
DAY       : 05
HOUR      : 12
MINUTES   : 28
SECOND    : 27
TIMESTAMP : 2024-10-05 12:28:27
```

# 解説

①

```
SET NOW_DATE=%DATE%
SET NOW_TIME=%TIME%
```

現在日時を取得します。このときDATE・TIMEの実行結果が以下のような書式で取得できることを前提とします。

- 2024/10/05
- 12:37:38.35

②

```
SET YEAR=%NOW_DATE:~0,4%
SET MINUTES=%NOW_TIME:~3,2%
```

DATE・TIMEの結果を加工します。このとき、以下の書式を利用します。

- `%AAA:~x,n` : AAAのx文字目からn文字を取得する (xは0-indexed)

`NOW_DATE=2024/10/05`の0文字目からの4文字が年(yyyyy)にあたるので、これを切り出してYEAR変数に代入しています。同じように、`NOW_TIME=12:37:38.35`の3文字目から2文字が分(MM)にあたるので、これを切り出してMINUTES変数に代入しています。

③

```
SET TIMESTAMP=%YEAR%-%MONTH%-%DAY% %HOUR%:%MINUTES%:%SECOND%
```

取得した年月日・時分秒の情報を文字列結合して、任意のフォーマットに編集しています。

# 環境情報

```
C:\>ver

Microsoft Windows [Version 10.0.22631.4169]
```
【Godot 4x】ボタンのクリックをイベントハンドラで紐づける

# はじめに

シグナルを使うよりこちらのほうがシンプルにコーディングできそうです。

```cs
partial class MyScene : CanvasLayer
{
    public override void _Ready()
    {
        this.GetNode<Button>("MyButton").Pressed += () =>
        {
            // Do Work
        };
    }
}
```

## 型ごとのイベントの探し方

- VSCode のインテリセンスを使う
  - `Button.` まで入力するとその型のメンバー候補が表示されるので、よさそうなイベントを選びます
  - フィールド・プロパティ・メソッドが大量に表示されるため見つけにくいかもしれません
  - 基底クラスのイベントなのかわかりづらいかもしれません
- Godot エディタからイベントを見つける（Godot エディタ右側のインスペクター・**ノード**・履歴のタブ）
  - ノード -> シグナル -> （イベントの一覧が表示される）
  - 型ごとにイベントが表示されるため見やすいです

## シグナルよりイベントを優先する利点

- C# スクリプト側でイベント登録を完結できる
  - イベントを変更したときに `.tscn` 側の変更が不要でファイル差分が出ません。`.tscn` ファイルにデザイン部分だけを集約できます（ロジック部分を持たない）
- 「メソッドにシグナルを接続」の手間の省略
  - Godot エディタ -> VSCode の行ったり来たりの回数を減らせます。アクティブウィンドウの変更は結構面倒くさく、これの恩恵が大きいです
  - Godot エディタが標準で用意するシグナル用メソッドの名前が `_on_do_work_button_button_up` のようなスネークケースになっているため、それを都度手直しする作業を省略できます。メソッドを自動で追加する位置もクラスの外だったり挙動が変なので、それを回避するのも兼ねます

## おわりに

Godot は比較的新しいフレームワークなのでドキュメントが少なく、特に C# スクリプトのドキュメントをあまり見かけないので、今回は備忘録的な位置づけです。  
Godot 公式のチュートリアルではシグナルを使うよう紹介されていたため、今回のイベントハンドラに気づくのに時間がかかった次第です。
Apple Silicon (M1) MacでRails環境を整える: Rosetta 2関連のエラーとその解決法

# はじめに
最近、AppleのM1チップを搭載したMacでRailsの環境構築を試みた際に、いくつかの一般的でないエラーに直面しました。これらの問題は、特に新しいARMアーキテクチャと従来のx86_64アーキテクチャの違いに起因しています。この記事では、私が遭遇した問題とその解決策を共有します。

## 1. Homebrewのインストールエラーとその解決
### エラー内容:
```
Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!
```
このエラーは、ARMアーキテクチャのデフォルトプレフィックスである /opt/homebrew 下で、Rosetta 2を介してx86_64向けのソフトウェアをインストールしようとしたときに発生します。Apple Silicon Macでは、ネイティブARMアーキテクチャが優先されるため、この問題が発生します。
### 解決策:
```Ruby:ターミナル
arch -arm64 brew install node
```
`arch -arm64` コマンドを使ってHomebrewを明示的にARMモードで実行し、Node.jsをインストールすることで解決しました。この方法で、ARMに最適化されたバイナリがインストールされ、パフォーマンスと互換性の問題が解消されます。

## msgpack gemのLoadErrorとRubyの再インストール
Rubyの実行時にmsgpack gemから次のようなLoadErrorが発生しました:
```
dlopen(/Users/ichikawanijiwa/.rbenv/versions/3.0.7/lib/ruby/gems/3.0.0/gems/msgpack-1.7.3/lib/msgpack/msgpack.bundle, 0x0009): tried: '/Users/ichikawanijiwa/.rbenv/versions/3.0.7/lib/ruby/gems/3.0.0/gems/msgpack-1.7.3/lib/msgpack/msgpack.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))
```
### 解決策: 
最初にmsgpack gemをアンインストールし、
```RUBY:ターミナル
gem uninstall msgpack
```
次に、以下のコマンドでARMアーキテクチャ専用に再インストールしました。
```RUBY:ターミナル
arch -arm64 gem install msgpack -- --with-cflags="-arch arm64"
```
この手順で、ARMアーキテクチャに適合するようにmsgpack gemが正しくインストールされ、エラーが解消されました。

## date gemのLoadErrorとその解決
同様の問題がdate gemにも発生しましたが、同じ手順で解決できました:
```ruby:ターミナル
gem uninstall date --all
arch -arm64 gem install date -- --with-cflags="-arch arm64"
```
## まとめ
Apple Silicon Macでの開発環境構築は、従来のIntel Macとは異なるアプローチが必要ですが、正しい手順で適切なコマンドを実行することで、ほとんどの問題を克服できます。今回共有した経験が、同じ環境で作業を進める他の開発者の助けになれば幸いです。
【DAY33】関数の分解について(php)

##  関数の分解とは
関数の分解とは、一つの大きなタスクを複数の小さなタスクに分けて、それぞれを独立した関数として定義することです。

## 関数の分解の例
例として物体がある速度で壁に衝突した時に失われる運動エネルギーを求める関数を考えます。
引数としては、物体の質量、物体の速度、物体と壁との反発係数を与えます。
これらを一つの関数で表現すると、以下のようになります。
```php
function lostKineticEnegy(float $mass, float $velocity, float $coefficientOfRestitution): float{
    return 0.5 * $mass * $velocity ** 2 - 0.5 * $mass * ($coefficientOfRestitution * $velocity) ** 2;
}
```

これでは長ったらしくてどこで何をしているのかが分からず、可読性が低いです。
また、エラーが発生してもどこが間違っているのか探すのが大変です。

そこで、関数を分解します。
速度と反発係数から衝突後の速度を求める関数、質量と速度から運動エネルギーを求める関数を作ってみましょう。
```php
function velocityAfterCollision(float $velocity, float $coefficientOfRestitution): float{
    return $velocity * $coefficientOfRestitution;
}
```
```php
function kineticEnergy(float $mass, float $velocity): float{
    return 0.5 * $mass * $velocity ** 2;
}
```

これらの関数を使用すると、失われる運動エネルギーを求める関数は以下のように記述できます。
```php
function lostKineticEnegy(float $mass, float $velocity, float $coefficientOfRestitution): float{
    return kineticEnergy($mass, $velocity) - kineticEnergy($mass, velocityAfterCollision($velocity, $coefficientOfRestitution));
}
```

関数を小分けにして利用することで、何をしているのかが分かりやすくなり可読性が向上しました。
また、他の場面で運動エネルギーを求める必要が出てきたら、kineticEnergy関数を再利用することができます。
このように、関数を分解するとさまざまなメリットがあります。
ジュニアエンジニアの転職活動を振り返る

:::note
ジュニアエンジニアに当たる方向けの内容になっています

以下について書いています。
- 私が使った転職サービス、エージェントの紹介
- 転職活動をする上で行った対策
- 今回の転職を通して改めて「自分が目指しているものは過去の出来事から起因していて経歴も一貫していた」と再認識できた
:::

# 背景 🖼️

https://qiita.com/official-events/9687d5419295cd871fdc

このキャンペーンに便乗しました

# 私が使った転職サービス、エージェントの紹介 ✨

## michibiki
https://michibiki.co.jp/

エージェントの方が自分とマッチする企業を提案します。
ここまではエージェントなら普通なのですが、ほとんどが面接に進みたいと思う企業ばかりだったのが印象的でした。
また、面接対策や企業側と連携して面接がお互い納得いく形でできるよう準備してもらえます。
後述するのですが、面接対策で手厚くサポートして頂けて本当に感謝したいと思っています。

## Findy

https://findy-code.io/home

自社サービスの開発がメインの企業が多かったです。
自分のスキル偏差値を算出できて、それを見た企業からスカウトが届くこともありました。
Qiitaと紐つけることで自分が何に詳しいか、経験、勉強しているかをアピールできます。
ユーザーサクセスチームの担当の方がついて下さって、週1,2のペースで面接対策、企業調査等手厚くサポートしてもらいました。

## 転職ドラフト

https://job-draft.jp

年収を提示されて指名が届くのが特徴です。
Qiitaと紐つけることで自分が何に詳しいか、経験、勉強しているかをアピールできます。

## Wantedly

https://www.wantedly.com/id/yamatai_1212

特徴的なのは自分のプロフィール上に色々な情報を載せられることだと思います。
しっかり自分のプロフィールを埋めるとスカウトが届きやすくなったなと思います。

私は記事を執筆するとこのWantedlyに投稿しています。

## Green

https://www.green-japan.com/

企業、求人の数の多さが特徴的なのかなと思います。
自分としては上手く使いこなせなかったので今後機会があれば、ユーザーサクセスの方に相談したいと思います。

## Pitta

カジュアル面談ができるそうです

https://pitta.me/

今回使いましたがカジュアル面談確約まで行けませんでしたので詳細な説明はできないです。

## その他
- 気になる企業の採用イベントに行き、その場で面接を申し込む
- XのDMから面接を申し込む

# 転職活動をする上で行った対策 💡
:::note
私はジュニアエンジニアなのでコミュニケーションや、カルチャーフィットに重きを置いて対策しました
:::

https://michibiki.co.jp/

michibikiさんのエージェントの方に教えて頂いた内容を共有します。
他にも色々したのですが、michibikiさんのエージェントの方のおかげで納得いく転職活動ができた部分が大きかったです。

## 今までの経歴を振り返り、自分が何を目指して働いているのかを考え直す
私の例ですと以下です。

自分が目指しているもの
「可能性を切り開き、前向きに働ける人を一人でも増やしたい」

〜高校時代〜
「殻を破れ」と色んな教師の方からよく言われていました。
その環境のおかげで当時から自分で新しい可能性を掴む為に主体的に動いたりすることができるようになりました。
そして、若い人たちが自分たちで切り開いていくことに貢献できる教育ということに関わりたいと思うようになり、教師を目指しました。

〜大学時代〜
当初は教師を目指していましたが教育というのは会社に所属してもできます。
会社でサービスを通して「もっと前向きに働けたり、自分で可能性を切り開ける人を増やしたい」と思うようになりました。
当時専攻していたものが情報科学だったのでエンジニアを志望しました。

:::note
改めて自分の目指しているものを再定義し、経歴も一貫していたと再認識できました。
これができれば面接の際にどんな質問にもこの過去の話をすることで答えられます。
実際、自分もこの対策をした後に想定していない質問にも答えることができたのと、面接官にも納得してもらえました。
:::

## 自分の話し方の癖を治す
michibikiのエージェントの方がすぐに私の話し方の癖を見抜いて、指摘して下さいました。

- 結論から答えられていない
- コミュニケーションコストが高いと思われそう

:::note
自分の話し方の癖の気づき方
- 他人に指摘してもらう
- 自分の話し方を録音してみる
:::

## 面接で困った時にできること

答えられない場合
- 考える時間を貰いたいなら「少し考える時間を頂けないでしょうか」と聞いても全然大丈夫
- 緊張して頭が真っ白になったならそれも伝えて良い
- 面接の最後に回答し直したり、エージェント通して回答もできる可能性がある
- まとまりがないと気づいたら再度話を止めて、簡潔にもう一度答え直しても大丈夫

:::note
面接で困った時にできることを事前に知ると、少しはリラックスして面接に臨めるのかなと思います
:::

## 素直さをしっかりと面接官に伝える
「本当に現職でやりたいことができないのか、あなたの実力不足なのでは」という質問はよくされました。
このようなストレートな言い方はされていないです😢

以下の順で話すと面接官に納得してもらえる回答ができました
- 自分が至らなかった所
- その中でも自分がしたこと、できたこと
- 反省から今後どのように改善するか、今何をしているのか

:::note
素直さは仕事をする上で大事な所なので、面接の場で素直さを伝えるのは大切だなと改めて実感しました。
:::

# 最後に 🚀
michibiki,Findyの担当者の方には本当に手厚くサポートして頂きました。
改めて深く感謝申し上げます。
今回の転職を通して改めて「自分が目指しているものは過去の出来事から起因していて経歴も一貫していた」と再認識できました。
これからも自分が目指している社会を実現する為に全力を尽くします。

改めて転職活動を通して関わった様々な企業の担当者、転職サービスの担当者の皆様に感謝申し上げます。
Viteとは何かメモ

## Viteって何？
Viteは、次世代のフロントエンド開発ビルドツールのこと。元は々Vue.jsの作者であるEvan Youが作成したツールですが、現在はVue.js以外のフレームワークでも広く使われており、Reactでも定番になってきている模様。

## Viteの特徴

### 高速な開発サーバー
Viteは、ESM（ECMAScript Modules）に基づいており、従来のバンドラとは異なり、開発時に必要なファイルだけをブラウザにロードします。そのため、特に大規模なプロジェクトでも非常に高速な起動とホットリロードが可能です。

### 高速ビルド
開発時だけでなく、Viteは本番環境向けのビルドも最適化されており、Rollupを内部的に使って高速かつ効率的なビルドを行います。

### 豊富なプラグイン
Viteは非常に柔軟なプラグインシステムを持っており、Rollupのプラグインも利用可能です。これにより、カスタマイズが容易で、さまざまな機能を追加できます。

### 多くのフレームワークをサポート
前述したとお理、Vue、ReactをはじめPreact、Svelteなど、さまざまなフレームワークに対応しており、テンプレートを用いて簡単にプロジェクトを開始できます。

### まとめ
つまり、従来のツールと比べて**起動速度が圧倒的に速い**、**ホットリロード（HMR）が非常に高速で、開発体験がスムーズ。**、**Webpackのように多くの設定が不要で、すぐに使い始めることができる。**
というところで優れているとされているそうです。

## Viteの導入方法
導入方法は簡単。ターミナルを開いて
``npm create vite``
で実行するだけ！その後フレームワークや言語を選択する画面に切り替わるので、お好みで選ぶだけで簡単に導入することができます。
スクラムについてまとめてみました

スクラムは、アジャイル開発の中でも代表的なフレームワークで、**小さなチーム単位で短期間のスプリントを繰り返すこと**で、効率的にプロジェクトを進める手法です。スクラムは、チーム内での協力やコミュニケーション、そして継続的な改善を重視し、短い期間で機能の提供とフィードバックを得ることを目指します。


## **スクラムの基本概念**

スクラムでは、プロジェクトを「**スプリント（Sprint）**」と呼ばれる短い期間に分割し、各スプリントの開始と終了時に計画とレビューを行います。1つのスプリントは通常**1〜4週間**で完了し、その期間内にチームが取り組むタスクや目標が設定されます。スプリントを繰り返すことで、プロジェクト全体を段階的に完成に導きます。

## **スクラムの3つの役割**

1. **プロダクトオーナー（Product Owner）**
   - **役割**: プロジェクトの方向性を決定する人物で、プロダクトの機能や要件を定義し、優先順位をつけます。また、ステークホルダー（顧客や関係者）の意見やフィードバックを収集し、バックログに反映させる役割を持ちます。
   - **主な責任**: プロダクトバックログの管理、プロジェクトの目標設定、スプリントの成果の評価。

2. **スクラムマスター（Scrum Master）**
   - **役割**: スクラムチームが効率的に機能するように支援する役割で、チームがアジャイルの原則やスクラムのルールを遵守できるように指導します。また、チームが抱える障害や問題を取り除き、メンバーがスムーズに作業できる環境を整えます。
   - **主な責任**: プロセス改善、チームの支援、ミーティングのファシリテーション。

3. **開発チーム（Development Team）**
   - **役割**: 実際にプロダクトの機能を開発するメンバーで構成されます。スプリントの計画に基づいてタスクを遂行し、動くソフトウェアを作成します。開発チームは自己組織化されており、自らの判断で業務を進めます。
   - **主な責任**: スプリント内で目標を達成し、プロダクトを段階的に完成させること。

---

## **スクラムの主要なプロセスとイベント**

1. **スプリントプランニング（Sprint Planning）**
   - **目的**: スプリントの開始時に、チームが取り組むタスクやスプリントのゴールを決定します。
   - **進行**: プロダクトオーナーがプロダクトバックログから高優先度の項目を提示し、開発チームと協力してスプリントの目標やタスクを決定します。

2. **デイリースクラム（Daily Scrum）**
   - **目的**: 毎日行う短いミーティングで、チームの進捗状況を確認し、当日のタスクや課題を共有します。
   - **進行**: 各メンバーが「昨日やったこと」「今日やること」「現在の課題」を報告し、チーム全体で進行状況を共有します。通常、15分以内で完了します。

3. **スプリントレビュー（Sprint Review）**
   - **目的**: スプリント終了時に、開発した機能をプロダクトオーナーやステークホルダーに発表し、フィードバックを受け取る機会を持ちます。
   - **進行**: 完成したプロダクトをデモンストレーションし、次のスプリントでの改善や新たな要件についてディスカッションします。

4. **スプリントレトロスペクティブ（Sprint Retrospective）**
   - **目的**: スプリントを振り返り、プロセスやチームの改善点を見つけ出し、次のスプリントで改善策を実施します。
   - **進行**: チーム全体で「うまくいったこと」「改善すべきこと」を洗い出し、改善点を決め、次のスプリントに活かします。

---

## **スクラムで使用される主なアーティファクト（成果物）**

1. **プロダクトバックログ（Product Backlog）**
   - **概要**: プロダクトの要求やタスク、機能、改善項目をリスト化したもので、プロダクトオーナーが管理します。
   - **特徴**: プロダクトバックログには優先順位が付けられており、顧客のニーズやビジネス価値に基づいて項目が追加・削除されます。

2. **スプリントバックログ（Sprint Backlog）**
   - **概要**: 各スプリントで実施するタスクのリストで、スプリントプランニングで決定されます。
   - **特徴**: 開発チームがスプリント内で取り組む内容を明確にし、タスクの進捗状況を視覚的に管理します。スプリント中に必要に応じて更新されることもあります。

3. **インクリメント（Increment）**
   - **概要**: スプリントで完成したプロダクトの部分成果物で、動作する状態の機能やシステムの一部です。
   - **特徴**: インクリメントはリリース可能な状態であることが求められ、積み重ねることでプロダクト全体が完成に近づきます。

---

## **スクラムのメリット**

- **迅速なフィードバック**: スプリント終了ごとに動作するプロダクトを提供するため、早期にフィードバックを得ることができ、顧客の要望に柔軟に対応できます。
- **チームの自律性と協力体制**: スクラムは自己組織化されたチームを重視し、メンバー同士が協力し、責任を持ってプロジェクトを進めるため、チームの生産性が向上します。
- **リスクの早期発見**: 短いスプリントサイクルで進捗を確認するため、プロジェクトのリスクを早期に発見し、対応できます。
- **継続的な改善**: レトロスペクティブで振り返りを行い、毎回改善点を見つけ出してプロセスを改善し続けるため、チームの成長が促進されます。

---

## **スクラムのデメリットと課題**

- **スコープの管理が難しい**: 顧客のフィードバックに応じてスコープが変動するため、計画通りに進めることが難しくなることがあります。
- **コミュニケーションの負担**: チーム内やステークホルダーとの頻繁なコミュニケーションが必要で、特に大規模チームやリモートワークの場合には、円滑な情報共有が難しくなることがあります。
- **プロダクトオーナーの負担**: プロダクトオーナーは要件の優先度や顧客との調整を担うため、負担が大きく、スキルがプロジェクトの成功に大きく影響します。
- **短期間の進行がプレッシャーになる**: 短いスプリントサイクルで成果を出すことが求められるため、チームメンバーにとって精神的なプレッシャーになる場合があります。

---

## **まとめ**

スクラムは、アジャイル開発のフレームワークの中でも、**チームの自律性や顧客との協力関係を重視**し、効率的にプロジェクトを進めることができます。スプリントごとに計画と振り返りを繰り返し、継続的に改善を行うことで、変化の多いプロジェクトでも柔軟に対応できます。

スクラムを成功させるためには、**チームのコミュニケーション、プロセスの透明性、そして顧客との密な連携**が不可欠です。
ABC375Eを解いた【動的計画法】


筆者はレート700前後の茶色コーダ

当日解けなかったABC375のE問題を解いていく

https://atcoder.jp/contests/abc375/tasks/abc375_e


# 実装コード

どうやら部分和の問題に帰着できるようで、
そのとき、入れ替えが増える場合をコストと見立ててテーブルを更新するようだ。


```python:main.py
import sys
from itertools import product
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rI1(): return (int(sys.stdin.readline().rstrip())-1)
def rLI1(): return list(map(lambda a:int(a)-1,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N = rI()
    S = 0
    D = []
    for i in range(N):
        Ai, Bi = rLI()
        D.append((Ai,Bi)) 
        S += Bi
    if S % 3 != 0:
        print(-1)
        return
    T = S // 3
    # err(T)
    dp= [[float('inf')]* -~T for _ in range(T+1)]
    dp[0][0] = 0
    for a,b in D:
        ndp= [[float('inf')]* -~T for _ in range(T+1)]
        for i,j in product(range(T+1),repeat=2):
            if a==1:
                if i+b<=T:ndp[i+b][j] = min(ndp[i+b][j],dp[i][j])
                if j+b<=T:ndp[i][j+b] = min(ndp[i][j+b],dp[i][j]+1)
                ndp[i][j] = min(ndp[i][j],dp[i][j]+1)
            if a==2:
                if i+b<=T:ndp[i+b][j] = min(ndp[i+b][j],dp[i][j]+1)
                if j+b<=T:ndp[i][j+b] = min(ndp[i][j+b],dp[i][j])
                ndp[i][j] = min(ndp[i][j],dp[i][j]+1)
            if a==3:
                if i+b<=T:ndp[i+b][j] = min(ndp[i+b][j],dp[i][j]+1)
                if j+b<=T:ndp[i][j+b] = min(ndp[i][j+b],dp[i][j]+1)
                ndp[i][j] = min(ndp[i][j],dp[i][j])
        # if T<=20:
        #     err(a,b)
        #     for ndpi in ndp:err(*[f"{str(n):3s}" for n in ndpi])
        ndp,dp=dp,ndp
    ans = dp[T][T]
    print(ans if ans != float('inf') else -1)
    
if __name__ == '__main__':
    main()

```


# まとめ

ABC375Eを解いた
動的計画法を実装した

# 感想

当日はCやDをギリギリまで時間かけて解いていたので
問題を見ることすらできなかったが、
動的計画法で解ける問題があったとは…😅

解説見ながらでも実装に1時間ぐらいかかったので
結果論としてはDに時間かけたのは間違いではなさそう
UnicodeEncodeError: 'cp949' codec cant't encode character 'u702c' in position エラーが出る場合

## どういうエラーなのか
ChatGPT曰く、
>このエラーは、Pythonで文字列をエンコードしようとした際に発生したもので、特定の文字（u702c）が、cp949というエンコーディングで扱えないために発生しています。cp949は、Windowsの韓国語ローカルコードページであり、韓国語の文字セットをサポートしますが、他の言語やUnicode全体をカバーするわけではありません。

だそうです。

## 環境
Windows 10 Pro
Python3

## 何が原因か？
私の場合、Windowsのデフォルトエンコードがutf-8になっていなかったのが原因でした。

## やったこと
1.「設定->時計と言語->言語と地域->管理用言語の設定」を開きます
2. Unicode対応ではないプログラム言語のシステムロケールの変更
3. 「ワールドワイド言語サポートでUnicode UTF-8を使用」をチェック

これで発生しなくなりました。
コマンドプロンプトでのbashコマンドの使用(置換)方法


# 対象者
* Windowsのコマンドプロンプトのコマンドを簡易的にbashコマンドで置換(代用)したい方
* エイリアス(別名)設定のため、完全にはbashコマンドと一致せず、細かい動作が異なる点に留意すること


# 概要

* Windowsのコマンドプロンプトにおいて、コマンドの一部をエイリアス(コマンドの別名設定)でbashコマンドに置き換える方法を記載
    * エイリアスの作成には、コマンドプロンプトでマクロを作成・起動する「doskey」コマンドを利用
* ウィンドウを閉じると設定が消えるため、コマンドプロンプト起動時にエイリア設定を読込むようにする
    * 説明は、Windowsの「ターミナル」からのコマンドプロンプト使用を想定して記載。ただし、直接コマンドプロンプトを使用する場合も同様


# 設定方法
* doskeyコマンドをエイリアスとして使用し、bashコマンドを登録する
* まず、1. doskeyコマンドについて記載。その後、2. 起動時にエイリアスを自動で読込む方法を記載
    * ウィンドウを閉じると設定したコマンド(エイリアス)が消えるため、起動時に設定を自動読込みする
* とりあえず設定したい場合は、[2. ](コマンドプロンプト起動時のエイリアス設定の自動読込み)を参照のこと

## 1. doskeyコマンド
doskeyコマンドの使用例を記載する。
以下では、1行目が記載内容、2行目がコマンド例

* コマンド(エイリアス)を設定方法
    
    ```cmd
    doskey "マクロ(エイリアス)名"="実行コマンド"
    ```
    ```cmd
    doskey ls=dir
    ```

* コマンドに引数がある場合
    * 実行コマンドの後ろに"\\$"を記載する。\\$1, \\$2は1つの引数、2つめの引数。\\$*は任意の数の引数
        ```cmd
        doskey "マクロ(エイリアス)名"="実行コマンド" $1 $2
        doskey "マクロ(エイリアス)名"="実行コマンド" $*
        ```
        ```cmd
        doskey cat=type $*
        ```
        
        
* 設定コマンド(エイリアス)の確認
    ```cmd
    doskey /macros
    ```

* 設定コマンド(エイリアス)のファイル出力
    ```cmd
    doskey /macros > "出力先のパス"
    ```
    ```cmd
    doskey /macros > %USERPROFILE%\doskey_macros.txt
    ※　%USERPROFILE%　は環境変数で、「C:\USER\"アカウント名"」を意味する
    ```


* コマンド(エイリアス)の設定ファイルの読込み
    ```cmd
    doskey /macrofile="ファイルのパス"
    ```
    ```cmd
    doskey /macrofile=%USERPROFILE%\doskey_macros.txt
    ```

## 2. コマンドプロンプト起動時のエイリアス設定の自動読込み
* ウィンドウを閉じると設定したコマンド(エイリアス)が消えるため、起動時に設定を自動読込みする
1. 任意の場所にエイリアスを記載したファイル作成する。本例では、以下とする
   * フォルダ：%USERPROFILE%         ※ つまり、C:\USER\"アカウント名"
   * ファイル名：doskey_macros.txt
2. ファイルに設定するエイリアスを記載。記載方法は以下。設定例は次節に示す
    ```cmd
    "マクロ(エイリアス)名"="実行コマンド"
    ```
    ```cmd
    (例) ls=dir $*
    ```
    * (補足)　手順1, 2 は、コマンドプロンプト上でdoskeyコマンドを設定後に「doskey /macros > "出力先のパス"」で出力と同様  
    
  
3. コマンドプロンプトを起動時にエイリアスを読込むようにする。ここではWindowsの「ターミナル」からのコマンドプロンプトの使用を想定して記載
    * 「ターミナル」を起動し、上部タブの矢印「v」から「設定」を開く（ショートカット：Ctrl+,）
    * 「プロファイル」から「コマンドプロンプト」を選択
    * コマンドプロンプト起動時にdoskeyの設定ファイルを読込むため、「コマンドライン」に以下のコマンドを追加する。複数のコマンドがある場合は"&"で繋ぐ(例は補足に記載)

    ```cmd
    %SystemRoot%\System32\cmd.exe "/K" doskey /macrofile=%USERPROFILE%\doskey_macros.txt(=設定ファイルのパス)
    ```
    * 直接コマンドプロンプトを使用する場合は、ショートカットを作成し、プロパティの「リンク先」に上記コマンドを記載する
    * エイリアスを追加・削除する場合は、エイリアスの設定ファイルを追記・削除する

## 3. 設定ファイルの例
設定例を記載する

```
ls=dir $*
mv=move $*
cp=xcopy /e /c /h $*
rm=del $*
cat=type $*
ifconfig=ipconfig $*
clear=cls
history=doskey /history
alias=doskey /macros
touch=type nul > $1
```

# 補足
pythonのプラットフォームのanacondaやminicondaのプロンプトの場合、conda環境をactivateするコマンドを実行するため、doskeyのコマンドは以下のように"&"で接続する必要あり。
```
%windir%\System32\cmd.exe "/K" %USERPROFILE%\miniconda3\Scripts\activate.bat  %USERPROFILE%\miniconda3 & doskey /macrofile=%USERPROFILE%\doskey_macros.txt
```

# 参照サイト

* [Linuxコマンド：Windowsコマンド対応表](https://qiita.com/asmin/items/d53e71ed98a377ca7823)
* [Windowsのコマンドプロンプトでaliasを設定する (cmderの設定含む)](https://qiita.com/little_hand_s/items/91d6bcb680eba10da835)
* [コマンドプロンプトをLinuxみたいに！alias(doskey)登録と永続化](https://qiita.com/yosse95ai/items/694ae4ccfa4a69fc8286)
Firebaseでデプロイ成功したにも関わらず、アプリのトップページを表示できない

# はじめに
原因がわからず、試行錯誤してしまったので、記事に残します。

# 問題
Firebaseでデプロイ成功したにも関わらず、アプリのトップページを表示できない

以下の形で、デプロイ成功したという画面は出るが、アプリのトップページを表示できない

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3881019/bb7cd399-cc5c-567e-21d0-6209cf987ad5.png)

```
Welcome
Firebase Hosting Setup Complete
You're seeing this because you've successfully setup Firebase Hosting. Now it's time to go build something extraordinary!

Open Hosting Documentation
```

# 解決方法
firebase.jsonのpublic"の値を"public"ではなく "dist"にする必要があった。
public/index.htmlではなく、dist/index.htmlを読み込む必要があるため。
上記画像は、public/index.htmlを読み込んでいるだけだった。

```firebase.json
{
  "hosting": {
    "public": "dist",  // **変更箇所**
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

# おわりに
Firebaseの登録、デプロイ方法を間違えたのかと思い、作り直してしまいました。

# 参考
React(SPA)アプリをFirebase Hostingにデプロイ
https://zenn.dev/yumemi_inc/articles/2020-10-06-react-firebase-deploy

Firebase上にReactアプリを公開【2024年版】
https://zenn.dev/conecone/articles/058755b87fec41
メールサーバーの知識

メールサーバーに触れることがあったのでかなり初歩的なことですが、メモを残そうと思いました。

## 送信部分
#### SMTPサーバー
メールの送信部分を担うサーバーであり、送信先のIPアドレスを特定するのにDNSサーバーに問い合わせなども行う。

## 受信部分
POPサーバー、IMAPサーバーの2種類が存在する。これらの違いとしてはユーザーがメールをどのようにして参照するかが違いとなっている

#### POPサーバー
メールをユーザーの端末にダウンロードして参照する。ダウンロードされたサーバーは永久に残ることはなく、即時削除た、一定時間経過後に削除がされる。

#### IMAPサーバー
サーバー上でメールを参照するため、ユーザーの端末にメールがダウンロードされない。サーバー上でメールを参照することになるのでサーバーの容量の圧迫などが懸念点となる

## ソフトウェア
#### Postfix
メール送信に使用できるソフトウェア。オープンソースなので手軽に導入ができる。
セキュリティも考慮されており、sendmailやqmailといったソフトウェアに比べて優れた点が多い模様。
カスタマイズ性の高さや効率的にメール送信をさばけるようになっている
インストール方法
```
# dnf install postfix
```
/etc/postfix/main.conf内の設定を書き換えることで、ドメインやリレーサーバーの指定などの設定ができる

#### Dovecot
POP/IMAPサーバの構築に利用出来るソフトウェア。IPv6通信やSSL暗号化に対応しておりセキュリティ面を重視して設計されている。また高速に動作することが可能。
標準的な機能はすでに設定されており、簡単に利用することが可能で、プラグインを用いてカスタマイズをすることできるため、柔軟な対応が可能になっている。


ソフトウェアの設定などに関しては、実際に触ってみてやり方をまとめようと思います
エンジニア転職におけるアウトプットの重要性とそのメリット

## はじめに
**エンジニアとしての転職**を目指すなら、**アウトプット**は欠かせません。特に未経験や異業種からの転職を目指す人にとって、自分のスキルを証明するための手段として、アウトプットは**非常に効果的なアピール手段**です。

この記事では、**アウトプットの重要性**とその**メリット**について解説し、エンジニア転職に向けて行動を迷っている方の後押しができればと思います。

あくまで私自身の意見のため**全て正しいと言う意味ではないので参考程度**にご覧いただけると幸いです。

## 想定している読者
* **未経験でエンジニア転職を目指している人**
* **アウトプットを始めるべきか迷っている人**
* **転職活動において発信の重要性を知りたい人**

## なぜアウトプットが重要なのか？
エンジニアとしてのスキルは、履歴書や面接だけでアピールすることが難しいです。
企業は、「実際にどれだけの技術力があるのか？」を具体的に知りたがります。 アウトプットは、それを証明するための**最も直接的で効果的な手段**です。
### 実力をアピールしやすい
GitHubでのコード公開や個人開発のプロジェクト発信は、あなたの実際の技術力をアピールするために非常に有効です。 コードの質、プロジェクトの完成度、技術選定の理由などを視覚的に見せることで、**言葉で説明するよりもはるかに説得力**があります。
### 努力をアピールできる
アウトプットを継続すること自体が、**学習意欲や努力を示す証拠**になります。 Twitterでの毎日の発信や、GitHubでの活動を記録することで、日々の成長を他者にアピールできます。企業は、こうした継続的な学習と努力を非常に高く評価します。
### 他の候補者との差別化
未経験や異業種からエンジニアを目指す場合、アウトプットをしていることが**他の候補者との差を生み出し**ます。実際にアウトプットしている人は多くないため、行動に移している人は企業から見ても非常に目立ちます。
### 面接で話しやすくなる
面接では、自分のアウトプットを基に話すことで、具体的なエピソードを交えてアピールできます。 特に異業種からの転職の場合、現在の職業に関する話題よりも、自己開発や学習成果をアピールすることで、エンジニアとしてのポテンシャルを強く示すことができます。
自分自身で頑張ってきたことなので他のことよりも**深く熱量を持って話せる**かなと思います。

## おすすめのアウトプット方法
### 個人開発
**自分でアプリやサービスを開発**し、公開することで技術力を示すことができます。未経験であっても、小さなアプリからスタートすることが大切です。
私自身、Swiftでアプリを一つリリースしました。これにより、面接では**ポジティブな反応が多く**、やってよかったと感じます。

興味ある方は👇是非使ってみてご感想・フィードバックをいただけると幸いです。
https://apps.apple.com/jp/app/workout-manager/id1504443937?mt=8

### Twitter発信
技術的な気づきや学びを日常的に発信することで、**自分の努力をアピール**できます。 私も転職活動中、毎日「#今日の積み上げ」というタグでその日行った学習内容をTwitterで発信していました。結果的に、同じ未経験者や経験豊富なエンジニアとのつながりも増え、モチベーションを保つ助けになりました。
全然大した内容ではないですが、以下のような感じで毎日投稿していました。
https://twitter.com/katsusilva21/status/1283771421949194240
### Qiita・Zennでの記事執筆
技術ブログを書くことで、学びをアウトプットしつつ、**自分の理解を深める**ことができます。 QiitaやZennは初心者向けでもあり、最初の一歩として最適です。 ポートフォリオの一部としても活用でき、面接での話題にもなります。
可能であればWordPressに挑戦するのもオリジナリティが出て良いと思います。
参考例（参考になるかは...ですが）私が書いている記事が下記になります。
https://katsublog.xyz/

### GitHubにコードを公開
開発したプロジェクトをGitHubで公開し、誰でも見られる形にすることは、**技術力を証明する最もシンプルな方法**です。 たとえ未完成や改善の余地があるコードであっても、自分の成長過程を見せることで、正直な姿勢と向上心をアピールできます。
私自身、毎日Githubの草を生やすことを意識していました。
### ポートフォリオサイト
自分のスキルやプロジェクトを整理し、まとめたポートフォリオサイトを作成することで、**転職活動における信頼性を向上**させることができます。 私は、職務経歴書にポートフォリオのURLを貼り、アウトプットを一目で理解してもらえるようにしました。 簡単に作成できるツールや、最近ではChatGPTを活用して効率的に作成するのも一つだと思います。
## 最後に
エンジニア転職において、アウトプットは**あなたのスキルを証明し、他の候補者との差別化を図るための強力なツール**です。
個人開発やブログ発信、GitHubなどを活用し、自分の成長と成果を積極的に発信することで、転職活動を有利に進めることができます。アウトプットは初めてみてはいかがでしょうか。
IAMポリシーの種類

# 概要
IAMポリシーの種類を整理する

# 種類
### 管理（マネージド）ポリシー
1つのポリシーを複数の対象へアタッチが可能

### アタッチ可能な対象
- IAMユーザー
- IAMグループ
- IAMロール

### ポリシーの種類
|ポリシー|説明|メリット|例|
|-|-|-|-|
|AWS管理ポリシー|AWSによってあらかじめ定義されたポリシー。<br>ポリシーのバージョンアップもAWSが実施する。|すぐに使い始められる。|- 管理者向け：`AdministratorAccess`<br>- 請求管理者向け：`Billing`<br>- アプリケーション開発者向け：`PowerUserAccess`<br>- 読み込み専用：`ReadOnlyAccess`|
|カスタマー管理ポリシー|ユーザーが定義するポリシー。<br>AWS管理ポリシーで付与できない場合に使用する。|適用のタイミングをコントロール可能<br>- 更新時の即時適用<br>- タイミングを指定して適用||


### インラインポリシー
- 対象ごと個別に作成・付与するポリシー
- 他の対象とは共有ができない
- 管理が煩雑になりやすいので推奨はされていない

### アタッチ可能な対象
- IAMユーザー
- IAMグループ
- IAMロール
- リソース
sudo su の違い

##　su 
指定しユーザーに直接アクセスできる。その場合、パスワードを事前に知っておく必要あり

## sudo su 
su と同じ権限でコマンドを実行可能。パスワードは指定したユーザーを知らなくても問題なし。自分のアカウントのパスワードを入力することで、実現できるため。
また、ログは、/var/log/secureに残る

## sudo -i
rootのパスワードを知らなくてもrootとしてコマンドを実行できる。一方で、/var/log/auth.logにログが残らない。

## sudo -u
root以外のユーザーとしてコマンドを実行可能

```bash
sudo -i -u test1 test.sh 
sudo -i -u test1 mkdir -p /xxx/yyy/zzz.tsv
sudo -i -u test1 cp --preserve=timestamps test2.tsv /xxx/yyy/
sudo -i -u test1 cp -p test2.tsv /xxx/yyy/
```
### mkdir -p
親ディレクトリが存在しない場合は作成する
### cp --preserve=timestamps コピー先
タイムスタンプのみ保持して、コピー先にコピーする
### cp -p コピー元　コピー先
オーナー、グループ、パーミッション、日付けを保持したままコピーする

### 参考
https://www.maketecheasier.com/differences-between-su-sudo-su-sudo-s-sudo-i/
zsh: command not found: firebaseのエラーが出て、Firebaseが見つからない 

# はじめに
初歩的なことですが、時間がかかってしまったので記事に残します。

# 問題
Firebaseが見つからない　
zsh: command not found: firebase

```
% npm install -g firebase-tools

added 642 packages in 28s

70 packages are looking for funding
  run `npm fund` for details
npm notice 
npm notice New minor version of npm available! 10.5.0 -> 10.9.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.9.0
npm notice Run npm install -g npm@10.9.0 to update!
npm notice 
```

上記でインストールしているにも関わらず、Firebaseが見つからない
```
% firebase login
zsh: command not found: firebase
```

# 解決方法
zshrcに、環境変数を設定
シェルはこの場所を含めてfirebaseコマンドを検索できるようになる
```
% vi ~/.zshrc
export PATH=$PATH:/Users/ユーザー名を入力/.npm-global/bin
```
firebaseコマンドが実行できるようになった
```
% firebase --version   
13.22.0
```

# おわりに
環境変数の意味、設定方法が分かりました！
【感想】応用情報技術者試験

下書きレベルでそのまま今の気持ちを投稿する。

応用情報技術者試験の令和6年秋試験を受験してきた。
秋試験の申し込み開始をネットサーフィン中に知り、面白そうだと思って申し込んで勉強してみた。
文系卒未経験2年目エンジニアとしては、よくわからない内容ばかりで大変だった。（謎の微熱に1ヶ月半苦しめられてたことも...）（8月に60時間残業してたことも...）
ただ、自分なりにできることはやれたと思う。
今日受験してきたばかりなので、試験結果はちゃんと出てないけど（過去問道場ドットコムの解答速報だと午前試験は57/80だったので午前は合格っぽいが）、わからないことと向き合って少しずつ成長する機会を得たのは嬉しかった。
応用情報の勉強中にもっと他のことも勉強したくなってきて、そっちの書籍をKindleで購入するたびに「お、応用情報の勉強期間やで...??」と言い聞かせながら、魂を応用情報に戻してたのも良い思い出だ。
落ちてたらもう1回受けようかな。午後問題は国語できない自分としては苦手を克服する良い機会だし。

<br>
まとめが思いつかないので、唐突ですが終了します。
応用情報技術者試験令和6年秋試験の受験者の皆様、お疲れ様でした！
明日は三連休最終日なので、ゆっくり過ごしましょう！

修正：午前問題57/80ではなく、59/80だった。
【React × TypeScript 】学習記録アプリの完成

# はじめに
過去2つの課題で制作してきた学習記録アプリですが、今回で最後になります。今回はTypeScriptやChakra UIを使用して制作を行いました。

↓前回の記事はこちらです

https://qiita.com/masafumi1073/items/b3bf7997c252bde7482b

https://qiita.com/masafumi1073/items/9012a6b8e3f2c309b32b

# 制作したアプリ

![画面収録 2024-10-13 14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/66e1d5d2-52b2-5327-1f3f-334b6a28b34c.gif)


# 工夫した点
+ ***シンプルなデザイン***
直感的でシンプルなデザインを目指しました。Todoアプリのようなアプリは機能が多くないため、ユーザーが直感的に使えるようアイコンを設定しました。

+ ***TypeScriptの使用***
TypeScriptを使用することで、入力データの型を厳密に設定し、エラーを未然に防ぐようにしました。

+ ***Chakra UIの使用***
スタイリングにはChakra UIを使用しました。これまでTailwind CSSやstyled-componentsを使ってきましたが、Chakra UIはUIコンポーネントが豊富で、自分でボタンなどを作成する必要がなく、簡単にスタイリングできました。

+ ***編集機能の追加***
前回までにタスクの追加と削除機能を実装していましたが、今回はタスクの編集機能を追加しました。

+ ***react hook formの使用***
バリデーションチェックにはreact hook formを使い、効率的にformの状態管理を行えるようにしました。

# 大変だったところ
react hook formの使い方を誤解していたことで、多くのエラーが発生しました。フォームデータの状態はreact hook formにより自動で管理されるため、<font color="red">***手動でuseStateを使用して状態を管理する必要がありません***</font>。しかし、私は独自にuseStateを使って状態管理をしてしまい、状態が重複することで問題が発生しました。

具体的には、フォームデータの更新が反映されず、常に古いデータが表示されてしまう問題が発生しました。

https://qiita.com/masafumi1073/items/2082399bbbfb763993bd

# 気づき
前回から大きく成長を感じたことが２つあります。

+ ***テスト実装がスムーズにできるようになった***
前回の課題ではテストが何かもわかっていませんでした。テストの実装にはかなり苦戦し一番時間がかかったことでした。（以前の私の状況は下記の記事に記載していますのでぜひご覧ください。）しかしテストの実装の仕方を一度経験したことによって、今回はスムーズに実装することができました。前回とは異なりモックを使ったテストの実装も行なっておりテスト実装のスキルは大きく向上しました。

https://qiita.com/masafumi1073/items/e0e7721136cff0c45a0b

+ ***エラー解決能力が向上した***
まだまだ足りないところはたくさんあるのですが、前回よりはエラー解決能力が向上しました。今回はreact hook formのstate管理でかなり苦戦しました。formのデータの更新がうまくいっておらず今までだったら闇雲に間違いを探すかchat GPTまかせでした。formのデータ更新がうまくいかないので、state周りが怪しいとある程度問題がある箇所を絞ることができエラーを探すことができたのは大きな成長だと思いました。

# 終わりに
このアプリの製作中に、会社のReact案件にアサインされることが決まりました。今回の学習が実務でも活かせると感じています。引き続き、学習を頑張っていきたいです。

# JISOUのメンバー募集中
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからお願いします👇

https://projisou.jp
アウトプット学習を3ヶ月続けた結果

# はじめに
アウトプット学習を始めて3ヶ月が経ったので振り返っていきたいと思います。

ちなみに1ヶ月目と2ヶ月目の記事はこちら。

https://qiita.com/acu8/items/19b7fd61722435eeb282

https://qiita.com/acu8/items/30ab56eb9d77c2a67594

# この1ヶ月の振り返り
### やったこと
・新しい個人開発の企画案を検討
・上記の個人開発に着手
・Qiita記事投稿(この記事を入れて8本）

9月はJISOUの課題7として、ユーザーに使ってもらえるような個人開発の検討をし、その開発に着手をしていました。
企画の検討に時間がかかってしまったので、開発自体に時間を割くことができていなかったですが、なんとか少しでも進めてきたので振り返ってみたいと思います。

# 学習3ヶ月目からの開発内容について
アプリを作りながら開発の勉強を進めてきたのですが、ここにきてなんでも作ってもいいけど、ユーザー価値を意識したものを検討する難しさを実感しました。
アイデアとしてはいくつか出てきたのですが、そこからユーザーに使ってもらうためにはどういう工夫が必要なのか、そもそも実現可能なのか、など検討すべきことが多くなり急にレベルが上がったように感じます。
ただ開発をして何か作ればいいというわけではなく、実際に使われることを意識することで、今までのアプリだと「少し使いにくいけどまあいいか」となるところも、しっかりと検討しないといけないと感じるようになりました。

# 学習3ヶ月目に直面した難しさ
9月は上記のように急にハードルが上がり、自分で考えること、やらないといけないことが今まで以上に増えて、進捗が思うように進みませんでした。
また自分の実現したいことをやるためにはそれぞれの技術のキャッチアップが必要だったり、自分がまだわかりきっていないという部分が多すぎて立ち往生してしまったり、どのように解決をすればいいのかわからない状況が続いていました。
正直にいうと、今でもまだ解決がわからないことが多くあります。
そうなるとまとまった時間が取れる時以外は手をつけることが嫌になってきます。



それでも手を動かしたり、毎日少しでもいいから手をつけるように意識し始めました。
一日10分でもいいから何かやってみる。今はこれだけを考えて開発を続けるようにしています。

また、開発のステップをかなり細かくするというのも大切だなと気付きました。
開発を始める前に作成したMVPを見返すと、ざっくりとしていて、もっと細かくしていくとやりやすいかもしれないと思い少し修正を加えて進めています。

# おわりに
9月は個人的にあまり進むことができなかったなという所感でしたが、そんな中でも気づけることがあったり、技術のキャッチアップが必要な場所が特定できたので少しは得るものがあったのかなと書いていて思いました。
10月は開発を進めてスキル面で成長ができているように頑張りたいと思います。
【Next.js + Vercel】Cron Jobsを設定

# はじめに
個人開発を進めている中でCron Jobs設定をして定期的にDBへデータを入れる作業を自動化しましたので共有をしたいと思います。

# Vercel Cron Jobs作成の手順
### 1. Jobファイルの作成 
Next.jsのappルータを使用していますので、以下のファイルを作成します
　app > api > cron > route.ts

 中身は以下のような内容で、使用する際は個別に必要な機能を追加してください。
 ```: route.ts
import type { NextRequest } from 'next/server';
import { createClient } from '@supabase/supabase-js'


export const runtime = 'edge';

const supabase = createClient(
    process.env.NEXT_PUBLIC_SUPABASE_URL!,
    process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
  )
 
export function GET(request: NextRequest) {
    const authHeader = request.headers.get('authorization');

    if (authHeader !== `Bearer ${process.env.CRON_TOKEN}`) { 
        return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
      }
 
  return Response.json({ success: true });
}

 ```

 ※エッジランタイムを使用していると、axiosは使用できないため注意してください。
※また、エッジランタイムを使用する場合で、supabaseを使用する場合は直接このファイル上でcreateClientを作成しないといけませんので、こちらも注意してください。

### 2. CRON_TOKENの設定方法
こちらはvercelのプロジェクト＞Settingにいくと環境変数を設定するところがあります。
![スクリーンショット 2024-10-13 16.56.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/6c92a59b-307f-5bfe-c8e2-9c07d915e880.png)


ここにCRON_TOKENを設定してください。

### 3. vercel.jsonファイルの作成
こちらはvercel上のCron Jobsの手順2をそのままコピペします。(内容はプロジェクトに合わせてください)

![スクリーンショット 2024-10-13 17.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825671/6ea3c941-0412-cfd2-b5df-07bbb49f84d6.png)


```: vercel.json
{
  "crons": [{
    "path": "/api/cron",
    "schedule": "0 10 * * *"
  }]
}
```

以上で準備は完了です。

あとはvercel.jsonに設定をした時刻にジョブが実施されます。
いますぐ確認したい方は以下のcurlコマンドで実行が確認できます。

```:コマンド
curl -X GET http://localhost:3000/api/cron \
-H "Authorization: Bearer XXXXXX"    ←設定したCRON_TOKENを入力

```

# おわりに
前はViteを使ってCron jobsを設定したことがありましたが、vercelの方が簡単にできました。
Vercel画面上でジョブのログを見ることもできるので、便利そうです。
皆様の参考になれば幸いです！


# JISOUのメンバー募集中！

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
実践的なカリキュラムで、あなたのエンジニアとしてのキャリアを最短で飛躍させましょう！
興味のある方は、ぜひホームページからお気軽にカウンセリングをお申し込みください！
▼▼▼

https://projisou.jp/
Thymeleafを使ったコードのリサイクル

## この機能の便利さ 
``` 
<div class="nav" th:fragment="navbar">
    <a class = "logo">Shop</a>
    <a>List</a>
    <a>modify</a>
</div>
```

ウェブサイトを作る時、上段に上のTMLコードで機能を追加するとする．
サイト内のどこのページに移動しても適応しようとしたら、いつもコピペすることになるので結構ややこしい問題に会う時が来る
こういう時にThymeleafの **「replace」** を使ったら簡単に解決できる

## 適応方法

### １．上のコードだけ新しいHTMLファイルに作成しておく．
``` html:nav.html
<div class="nav" th:fragment="navbar">
    <a class = "logo">Shop</a>
    <a>List</a>
    <a>modify</a>
</div>
```
:::note info
**「th」** はThymeleafの属性で
サーバからデータを動的に読み込むことを可能にさせる
**fragment**はコードの一部をリサイクルしますという宣言で
リサイクルする時に**navbar**を入力する．
:::


### ２．そして適応したいHTML本文に下のように書き込む．

``` html:list.html
//<head>

<body>

    <div th:replace="~{nav.html::navbar}" ></div>
    ~~~~~
    ~~~~~
```


それで適応させたい本文で上のようにコードを追加する．
**「replace」→ nav.htmlの navbar（"~{nav.html::navbar}")** リサイクルするという意味になる

fragmentに入る名前は付けたい名前を付けていい．

### 適応例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3876472/80b952ee-757c-d469-87d3-f690e2c861fe.png)

写真はSPRINGを学びながら私が作っている球団のホームページに今まで説明した通りページの上段に追加したことである
次に実装させる機能は実際タッチしたら他のページに行く方法、それをThymeleafとSPRINGでどう実装させるかに関して投稿しようとおもっている．

ありがとうございます．
バージョンカタログでライブラリなどを一括管理

# 前提
・gradleを使ってandroidアプリを開発をしたことがあること。
・gradleで「implementation(libs.androidx.navigation.compose)」のような依存関係の書き方がわからない人向け。
・この記事は、.gradle.ktsの書き方で紹介しています。

# バージョンカタログを使うと🧐
gradleファイルで以下のように依存関係が実装されていることがよくあります。

```gradle:build.gradle.kts
implementation("androidx.navigation:navigation-compose:2.8.2")
```

バージョンカタログであらかじめ設定しておくと以下のように書ます！

```gradle:build.gradle.kts
implementation(libs.androidx.navigation.compose)
```

綺麗ですね。ただ、何も設定せずには書けません。

# バージョンカタログファイルを作る🚀
プロジェクトのgradleフォルダに、libs.versions.tomlというファイルを作成します。
筆者のプロジェクトはもともと存在していました。

```toml:libs.versions.toml
[versions]

[libraries]

[plugins]
```
以上のようにセクションを追加します。
バージョンとライブラリとプラグインで書く場所を分けます。

# libs.versions.tomlの書き方✍
implementation("androidx.navigation:navigation-compose:2.8.2")は以下のように書けます。
```toml:libs.versions.toml
[versions]
androidxNavigation = "2.8.2"

[libraries]
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "androidxNavigation" }

[plugins]
```
[versions]には、androidxNavigation（任意の名前）の宣言とライブラリのバージョンを代入をしています。
[libraries]では、androidx-navigation-compose（任意の名前）の宣言と、ライブラリのgroup、name、version.refを設定しています。
navigation-composeライブラリのバージョン2.8.2を例にしています。

# build.gradle.ktsに依存関係を実装する🛠
以下をdependencies内に書いてSync Nowを実行。
エラーが出なければOKです。
```gradle:build.gradle.kts
implementation(libs.androidx.navigation.compose)
```

# 終わりに👋
バージョンカタログで一括管理した方が、gradle.ktsファイルでバージョンを直書きしなくていいし管理しやすい。
以上!!!
shellスクリプト ゴミ掃除-不要なディレクトリおよびファイルを削除

## ゴミ掃除
リリースに向けて不要なディレクトリおよびファイルを削除するためのスクリプト

## スクリプト
```bash
input=${1}

function check_input(){
 input="${1}"
for type in {a, b}
 do
  if ["${type}" = "${input}"] ; then
   return 0
  fi
done

return 1
}

if !check_input "${input}" ; then
 msg = "xxxx"
 echo "${msg}"
 exit 1
fi

find /xxx/* -ls -follow > /xxx/test_before.tsv

if ["${type}" = "x"] ; then
 rm -rf xxxxx

 else
 rm -rf yyyyy
fi

find /xxx/* -ls -follow > /xxx/test_after.tsv

exit 0
```

### exit [n]
処理が終了させる。nに1を指定した場合は異常終了したこととなる。
1を除く0-255以外の場合は、正常終了したことになる。
nを指定しなかった場合は、最後に実行したコマンドの終了ステータスが適用される。

### コマンド find /xxx/* -ls -follow > /xxx/test_before.tsv
xxxディレクトリ配下に存在するファイルおよびディレクトリをtest_before.tsvに記入する

#### オプションについて
-ls のみの場合：時刻、権限、ユーザー名、パスが記入される
-ls -followの場合：-lsのみの場合と同じ。さらに、-followが付いていることで、追記が可能。
-followのみ：パスのみ記入される
オプションなし：パスのみ記入される

### rmコマンド
ファイルやディレクトリがなくても実行される。
また、削除できなくても、rm以下の処理は実行される。
そのため、使用者はファイルを削除できているか確認する必要あり。

```bash
rm -rf /xxx/*
if [! -f /***/*] ; then
 exit 0
fi
```
XSSって、結局どこのサイトがクロスしてるの？？

## 初めに
この記事は以下が分からない人向けに説明するものです。


（1）XSSって概要は知ってるけど、『コマンドが実行されちゃう』程度しか分からない。
（2）何がクロスしているのか分からない。罠ページとウェブサイトがクロスしているの？
（3）脆弱性があるのは罠ページ？掲示板？ウェブサイト？ユーザのブラウザ？
（4）以下の図を見て頭痛がする人

<img width="500" alt="ハードに直接乗っている" src="https://www.mobi-connect.net/assets/library/2023/03/1d7870a2a7b6405fae23410ed8ba6883.png">

参考：
[クロスサイトスクリプティング（XSS）とは？攻撃の仕組みや被害事例、対策方法を解説とは](https://www.mobi-connect.net/blog/what-is-xss/)

## （1）XSSの概要
結論からいうと、XSSとは『脆弱性のあるWebサーバに、ユーザ自身すら意図していない脅威性のあるコマンドを含めたリクエストが送信されることで、Webサーバはそのリクエスト通りの結果を返してしまいユーザが被害を被る』といった攻撃。
Webサーバから見れば「いや、お前が「僕の情報を漏えいさせてください」ってリクエストしたんやんけ…それに従ったまでよ」という感想ですが、ユーザは「いや従うなや！あのリクエストは騙された送ったんや！明らかにおかしいリクエストなんやから止めろや！」と口論に。

## （2）何がクロスしているのか
脆弱性のあるサイトを介して攻撃がされるため、クロスサイトと呼ばれています。
つまり、冒頭では非常に複雑な手法で攻撃されているように見えますが、
極論これが全容です。
（XSSには3種類あり、これは反射型の説明です。他は暇な時追記するかも）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/9b431aa3-443c-a6e0-a870-9e92d95f0797.png)

当然、被害者は自分の意志で自身に攻撃するドMではありません。
ではなぜこんなことになってしまうのか。
それは、この自傷行為にしかならないヤバいコードが含まれたURLをバラまいている攻撃者に騙されたからです。多いのは掲示板などからクリックしてしまうケース。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/367933cc-e6b1-2a00-d2ff-6f3f498d2454.png)
これをクリックしてしまったせいで、最初のイラストのようにユーザから不審なリクエストがクソブログ.comに投げられてしまったわけです。

## （3）脆弱性があるのは？
XSSの脆弱性があるのは、上記例でいうと『クソブログ.com』です。
クソブログ.comが「いや、このリクエストはおかしい。騙されてるな」と見破り「そのリクエストには答えられんよ」とすればいいのです。（それか文字列だけで返すか）

しかし脅威性のあるURLを乗っけた掲示板には非がない訳ではありません。
なぜならGmailで確認したところ、ちゃんと攻撃性のあるURLはリンクとして反応しないような仕組みになっていたからです。掲示板はこの仕組みを適用するべきでした。
ただし、この掲示板は「言われたとおりURLを乗せただけで、攻撃したりはしてない。コメントを載せたのが攻撃者だとは知らなかった」と言い訳。
XSSとは「サーバで変なコード（スクリプト）が処理されずにユーザに返される」攻撃を指すので、それらを行っていない以上、掲示板にXSSの脆弱性があるとはいえないかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919278/014662ac-5b83-caa0-e5db-61a3da1ec95c.png)

## 以上
質問ある方はコメントしてね。
テスト115

```vb

Sub Mail_Create()
'Excelファイルを添付したメールをメールに添付する
Dim ol As Outlook.Application
Dim MI As Outlook.MailItem
Dim str_Path As String
Dim Attach_Path As String

Set ol = CreateObject("Outlook.Application")
Set MI = ol.CreateItem(olMailItem)

str_Path = "C:\Users\User\Desktop\VBA関連\VBA練習\保存用\test.msg"
Attach_Path = "C:\Users\User\Desktop\VBA関連\VBA練習\保存用\test.xlsx"

'メール各設定
With MI

    .SentOnBehalfOfName = "差出人"    '差出人
    .To = "To宛先"    'TO
    .CC = "CC"    'CC
    .BCC = "BCC"    'BCC
    
    .Subject = "件名"    '件名
    
    '本文
    .Body = "本文テスト"
    
    'メールにテスト用のExcelファイルを添付
    .Attachments.Add Attach_Path
    
    'Excelファイルを添付したメールを保存
    .SaveAs str_Path, olMSG

End With

Set MI = Nothing

'------------------------------
Set MI = ol.CreateItem(olMailItem)

'メール各設定
With MI

    .SentOnBehalfOfName = "差出人"    '差出人
    .To = "To宛先"    'TO
    .CC = "CC"    'CC
    .BCC = "BCC"    'BCC
    
    .Subject = "件名"    '件名
    
    '本文
    .Body = "本文テスト"
    
    '保存したメールファイルを添付
    .Attachments.Add str_Path

    'メール表示
    .Display

End With

Set ol = Nothing
Set MI = Nothing


End Sub
MacでUS、UKキーボード使用時の入力切替がうまくいかない問題の解決法

# 👍️ いいねのお願い
同じ悩みを抱えていた人がいたら、👍️やコメントお願いします。(自分だけだったのかが知りたい。)  

# ✍️ はじめに
**JISキーボード以外**を使用しているユーザーはおそらく入力切替で**Ctrl+Space**を使っているかと思います。その場合、入力切替がなかなか切り替わらないことございませんか？

筆者自身がこの現象に会って半年以上苦しみましたが、ついに解決法を見つけたので共有いたします。（なぜこれについて書いた記事がみつからなかったのか。。）

# 📝 結論
以下のコマンドをターミナルで入力し、Macを再起動してください。
```zsh
defaults write -g ApplePressAndHoldEnabled -bool false
```
ターミナルとは：https://jp.minitool.com/data-recovery/open-terminal-mac-command-prompt.html

:::note warn
警告
このコマンドを打つことで、原因に示す機能がオフになります。
:::

# 💢 原因
原因は以下の機能のせいです。。。
![原因](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3907333/1be37a25-3f71-9fde-b031-8aa4248b85d0.png)


この機能をオフにすることで入力切替がスムーズに行くようになりました。

もしこの機能を再度オンにしたい場合はこちらのコマンドをターミナルで入力してください。
```zsh
defaults write -g ApplePressAndHoldEnabled -bool true
```

# 👋 まとめ
この現象で悩んでいる人の救いになればと思います！
LangchainでRAGをDBに保管する方法



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

まず、Langchainとデータベース用のライブラリをインストールします。例えば、SQLiteを使う場合は以下のようにします。

```bash
pip install langchain sqlite3
```

### データベースのセットアップ

SQLiteを使ってデータベースをセットアップします。以下は基本的なテーブルを作成する例です。

```python
import sqlite3

# データベースに接続
conn = sqlite3.connect('rag_data.db')
cursor = conn.cursor()

# テーブルの作成
cursor.execute('''
CREATE TABLE IF NOT EXISTS documents (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    content TEXT NOT NULL
)
''')

conn.commit()
conn.close()
```

### Langchainの設定

Langchainを使ってRAGを実装します。以下は基本的な流れです。

```python
from langchain import Langchain
from langchain.vectorstores import SQLiteVectorStore
from langchain.embeddings import OpenAIEmbeddings

# データベース接続
conn = sqlite3.connect('rag_data.db')

# ベクトルストアの設定
vectorstore = SQLiteVectorStore(conn, 'documents', embedding=OpenAIEmbeddings())

# Langchainのインスタンスを作成
langchain = Langchain(vectorstore)

# データの追加
def add_document(content):
    cursor = conn.cursor()
    cursor.execute('INSERT INTO documents (content) VALUES (?)', (content,))
    conn.commit()

# ドキュメントの追加例
add_document("これはサンプルドキュメントです。")
```

### 質問応答の実装

RAGを使って質問応答を行うための基本的な例です。

```python
# 質問応答の実行
query = "サンプルドキュメントについて教えてください。"
response = langchain.query(query)

print(response)
```
React18のSuspenseをReact17以前のSuspenseとlagyを使って表現する。

## はじめに
[前回](https://qiita.com/koji0705/items/75b7f734d833187dba93)までの記事の続きです。React18の実装前の場合はどのように表現する必要があるのかを記載していこうと思います！

## 成果物


```tsx:src/SuspendUserOld.tsx
import React, { Suspense, useState, useEffect, lazy } from "react";

// 遅延ロードするコンポーネント
const UserList = lazy(() => import("./UserList")); // default exportでないと表示ができません。

// API通信関数
const getUserData = async () => {
	await new Promise((resolve) => setTimeout(resolve, 5000));
	const res = await fetch("https://jsonplaceholder.typicode.com/users");
	if (!res.ok) {
		throw new Error("Failed to fetch data");
	}
	return res.json();
};

// メインコンポーネント
export const SuspendUserOld = () => {
	const [userData, setUserData] = useState(null);
	const [loading, setLoading] = useState(true);
	const [error, setError] = useState(null);

	useEffect(() => {
		// API通信を行う
		const fetchData = async () => {
			try {
				const data = await getUserData();
				setUserData(data);
				setLoading(false);
			} catch (err) {
				setError(err.message);
				setLoading(false);
			}
		};

		fetchData();
	}, []);

	// ローディング中のUI表示
	if (loading) {
		return <div>Data fetching Loading...</div>;
	}

	// エラーが発生した場合の表示
	if (error) {
		return <div>Error: {error}</div>;
	}

	return (
		<Suspense fallback={<FallbackUI />}>
			<UserList userData={userData} />
		</Suspense>
	);
};

export const FallbackUI = () => {
	return (
		<div>
			<p>Fallback Loading...</p>
		</div>
	);
};
```

```tsx:UserList.tsx
import React from "react";

// `UserList` コンポーネント
const UserList = ({ userData }: { userData: any }) => {
	return (
		<ul>
			{userData.map((user: any) => (
				<li key={user.id}>
					{user.name} ({user.email})
				</li>
			))}
		</ul>
	);
};

export default UserList; //lagyでimportする場合、デフォルトエクスポートでないとimportできません。

```

## おわりに
Suspenseだけで表現できない分、ちょっと実装が面倒な箇所がありますね！
React18のSuspenseは優秀ですね！
【アルゴリズム】挿入ソートを詳しく解説してみる

### 挿入ソート 

ソートのアルゴリズムは、理解するのはそれほど苦労しないのですが実際にコードに落とし込む段階でいつもつまずくので記録して書き残しておこうと思います。概要は下記。その他解説ページは世の中にあふれていますのでそちらを参照していただければと思います。

https://ja.wikipedia.org/wiki/%E6%8C%BF%E5%85%A5%E3%82%BD%E3%83%BC%E3%83%88

```JavaScript
// 挿入ソート Javascript
function insertionSort(A) {
  var N = A.length;
  
  for (var j = 1; j < N; j++) {
    var ins = A[j];
    var i = j - 1;
  
    while (i >= 0 && ins < A[i]) {
      A[i + 1] = A[i];
      i = i - 1;
    }
    
    A[i + 1] = ins;

  }
  return A;
}

insertionSort[ 5, 2, 9, 1, 4 ]
```
この記事では挿入ソート（上記）のコードをねちっこく見ていこうと思っています。JavaScriptです。


```JavaScript
  for (var j = 1; j < N; j++) {
    var ins = A[j];
    var i = j - 1;
```
上記のforループでは、j = 1から開始。j = 0の場合だと要素が１つだけなので比較やソートできないため。ポイントは var ins = A[ j ] の部分で、挿入する要素をins変数に代入しています。ループの最後でこの数値を適切な場所に戻すことになります。i = j - 1として、インデックス番号jと比較する対象になります。

```JavaScript
    while (i >= 0 && ins < A[i]) {
      A[i + 1] = A[i];
      i = i - 1;
    }
```
そして挿入ソートの本丸, whileループ。

```JavaScript
    while (i >= 0 && ins < A[i]) {
```
この１行で「 i が 0 以上かつ ins が A[ i ] より大きい」という条件を満たした場合という条件付きでwhileループが記述されています。

これが何を調べているのか細かく見ていきます。

```JavaScript
i >= 0
```
この１行は配列の先頭（＝インデックス０）を超えていないか確認。超えている(= インデックスが０より小さい)部分には要素が存在しないのでループ処理をする意味がない。

```JavaScript
ins < A[i]
```
この１行は、挿入したい値（ins）が、現在見ている値（ A[ i ] ）より小さいか確認。この条件は、新しい要素（ins）をどこに挿入すべきかを決定するために使用されます。insより大きい要素を見つけた場合、その要素（とそれ以前の要素）は右にシフトするし、insより小さいか等しい要素を見つけた時点で、その直後が正しい挿入位置となります。もしこの条件がなければ、アルゴリズムは常に配列の先頭まで要素をシフトしてしまうので、それを防ぐ役割も。

```JavaScript
A[i + 1] = A[i];
```
while ループ中の記述です。新しい要素（ins）を挿入するための空間を作りつつ、ソート済みの部分で、新しい要素より大きい要素を右に移動させています。具体的には、A[i]の値を、その右隣のA[i + 1]にコピーし、結果として、A[i]の値が右に1つ移動したことになります。whileループ内でこの操作を繰り返すことで、必要な数だけ要素を右にシフトすることができます。

```JavaScript
i = i - 1;
```
i の値を小さくしていくことで、調べる範囲を左に拡大していきます。

```JavaScript
A[i + 1] = ins;
```
このコードはwhileループ終了後に実行されます。whileループでinsより大きい全ての要素が右にシフトされているので、その後にこのコードを実行することで、insが正しい位置に挿入されます。whileループが終了した時点で、iはinsより小さい（または等しい）最後の要素のインデックスを指しているので、i + 1が新しい要素（ins）の正しい位置になっています。

```JavaScript
for (var j = 1; j < N; j++) {
```
そして再びforループが始まり、範囲を広げて同じ処理が繰り返されることになります。これを繰り返して、すべての処理が終了すると配列の要素が小さい順に並び変わっているというものです。

---------------------------------------
### 挿入ソートの時間計算量 (time complexity)

最悪の場合: O(n^2)
入力配列が逆順にソートされている場合。[5, 4, 3, 2, 1]など。
　外部ループ: n-1回実行（nは配列の要素数）
　内部ループ: 最悪の場合、各要素を配列の先頭まで移動
　結果: 1 + 2 + 3 + ... + (n-1) = n(n-1)/2 の比較操作

平均の場合: O(n^2)
ランダムな順序の入力配列の場合

最良の場合: O(n)
入力配列が既にソートされている場合。[1, 2, 3, 4, 5]など。

### 挿入ソートの空間計算量 (space complexity)
O(1)（定数空間）

---------------------------------------
### 結論
挿入ソートは、時間計算量が最悪でも平均でもO(n^2)であり、大規模なデータセットには適していない。ただし空間効率が O(1)とよいため、小規模なデータなどには効果的と言えるかも？
S3 Glacierの取り出し方法による比較

# 概要
「S3 Glacier Flexible Retrieval」と「S3 Glacier Deep Archive」に保存されているアーカイブは直接ダウンロードできない。
取り出すには「復元リクエスト」　が必要で、一旦S3バケットに取り出す必要がある。
その際、取り出し方法によって所要時間やデータ量に応じて発生する金額が異なる。

# 所用時間
|取り出し方法|S3 Glacier Flexible Retrieval|S3 Glacier Deep Archive|
|-|-|-|
|迅速|1~5分|-|
|標準|3~5時間|12時間以内|
|大容量|5時間~12時間|48時間以内|

# 金額

### 1GBあたりの金額
|取り出し方法|S3 Glacier Flexible Retrieval|S3 Glacier Deep Archive|
|-|-|-|
|迅速|0.033USD|-|
|標準|0.011USD|0.022USD|
|大容量|-|0.005USD|

### 1000回あたりの金額
|取り出し方法|S3 Glacier Flexible Retrieval|S3 Glacier Deep Archive|
|-|-|-|
|迅速|11USD|-|
|標準|0.00571USD|0.1142USD|
|大容量|-|0.025USD|

# 参考の書籍
要点整理から攻略する　『AWS認定ソリューションアーキテクト-アソシエイト』
https://amzn.asia/d/7a95zCC
GitにあげたファイルはPCから削除しても大丈夫？PCの容量を気にする人へ

## はじめに
- 「PCの容量が足りなくて困っている！そんな時、GitにあげたファイルをPCから削除してもいいの？」という疑問を解決します。
- Git初心者でも理解できるように、基本的な流れや注意点をまとめました。

## Gitにあげたファイルの仕組み
- Gitにあげる（git push など）というのは、**リモートリポジトリ**（GitHubなど）にファイルをアップロードすることです。
- あげたファイルはリモートリポジトリ上に安全に保存されますが、**ローカルリポジトリ**（PC上）にもコピーがあります。

## PCから削除することは可能？
#### 結論: PC上からファイルを削除することは可能
ただし、削除後にプロジェクトを編集する必要が出た時、そのファイルを手元で確認できなくなります
どうしてもPC容量を減らしたい場合は、リモートにあげた後、PC上から削除する方法があります。

## 手順
#### 1. ファイルをコミットしてリモートにプッシュする。
```bash
git add .
git commit -m "ファイル追加"
git push origin main
```

#### 2. PC上のファイルを削除!!
普通にPC上のエクスプローラーやFinderでファイルを削除してOK

(`git rm`を使ってもOK)
```bash
git rm ファイル名
git commit -m "ファイル削除"
git push origin main
```

####  3. 削除後のファイル復元方法
後でファイルが必要になった場合、Gitから簡単に復元できます！
例えば、次のコマンドでリモートから最新の状態を取得できます。
```bash
git pull origin main
```

## 注意点
#### 古いバージョンに戻りたいときの影響
削除したファイルが必要な状態に戻したい場合、すぐに参照できないため、リモートリポジトリから都度ダウンロードが必要になります。
古いバージョンに戻して確認する場合、すべてのファイルが手元にある方が便利です。
#### Git管理外のファイル
Gitにあげていないファイルは削除してしまうと、**復元できません**。
重要なファイルは事前にGitにコミットしておきましょう。

## まとめ
- **GitにあげたファイルはPC上から削除してもOK**ですが、必要な時に再ダウンロードが必要です。
- PCの容量を確保したいなら、リモートにしっかりとプッシュし、削除しても問題ありません。
- ただし、古いバージョンに戻す際などに影響があることを覚えておいてください。
[AWS]ルーアカウント作成後にするセキュリティ設定

# はじめに
　AWSの学習のために検証用のアカウントを用意していただきました。
気軽に検証ができるのがクラウドのメリットなので、これからサーバーを立てたりと色々と検証をしていこうと考えています。検証をするだけでもいいのですが、せっかくなので検証内容を記事にしていきたいと思います！

今回は、検証の前にルートアカウント作成後にやっておくべき設定について記事にしたいと思います。
これからアカウント作成する初心の方の参考になると嬉しいです。

下記の公式ハンズオンの中から自分に必要だと考える設定を実施しています。
料金が発生するサービスもあるのでご注意ください。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Security-1-2022-reg-event.html?trk=aws_introduction_page

# 実施内容
・作業用ユーザーの作成
・AWS Budgetsでコストのアラートを設定
・AWS　Cloudtrailの確認

# 実施詳細

・作業用ユーザーの作成
　作業用のIAMユーザーを作成します。ポリシーは「AdministratorAccess」をアタッチしました。
 ルートアカウントはどのような作業でも可能な権限を持ったユーザーです。AWSでは、ルートアカウントを日常的に利用することは推奨されてないので、管理者権限を持ったユーザーを作成しておき、今後検証する際は管理者権限のユーザーか新規で権限を狭めたユーザーを作成し実施していく予定です。

AdministratorAccessは、基本的にどのサービスにもアクセスが許可されているマネージドポリシーです。

・AWS Budgetsでコストのアラートを設定
　1ヶ月で利用可能な予算を設定し、設定した値を超える場合にアラートを送付するように設定しました。AWSは従量課金のため利用し続ければ秒、分、時間単位などで課金がされます。そのため、1ヶ月の途中で予算を超える可能性があるので、Budgetsの設定が重要になります。また、意図していなくてもサービスを利用していると、想定より多額の料金が発生するケースもあるのでそういったケースも防ぐ効果があります。

 少し細かい設定内容を話すと、料金が設定した予算の50、65、80％を超えた際に指定のメールアドレスにメールを送信するようなアラートを設定しました。これで、早い段階で料金の把握が可能でメールの見逃しも防げると考えています。
 

・AWS　Cloudtrailの確認
　Cloudtrailのイベント管理はデフォルトでAWSサービス全体の管理イベントをログに記録します。90日間分は無料で確認ができるので、ログが記録されているか念の為確認します。現状では「ConsoleLogin」など少ないログしかないですが、記録されているのを確認できました。90日以上の管理イベントを記録したいや、管理イベント以外の記録も取りたい場合は料金が発生するのでご注意ください。


# 参考
https://docs.aws.amazon.com/ja_jp/aws-managedpolicy/latest/reference/AdministratorAccess.html
https://aws.amazon.com/jp/cloudtrail/pricing/
map関数の引数のコールバック関数の丸括弧と中括弧

## すみません

JavaScriptやフロントエンドフレームワークについてはかなり初心者です。
誤っている点ありましたらどんどんご指摘いただければと思います。

## 内容

Remixにてとある画面表示でmap関数を使っている。
下記のように書いていた。

```react
{hoges.map(hoge => (
  <li key={hoge.fuga.id}>{hoge.fuga.name}</li>
))}
```

表示だけならこれだけで全然問題ない。
ただ、mapの中のhogeをconsole.logしたくて、下記のようなコードを書いたところエラーになった。

```react
{hoges.map(hoge => (
  // 丸括弧使用だけはエラーになる
  console.log(hoge);
  <li key={hoge.fuga.id}>{hoge.fuga.name}</li>
))}
```

ちょっと調べたところ下記の様にmap関数の引数のコールバック関数でちゃんとreturnすれば`console.log(hoge);`を書いてもエラーにならないらしい。

```react
{hoges.map(hoge => {
  // 中括弧使用 + returnがあればエラーにはならない
  console.log(hoge);
  return <li key={hoge.fuga.id}>{hoge.fuga.name}</li>;
})}
```

両方ともmap関数の引数がコールバックであることは間違いないのだが、なぜ後者だとエラーが出ないのか調べたので簡単にまとめてみる。

## エラーが出るパターンの解説

map関数の引数でクロージャが渡されているが、丸括弧が使われている。
どうやら丸括弧を使うと、丸括弧内部の単一の式の暗黙のreturnが行われるようだ。
暗黙のreturnが行われるので丸括弧内部には単一の式しか書けない。いくら行を変えたとしても単一の式しか書けない。
だから下記はエラーになる。

```react
{hoges.map(hoge => (
  // 括弧使用だけはエラーになる
  console.log(hoge);
  <li key={hoge.fuga.id}>{hoge.fuga.name}</li>
))}
```

## エラーが出ないパターンの解説

map関数の引数でクロージャが渡されているが、中括弧が使われている。明示的にreturnも行われている。
このタイプのクロージャの省略記法は割と一般的でよく見るタイプだ。
クロージャの中の処理でもちろん複数の式を書くことができる。暗黙的にreturnされることもない。ただしコード量は増える。
returnする内容を指定でき、複数の式を記載する事ができる。
だから下記はエラーにならない。

```react
{hoges.map(hoge => {
  // 中括弧使用 + returnがあればエラーにはならない
  console.log(hoge);
  return <li key={hoge.fuga.id}>{hoge.fuga.name}</li>;
})}
```

## 追記（2024/10/15）

先輩に教えていただきました！忘れたくないので簡単にメモします！

- アローの省略形は`hoge =>`が「=>の後ろをreturnします」という意味
- `hoge =>`の後ろが式`()`であるかコードブロック（文など）`{}`であるかが重要
- 式というのは「1 + 1」のようなその一行で結果があるもの
- 文というのはif文のようなそれ単体では結果が返されないもの