OmniAICreator/Qiita-1.07M huggingface dataset:
LinuC レベル2 合格体験記

LinuCレベル2に無事合格しましたので、合格体験記をここに残します。
これから受ける方のご参考になりましたら幸いです！

LinuCレベル1の合格体験記はこちらから

https://qiita.com/EndoMotoki/items/84d9c0e04cb45f70f418

# LinuC レベル2の結果
偶然にも201、202どちらも666点でした。
ちなみに101も666点でした。
(オーメン666) https://www.20thcenturystudios.jp/movies/omen666

![スクリーンショット 2025-02-16 12.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145857/9419d307-da3f-437b-8998-eb6333de4583.png)

# 使用した教材
- Ping-t(https://mondai.ping-t.com/g)
- 学易(https://gakuyasu.byaku.jp/)
- 小豆本(Linux教科書 LinuCレベル2 Version 10.0対応)
- 白本(Linux教科書 LinuCレベル2 スピードマスター問題集 Version 10.0対応)

# 試験の難易度について
Ping-tをしっかりやり込んでいれば問題なく合格出来る難易度だと思いました。
「202は難しい！」とよく言われていてビビっていたのですが、201と難易度的にはあまり変わらなかったです。
ただ、範囲がかなり広く、覚える単語もかなり多いので勉強量は201の2倍くらいになるかもしれません...
試験範囲が広がる分、応用問題的なものはあまり多く出題されなかった印象でした。

# 勉強方法・期間
勉強期間は2週間ちょっとです。
勉強方法は↓のような感じで進めました。

### 試験2週間前の勉強方法
```
小豆本でざっくり理解 + 小豆本の問題演習
↓
Ping-tで問題演習
```
をループさせて理解を深めていきます。

### 試験1週間前の勉強方法
Ping-tで全章を一通り復習できたら、Ping-tの模擬試験を解いていきます。
レベル40まで進めると安心して試験に臨めるかなと思います。
※Ping-tのコマ問は201、202どちらもやりませんでした。試験にはコマ問は数問程度しか出題されませんので、やらなくていいと思います。

![スクリーンショット 2025-02-16 12.07.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145857/cc27b762-517d-4971-ae16-85c23b6a69df.png)

202では白本も買っていたので、そちらの問題も合わせて解きまくりました。
### 試験数日前の勉強方法
試験数日前は学易の問題(51問)や小豆本や白本の模擬試験を解きました。
これらの模擬試験はそれぞれ1回分しかないので、試験数日前に解くのがオススメです。
模擬試験で7割~8割程度取れていたら本番の試験も合格圏内だと思います。

# 勉強していて思ったこと
## Sambaの設定項目どうなっとるんじゃい！！！
既に202勉強している人なら共感していただけるかと思いますが、Sambaの設定(/etc/samba/smb.conf)にはパスワードの単語が3種類出てきます。

**1つめ : passwords**
`encrypt passwords = yes|no`
`null passwords = yes|no`

**2つめ : password**
`unix password sync = yes|no`

passwordとpasswordsの2種類が同じ設定ファイルにあるだけでもややこしいのですが、Sambaは私たちの想像を超えてきます。

**3つめ : passwd**
`passwd program = プログラム名`
`passwd chat = 文字列`
まさかの省略形登場。

### 勘弁してくれSamba！！

Sambaの開発者もLinuCやLPICの出題範囲になる事を想定して設定項目を考えているわけではないので、どのような設定項目でも受験者側が頑張って覚える必要があるのは重々承知しております。
が、同じ設定ファイルに3種類のパスワードは流石に勘弁してほしいと思いました。

## Googleスライドでの勉強ノート作成がめちゃ便利
GoogleスライドにPing-tの解説の画像などをどんどん貼って勉強していくとかなり良いと思いました。
単語カード的な使い方もできて勉強が捗ります。
通勤時間中にもスライドの流し読みで勉強できますし、隙間時間で効率よく勉強できます。

## LinuCやLPICのセミナーのアーカイブで手を動かしてみる
YouTubeでLinuCやLPICの過去のセミナーがYouTubeで公開されているので、それらを見ながら実際に環境構築してみるのも良かったです。

https://www.youtube.com/watch?v=YmU5vEXF4Dc&list=PLAsEyLm5aGOAEVCWfff-qZ5mBQxFFXnrS

https://www.youtube.com/watch?v=eBoGW3PfUGU&t=43s


# LinuC全体の感想(レベル1&2)
体系的にLinuxを学べて、業務でも使える知識も学べて、受験して良かったと思いました。
ただ、SambaやSquidやLDAPなどはこれまで自分で構築した経験がないので、覚えることも多くて大変でした。
体系的に学べるのが資格の良い面でもあると思いますので、インフラ興味ある人は受験してみると新しい発見があって楽しいと思います。

LinuCについてはレベル1合格時に書いた↓の記事でも冒頭で触れていますので、気になる方はご覧ください。

https://qiita.com/EndoMotoki/items/84d9c0e04cb45f70f418


## LinuC202は特に覚えることが多くて大変だと思いますが、試験勉強頑張ってください！
結局、目的から考えるだけでよかった【ISSUEからはじめよ】

数ある記事の中から、
当記事に興味を持っていただき、
ありがとうございます。
<br>
今回は、名著「ISSUEからはじめよ」を
読み切ったので、その学びを共有できればと思い、
筆を執っています。
<br><br>
本書、60万部以上売れたベストセラーらしいのですが、
私個人的にはあまり刺さりませんでした。

なぜかというと、本書はかなり回りくどいと感じたからです。
<br>
本記事の題にある通り、私は普段から目的(＝何を実現したいか？)を
考えて仕事をしています。
<br><br>
これは入社当時に初めてついてくれた上司が
口酸っぱく何度も何度も教えてくれたことです。
<br>
私が仕事でミスをしたり、
実現したいことに対して考慮が足りなかったり、
質問の内容が浅かったり、、

こういったときは決まって
「やりたいことは何？じゃあこれ必要だよね」
とめげずに何度も伝えてくれました。
<br>
おかげさまで、今では完全に落とし込めていて、
その上司や仕事仲間からも仕事ぶりを評価いただけています。

ありがたい限りです。
<br><br>
さて、そんな私が本書を読んで感じたのは、

目的思考を回りくどく、ノウハウとしてまとめた本だな…

ということ。
<br>
目的思考というのは、先ほど話した、
「目的から考えて仕事をする」思考法を
私が勝手に命名して呼んでいる概念です。
<br><br>
本書はその目的思考を科学者兼コンサルの著者の視点から
フレームワーク化、ノウハウ化してまとめた本です。
<br>
知的生産という幅広い分野の仕事方法を
共通化しようとされているので、
場面が想像しにくく読みにくい。
<br>
私はドメイン駆動設計を一部導入した現場で
仕事をしているので、設計からテストまでもちろんやります。
<br><br>
その立場の人間でも読みにくいな、、と感じたので、
もっと抽象度の高い概念しか取り扱わない人向けの本なのかも？
とも思っていますね。
<br><br>
また、たとえもかなり抽象的で、
具体的な場面を想像できる人っているのかな？
と感じるほどです。
<br>
とはいっても、60万部も売れていて、
きっとそれ以上の人が読んでいる本でしょうから、
私の思考がまだまだ浅いのかなと思ったりもしています。
<br>
<br>
もっと精進します。
<br>
本書は抽象的な概念をひたすら考える立場にあるけれど、
うまく成果を出せておらず足踏みしている方には
仕事のやり方を変えるキッカケになる本だと感じました。
<br>
<br>
ちょっと学びの共有とは違うかもしれませんが、

まだまだ見えていない世界が広いなと感じたこと、

結局、目的から考えて仕事をするだけでよいなと再認識したこと、

この二つが学びになりました。
【Rails】varidatesだけだとなぜデータベースの一意性が担保できないのか？

# はじめに
こんにちは。アメリカで独学でエンジニアを目指している者です。
現在 Railsチュートリアルを使用して勉強していますが、Railsの`ActiveRecord`における`validates`メソッドは、アプリケーションレベルでのデータ検証を行うために非常に有用であることを学びました
しかし、特に`uniqueness`バリデーションにおいては、単に`validates`だけではデータベース上での一意性を完全に保証することができません。
本記事では、その理由と対処法、そしてなぜインデックス（特に一意性インデックス）を用いることで一意性が担保できるのかについて詳しく解説します。

## validatesだけではダメな理由

`validates :email, uniqueness: { case_sensitive: false }`のようなバリデーションは、**レコードを保存する前に現在のデータベースの状態に対してクエリを発行し、同じ値が既に存在しないかをチェックします**。
上記のバリデーションは、リクエストごとに生成されたインスタンス上で行われるため、同時に発生する複数のリクエスト間で情報を共有することはできません。
つまり、**リクエスト1とリクエスト2がほぼ同時に実行される**と、どちらも検証時点では重複がないと判断され、結果として両方のリクエストが成功してしまう可能性があります


## 対処法
* 一意性インデックスの追加:
現在私が使用しているRailsチュートリアルでは、対象カラムに対して一意性インデックスを設定する手法を採用しています。
これによって、データベースの保存時にデータベース自体が重複を検出しエラーを返すという仕組みになっています。
たとえば、以下のようなマイグレーションファイルを作成します。

```ruby
class AddIndexToUsersEmail < ActiveRecord::Migration[6.0]
  def change
    add_index :users, :email, unique: true
  end
end
```

ちなみに一意性インデックスが設定されている場合は以下の処理が行われます
* 1つのリクエストがレコードを挿入しようとすると、データベースはそのトランザクションが完了するまで新しいデータをロックします。
* もし別のリクエストが同じ email を挿入しようとすると、インデックスによるチェックが働き、重複エラー (ActiveRecord::RecordNotUnique) を発生させます。

# まとめ
* `validates`のみでは不十分:
`ActiveRecord`の`validates :uniqueness`はアプリケーションレベルでの検証であり、複数リクエスト間の競合状態に対して脆弱です。
そのため、単独ではデータベース上の一意性を完全には保証できません。

* 対処法:
データベースレベルでの一意性制約（一意性インデックス）の追加があげられます

* インデックスによる保証:
一意性インデックスはデータベース内部で重複チェックを行い、トランザクションやロック機構を活用するため、並行リクエストがあっても確実に一意性を担保できます。
Vuetify3.3以降のバリデーション

# はじめに
Vuetifyのバリデーションが便利すぎるのですが、最終的なバリデーションチェックがうまく動かなかった。Vuetify3.3以降で結果が違うらしい。

# バリデーションチェック
以下のようなテキストボックスで単純にrequiredで値の有無をチェック。送信ボタンクリック時にバリデーションチェックをする。
結果Vuetify3.3以降だと、text-fieldに値が入力されていてもエラーになってしまう。もちろん入力されてなくてもエラー。

```vue:
<template>
  <v-form ref="formRef">
    <v-text-field v-model="name" :rules="[rules.required]" label="名前" />
    <v-btn @click="submit">送信</v-btn>
  </v-form>
</template>

<script setup>
import { ref } from 'vue';

const formRef = ref(null);
const name = ref('');

const rules = {
  required: (v) => !!v || '必須項目です',
};
const submit = () => {
  const result = formRef.value.validate();
  if (result.valid) {
    alert('バリデーション成功！');
  } else {
    alert('エラーがあります', result.errors);
  }
};
</script>
```
# Vuetify3.3からvalidate()の戻り値が Promiseに
Vuetify3.3から、validate()の戻り値がPromiseになったのが原因
+ Promiseとはなんぞや

https://qiita.com/ta1m1kam/items/d60ab1ecdcb6aef82eca

Javascriptは処理を待てないので、Promiseの処理が終わるまで確定しない。

# asyncとawaitを使う
submitの部分だけasyncとawaitで書き換えます。

```js:
const submit = async () => {
  const result = await formRef.value.validate();
  if (result.valid) {
    alert('バリデーション成功！');
  } else {
    alert('エラーがあります', result.errors);
  }
};
```
### うまくいきました！
OpenWrtでfastfetchを叩くまで

# 筆者について

```
name → Koki Teramoto
age → 18
language → ja_JP, en_US
```

# 本編

今回は題名の通りです。先日GitHubで以下のようなリポジトリを発見しました。

https://github.com/muink/openwrt-fastfetch

ということで、このOpenWrtのリポジトリを追加してインストールしていきたいと思います。

## リポジトリの追加

リポジトリは以下のURLです。

https://fantastic-packages.github.io/packages/

これを、`/etc/opkg/customfeeds.conf`に追加していきます。

```conf
src/gz openwrt-fastfetch https://fantastic-packages.github.io/packages/releases/23.05/packages/x86_64/packages/
```

## セキュリティレベルを低くする

セキュリティレベルを低くする必要があるようです。これは少し問題なので後で解決を試みたいと思います。`/etc/opkg.conf`でセキュリティレベルのところをコメントアウトしましょう。

```conf
#option check_signature
```

## いざ、インストール！

ということで、いざインストールしていきましょう。

```zsh
opkg update
opkg install fastfetch
```

`fastfetch`を実行しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583428/a7457d06-c730-45f4-a3e1-f824850f37dd.png)

# 最後に

このOpenWrtの環境を本格的に使い始めるのはもう少し後ですので、もうちょっと遊んでいきたいと思います。
Vagrantでsnapshotの取得とrestoreを実行する方法

こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

Vagrantを使用して仮想環境を管理している場合、スナップショット機能を活用することで、環境を安全に変更し、問題が発生した際に簡単に元の状態に戻すことができます。本記事では、Vagrantのスナップショット機能を使った環境管理の手順を解説します。

## スナップショットの作成

まず、現在のVagrant環境の状態を確認します。以下のコマンドを実行して、稼働中の仮想マシンを確認します。

```bash
shota@shota-20f5a2v5jp:~$ vagrant global-status
id       name      provider    state     directory
---------------------------------------------------------------------------------
61ff572  mypc      virtualbox  poweroff  /home/shota/ドキュメント/vagrant_mypc
a258e08  mysrv     virtualbox  poweroff  /home/shota/ドキュメント/vagrant_mysrv
9baf99a  mycentos  virtualbox  poweroff  /home/shota/ドキュメント/vagrant_mycentos
953be07  radius    virtualbox  running   /home/shota/ドキュメント/vagrant_radius01
```

ここでは、`radius`という名前の仮想マシンが稼働中であることがわかります。この仮想マシンに対してスナップショットを作成します。

スナップショットがまだ作成されていないことを確認するために、以下のコマンドを実行します。

```bash
shota@shota-20f5a2v5jp:~$ vagrant snapshot list 953be07
==> radius: No snapshots have been taken yet!
    radius: You can take a snapshot using `vagrant snapshot save`. Note that
    radius: not all providers support this yet. Once a snapshot is taken, you
    radius: can list them using this command, and use commands such as
    radius: `vagrant snapshot restore` to go back to a certain snapshot.
```

スナップショットが存在しないことが確認できました。次に、スナップショットを作成します。今回は、スナップショット名を`20250216_snapshot`とします。

```bash
shota@shota-20f5a2v5jp:~$ vagrant snapshot save 953be07 20250216_snapshot
==> radius: Snapshotting the machine as '20250216_snapshot'...
==> radius: Snapshot saved! You can restore the snapshot at any time by
==> radius: using `vagrant snapshot restore`. You can delete it using
==> radius: `vagrant snapshot delete`.
```

スナップショットが正常に作成されたことを確認するために、再度スナップショットの一覧を表示します。

```bash
shota@shota-20f5a2v5jp:~$ vagrant snapshot list 953be07
==> radius:
20250216_snapshot
```

これで、現在の状態がスナップショットとして保存されました。
※GUIでもVirtualBoxアプリを起動することでsnapshotが取れていることを確認することが出来ます。


## 環境の変更

スナップショットを作成した後、仮想マシン内で必要な変更を行います。例えば、新しいソフトウェアをインストールしたり、設定を変更したりすることができます。

## ロールバック

変更後に問題が発生した場合、スナップショットを使用して元の状態に戻すことができます。以下のコマンドを実行して、スナップショットを復元します。

```bash
shota@shota-20f5a2v5jp:~$ vagrant snapshot restore 953be07 20250216_snapshot
==> radius: Restoring the snapshot '20250216_snapshot'...
==> radius: Snapshot restored!
```

これで、仮想マシンはスナップショットを作成した時点の状態に戻りました。

## スナップショットの削除

不要になったスナップショットは削除することも可能です。以下のコマンドを使用して削除します。

```bash
shota@shota-20f5a2v5jp:~$ vagrant snapshot delete 953be07 20250216_snapshot
==> radius: Deleting the snapshot '20250216_snapshot'...
==> radius: Snapshot deleted!
```

## まとめ

Vagrantのスナップショット機能を活用することで、仮想環境の変更を安全に行うことができます。本記事では、以下の手順を解説しました。

1. スナップショットの作成
2. 環境の変更
3. スナップショットを使用したロールバック
4. スナップショットの削除

スナップショットを適切に活用することで、仮想環境の管理がより効率的かつ安全になります。特に、環境に大きな変更を加える前にはスナップショットを作成することを習慣化することで、トラブルを未然に防ぐことができます。ぜひ、日々の運用に取り入れてみてください！
SSMに接続できるまでに時間かかった件

# はじめに
AWS Systems Manager Session Manager（セッションマネージャー） は、SSHなしでEC2やオンプレミスのサーバーにアクセスできる便利なサービスです。

通常、EC2 に入るには SSH（22番ポート）を開けて、キーペアでログイン しますよね？
でもセッションマネージャーを使えば、ポートを開ける必要なし！キーペアも不要になるという優れもののサービス！
AWS マネジメントコンソールや CLI から直接サーバーに入れるんです✨

セキュリティ的にも超優秀で、
1. インバウンドルール不要（ポート開放しなくてOK）
2. IAMロールにあるIAMポリシーでアクセス管理できる
3. 操作履歴をCloudWatch Logs や S3 に保存できる

っていう、まさに「運用の味方！」なツールです。

AWS公式ドキュメントはこちら👇

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html

要するに、「SSH いらずで安全＆手軽に EC2 にアクセスできるツール」って覚えておけばOK！💡

# 今回設定するのにえらい時間がかかりました
EC2を起動させてからだったので、およそ39分ぐらい。
```
sh-5.2$ w
 02:08:19 up 39 min,  0 users,  load average: 1.58, 1.42, 1.21
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
sh-5.2$
```

# 今回の構成
至ってシンプルな構成として構築していました。
Private subnetにあるEC2からPublic Subnetに配置してあるNAT Gatewayを用いてIGWを経由し、SSMに到達という通信経路です。

# 状況
最初からずっとコンソール画面上には以下のメッセージが表示されていました。

::: note 
SSM エージェントはオンラインではありません
SSM エージェントは Systems Manager エンドポイントに接続して自身をサービスに登録できませんでした。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922312/4e3c0c7d-24e3-42e5-96b4-78f9cf271c88.png)

最初はなにか設定を間違ったのかな？？と思っていましたが、
以下ブログ参照し、確認点を一つずつ潰していきましたが設定自体誤っておりませんでした。

https://dev.classmethod.jp/articles/session-manageer-confirmation-item/

https://zenn.dev/kazutech/articles/3559db9605d198

いずれもIAMロールに誤りもないし、セキュリティグループも設定は問題ない状態だったので、何が原因かなとずっとモヤモヤしていました。。

他にはインターネットまでルートが届いていないのかな？とも考えまして、
Network Managerを使用して到達確認もしましたが問題なし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922312/5379b309-8ba4-4d4a-a8b5-df893cfb9740.png)

うーーんと考えていて、再度コンソール確認したら接続できるやん！！となりびっくり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2922312/7a8bdc5c-e831-4ea2-88e8-7c0fa3244a3a.png)


以上、謎に40分近く時間をSSMに取られた話でした。。
Git Rebaseでconflictしたら rebase元 (or 自分のbranch) を優先してrebaseを実行する


## コマンド

### conflictしたら自分のbranchを取り込む

```
git rebase <rebase元> -s recursive -X ours
```

[ours](https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt-ours)

> This option forces conflicting hunks to be auto-resolved cleanly by favoring our version. Changes from the other tree that do not conflict with our side are reflected in the merge result. For a binary file, the entire contents are taken from our side.

### conflictしたらrebase元を取り込む

```
git rebase <rebase元> -s recursive -X theirs
```

[theirs](https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt-theirs)
> This is the opposite of ours; note that, unlike ours, there is no theirs merge strategy to confuse this merge option with.
【Power Apps】現在時刻の更新表示

Power Appsで現在時刻を表示するのに、**テキスト ラベル**コントロールの**Text**プロパティに **Now()** と設定しただけでは、アプリの起動時間を表示するだけで、時刻は更新してくれません。

そこで、タイマーコントロールを用い、定期的に現在時刻を取得し、テキストラベルへ時刻を表示するようにします。

タイマーは、定期的に処理を行うためのコントロールです。



# タイマーの配置

タイマーコントロールは

**挿入→入力→タイマー**

でタイマーを配置します。

![2025-02-16_10h28_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996436/8e3a352a-0a9b-4fed-abe9-a6e37b478eda.png)


タイマーを配置すると、時間が配置されたボタンのようなコントロールが表示されますが、最終的に非表示にするので、配置場所は、どこでも構いません。



## タイマーのプロパティ設定

タイマーのプロパティを初期状態から、以下のように変更します。

| プロパティ   | 設定値               | 意味                                                         |
| ------------ | -------------------- | ------------------------------------------------------------ |
| AutoStart    | true                 | アプリ起動時にタイマーを動かす(true)、動かさない(false)の設定 |
| Duration     | 1000                 | タイマー処理の更新間隔をmSec単位で指定します。               |
| OnTimerStart | Set(_nowTime, Now()) | タイマーの更新時に行う処理。<br />ここでは、_nowTimeという変数に現在時刻(Now())を設定しています。 |
| Repeat       | true                 | タイマー処理を繰り返し行う(true)、行わない(false)の設定      |
| Visible      | false                | タイマーコントロールの表示(true)、非表示(false)設定          |

この設定で、現在時刻が_nowTimeに代入され、値が１秒おきに更新されます。



# テキストラベルの配置

現在時刻表示用に**テキストラベル**を配置します。

**挿入→ディスプレイ→テキストラベル**

で、配置します。

ラベルの配置や大きさは、好みの設定で構いませんが、以下のような設定にしました。

## テキストプロパティ設定

| プロパティ | 設定値   | 意味                     |
| ---------- | -------- | ------------------------ |
| Size       | 50       | テキストのフォントサイズ |
| Text       | _nowTime | ラベルの表示する文字     |

Textラベルには、タイマーで更新される現在時刻(_nowTime)を設定しています。



# 実行結果

現在の設定では、時刻が分単位なので、分かりづらいですが、１秒おきに更新処理が行われ、現在時刻が表示されます。

![2025-02-16_10h50_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996436/0b527ae9-ae0b-4f29-8f54-7b2662e26264.png)

# 時刻表示フォーマットの設定

時刻表示のフォーマットを設定するには、**Text関数**を用います。

上記の実行結果は、現在時刻が

**2025年2月16日 10時50分**

という表示になっていますが、これを

**2025年2月16日 10:50:30**

のように秒単位まで表示したいと思います。



このようにするには、テキストラベルのTextプロパティを以下のように設定します。

```
Text(_nowTime,"yyyy年m月d日 hh:mm:ss")
```

ここで使用しているyyyyやmの意味は以下の通りです。

| 文字 | 意味                                                                           |
| ---- | ------------------------------------------------------------ |
| yyyy | 西暦を４桁で表示します。<br />２桁で表示する場合は yy        |
| m    | 月を１桁で表示します。<br />１桁の月に０を付けて２桁表示する場合は mm にします。 |
| d    | 日を１桁で表示します。<br />１桁の日に０を付けて２桁表示する場合は dd にします。 |
| hh   | 時間を２桁表示します。                                       |
| mm   | 分を２桁表示します。                                         |
| ss   | 秒を2桁表示します。                                          |

詳細は以下のマイクロソフトのページを参照ください。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-text

ただし、yyなどの文字の部分が無理やり日本語に翻訳されてしまっているので、ページの右上にある地球儀マークをクリックして、英語ページでも内容を確認してください。



# 最終的な実行結果

![2025-02-16_11h08_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996436/426f776f-7d2b-44b7-8c19-b755cb54ec46.png)


これで、自分のやりたかった表示になってくれました！
【物語で学ぶ Swift Concurrency】nonisolated(unsafe)と外部同期機構でグローバル変数を守ろう！

以下は、Swift先生と生徒の対話形式で、nonisolated(unsafe) と NSLock、DispatchQueue を使ってグローバル変数を安全に扱う方法を説明した物語です。

---

**Swift先生**：「こんにちは。今日は、グローバル変数を安全に使うためのテクニックについてお話しするよ。グローバル変数は、プログラムのどこからでもアクセスできる便利なものだけど、複数のスレッドが同時にアクセスすると『データ競合』という問題が起きるんだ。」

**生徒**：「データ競合ってどんな問題ですか？」

**Swift先生**：「たとえば、二つの処理が同じ変数に同時にアクセスして値を更新しようとすると、計算結果が変になったり、プログラムがクラッシュしたりする可能性があるんだ。通常、Swiftのコンパイラはこうした危険をチェックしてくれるけど、場合によっては自分で安全性を保証するために、コンパイラのチェックを回避したい時もあるんだ。そのときに使うのが `nonisolated(unsafe)` という宣言なんだよ。」

**生徒**：「nonisolated(unsafe) って、どういう意味なんですか？」

**Swift先生**：「`nonisolated(unsafe)` を使うと、コンパイラが通常行う並行処理の安全性チェックを回避できるんだ。でも、その分、プログラマ自身が外部同期機構で安全性を保証しなければならないんだよ。今日は、NSLock と DispatchQueue を使った具体的な方法を見ていこう。」

---

## シーン1：NSLock を使った例

**生徒**：「NSLockって何ですか？」

**Swift先生**：「NSLockは、処理中に同じ変数へのアクセスを防ぐための『鍵』のようなものだよ。次の例を見てみよう。」

```swift
import Foundation

// NSLockのオブジェクトを作成
let styleLock = NSLock()

// グローバル変数。すべてのアクセスがNSLockで保護されるため、nonisolated(unsafe) を使う
nonisolated(unsafe) var supportedStyleCount = 42

// 変数の値を1増やす関数
func incrementStyleCount() {
    styleLock.lock()         // ロックを獲得して、他の処理が入らないようにする
    supportedStyleCount += 1  // 安全に値を更新
    styleLock.unlock()       // ロックを解放
}

// 現在の値を取得する関数
func getSupportedStyleCount() -> Int {
    styleLock.lock()         // ロックを獲得してから値を読む
    let count = supportedStyleCount
    styleLock.unlock()       // ロックを解放
    return count
}

```

**生徒**：「なるほど！NSLockでロックをかけると、同時にアクセスされるのを防げるので、`nonisolated(unsafe)` を使っても安全になるんですね。」

**Swift先生**：「その通り。NSLockを使ってアクセスが必ず排他制御されるので、コンパイラのチェックを回避しても大丈夫なんだ。」

---

## シーン2：DispatchQueue を使った例

**生徒**：「NSLock以外にも、DispatchQueueという方法があると聞きました。DispatchQueueって何ですか？」

**Swift先生**：「DispatchQueueは、GCD（Grand Central Dispatch）の仕組みを使って、処理を順番に実行するためのキューだよ。特にシリアルキューを使えば、登録した処理が一つずつ実行されるので、同時アクセスを防げるんだ。こちらも具体的なコードで見てみよう。」

```swift
import Dispatch

// シリアルキューを作成。これにより、登録した処理は順番に実行される
let styleQueue = DispatchQueue(label: "com.example.styleQueue")

// グローバル変数にも同じく nonisolated(unsafe) を使う
nonisolated(unsafe) var supportedStyleCount = 42

// 変数の値を増やす関数
func incrementStyleCountUsingQueue() {
    styleQueue.sync {   // キュー上で同期的に処理を実行
        supportedStyleCount += 1
    }
}

// 変数の値を取得する関数
func getSupportedStyleCountUsingQueue() -> Int {
    return styleQueue.sync {   // 同じく、順番に処理が実行される
        supportedStyleCount
    }
}
```

**生徒**：「DispatchQueueを使うと、処理が必ず順番に実行されるから、複数の処理が同時に変数にアクセスしないんですね！」

**Swift先生**：「その通り。NSLockと同じように、DispatchQueueを利用することで、外部同期を実現し、安全にグローバル変数を操作できるんだよ。」

---

## まとめ

**Swift先生**：「今日は、グローバル変数はどこからでも使える反面、複数のスレッドから同時にアクセスすると危険になるということを学んだね。そこで、`nonisolated(unsafe)` を使ってコンパイラの安全性チェックを回避し、自分でNSLockやDispatchQueueを使って安全に同期処理を行う方法を見たんだ。」

**生徒**：「はい、先生！nonisolated(unsafe) の意味と、それを補うための外部同期機構の使い方がよく分かりました。これからは、データ競合に気をつけながらプログラムを書けそうです！」

**Swift先生**：「素晴らしい！この知識を活かして、安全で信頼性のあるプログラムを書いてみよう。もしまた疑問があったら、いつでも質問してね。」

---

以上、Swift先生と生徒の対話形式で、`nonisolated(unsafe)` と外部同期機構（NSLock、DispatchQueue）を使ってグローバル変数を安全に扱う方法について説明しました。お読みいただき、ありがとうございました！
Vite + React 19 で Tailwind CSS と shadcn/ui を統合する完全ガイド





## 目次
- [🌟 はじめに](#🌟-はじめに)
- [1. React 19 プロジェクトの作成](#1-react-19-プロジェクトの作成)
- [2. Tailwind CSS の統合](#2-tailwind-css-の統合)
- [3. パスエイリアスの設定](#3-パスエイリアスの設定)
- [4. shadcn/ui コンポーネントライブラリの統合](#4-shadcui-コンポーネントライブラリの統合)
- [5. プロジェクト構造](#5-プロジェクト構造)
- [🚀 ベストプラクティス](#🚀-ベストプラクティス)
- [参考ドキュメント](#参考ドキュメント)

---

## 🌟 はじめに
React 19のリリースに伴い、効率的な開発ツールチェインの需要が高まっています。本記事では **Vite** を使ったReact 19プロジェクトの構築から、**Tailwind CSS** と **shadcn/ui** の統合、パスエイリアスの設定までを詳細に解説します。

---

## 1. React 19 プロジェクトの作成
`pnpm`を使用してプロジェクトを初期化します：

```bash
pnpm create vite --template=react-ts
```
プロジェクト名を入力後、ディレクトリに移動します。

---

## 2. Tailwind CSS の統合

### 1️⃣ 依存関係のインストール
```bash
npm install tailwindcss @tailwindcss/vite
```

### 2️⃣ Viteプラグインの設定
`vite.config.ts` を修正：
```typescript
import { defineConfig } from 'vite'
import tailwindcss from '@tailwindcss/vite'

export default defineConfig({
  plugins: [tailwindcss()],
})
```

### 3️⃣ Tailwindの導入
`index.css` の先頭に追加：
```css
@import "tailwindcss";
```

### 4️⃣ プロジェクトの起動
```bash
npm run dev
```

---

## 3. パスエイリアスの設定

### 1️⃣ TypeScript設定の変更
**tsconfig.json**：
```json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}
```

**tsconfig.app.json**：
```json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}
```

### 2️⃣ 型定義のインストール
```bash
pnpm add -D @types/node
```

### 3️⃣ Viteのエイリアス解決設定
`vite.config.ts` を更新：
```typescript
import path from "path"
import { defineConfig } from "vite"

export default defineConfig({
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "./src"),
    },
  },
})
```

---

## 4. shadcn/ui コンポーネントライブラリの統合

### 1️⃣ 初期設定
```bash
pnpm dlx shadcn@canary init
```
プロンプトに従い以下を選択：
- Tailwind CSSを使用
- コンポーネントディレクトリを設定
- ダークモードを有効化

### 2️⃣ サンプルコンポーネントの追加
```bash
pnpm dlx shadcn@canary add sidebar-07
```

---

## 5. プロジェクト構造
```
my-project/
├── src/
│   ├── components/  # shadcnコンポーネント
│   ├── App.tsx
│   └── index.css
├── vite.config.ts
├── tailwind.config.js
└── tsconfig.json
```



---

## 🚀 ベストプラクティス
- `@/components` でカスタムコンポーネントをインポート
- shadcnコンポーネントライブラリの定期的な更新

---

## 参考ドキュメント
- [Vite 公式ドキュメント](https://vitejs.dev/)
- [Tailwind CSS v4 ガイド](https://tailwindcss.com/)
- [shadcn/ui ドキュメント](https://ui.shadcn.com/)
```
034 AI屋さんの　マルチモーダル出力と　LLMに200万トークン全文入力　Gemini2.0Pro



034 AI屋さんの　マルチモーダル出力と　LLMに200万トークン全文入力　Gemini2.0Pro

新しいモデルが多くて
追いかけるだけで、大変ですね。
pro版も公開でgemini2.0でも200万トークン入力可能です。


https://developers.googleblog.com/en/gemini-2-family-expands/


マルチモーダル出力も順次開始予定で、
乞うご期待　ですね。
音声合成は感情豊かに、声優さん並みにお喋りしてくれます。

シナリオもアテレコもイラストも、大規模言語モデルさんが　
リアルタイム即興で生成するので　ノベルゲームもいけそうです。
選択肢や自由入力で、お話がどんどん展開します。
無限独りゲームメーカーです。




マルチモーダル出力のサンプルはこちら


https://st.bono0.com/audio001

---


![スクリーンショット 2025-02-16 9.20.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/db95150e-fa26-4453-8232-a6a4ae5c434b.png)



![スクリーンショット 2025-02-16 9.19.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/f9fc2042-a432-41c0-b796-62d493947cf7.png)


---


サンプルコード

![スクリーンショット 2025-02-16 9.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/1e0d5c6b-2e58-4b67-8e99-dd9e42a56be3.png)


---


目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7

無事に　Gemini2.0　スタートです。
おめでとうございます。






ー以上ー
ミノ駆動本からストラテジーパターンを知った

# 背景
ミノ駆動本を読む中でストラテジーパターンを知りました。interfaceの使い方についてDIと単体テストでモックのイメージしか持ててなく、ソフトウェア設計のパターンとしての使い方があることを知り、理解を深めるために自身で調べたことだったりまとめます。

# ストラテジーパターン
## 概要
ソフトウェア設計におけるデザインパターンの一つで、アルゴリズムをカプセル化し、アルゴリズムの選択や切り替えを容易にする。
## メリット
以下の理由から可読性および保守性が高まる
- Swhich文を置き換えることができる
- クラスによる責任が明確になり修正が容易になる
## 自分の理解
ストラテジーパターンを調べると↓のクラス図がでてくる。これは、どういう文脈（Context）で使うかに対して戦略（Strategy）を用意するがどうやって実現（Concreate）するかは選択可能。シーンによってやりたい事は同じだけどやり方は変わる時に有用。
例）会計するシーンでお金を払うけど現金・クレジット・QR決済と選択できる
```mermaid
classDiagram
  Context *-- Strategy
  Strategy <|-- ConcreateStrategyA
  Strategy <|-- ConcreateStrategyB
  class Context{
    +ContextInterface()
  }
  class Strategy{
    +AlgorithmInterface()
  }
  class ConcreateStrategyA{
    +AlgorithmInterface()
  }
  class ConcreateStrategyB{
    +AlgorithmInterface()
  }
```
## 実装例（C#）
**ストラテジーインターフェースの作成**

```csharp
public interface IStrategy
{
    void Execute();
}
```

**具体的なストラテジークラスの作成**

```csharp
public class ConcreteStrategyA : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Strategy A executed.");
    }
}

public class ConcreteStrategyB : IStrategy
{
    public void Execute()
    {
        Console.WriteLine("Strategy B executed.");
    }
}
```

3. **コンテキストクラスの作成**

```csharp
public class Context
{
    private IStrategy _strategy;

    public Context(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public void SetStrategy(IStrategy strategy)
    {
        _strategy = strategy;
    }

    public void ExecuteStrategy()
    {
        _strategy.Execute();
    }
}
```

4. **使用例**

```csharp
class Program
{
    static void Main(string[] args)
    {
        Context context = new Context(new ConcreteStrategyA());
        context.ExecuteStrategy(); // Output: Strategy A executed.

        context.SetStrategy(new ConcreteStrategyB());
        context.ExecuteStrategy(); // Output: Strategy B executed.
    }
}
```
## デメリット
- 採用することでクラスが増え、コードが複雑になる
- 小規模なプロジェクトではかえって邪魔になる
- ストラテジーパターンが使われていることに気づかず、処理が分散した時に予期しないバグが発生する

# 参照
- [Strategy パターン](https://ja.wikipedia.org/wiki/Strategy_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
- [【Strategyパターン】すべての開発者が知っておくべき強力なツール](https://qiita.com/hankehly/items/1848f2fd8e09812d1aaf)
- [【TS】今さら聞けないストラテジパターン](https://zenn.dev/nekoniki/articles/396ebc523930c196dc13)
renderとrender_to_stringの違い


> Normalizes arguments, options and then delegates render_to_body and
  sticks the result in <tt>self.response_body</tt>.
```rb
def render(*args, &block)
      options = _normalize_render(*args, &block)
      rendered_body = render_to_body(options)
      if options[:html]
        _set_html_content_type
      else
        _set_rendered_content_type rendered_format
      end
      _set_vary_header
      self.response_body = rendered_body
    end
```
https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/actionpack/lib/abstract_controller/rendering.rb#L21C6-L23C1

> Raw rendering of a template to a string.

> It is similar to render, except that it does not
 set the +response_body+ and it should be guaranteed
 to always return a string.
>If a component extends the semantics of +response_body+
 (as ActionController extends it to be anything that
 responds to the method each), this method needs to be
 overridden in order to still return a string.
```rb
def render_to_string(*args, &block)
  options = _normalize_render(*args, &block)
  render_to_body(options)
end
```
https://github.com/rails/rails/blob/984c3ef2775781d47efa9f541ce570daa2434a80/actionpack/lib/abstract_controller/rendering.rb#L35C5-L48C8

>renderを呼び出す: 完全なレスポンスを作成してブラウザに送信する

https://railsguides.jp/layouts_and_rendering.html#:~:text=render%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%3A%20%E5%AE%8C%E5%85%A8%E3%81%AA%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AB%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B

>render呼び出しの正確な結果をブラウザを使わずに調べたい場合は、render_to_stringを利用できます。このメソッドの振る舞いは、レンダリング結果をブラウザに返さずに文字列を返す点を除けば、renderと完全に同じです。

https://railsguides.jp/layouts_and_rendering.html#:~:text=render%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%AE%E6%AD%A3%E7%A2%BA%E3%81%AA%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%82%92%E4%BD%BF%E3%82%8F%E3%81%9A%E3%81%AB%E8%AA%BF%E3%81%B9%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81render_to_string%E3%82%92%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%81%AF%E3%80%81%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%90%E6%9E%9C%E3%82%92%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AB%E8%BF%94%E3%81%95%E3%81%9A%E3%81%AB%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%BF%94%E3%81%99%E7%82%B9%E3%82%92%E9%99%A4%E3%81%91%E3%81%B0%E3%80%81render%E3%81%A8%E5%AE%8C%E5%85%A8%E3%81%AB%E5%90%8C%E3%81%98%E3%81%A7%E3%81%99%E3%80%82
Rustにおける標準入力のまとめ

1.単一の整数入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        n: i32,
    }
    println!("You entered: {}", n);
}
```


入力例:
```
42
```
出力例:
```
You entered: 42
```


2.​複数のスペース区切り整数入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        a: i32,
        b: i32,
        c: i32,
    }
    println!("You entered: {} {} {}", a, b, c);
}
```

入力例:
```
10 20 30
```

出力例:
```
You entered: 10 20 30
```

3.​文字列入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        s: String,
    }
    println!("You entered: {}", s);
}
```

入力例:
```
hello
```

出力例:
```
You entered: hello
```

4.複数のスペース区切り文字列入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        s1: String,
        s2: String,
        s3: String,
    }
    println!("You entered: {}, {}, {}", s1, s2, s3);
}
```

入力例
```
hello world program
```

出力例:
```
You entered: hello, world, program
```


5.1次元配列（ベクタ）入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        n: usize,
        vec: [i32; n],
    }
    println!("Vector: {:?}", vec);
}
```

入力例:
```
5
1 2 3 4 5
```

出力例:
```
Vector: [1, 2, 3, 4, 5]
```

6.​2次元配列（ベクタのベクタ）入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        h: usize,
        w: usize,
        matrix: [[i32; w]; h],
    }
    for row in matrix {
        println!("{:?}", row);
    }
}
```

入力例:
```
3 3
1 2 3
4 5 6
7 8 9

```

出力例:
```
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
```

7.単一行に含まれる整数のリスト入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        n: usize,
        list: [i32; n],
    }
    println!("List: {:?}", list);
}
```


入力例:
```
4
10 20 30 40
```

出力例:
```
List: [10, 20, 30, 40]
```

8.複数行の整数のリスト入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        n: usize,
        m: usize,
        lists: [[i32; m]; n],
    }
    for list in lists {
        println!("{:?}", list);
    }
}
```


入力例:
```
2 3
1 2 3
4 5 6
```

出力例:
```
[1, 2, 3]
[4, 5, 6]
```


9.タプル入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        pair: (i32, i32),
    }
    println!("Pair: {:?}", pair);
}
```


入力例:
```
100 200
```

出力例:
```
Pair: (100, 200)
```


10.複数の異なる型の入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        a: i32,
        b: f64,
        c: char,
    }
    println!("Integer: {}, Float: {}, Char: {}", a, b, c);
}
```

入力例:
```
42 3.14 A
```

出力例:
```
Integer: 42, Float: 3.14, Char: A
```


11.複数行テキスト入力
```rust:main.rs
use proconio::input;

fn main() {
    input! {
        n: usize,
        lines: [String; n],
    }
    for line in lines {
        println!("{}", line);
    }
}
```


入力例:
```
3
hello
world
rust
```


出力例:
```
hello
world
rust
```
個人的備忘録：ローカル開発 (Vite) vs 本番環境 (S3 + CloudFront) の違いを自分なりにまとめてみた

## はじめに  
ローカル環境で動作するフロントエンドを AWS 上に移行する際には、いくつか注意点があります。

:::note note
**特に、S3 + CloudFront でのホスティングはローカル開発環境と異なる点が多く、事前の準備が重要です。**
:::

本記事では、ローカル開発（Vite）と本番環境（S3 + CloudFront）の違いを整理し、移行時のポイントをまとめました。  

## 書こうと思ったきっかけ  
フロントエンドの AWS 環境移行について、知識が浅い状態で実施することに不安を感じました。

:::note warn
***ローカル環境と本番環境の違いを明確に理解し、スムーズに移行できるよう備忘録として整理しました。***
:::

特に S3 + CloudFront でのルーティングやキャッシュ、CORS 設定など、重要なポイントを押さえたかったです。**間違いがあれば修正したいので、認識の確認も兼ねてまとめています。**

## ローカル開発 (Vite) vs 本番環境 (S3 + CloudFront) の違い

| 項目 | ローカル開発 (Vite) | 本番環境 (S3 + CloudFront) |
|------|---------------------|--------------------------|
| **URL** | `http://localhost:5173/` | `https://honda333.blog/` |
| **実行方法** | `npm run dev` (Vite) | `npm run build` → S3 にアップロード |
| **サーバー** | Vite の開発サーバー (Vite Dev Server) | S3 + CloudFront（CDN 経由で配信） |
| **リロード** | ホットリロード (HMR) あり | ホットリロードなし（変更時はデプロイが必要） |
| **パフォーマンス** | ローカルのみ | CDN キャッシュで高速配信 |
| **CORS (クロスオリジン制約)** | なし（ローカル環境） | API との通信には CORS 設定が必要 |
| **ルーティング (React Router)** | `localhost` では `react-router-dom` が動作 | CloudFront + S3 では `index.html` を `error_document` に設定する必要あり |
| **環境変数** | `.env.development` を使用 (`import.meta.env`) | `.env.production` を使用 (`import.meta.env`) |

フロントエンドについてあまり詳しくないまま質問させていただいていますが、ローカル環境で動作しているものを AWS 上に移行する際には、バックエンドと同様にいくつか注意すべき点があると考えています。

***自分なりに備忘録としてまとめてみましたので、認識として合っているかご確認いただけると幸いです。***

## AWS 環境移行時の主な注意点

### 1. ビルドとデプロイの違い
ローカル環境では `npm run dev` で開発サーバーを起動できますが、本番環境では `npm run build` でビルドしたファイルを S3 にアップロードする必要があります。

### 2. S3 バケットの設定
S3 にホストする際には、`index.html` をデフォルトのルートオブジェクトに設定し、適切なパブリックアクセス許可を設定する必要があります。

### 3. CloudFront の設定
CloudFront を利用する場合、`index.html` をエラーページとして設定することで React Router のルーティングが機能するようになります。

### 4. CORS 設定
API との通信を行う場合、S3 や API Gateway 側で CORS 設定を適切に行う必要があります。

### 5. キャッシュの管理
CDN キャッシュが効いているため、変更が即時反映されない場合があります。キャッシュクリアやバージョニングの工夫が必要です。

## まとめ  
AWS へのフロントエンド移行では、ビルド方法やデプロイ手順、S3・CloudFront の設定に注意が必要です。

:::note info
**特に、CORS 設定や React Router のルーティング、キャッシュ管理はローカル環境とは異なる点です。**
:::

移行時に戸惑わないよう、事前に環境の違いを理解し、適切な設定を行うことが重要です。今後も AWS のフロントエンド環境について学びながら、よりスムーズな運用を目指していきます。
seedでもFactoryBoutして幸せになった話

## Overview
この記事では、seedファイルでFactoryBotファイルを使うことできっと幸せになれるよ！っていうお話をします。
僕はテストや検証時のデータ管理を１箇所でできるようになったので、それでだいぶ幸せになりました。


## Motivation
こういう人には刺さるんじゃないかっていう人たち
- FactoryBotを使ってテストデータを作ってる人
- 普段seedsファイルで `User.create!(...)`って書いてる人
- seedsとfactoryの２箇所でテスト環境・開発環境のデータをそれぞれ管理してる人


## Get Started!!
`db/seeds.rb`
```diff
+ require 'factory_bot_rails'

+ FactoryBot.create(:user, email: "alice@example.com")
- User.create(email: "alice@example.com", password: password)
```

これの何が良いって、FactoryBotのファイルで本番環境以外のデータを共通管理できるところだよね。
なぜもっと早く気づかなんだ。。
レトロPCのためのBASIC講座７　画面制御１

# 前回のおさらい
前回はDISK BASICというファイル操作ができる状態のN88-BASICを起動しました。
これ以降すべてDISK BASICを起動したものとして解説します。

[レトロPCのためのBASIC講座６](https://qiita.com/kawamo55/items/ac0e34c4e85ef92c9ec4)

# N88BASICの画面
N88BASICの画面は、PC-8801の場合文字を表示するためのテキスト画面と線や円を描画するためのグラフィック画面が重なった状態で表示されています。

なので
PRINT ”A="
でテキストを表示して
LINE (0,0)-(640,200),5
で線を引いてみます。
テキストと線が重なっていても互いに影響せずに重なって表示されます。

# 画面消去コマンド CLS
CLS 1　　テキスト画面を消す
CLS 2　　グラフィック画面を消す
CLS 3　　両方消す

# 線を引くコマンド LINE
LINE (SX,SY)-(EX,EY),CLR
ただし SX,SYは始点座標、EX,EYは終点座標、CLRはカラー
を指定します、グラフィックの解像度は640×200で座標の指定位置はこの数値である必要はありません。
CLRはカラーで０から７を指定します。

# 描画範囲座標の指定コマンド　WINDOW
WINDOWS (LUX,LUY)-(RDX,RDY)
LUX,LUYは描画範囲の左上の座標、RDX,RDYは描画範囲の右下座標

ただしＰＣ−８８０１起動直後の画面物理座標は基準点が左上を(0,0)、右下が(639,199)なので下に行くほど座標値は大きくなることに注意

# 今回の動画
https://youtu.be/u8WNDdSaeuU
【DDD】値オブジェクト


## 値オブジェクトを使う４つのモチベーション

値オブジェクトを導入する主なモチベーションは、以下の4点に集約される。

#### 1.表現力を高める
　プリミティブ型は汎用的であるがゆえに、コード上でその意味を十分に表現できない。
　値オブジェクトを導入することで、システム固有の概念を明確に表現できる。

#### 2.不正な値を排除する
　値オブジェクトは生成時にバリデーションを行い、不正な値が存在する余地をなくす。

#### 3.誤った代入を防ぐ
　型として明確に定義されているため、異なる概念を誤って代入してしまうリスクを低減できる。

#### 4.ロジックの散在を防ぐ
　値に関するルールやロジックを一箇所に集約し、コードの一貫性と保守性を向上させる。

## 値オブジェクトの意義
「システム固有の値を作る」というシンプルな考え方が、値オブジェクトの核とされる。
どのシステムにも特有の値が存在するが、プリミティブ型だけで構築すると、その意味やルールが不明瞭になりがちである。
値オブジェクトは、こうしたドメイン固有のルールを内包し、コードそのものをドキュメントとして機能させる。
システムの仕様はドキュメントで管理されることが多いが、ルールをコードに落とし込むことで、仕様の参照や維持が容易にできる。
値オブジェクトは、ドメイン知識をコードに反映させるDDDの基本パターンとされる。

このように、値オブジェクトはシステムの保守性や信頼性を高める重要な役割を担う。

# フロントエンドにおけるDDDの取り入れ方

ビジネスロジックは domain/ディレクトリに置く
データ取得は infrastructure/にまとめる
のように整理できる。

```
src
　┗domain/　# 値オブジェクトやエンティティ （User.ts Money.tsなど）
　┗application/　#ユースケース層（fetchUser.tsなど）
　┗infrastructure/　#API通信（apiClient.ts など）
　┗pages/　# ページ
　┗components/　# UIコンポーネント
 ```

- 「ビジネスロジック （ドメイン）」と「UI（コンポーネント）」を分けて管理しやすくなる
- バックエンドのDDDとフロントのDDDを統一できる
Access Deniedエラー備忘録：S3バケットにアクセスする際に発生する「Access Denied」エラーの原因と対処方法についてまとめてみた

## はじめに  
AWS S3 を利用していると、「Access Denied」のエラーに遭遇することがあります。


:::note warn
**このエラーはアクセス権限の設定に問題がある場合に発生しますが、IAM ポリシーやバケットポリシー、VPC エンドポイントなど、さまざまな要因が絡んでいる可能性があります。**
:::

本記事では、このエラーの原因と対処法を整理し、スムーズに問題を解決できるように解説します。  

## 書こうと思ったきっかけ  
S3 のアクセス制御は、AWS の権限管理の中でも特に混乱しやすい部分です。

:::note info
***私自身も S3 にアクセスできずに悩んだ経験があり、その際に IAM ポリシーやバケットポリシー、VPC エンドポイントの設定などを見直すことで解決できました。***
:::

同じように困っている方がスムーズに問題を解決できるよう、今回の記事を書くことにしました。  


## 困っていたエラー

AWS S3バケットにアクセスしようとした際に、以下のようなエラーが発生することがあります。

```
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
</Error>
```

このエラーの原因は、主にS3バケットのアクセス権限の設定にあります。

**本記事では、考えられる原因と対処方法を体系的にまとめます。**

### 1. IAMポリシーの設定ミス
#### 原因
IAMユーザーやロールに適切な権限が付与されていないと、S3バケットへのアクセスが拒否される可能性があります。

#### 対処方法
1. AWSマネジメントコンソールで、**IAM > ポリシー** に移動。
2. 該当のIAMユーザーやロールに `s3:GetObject` または `s3:ListBucket` などの適切な権限が設定されているか確認。
3. 必要に応じて、ポリシーを修正する。

例: バケット内のオブジェクトを取得する権限の付与
```json
{
    "Effect": "Allow",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::your-bucket-name/*"
}
```

### 2. S3バケットポリシーの制限
#### 原因
バケットポリシーが外部または特定のIAMエンティティからのアクセスを拒否している可能性があります。

#### 対処方法
1. **S3 > バケットのアクセス権限** から、バケットポリシーを確認。
2. `Deny` ステートメントが意図せず適用されていないか確認。
3. 必要に応じてバケットポリシーを修正する。

例: 特定のIAMユーザーにアクセスを許可するポリシー
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:user/your-user-name"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}
```

### 3. バケットのパブリックアクセス設定
#### 原因
AWSのデフォルト設定では、S3バケットはパブリックアクセスが制限されています。パブリックアクセスがブロックされていると、匿名ユーザー（署名なしのリクエスト）からのアクセスは拒否されます。

#### 対処方法
1. **S3 > バケットのアクセス権限 > パブリックアクセス設定** を確認。
2. 必要に応じて、特定のリソースやユーザーに対して適切なアクセス権限を付与。
3. **誤ってバケット全体をパブリックにしないように注意する。**

### 4. AWS Organizationのサービスコントロールポリシー（SCP）
#### 原因
AWS OrganizationsのSCPによって、特定のIAMエンティティがS3へのアクセスを制限されている可能性があります。

#### 対処方法
1. **AWS Organizations > サービスコントロールポリシー** を確認。
2. `s3:GetObject` や `s3:ListBucket` への制限がある場合、適切な修正を行う。

### 5. VPCエンドポイントの設定
#### 原因
S3アクセスがVPCエンドポイント経由に制限されていると、インターネット経由のアクセスはブロックされます。

#### 対処方法
1. **VPC > エンドポイント** で `com.amazonaws.region.s3` のエンドポイントを確認。
2. **エンドポイントポリシー** に `s3:GetObject` が含まれているか確認。

### 6. CloudFront経由のアクセス制限
#### 原因
S3バケットがCloudFrontを介してアクセスされるよう設定されている場合、オリジンアクセス設定によって直接のS3アクセスがブロックされることがあります。

#### 対処方法
1. **CloudFront > オリジン設定** でS3バケットが正しく設定されているか確認。
2. `Origin Access Control (OAC)` や `Origin Access Identity (OAI)` の設定を見直す。

### まとめ
S3バケットへのアクセスが拒否される原因はさまざまですが、基本的には以下のポイントを確認することで解決できます。

1. **IAMポリシー** で適切な権限が付与されているか？
2. **バケットポリシー** で意図しない拒否設定がないか？
3. **パブリックアクセス設定** が必要に応じて有効か？
4. **AWS OrganizationsのSCP** による制限がないか？
5. **VPCエンドポイント** の影響を受けていないか？
6. **CloudFront経由のアクセス** が影響していないか？

エラーが発生した場合は、まず **IAMポリシーとバケットポリシー** を確認し、それでも解決しない場合は **ネットワーク関連の設定** を見直すのがおすすめです。
マルチエージェントシステム(LLMエージェント)にトライ

　前回に続いて、今回はコードで試してみました。
　書籍[「やさしく学ぶLLMエージェント 基本からマルチエージェント構築まで」](https://shosen.tokyo/?pid=184686325)のスクリプトが[GitHub](https://github.com/elith-co-jp/book-llm-agent/)に掲載されているので、シングルなLLMエージェントのコードを飛ばして、マルチエージェントの**とば口**を試してみました。
# （1）新ペルソナ文
試したのは、4.2の**マルチエージェント**（02_multi_agent_system_construction.ipynb）のスクリプトで「3つのエージェントが順番に回答するシステム」。3名のペルソナ（性格）を、以下のように変更し、

```
kenta_traits = """\
- 外出好き
- ジムに通っている
- マラソン大会によく出る
- 映画好き
- 医者嫌い
- 行きつけの飲み屋に仲間が多い"""

mari_traits = """\
- 社会人大学院生
- 少しだけ株を運用している
- 時事ニュースへのコメントをSNSアップが好き
- 気心知れた大勢の人から情報を得ている
- 撮り鉄
- 劇団に所属している"""

yuta_traits = """\
- グルメを自認している
- 内科病院によく通い、健康を大事にしている
- 裏千家の師範
- 多くの料理人と交流が深い
- 料理が得意
- 人の意見を気にしない"""
```
# （2）新質問文
質問を以下の変えて試してみました。

```
human_message = HumanMessage("私は50歳男性で既婚者です。せっかくの有給休暇を有意義に過ごすお勧めを話し合ってください。手短にお願いします")
```

# （3）実行結果
実行するごとにいろいろなお勧めがあり、楽しいものです。
例えば以下です。

>**Human Message**
Name: kenta
もちろんです！有給休暇を有意義に過ごすためのアイデアをいくつか提案しますね。
>1. **アウトドアアクティビティ**: ハイキングやサイクリングなど、自然を楽しむアクティビティはいかがですか？リフレッシュできますよ。
>2. **マラソン大会参加**: ちょうど近くで開催されているマラソン大会に参加するのも良いですね。新たなチャレンジになります。
>3. **映画マラソン**: 自宅でお気に入りの映画を一気に見る「映画マラソン」を楽しんでは？お気に入りのおやつを用意して、リラックスしたひと時を過ごしてください。
>4. **ジムでリフレッシュ**: ジムでのスペシャルトレーニングや、普段よりも長めのワークアウトを楽しむのも素晴らしいです。
>5. **仲間と飲み会**: 行きつけの飲み屋で、仲間たちとの飲み会を計画してみては？リラックスしながら、楽しい時間を共有できます。
>
>夫婦で過ごすなら、一緒に気になるスポットへ旅行したり、特別なディナーを楽しんだりするのも良いですね。どれもリフレッシュできるので、お好みに合ったプランをぜひ楽しんでください！
>
>**Human Message**
Name: mari
どれも素敵なプランですね！有意義な時間が過ごせるといいですね。
ここにいくつか追加のアイデアを。
>1. **鉄道旅行**: 少し遠くに出かけてみるのも良いですね。特に普段行かない場所へ鉄道を使って旅するのは、新しい発見があるかもしれません。
>2. **アートや文化に触れる**: 博物館や美術館、あるいは劇場での観劇もお勧めです。リフレッシュしながら心が豊かになる時間を持てます。
>3. **株や金融の勉強**: ご興味があるかもしれませんが、投資の勉強をする時間に充てるのも、有益な時間の使い方です。
有給休暇の時間を最大限に活かして、普段できないことに挑戦してみるのも楽しそうですね。良い休暇をお過ごしください！
>
>**Human Message**
>Name: yuta
>素敵なアイデアがたくさんですね！私からもいくつか提案させてください。
?1. **料理体験**: 新しい料理に挑戦してみてはいかがでしょう？私の知り合いのシェフが教える料理教室に参加したり、家庭で普段作らないような料理にトライするのも楽しいと思います。
>2. **庭でティーセレモニー**: 私の得意分野でもありますが、自宅の庭や近隣の自然豊かな場所でお茶を楽しむ時間を持つのもリフレッシュになります。心を落ち着かせることができますよ。
>3. **ヘルススパデイ**: 大切な健康を見直すために、スパやリラクゼーション施設で贅沢な一日を過ごすのも癒されます。
>4. **手作り食材を探す旅**: 地元のマーケットや遠方の産地を訪れて、新鮮な食材を購入し、それを使った料理を楽しむのも面白いですね。
>あなたにとってリラックスしながら刺激的な休暇になることを願っています！

# （4）まとめ
　とば口を体験してみました。
　kentaの応答をmariが参考にして、二人の応答をyutaが受けています。
　幾度も試して、そのことがはっきりわかる応答もあれば、そうでない応答もありました。
　書かれている性格を忘れているときがあったり、性格を追加したりするなど、なかなか興味深いお勧めが多数あります。
　HumanMessageに入れた50歳や男性というのは、応答に影響は無かった感じです。
　上記は、わずかな性格記述なので、余計にブレが大きいのだろうと勝手に想像しています。そのあたりの正確な調整は、セミナーに参加しQAしたり[例：書泉ブックタワーイベント](https://connpass.com/search/?q=AI%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88&start_from=2025%2F02%2F14&start_to=2025%2F08%2F14)、本をよく読みこんだり、試行錯誤しつつ理解を深めるしかないでしょうか。または文書作りを生業としてる方のアドバイスを得るとか。
　ChatGPT3.3はかなり怪しい結果でしたが、4oでは、かなり正しく自然に感じます。マルチエージェントもあっという間にそうなっていくことでしょう。今仕組みを実感しておくことが肝要かと。
　しかし、はやり生成AIは、そら恐ろしいです。
　次のスクリプトではエージェント同士がもっと議論しているので、気持ちを作れ次第トライする予定です。

[前回記事 LLMエージェント(AIエージェント)にトライ](https://qiita.com/Sand_m/items/7ada170a038706752859)

[続きの記事　マルチエージェントシステム(LLMエージェント)に再度トライ](https://qiita.com/Sand_m/items/aa41672dd0c3c7ea4ab0)
[Linux][command] マウントとアンマウント_mount, umount

# moutコマンド
~~~terminal:
# mount [オプション]
~~~
~~~terminal:
# mount [オプション] デバイス名 マウントポイント
~~~
| オプション | 由来 | 説明 |
|:--|:--|:--|
| default || 現在マウントされているファイルシステムの一覧が、`/etc/mtab`ファイルの情報を元に表示される |
| `-a` | all | `/etc/fstab` に記載されたすべてのファイルシステムをマウント |
| `-t` | type | 指定した種類のファイルシステムをマウント |
| `-o` オプション | options | マウント時の追加オプションを指定（例: `ro` = 読み取り専用, `rw` = 読み書き可能） |
| `--bind` |bind|既存のディレクトリやファイルを別の場所に再マウント|



# umountコマンド
~~~terminal:
# umount [オプション]
~~~
~~~terminal:
# umount [オプション] デバイス名またはマウントポイント
~~~
| オプション | 由来 | 説明 |
|:--|:--|:--|
| `-a` | all | `/etc/mtab` に記載されたすべてのマウントポイントをアンマウント |
| `-t` ファイルシステム名 | type | 指定した種類のファイルシステムのみをアンマウント |

# 参考リンク
- [mount(8) — Linux manual page](https://man7.org/linux/man-pages/man8/mount.8.html)
- [umount(8) — Linux manual page](https://man7.org/linux/man-pages/man8/umount.8.html)


# Ping-t
- [3333_mount, cat /proc/mounts, cat /proc/self/mounts](https://mondai.ping-t.com/question_subjects/31/question_sessions/32581786/progressing_questions/499228242)
- [3522_umount -at, umount デバイス名, umount マウントポイント](https://mondai.ping-t.com/question_subjects/31/question_sessions/32569047/progressing_questions/499039922)
- [3525_mount -t ext3 -o ro ](https://mondai.ping-t.com/question_subjects/31/question_sessions/30552498/progressing_questions/468099718)
- [3542_mount](https://mondai.ping-t.com/question_subjects/31/question_sessions/32697155/progressing_questions/500927909)
- [3584_mount](https://mondai.ping-t.com/question_subjects/31/question_sessions/31763145/progressing_questions/486763770)
- [3673_mount](https://mondai.ping-t.com/question_subjects/31/question_sessions/30892897/progressing_questions/473298363)
- [3674_mount](https://mondai.ping-t.com/question_subjects/31/question_sessions/30870646/progressing_questions/472924558)
- [3711_mount --bind](https://mondai.ping-t.com/question_subjects/31/question_sessions/31509922/progressing_questions/482817762)
新人にはMarkdownでドキュメント作成させたいという話

## 背景

最近転職をして後輩(社会人一年目)を持つこととなり、様々教える機会が増えました。
その中で、「Markdownでドキュメント作成させたい！」と思ったので、その話をします。

## なぜそれを思うのか

### 1. 「階層構造を作る」という行為の勉強になるから

Markdownでドキュメントを作ると、階層構造をある程度意識して作る習慣が根付きます。
階層構造とは物事を誰かに理解してもらうという目的のために、最も安易でかつシンプルな枠組みです。
しかし、それをあんまり理解していない人は実は社会に多く存在しています。
その人たちとの差別化という意味でも、階層構造を作る練習をMarkdownにおいて行うというのは悪くないアプローチじゃないかと思うわけです。

### 2. Officeドキュメント作成には時間がかかるから

PowerPointやExcel、Word等は作成に時間がかかります。体裁を整えたり、きれいな図や色使いなどこだわるポイントがたくさんあります。
しかし、その工数は本当に必要でしょうか。
<br>

MarkdownやMermaidではそのような工程をある程度自動化してくれます。
実際「他人に理解してもらう」という目的を達成するために、
体裁や色使いはそれほど重要ではないと個人的には思います。
個人的には、そんなことに時間を使っていないでもっと別の仕事に工数を使ってほしいと思うのです。

### 3. Gitで構成管理する時に便利だから

.docx, .xlsx, .pptxのようなバイナリ形式のファイルはGitなどの構成管理ツールに不向きです。
しかしMarkdownは構成管理もしやすく、Gitなどに躊躇なく格納することができます。

## Markdownでドキュメントを作るにあたっての懸念点

### 1. 非エンジニアには共有できない

エンジニアならばMarkdownを知っている人がほとんどだと思うので大きな問題はないでしょうが、非エンジニアはそうはいきません。
Officeファイルでお腹いっぱいです…という非エンジニアはたくさんいますので、
その人たち向けの資料は当然Officeファイル等で提供するべきでしょう。

### 2. 表形式中心のドキュメントはMarkdownには荷が重い

どんなにMarkdownを使っていても、表形式の資料を作るならExcelがベストな選択肢でしょう。
別にOfficeファイルにもいいところはあると思っているので、使いどころは意識しておくべきだと思います。

## 最後に

もっと非エンジニアにもMarkdownの使いやすさを広めていきたいと個人的には思っています。
最近はMarkdownでPowerPointライクな資料が作れるMarpも使っていますので、いつか記事にしたいです。
海外FXに関する情報をまとめています

海外FXおすすめランキングを作成しました。
https://kaigaifx.co.jp/kaigaifx-reccomend/

海外FXの口座開設ボーナスのランキングです。
https://kaigaifx.co.jp/no-deposit-bonus/

海外FXの入金ボーナスのランキングです。
https://kaigaifx.co.jp/kaigaifx-deposit-bonus/

運営会社
https://kaigaifx.co.jp/
Windows11の初期設定でローカルアカウントを作る

現在Windows1の初期設定において，通常のやり方ではMicrosoftのアカウントとインターネットが必要で，ローカルアカウントの設定ができません．しかし，次の裏技を使えば，初期設定でローカルアカウントを作ることができます．


1. 新しいWindows PCをインターネットに接続をできない状態にする（インターネット接続の設定をしない）．
2. 新しいWindows PCを起動する．
3. 最初の画面で"Shift+F10"を押す．そうすると，コマンドプロンプトが立ち上がる．
4. コマンドプロンプトで，"cd oobe"と入力し実行する．
5. コマンドプロンプトで，"BypassNRO.cmd"と入力し実行する．そうすると，Windowsが再起動される．
6. 再起動されたら，指示に従いWindowsの初期設定を"ネットワークを接続しましょう"まで行う．
7. "ネットワークを接続しましょう"では，"インターネットに接続していません"を選ぶ．
8. 次からローカルアカウントの設定が始まる．これ以降，指示に従って設定すれば，ローカルアカウントが作成されたWindowsとなる．．
Airbnbが公開しているコーディング規約を活用してコードをスッキリ書こう

# はじめに

エンジニアのみなさま、日々の学習お疲れ様です。
また本記事まで足を運んでいただき本当に感謝です。

今回はスター数14万を超える、Airbnbが公開してるGitHubのご紹介になります。


# GitHubの内容

https://github.com/airbnb/javascript?tab=readme-ov-file

なんのGitHubかと言うと、**コーディング規約** が書かれています。
以下はJavaScriptになりますが、こんな感じで公開されてます。

![スクリーンショット 2025-02-15 22.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/ee962621-d696-409e-a922-d758396a8266.png)

[ESLintのサイト内](https://eslint.org/)で公開している関連コードもリンクとして貼られてますね。
※Airbnbもスポンサーとして参画してるっぽいです。


# おすすめポイント

悪い書き方・良い書き方のサンプルコードが書かれているため、パッと見で分かるのが良いですね。加えて **『なぜこの書き方にするべきなのか？』** が引用の文章内で書かれているため、納得感もあります。

項目はJavaScriptだと39項目あります。

![スクリーンショット 2025-02-15 23.06.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3744730/467df623-a1ff-4c19-8e86-712f32386eab.png)

かなり充実してますね！
初学者で書き方が分からなかったり、プロジェクトでコーディング規約を検討する際にかなり重宝出来そうです。

JavaScriptに加えて **『React』** と **『Ruby』** も公開されてます。
興味のある方は合わせて見てみてくださいね！


# さいごに

弊社の紹介もさせてください！

### 「日本で一番エンジニアが成長できる会社を創る」

https://prum.jp/

弊社メンバーは日々学習した内容をアウトプットしております！
少しでもご興味を持たれた方は求人を見てみてください！
ご応募もお待ちしております！

### 最後までご覧いただき、ありがとうございました！
ABC393回答メモ

# 0.はじめに
　最近ARCの高レート化とかあったので、ABCにレベルの調整が入ったのか
　Bはやや難しく、Cは以前のBとCの間位、Dは以前のC位の難易度になった気がします。
　
　ということで、今回もDまでは難なくAC。
　E以降は、難しく解説を見てもちょっと分からない感じでした・・・。

　レートは順調に+11で798と、緑までほんとにあと一歩となりました。


# 1.A - Poisonous Oyster
　各牡蠣の状態(o正常、x痛んでる)と、青木君、高橋君の状態は以下。
　1234　高橋　青木
　xooo　sick　 sick
　oxoo　sick　 fine
　ooxo　fine　 sick
　ooox　fine　 fine
　あとは、入力したS1とS2の状態から、痛んでる牡蠣の番号を判断し
　出力して終了

　https://atcoder.jp/contests/abc393/submissions/62756299


# 2.B - A..B..C
　こういう時は、Bを固定してAとCを調べると聞いた気がしますが
　まぁ、そこまで制限は厳しくないのでAを起点に考えました。
　【考え方】
　　・Sを先頭から見ていく
　　・S[i]がAの時、以下のループを、”i+ループ回数×2”がSの長さを超えるまで繰り返す
　　　・S[i+ループ回数]＝B、S[i+ループ回数*2]＝Cの時、回答用変数に1を加算
　　・最後に回答用変数を出力して終了

　https://atcoder.jp/contests/abc393/submissions/62771624


# 3.C - Make it Simple
　経路問題かと思いきや、単純な問題でした。
　【考え方】
　　・辺の中から除外する条件は以下
　　　・始点と終点が同じ（自己ループ）
　　　・各辺の小さい方を始点、大きい方を終点とした場合
　　　　同一の辺がある辺（多重辺）
　　・辺をチェックしていき、上記条件に合う辺の数を数えて最後に出力

　https://atcoder.jp/contests/abc393/submissions/62775595


# 4.D - Swap to Gather
　【考え方】
　　・ある１を起点として左右の１を寄せた場合の操作数をそれぞれ求め一番小さい操作数を求める
　　　1.前から見ていき、各1までその前までの1を移動してきた場合の操作数を求める。
　　　2.後ろから見ていき、各1までその後ろの1を移動してきた場合の操作数を求める。
　　　3.各１毎の１と２で求めた値を足した値がその1まで前後の１を移動させてきた場合の操作数となる

　【実装】
　　1.文字列の長さNと、文字列Ｓをインプット
　　2.以下変数を定義
　　　Ｘ：始点から現在の位置までの1の数
　　　Ｙ：前の1から現在の位置までの0の数
　　　Ｚ：前の1までの操作数
　　　Ｌ：文字列Ｓのi文字目の1まで左側の1を詰めた場合の操作数リスト[0]×Nで初期化
　　　Ｒ：文字列Ｓのi文字目の1まで右側の1を詰めた場合の操作数リスト[0]×Nで初期化
　　　ａｎｓ：回答する最小操作数。Ｎの5条で初期化
　　3.以下N回ループ（index：i）：Sを左からチェックしていき、その１までの1をすべて詰めるのに必要な操作数を計算
　　　-1.S[i]が1の時
　　　　-1.L[i]にZ+(X*Y))をセット
　　　　-2.Xに1加算
　　　　-3.Yに0をセット
　　　　-4.ZにL[i]をセット
　　　-2.S[i]が0の時
　　　　-5.Yに1加算
　　4.XYZを初期化
　　5.以下N回ループ（index：i）：Sを右からチェックしていき、その１までの1をすべて詰めるのに必要な操作数を計算
　　　-1.S[N-1-i]が1の時
　　　　-1.L[N-1-i]にZ+(X*Y))をセット
　　　　-2.Xに1加算
　　　　-3.Yに0をセット
　　　　-4.ZにL[N-1-i]をセット
　　　-2.S[N-1-i]が0の時
　　　　-5.Yに1加算
　　6.以下N回ループ（index：i）：Sを右からチェックしていき、１の時その1に左右の1を集約した場合の操作数を計算
　　　-1.S[i]が1の時
　　　　-1.ansに、ansとL[i]+R[i]の小さい方をセット
　　7.ansを出力して終了


　https://atcoder.jp/contests/abc393/submissions/62796810


以上