OmniAICreator/Qiita-1.07M huggingface dataset:
flutter × firebase プロジェクトの始め方メモ

# 1. プロジェクト作成
`flutter create hogehoge`

# 2. githubとプロジェクトを繋ぐ
1. Create a new repository
2. `…or push an existing repository from the command line`をコピー
3. 

```bash
git init
git add -A
git commit -m "first commit"
コピーしたやつを貼り付け
```
    
# 3. 不要なプラットフォームを削除
`macos`, `windows`などのフォルダをそのまま消してOK

# 4. launch.jsonファイルを作成(ボタンでデバッグを実行できるようにする)
デバッグメニューから ` launch.jsonファイルを作成` → `Dart & Flutter`

# 5. fvmの導入
1. `fvm releases` で最新版の確認
2. `% fvm use <Version>` で特定のバージョンを使う

[参考記事](https://qiita.com/tks_00/items/53ed3fc9acb53450061b#2-%E4%BD%BF%E3%81%84%E6%96%B9)

# 6. firebaseのプロジェクトを作成(ターミナルから作成)
[リファレンス](https://firebase.flutter.dev/docs/overview)
1. `fvm flutter pub add firebase_core`
1. `dart pub global activate flutterfire_cli`
1. `flutterfire configure`
1. create a new project からプロジェクト名を入力し、新規作成

# 7. firebaseの初期化
[リファレンス](https://firebase.flutter.dev/docs/overview#initialization:~:text=Initialization-,%23,-Next%20the%20generated)を参照

# 8. iosビルド時間の改善
[リファレンス](https://firebase.flutter.dev/docs/firestore/overview/#4-optional-improve-ios--macos-build-times)
 1. `  pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '最新バージョン'
`を追加
 2. `platform :ios, '16.0'`のコメントアウトを外して、適切なバージョンに
 3. `cd ios`
 4. `pod install`


# 9. プロジェクトごとの設定
Auth, storege, firestoreなどの設定を行う

# 10. 使用するパッケージを`pub add`する
念の為、再度`pod install`を実行しておく

# 11. modelsを作成する
個人的備忘録：Pythonのスリム版で MySQL クライアントが導入されているか確認する方法について

## はじめに

Pythonの公式Dockerイメージには、`slim` バージョンがあり、これは不要なパッケージを削減して軽量化されたバージョンです。

:::note info
**しかし、通常この `slim` 版にはMySQLクライアント (`mysql` コマンド) が含まれていません（自分調べ）。**
:::

本記事では、Pythonのスリム版DockerイメージでMySQLクライアントが導入されているか確認する方法と、必要に応じてインストールする手順を解説します。

## 書こうと思ったきっかけ

最近、Dockerを利用したPythonの開発環境を構築する際に、Pythonの `slim` イメージを使うと、デフォルトではMySQLクライアントが含まれていないことに気付きました。

:::note warn
**MySQLに接続する処理を実装しようとしたところ、`mysql` コマンドが見つからず、手動でインストールする必要がありました。**
:::

同じ問題に直面する開発者も多いと考え、MySQLクライアントの導入確認とインストール手順を整理して記事にまとめることにしました。

## 1. MySQLクライアントの導入確認方法

### 1.1 `mysql` コマンドの存在確認
以下のコマンドを実行し、`mysql` コマンドが利用可能か確認します。

```bash
which mysql
```
または
```bash
command -v mysql
```

**出力例**
```
/usr/bin/mysql
```
このような出力があれば、MySQLクライアントが導入されています。

もし何も出力されない場合は、MySQLクライアントが未導入です。

### 1.2 パッケージ管理ツールでの確認
Pythonのスリム版DockerイメージはDebianベースなので、以下のコマンドでインストール済みのパッケージを確認できます。

```bash
dpkg -l | grep mysql-client
```
または
```bash
apt list --installed | grep mysql-client
```

これらのコマンドで `mysql-client` に関する出力がない場合、MySQLクライアントは導入されていません。

### 1.3 `mysql` のバージョン確認
もし `mysql` クライアントがインストールされていれば、以下のコマンドでバージョンを確認できます。

```bash
mysql --version
```

**出力例**
```
mysql  Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL)
```
このような出力が表示されれば、MySQLクライアントが導入済みであることが確認できます。

## 2. Pythonスリム版でMySQLクライアントをインストールする方法

Pythonの `slim` イメージにはMySQLクライアントが含まれていないため、必要に応じて手動でインストールします。

### 2.1 コンテナ内で手動インストール
以下のコマンドを実行すると、MySQLクライアントをインストールできます。

```bash
apt update && apt install -y mysql-client
```

### 2.2 Dockerfileに追加する場合
もしDockerコンテナにMySQLクライアントを含める場合は、`Dockerfile` に以下を追加します。

```dockerfile
FROM python:3.x-slim
RUN apt update && apt install -y mysql-client && rm -rf /var/lib/apt/lists/*
```

`rm -rf /var/lib/apt/lists/*` の部分は、不要なキャッシュを削除してイメージサイズを小さくするためのものです。

## まとめ

Pythonの `slim` イメージでは、デフォルトでMySQLクライアントが含まれていないため、以下の手順で確認・導入できます。

1. `which mysql` や `command -v mysql` でコマンドの存在を確認
2. `dpkg -l | grep mysql-client` でパッケージのインストール状況を確認
3. `mysql --version` でバージョンをチェック
4. 必要なら `apt update && apt install -y mysql-client` でインストール

これらの手順を実行することで、Pythonのスリム版DockerイメージでもMySQLクライアントを使用できるようになります。

Pythonの `slim` イメージは軽量で便利ですが、デフォルトでは一部のツールが省かれているため、必要に応じて適切にインストールすることが大切です。
MkDocsでのPDF作成(mkdocs-with-pdf)で日本語フォントがあるにも関わらず文字化けする対応

## 問題

MarkdownからPDFへの文書作成環境として、

- [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/)
- [PDF Generate Plugin for MkDocs](https://github.com/orzih/mkdocs-with-pdf)
- [Noto Sans CJK JP fonts](https://fonts.adobe.com/fonts/noto-sans-cjk-jp)

というDocker環境を用意したにも関わらずいわゆる中華フォントが表示されてしまう。

下記サンプルだと、語、底、冷が想定している日本語フォントと異なる。

### デフォルトでの変換、いわゆる中華フォント

![中華フォント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132537/b2ec953f-a223-4b8f-a7c9-80f8fa2e82a6.png)

### 望んだ変換

![日本語フォント.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132537/076b8d5a-2db4-47c3-b034-a9151b0b5914.png)

## 原因

mkdocs-with-pdfがデフォルトで用意しているスタイルシートのフォント指定のため。

https://github.com/orzih/mkdocs-with-pdf/blob/master/mkdocs_with_pdf/styles/_fonts.scss

## 対策

自分のMkDocsプロジェクトのカスタムテンプレートとしてSCSSを`templates/styles.scss`ファイルに置くことでスタイル設定できるので、そちらでフォント指定をしてあげる。

```text
.
├── docs
├── mkdocs.yml
└── templates
    └── styles.scss 
```

私の場合は全てNoto Sansのゴシック体にしたいので下記の様にした。

```scss:templates/styles.scss
@media print {
  html,
  body,
  h1,
  h2,
  h3,
  h4,
  h5,
  h6,
  label {
    font-family: 'Noto Sans CJK JP', sans-serif;
  }
}
```

::: note
デフォルトのスタイルだと、上記サンプルの様に赤いアンダーラインを引かれたり、文字がグレーだったり、自分が出力して欲しいPDFとはバランスが異なるので、フォント同様にカスタムスタイルシートで変更した。
:::

## 確認環境

次のDockerfileで動作確認している。mkdocs-materialのオリジナルイメージに対して、

- mkdocs-with-pdf
- font-noto-cjk 

をインストールしたもので確認。

```Dockerfile
ARG MKDOCS_MATERIAL_VERSION=latest

# マルチステージビルドにしているのはmkdocs-with-pdfがlibsassを必要とし、
# こちらはピュアPythonではないのでビルドの必要がある。
# ビルド環境が入るとイメージが大きくなるのでちょっとでも小さくするために…。
# まあ、CJKフォントがでかいのですが。
FROM squidfunk/mkdocs-material:${MKDOCS_MATERIAL_VERSION} AS builder

RUN apk add --no-cache \
    gcc \
    g++ \
    musl-dev

# オリジナルのmkdocs-with-pdfはメンテナンスされてないのでフォークである
#   git+https://github.com/domWalters/mkdocs-to-pdf@v0.9.4
# を使った方が色々修正が入っているので良いが、例示のためオリジナルを。
RUN pip install --no-cache-dir \
    mkdocs-with-pdf

# ここから本編のイメージ
FROM squidfunk/mkdocs-material:${MKDOCS_MATERIAL_VERSION}

RUN apk add --no-cache \
    font-noto-cjk \
    font-noto-cjk-extra \
    chromium

# Tywd ビルド済みパッケージをコピーする
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
```
文字列の長さを取得する（再帰）

### 思考プロセス

再帰処理で取得するには、文字列の末尾を切り取り、引数として返す。
ベースケースは文字列の要素が全て削除されたとき。

```python
def lengthOfString(s):
    if s == '': # ベースケース
        return 0
    # l(ABCDE) = l(ABCD) + 1 のように、文字列の末尾を切り取り、引数として渡す
    return lengthOfString(s[:-1]) + 1
```
春日部つむぎ「はぁ？（威圧）」「はぁ～？（煽り）」


## バージョン

0.22.4

## はぁ？

| 名称 | 値 |
|:-:|:-:|
| テキスト | はあ？ |
| 抑揚 | 2.0 |
| ｱｸｾﾝﾄ | ア |
| ｲﾝﾄﾈｰｼｮﾝ | 5.53, 5.73 |
| 長さ | 0.081, 0.107, 0.225 |

他は初期値

## はぁあ～？（おすすめ）

| 名称 | 値 |
|:-:|:-:|
| テキスト | はあ？ |
| 抑揚 | 2.0 |
| ｱｸｾﾝﾄ | ア |
| ｲﾝﾄﾈｰｼｮﾝ | 5.53, 5.73 |
| 長さ | 0.088, 0.300, 0.240 |

他は初期値

## 余談

春日部つむぎに「は」を単体で読ませると「あ」と読んでいるようにしか聞こえない。
同様に
「ぬ」は「う」
「へ」は「え」
「る」は「う」
「わ」は「あ」
にしか聞こえない。
【統計検定２級】確率分布まとめ

## はじめに
統計検定２級の出題範囲の確率分布についてまとめてみました。

## 表
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387980/e36aaf4c-ec71-4db8-b8f6-46d7671e56b0.png)

## おわりに
ここまで読んでいただきありがとうございます！
#0056（2024/02/24）memo「良いコード/悪いコードで学ぶ設計入門」第7章~コレクション~

# 「良いコード/悪いコードで学ぶ設計入門」第7章~コレクション~ を読んで
## アクティブリコール
- 型チェックを初期化に組み込むみたいな話？

## 再読
- if文での確認ではなく、anyMatchなどの既存のモジュールを使えないか考える（車輪の再発明をしない）
- インスタンス変数の中身の不変を保つ
- 重複コードを防ぐために、メソッドを使う
- ファーストクラスコレクション
- 早期break, 早期continue　で可読性を高める

## あとで調べる
- ファーストクラスコレクション（クラス処理のカプセル化）
「“p”以降に”q”がある」の表現方法

### 思考プロセス

“p”以降に”q”がある＝”p”以降の文字列に”q”が含まれる
find()で”p”のインデックスを特定し、スライス構文で以降の文字列を取得、「特定の文字が含まれるか」の判定を行う。

```python
s = "abcpdefqgh"

print("q" in s[s.find("p") + 1:])  # True（"p" 以降の "defqgh" に "q" がある）
```
文字列の要素が”pから始まらない”の表現方法

### 1. find() を使用

取得したインデックスが0より大きい＝2番目以降の要素
```python
s = "hello"
print(s.find("h") > 0)  # False
```

### 2. startswith() を使用

文字列が引数で始まるかを判定するメソッド。Falseであれば引数は2番目以降の要素と言える。
```python
s = "hello"
print(not s.startswith("h"))  # False
```
「特定の文字が”1つのみ”含まれる」の表現方法

### 思考プロセス

カウント関数を用いて、対象の文字列に含まれる文字の数を取得し、1であれば「1つのみ」を表現できる。

```python
s = "hello@world.com"
print(s.count("@") == 1)  # True
```
#0055（2024/02/24）memo「良いコード/悪いコードで学ぶ設計入門」第6章~条件分岐~

# 「良いコード/悪いコードで学ぶ設計入門」第6章~条件分岐~ を読んで
## アクティブリコール
- switch, if/elseによる条件分岐はカオスになる
    - 変更に弱いコード
- データクラスの活用

## 再読
- 早期returnで可読性を高める
- 初級者はswitchでの実装を試みる、中級者はinterfaceを使ったクラス設計を考える
- 型チェックで分岐しない！
- フラグチェックは可読性が低くなる→ストラテジパターン

## あとで調べる
- リスコフの置換原則
- 値オブジェクト
- ストラテジパターン
- 抽象クラスとインターフェース
- ポリシーパターン
【Rails】flashが消えない理由とその対処法

# はじめに

こんにちは。アメリカにて独学でエンジニアを目指している者です。
Railsのflash機能について、画面をまたいだ一時的なメッセージの表示に重宝します。
しかし、アプリケーションの開発中に「意図せずフラッシュメッセージが消えない」という問題に遭遇することがあります。本記事では、そのよくある原因と解決策をご紹介します。

---

## flashとflash.nowの仕組み

### flash

- **リダイレクトを伴う操作で利用することが多い**。
- 一度設定すると、**次のリクエストまでメッセージが保持される**。
- そのため、`redirect_to`を利用してページが切り替わった先でもメッセージを表示できる。
- 新たなリクエストが発生した段階で、フラッシュメッセージは自動的に消える。

### flash.now

- **同一リクエスト内でのみ有効**。
- メッセージを即時表示するが、次のリクエストには引き継がれない。
- そのため、`render`でエラーページを再表示するときなどに使われることが多い。

---

## flashが消えない主な原因

### 原因1: 同じリクエスト内でrenderを使っているのにflashを設定している

たとえば、コントローラでログインエラーを表示するケースを考えてみます。

```ruby
if user && user.authenticate(params[:password])
  # ログイン成功
  redirect_to user_path(user)
else
  # ログイン失敗
  flash[:danger] = 'メールアドレスかパスワードが違います'
  render 'new'
end
```

この例では、ログイン失敗時に`flash[:danger]`を使ってメッセージを設定していますが、同じリクエスト内で`render 'new'`しているため、次に別のページへアクセスした際にもメッセージが残り続けてしまうことがあります。本来であれば

```ruby
flash.now[:danger] = 'メールアドレスかパスワードが違います'
```

とすることで、今のリクエストだけにエラーメッセージを表示し、次のリクエストには引き継がれなくなります。

### 原因2: renderとredirectの使い分けの混乱

Railsでは、以下の使い分けが一般的です。

- **成功時: ****`redirect_to`**** + ****`flash`**
  - 新たなリクエストでメッセージを表示したい場合
- **失敗時: ****`render`**** + ****`flash.now`**
  - 同じページにエラーメッセージを表示したい場合

こうすることで、想定通りのタイミングでフラッシュメッセージが表示され、次のリクエストに引き継がれなくなります。

### 原因3: ビューでのフラッシュ表示ロジック

場合によっては、ビューでのフラッシュ表示部分が適切に制御されていないと、消えているはずのフラッシュが再度描画されるケースがあります。`application.html.erb`などレイアウトファイルでフラッシュを表示するコードをカスタマイズしている場合は、記述が正しいかもチェックしておきましょう。

---

## 対処法のまとめ

1. **renderする場合は****`flash.now`****を使う**
   - 次のリクエストに渡さず、その場だけでメッセージを表示したいときに使う
2. **redirectする場合は****`flash`****を使う**
   - リダイレクト先のページでフラッシュメッセージを表示したいときに使う
3. **ビュー側の表示ロジックを確認する**
   - フラッシュメッセージをどの段階で描画しているか、不要に再表示していないか

以上のポイントを守ることで、「flashが消えずに残り続ける」という不具合は解決できるはずです。しっかりとRailsの仕組みに沿ったフラッシュの使い分けを実践し、ユーザーフレンドリーなUIを提供していきましょう。

---

## まとめ

- `flash`と`flash.now`の使い分けはRailsアプリケーションの基本的な知識として覚えておきましょう。
- **リダイレクト時**に画面遷移先でもメッセージを表示したい場合 → `flash`
- **同じページを再表示**する場合 → `flash.now`

これらを適切に利用することで、フラッシュメッセージが思わぬタイミングで消えなかったり、逆に表示されなかったりする問題を防ぐことができます。
JupyterNotebookでPythonを学んでみた

## 題材
前回と同じAsabenehさんがGithubに上げている「30-Days-Of-Python」

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500655/062a63dc-7c9a-43cf-a00a-f80a44227dd5.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500655/22517d9a-1234-4955-8705-2cff9b0067bd.png)

構成が最初に簡潔な説明があり、そのあと、Exerciseがあるというシンプルで分かりやすいので、自分のような初めてPythonを学習する人にはお勧めだと思う。英語だが、そこまで難しい英語は使われていない（と思う）ので、英語学習にも使える。

Githubで公開されているので、無料で見ることができる。

リンク
https://github.com/Asabeneh/30-Days-Of-Python/tree/master

## なぜJupyterNotebookなのか
理由はカーネルごとにコードを実行できるため、Python学習（Excesizes）に向いていると思ったから。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500655/8213270c-c273-4b18-b14e-7ad4f86e5d81.png)

上のキャプチャのように、上のカーネルで入力値を保持するコード、下のカーネルで出力するコードを書いたりできる。

前の記事でVSCodeとCopilotを使ったが、Copilotが優秀すぎて（Exerciseの回答まで予測してくれる！）Pythonの勉強には向かないと思ったから。また、1つのファイルにいくつもExerciseを書くと、すべて実行されてしまい、Exerciseごとの実行が面倒だから。

＜前回の記事＞

https://qiita.com/HIRO_abroad/items/8fec78a71dbaacd706f0


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3500655/ee458553-1202-4982-bfc9-a9593edd1851.png)

## 感想
やはり、Exerciseをするのは、JupyterNotebookのほうがやり易いなあと思った。
VScodeとCopilotではコードを書くには一瞬で終わるが、自分の頭を使って答えを出したい人はJupyterNotebookなどのほかの環境がおすすめ(Copilotが優秀すぎるため)。
Docker環境で発生したPostgreSQL接続エラーを解消した

### :dango: 書きたいこと：
Dockerを使用してWebアプリを作る過程で発生した`ActiveRecord::ConnectionNotEstablished`エラーをどうやって解消したか、記録に残しておく。

### :hourglass_flowing_sand: 発生したエラー：
```
connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory
        Is the server running locally and accepting connections on that socket?
Couldn't create 'app_development' database. Please check your configuration.
bin/rails aborted!
ActiveRecord::ConnectionNotEstablished: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory (ActiveRecord::ConnectionNotEstablished)
        Is the server running locally and accepting connections on that socket?


Caused by:
PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: No such file or directory (PG::ConnectionBad)
        Is the server running locally and accepting connections on that socket?

Tasks: TOP => db:create
```

### :chart_with_upwards_trend: エラーの原因：
Docker 内で PostgreSQL に接続しようとするとき、TCP 接続 (host: db) を使う必要があるが、設定ミスでUNIX ドメインソケット (/var/run/postgresql/.s.PGSQL.5432) を使おうとしていた

### :bulb: 解決法：
①設定ファイルに下記の内容を追加して、TCP接続を行うように設定

```config\database.yml
development:
  <<: *default
  database: app_development
      host: dbname        # コメントアウトを解除し、localhostではなくデータベースサーバーのホスト名（コンテナ名）を設定
```

```docker-compose.yml
services:
    environment:
      DATABASE_URL: postgres://username:password@severname:5432/dbname    # 設定値はサンプル
```

②`Docker compose up`を実行

### :santa: 結果：
`http://localhost:3000/` でログインできた！
個人的備忘録：AWS ECSで enableExecuteCommand を有効化し、コンテナにログインする方法

## はじめに
AWS ECS のタスクに対して `enableExecuteCommand` を有効にすることで、コンテナに直接アクセスできるようになります。

本記事では、手動でこの設定を変更し、適用する手順を説明します。設定の確認から適用までの流れを簡潔にまとめました。

## 書こうと思ったきっかけ
ECSのコンテナにアクセスしようとした際に `enableExecuteCommand` が無効であることに気付きました。

この設定を変更する手順を明確にしておけば、今後同じ問題に直面した際にスムーズに対応できると考えました。

また、他の開発者にも参考になるように記録を残すことにしました。

### 1. 現在の `enableExecuteCommand` 設定を確認
まず、現在のタスクの `enableExecuteCommand` の設定を確認します。

```sh
aws ecs describe-tasks --cluster my-ecs-cluster --tasks $(aws ecs list-tasks --cluster my-ecs-cluster --query "taskArns[0]" --output text) --query "tasks[].enableExecuteCommand"
```

### 2. サービスで `enableExecuteCommand` を有効化
次に、対象の ECS サービスで `enableExecuteCommand` を有効化します。

```sh
aws ecs update-service --cluster my-ecs-cluster --service my-ecs-service --enable-execute-command
```

### 3. 設定が反映されたかを確認
有効化後、設定が反映されたかどうかを再度確認します。

```sh
aws ecs describe-tasks --cluster my-ecs-cluster --tasks $(aws ecs list-tasks --cluster my-ecs-cluster --query "taskArns[0]" --output text) --query "tasks[].enableExecuteCommand"
```

### 4. 強制的に新しいデプロイを実行
もし変更が即時に反映されない場合、新しいデプロイを実行して反映させます。

```sh
aws ecs update-service --cluster my-ecs-cluster --service my-ecs-service --force-new-deployment
```

### 5. 最終確認
最後に、もう一度 `enableExecuteCommand` の設定が有効になったかを確認します。

```sh
aws ecs describe-tasks --cluster my-ecs-cluster --tasks $(aws ecs list-tasks --cluster my-ecs-cluster --query "taskArns[0]" --output text) --query "tasks[].enableExecuteCommand"
```

### 6. コンテナへログインする方法
設定が有効になったら、以下のコマンドを実行してコンテナにログインできます。

```sh
aws ecs execute-command --cluster my-ecs-cluster --task $(aws ecs list-tasks --cluster my-ecs-cluster --query "taskArns[0]" --output text) --container <コンテナ名> --command "/bin/sh" --interactive
```

`<コンテナ名>` には対象のコンテナ名を指定してください。これにより、コンテナ内部でシェルを操作できます。

## まとめ
今回の手順で、ECS タスクの `enableExecuteCommand` を有効化し、設定が反映されることを確認しました。

:::note info
**特に `force-new-deployment` を実行することで、確実に設定が適用されることを理解しました。**
:::

さらに、`execute-command` を使用することで、直接コンテナにログインできるようになりました。

この方法を覚えておけば、今後も迅速にコンテナへアクセスできるようになります。
「文字列”p”が含まれない」の表現方法

### 1. not in 文字列

可読性が高い

```python
domain = "[example.com](http://example.com/)"
if "@" not in domain:
print("@は含まれていません")
```

### **2. find() == -1**

対象の文字が見つからない場合、-1を返す

```python
domain = "[example.com](http://example.com/)"
if domain.find("@") == -1:
print("@は含まれていません")
```

### **3. count()**

出現回数をカウントし、0なら含まれていないと同値

```python
domain = "[example.com](http://example.com/)"
if domain.count("@") == 0:
print("@は含まれていません")
```
基本的な文字列操作の関数まとめ

Pythonの組み込み関数やメソッドで文字列を操作する方法の一覧をまとめた。

### 1. 大文字・小文字変換

| メソッド | 説明 |
| --- | --- |
| .upper() | すべて大文字に変換 |
| .lower() | すべて小文字に変換 |
| .capitalize() | 先頭のみ大文字に変換 |
| .title() | 各単語の先頭を大文字に |
| .swapcase() | 大文字・小文字を反転 |

```python
text = "Hello"
print(text.upper())  # HELLO
print(text.lower())  # hello
print(text.capitalize())  # Hello
print(text.swapcase())  # hELLO
```

---

### **2. スライス（部分文字列の取得）**

| 方法 | 説明 |
| --- | --- |
| s[start:end] | start から end-1 まで取得 |
| s[:end] | 先頭から end-1 まで取得 |
| s[start:] | start から最後まで取得 |
| s[::-1] | 逆順にする |

```python
text = "Hello"
print(text[1:4])  # ell
print(text[:3])  # Hel
print(text[2:])  # llo
print(text[::-1])  # olleH
```

---

### **3. 部分文字列の検索**

| メソッド | 説明 |
| --- | --- |
| .find(sub) | sub の位置（最初）を返す |
| .rfind(sub) | sub の位置（最後）を返す |
| .index(sub) | sub の位置（エラーあり） |
| .count(sub) | sub の出現回数 |

```python
text = "Hello World"
print(text.find("o"))  # 4
print(text.find("World"))  # 6
print(text.find("x"))  # -1  （見つからない場合）
```

.index(sub) メソッドは指定した sub の位置を返すが、sub が見つからない場合 ValueError 例外を発生させる。
対して、 .find(sub) はsub が見つからない場合 -1 を返すため、エラーにならない

---

### 4. 文字列の連結

| 方法 | 説明 |  |
| --- | --- | --- |
| + | 文字列を結合 |  |
| .join(iterable) | リストの文字列を結合 |  |

```python
text1 = "Hello"
text2 = "World"
print(text1 + " " + text2)  # Hello World
```

---

### 5. **文字列の分割**

| メソッド | 説明 |
| --- | --- |
| .split() | スペースで分割 |
| .split(",") | 指定文字で分割 |
| .rsplit() | 右側から分割 |

```python
text = "apple,banana,grape"
print(text.split(","))  # ['apple', 'banana', 'grape']
```

---

### **6. 文字列の置換**

| メソッド | 説明 |
| --- | --- |
| .replace(old, new) | 文字列を置換 |

```python
text = "Hello World"
print(text.replace("World", "Python"))  # Hello Python
```
整数の桁を数値として取得する

## 思考プロセス

「取得したい桁を末尾に移動させ、余りとして取得する」

任意の整数を10で割った余りを求めることで、末尾の桁を1つ取得する。
1つ上の桁を取得するには、10で割った整数部分を抜き出すことで末尾に移動させることができ、同じように1つの数値のみを取得できる。

### 73から3を取得する
10で割った余りは「%」で表せる。
```python
num = 73
last_digit = num % 10  # 末尾の桁を取得
print(last_digit)  # 3
```

### 73から7を取得する
「//」で割ることで、余りを切り捨てられる。
```python
num = 73
first_digit = num // 10  # 先頭の桁を取得
print(first_digit)  # 7
```

### 735から3を取得する
3を末尾の桁に移動させたい。上2つの作業を応用することで、真ん中の桁を取得できる。
```python
num = 735
second_digit = (num // 10) % 10  # 十の位を取得
print(second_digit)  # 3
```

## ループ処理で全ての桁を分割して数値を取得し、足し合わせる

末尾から1つずつ桁を増やして数値を取得し、合算する処理を行う。先ほどの処理をループで繰り返すことで、全ての桁を取得することができる。

total = 0 で初期値を格納

```python
num = 735755
total = 0  # 合計値を保持
```

num = 735755はループ処理の度に末尾の桁を削除するので、ループ条件は`num > 0`

```python
while num > 0:
    total += num % 10  # 1の位の数字を加算
    num //= 10  # 右端の桁を削除
```

結果を出力する

```python
print(total)  # 7 + 3 + 5 + 7 + 5 + 5 = 32 となり、32 が出力
```
BoxのDドライブ(HDD)へのマウント

# 目的
SSDとHDDを持つPCにおいてはSSDにソフトウェアをHDDにファイルを保存するのが一般的であるが、BOXやGoogle Driveといったクラウドストレージはソフトウェアに紐づいているため、初期設定のままだとSSD内に保存され容量を圧迫する。
したがって追加の設定を行いHDD上にクラウドストレージのミラー先を用意することでSSDへの負荷を軽減する。
# 手順
1. Box Drive をインストールし開く. **この段階ではログインしないで!** https://www.box.com/ja-jp/home
2. レジストリエディタを開き, HKEY_LOCAL_MACHINE\SOFTWARE\BOX\BOXに変数を追加する
    右クリック→ new → Binary Value
    Name : **Custom Box Location**
    Data: your intended directory like D:/<User Name>/Cloud
    :warning: 事前にディレクトリを作成しておく必要があります.
3. 再度Boxドライブを開きアカウントにログインする. 
# Reference
https://support.box.com/hc/ja/articles/360043697454-Box-Drive%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E5%A0%B4%E6%89%80%E3%81%AE%E8%A8%AD%E5%AE%9A
Pythonの内包表記でコードをシンプルに


Pythonを使っていると、リストを操作するコードをよく書きますよね。そんなとき、「内包表記」というテクニックを使うと、コードが短く、読みやすくなります。
### 内包表記って何？
内包表記は、リストを作る処理を1行で書けるPythonの便利な機能です。たとえば、1から5までの数を2倍にしたリストを作りたい場合、普通のforループだとこんな感じになります：

```python
numbers = []
for i in range(1, 6):
    numbers.append(i * 2)
print(numbers)  # [2, 4, 6, 8, 10]
```

でも、内包表記を使えばこうなります：

```python
numbers = [i * 2 for i in range(1, 6)]
print(numbers)  # [2, 4, 6, 8, 10]
```
同じ結果なのに、1行で済むんです！シンプルでしょ？
### 基本の形
内包表記の基本は `[式 for 変数 in イテラブル if 条件]` です。

- 式：各要素にどんな操作をするか（ここでは i * 2）
- 変数：ループで使う変数（ここでは i）
- イテラブル：繰り返し可能なオブジェクト（ここでは range(1, 6)）
- 条件を加えてみよう
「特定の条件を満たす要素だけ取り出したい」というときも、内包表記は強い味方です。たとえば、1から5までの数で偶数だけ2倍にしたい場合：

```python
even_doubled = [i * 2 for i in range(1, 6) if i % 2 == 0]
print(even_doubled)  # [4, 8]
```

if を後ろにつけると、条件に合うものだけがリストに入ります。

### どんなときに使う？
内包表記は、リストを作るシンプルな処理にピッタリです。ただし、長すぎたり複雑すぎたりすると逆に読みづらくなるので要注意。こんなケースで活躍します：
- リストの要素を一括で変換したい（例：全部大文字にするとか、2倍にするとか）
- 簡単なフィルタリングをしたい（例：偶数だけ抜き出す）

### 注意点
読みやすさ優先：無理やり1行に詰め込むより、forループの方が分かりやすい場合もあります。
副作用は避ける：内包表記はリストを作るためのものなので、printとか別の処理を混ぜるのはNG。
まとめ
内包表記はPythonらしい「シンプルで効率的」なコードを書くための鍵。慣れると手放せなくなりますよ。たとえば、こんな風に文字列のリストを操作することも：

```python
words = ["apple", "banana", "cherry"]
upper_words = [word.upper() for word in words]
print(upper_words)  # ['APPLE', 'BANANA', 'CHERRY']
```
ぜひ普段のコードで試してみてください。
[Linux][command] システム再起動_reboot, shutdown, systemctl, init, telinit

# システム再起動一覧
| コマンド | 説明 |
|:--|:--|
| `reboot` | 即座に再起動|
||**使用例**:<br>- `reboot`：即座に再起動 |
| `shutdown` | 再起動のスケジュール・ユーザーへの警告メッセージの送信|
||**使用例**:<br>- `shutdown -r now`：即座に再起動<br>- `shutdown -r +5 "システムは5分後に再起動します"`：5分後に再起動し、メッセージを表示<br>- `shutdown -r 22:00`：当日の22:00に再起動をスケジュール| 
| `systemctl` | `systemd` システムでのサービスやシステムを管理 |
||**使用例**:<br>- `systemctl restart`：即座に再起動<br>- `systemctl reboot`：即座に再起動<br>- `systemctl start reboot.target`：即座に再起動|
| `init` | ランレベルを変更することでシステムの状態を変更 |
||**使用例**:<br>- `init 6`：再起動|
| `telinit` | ランレベルを変更することでシステムの状態を変更 |
||**使用例**:<br>- `telinit 6`：再起動|

# 強制的な再起動コマンド

## `reboot -f`  
`-f` オプションを付けることで、システムを即座に強制再起動します。通常のシャットダウン処理をバイパスするため、データ損失のリスクがあります。

~~~terminal
# reboot -f
~~~

## `systemctl reboot --force`  
`systemd` を使用して、強制的に再起動を実行します。

~~~terminal
# systemctl reboot --force
~~~

## `systemctl reboot --force --force`  
さらに `--force` を2回指定することで、`systemd` を完全にバイパスし、カーネルから直接再起動を実行します。システムが応答しなくなった場合の最終手段です。

~~~terminal
# systemctl reboot --force --force
~~~

## `echo 1 > /proc/sys/kernel/sysrq && echo b > /proc/sysrq-trigger`  
`SysRq` 機能を使用して、カーネルレベルで即座に再起動を実行します。プロセスの終了処理を行わず、強制的に再起動するため、ファイルシステムの破損リスクがあります。

~~~terminal
# echo 1 > /proc/sys/kernel/sysrq
# echo b > /proc/sysrq-trigger
~~~

# Ping-t
- [3012_reboot, shutdown -r](https://mondai.ping-t.com/question_subjects/31/question_sessions/30871191/progressing_questions/472932405)
- [3014_reboot, shutdown -r, telinit 6](https://mondai.ping-t.com/question_subjects/31/question_sessions/30871191/progressing_questions/472932404)
- [3314_shutdown -r now, telnit 6, systemctl reboot, systemctl start reboot.target](https://mondai.ping-t.com/question_subjects/31/question_sessions/31719854/progressing_questions/486088039)
- [3598_systemctl restart](https://mondai.ping-t.com/question_subjects/31/question_sessions/31719854/progressing_questions/486088053)
【個人開発】支出を量・頻度の観点で分類できる家計簿アプリを開発しました【React/Typescript】

## 初めに

支出や予算を、量・頻度に分類して管理できる家計簿アプリを開発しました。

プログラマ2年目での初の個人開発で、だいぶ苦労しながら形にしていきましたので、本記事では、開発したアプリの内容と、開発過程での工夫や失敗を記事として共有したいと思います。

## 開発理由

元々、支出自体は既存の家計簿アプリを使用して記録しています。

その上で、記録した情報を元に、無駄遣いや切り詰められる場所を探したり、予算を立てようとしましたが、実際に予算を立てる際には、固定費かそうでないかを把握した上で考える必要がありました。

しかし、既存のサービスでは特定の支出が固定費かどうかをタグ付けし、計測することはできませんでした。

そのため、あらかじめ固定費かそうでないかを分類して支出を管理できるサービスを探しましたが見つからず、今回自分で開発してみました。

## アプリ概要

支出と予算を、量・頻度の観点で分類して管理することができる家計簿アプリ。

### 使用技術

```markdown
## 環境

- vite
- firebase

## 言語

- typescript

## ライブラリ

- React
- Yamada UI
- jotai
- vitest
```

技術採用理由

- Yamada UI
    - UIにこだわる必要がなかった
    - ダークモードの実装が極めて簡単
    - 日本語の公式ドキュメントがある
- jotai
    - 項目を追加するためのダイアログのコンポーネントが、支出リストの下部になく、バケツリレーが困難なため、グローバルに値を補完したかった（バケツリレー自体もやりたくなかった）
    - 簡単に使える状態管理ライブラリの中で、一番メジャーだと判断したため

### 機能

以下のページに分けて機能を実装しています。

1. 支出一覧ページ
2. カテゴリ一覧ページ
3. 支出状況確認ページ

#### 支出一覧ページ

支出一覧の確認、追加、削除ができます。

![画面収録 2025-02-26 19.59.29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456603/742b1c37-33fb-43b1-b39e-83f54a8547a0.gif)

#### カテゴリ一覧ページ

量・頻度と、予算を指定して登録できます。

![画面収録 2025-03-02 19.56.13.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456603/e47bddd5-803f-4960-b101-ccd826ae0886.gif)

動作は支出一覧ページと同様です。

#### 支出状況確認ページ

予算と支出を、量・頻度のマトリクス図形式で確認できます。

最初の一つは分類ごとの総額で、それより下はカテゴリごとの表示になっています。

![支出状況確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456603/8a45ec73-1b17-4080-8f00-4049c6cf9fe5.png)

## 工夫したところ

### サイドバー表示時のアニメーション

マウスカーソルが左側の余白に到達した時点で、サイドバーがゆっくりと元の画面に重ならない形で表示されてくる処理を、emotionのkeyframesを使用して実装しました。

また、左端の余白はテンプレートページで指定し、仮にページレイアウトが追加されてもサイドバーが開かれるエリアとコンテンツのエリアが重ならないようにしています。

### 支出状況確認ページのインターフェース

支出を頻度・量の観点で分類することがコンセプトのため、それぞれの支出分類をマトリクス図の形式で表示するようにしました。

また、スペースに余裕のある最初の項目の情報量を多くし、繰り返されるUIは最低限の情報だけ表示するようにしました。

## 難しかったところ

### 支出とカテゴリの紐づけ

元々は、カテゴリではなく支出に頻度などの情報を紐づける予定だったが、開発における重要事項を整理しておらず、重要度の低いカテゴリへの紐付けを実装したせいで、重要度の高い支出への紐付けが実装不可能になってしまった。

また、だいぶ開発が進んでしまってからそれに気がついた。

### テストコードでの、UIライブラリ固有の処理への対応

UIフレームワークのセットアップ時に走らせている関数でエラーが起きました。
結果的には、ライブラリ特有の事象であり、詳細を詳しく知っても他に応用しにくそうだったので、AIに任せて解決してもらいました。

## 今後の開発計画

最低限の機能が実装できたので、この後はコンポーネント分割などの、上手くいった部分を引き継ぎながら、開発理由をより満たせるよう、1から作り直す予定です。

## まとめ

今回の個人開発で特に痛感したのは、何をやるかを明確にすることの大切さでした。

元々、開発理由の時点で、「支出」を量・頻度の観点で分類して管理するという目的がありました。
しかし、場当たり的に開発を進めてしまったせいで、最重要機能が実装できず、カテゴリに量・頻度の分類を紐づけるという湾曲した形で何とか実装せざるを得ない状況になってしまいました。

しかし、これほど致命的なミスを犯しても、多少の時間程度しか失われることのない個人開発は、とてつもなくやり得なことであると学びました。

また、自分は元々、プログラミング自体はやっており、個人開発をしたいとずっと考えていましたが、3ヶ月前までの時点では環境構築のやり方がわからず、結局何もできないままでいました。

今現在はこうして開発をしていますが、なぜこれまでできなかったのかを考えてみると、全て理解してからやらないといけないと、勝手に考えていたことが原因だと気づきました。

こうして開発をしていても、開発中に使用しているコマンドや環境設定の大半は内容を知りませんが、それで何か問題が出るわけでもありませんでした。

その上、開発していく上で本当に知識が必要になった時も、AIに問い合わせて該当情報の資料を教えてもらうだけで簡単に学んでいくことができました。

なので、この記事を読んでいて、できないからやらないでいる人も、まずやってみてください。

## JISOUのメンバー募集中

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

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

https://projisou.jp
個人的備忘録：Alpine LinuxでMySQLクライアントのインストールからデータベース接続までを紹介してみた

## はじめに
MySQL サーバーに接続する際には、環境変数の確認やクライアントツールのインストールが必要になります。

本記事では、MySQL 環境変数の確認方法、クライアントのインストール手順、実際の接続コマンドについて解説します。

## 書こうと思ったきっかけ
Alpine Linux 環境や Docker コンテナ内で MySQL に接続しようとした際、環境変数の設定やクライアントのインストール方法が分からず困ることがありました。

本記事では、その手順を明確にし、スムーズに MySQL に接続できるようにまとめました。

## MySQL 環境変数の確認と接続方法

### 1. MySQL 環境変数の確認
```sh
env | grep MYSQL
```
このコマンドは、現在の環境変数の中から「MYSQL」を含むものをフィルタリングして表示します。

#### **目的**
- `MYSQL_HOST`, `MYSQL_PORT`, `MYSQL_USER`, `MYSQL_PW`, `MYSQL_DB` などの値が正しく設定されているかを確認する。
- コンテナ環境やスクリプト実行時に適切な設定が適用されているかをチェックする。

#### **使用例**
```sh
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PW=secret
MYSQL_DB=test_db
```

### 2. MySQL クライアントのインストール
```sh
apk add --no-cache mysql mysql-client
```
このコマンドは、Alpine Linux 環境で `mysql` および `mysql-client` パッケージをインストールします。

#### **ポイント**
- `apk add` は Alpine Linux のパッケージ管理コマンド。
- `--no-cache` オプションを指定することで、キャッシュを使用せず直接インストールする。
- `mysql-client` をインストールすることで、MySQL への接続が可能になる。

#### **補足**
- `mysql` パッケージをインストールすることで、MySQL サーバー自体も利用可能になるが、通常クライアントツール (`mysql-client`) のみで十分。
- `mariadb-client` を使う場合も同様にインストール可能。

### 3. MySQL への接続
```sh
mariadb -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW --ssl=OFF $MYSQL_DB
```
このコマンドは、`mariadb` コマンド（MySQL クライアントと互換）を使用して MySQL サーバーに接続するためのものです。

#### **各オプションの意味**
| オプション | 説明 |
|------------|-------------------------------------------------|
| `-h` | 接続先のホスト名 (`$MYSQL_HOST`) |
| `-P` | ポート番号 (`$MYSQL_PORT`) |
| `-u` | ユーザー名 (`$MYSQL_USER`) |
| `-p` | パスワード (`$MYSQL_PW` を直接指定) |
| `--ssl=OFF` | SSL 接続を無効化 |
| `$MYSQL_DB` | 接続するデータベース名 |

#### **使用例**
```sh
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PW=secret
MYSQL_DB=test_db

mariadb -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW --ssl=OFF $MYSQL_DB
```

#### **注意点**
- 環境変数が設定されていない場合は、適切な値を手動で指定する。
- `-p$MYSQL_PW` のように `-p` オプションとパスワードの間にスペースを入れないこと。
- `--ssl=OFF` を指定しないと、SSL が必要な設定の MySQL に接続できない場合がある。
- `mariadb` コマンドは `mysql` コマンドと同じように使用可能。

### **まとめ**
1. `env | grep MYSQL` で環境変数を確認。
2. `apk add --no-cache mysql mysql-client` で MySQL クライアントをインストール。
3. `mariadb -h ...` コマンドで MySQL に接続。

この手順を実行することで、Alpine Linux 環境で MySQL に簡単に接続できるようになります。
Vision API Product Searchを使って画像から画像を検索

画像入力として画像を検索できないかと思い色々調べたところVision API Product Searchというサービスに辿り着きました。
Vision API Product Searchとは小売業者向けのサービスで画像を商品を登録し、その商品を商品セットとして追加できます。この商品セットに対して独自での画像でクエリを行うことで視覚的および意味的に類似した結果をランク付きで返してくれるサービスとなります。

実際に手を動かしながらクイックスタートを実施した上で気になった点をまとめました。
画像を使って画像を検索したいと思う方はぜひご一読ください。

https://cloud.google.com/vision/product-search/docs?hl=ja

実際に手を動かして検証したい方は以下のクイックスタートからどうぞ

https://cloud.google.com/vision/product-search/docs/create-product-set-search-products?hl=ja#local-shell

# 気になったこと
### 商品セット、商品、画像について
Vision API Product Searchが参照する先はCSVファイルとなります。
CSVファイルには``product-set-id``の列があり、商品セットとしてIDを設定することができます。このIDをもとに画像を検索することができます。
そして画像は``image_uri``の列にCloud StorageのURIとして記述してあります。

### 商品セット、商品、画像の作成と管理方法
#### 商品セットの作成方法

https://cloud.google.com/vision/product-search/docs/create-product-set?hl=ja

空の商品セットを作成した後、その商品セットに商品を追加していく流れとなります。
なお、一括インポート機能を使用することで、すでに商品を含む商品セットを作成することもできます。

#### 商品の作成と管理

https://cloud.google.com/vision/product-search/docs/create-product?hl=ja

[CSVファイルのフォーマット](https://cloud.google.com/vision/product-search/docs/csv-format?hl=ja)をもとに商品リソースの作成ができます。
商品のオプションの説明やラベルを指定することもできます。


#### 参照画像の作成とインデックスの処理

https://cloud.google.com/vision/product-search/docs/create-reference-images?hl=ja

推奨事項も確認の上、参照画像をしましょう。
- ファイルの大きさが最大サイズ（20 MB）を超えないように
- 商品を論理的に強調して、関連するビジュアル情報が含まれるような視点を考慮
- 欠けている視点を補うような参照画像を作成します。たとえば、右足の靴の画像しかない場合は、その画像ファイルの鏡像バージョンを左足の靴として提供
- 解像度の最も高い画像をアップロード
- 商品の背景を白
- 背景が透明の PNG は単色の背景に変換

また画像は**Cloud Storageバケット**に保存する必要があるので注意が必要です。
一括インポートを使用することで複数の参照画像を作成することができます。

商品のインデックスは約30分ごとに更新されます。
商品セットの``indexTime``フィールドを確認することでインデックス登録が正常に完了したことを確認することができます。

#### 画像の登録を自動化するために
手動での画像の追加となるが画像がCloud Storageバケットにアップロードをトリガーに商品を作成し、作成された商品に参照画像を作成することもできそうですね。
ただし商品にラベルなどを設定したい場合には手元での更新が必要ですね。


### その他の機能
#### 商品の検索
ローカルの画像や他のCloud Storageの画像を使用して指定した商品セット内の画像を検索することも可能です。
画像を追加する前に手元で検証したい場合には便利ですね。

https://cloud.google.com/vision/product-search/docs/searching?hl=ja

#### 1枚の画像に複数の商品がある場合
Vision API Product Searchによって識別された商品が境界ボックスとして示されます。
境界ボックスで示されたそれぞれの商品ごとに``score``が表示されます。

https://cloud.google.com/vision/product-search/docs/searching-response?hl=ja#multiple-product_images_multi-detection_response

### 他のソリューション（BigQueryのマルチモーダルエンべディング）
BigQueryのマルチモーダル エンべディングを利用することでVision API Product Searchと同様に画像から類似画像の検索が可能です。
こちらのサービスはCloud Storageに画像を保存してBigQuery上でインデックスを作成することですぐに検索が可能なソリューションです。

https://cloud.google.com/blog/ja/products/data-analytics/bigquery-multimodal-embeddings-generation
【Unity初心者】チュートリアルとしてブロック崩しを作成する 1 準備編

# 環境
Windows 10
UnityHub 3.11.1
Unity 6(6000.0.36f1)
VSCode 1.97.2

# Unityのインストール
ここからダウンロード
https://unity.com/ja/download

# VSCodeのインストール
https://code.visualstudio.com/

# Unityでプロジェクトの作成
今回はブロック崩しを作成するので`universal 2D`を選択
プロジェクト名は`block`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466317/1b68fe6c-5649-49f8-8c6f-9f8b3fb57727.png)

# Unity側の設定でVSCodeをエディタとして使用できるように変更
edit-> preferences... -> External tools
External Script Editor -> Browse... をクリックしてVSCodeを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466317/ce1fbb9d-0fe0-4fe5-8937-dec78d7680e2.png)

これでC#のファイルを開くとVSCodeが起動するはず

# VSCodeの設定

## プラグインのインストール
- Japanese Language Pack for Visua (日本語化するやつなので英語のままがいい人はskip)
- Unity
- .NET Install Tool
- C#
- C# Dev Kit

## Omnisharp: Use Modern Netの設定変更
チェックを外しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/466317/4227db7a-02cb-4d36-ad43-a453689732df.png)


こんなところで最低限の準備完了
他にやっておいたほうがいいことあったら教えてください
elm327の研究 その15

# 概要
elm327の研究やってみた。
ATコマンド調べてみた。

# ATコマンド
| コマンド | 動作 |
|:-|:-|
|ATZ|リセット
|ATRV|OBD2電圧表示
|ATCV| 電圧キャリブレーション
|ATDP|現在の通信プロコトル表示
|ATSP0|プロコトル自動設定
|ATPC| Protocol close
|ATD|全てデフォルト設定
|ATI|バージョン情報
|ATE1| echo on
|ATE0| echo off
|ATL0|改行ON
|ATL1|改行OFF
|ATH1 |Set "display headers" parameter
|ATH0 |off "display headers"
|ATWS| warm start
|ATST| set timeout
|AT@1|デバイス説明表示
|AT@2|デバイス識別子表示
|ATTP0 | try protocol 0～C
|ATSP1|プロトコル	SAE J1850 PWM (41.6 kbaud)を開始
|ATSP2|プロトコル	SAE J1850 VPW (10.4 kbaud)を開始
|ATSP3|プロトコル	ISO 9141-2 (5 baud init, 10.4 kbaud)を開始
|ATSP4|プロトコル	ISO 14230-4 KWP (5 baud init, 10.4 kbaud)を開始
|ATSP5|プロトコル	ISO 14230-4 KWP (fast init, 10.4 kbaud)を開始
|ATSP6|プロトコル	ISO 15765-4 CAN (11 bit ID, 500 kbaud)を開始
|ATSP7|プロトコル	ISO 15765-4 CAN (29 bit ID, 500 kbaud)を開始
|ATSP8|プロトコル	ISO 15765-4 CAN (11 bit ID, 250 kbaud)を開始
|ATSP9|プロトコル	ISO 15765-4 CAN (29 bit ID, 250 kbaud)を開始
|ATSPA|プロトコル	SAE J1939 CAN (29 bit ID, 250* kbaud)を開始
|ATSPB|プロトコル	USER1 CAN (11* bit ID, 125* kbaud)を開始
|ATSPC|プロトコル	USER2 CAN (11* bit ID, 50* kbaud)を開始

# Mode Number	Mode Description

| モード | 説明 |
|:-|:-|
|01	|Current Data
|02	|Freeze Frame Data
|03	|Diagnostic Trouble Codes
|04	|Clear Trouble Code
|05	|Test Results/Oxygen Sensors
|06	|Test Results/Non-Continuous Testing
|07	|Show Pending Trouble Codes
|08	|Special Control Mode
|09	|Request Vehicle Information
|0A	|Request Permanent Trouble Codes



以上。
pythonによるモンテカルロ法で円周率を近似する

:::note warn
本記事の内容は筆者の理解に基づいており、誤りが含まれる可能性があります。
内容に関してご指摘があれば、ぜひコメントでお知らせください。
:::
# モンテカルロ法とは
> シミュレーションや数値計算を乱数を用いて行う手法の総称。
> [Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%AB%E3%83%AB%E3%83%AD%E6%B3%95)より引用

# 手順
１．0.0 ~ 1.0 の乱数x,yを２つ生成する。
２．座標(x,y)が半径１の円の内側か外側かを判定する。
３．πを求める。
# プログラム
<details><summary>こちら</summary>

```py
import numpy as np
import matplotlib.pyplot as plt
import math

N = 100000
x = np.random.uniform(0.0,1.0,N)
y = np.random.uniform(0.0,1.0,N)

ins = []
out = []
count = 0
for i in range(N):
    if math.hypot(x[i],y[i])<1:
        ins.append((x[i],y[i]))
        count += 1
    else:
        out.append((x[i],y[i]))
ins_x,ins_y = zip(*ins)
out_x,out_y = zip(*out)
plt.figure(figsize=(8,7))
plt.plot(ins_x,ins_y,'o',label='Inside')
plt.plot(out_x,out_y,'o',label='Outside')
plt.legend()
plt.show()
print('円周率の近似値',4.0 * count / N)
```
</details>

# 解説
細かくやっていきます
## とりあえず、必要な物をimport
```py
import numpy as np
import matplotlib.pyplot as plt
import math
```
## 乱数の生成
乱数は一様乱数です。
乱数を100000個生成させる。（多いほど精度は上がる）
> 一様乱数　すべての数が同じ確率で出現する乱数
```py
N = 100000
x = np.random.uniform(0.0,1.0,N)
y = np.random.uniform(0.0,1.0,N)
```
## 半径1の円の内側か外側か判定
math.hypot(x,y)は　
```math
\sqrt{x^2+y^2}
```
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　を求める。
math.hypot(x,y)<1なら内側　→　insリストに追加(inside)
そうでなければ外側 →　outリストに追加(outside)
count で円の内側にある点の数をカウント
```py
ins = []
out = []
count = 0
for i in range(N):
    if math.hypot(x[i],y[i])<1:
        ins.append((x[i],y[i]))
        count += 1
    else:
        out.append((x[i],y[i]))
```
## 座標に分割
(x,y)はタプルなので、グラフにするために分割する
```py
ins_x,ins_y = zip(*ins)
out_x,out_y = zip(*out)
```
## グラフに描写
plt.figure：グラフサイズを設定
plt.plot(x座標,y座標) 、'o'は点で表示、labelはラベル（:disappointed_relieved:）
plt.legend()：ラベルを表示させる
plt.show()：グラフ表示
```py
plt.figure(figsize=(8,7))
plt.plot(ins_x,ins_y,'o',label='Inside')
plt.plot(out_x,out_y,'o',label='Outside')
plt.legend()
plt.show()
```
<details><summary>グラフ</summary>

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3974105/d7732f26-f357-4a26-9cf7-e7c410b32746.png">

</details>

## 円周率の近似
グラフ(1.0 * 1.0)の正方形の面積　→　1
グラフの青（円の内側）の点の面積　→　π/4 (1.0 × 1.0 × π × 1/4 なので)
面積比
グラフの面積：扇形の面積 = 全体の点の個数：青の点の個数
```math
　　　1　　　:　　\frac{π}{4}　　=　　　N　　　　:　　count
```

```math
π = \frac{count}{N}　× 4
```
```py
#小数点がつくので、わかりやすく4.0
print('円周率の近似値',4.0 * count / N)
```
そうすると、出力は約3.13ぐらいになると思います。
ぜひ、Nの値を変えてみましょう

## 最後に
これから、私のOutputとしていろいろ記事を投稿する予定です。

Thank you for reading!
Snowflakeのトランザクション操作

Snowflakeでトランザクション管理ってできるんだっけ？という疑問から調査しました。

https://docs.snowflake.com/ja/sql-reference/commands-transaction

# トランザクションの開始
```
BEGIN;
```
```
BEGIN TRANSACTION;
```
```
BEGIN WORK;
```
```
START TRANSACTION;
```
この4つはすべて同じ意味。


# トランザクションの終了
## コミット
```
COMMIT;
```
```
COMMIT WORK;
```
この2つは同じ意味。

## ロールバック
```
ROLLBACK;
```
```
ROLLBACK WORK;
```
この2つは同じ意味。


# 実験
実験してみます。
```
BEGIN;
SHOW TRANSACTIONS;
SELECT CURRENT_TRANSACTION();
COMMIT WORK;
SHOW TRANSACTIONS;
SELECT CURRENT_TRANSACTION();
SELECT LAST_TRANSACTION();
```

上記を実行してみます。
- BEGIN;
![スクリーンショット 2025-02-24 102409.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/c91b1120-2574-43f9-8594-e7de78ba582e.png)
トランザクションを開始しました。

- SHOW TRANSACTIONS;
![スクリーンショット 2025-02-24 102426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/05d09d63-366b-4d3a-88a5-95073b81044d.png)
トランザクションの情報を見てみます。

- SELECT CURRENT_TRANSACTION();
![スクリーンショット 2025-02-24 102440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/9225d19d-c906-42f4-85dc-4056f011b4ae.png)
今のトランザクションIDだけを取得してみます。

- COMMIT WORK;
![スクリーンショット 2025-02-24 102453.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/fa1191a7-49e2-4580-94d5-3b191ae153a4.png)
COMMITします。（何もしてないのでROLLBACKでもいいのですがCOMMITを採用。一応オプションのWORKもつけてみた。）

- SHOW TRANSACTIONS;
![スクリーンショット 2025-02-24 102508.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/4648d24d-d910-499c-abc8-d2569e0bbd01.png)
トランザクションを終了しているのでトランザクションの情報はありませんでした。

- SELECT CURRENT_TRANSACTION();
![スクリーンショット 2025-02-24 102520.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/11d8f3a9-7593-46e8-b3e4-a5cbbbc5bf83.png)
同様にCURRENT_TRANSACTION()の値は取れずnullでした。

- SELECT LAST_TRANSACTION();
![スクリーンショット 2025-02-24 102532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/91270f1b-f542-4072-b760-988d4ef59be8.png)


直近のトランザクションIDは取得できました。

追加
```
DESC TRANSACTION 1740360208952000000;
```
![スクリーンショット 2025-02-24 102747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/20712914-3a91-4090-8e4b-93fdb34fa7cf.png)

LAST_TRANSACTION()で取得したトランザクションIDを使ってDESCコマンドも追加実行しました。
BEGIN直後のSHOW TRANSACTIONS;と同じ結果が取得できました。

# まとめ
Snowflakeでトランザクションって意識してなかったけどあるんですね。
ストアドなどで順次処理を組んでる場合には使えることがわかりました。
Amazon FSx のユースケースとAWSサービスとの連携例


## はじめに
Amazon FSx は、AWS 上でフルマネージドのファイルシステムを提供するサービスです。高性能かつスケーラブルなファイルストレージを簡単に構築・運用できるため、さまざまなユースケースに対応できます。本記事では、Amazon FSx の種類と、それぞれのユースケース、さらに他の AWS サービスとの連携例を紹介します。

## Amazon FSx の種類
Amazon FSx には、以下の 4 つの種類があります。

### 1. FSx for Windows File Server
![fsx_windows_usecases.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/221b1a7e-1b66-415d-966b-c6d71e6651c3.png)

Microsoft Windows 環境向けのフルマネージドな Windows ファイルシステム。
#### ユースケース
- **Windows アプリケーションのファイル共有**: Active Directory (AD) 連携により、Windows 環境でのファイル共有が簡単。
- **エンタープライズアプリケーション**: Microsoft SQL Server や ERP システムなどのバックエンドストレージ。
- **ホームディレクトリの管理**: Windows ユーザーごとのプロファイルやデータを管理可能。
#### AWS サービスとの連携
- **AWS Directory Service**: AD 連携を簡単に実現。
- **Amazon EC2 (Windows Server)**: Windows 環境のアプリケーションと連携。

### 2. FSx for Lustre
![fsx_lustre_usecase.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/64ddeabe-8755-458d-b496-5496219ccdd3.png)

HPC (高性能コンピューティング) 向けの並列分散ファイルシステム。
#### ユースケース
- **ビッグデータ分析**: 機械学習・AI のトレーニングデータを高速に処理。
- **HPC ワークロード**: 科学技術計算や金融リスク分析など、高スループットが求められる環境。
- **メディア処理**: 3D レンダリングや映像編集などの大規模データ処理。
#### AWS サービスとの連携
- **Amazon S3**: S3 上のデータを FSx for Lustre にマウント可能。
- **AWS Batch / AWS ParallelCluster**: 並列コンピューティング環境での利用。

### 3. FSx for NetApp ONTAP
![fsx_netapp_ontap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/65928c5d-26bd-472e-9dfc-a307cd2e41d7.png)

エンタープライズ向けの NetApp ONTAP ストレージを AWS 上で提供。
#### ユースケース
- **ハイブリッドクラウド環境**: オンプレミスの NetApp 環境とシームレスに連携。
- **データ移行・バックアップ**: NetApp SnapMirror による効率的なレプリケーション。
- **マルチプロトコル対応**: NFS、SMB、iSCSI などのプロトコルをサポート。
#### AWS サービスとの連携
- **AWS Transit Gateway**: VPC 間の接続をシンプルに構築。
- **AWS Backup**: データ保護のための統合バックアップ管理。

### 4. FSx for OpenZFS
![aws_fsx_openzfs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/912a7802-b25f-479e-911a-27060278d567.png)


高パフォーマンスな ZFS ストレージを AWS で提供。
#### ユースケース
- **Linux ベースのワークロード**: NFS 経由でのデータ共有。
- **DevOps / CI/CD**: スナップショットを活用した効率的な環境管理。
- **コンテナ環境のストレージ**: Kubernetes などのコンテナワークロードに対応。
#### AWS サービスとの連携
- **Amazon EKS / ECS**: コンテナ環境のストレージとして利用可能。
- **AWS Lambda**: データ処理のトリガーとして活用。

## まとめ
Amazon FSx は、多様なユースケースに対応するフルマネージドなファイルシステムを提供します。Windows アプリケーションのファイル共有、高速並列処理、エンタープライズストレージ、Linux ベースの高パフォーマンスストレージなど、それぞれの用途に適した FSx の種類を選択することで、効率的なストレージ運用が可能になります。

AWS の他のサービスと組み合わせることで、クラウド環境におけるデータ管理をさらに最適化できるため、ユースケースに応じた最適な設計を検討してみてください。
Amazon FSx for Lustre のユースケースと AWS サービスとの連携


## はじめに
Amazon FSx for Lustre は、高パフォーマンスな分散ファイルシステム Lustre を AWS 環境で提供するフルマネージドサービスです。Lustre は、HPC（ハイパフォーマンスコンピューティング）や機械学習、ビッグデータ分析などの用途で広く利用されており、FSx for Lustre を使うことで AWS 上で簡単に高速なストレージ環境を構築できます。

本記事では、FSx for Lustre の主なユースケースと、AWS の他のサービスとの連携例を紹介します。

## FSx for Lustre の主なユースケース

### 1. ハイパフォーマンスコンピューティング（HPC）
FSx for Lustre は、高スループットと低レイテンシの特性を持つため、大規模な計算クラスターでの並列処理に最適です。HPC 環境では、Amazon EC2 の計算インスタンス（特に GPU や HPC 向けのインスタンス）と組み合わせることで、数百ノード規模の並列処理を高速化できます。

### 2. 機械学習・AI モデルのトレーニング
機械学習や AI モデルのトレーニングでは、大量のデータを効率的に処理する必要があります。FSx for Lustre は Amazon SageMaker や EC2 に接続して、大規模データセットの高速な読み書きを可能にします。例えば、画像認識モデルのトレーニングで数百万の画像を扱う場合、S3 から直接データを読み込むよりも FSx for Lustre を経由することでトレーニング時間を大幅に短縮できます。

### 3. ビッグデータ分析
Apache Spark や Presto などのデータ分析エンジンと組み合わせることで、FSx for Lustre はデータ処理のスループットを向上させます。特に、AWS Glue や Amazon EMR（Elastic MapReduce）と組み合わせることで、S3 のデータを高速に処理し、データウェアハウスや BI（ビジネスインテリジェンス）分析のパフォーマンスを向上させることができます。

### 4. メディア & エンターテイメント
映像編集や VFX（視覚効果）、レンダリングワークロードでは、大容量のファイルを高速に扱う必要があります。FSx for Lustre は、AWS ThinkBox の Deadline や、Adobe Premiere Pro などのメディア制作ワークフローと統合でき、大規模な動画ファイルのストレージとして利用可能です。

## 他の AWS サービスとの連携例

### 1. Amazon S3 との統合
![amazon_s3_fsx_lustre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/186b67cc-6221-4a38-888f-d0804d2940db.png)

FSx for Lustre は Amazon S3 とシームレスに統合できます。S3 に保存されたデータを Lustre ファイルシステム上にキャッシュすることで、S3 から直接データをロードするよりも高速なアクセスが可能になります。これは機械学習やビッグデータ分析のワークロードに特に有効です。

**ユースケース:**
- S3 に保存されたデータセットを FSx for Lustre にリンクし、データ処理を最適化
- S3 から頻繁にアクセスするデータを FSx for Lustre にキャッシュし、高速なデータアクセスを実現

### 2. Amazon EC2 & AWS Batch との連携
![ec2_batch_fsx_lustre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/a92c254a-4b2c-4d53-a990-9f42e6fa0932.png)

FSx for Lustre は、Amazon EC2 や AWS Batch のワークロードと連携し、大規模な並列処理を実現できます。

**ユースケース:**
- EC2 の計算クラスターが FSx for Lustre に接続し、大規模シミュレーションを実行
- AWS Batch によるジョブスケジューリングで、FSx for Lustre を共有ストレージとして利用しながら並列処理を実行

### 3. Amazon SageMaker との統合
![sagemaker_fsx_lustre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/c33ca5bf-b271-4249-9356-52185498f571.png)

SageMaker の ML トレーニングジョブは、FSx for Lustre に保存されたデータセットを利用可能です。これにより、S3 から直接データを取得するよりも高速に学習データへアクセスできます。

**ユースケース:**
- SageMaker のトレーニングインスタンスが FSx for Lustre をマウントし、数百GB 〜 TB のデータセットを高速に処理

### 4. AWS Lambda との連携
![aws_lambda_fsx_lustre.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294049/725a1297-c9f5-472e-ad01-4567b78afddd.png)

FSx for Lustre は、AWS Lambda のデータ処理ワークフローにも利用できます。Lambda では通常、EFS（Elastic File System）が推奨されますが、HPC や大規模データセットを扱う場合には FSx for Lustre の方がパフォーマンス的に有利です。

**ユースケース:**
- Lambda 関数が FSx for Lustre にアクセスし、高速なデータ処理を実行
- S3 から新しいデータが届くたびに Lambda をトリガーし、FSx for Lustre にデータをキャッシュ

## まとめ
Amazon FSx for Lustre は、HPC、機械学習、ビッグデータ分析、メディア処理などの高負荷ワークロードに最適なストレージサービスです。特に、Amazon S3 との統合や EC2、SageMaker との連携により、AWS 環境でのデータ処理を大幅に高速化できます。

AWS を活用した大規模データ処理のストレージとして、FSx for Lustre をぜひ検討してみてください！
【ネットワーク】NWアドレス、CSMA/CD、PDUとは？

# はじめに
ネットワークについて勉強する中で、理解が曖昧な知識を備忘録として整理します。

## NWアドレスとは？
- ホスト部が全て0
- ネットワーク自体を示すアドレス
- ネットワークを識別するために使われるアドレス
- データの送信には使われない

## フラッディング
- スイッチが受信したデータの宛先がMACアドレステーブルに無いとき、全てのポートから転送する

## duplex通信
- 双方向での通信

### 半二重通信
- 送信と受信で同じ回線を用いる
- 同時に双方向から送られると衝突（コリジョン）

### CSMA/CD
- コリジョンを防ぐ
- まず伝送路の空きを確認（CS）
- コリジョンを検知したら時間を空けて送信

### 全二重通信
- 行きと帰りで異なる回線を用いる

## PDU
- プロトコルデータユニット
- あるプロトコルが扱うひとまとまりのデータ送受信単位

### セグメント
- L4ヘッダが付いた状態
- 送信元はポート番号で識別

### パケット
- L3ヘッダが付いた状態
- 送信元はIPアドレスで識別

### フレーム
- L2ヘッダが付いた状態
- 送信元はMACアドレスで識別

# 最後に
まだまだ理解できていない知識が多いのでこれからも勉強を続けていきます。
astronvimのrelativenumberをturn offしたいでしょふつう！

結論から言おう！

```diff_lua:.config/nvim/lua/plugins/astrocore.lua
 --- 下記先頭行をコメントアウト
- if true then return {} end --
+ --if true then return {} end --

 ...

 ---@type LazySpec
 return {
    "AstroNvim/astrocore",
    ---@type AstroCoreOpts

    opts = {
        ...
        options = {
            opt = {
                -- 以下のrelativenumberをfalseに。
-               relativenumber = false,
+               relativenumber = true,
                ...
            },
            ...
        },
        ...
    },
    ...
 }
```

vimgrepなんかでrelativenumberの設定がastrocore.luaということは発見できても
先頭でこのスクリプトを有効無効を判断しているかなんて見てない場合にハマる。
PHPで「変数の型」の動作を確認してみた。

# 概要

PHPで「変数の型」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/php/var/index3.html

# 実装

以下のファイルを作成しました。

```sample.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
<?php
$var = '高橋';
print '[値]'.$var.',';
print '[型]'.gettype($var).'<br />';

$var = 180;
print '[値]'.$var.',';
print '[型]'.gettype($var)
?>
</p>

</body>
</html>
```

以下のコマンドを実行しました。

```
$ php sample.php 
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>PHPテスト</title>
</head>
<body>

<p>PHPのテストです。</p>

<p>
[値]高橋,[型]string<br />[値]180,[型]integer</p>

</body>
</html>
```

# まとめ

何かの役に立てばと。
paizaラーニングレベルアップ問題集の【整数の行入力】をやってみた。

paizaラーニングレベルアップ問題集の【整数の行入力】をやってみました。
- - -
##### 問題
###### 1行の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_row_step1
###### 2行の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_row_step2
###### 5行の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_row_step3
###### 100行の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_row_step4
###### 1000行の整数の入力
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__integer_row_boss
- - -
5問とも同じコードで正解してみます。
- - -
##### C
```c
#include <stdio.h>

int main() {
	int a;
	while (scanf("%d", &a) == 1)
		printf("%d\n", a);
	return 0;
}
```
- - -
##### C++
```cpp
#include <iostream>
using namespace std;

int main() {
	int a;
	while (cin >> a) {
		cout << a << endl;
	}
	return 0;
}
```
- - -
##### C#
```cs
using System;

class Program
{
	public static void Main()
	{
		while(int.TryParse(Console.ReadLine(), out int a))
			Console.WriteLine(a);
	}
}
```
- - -
##### Go
```go
package main

import "fmt"

func main() {
	var a int
	for _, err := fmt.Scan(&a); err == nil; _, err = fmt.Scan(&a) {
		fmt.Println(a)
	}
}
```
- - -
##### Java
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext())
			System.out.println(sc.nextInt());
		sc.close();
	}
}
```
- - -
##### JavaScript
```js
require("fs").readFileSync("/dev/stdin", "utf8").trim().split('\n').map(Number).forEach(s => console.log(s));
```
- - -
##### Kotlin
```kotlin
import java.util.*

fun main() {
	val sc = Scanner(System.`in`)
	while (sc.hasNext()) {
		println(sc.nextInt())
	}
	sc.close()
}
```
- - -
##### PHP
```php
<?php
	while (($s = fgets(STDIN)) != "") {
		echo intval($s), PHP_EOL;
	}
?>
```
- - -
##### Perl
```pl
foreach (<STDIN>) {
	print int($_), $/;
}
```
- - -
##### Python3
```py
while True:
	try:
		print(int(input()))
	except EOFError:
		break
```
- - -
##### Ruby
```rb
while s = gets
	p s.to_i
end
```
- - -
##### Scala
```scala
import java.util._

object Main extends App{
	val sc = new Scanner(System.in)
	while (sc.hasNext()) {
		val a = sc.nextInt()
		println(a)
	}
	sc.close()
}
```
- - -
##### Swift
```swift
while let s = readLine(), let a = Int(s) {
	print(a)
}
```