OmniAICreator/Qiita-1.07M huggingface dataset:
実務未経験状態でLaravelを使用した共同開発

## １．背景
・本開発は3人（小規模）の共同開発で、XをモデルにしたSNSサービスのクローンを作成。
・共同開発における実装の流れ、必要なこと、個人の課題等について記載。

## ２．自己紹介
・実務経験：なし
・プログラミング学習歴：約1年
・習得言語：HTML、CSS、JavaScript、TypeScript、React、Node.js、PHP、Laravel　等
・個人開発経験：ToDoアプリ、家計簿アプリ、天気予報アプリ　等

## ３．概要及び仕様技術
#### フロントエンド
・Laravel Blade(テンプレートエンジン)
・HTML
・BootStrap(CSSフレームワーク)
#### バックエンド
・PHP(Laravelフレームワーク使用)
#### インフラ・環境構築
・Docker(開発環境)
・MySql(データベース)
・Adminer(データベース管理)
#### その他ツール
・GitHub(ソースコード管理、PRレビューによる運用)
・slack(タスク進捗共有、コミュニケーション)

## ４．テーマ
#### チームテーマ
・小規模チーム(３人)によるタスク分担と進捗共有を意識した開発。
・GitHubを用いたPRベースのコードレビュー運用
・毎週ミーテイングを実施、進捗共有及び課題発見、解決を図る。
#### 個人テーマ
・【自走できるエンジニア】を目指して、タスク管理と自主的な開発サイクルを意識
・タスクごとに以下の流れを実施
①作業見積もり（作業量と時間）
②仕様確認（要件と期待動作の整理）
③実装設計（処理内容やファイル構成の設計）
④開発(コーディング)
⑤テスト（チェックリストを基に確認）
⑥PR作成（簡潔明瞭な内容で提出）
・また、日々の作業内容と学びを「日報」として記録し、振り返りと課題整理に活用した。

## ５．実装
#### 実装タスク
①usersテーブルの作成
②ユーザー詳細ページの作成
③新規投稿機能
④ユーザ退会機能
⑤フォロー機能
⑥タイムライン機能
⑦画像投稿機能の追加
⑧投稿編集機能（画像含む）
⑨全体UIの調整
⑩管理者機能

## ６．GitFlow
・開発共有用にdevelopブランチを使用。
・各機能ごとに feature/名前/機能名 ブランチを作成。
・マージはレビュワー（エンジニア）が担当し、開発者自身は行わない運用ルールを適用。

## ７．感想及び課題
#### 開発を通して得たこと
・現役エンジニアのレビューを通じて、実務視点での設計・実装・レビューの観点を学ぶことができた。
・Dockerを用いた環境構築、Git/GitHubを用いたPRレビューとブランチ運用など、現場で求められる基礎スキルを実践できた。
・Laravelを用いた開発により、MVC構造への理解が深まり、実務に近い開発体験を得られた。
・タスク処理のテンプレートを自作し、見積もりからPR作成まで一貫して自己管理できるようになった。
・設計段階で「チーム全体にとってわかりやすいコードとは何か」を意識するようになった。
#### 反省と課題
・ミーティングにおける議題整理や資料準備が不足していたため、認識のズレや仕様のすれ違いが発生した。
　→今後は、事前に仕様整理の資料を作成し、ミーティングで先回りして共有する体制を整えたい。
・共通処理やテストケースの整備が曖昧で、認識合わせに課題が残った。
　→ルール化・ドキュメント化による明文化が必要。
・細かなミス（インデント、不要コードの削除漏れなど）を減らすため、フォーマッタ導入やPR前のチェックリスト運用を行いたい。

## 8.今後の展望
#### 目標
今後は以下の軸を持って、活動する。
・企業にとって「採用するメリット」を明確に伝えられる人材へ
　→ ポートフォリオや日々の開発記録を継続的に充実させ、実績として見せられる状態を作る。
・現場での業務改善やチームの課題解決にも貢献できる存在に
　→ 技術力に加え、業務全体を俯瞰して「課題を見つけ、提案・改善できる」力を身につけるための実践を積む。
・「自走できるエンジニア」とは何かを問い続け、行動と内省を日々ルーチン化
　→ 実装・振り返り・発信のサイクルを継続し、継続力・自律性のある開発姿勢を習慣化する。
・API開発を中心とした個人開発を継続
　→ 設計〜実装〜テストまで一貫して手を動かし、どの工程にも対応できるエンジニアを目指す。
・タスク管理やドキュメントの運用を、実務レベルに近い形でブラッシュアップ
　→ 実際の開発現場を想定し、より現実的な作業設計・情報共有の習慣を磨く。
・既存のポートフォリオの保守・アップデートを継続
　→ 作って終わりではなく、保守運用を行い、より実務寄りの成果物を提出する。
・実務に即した開発フローの体験強化
　→ Gitでのブランチ運用、Pull Requestベースの開発、コードレビュー対応などを意識的に取り入れ、開発プロセス全体の理解と経験を深める。

## 9.トップUI
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842139/623be1d3-093b-4d5d-97b0-5c95cadff173.png)


## 10.タスク
https://qiita.com/ashi__mo/items/2ff6e0bdcb7053dc5578

https://qiita.com/ashi__mo/items/490a5fad74c5dada3521

https://qiita.com/ashi__mo/items/dd6395791f4ac3ec07c3

https://qiita.com/ashi__mo/items/4ad6f5d0a4a5ae9b1486

https://qiita.com/ashi__mo/items/17a8f2591c8ddef6384a

https://qiita.com/ashi__mo/items/8dd2f83310e237daa630

https://qiita.com/ashi__mo/items/1014227e63e90e7b4f77

https://qiita.com/ashi__mo/items/274909d18501cb891933
Expo ReactNativeで作るモバイルアプリの開発手順 ①環境構築編

# ExpoでiPhone向けアプリを作成する手順

## 前書き

これまでExpoでiPhone向けのアプリをいくつかリリースしてきました。
その中で得た速く開発するための手順をまとめましたので、ここに記載していきます。

▼リリースしたアプリ(iOS向け)
- [Pomodoro TaskTic](https://apps.apple.com/jp/app/pomodoro-tasktic/id6743796326?platform=iphone)
- [ドキドキスイッチ](https://apps.apple.com/us/app/%E3%83%89%E3%82%AD%E3%83%89%E3%82%AD%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81/id6744993926?platform=iphone)

## 手順

### ⓪ Node.jsのインストール

Node.jsをまだインストールしていない場合は、[公式サイト](https://nodejs.org/)からインストールしてください。


---

### ① プロジェクトフォルダの作成

フォルダを作成したい場所までターミナルで移動し、以下のコマンドを実行してください。

```bash
npx create-expo-app フォルダ名 --template blank-typescript
```

例：

```bash
npx create-expo-app asset-forecast --template blank-typescript
```

以下のようなフォルダ構成が作成されます。作成されたフォルダへ移動してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/847020/b1bfaae1-89cb-45b0-9339-f12ba46773fb.png)

```bash
npx expo start
```
コンソールに表示されるQRコードを端末のExpoアプリで読み取ると以下が表示される。
![Screenshot_20250505-140226.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/847020/9a63db57-38e0-4364-95cd-c6f41ad64bd2.png)


---

## 次のステップ

次の章以降では、ナビゲーションバーの導入やZustandの導入を実施します。
エンベデッドシステム

# はじめに
組み込みソフトについての本を読んだ際に、特徴について一部まとめてみました。

# 組み込みソフトの特徴
- ソフトリアルタイムシステム
人間が操作する製品のように比較的時間制限に寛容なシステム
- ハードリアルタイムシステム
製品同士が通信する場合のように厳格な時間制限を要求するシステム

[スケジュールリング]
複数のイベントに順序をつけて、どのイベントを優先して処理するかを制御する必要。
[優先度]
どの処理を優先させるか決定する

[リアルタイムシステムの目的]
複数のイベントに対し、制限時間内の応答を目指すこと

## ソフトウェア構成
![IMG_5477.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/7c409bdd-1b66-627a-36d4-4be3c6c522a4.jpeg)
- カーネル
アプリケーションの実行・監視・制御を行う。
- デバイスドライバ
カーネルを利用して、入出力デバイスを制御し、アプリケーションが入出力を便利に行える機能を提供する。
- ミドルウェア
デバイスドライバとカーネルが提供する基本機能を利用して、アプリケーションに汎用的で便利な機能を提供するモジュール。
例として、ファイルシステム、GUI、通信などの一般的な機能に加え、動画像の圧縮・復元を行うMPEG、静止画像の圧縮・復元を行うJPEG、HTMLを表示するためのブラウザなどがある。

## タスクのステータス
- ドーマント
タスクがカーネルに登録されているだけで、スケジューリング対象に入っていない状態
- レディ
実行可能だが他に優先度の高いタスクが実行中のため、プリエンプションされている状態
- ランニング
MPUを割り当てられ、実行中の状態
- ウェイト
入出力完了などのイベントやメモリ資源などの獲得を持ち合わせていて、それが発生しない限りレディになることができない状態

[説明図]
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779353/f6f14c12-38ce-bab0-87e4-9ec4ac8c434b.jpeg)

レディとランニングの間の遷移だけは、カーネルが自動的に行う。カーネルはレディのタスクのうち、最も優先度が高いものをランニングに遷移させる。
その他のステータス遷移は、システムコールによって行われる。
SlackのEvent SubscriptionsをRailsで受け取る方法と注意点まとめ（Slack API × Rails）

## 🔍 概要

SlackのメッセージログなどをRailsアプリで受け取るには、Slack APIの**Event Subscriptions**（イベントサブスクリプション）を利用します。

この記事では、Slackイベントを `ChatsController#create` に送る設定と、実装時にハマりがちなポイントをまとめます。

---

## ⚙️ 前提：Slackのイベント通知の仕組み

Slackからイベントを受け取るには、Slack Appの管理画面で**Event Subscriptions**を有効にし、  
その送信先としてRails側のエンドポイントURL（例: `/chats`）を設定する必要があります。

Slackは設定時に“challenge” トークンをPOSTで送信してきます。  
このトークンをそのままレスポンスすることで、SlackがURLの正当性を確認します。

---

## 🚧 ローカル開発では動作しない？

Slackからのリクエストは**外部からアクセス可能なサーバー**にしか送られません。  
そのため、**ローカル開発では動作確認ができません。**
ステージング環境などを使って確認してください。
ただし、URLを変えるごとに“challenge”リクエストをする必要があるので、本番環境にURLを変える時は再度“challenge”リクエストをしてください。

---

## ✅ Rails側の実装

Slackからの"challenge"検証に対応するコードは以下のようになります。

```ruby
class ChatsController < ApplicationController
  # Slackの検証のため、認証をスキップする（後述）
  skip_before_action :authenticate_verify, only: [:create]

  def create
    # SlackからのURL検証
    if params["challenge"]
      render json: { challenge: params["challenge"] }, status: :ok
      return
    end

    # ここにSlackイベント受信後の処理を書く
  end
end

```

## ⚠️ 注意点：独自認証との干渉に注意
Railsアプリ側で before_action による認証を使っている場合（例：authenticate_verify など）、Slackのchallengeリクエストが弾かれてしまいます。

これを回避するために、該当アクションではスキップする必要があります。

```ruby
# challenge検証中は認証をスキップ
skip_before_action :authenticate_verify, only: [:create]
```

## 📝 challengeの検証が終わったら？
Slack側でURL検証（challenge）が成功すると、以降はイベント通知が送られるようになります。
その後は、params["challenge"]の処理は不要なので、コメントアウトまたは削除しておいても構いません。

```ruby
# skip_before_action :authenticate_verify, only: [:create]
# if params["challenge"]
#   render json: { challenge: params["challenge"] }, status: :ok
#   return
# end
```

## 💡 まとめ
* Slackのイベント通知を受け取るには、Event Subscriptionsと外部アクセス可能なエンドポイントが必要

* Railsでは params["challenge"] をそのまま返す実装が必要

* before_action で独自認証をしている場合は、Slackリクエストに対してスキップ指定が必要

* challenge検証後は該当コードをコメントアウト or 削除してOK

## 📌 余談：ボットユーザーがいないというエラーについて
Slack App のインストール時に、「インストールするボットユーザーがありません」というエラーに直面することがあります。

私もこの問題に遭遇しましたが、以下の記事が非常に参考になりました。

https://the-simple.jp/slack-nobotuser

お困りの方は、ぜひ一読をおすすめします。
上司に「今AIって色々あるけど結局何がいいの？業務にどう取り入れたらいいの？」と聞かれたあなたに

## はじめに

AIの進化は非常に速く、何が本当に重要なのかを見極めるのは簡単ではありません。
新しい技術に安易に飛びついて現場に導入すると、かえって混乱を招くことも多いため、導入の判断は慎重に行う必要があります。

AIサービスには、主に次のような特徴があります。

**進化のスピードが非常に速い**
AIのモデル精度や機能は数か月単位で大きく向上します。そのため、今までのノウハウがすぐに古くなってしまうことも珍しくありません。

**セキュリティや規制への懸念**
技術の進化に法整備やガバナンスが追いついていません。企業間でトラブルが発生した場合の対応や、社内ルールの整備もまだまだ手探りの状態です。

**費用対効果の不透明さ**
初期投資や運用コストに見合った効果が得られるのか、判断が難しいという声も多く聞かれます。

このような状況で、上司から「AIサービスについてどう思う？」と聞かれたとき、どのように答えるのが良いでしょうか。
ここでは、私が現時点で「費用対効果が高い」と考えるAI活用方法を紹介します。

## AIによる情報検索の強化

かつてはGoogle検索のスキルが非常に重要でした。
特にITエンジニアは、課題があればGithubやStack Overflowを駆使して自力で解決する力が求められました。
新しい技術を学ぶにも、公式ドキュメントを読み解く力や「ググり力」が必須でした。

しかし、AIサービスの登場で状況は一変しています。
たとえば、**これまで3時間かかっていた調査が10分で終わる**ことも珍しくありません。

AIによる検索サービスは、Google検索と同じ感覚で利用でき、導入のハードルも低いです。
ブラウザさえあれば使えるものが多く、特別なインストールも不要です。
検索バーに機密情報を入力しない限り、セキュリティ面でも比較的安心して使えます。

そのため、AIサービス導入の第一歩として「情報検索の効率化」を進めるのが、最もコストパフォーマンスが高く、導入しやすいと考えています。

代表的なサービスには、GoogleのGemini、OpenAIのChatGPT、AnthropicのClaudeなどがあります。

## AIをサポート役として活用する

AIは、仕事を助けてくれる「サポート役」としても非常に役立ちます。以下のような使い方ができます。

**1. 相談相手として使う**
仕事で困ったことや、ちょっとした疑問があるときに、AIに相談することができます。
これまでは、同僚や上司に聞いたり、会議を開いて時間を使っていましたが、AIならすぐにアドバイスやヒントをもらえるので、気軽に相談できる「話し相手」として活用できます。

**2. 面倒な作業を任せる**
データの整理やフォーマットの統一など、単純だけど手間のかかる作業はAIに任せることができます。
最近では、DevinのようなAIエージェントも登場し、こうした作業を自動でこなす仕組みがどんどん整っています。
これにより、人はより重要な仕事に集中できるようになります。

**3. 調査やレポート作成を頼む**
ChatGPTやGeminiの「Deep Research」などの機能を使えば、短時間で高品質なレポートや調査結果を作成してくれます。
これまで専門のコンサルタントに高い費用を払って依頼していたような調査も、AIを使えば数分で手に入る時代になりました。

このように、AIは「相談相手」「作業の代行」「調査のプロ」として、さまざまな場面で私たちの仕事をサポートしてくれます。


## コーディング支援としてのAI

GitHub CopilotやCursorなどのAIコーディング支援ツールも注目されています。
最近は「Vibe Coding（雰囲気コーディング）」という言葉も話題です。

これまでは人が主体でコーディングしていましたが、今ではAIが主導してコードを書くスタイルも増えてきました。
本番システムでの全面利用はまだ早いですが、調査やモック作成の段階では十分実用的です。

AIコーディング支援ツールを使えば、作業効率が何倍にも向上し、成果も分かりやすいため、導入効果を実感しやすい分野です。


## 導入に慎重になる分野やケース

一方で、AIの導入には慎重な判断が必要な分野もあります。
新しい技術に飛びついた結果、現場が混乱するケースも多く、特に大企業ではその影響が大きくなりがちです。

ここでは、将来的な変化が大きく、不確定要素の多い分野を挙げます。

### 自律型AIエージェントツールの作成

DifyなどのAIエージェント作成ツールは今後重要になるテーマですが、現時点で会社規模で導入するのは時期尚早だと考えます。

ノーコードやローコードでAIエージェントを構築できますが、現時点では技術の進化が速く、標準化や運用ノウハウが未成熟という印象です。
また、会社規模が大きい場合、導入完了までの期間が長く、途中で市場や技術トレンドが変わる可能性も高いと思われます。

### カスタムAI開発・独自システム構築

API連携や自社データを活用した独自AIシステムは、初期投資・開発期間・専門人材の確保・継続的な運用保守コストが高いと考えられます。
その分、効果も高いと思われますが、現時点では技術的進歩が非常に高いため、追従するために継続的なアップデートが必須であり、長期的なメンテナンスコストが非常に高いと考えられます。

## 最後に

上司「今AIって色々あるけど結局何がいいの？業務にどう取り入れたらいいの？」

あなた「
今のAIは数多くありますが、現時点で業務に取り入れるなら、まずはAIによる情報検索の効率化（ChatGPTやGeminiなど）がおすすめです。
これにより、調査や情報収集の時間を大幅に短縮でき、業務全体の生産性が上がります。

次に、AIをサポート役として活用することで、日々のちょっとした相談や、データ整理・単純作業、レポート作成などをAIに任せられます。これにより、人はより重要な仕事に集中できます。

さらに、コーディング支援AI（GitHub Copilotなど）を使えば、開発作業の効率が飛躍的に向上します。

この3つは導入のハードルが低く、費用対効果も高いので、まずはここから段階的に取り入れるのが現実的です。
」

これであなたの会社にもAIツールの導入間違いなし！！！✧(*,,ÒㅅÓ,,)✧
家計簿アプリを作る＃３８

![スクリーンショット 2025-04-29 222616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/c33391ba-6e2b-44dc-9613-cd0290211010.png)
続いて、isActiveを展開していきます。falseであれば、{}を返します。

![スクリーンショット 2025-04-29 222742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/9993029e-99e4-46ba-a79a-bdcde9301bdc.png)
カーソルを持ってきたときに、背景色がつきました。

![スクリーンショット 2025-04-29 222933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/329fe9d8-89ed-480e-a0bc-dab776ecb39d.png)
![スクリーンショット 2025-04-29 222842.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012588/6d06e0ec-0edb-4255-9c10-56e2722c6f30.png)
NavLinkにユニークなキーを割り振ることで、エラーを解消できます。
[AWS #40] AWS CAF

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
皆様お疲れ様です。:computer:
今回はAWSの移行分野にある<font color="c00000">**「AWS CAF」**</font>について見ていきたいと思います。

:upside_down: クラウドサービスの**対応力向上に役立つベストプラクティス**のガイダンスにはどのようなものが提供されているのか見ていきましょう

## 移行の目的
AWSの移行には**理由がある**認識です。そしてその移行の理由が **「ビジネスの目的」** になります。
![AWS40_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/ba43cd0f-828e-48fe-8673-e4d02f200a2d.png)

ビジネスの目的を達成するためには、AWSのメリットを十分に活かした使い方を検討することがポイントです。そのためには**オンプレミス環境とは違う扱い方**や**変化の対応**が必要になります。

:::note info
移行の目的を達成するために、**AWSのメリットを活かした使い方をする**
:::

## AWS CAF
CAFとは<font color="c00000"> **Cloud Adoption Framework**</font> ➡　クラウド導入フレームワークになります。
AWSを使い始める際の**組織全体のためのガイダンス**になります。
このフレームワークは、移行に関する必要のある様々なタイプの方々に焦点を当てた６つの重点分野に基づいてガイダンスを作成しています。


## 6つのパースペクティブ
**・ビジネス**
ビジネスのパースペクティブでは、**「IT (information technology)」** をニーズに、ITへの資本が**主なビジネスの成果へ結び付く**ようにします。ビジネス担当者に、IT戦略をビジネス戦略に直結させます。


**・人材（人員）**
人材のパースペクティブは、クラウド導入を成功に導く**組織全体の変更管理戦略の開発を支援**します。人事担当者、クラウドの人材育成や採用などの **「組織」** としての変革をもたらします。

**・ガバナンス**
ガバナンスパースペクティブでは、**「組織」の利益を最大化**し、変革関連のリスクを最小限に抑えて、クラウドへの取り組みを調整できるように支援するためのフレームワークを提供します。

**・プラットフォーム**
プラットフォームパースペクティブでは、**クラウドアーキテクチャの構築、既存のワークロードの近代化、新規クラウドソリューションの導入を支援する**ためのフレームワークを提供します。

**・セキュリティ**
セキュリティパースペクティブでは、「データ」や「クラウドワークロード」の**機密性、完全性、可用性の実現を支援する**ためのフレームワークを提供します。

**・オペレーション**
オペレーシパースペクティブでは、クラウドサービスが**お客様へのビジネスニーズを満たすレベルで提供する**ためのフレームワークを提供します。

## おわりに
今回のちょっとしたまとめになります。

:::note info
AWS CAFとは、AWSを使い始める際の**組織全体のためのガイダンス（教科書）**
:::

:::note info
AWS CAFには **「ビジネス」「人材」「ガバナンス」「プラットフォーム」「セキュリティ」「オペレーション」** の６つの**パースペクティブ**がある
:::

最後までお読みいただきありがとうございました！
>>**日頃より活用している参考書です。**
>> **「参考書」**
[**AWS認定クラウドプラクティショナー改定第3版（AWS CAFは355ページ）**](https://x.gd/19i6N)
>

> **「AWS公式サイト」**
[**AWS CAF**](https://aws.amazon.com/jp/cloud-adoption-framework/)

> **「Youtube」**
[**【CLF-C02：AWSクラウドプラクティショナー】第9回 AWS CAF(クラウド導入フレームワーク) (クラウドのコンセプト分野)**](https://www.youtube.com/watch?v=hadye-MNxWo)
>
SnowflakeのNotebookをどこのDB.SCHEMAに作成したか忘れたときに確認する方法

このNotebook、どこのスキーマに作ったっけ？って作成した翌日以降によく起こるのでメモ。

##### python コード
```py
session = get_active_session()
session
```

##### sql

```sql
SHOW schemas;
-- is_current カラムが'Y'のスキーマが現在地
```

### GUIで確認したいので、何か方法ありますか？とSnowVillageで聞いたら教えてもらえました。ありがとうございます。

##### 左のNotebook名の...から`Copy full path` で確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12298/dfae4f57-c495-49e8-ac99-04f651ec56ea.png)

##### 左メニューの`Projects`-`Notebooks`を選んだときに、右の一覧に`LOCATION`がでてくる
(Home選択時にはでてこない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12298/1e936911-41b9-487a-a9bb-1e972d39ecf0.png)
DockerでSpring Bootを動かす際のapplication.propertiesのDB指定

### application.propertiesのDB指定
application.propertiesでDBを指定する際は
Dokerで指定しているサービス名となる。

```
#spring.datasource.driver-class-name=org.postgresql.Driver
#spring.datasource.url=jdbc:postgresql://localhost:5432/example
#spring.datasource.username=postgres
#spring.datasource.password=postgres

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://db:5432/example
spring.datasource.username=postgres
spring.datasource.password=postgres
```

spring.datasource.url=jdbc:postgresql://db:5432/example
　　　　　　　　　　　　　　　　　　:point_up:

dbとはdocker-compose.ymlのDBのサービス名とすること。

```
services:
 # Javaの設定情報
  java:
    # コンテナ名
    container_name: springjar
    build: ./java
    ports:
     - "8080:8080"
    # local参照先:コンテナ展開先
    volumes:
    - ./build/libs:/app
    # コンテナ内のディレクトリ定義
    working_dir: /app
    tty: true

  db:
    container_name: spring_list_post
    build: ./image/postgres
    restart: always
    ports: 
      - "5432:5432"
    volumes:
      - ./postgres/init:/docker-entrypoint-initdb.d
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
```
Snowflakeでmatplotlibのグラフに日本語フォントを表示させたい

## 1行まとめ
Snowflake Managed Stages にフォントファイルを置いて、それを呼び出す。
### 詳細

1. 日本語フォントをダウンロードしてくる
https://moji.or.jp/ipafont/ipaex00401/
このへんとかから。zipは解凍しておく。


2. Notebook/Streamlit を作成するデータベース.スキーマに、Snowflake Managed Stagesを作成し、1. のフォントファイルを配置する

3. Notebook/streamlit を作成する
3-1. 右上のPackages から matplotlib を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12298/3f6be5b6-9a1b-4a94-a2fa-381851551365.png)

3-2. コードを書く

```sample_notebook.py
from io import BytesIO
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from snowflake.snowpark.context import get_active_session

session = get_active_session()

# フォントファイルのパス 
path = "@HOGE_STG/ipaexg.ttf"

# ファイルの読み込み
with session.file.get_stream(path, decompress=False) as f:
    s = f.read()

# BytesIO: メモリ上でバイナリデータを扱うための機能
with BytesIO() as bs:
    bs.write(s)
    content = bs.getvalue()

# SiSの仮フォルダ領域への書き込み
with open(f"/tmp/ipaexg.ttf", "wb") as s:
    s.write(content)

font_prop = fm.FontProperties(fname="/tmp/ipaexg.ttf")
fm.fontManager.addfont("/tmp/ipaexg.ttf")
plt.rcParams['font.family'] = font_prop.get_name()

# グラフを描画
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 20, 25, 30])
ax.set_title('サンプルグラフ')

plt.show()
```
3-3. 実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12298/f18cf79a-233e-4524-afe5-d320e6555b33.png)

###### もうちょっとかわいらしいフォントでやってみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12298/9585134d-7264-4d58-921b-b28ba7ac3299.png)
SQL Developerを利用して、テーブルのDDLやデータをエクスポートしたい

# はじめに

SQL Developerを利用して、テーブルのDDLやデータをエクスポートする方法を紹介します。

# 手順

事前にエクスポート対象のデータベースへのOracle接続を作成しておく必要があります。

## データベース・エクスポートの起動

画面右上の「ツール(T)」から「データベース・エクスポート(X)」を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/732abd67-6efa-2d01-3400-d535f5dc487c.png)

## ステップ1/5

必要な情報を入力し「次へ(N)>」を押下します。ちなみに、DDLのエクスポートを行う際には「終了文字(T)」にはチェックを付けておくのがおすすめです (ステイトメントの終わりにセミコロンがつくので、いろいろ便利)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/89af0b10-9a43-d302-ede5-e95409d835dd.png)

## ステップ2/5

必要な情報を入力し「次へ(N)>」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/0c1ecd80-f725-1358-1d1b-ce04266cbb77.png)

## ステップ3/5

このステップではエクスポートするオブジェクトを絞ることができます。左ペインから必要なオブジェクトを選択し、右ペインへ移すことで、右ペインのオブジェクトのみをエクスポート対象にすることが可能です。なお、左ペインにオブジェクトが表示されない場合は「参照(K)」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/114c31fa-d8d1-b8cf-8601-128579ae474d.png)

## ステップ4/5

このステップではエクスポートするデータを絞ることができます。Aというテーブルのデータは必要だが、Bというテーブルのデータは不要というような場合に便利です。

使い方はステップ3/5と似ており、上ペインから必要なデータだけを選択し、下ペインへ移すことで、下ペインのデータのみをエクスポート対象にすることが可能です。なお、上ペインにデータが表示されない場合は「参照(K)」ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/d86fe15a-d488-081e-390c-bb7e7893c2eb.png)

## ステップ5/5

エクスポートのサマリを確認することができます。「終了(F)」を押下すると、エクスポートが開始されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/f41741ab-a9ef-b413-49e1-31c49709e11e.png)

エクスポートを開始すると、以下のようなダイアログが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/c8ecfe8f-16ce-2f7c-7edb-b1bdc3d7ac83.png)

このダイアログが閉じるとエクスポート完了です。ステップ1/5で設定した出力先に以下のようなファイルが作成されているはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/0689a167-6efb-02eb-1883-18efaf666551.png)


# 環境情報

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/fca73732-4bcc-232a-76d2-0c300aa934ee.png)
Outlook をインストールせずに PST ファイルを結合する:

Outlook をインストールせずに PST ファイルを結合する:

<p>膨大な数の PST ファイルを管理するのは、特に Outlook を使用していない場合は面倒です。これは、大量の大容量ファイルやデータを処理する必要があるすべてのユーザーにとって重要な問題です。このブログでは、Outlook をインストールせずに PST ファイルを結合する方法を学びます。複数の PST ファイルを 1 つに簡単に結合する方法を学び、さまざまな方法とテクニックを探っていきましょう。</p>

<h2>なぜユーザーはPSTファイルを結合する必要があるのでしょうか？理由：</h2>
<ul>
<li>PSTファイルを結合すると、すべてのデータを1か所で評価できるようになります。1つのマスターファイルで、すべてのメール、カレンダー、連絡先を簡単に確認できます。</li>
<li>データ破損を防ぐには、複数のPSTファイルを1つに結合することが重要です。これにより、大容量ファイルのバックアップや転送中に破損する可能性が低くなります。</li>
<li>ファイルを結合すると、個別のファイルは多くのスペースを占有するため、ストレージ容量を節約できます。大容量のPSTファイルを分割すると、ファイルの重複が減り、ディスク容量を節約できます。</li>
<li>単一のPSTファイルからデータを見つけやすくなります。何年も前の請求書を複数のPSTファイルから探すのは、はるかに困難で非効率的です。</li>
</ul>

<h2>複数のPSTファイルを手動で1つに結合することは可能ですか？</h2>

<p>いいえ、ご存知の通り、PSTファイルはMicrosoft Outlookによって作成・管理されるため、Outlookをインストールせずに手動でPSTファイルを結合することは不可能です。PSTファイルは複雑で重要なデータが含まれているため、ユーザーがコピー＆ペーストして大きなファイルを結合するだけでは不十分です。</p>
<p>Outlookなどのサードパーティ製ソフトウェアを使ってPSTファイルを結合するのが、この質問に対する最善の解決策です。これらのソフトウェアはオフラインで動作するため、データのセキュリティは完全に確保され、複数のPSTファイルを簡単に1つに結合できます。</p>

<strong>手動でできることは？</strong>
<p>複数のファイルをフォルダにまとめて保存したり、メールをEMLまたはMSGに手動で抽出して管理したりすることができます。これらの方法を試すことはできますが、これは真のマージプロセスではありません。Outlookを使用せずにPSTファイルを効果的にマージする方法を見てみましょう。</p>

<h3>Outlook をインストールせずに専門ツールを使って PST ファイルを結合する：</h3>

<p>複数の PST ファイルを手動で 1 つに結合する方法を検討しましたが、残念ながら実現可能な方法はありませんでした。BitRecover の<a href="https://appsource.microsoft.com/en-us/product/web-apps/bitrecover.pst-combiner?tab=overview" target="_blank"><strong>PST merge software</strong></a>が唯一の解決策です。この専門ユーティリティには、大容量の PST ファイルを結合するための機能が多数搭載されています。5 つの簡単な手順で、複数の PST ファイルを 1 つに簡単に結合する方法を見てみましょう。</p>
<ol>
<li>まず、ソフトウェアをダウンロードし、「Outlook メールボックスのデータを変換」オプションを選択して「次へ」をクリックします。</li>
<li>次に、「インストールされていません」オプションをクリックして先に進みます。</li>
<li>その後、複数の PST ファイルを 1 つの PST ファイルに結合するか、複数の PST ファイルを別々のフォルダにまとめて 1 つの PST ファイルにまとめるかを選択できます。</li>
<li>「重複を削除」オプションにチェックを入れ、「次へ」ボタンをクリックします。</li>
<li>最後に、「結合」ボタンをクリックすると、PST ファイルはすぐに結合されます。</li>
</ol>

<h3>PST結合ソフトウェアを使用するメリット：</h3>
<ul>
<li>この専門ツールは、メール、予定表、連絡先など、データベース全体を結合するのに役立ちます。</li>
<li>Outlookをインストールしたり、事前のトレーニングや技術的な知識を必要とせずに、誰でもPSTファイルを結合できます。操作は分かりやすく、ユーザーにとって非常に便利です。</li>
<li>PSTファイルの結合時に重複が発生する可能性が高いため、このツールはファイルの重複を防止します。「重複削除オプション」を使用すると、データ内の不要な重複を削除できます。</li>
<li>この専門ソフトウェアにはサイズ制限がないため、Outlookをインストールせずに、多数の大きなファイルを簡単に結合できます。</li>
<li>すべてのバージョンのOutlookをサポートしているため、ユーザーにとって手間がかかりません。</li>
</ul>
<h3>結論：</h3>

<p>これまで見てきたように、複数のPSTファイルを手動で1つに結合する方法はありません。したがって、この自動化ツールは、OutlookをインストールせずにPSTファイルを結合するのに最適なツールであると結論付けることができます。このブログでは、大きな PST ファイルを簡単かつ生産的に結合する方法を学びました。<p>
【AWS CDK】いっけね！間違えてバージニア北部にデプロイしちゃった...（備忘録）

備忘録になります。
# なぜ間違えた？
AWS学習中にCDKで定義したVPCやサブネットをデプロイした際に、シンプルにリージョン周りを正しく確認していなかったためです...。

具体的には以下のような状態でした。
* `aws configure`でアクセスキーなどを入力する際にリージョンをデフォルトにしたまま。

* `bin/~.ts`に明示的にリージョンを記述していなかった。
```typescript:bin/~.ts
import * as cdk from "aws-cdk-lib";
import { AwsTestStack } from "../lib/aws-test-stack";

const app = new cdk.App();
new AwsTestStack(app, "AwsTestStack", {
});
```

# 解決策
## 1. デフォルトのリージョンを変更
### `aws configure set region`でリージョンを設定
```bash
aws configure set region ap-northeast-1 # 東京リージョンをセット
```
### `bin/~.ts`リージョンを記述
```typescript:bin/~.ts
import * as cdk from "aws-cdk-lib";
import { AwsTestStack } from "../lib/aws-test-stack";

const app = new cdk.App();
new AwsTestStack(app, "AwsTestStack", {
   env: { region: 'ap-northeast-1' },  // 東京リージョンを明示的に指定
});
``` 

## 2. 間違えてデプロイしたリージョンのリソースを削除
```bash
# cdk destroy --region [削除対象のリージョン]
cdk destroy --region us-east-1 # バージニア北部のリソースを削除
```
### 安全に削除するために
**削除対象の確認**
```bash
# cdk diff --region [削除対象のリージョン]
cdk diff --region us-east-1
```

**スタック名を指定して削除**
```bash
# cdk destroy [スタック名] --region [削除対象のリージョン]
cdk destroy AwsTestStack --region us-east-1
```

## 3. 再デプロイ

```bash
# cdk bootstrap --region [デプロイ対象のリージョン]
cdk bootstrap --region ap-northeast-1
# cdk deploy --region [デプロイ対象のリージョン]
cdk deploy --region ap-northeast-1
```

最後にAWS Console上より、Cloud Formationメニューへ遷移し、
正しいリージョンにデプロイされていることを確認する。
XNOR 演算の基本 !(A ^ B)

Paizaの論理演算シリーズ、今回は「XNOR」演算！

## <br>🎯 問題とステップ：

0 または 1 の整数 A, B が与えられる。A XNOR B の結果を出力せよ。

要は、AとBが同じなら1、違ったら0を出力する。

<br>

https://paiza.jp/works/mondai/logical_operation/logical_operation__basic_step7

## <br>✅コード例
```js
const [A, B] = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split(' ').map(Number);

// 方法1：AとBが等しいかで判断
console.log(A === B ? 1 : 0);
```


```js
//方法2:ビット演算
const xnor = Number(!(A ^ B)); // XORの否定がXNOR！
console.log(xnor);
```

どっちも「AとBが同じなら1」を表現してるだけ。
でも 個人的には `===` のほうが分かりやすくて好き。

## <br>🔍 まとめ・補足ポイント
- `!(A ^ B)` だけだと true/false型になる → `Number()` で数値に変換！
- `^` はビットXOR → 違うときだけ`1`になる
- XNORはその逆：同じときだけ`1` → `!(A ^ B)` で表現可能

<br><br>[🐻僕の失敗談と解決話！🐈](https://paizabeginner.wordpress.com/2025/04/29/paiza%e3%81%a7%e5%9f%ba%e6%9c%ac%e3%83%9e%e3%82%b9%e3%82%bf%e3%83%bc%ef%bc%9axnor-%e6%bc%94%e7%ae%97%e3%81%ae%e5%9f%ba%e6%9c%ac-a-b/)
「rafce」を使おう



Reactでコンポーネントを作るとき、
毎回 `import` や `export` を書くのが面倒だと思ったことはありませんか？

 `rafce` スニペットです！

---

##  `rafce` とは？

`rafce` は **React Arrow Function Component Export** の略で、  
**アロー関数で定義された関数コンポーネント＋エクスポート付きのテンプレート** を一瞬で生成できます。

---

## 実際に `rafce` を打つとどうなる？
rafceと入力してtabキーを押すと...

```tsx
import React from 'react';

const ComponentName = () => {
  return (
    <div>ComponentName</div>
  );
};

export default ComponentName;
```

雛形を作成してくれます！

##  他にもある便利スニペット

| スニペット | 内容                                      |
|------------|-------------------------------------------|
| `rafce`    | アロー関数コンポーネント（exportあり）     |
| `rafc`     | アロー関数コンポーネント（exportなし）     |
| `rfc`      | 通常の関数コンポーネント（exportあり）     |
| `rce`      | クラスコンポーネント（exportあり）         |




##  まとめ
`rafce`をきっかけに他にも色々と便利なスニペットを知りました。
他にも学習したら記録に残していきます。
「Rails」form_withメソッドでboolean型の値を選択する方法

# アプリの概要
Slackのようなworkspaceを実装し、メッセージのやり取りができるアプリを開発しています。
投稿メッセージのDBカラムにboolean型のResolveカラムを設けました。
(投稿内容のテキストの意味は無視してください、)
![スクリーンショット 2025-04-29 19.54.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4012697/51bab105-d4b3-4dc7-ba87-6accf13f07d0.png)

Status:Resolve
=> 非表示
Status:Unresolve
=> 表示

## 実装したいこと
画像にあるように、DBカラムがResolveの場合はそれを表示させ、Unresolveに変更しそれを保存させる。という機能を実装しようと思いました。

## SQLiteではboolean型は "0" or "1"
UIではResolve/Unresolveとなってますが、SQLiteのBoolean型は "0"と"1"なのでブラウザ表示したいときはどのような書き方をすれば自動で変換してくれるかわかりませんでした。

Railsガイドを見ると以下の記述がありました。
*Railsガイドより引用
=>https://railsguides.jp/form_helpers.html


```ruby
@person = Person.new(city: "MD")
```
```erb
<%= form_with model: @person do |form| %>
 <%= form.select :city, [["Berlin", "BE"], ["Chicago", "CHI"], ["Madrid", "MD"]] %>
<% end %>
```
調べると、記述によって自動変換してくれるとのことなので、以下のように実装しました。
```erb
<%= form_with model: @post, local: true do |f| %>
 <%= f.label :resolve, "Status" %>
 <%= f.select :resolve, [["Unresolved", "false"], ["Resolved", "true"]], class: 'form-select' %>
<% end %>
```
boolean型とrailsのform_withは相性がいいらしく、rails側でfalse or trueを判別してくれるみたいです。

## 引用元　Ruby on Railsガイド
https://railsguides.jp/

Railsをやり始めて４ヶ月ほど経ち、その間railsチュートリアルもやりました。
今回初めてRailsガイドを参照しましたが、こういったリファレンスも読めるようになったらいいものが作れると思うので、めげずに続けます。
Windowsタスクスケジューラの個人的ベストプラクティス

タスクスケジューラはときどきうまく動かない場合があり、沼にはまります。
特に、「ユーザーがログオンしているかどうかにかかわらず実行する」を選択しているときは難しいです。
そういうときは工夫するといけることがあります。
個人的に動作が安定しているなと感じている構成は、

1. 実行したいタスクをトリガー無しで作成
2. 「schtasks /run /tn <taskname>」を記述したバッチコマンドを「操作」で指定したトリガー付きタスクを作成

です。

また、これが最良なのかはわかりませんが、いつも
・権限は「Administrator」
・「パスワードを保存しない」を選択
・「最高位の特権で実行する」を選択

にするようにしています。

↓Microsoftもタスクスケジューラがうまく動かない問題を認識しているようです。
https://jpwinsup.github.io/blog/2024/04/03/UserInterfaceAndApps/Taskscheduler/startup-task-failed/

↓タスクスケジューラのタスクを実行するコマンド
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/schtasks-run
AR.jsにて独自のマーカーを作成して使用するときの注意点

AR.jsで自分で
https://jeromeetienne.github.io/AR.js/three.js/examples/marker-training/examples/generator.html
にて独自にマーカーを作成して使用する際の注意点をお伝えします。

　それは、もし、枠の比率を変化したのならば、その比率を覚えておき、使用する際にはその変更した割合を記述する必要があることというとです。

 　もし比率を６割で作成した際には
```diff javascript
const arToolkitContext = new THREEx.ArToolkitContext({
    cameraParameterUrl: './data/camera_para.dat',
    // 比率を変えた場合にはその変更を記述
    patternRatio: 0.6,
    detectionMode: 'mono_and_matrix',
})
```
とArToolkitContext内に記述しないとうまくマーカーを認識してくれません。

使用する際にはぜひお気を付けを！
[python / pypi] pypi パッケージアップロード時の 403 エラー with 2FA

# 概要

pypi に python の自作パッケージをアップロードしようとしたところ、 403 エラーが発生した。
username も password もログイン時に使用するものを入力できていて、間違いはない。

そんな時の対策記事です。

以下の記事の対策方法では解決しなかったので、記事化しました。

https://qiita.com/shonansurvivors/items/f4649b620f404eddb4e9

# 要因

pypi ログイン時に2要素認証 (2FA: 2-factor-authentication) を利用していると、この問題が発生するようです。

# エラー発生状況


```bash
$ twine upload -r testpypi dist/*
Uploading distributions to https://test.pypi.org/legacy/
Uploading parapara_anime-0.0.2-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12.1/12.1 kB • 00:00 • ?
WARNING  Error during upload. Retry with the --verbose option for more       
         details.                                                            
ERROR    HTTPError: 403 Forbidden from https://test.pypi.org/legacy/         
         Forbidden
```

# 対策

## Pypi のサイトで API token を作成する

- 「自分の名前」→「Account settings」→の順にクリック  
![スクリーンショット 2025-04-29 20.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/d9e446b8-8d9f-4077-be1c-9ff77da6bfdc.png)
- API token を作成してください  
![スクリーンショット 2025-04-29 20.37.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/6e244413-228e-47f1-bd4d-07603216bce2.png)

※作成した API token は、画面を切り替えるともう取得できなくなってしまうので、作成した直後にどこかに記録してください


## ~/.pypirc を書き換え

`~/.pypirc` に記載していた username, password を以下のように修正します。
- まだ作成していない人はファイルごと作成してください。

```yaml:~/.pypirc
[distutils]
index-servers =
  pypi
  testpypi

[pypi]
repository: https://upload.pypi.org/legacy/
username: __token__
password: pypi-<あなたの token>

[testpypi]
repository: https://test.pypi.org/legacy/
username: __token__
password: pypi-<あなたの token>
```

これで 403 エラーは解消できるはずです。


# 関連記事


## 公式ドキュメント - API token の作り方と使い方

この記事に記載してある問題の具体的な対処方は、以下の記事を参考にしました。

https://pypi.org/help/#apitoken

## 旧来の upload 方法

2段階認証を利用していない場合は以下の方法でも対応可能なはず...。

https://qiita.com/shinichi-takii/items/e90dcf7550ef13b047b5
【お勉強メモ】Linuxファイル操作系コマンドと正規表現

これって私の感想です

## 1. Vimの基本操作：`dw` ,`x`, `X` の違い

- `dw`：カーソル位置から1単語削除
- `x`：カーソル上の1文字削除(Delete)
- `X`：カーソルの左側を1文字削除(Backspace)

**躓きポイント：**
- OSによって「カーソルの位置（文字の上か間か）」の扱いが異なり、思わぬ結果に。
- UbuntuとCentOSで削除される範囲が違って見えるのはこのため。

---

## 2. less / cat の違い

- `cat` はファイル全体を一気に表示
- `less` はページ送り可能、スクロール自在、"less is more (少ない方がより豊か)"からきている(`less` は `more` の改良版)

**使い分けの基準：**
- 小さいファイル：`cat`
- 大きいファイル：`less`

**学び：** 
- すべて `less` で開けばいいのではという疑問があったが、`less` は抜けるための動作が必要
- とりあえず `cat` で開いて、こりゃかなわんとなったら `less` で開いてみる

---

## 3. grepと正規表現

- `.`, `*`, `.*` をgrepで実験
- `.*` は「任意の文字が0回以上繰り返される」

**躓きポイント：**
- `a123c` や `aXbc` が `a.*c` にマッチする理由が直感的にわからなかった
- `.*` では `.` が0回以上繰り返される、すなわち `.` の位置に相当する文字の繰り返しではなく、`.` というパターンの繰り返し

---

## 4. クォートとシェルの関係

- `grep 'apple'` のようにクォートは必要か？
- 特殊文字（`*`, `|`, `$`, `()`）を含むとき、**Bashが誤解釈するのを防ぐためにクォートが必要**

**学び：** クォートは「正規表現のため」ではなく「シェルのための防御策」。grepで文字列を検索しておくときは常にクォートしておくのが安全。
【AtCoder】コードテストをVSCodeコピペで実行したい！(Python)

# 目的・背景
AtCoderでは提出する前に「コードテスト」をすることができます。
コードテストでは、実行中にエラーが起きないかや出力例と一致するかを確かめるのに便利な一方、以下の点で不満がありました。
- ブレークポイントをおいてデバッグできない
- タイポを指摘してくれない
- カラーが無くて見にくい

→ 基本コードテストで実行して、「あれ、なんでエラーになるんだろ」ってなったタイミングでさっとコピペしてデバッグできるようにしたい&複雑な環境構築はしたくない！
# ざっと概要
以下のような構成にしました。
```
.
└── atCoder/
    ├── .vscode/
    │   └── launch.json (後ほど作成)
    └── input.txt（入力例をコピペする用）
    └── main.py（コードテストをコピペする用）
    └── setup.py（入力をinput.txtから読み込むようにする）
```
1. setup.py
入力を受け取る時に使用する、input()で、テキストから読み取るように設定し、main.pyを実行するようにします。（コードテスト&デバッグをする際はこちらを実行）
2. input.txt
「入力例」をコピペします
3. main.py
コードテストで作成した自分のコードを貼り付けます
4. .vscode/launch.json
デバッグ時の実行ファイルをsetup.pyにする（必須ではない）
# やること
## 1. 通常実行
以下をsetup.pyに貼り付ければ完了です。
``` setup.py
import subprocess

with open("input.txt", "r") as file:
    subprocess.run(["python3", "main.py"], stdin=file)
```

あとはinput.txtに入力例を貼り付け&main.pyに自分のコードを貼り付けて実行！(setup.pyの方を実行)
```
python3 setup.py
```
## 2. デバッグ時の注意
VSCodeで [debugger](https://qiita.com/ryhara/items/b3b9a3976f2b1220532a)を使用する際、デフォルトではアクティブになっているファイルが実行されます。
編集するファイルはmain.pyなのに対して、実行して欲しいファイルはsetup.pyなので、debuggerを使用する際には毎回setup.pyをアクティブにしてから実行する必要があり面倒です。
## launch.jsonを編集
プロジェクトフォルダに.vscode/launch.jsonを作成し以下のようにしました。
``` launch.json
{
    "version": "0.2.0",
    "configurations": [

        {
            "name": "Python Debugger: debug setup",
            "type": "debugpy",
            "request": "launch",
            "program": "${workspaceFolder}/setup.py",
            "console": "integratedTerminal"
        }
    ]
}
```
↑ デフォルトでsetup.pyを実行してくれます。
# 使ってみた感想
色がついて見やすくなり、バグを見つけるのも早くできるようになりました。「コードテスト」と同じくらいの手間で使用できるので、もうコードテストを使うことはないかも。
Windows Server フェールオーバークラスターのノードのNICが「複数のIPアドレス」になってビビる

フェールオーバークラスターを構築するとき、クラスターのホスト名とIPアドレスを入力するところがあると思います。
そのときに入力したIPアドレスがフェールオーバークラスターノードのドメインコントローラと通信するNICに紐づき、サーバーマネージャーで「複数のIPアドレス」と表示されます。
はじめて見たときはクラスターに割り当てたIPアドレスを忘れていたので「複数のIPアドレス」となっているのに驚いた後に「ipconfig /all」でIPアドレスを表示しても一体何なのかわからずバグかと思いましたが、クラスターのIPアドレスでした。
このIPアドレスを消そうとして「netsh interface ip delete address name=ネットワークアダプターの名前 addr=IPアドレス」を実行しましたが、消えませんでした。
A Daily Life of a busy and chilling Laptop

As the sun peeks through the curtains, I power up, ready to face another day. I'm not just any laptop; I'm the lifeline for my user's daily adventures. Today promises to be eventful, filled with emails, spreadsheets, and perhaps a little bit of online shopping.

First, I am greeted with a flurry of fingers dancing across my keyboard as my user checks emails. It’s a workout, but I enjoy the rhythm. Each keypress feels like a tiny high-five, affirming my purpose. As the morning progresses, I'm hooked up to the projector for the dreaded morning meeting. It's nerve-wracking being in the spotlight, but I hold my screen high, displaying graphs and charts like a pro.

Lunchtime approaches, and I get a brief reprieve. My user settles down with a sandwich, crumbs threatening to invade my keyboard. I brace myself, dodging the crumbs like a digital ninja. After lunch, it's back to work, with a mix of spreadsheets and document editing. The "Ctrl+Z" is my best friend, undoing all of my user's mistakes with grace.

Afternoon brings a video call, and I become the gateway to the virtual world. Faces pop up on my screen, their voices echoing through my speakers. I do my best to ensure the connection is clear, though sometimes, the Wi-Fi decides to play hide and seek.

As the day winds down, my user decides to unwind with a bit of online shopping. I secretly marvel at the weird and wonderful items added to their cart. Finally, the clock strikes five, and I find myself shutting down.

It's been a day of highs and lows, but as I dim my screen, I feel a sense of accomplishment. I may be just a laptop, but I've played my part in making this day productive and maybe even a little bit fun. Tomorrow, I'll do it all over again, ready to support my user in their digital adventures.
【Python初心者】エスケープシーケンスと正規表現の違い、そしてraw文字列リテラルの正しい使い方

Pythonを学んでいると、**エスケープシーケンス**や**正規表現**、**raw文字列リテラル**という用語が出てきます。  
これらはそれぞれ役割が違いますが、どれもバックスラッシュ（`\`）を使うため、混乱しやすいポイントです。

この記事では、**エスケープシーケンスと正規表現の違い、そしてそれらを扱う際に重要なraw文字列リテラルの使い方について整理します。**

## エスケープシーケンスとは？

エスケープシーケンスは、**Pythonの文字列リテラル内でバックスラッシュ`\`を使い、特殊な意味を持たせるもの**です。  
「エスケープ」という言葉には、「通常の文字の意味を抜け出す」という意味があります。

代表例：

| シーケンス | 意味         |
|------------|--------------|
| `\n`       | 改行         |
| `\t`       | タブ（空白） |
| `\\`       | バックスラッシュ自身 |
| `\'`       | シングルクォート |
| `\"`       | ダブルクォート |

例：
```py
print("Hello\nWorld")
```
出力：
```
Hello
World
```
ここで`\n`は、普通の`n`ではなく「改行をする」という**Python自身の文字列ルール**に従っています。

## 正規表現とは？

正規表現は、**文字列のパターンマッチングを行うための表現方法**です。  
こちらでも`\d`や`\w`のようにバックスラッシュを使った表記が多く出てきます。

代表例：

| パターン | 意味 |
|----------|------|
| `\d`     | 数字1文字（0〜9） |
| `\w`     | 英数字またはアンダースコア |
| `\s`     | 空白文字 |

例：
```py
import re

pattern = r"\d{3}-\d{4}"
text = "郵便番号は123-4567です。"

result = re.search(pattern, text)
if result:
    print(result.group())
```
出力：
```
123-4567
```
ここでは`\d`が「数字1文字」を表す**正規表現のルール**に従っています。

## エスケープシーケンスと正規表現の違いまとめ

| 項目 | エスケープシーケンス | 正規表現 |
|-----|----------------------|----------|
| 属する世界 | Pythonの文字列処理 | 正規表現エンジンのパターン処理 |
| 目的 | 特別な文字（改行・タブなど）を扱う | 文字列パターンを指定する |
| 例 | `\n`, `\t`, `\\` | `\d`, `\w`, `\s` |
| 注意点 | バックスラッシュがPython側で解釈される | バックスラッシュを正規表現に伝える必要あり |

Pythonの文字列と正規表現では、**どちらも`\`を使うが意味が違う**ため、ここが混乱の元になります。

## なぜraw文字列リテラルが必要なのか？

問題は、Pythonの通常の文字列リテラル内ではバックスラッシュが**Python自身のエスケープシーケンスとして処理される**ことです。

つまり、`"\d"`と書くと、

- Python：「\d？そんなエスケープシーケンスは知らないな」
- → 意図しない動作 or エラーになる

これを防ぐために、raw文字列リテラル（`r"..."`）を使います。

raw文字列リテラルを使うと、Pythonはバックスラッシュを特別扱いせず、**見たまま**正規表現エンジンに渡します。

例：
```py
import re

# 通常の文字列（失敗する例）
pattern = "\d{3}-\d{4}"  # ❌

# raw文字列（正しい例）
pattern = r"\d{3}-\d{4}"  # ✅
```
raw文字列を使うことで、Pythonのエスケープ問題を回避し、正規表現を正しく扱えるようになります。

## raw文字列リテラルの使い方まとめ

・**バックスラッシュをエスケープせず「そのままの文字」として扱いたいときは、raw文字列リテラルを使う。**  
（例：Windowsのパスや`\n`を文字として表示したいとき）
```py
print(r"C:\Users\Name\Desktop")
# 出力: C:\Users\Name\Desktop
```
・**正規表現のパターンを書くときは、必ず raw文字列リテラルを使う。**  
（バックスラッシュが多用されるため、Pythonの文字列処理で壊れてしまうのを防ぐ）
```py
import re

pattern = r"\d{3}-\d{4}"
result = re.search(pattern, "郵便番号は123-4567です。")
print(result.group())
# 出力: 123-4567
```
## まとめ

- **エスケープシーケンス**は、Pythonの文字列内でバックスラッシュを使い特殊な意味を持たせる仕組み
- **正規表現**は、文字列パターンマッチングを行う方法で、こちらでもバックスラッシュを使う
- Pythonの文字列と正規表現では**バックスラッシュの扱いが違う**
- その違いを埋めるために、**raw文字列リテラル（`r"..."`）を使うことが必須**

エスケープシーケンスと正規表現の違いを正しく理解し、適切にraw文字列リテラルを使いこなして、Pythonでの文字列操作を確実なものにします！
【Python初心者】正規表現とraw文字列リテラルの基礎まとめ

Pythonで文字列を検索したり、一部を取り出したりしたいときに便利なのが**正規表現**です。  
ただ、正規表現にはバックスラッシュ（`\`）を使った特殊な記号が多く、  
Pythonの文字列のルールと混ざって混乱することもあります。

この記事では、Pythonにおける正規表現の基本と、raw文字列リテラルの必要性についてわかりやすくまとめます。

## 正規表現とは？

正規表現（Regular Expression）とは、**文字列のパターンを表現する方法**です。

特定の形式にマッチする文字列を探したり、置き換えたりするのに使います。

よく使われる正規表現パターンを紹介します。

| パターン | 意味              | 例         |
|----------|-------------------|------------|
| `\d`     | 数字1文字           | `0`～`9`   |
| `\w`     | 英数字またはアンダースコア | `a`, `Z`, `0`, `_` |
| `\s`     | 空白文字（スペース・タブ・改行） | 空白 |
| `.`      | 任意の1文字         | 何でも1文字 |
| `*`      | 直前のパターンが0回以上繰り返される | `"a*"`は`""`、`"a"`, `"aa"`などにマッチ |
| `+`      | 直前のパターンが1回以上繰り返される | `"a+"`は`"a"`, `"aa"`などにマッチ |
| `[]`     | 文字クラス（いずれか1文字） | `[abc]`は`a`,`b`,`c`のどれかにマッチ |
| `()`     | グループ化         | `(abc)`で1つの単位として扱う |

これらを組み合わせることで、複雑な文字列パターンを簡単に扱えるようになります。

## Pythonで正規表現を使うには？

Pythonでは標準ライブラリ`re`モジュールを使って正規表現を扱います。

簡単な例を見てみましょう。
```py
import re

pattern = r"\d{3}-\d{4}"
text = "郵便番号は123-4567です。"

result = re.search(pattern, text)
if result:
    print(result.group())
```
出力：
```
123-4567
```
このコードは「3桁の数字-4桁の数字」（例：123-4567）というパターンを探して、最初に見つかったものを出力しています。

ポイントは、`pattern`を定義するときに**`r"..."`（raw文字列リテラル）を使っている**ことです。

## なぜraw文字列リテラルが必要なのか？

正規表現では、`\d` や `\s` など、バックスラッシュを使った記号がたくさん登場します。

もし普通の文字列（`"..."`）で書いてしまうと、Pythonのエスケープシーケンス処理が先に働いてしまい、意図した正規表現として使えないことがあります。

例：普通の文字列で書いた場合
```py
import re

pattern = "\d{3}-\d{4}"  # ❌ 普通の文字列
text = "郵便番号は123-4567です。"

result = re.search(pattern, text)
print(result)
```
出力：
```
None
```
`\d` の部分が正しく認識されず、パターンマッチングに失敗してしまっています。

これを防ぐために、**raw文字列リテラル（`r"..."`）を使うのが基本**です。
```py
import re

pattern = r"\d{3}-\d{4}"  # ✅ raw文字列
text = "郵便番号は123-4567です。"

result = re.search(pattern, text)
print(result.group())
```
出力：
```
123-4567
```
raw文字列リテラルを使うことで、バックスラッシュがそのまま渡され、正規表現エンジンが正しく解釈できるようになります。

## 正規表現では常にraw文字列を使うべき？

Pythonの公式ドキュメントでも推奨されているように、**Pythonで正規表現を書くときは基本的にraw文字列リテラルを使うべき**です。

たとえ今すぐに問題が起きなくても、将来パターンを複雑にしたときにバグを防ぐためにも、習慣化しておくことが大切です。
```py
# 正規表現は必ず raw で書く習慣を！
pattern = r"\w+@\w+\.\w+"
```
このように書くと、メールアドレスなどのパターンも安全に扱うことができます。

## raw文字列リテラルの注意点（正規表現版）

- raw文字列リテラルでもクォート（`"`や`'`）は通常通り扱う必要がある
- 最後にバックスラッシュだけ置くとエラーになる（これは正規表現に限らず）
- `r"..."r"..."` のように `r` を2回連続して書くことはできない
- 複雑なパターンでも、rを付けるだけでエスケープミスが防げる

## まとめ

- 正規表現は文字列のパターンを表現するための強力な仕組み
- Pythonで正規表現を書くときは、バックスラッシュを多用するためraw文字列リテラル（`r"..."`）を使うのが基本
- 普通の文字列で書くとPython側のエスケープ処理が邪魔をしてうまくいかないことがある
- バグを防ぐためにも、**正規表現を書くときは常に`r"..."`を付ける習慣をつける**
Databricks MCPサーバー(β)

こちらのポストで知りました。

https://www.linkedin.com/posts/jagrit-behl_databricks-joins-the-mcp-ecosystem-with-activity-7322716145776537601-OEmK?utm_source=share&utm_medium=member_desktop&rcm=ACoAAAjQIw8BnhUCVFUi3TMpsoSsxz2GAlQilw4

ソースはこちら。

https://github.com/databrickslabs/mcp/tree/master

今時点ですと、Unity Catalog周り、主にGenieのサポートなどに限定されています。期せずして、以前実装したものと近い感じです。

https://qiita.com/taka_yayoi/items/b29edb7daa50057d9e36

動かしてみます。

:::note info
**注意**
こちらはLabsで提供されているベータ版で、Databricksが正式に[サポートするものではない](https://github.com/databrickslabs/mcp/tree/master?tab=readme-ov-file#support)ことにご注意ください。SLAも提供していません。
:::


# ローカルマシンの設定

クローンします。

```sh
git clone https://github.com/databrickslabs/mcp
```

`uv`でPythonをインストールします。

```sh
uv python install 3.12
```

接続先のDatabricksのホスト名やパーソナルアクセストークンを取得しておきます。

# Claude Desktop

エラーが起きた際のログが確認しやすいので、Claudeから。

```json
{
  "mcpServers": {
    "databricks_mcp_server": {
      "command": "uv",
      "args": [
        "--directory",
        "/Users/takaaki.yayoi/cursor/databricks_mcp/mcp/servers/unity_catalog",
        "run",
        "unitycatalog-mcp",
        "-s",
        "takaakiyayoi_catalog.agents",
        "-g",
        "01f019c4932013e0a372e3e9b8a6bc9d,01ef2ed5c71b110bac27ddbacc77588e"
      ],
      "env": {
        "DATABRICKS_HOST": "https://<Databricksワークスペースのホスト名>",
        "DATABRICKS_TOKEN": "<パーソナルアクセストークン>"
      }
    }
  }
}
```

**running**になりました。

![Screenshot 2025-04-29 at 20.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7aa238db-f5b8-4436-b7b5-eed75a5b219b.png)

Genieを使うような問い合わせをすると、ツールの使用を何度か求められます。

![Screenshot 2025-04-29 at 20.02.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9207f99d-578f-45af-975d-9c579e1b6190.png)
![Screenshot 2025-04-29 at 20.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e5e24d02-aff8-4234-bdbc-37edb9b90de2.png)
![Screenshot 2025-04-29 at 20.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3487bc7d-2ccd-4e06-ad09-5098dd3df23d.png)

動きました。

![Screenshot 2025-04-29 at 20.03.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b449463d-dce1-4c10-b718-a4dde1cc54f0.png)

# Cursor

同じ設定でこちらも動きました。

![Screenshot 2025-04-29 at 20.16.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9034855c-4aad-42be-8965-5f68d8f85a36.png)

[Developerツール](https://github.com/databrickslabs/mcp/blob/master/servers/developer_tools/README.md)を使うサーバーも準備中とのことなのでこちらも楽しみにしてます。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【SwiftUI】GeometryReaderで取得するサイズとUIScreen.main.boundsで取得するサイズの違い

## 背景
SwiftUI実装している時に、画面サイズに応じて文字や画像サイズを変更したいと思い色々調べていたところ`GeometryReader`と`UIScreen.main.bounds`という2つのサイズ取得方法が出てきたので備忘がてら残しておこうと思います。

## GeometryReader

Viewの一種であり、VStackやHStack等と同様にView階層内に宣言をする必要がある。
GeometryProxyから以下の情報を取得することができる。
**・自Viewのサイズ**
**・親Viewからの位置情報（x軸,y軸）**

#### サンプル
これだけだとイメージがつかないと思うので、実際に画面イメージを見ていきたいと思います。
**View構成**
ContentViewに子Viewが8個ある。
```
ContentView（親View）
└ DetailCellView（子View）
```

- 🔴 左上の赤丸部分
子ViewのX,Y座標を表す基準地点。
ここをx=0, y=0として子Viewの座標位置をGeometryProxyで取得する。
- 🔵 青丸の部分
DetailCellViewの一番右上のViewのX軸、Y軸の地点。
この場合は基準地点からX軸方向に201、Y軸方向に62移動した地点が親Viewからの位置としてGeometryProxyで取得できる。
- Width / Height
DetailCellViewのサイズ。
位置情報（X,Y軸）と異なり子Viewのサイズが同じであれば全て同じサイズとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846857/14a734a6-ed5a-4c00-8107-e05f7db117a2.png)

ちなみに座標位置や子Viewのサイズは以下で取得可能です。
``` Swift
Text("X: \(Int(geometry.frame(in: .global).minX))")
Text("Y: \(Int(geometry.frame(in: .global).minY))")
Text("Width: \(Int(geometry.size.width))")
Text("Height: \(Int(geometry.size.height))")
```

## UIScreen.main（非推奨）

端末全体の画面サイズ（ナビバー、タブバーを含めた物理的な画面サイズ）
つまり端末（iPhone 16, iPad 13 etc）によりサイズは固定となっている。

#### ★UIScreen.mainは非推奨になった★
マルチウィンドウ対応を想定して非推奨になった。（と思われる。）

iOS13以降は複数ウィンドウを持つアプリもサポートするようになった。
それにより端末ごとの固定サイズを設定するとレイアウトが崩れてしまう可能性が出てくる。
例えば、
1\. iPadでアプリを２画面表示（SplitView）
2\. iPhoneでApp ClipやQuick Noteのような一時的ウィンドウ
3\. macOS Catalystでウィンドウを複数開くアプリ

UIScreen.mainではデバイスのメイン画面を指しているため、
- マルチウィンドウで表示している時
- 外部ディスプレイに表示している時

でも常にアプリインストールしている端末のサイズ固定になってしまい、現在のウィンドウが表示されている値と無関係の値となるためレイアウトが崩れてしまう。

### どうするか
#### .connectedScenesを使う
.connectedScenesとは、アプリが今接続しているsceneを返すプロパティです。
具体的には、動作している可能性があるsceneを位置に限らず返します。位置に限らずとは前画面にあるか背景にあるか画面外にあるかに限らずという意味です。
ただし、複数のUIWindowSceneが入っている可能性があるため、必ずしも`first`で欲しい値が取得できるとは限らないので注意が必要です。
``` Swift
let window = UIApplication.shared.connectedScenes.first as? UIWindowScene 
window.screen.bounds.width
```

### まとめ
- **GeometryReader**
Viewに親子関係があり、親Viewからの位置や子View自身のサイズを取得したい場合に使用する。
- **UIScreen.main.bounds**
Apple非推奨となったため原則使用しない方が無難。
- **.connectedScenes**
画面サイズを取得したい場合は従来のUIScreen.main.boundsの代わりにこちらを利用する。

## 参考
https://zenn.dev/egg_head/articles/3391fb9fa0163d

https://qiita.com/yusame0308/items/c738a06cd56ddf6aa490

https://zenn.dev/egg_head/articles/3391fb9fa0163d
【Python初心者】エスケープシーケンスとraw文字列リテラルの基礎まとめ

Pythonで文字列を扱うとき、バックスラッシュ（`\`）を使った特殊な記号を見かけたことはありませんか？  
これは「エスケープシーケンス」と呼ばれる仕組みで、Pythonでは文字列操作に欠かせない知識です。

この記事では、エスケープシーケンスの基本と、バックスラッシュを特別扱いさせない方法「raw文字列リテラル」について、わかりやすく整理します。

## エスケープシーケンスとは？

エスケープシーケンスとは、バックスラッシュ（`\`）を使って、**文字列内で特殊な指示を出す**ための書き方です。  
通常の文字列処理を「逃れる（escape）」という意味から、この名前が付けられています。

よく使われるエスケープシーケンスは次のとおりです。

| 記号 | 意味              | 出力例         |
|------|-------------------|----------------|
| `\n` | 改行              | 改行される     |
| `\t` | タブ（空白）      | 空白が入る     |
| `\\` | バックスラッシュそのもの | `\`     |
| `\'` | シングルクォート  | `'`            |
| `\"` | ダブルクォート    | `"`            |

### 実際の例

#### `\n` 改行
```py
print("Hello\nWorld")

# 出力
Hello
World
```

#### `\t` タブ（空白）
```py
print("Python\tis\tfun")

# 出力
Python    is    fun
```

#### `\'` シングルクォート
```py
print('It\'s a pen.')

# 出力
It's a pen.
```

#### `\"` ダブルクォート
```py
print("She said, \"Hello!\"")

# 出力
She said, "Hello!"
```

## エスケープシーケンスに注意すべき場面

例えばWindowsのファイルパスを文字列で書くとき、
```py
print("C:\Users\Name\Desktop")
```
このように書くと、`\U` や `\N` が未定義のエスケープシーケンスとして誤解釈され、エラーや意図しない動作になることがあります。

Pythonでは、バックスラッシュが出現した時点で「これはエスケープシーケンスかも？」と考えてしまうためです。

## バックスラッシュを「そのまま」使いたいとき

バックスラッシュを通常の文字として使いたい場合は、2回書く必要があります。
```py
print("C:\\Users\\Name\\Desktop")

# 出力
C:\Users\Name\Desktop
```
しかしこれでは毎回バックスラッシュを2回書く必要があり、非常に面倒です。

ここで便利なのが「raw文字列リテラル」です。

## raw文字列リテラルとは？

raw文字列リテラルとは、文字列リテラルの前に `r` を付けることで、  
**バックスラッシュを特別扱いせず「そのままの文字」として扱う**方法です。
```py
print(r"C:\Users\Name\Desktop")

# 出力
    C:\Users\Name\Desktop
```
バックスラッシュをエスケープせず、見たままの形で文字列として扱えます。

### 書き方まとめ

- 通常の文字列：`"文字列"`
- raw文字列リテラル：`r"文字列"`

`r` は必ず文字列の**直前**に書きます。

## raw文字列リテラルの注意点

### 1. 最後にバックスラッシュだけ置くとエラーになる

raw文字列でも、最後がバックスラッシュのままだと構文エラーになります。
```py
# ❌ エラー例
 print(r"C:\Users\Name\")
```
対策としては、連結を使うか、バックスラッシュを2つ書きます。
```py
# ✅ 正しい例
print(r"C:\Users\Name" "\\")

# または
print(r"C:\Users\Name\\")
```
### 2. クォートは必ず半角で！

Pythonでは、文字列を囲むクォート（`'` や `"`）は**半角**でなければなりません。  
全角クォート（`“`や`”`）を使うと文法エラーになります。

### 3. `r"..."r"..."` のように `r` を2回連続では書けない

次のように書くとエラーになります。
```py
# ❌ エラー例
print(r"C:\Users" r"\Name")
```
raw文字列リテラルは、**1つの文字列リテラルの前にだけ** `r` を付ける必要があります。  
連結するときは通常の文字列として連結するか、別の工夫をしましょう。
```py
# ✅ 正しい例
print(r"C:\Users" "\\Name")
```
または一続きのraw文字列で書きます。
```py
print(r"C:\Users\Name")
```
### 4. クォート文字そのものを含めたい場合は注意が必要

raw文字列でもクォート記号（`'` や `"`）を含める場合は、エスケープが必要です。
```py
# ✅ 正しい例
print(r"He said, \"Hello!\"")
```
raw文字列はバックスラッシュのエスケープを無効にしますが、クォート記号に関しては通常の文字列ルールと同じ扱いになります。

## まとめ

- エスケープシーケンスは、バックスラッシュを使って特殊な動作を指示する記法
- 例：`\n`（改行）、`\t`（タブ）、`\\`（バックスラッシュそのもの）、`\'`（シングルクォート）、`\"`（ダブルクォート）
- バックスラッシュをそのまま使いたいときはraw文字列リテラル（`r"..."`）を使う
- raw文字列リテラルでも、末尾バックスラッシュやクォートには注意が必要
- Windowsパスや正規表現を書くときに特に役立つ

エスケープシーケンスとraw文字列リテラルを正しく理解することで、  Pythonの文字列操作が格段にスムーズになると感じました。
Flask 画像アップロード

# お決まり文

```ruby:
from pathlib import Path
from werkzeug.utils import secure_filename

from flask import send_from_directory

app.config['UPLOAD_FOLDER'] = '/path/to/uploads'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16MB 制限
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
```

### [html]画像アップロード画面

```ruby:
<form method="POST" enctype="multipart/form-data">
<input type="file" name="file">
</form>
```

### ファイルアップロード処理

```ruby:ファイル拡張子が。".jpeg"/ ".png"かチェック
def allowed_file(filename):
    # 拡張子をチェック（ドットがあって許可リスト内か）
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS 
```

```ruby:ファイルサイズ指定
app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024
```

```ruby: アップロードするファイルのセキュリティ強化
filename = secure_filename(file.filename)
```

```ruby:アップロードフォルダ"upload"がなかったらフォルダ作成
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
            file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
```

```ruby: アップロードしたファイル表示
@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)
```

```ruby: mypageでファイルアップロード処理
def upload():
    if request.method == 'POST':
    
        if 'file' not in request.files:
        # アップロード時、ファイル選ばれてない
            flash('ファイルがありません')
        return redirect(url_for('mypage'))

    file = request.files['image']
    # 画像として読み込み

    if file.filename == "":
        # 画像に、ファイル名なし
        flash("ファイル not found")
        return redirect(url_for('mypage'))

    if file and allowed_file(img.filename):
        filename = secure_filename(file.filename)

        os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
        file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
        file.save(file_path)  # 保存処理
    return redirect(url_for('uploaded_file', filename=filename))
    # GET時はアップロードフォームを表示
    return render_template('mypage.html')
```

### ファイルアップロードでSQLAcademy使う時

```ruby:
   画像名
   アップロード日時、
   ユーザー名
   ユーザーid がいる
```

### 宿題

```ruby:スクショ html 自動　PDF化
web html PDF化 : WeasyPrint
from weasyprint import HTML
HTML('<img src="static/uploaded.png">').write_pdf("output.pdf")
```

```ruby:html 自動　PDF化　ロジックヒント

・フォームのテキストをHTMLに変えて渡す）
・文字サイズやレイアウトを変える

class DataForm(FlaskForm):
    content = TextAreaField('内容', validators=[DataRequired()])
    submit = SubmitField('PDF作成')

<form method="POST">
    {{ form.csrf_token }}
    {{ form.content.label }}<br>
    {{ form.content(rows=10, cols=50) }}<br>
    {{ form.submit() }}
</form>

@app.route('/pdf', methods=['GET', 'POST'])
def create_pdf():
    form = DataForm()
    if form.validate_on_submit():
        text = form.content.data
        # この text を HTML に入れて WeasyPrint などで PDF 化
```

```ruby:たくさんスクショ 自動でPDF "img2pdf"
from flask import Flask, send_file
import img2pdf

app = Flask(__name__)

@app.route("/download-pdf")
def download_pdf():
    with open("image.png", "rb") as img_file:
        pdf_bytes = img2pdf.convert(img_file)

    with open("output.pdf", "wb") as f:
        f.write(pdf_bytes)

    return send_file("output.pdf", as_attachment=True)
```

### 後で勉強用

https://zenn.dev/suyaa/articles/30d23448d4d472