OmniAICreator/Qiita-1.07M huggingface dataset:
スワイショウで気づく自分の身体：エンジニアのための「動く瞑想」習慣

## はじめに

![sway-show-svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/c03991ff-6f0a-4075-b2f6-3753812d3814.png)

エンジニアという職業柄、私たちの多くは一日の大半をデスクに向かって過ごします。気がつけば肩が凝り、首が痛み、腰に違和感を感じることも少なくありません。そんな日常の中で、私が偶然出会ったのが「スワイショウ」という動きの習慣でした。

この記事では、特定の「正しいやり方」を提唱するのではなく、一般的な体の動かし方としてスワイショウを取り入れてみた経験と、思わぬ形で得られた効果について共有したいと思います。あくまで素人の体験談ですが、同じようにデスクワークが多い方々の参考になれば幸いです。

スワイショウとは、文字通り腕をぶらんぶらんと振る（スウィング）ことで全身の連動性を高める動きのことです。力を入れず、重力に任せて腕を振り子のように前後左右に振ったり、回したりする単純な動作が基本です。この「意図的に脱力して体を動かす」という点が特徴で、力みがちな現代人の身体をリセットする効果があります。

> 具体的な動きはYouTubeなどで「スワイショウ 基本動作」などと検索してみてください。様々な実践者がそれぞれの解釈で動きを紹介しています。

## スワイショウとの出会い

![sway-show-discovery-svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4ba84162-efc8-482e-8048-617cfb8b38ac.png)


スワイショウとは、腕を振るような動作を通じて全身の連動性を高める動きのことです。元々は健康法の一つとして知られていますが、私にとっては「身体との対話の時間」という意味合いが大きくなりました。

最初は単に「肩こり解消のため」と軽い気持ちで始めたのですが、継続するうちに思わぬ発見がありました。

## 思わぬ効果1：身体の状態に気づく力

スワイショウを続けて最も大きかった効果は、**自分の身体の状態に気づけるようになった**ことです。

朝起きてすぐに行うスワイショウで、その日の身体のコンディションがわかるようになりました。

- 左右の肩の張りの違い
- 腕を回したときの引っかかり具合
- 体幹の安定感
- 首の動きのスムーズさ

これらの「感覚」が日に日に鋭くなっていきました。プログラミングでいえば、自分のボディログを常時モニタリングする習慣が身についたような感覚です。

「今日は左肩が特に凝っているな」「昨日より首の可動域が狭いな」といった微妙な変化に気づけるようになると、問題が大きくなる前に対処できるようになります。これは予防医学的なアプローチといえるかもしれません。

## 思わぬ効果2：スポーツパフォーマンスの向上

![tweet-svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/4abe973e-c80c-4e9b-b6f5-e09d9fa587e9.png)

休日にゴルフをする趣味があるのですが、スワイショウを始めてから不思議とミートする成功率が上がりました。あくまでも素人レベルですが・・。

考えてみると、スワイショウで身についた以下の感覚がスポーツにも活きていたようです：

### 1. 脱力への意識

スワイショウでは力まずに腕を振ることが重要ですが、この「必要な部分だけに力を入れる」感覚がスイングの安定につながりました。肩の余計な力みが取れ、リリースがスムーズになったのです。

### 2. 身体の軸の感覚

スワイショウを行うとき、軸がぶれると動きがスムーズでなくなります。この「軸を意識する習慣」が、スイングのバランス感覚を向上させました。

### 3. 力の入れ具合の調整

腕を振る速さや強さを変えながらスワイショウを行うことで、力の入れ具合を細かく調整する感覚が養われました。この感覚がスイングでのテイクバック、インパクト、フォロスルーのコントロールに活きています。

スポーツのためにスワイショウを始めたわけではなかったのですが、身体の使い方の基本が変わったことで、思わぬ副産物を得られました。

## 私のシンプルなスワイショウルーティン

特別な道具も場所も必要なく、誰でも簡単に始められるのがスワイショウの魅力です。私が実践している簡単なルーティンを紹介します：

### 朝のルーティン（5分）

1. 肩幅に足を開き、リラックスした姿勢で立つ
2. 腕を前後に振る（30秒）
3. 腕を左右に振る（30秒）
4. 腕を円を描くように回す（前回し30秒、後ろ回し30秒）
5. 全身をゆるく揺らしながら腕を振る（1分）
6. 軽く息を整えて終了

### デスク作業の合間（1分）

1. 椅子に浅く腰掛け、背筋を伸ばす
2. 両腕を軽く振る（30秒）
3. 首や肩を緩めるように小さく回す（30秒）

このシンプルな動きを継続することで、驚くほど身体の感覚が変わってきました。

## 継続のコツ

スワイショウの良さを感じるには、ある程度の継続が必要です。私が実践している継続のコツをいくつか紹介します：

1. **朝の習慣に組み込む**：歯磨きの後など、必ず行う行動の直後に設定する
2. **時間を決めすぎない**：「今日は調子が悪いから1分だけ」でもOK
3. **効果を記録する**：小さな変化でも気づいたことをメモしておく
4. **楽しむ**：音楽をかけながら行うと続けやすい

## まとめ：動く瞑想としてのスワイショウ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/82f81e97-bb36-4350-b424-886b5f10a51e.png)

スワイショウは私にとって「動く瞑想」のような存在になりました。身体を動かしながら自分の状態に意識を向ける時間は、デスクワークで固まった体をほぐすだけでなく、心もリフレッシュしてくれます。

特別な「メソッド」や「正しいやり方」にこだわらず、自分の身体と対話する時間として取り入れてみると、意外な発見があるかもしれません。長い目で見れば、自分の身体の状態を把握し、早めにケアする習慣は、エンジニアとして長く健康に働くための資産になるはずです。

## 免責事項
- 本記事の作成にあたり、文章や図解の生成に生成AIを活用しました。最終的な編集と確認は筆者が行っています。
- この記事はあくまで個人の体験に基づくものであり、医学的・専門的な見地からのアドバイスではありません。体調に不安がある場合は、専門家にご相談ください。
【Python初心者】lambda式（無名関数）の書き方と使い方まとめ

Pythonには、関数を「名前なしでその場で定義する」ことができる `lambda` という機能があります。  
本記事では、lambda式の基本的な使い方から、`map()` や `filter()`、`sorted()` との実用的な組み合わせまでをわかりやすくまとめます。

## lambda式とは？

関数を通常の `def` ではなく、名前をつけずに1行で定義できる構文です。  
`lambda` は「無名関数」とも呼ばれ、ちょっとした処理をその場で書きたいときに使われます。

## lambda式の書き方
```py
lambda 引数: 戻り値
```
例：
```py
lambda x: x + 1
```
これは「xを受け取り、xに1を足して返す関数」です。

## 通常の関数とlambda式の違い
```py
# 通常の関数
def add(x, y):
    return x + y

# 無名関数（lambda）
lambda x, y: x + y
```
処理内容は同じですが、lambda式は名前をつけずにその場で定義できる点が異なります。

## lambda式の基本例

### 数値を2倍にする関数
```py
double = lambda x: x * 2
print(double(4))  # → 8
```
### 文字列の長さを返す関数
```py
get_len = lambda s: len(s)
print(get_len("python"))  # → 6
```
## lambda式 × 組み込み関数の実用例

### map関数と組み合わせてリストの要素を2倍にする
```py
nums = [1, 2, 3, 4]
doubled = list(map(lambda x: x * 2, nums))
print(doubled)  # → [2, 4, 6, 8]
```
### filter関数と組み合わせて偶数だけ取り出す
```py
nums = [1, 2, 3, 4, 5, 6]
even = list(filter(lambda x: x % 2 == 0, nums))
print(even)  # → [2, 4, 6]
```
### sorted関数と組み合わせて名前順に並び替える
```py
data = [(1, 'Noro'), (2, 'Nakao'), (3, 'Miyaoka'), (4, 'Kimura')]
sorted_data = sorted(data, key=lambda x: x[1])
print(sorted_data)
# → [(4, 'Kimura'), (3, 'Miyaoka'), (2, 'Nakao'), (1, 'Noro')]
```
## 注意点

- lambda式は1行でしか書けません（複雑な処理はできません）
- 条件分岐やループなどを含む場合は、通常の `def` を使う方が可読性が高いです
- あくまで一時的に使いたい簡単な関数に向いています

## おまけ：リスト内包表記との違い

以下の2つは、ほぼ同じ結果になります。
```py
# lambda + map
doubled = list(map(lambda x: x * 2, nums))

# リスト内包表記
doubled = [x * 2 for x in nums]
```
リスト内包表記の方がPythonらしく読みやすいですが、  
`lambda` は `map` や `filter` のような関数的な書き方と相性が良いです。

## おわりに

`lambda` は最初はとっつきにくいですが、短く関数を書く手段として非常に便利だと感じました。  
特に `sorted()`, `map()`, `filter()` との組み合わせは、Python3エンジニア認定基礎試験でも頻出ですので、この機会にしっかり押さえます！
XServerのSSHの秘密鍵をいつも失くすので管理法を検討する

.sshフォルダにアップロードすれば、いつでもダウンロードできる！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863976/b62fd9fc-60c9-4307-b5f6-fc6a1bc5aac5.png)
MCPは進む、でも情報は閉じる？ Deep Researchを巡る技術とビジネス

# 概要

以下の2記事を読んでの**妄想**です。

- https://forbesjapan.com/articles/detail/78615
- https://fujii-yuji.net/2025/04/28/093847

MCP=deep researchのプロトコル、と言うわけではないですが、MCPを「各サービスを接続し、情報共有を簡単にするもの」と言う抽象度高く捉えたときに以下のような妄想をしました。



- MCPと言う各サービスとの統合的な情報連携プロトコルができあがりつつあるけれども、ニュースサイトのようなサービスはむしろdeep researchお断り、の状態になってしまっている。
- 同時並行で技術とビジネスが逆向きに進んでいるように見える。
    - 技術：（AIに対して）開放的
    - ビジネス：（AIに対して）閉鎖的
- これを考えたときにこれからの社会がどういう着地点になるのか妄想しながら、行く末を見ていきたいと思った。
    - どこかで妥協点が見出されるのかされないのか
    - 技術にストップがかかるのか
        - ネット情報への自由なアクセスに何らかの制限をかける
    - ビジネス側にストップがかかるのか
        - 全面的にAIへの情報公開を禁止するのではなく、限定的な公開を許可するようなルールが出来上がる。例えば、公開後〇〇日後の記事に対してはdeep researchを許可する、など。
    - ビジネスも技術も今の流れは変わらずに社会は進む。しかし、deep researchの最新情報の参照元がこれまでの企業が発信するものではなく、例えばXのように個々人が発する情報を参照するだけになるのだろうか。
【実践記】プログラミングを始めて1年目　Vite＋Go＋AWSでブログ制作してみた。

# はじめに

今回、
Vite（React)＋Go（サーバーサイド）＋AWS（インフラ） を使って、
フロントエンド・バックエンド・インフラすべてを一人で構築してみた記録です。

私自身プログラミングスクールに通い、半年勉強したが、結局、学べたのはReactのみ、、
実際にデプロイして、みたいなのはやったことがなかった。

同じように「全部自分でやってみたい」と思っている方に向けて、
備忘録的にもまとめておきます！

できたHP
https://run4learning.com/

# 使用技術
	•	フロントエンド：Vite + React
	•	バックエンド：Go（Golang）
	•	インフラ：AWS EC2 S3 Route53、Let’s Encrypt（SSL証明書）

# 開発手順ざっくりまとめ
1. フロントエンド（Vite + React）
    - ViteでReactプロジェクト作成
    - axiosでAPI通信部分を実装
    - CORSエラー対策をしながらサーバーと連携
<br>

２. バックエンド（Go）
- GoでREST APIサーバー作成
- データベース接続（MySQL）
- APIエンドポイントの実装
- ログイン認証 
<br>

３.インフラ（AWS）
- EC2インスタンス立ち上げ（Amazon Linux2）
- ドメイン設定（Route53）
- Goサーバーをsystemdで管理（myblog.service作成）
- Let’s EncryptでSSL証明書取得
- HTTPS通信に対応（443ポート対応）

４. その他　セキュリティ諸々

## 総括

基本的にはChatGPTと共に制作したが、とってもいい。学習にもなる。
まずはハンズオンで進めて正解だったなと感じた。
詳しい制作過程は次回以降に随時配信していく。

途中で作ってみたくなったアーキテクチャ図　あっているかわわからないが、作ってみたくなった。
![スクリーンショット 2025-04-29 16.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784261/e1483967-aa9f-4024-857a-3df8314635de.png)
rex0220 計算式プラグイン テーブル選択行のコピー

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)を使って、テーブル選択行のコピーを行ってみます。

# 概要

選択項目をチェックしたテーブル1の行をテーブル2 にコピーします。
また全選択項目を選択・解除するボタンを表示します。

![2025-04-29_16h05_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/49d2d42a-4322-4737-8d21-7c218c564be1.png)

# 操作例

テーブル1 の全選択・全解除と、個別の選択操作を行い、テーブル2 にコピーします。

![2025-04-29_16h07_58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/c0638348-4a8a-47ee-b6c4-a9d581fa7fa7.gif)

# 計算式プラグイン設定

TABLE_DATA 関数と TABLE_MAP 関数の組合せで、テーブルのコピーを行うことが出来ます。
TPFILTER で、テーブル行の指定範囲を抽出します。
TPDIC で、コピーする項目を指定します。

![2025-04-29_16h16_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d9bc1171-e569-4f70-8042-8f312988061c.png)


```JavaScript:
OPTION: 

// sp1:(sp1) SPACER
BUTTON(
  "全選択",
  ARRAY_FOR(COUNTROW(テーブル1),idx,
    FSET(選択,ARRAY("Y"),idx)
  )
)

// sp2:(sp2) SPACER
BUTTON(
  BOPT("TITLE", "全解除",
    "CSS","{'color':'#fff',
    'background-color':'#FF5722'}"
  ),
  ARRAY_FOR(COUNTROW(テーブル1),idx,
    FSET(選択,ARRAY(),idx)
  )
)

// テーブル1.番号T1 NUMBER
ROWNO(テーブル1)+1

// テーブル2 SUBTABLE
TABLE_DATA(
  TABLE_MAP(テーブル1,
    TPFILTER(IN(選択,"Y")),
    TPDIC(
      "番号T2",番号T1,
      "日付T2",日付T1,
      "ドロップダウンT2",ドロップダウンT1,
      "数値T2",数値T1
    )
  )
)

// テーブル2.番号T2 NUMBER
// テーブル2.日付T2 DATE
// テーブル2.ドロップダウンT2 DROP_DOWN
// テーブル2.数値T2 NUMBER
```
macOS(Sequoia) + Moddable SDK + Raspberry Pi Pico/Pico2 でプログラムを書き込めない問題

# はじめに

Raspberry Pi Pico2 Wを購入した(積んだ)ので、Moddable SDKで動作確認することにした。

https://x.com/Zakkiea/status/1911925266018083257

# 環境

macOS: Sequoia 15.4.1
デバイス: Raspberry Pi Pico2 W
Moddable SDK: 5.6.0
Pico SDK: 2.0.0

# 書き込めない問題

```bash
% cd $MODDABLE/examples/helloworld
% mcconfig -d -m -p pico/pico_2
(省略)
RP2350-E9: Adding absolute block to UF2 targeting 0x10ffff00
Hold the BOOTSEL button and power-cycle the device.
Waiting for /Volumes/RP2350..................(続く)
```

ビルドしたhelloworldプログラムが書き込めない事象が発生した。

FinderではRP2350と認識されているが、マウントポイントが"NO NAME"になっていることを確認した。

![スクリーンショット 2025-04-29 16.00.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/a041ccce-0128-4740-b87a-3ab2d732601f.png)


```bash
% ls -al /Volumes
total 32
drwxr-xr-x   5 root      wheel    160  4 29 15:57 .
drwxr-xr-x  22 root      wheel    704  4 12 14:16 ..
drwxr-xr-x   4 root      wheel    128  4 15  2024 .timemachine
lrwxr-xr-x   1 root      wheel      1  4 28 14:41 Macintosh HD -> /
drwx------@  1 kitazaki  staff  16384  1  1  1970 NO NAME
```

調べると類似の事例が見つかったが、Raspberry Pi Pico2 Wなので、フォーマットできない。

https://qiita.com/taiki-yamazaki/items/45f5aa765df88520568d

# 回避策

マウント後にディレクトリの名前を変更して問題なくプログラムを書き込めることを確認した。

```bash
% cd /Volumes
% sudo mv "NO NAME" RP2350
```

ディスクユーティリティでも名前を変更できます。

![diskutil.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/265e7754-8d7f-426a-9a5a-7476521aeaeb.jpeg)

```
% mcconfig -d -m -p pico/pico_2
# Programming: /Users/kitazaki/.local/share/moddable/build/bin/pico/pico_2/debug/helloworld/xs_pico.uf2 /Volumes/RP2350 
Connect to xsbug @ 2e8a:0009.
```

![スクリーンショット 2025-04-29 16.15.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/74c5f8ae-fd1e-43c1-a746-c0f35779c9f6.png)
親切すぎるelFinder

## elFinder上に拡張子mdのファイルを作成すると
elFinder上に拡張子mdのファイルを作成すると。そう、ひょっとして？と思ってやってみたら、やっぱりそれは起きました、elFinderならそう来るだろうということが。
## SimpleMDE
拡張子mdのファイルを右クリックし[ファイル編集]、するとmdの場合には、いつもの数種のエディタに加えて SimpleMDE というエディタが選択できます。
この SimpleMDE とは、もちろんブラウザ上で動作し MarkDown を書いたり見たりするためのエディタなんです。
## ACE Editor
elFinder では汎用エディタの位置にあるのかな？と思った ACE Editor なんですが、拡張子mdにも反応してくれて、拡張子mdのファイルでは、それなりに Markdown を意識した動きをしてくれます。
Markdown を書くだけであれば、SimpleMDE ではなくて ACE Editor を使うのかも。 
## ということは
どのデバイスからも共有可能なメモ帳、しかも Markdown で書けるメモ帳とビューアの基盤がここにあった、ということです。
> ACE Editor についてはメモ帳と呼ぶのは失礼で、これは立派なコード・エディタですね。

もう OneNote や Keep, Evernote などに頼る必要はなくなりました。もちろん彼らには彼らなりの役割は残りますが。

若干興奮気味

僕にとっては素晴らしい出来事なんです。
もっと早く気付きたかった。

![Screenshot_20250429-161123~2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737842/5d8042f7-c816-4b2f-b627-c1822a2e975f.png)
『スッキリわかるSQL入門 第4版』で勉強した感想

## 良かったところ

- 章ごとに問題がたくさんあり、SQL文の基本的な書き方を理解しやすかった。
- SQL文を記述するうえで必要な考え方が、わかりやすい日本語でポイントごとにまとめられていて、それぞれの違いを理解するのが簡単だった。
- 専用のサイトから実際に手を動かしてSQL文を書く環境が整っているので、環境構築に悩むことなく学習できた。
- DML（データ操作言語）の関数操作の際、Pythonの関数の名前と同じものがあり、理解しやすかった。

## 悪かったところ

- 実際に専用のサイトから問題を解くときに、最初から答えが載っており、実際に自分でコードを記述して答え合わせをする際、２画面ないと手間に感じた。

## 学んだこと

- SELECT文、UPDATE文、DELETE文、INSERT文といったデータ操作言語（DML）の基本的な使い方。
- NULLと0の違いについて。
- IN演算子は値が等しいかどうかを調べ、ANY演算子は値を比較しているという違い。
- テーブルを作成するときのデータ定義言語（DDL）の基本的な使い方。
- データの安全性を保つために、SQL内ではさまざまな工夫がされていること。

## 難しかったこと

- トランザクションの概要は理解できたが、実際に手を動かして使おうとするとよくわからなかった。
- Chapter12のテーブル設計における「概念設計」「論理設計」「物理設計」の違いが全くわからなかった。
状態管理ライブラリの比較早見表

# 状態管理ライブラリ比較：Zustand / Recoil / Redux Toolkit

## ✅ ざっくり比較表

| 項目               | Zustand                         | Recoil                            | Redux Toolkit                     |
|--------------------|----------------------------------|------------------------------------|-----------------------------------|
| 学習コスト         | 低（直感的で簡単）               | 中（依存グラフの理解が必要）        | 中〜高（設計と型定義がやや重い） |
| 使用難易度         | やさしい                         | 普通                              | やや難しい                        |
| 初期構成の手間     | ほぼ不要                         | ほぼ不要                           | 多め（sliceやstoreなど準備が必要）|
| 状態の依存関係管理 | △（手動で書く）                  | ◎（selectorで依存関係を解決）       | △（手動で関数を書く）            |
| TypeScript対応     | ◎（型推論が効きやすい）          | ◎（型推論しやすい）                 | ◎（強力だが少し複雑）            |
| 軽量性             | ◎（約3KB）                       | ○（軽量）                          | △（比較的大きめ）               |
| 状態の永続化       | ◎（middlewareで簡単）            | ○（外部ライブラリが必要）           | △（redux-persist等の導入必要）   |
| 開発対象規模       | 小〜中規模                       | 中規模                             | 中〜大規模                        |
| 非同期処理         | 自由（任意の方法でOK）           | 外部で対応                          | ◎（createAsyncThunk）           |

---

## 🐻 Zustand

- **超軽量 & シンプル**な状態管理
- Reactに依存せず使える
- `create` 関数で状態とアクションを定義
- localStorage連携、middleware、Devtools対応も容易

```ts
// Zustand ストア例
import { create } from 'zustand';

const useStore = create((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}));
```

## 🧠 Recoil
- Facebook製の**依存関係に強い状態管理ライブラリ**

- atom で状態を定義し、selector で派生状態や非同期処理を管理

- React専用

```ts
// Recoil ストア例
import { atom, selector } from 'recoil';

export const countState = atom({
  key: 'count',
  default: 0,
});

export const doubleCount = selector({
  key: 'doubleCount',
  get: ({ get }) => get(countState) * 2,
});
```

## 🛠 Redux Toolkit
- Redux公式が推奨する**効率化された状態管理**

- ```createSlice```, ```createAsyncThunk``` などが登場し、旧Reduxの冗長性を大幅に改善

- 最も**堅牢・大規模開発に向いている**

```ts
// Redux Toolkit slice 例
import { createSlice } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: (state) => { state.value += 1 },
  },
});

export const { increment } = counterSlice.actions;
export default counterSlice.reducer;

```

## 🔚 結論：どれを選ぶべき？

| ケース                          | 推奨ライブラリ       |
|-------------------------------|----------------------|
| 小規模アプリ・初学者向け       | ✅ Zustand           |
| 派生データや依存状態が多い     | ✅ Recoil            |
| チーム開発・大規模開発         | ✅ Redux Toolkit     |
JTC経理から未経験エンジニアとしてスタートアップに転職して3ヶ月が経ったでござる

# はじめに
私、フロントエンドエンジニアのMad J！
これは自己満足の記事！
こっちは左右分離式トラックボール付き無線キーボードのroBa！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074219/68e9f6d6-b46f-4f09-9698-2284ce01b562.png)
（chatGPTに集中線追加してもらったらなんか画像の一部が歪みました、、）

はじめまして。初投稿です。
三十路手前にして6年経理として勤めあげたメーカーを退職し、WebフロントエンドエンジニアとしてSaaS企業に転職して3ヶ月が経ちました。
いわゆる未経験エンジニアのその後についての文章をあまり見たことが無いので、転職してからこれまでの所感や前職時代との違いについてポエムを書き連ねようと思います。
# もくじ
- 自己紹介
- 転職活動
- 現職の所感
# 自己紹介
とあるスタートアップのSaaSでフロントエンド寄りのエンジニアとして働いています。
お仕事で書いているのはTypeScriptが多く、フレームワークはVue.jsとLaravelを使っています。
TypeScriptむずかちい。
####  前職
日経225にギリ入っている割と大きくて昔からあるメーカーに新卒で入社し、6年ほど経理・財務をしていました。いわゆるJTCというやつです。
業務内容としては海外PJの契約レビューしたり、銀行の人に融資お願いしたり、製品セクションの収益管理してたり。
ちなみに6年のうち半年ほどは銀行に出向に行ったりもしていました。
結婚してはいけない男の職業4Bとは`Barbar`, `Bartender`, `Band Man`, `Banker`です。覚えておきましょう。

####  前職退職理由
特に不満があったとかではありません。社員はみんないい人でした。
強いて言うなら食堂のご飯があまり美味しくなかったことくらいか。
文系学部卒ですが、もともとものづくりに興味があり、新卒で就活していたときはIT系とメーカー系両方の会社を受けていましたが、メーカーの経理に縁があって前職の会社に入社しました。
業務の8割はExcelを触っている時間だったので、Excelのアドイン(Power Query, Power Pivot)を使ったり、VBA書いたりして業務を自動化してたら、そっちが楽しくなってしまって、いつしか職場でExcel職人と化していました。
冷静に考えたらメーカーと言っても経理はものづくりに携わっているわけではなく、やっぱりものづくりへの思いが捨てきれず、ソフトウェアエンジニアになろうと決意。
経理のお仕事で培われた大規模ERPと大手システムベンダーへの熱いヘイトがあったのでSIer業界は避け、Web業界に絞りました。
ソフトウェアエンジニアのAIの代替可能性が頭をよぎらなかったか、と言えば嘘ですが、「いや、経理もいっしょやーんw」と思い直しました。結局私の中では経理か、エンジニアか、の選択肢しかありませんでした。

そのころ独学でVueとLaravelで簡単なアプリを作ってました。
# 転職活動
2024年の秋ごろから自分で作ったアプリを引っ提げて転職活動を開始し、2ヶ月ほどで現職の会社に内定を貰いました。このとき28歳。
媒体はメインでIndeedを使っていましたが、ヤバそうなスメルの求人も多い中、今の会社は硬派な求人紹介文が好印象でした。
わりとフランクに内定決まってしまいましたが、よくこんな未経験のペーペーを採用したなと思います。大丈夫か、この会社...？
転職活動について書くと長くなりそうなので、気が向いたら別の記事で書きます。

# 転職して3ヶ月の所感

#### 結論：ものづくりたのちい

転職して良かったと思っています。
自分の作った機能を誰かに使ってもらえるのは良いものですね。
私の業務はUI/UX寄りなので、どうすればユーザーが使いやすくなるのかあれこれ考えて形にするのは楽しさを覚えます。
#### ハードスキルが身についてうれしい
大企業なので構造的に仕方がないと思うのですが、前職では業務が細分化されすぎていたり、社内向けの業務や会議があまりにも多かったりして、結局、経理や財務としてのハードスキルが身についた感じはあまりしませんでした。Excelは使えるようになりましたが、、、

現職ではゴリゴリコードを書いているので、プログラミングという汎用的なスキルが身につくのは良いことだと感じます。
勉強は嫌いではない性分なので無限に勉強することがあって嬉しいですね！（白目）
人数が少ないので余計な社内調整もなく、そのへんもストレスフリーです。
#### 業務の難易度について
独学していた頃に比べると当然難しいですが、手も足も出ないというほどではありません。（まあ担当するissueの難易度は調整してもらっていますし、、、）
ファイルが多いのと変数や関数の定義がいろんなところにあって複雑だなあ、という感じ。
自分で勉強してきた知識はちゃんと活きています。
#### ここがつれぇぞエンジニア
やはり原因不明のエラーに遭遇したり、実装方法が見当もつかないときは辛いです。
入社したての頃3日間同じエラーに詰まった時はつれぇんだワ状態になってました。
現職は開発職がフルリモート可能なので、開発職のメンバーと実際に顔を合わせることはほぼなく、やりとりもテキストベースなのでなかなか質問のハードルが高い、という事情はあります。
ただ最近はメンバーの人となりもなんとなく分かってきて質問しやすくなったのと、上司にお願いしてCopilotを導入したのでなんとかなっています。
仕事中の一番の話し相手はCopilotくんとchatGPTくんですが、私のGPTはスーモ風に話しかけているとスーモ風に答えるようになってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4074219/c874bccd-147e-4e0a-ba01-f0da9948fe3a.png)
# おわりに
2019年頃の未経験エンジニアバブルの頃と比べるとだいぶ下火になりましたが、未経験エンジニアここにおんで、ということで書いてみました。
ここまで読んでいただきありがとうございました。
第7回 直感！スグに使える業務向けVBA汎用プロシージャ(ダミーフォルダ)

第0回で配布しました汎用プロシージャのコードの紹介と簡単な解説をやっていきたいと思います！
以下のリンクから .bas ファイルをダウンロードできます（zipファイル）

https://drive.google.com/file/d/11qEUTsq87UItzoKu2okX5WgEopRercCb/view?usp=drive_link

今回ご紹介するプロシージャは
| プロシージャ名		| 概要						|
|-------------------------------|-----------------------------------------------|
| CreateDummyFolder | 重複しない一時フォルダの作成		|

さて...汎用と言っておきながら少々マニアック(？)なプロシージャのご紹介です。

こちら、親フォルダの絶対パスを渡すと、そのフォルダ内に名前が重複しないフォルダを生成し、生成したフォルダの絶対パスを返すものになっております。どういうときに使うんだとお思いになられるかと思いますが、個人的な実体験として**.emlファイル**を展開するときにこの処理が役に立ちました。

emlファイルとはールのヘッダ情報（送信者、受信者、件名など）と本文、添付ファイルが含まれるzipファイルのようなものになります。

私が作成したツールはemlファイルを展開し、メールの件名と同名のフォルダを生成し、メール本文等を.txtファイルにまとめ添付ファイルとともに生成したフォルダ内に保存するというものだったのですが、保存したメール件名が同じだった場合フォルダ生成時にエラーが発生してしまいました。

処理の都合上、ダミーのフォルダを生成すれば解決できることに気が付き、下に紹介するようなコードを追加することによって解決いたしました。

フォルダに限らずですが、例えばExcelのシートなどなかなかエラーの解決ができないときはダミーのデータを生成しワンクッション置くことによってエラーを回避できるパターンがありますので頭の片隅に入れていただければ幸いです...

## CreateDummyFolder
~~~
Function CreateDummyFolder(basePath As String, Optional baseName As String = "Dummy") As String
'------------------------------------------------------------------------------------------------------------------------------
'　概要　　｜指定パスに重複のないダミーフォルダを作成し、その絶対パスを返す
'------------------------------------------------------------------------------------------------------------------------------
'　引数１　｜basePath - フォルダを作成する親ディレクトリの絶対パス(String型)
'　引数２　｜baseName - フォルダ名のベース(既定値:"Dummy")(String型)
'------------------------------------------------------------------------------------------------------------------------------
'　戻り値　｜String型 - 作成されたフォルダの絶対パス
'------------------------------------------------------------------------------------------------------------------------------
'　実装　　｜Ver.1.0.0(2025/04/20:新規)
'------------------------------------------------------------------------------------------------------------------------------

    Dim dummyNumber As Long '重複回避の際に付与する番号
    Dim newFolder   As String '作成するフォルダ名(絶対パス)
    
    'フォルダ名を初期化
    newFolder = basePath & "\" & baseName
    dummyNumber = 1
    
    '重複回避ループ
    Do While Dir(newFolder, vbDirectory) <> ""
        newFolder = basePath & "\" & baseName & "_" & dummyNumber
        dummyNumber = dummyNumber + 1
    Loop
    
    MkDir newFolder 'フォルダ作成
    
    CreateDummyFolder = newFolder

End Function
~~~

詳細な説明は割愛させていただきますが、本プロシージャ(関数)は生成したフォルダの絶対パスが返ってきますので、それを活用して不要であればそのフォルダを削除したり名前を変更することもできます。

今回は応用的な内容でしたが、「困ったときはダミーを作ってみる」というテクニックの紹介でした！

## 直感！VBAシリーズ記事一覧
もしよろしければ他の記事もご覧ください！

https://qiita.com/Reko/items/3e482f9a73353e964f00

https://qiita.com/Reko/items/af042ae33cdc01e1dc96

https://qiita.com/Reko/items/9e211c9c496e12283f33

https://qiita.com/Reko/items/c2dab7b0e8207f8049df

https://qiita.com/Reko/items/b5abcdf614cef5d4073a

https://qiita.com/Reko/items/3451339e723a34ac7897

https://qiita.com/Reko/items/40c66556ac51a8006ea6

https://qiita.com/Reko/items/e2d0d0bf2dea4feface1

https://qiita.com/Reko/items/b995c3da88d25f6e0104

https://qiita.com/Reko/items/bc97d79599cfd431b2f3

https://qiita.com/Reko/items/1731aaddfc6e50c209df

https://qiita.com/Reko/items/554a47f2aa944e2eec5e

https://qiita.com/Reko/items/e8253ac68ccafba44ad3
Next.js × PrismaをDockerコンテナ内で動かしたらMySQLに接続できなかった話

Docker環境でNext.jsからprismaでMySQLに接続しようとしたときめちゃくちゃハマったので自分の備忘も兼ねて記事にしました。
### 動作環境
- Mac Apple M1 Pro
- Next.js 15.1.4
- Prisma 6.3.0
- MySQL 8.0
---
### 問題の発生状況
- **Next.js（Prisma使用）をDockerコンテナ内で起動**し、同じく**Dockerコンテナで起動させていたMySQL**に**APIから接続**しようとしたが500エラー、原因は**MySQLへの接続失敗**によるものでした
- 一方、**Next.jsをローカル（MacOS上）で起動**し、**localhost経由でMySQLに接続**すると**正常に接続**できた
---
### 確認したこと・試したこと
- ```.env```ファイルに設定した`DATABASE_URL`を参照しているか確認→**問題なし**
- コンテナのログにPrismaのエラーが出ているか確認→**気になるエラーを発見**
- エラー内容は以下
    ```bash
    Prisma Client could not locate the Query Engine for runtime "linux-musl-arm64-openssl-3.0.x".
    
    This happened because Prisma Client was generated for "darwin", but the actual deployment required "linux-musl-arm64-openssl-3.0.x".
    ```
    要するに、**Prisma Clientが、darwin(MacOS)用に生成**されているのに対し、**Dockerコンテナ内はLinux環境**のため**接続できない**。

    だから、local環境(MacOS)からの接続はうまく行っていたのか、なるほど...
---
### 解決策
prismaをlinux環境で動作できるように修正する。
#### 1. `schema.prisma`の修正
    ```
    generator client {
      provider      = "prisma-client-js"
      binaryTargets = ["native", "linux-musl-arm64-openssl-3.0.x"]　//追加
    }
    ```
    - prisma clientをlinux用のバイナリで生成される設定を追加
---
#### 2. Prisma Clientの再生成
    ```
    docker-compose exec コンテナ名 npx prisma generate
    ```
---
#### 3. コンテナの再起動
    ```
    docker-compose restart コンテナ名
    ```
---
### まとめ
Docker環境でPrismaを使う場合、
**binaryTargetsの設定を忘れると環境差異でエラーが出る**ので要注意です！

特に「ローカルでは動くのに本番やコンテナで動かない」現象は、
**Prisma Clientのバイナリ生成設定**をまず疑うとスムーズだと学びました。

参考になれば嬉しいです！🙌
DATUM STUDIOで5日間、データ基盤・分析・可視化に挑戦してきた話

## はじめに
2024年の9/5～9/11で開催されたDATUM STUDIO株式会社のインターンシップに参加してきました（平日のみなので5日間）。インターンの開催は初ということで、体験記を残したいと思います。  
技術的な内容についてはあまり深掘りせず、全体的な流れや雰囲気を伝えられたらと思います。

## DATUM STUDIOについて
DATUM STUDIO株式会社はSupershipグループに属する企業で、データ分析コンサルティング、ソフトウェア開発を行っている会社です。コンサルティングからデータ基盤の構築、データの分析、それらを用いたAIシステムの開発、運用などと幅広い事業を行っているようです。

また、社員の約9割がデータサイエンティストやエンジニアなどの技術職で構成されているらしく、最新の技術などに興味を持たれている方が多い印象を受けました。

## インターンの選考・早期選考について
インターンの選考フローは

- 書類選考
- カジュアル面談
- 現場面接

となっています。現場面接は自己紹介資料（研究内容やこれまでの実績など）を作成し、その内容について深掘りされていくという形式でした。

ちなみに、本選考は上記の選考に加えて面接２回で内定となります。インターンに参加後、本選考に進みたい場合はインターンの選考と被っている選考内容はスキップできます。（面接で話す内容ができるので若干有利にはなるかも？）

## インターンの内容

### 業務内容以外について
インターンは5日間で最初の4日はオンライン、最終日のみ虎ノ門のオフィスでオフライン開催でした。交通費、宿泊費は出していただけます（ありがたい）。また、交通・宿泊費とは別で給料もいただけます（ありがたすぎる）。  
業務は4人のグループで行いました。また、各グループにはメンターとして社員の方がつき、質問やその他サポートをしていただけます。業務に加えて、社員の方のLT会に参加させていただけたり、事業紹介や案件紹介などの時間もありました。

1日の流れとしてはざっくりと

- 午前中：その日の課題説明
- 午後：チーム開発・成果発表会

と分けられていて、チーム開発での時間・役割の配分については自由でした。1日の中で課題理解・実装・発表まで行うためかなり忙しいですが、非常に楽しかったです。

### 業務内容について
ざっくりとですが、業務内容についても紹介したいと思います。  
全体的な業務内容は、AWSに保存されている成形されていないデータを用いてデータの分析・可視化まで行うというものです。基本的にデータの処理はSnowflakeというデータプラットフォーム上で行いました。具体的には

- 1日目：AWSからSnowflakeに生データを取り込む
- 2日目：data build tool（通称dbt）を用いてデータの変換を行う
- 3日目：データの分析（顧客の分類など）
- 4日目：データの可視化
- 5日目：データの検索を組み込んだチャットボットの実装

という流れでした。毎日ざっくりとした課題が与えられ、どういう手法を使いどういうアプローチをするかなどはそれぞれのチームで話し合って決める必要があります。  
例えば、データの分析での課題は優良顧客を抽出することでしたが、チーム毎にアプローチに特色があり成果発表も非常に盛り上がってました。

扱う技術について、AWSに触れたことのあるインターン生はそこそこいましたが、Snowflakeやdbtに触れたことのあるインターン生はほとんどいなかったと思います。触れたことのない技術についてグループで勉強しながら実装していくのは非常に楽しかったです。

## 学んだこと
5日間という短い時間でしたが、学ぶことはたくさんありました。

### タスク管理と共有の難しさ
特に今回のインターンは時間の制約が厳しかったので、とりあえずやってみようと見切り発車してしまうことがあったのですが、お互いがどのタスクを行なっているかわからず混乱してしまう場面がありました、、、  
時間がないからこそタスクの管理・共有は大事だなと感じました。

### わからないことはとりあえずSlackに投げてみる
私は一人で悩んで解決するタイプでしたが、調べたり悩んだりする前にとりあえずSlackに投げてみると社員の方やチームのメンバーが答えてくれたりしました。  
誰かが答えを知っているのに自分で悩むのは時間の無駄なのでとりあえず共有してみるべきだなと思いました。

## 良かった/悪かった点

### 良かった点
良かった点はたくさんありますが、中でも特に以下の3つが印象に残りました。

- オンライン・オフラインのハイブリッド開催  
開発自体はオンラインでも全く問題ないですし、１週間東京にいるというのはそもそもスケジュール的に難しい人も多いと思います。本インターンは最終日だけオフライン開催だったのでオフィスに入ることもでき、社内の雰囲気も感じられ個人的にはハイブリッド開催で良かったと感じました。

- 普段扱わない技術に触れられる  
特に学生にとって、大規模なデータを処理するための技術に触れる機会は中々ないと思います。加えて、業務では人工的なデータではなく実際に使われているデータを扱ったため、想像もしなかったようなサンプルがあり、面白かったです。

- ご飯がおいしい  
最終日は昼食の支給（焼肉弁当）と夜に懇親会（ビュッフェ）がありましたが、どちらもとてもおいしかったです。

### 悪かった点
悪かった点は特にないですが、強いて言えば時間制限が厳しすぎました、、

## 終わりに
インターンは5日間という短い期間でしたが、得られるものは非常に多かったです。  
また、チームの雰囲気もよく楽しく課題に取り組めました。あとご飯がおいしい。  
気になる方はぜひ来年のインターンに参加してみてはいかがでしょうか。
[RHEL]開発者サブスクリプション更新で400エラーが出た時の対処法

# はじめに
Red Hat Enterprise Linux (RHEL) のサブスクリプション更新中に発生したSSL証明書エラーのトラブルシューティングについて記録します。

# 問題
久しぶりに起動したRHELのサーバでサブスクリプション（開発者サブスクリプション）の更新を試みた際に、以下のエラーが発生しました。

```
# subscription-manager register --username <ユーザ名> --password <パスワード> --name <サーバ名> --force
登録の解除中: subscription.rhsm.redhat.com:443/subscription
不明なサーバー応答 (HTTP エラーコード 400: Bad Request):
<html><13>
<head><title>400 The SSL certificate error</title></head><13>
<body><13>
<center><h1>400 Bad Request</h1></center><13>
<center>The SSL certificate error</center><13>
<hr><center>openresty</center><13>
</body><13>
</html><13>
```

# 解決方法
以下のサイトにあるpemファイルのコピーをして更新するとうまくいきました。

https://access.redhat.com/ja/solutions/5567301

# 手順
pemファイルをコピーします。ファイル名は異なる可能性があります。
```
# cp /etc/pki/product-default/479.pem /etc/pki/product/
```
不要なディレクトリを削除します。
```
# rm -rf /etc/pki/consumer
# rm -rf /etc/pki/entitlement
```
ローカルデータをクリーンアップします。
```
# subscription-manager clean
ローカルデータがすべて削除されました
```
サブスクリプション登録コマンドを実行します。
```
# subscription-manager register --username <ユーザ名> --password <パスワード> --name <サーバ名>
登録中: subscription.rhsm.redhat.com:443/subscription
このシステムは、次の ID で登録されました: <登録されたID>
登録したシステム名: <サーバ名>
```
# まとめ
始めはカスタマーポータル側で古い情報が残ってしまっているのではと思いましたがサーバ側の問題でした。
公式ヘルプがなければすぐには解決できなさそうでしたので、ちょうど同じ問題のヘルプがあってよかったです。

# 参考
https://access.redhat.com/ja/solutions/5567301
個人的備忘録：CORSMiddlewareって何？FastAPIでの設定方法を確認してみた

## はじめに

バックエンドAPIとフロントエンドが異なるドメインやポートで動作する場合、ブラウザのセキュリティ制約によりCORSの設定が必要になります。

:::note info
**FastAPIでは、`CORSMiddleware` を使用して簡単にCORS設定を行うことが可能です。**
:::

今回取り扱う設定例はこちらです。

```python
app.add_middleware(
    CORSMiddleware,
    allow_origins=["https://xxx.xyz", "https://api.xxx.xyz", "http://localhost"],
    allow_credentials=True,
    allow_methods=["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
    allow_headers=["Content-Type", "Authorization", "X-CSRF-Token", "Access-Control-Allow-Origin"],
)
```

**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**

## 設定内容の解説

| 項目               | 内容                                                                                                  |
|:--------------------|:------------------------------------------------------------------------------------------------------|
| `allow_origins`     | Next.js（xxx.xyzドメイン）とローカル（localhost）からのリクエストを許可                       |
| `allow_credentials` | CookieやAuthorizationヘッダなど認証情報つきリクエストを許可                                           |
| `allow_methods`     | 各種HTTPメソッド（GET, POST, PUT, DELETE, PATCH, OPTIONS）を許可                                       |
| `allow_headers`     | 特定ヘッダー（Content-Type, Authorization, X-CSRF-Tokenなど）を許可                                   |

これにより、Next.jsとFastAPI間のAPI通信がスムーズに行えるようになります。

---

## 補足点

- 本番環境 (`https://xxx.xyz`, `https://api.xxx.xyz`) だけでなく、開発環境 (`http://localhost`) も許可されている
- 認証情報 (`credentials`) を正しく取り扱える
- メソッドやヘッダーも広く許可しており、一般的なAPI操作が問題なくできる

---

## まとめ

- FastAPIのCORS設定は、`CORSMiddleware`を使って柔軟に管理できる
- 本番・開発両方に適切なオリジン設定を施すことが重要
- `allow_headers`にはレスポンスヘッダーを含めない
- 必要に応じてlocalhostのポート番号も指定する

CORS設定は、セキュリティにも直結する重要なポイントです。今回の改善ポイントも意識しながら、適切な設定を心がけましょう...！
React + Rails初心者の歩み 〜問題集：中級編〜

# 【中級編（開発可能な中級者向け）】
目標：認証、状態管理、非同期通信、エラーハンドリングの理解。

## React（Viteベース）

<dl>
<dt>1. **ログイン状態管理（AuthContext）**を作成して、ログイン中かどうかで表示を切り替えてください。</dt>
</dl>
<dl>
<dt>2. Protected Route（認証されてないとリダイレクト）を実装してください。</dt>
<dd>react-router-domを使う。</dd>
</dl>
<dl>
<dt>3. 投稿作成ページを作り、Rails APIへPOSTリクエストして投稿できるようにしてください。</dt>
</dl>
<dl>
<dt>4. エラーハンドリングを加えてください。</dt>
<dd>例えばログイン失敗時に「メールアドレスかパスワードが間違っています」と表示。</dd>
</dl>
<dl>

## Rails（APIモード）
<dl>
<dt>1. ログイン必須のAPIを作成してください。</dt>
<dd>before_action :require_login を適切に設定。</dd>
</dl>
<dl>
<dt>2. 投稿にユーザーIDを関連付け（belongs_to :user）して、自分の投稿だけ取得できるAPIを作ってください。</dt>
</dl>
<dl>
<dt>3. 簡単な検索機能を実装してください。</dt>
<dd>/posts?keyword=xxx で、タイトルに「xxx」を含む投稿だけ取得。</dd>
</dl>
<dl>
<dt>4. Serializer（例：ActiveModel::Serializer）を使って、レスポンスを整えてください。</dt>
</dl>
複素数平面を用いた円周角の定理の逆の証明について

# はじめに
円周角の定理の逆は円の軌跡を描くということを証明するためにかなりの頻度で使用される。したがって幾何学的な意味で重要である。しかし、解析学的な点からいえば、かなりの計算量を節約して円の存在を証明することができる。そこで、今回は円周角の定理の逆を複素数平面を用いて解析的に証明することを目的とする。そして、その定理を元に以下のような円の一部をPythonを用いて作図する。

![円周角の定理の逆.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/fd07e7e2-387b-4285-b045-5fa3d5cf185e.png)

# 円周角の定理の逆について

以下の図で考える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/0f154723-c625-4238-b97f-cdb5b334ef05.png)

固定な3点で形成される$\Delta ABC$と動点$D$を考える。

$\angle ACB=\angle ADB$を常に満たすように動点$D$を移動させる。そうすると、$D$の軌跡は、円周角の定理の逆より、円周上にあるはずである。

# 複素数平面

$\angle ACB=\angle ADB$を常に満たすことから、以下のことが成立する。

```math
\frac{\beta-\gamma}{\alpha-\gamma}=k\frac{\beta-\gamma_0}{\alpha-\gamma}
```

ただし$k$は実数である。

これを$k$ について解くと以下のようになる。

```math
\frac{\beta-\gamma}{\alpha-\gamma}=k\frac{\beta-\gamma_0}{\alpha-\gamma}
```

```math
k=\frac{(\beta-\gamma)(\gamma_0-\alpha)}{(\beta-\gamma_0)(\gamma-\alpha)}
```

ここで、任意の実数$k$について、以下の式が成立する。

```math
k=\bar{k}
```

したがって、

```math
\frac{(\beta-\gamma)(\gamma_0-\alpha)}{(\beta-\gamma_0)(\gamma-\alpha)}=
\overline{\frac{(\beta-\gamma)(\gamma_0-\alpha)}{(\beta-\gamma_0)(\gamma-\alpha)}}
```

これを整理すると、以下のようになる。

```math
(\beta-\gamma)(\gamma_0-\alpha)(\bar{\beta}-\bar{\gamma_0})(\bar{\gamma}-\bar{\alpha})=
(\beta-\gamma_0)(\bar{\beta}-\bar{\gamma})(\bar{\gamma}-\bar{\alpha})(\gamma-\alpha)
```

ここで、複素数$A=(\gamma_0-\alpha)(\bar{\beta}-\bar{\gamma_0})$とおくと以下のように式変形を行うことができる。


```math
(A+\bar{A})\gamma\bar{\gamma}+(A\bar{\alpha}-\bar{A}\bar{\beta})\gamma+(-\bar{A}\alpha+A \beta)\bar{\gamma}+(A\bar{\alpha}\beta+\bar{A}\alpha \bar{\beta})=0
```

ここで、$-\bar{A}\alpha+A \beta=\overline{A\bar{\alpha}-\bar{A}\bar{\beta}}$の関係性があるので、



```math
\gamma \bar{\gamma}-\bar{p}\gamma-p\bar{\gamma}+q=0 
```

と表すことができる。（$p$は複素数であるが$q$は実数である。）


```math
(\gamma-p)(\overline{\gamma-p})=-q+|p|^2 
```

```math
|\gamma-p|=\sqrt{-q+|p|^2}
```

となり、これは円の方程式を表す。（半径が正になるかどうかの議論は今回は式が複雑になりそうなので省略した。いい方法をご存じの方は教えていただきたいです。）

# プログラム

```math
\frac{\beta-\gamma}{\alpha-\gamma}=k\frac{\beta-\gamma_0}{\alpha-\gamma}
```

の式を$\gamma$について整理すると以下のようになる。

```math
\gamma=\frac{k\alpha(\beta-\gamma_0)+\beta(\gamma_0-\alpha)}{k(\beta-\gamma_0)+(\gamma_0-\alpha)}
```
上式を用いて、実数$k$を変化させたときの$\gamma$を描写するプログラムを作成した。

```python ensixyuukaku_circle.py
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib
import math
m=3
n=1000
k=np.linspace(-m,m,n)

alpha=1
beta=-1
gamma_0=3+3j

gamma=((k-1)*alpha*beta+gamma_0*(beta-k*alpha))/((k*beta-alpha)+gamma_0*(1-k))

plt.axis('equal')
plt.plot([alpha.real,beta.real,gamma_0.real,alpha.real],[alpha.imag,beta.imag,gamma_0.imag,alpha.imag])
plt.plot(gamma.real,gamma.imag)
plt.savefig("円周角の定理の逆.png")
plt.show()
```

これを実行すると、以下のようなグラフが出力される。

![円周角の定理の逆.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/fd07e7e2-387b-4285-b045-5fa3d5cf185e.png)
が

このように、実数$k$を変化させることで円周の一部を描写することができる。

# まとめ

今回は、円周角の定理の逆を解析学的に証明することを試みた。具体的には、各座標の特性を複素数で表して、角度の情報を数式に直して議論した。後半ではpythonを用いて円周の一部を描写していることを確認した。このように、円周角の定理を解析学的に証明するのは、かなり面倒である。
したがって、幾何学的な性質を上手く利用できることが分かれば、積極的に利用することで計算量をかなり低減させることができる。
【365日後にPredictive Master】大企業の平社員がAlteryx Weekly Challengeに挑む #003

## はじめに
こんにちは、積立お兄さんです。
大企業新卒３年目のAlteryx初心者です。
ひょんなことから「**365日後にPredictive Masterになる！**」という目標を掲げて、公式のWeekly Challengeにコツコツ挑戦しています。

この記事では、Alteryx歴3か月の平社員が、実務で生かせそうなノーコード分析力をどうやって身につけていくかを記録＆共有していきます。

仕事が忙しく、投稿ができませんでしたがGWに時間がある程度あるのでどんどん進めていこうと思います！！

- 目標：ETLツールを自在に使いこなせるようになる
- 対象読者：Alteryxを始めたばかりの方/Weekly Challengeの解説が欲しい方

---

## 今回のチャレンジ：Weekly Challenge #003

- タイトル：[Weekly チャレンジ #003： 日付の解析] [LINK](https://community.alteryx.com/t5/%E3%82%A6%E3%82%A3%E3%82%AF%E3%83%AA%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA/%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8-3-%E6%97%A5%E4%BB%98%E3%81%AE%E8%A7%A3%E6%9E%90/m-p/390515)
- レベル感：上級者向け（正規表現に馴染みがないと大変）
- ゴール：出力ファイルと同じフォーマットに入力ファイルを変換する。
Field_1列の文には、複数パターンのフォーマットで日付が含まれている。この日付部分を抽出して、正しいフォーマットにして別の列に出力する。
- 入力１
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658349/764c8d93-8225-4509-9194-22b789fabbe7.png
">
- 出力
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658349/cff1e716-1bf8-423f-9dbb-700bba4fb0cf.png
">

---

## 解いた流れと使用ツール

### ワークフロー全体

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658349/a6dfa070-1dc6-4c45-bf02-6f468dee6fed.png
">

### 処理の手順と解説
1. **正規表現ツール**　：入力データのField_1列の値の中から、日付の部分を抽出する。使用した式は以下の通り。
(\d{2}-\w+-\d{4})|(\w{3}\s\d{2},\s\d{4})|(\d+-\u{3}-\d{2})|(\w{3}\s\d+\s\d{4})
使用した式内のメモを残す
・\d{2}：２桁の数字
・\w+：文字が１つ以上
・\d{4}：４桁数字
・\s：スペース
これらを組み合わせて、Fiels_1列で使用されている日付のパターンを全て作る。
また、正規表現ツールの解析モードを使用するときには、（）で囲う必要があるらしい。
1. **フォーミュラツール１**　：正規表現ツールで抽出した様々なパターンの日付（文字列）を、すべてYYYY-mm-ddの形にする。
1. **フォーミュラツール２**　：正規表現ツールの解析モードでの出力は、各パターンについて別の列に出力される。よって、ここでそれらを１つの列にする。
1. **セレクトツール**　：不必要な列を削除する。


---

## 詰まったポイントとその解決

- **問題１：正規表現がそもそもあまりわからなかった**
→ 調べるしかない（←雑）
- **問題２：正規表現ツールの解析モードでエラー**
→ 抽出したい部分を（）で囲う必要があり、それによってエラー回避。
- **問題３：IF文の使い方ミス**
→ IF文の使い方って、プログラミング言語によって微妙に違いますよね。その違いによって、何でエラーが出るのかわからずに止まる時間、ありますよね。こんかいもそれでした。ELSE IFではなく、ELSEIFでした。泣いた。
---

## 結果と出力確認
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658349/1b659991-421f-40e3-b33b-39d269f65206.png
">

→正しい出力フォーマットで、指定要件を満たしていました！

---

## 今日の学び・振り返り

- **新しく覚えたツール**：正規表現ツール
解析モードでは、抽出したい部分を（）で囲む必要がある。
このあたりの正規表現は覚えておくべし：
・\d{2}：２桁の数字
・\w+：文字が１つ以上
・\d{4}：４桁数字
・\s：スペース
- **工夫ポイント**：正規表現の式で、()|()|()という風にすることで、１つの式で複数パターンを検索するようにした。工夫というより、普通かもしれませんが、私はこの方法は知りませんでした。
- **実務への応用**：正規表現はなんだかんだとても使いやすく、Alteryxでも簡単に使用できることが分かったので、ルールベースで入力されているデータには使用していこうと思った。
---

## 次回予告
次は【Weekly Challenge #004】に挑戦予定！
なるべくヒントを見ずにまずは自分の力で解いてみる！

---
## タグ
`Alteryx` `weekly Challenge` `データ分析` `Predictive Master` `365日チャレンジ` `ノーコード`
Anki風のシンプルな学習アプリを個人開発してみた２【React Native × Firebase】

# ankiApp - あなた専用の暗記習慣アプリ

英語・中国語・証拠試験など、どんな目標にもフィットする、
**シンプルで直感的に使えるフラッシュカードアプリ** を開発しました。

React NativeとFirebaseを使用しています。

---

# 開発背景

市販のAnkiアプリは高機能だけど、
設定が複雑で、学習そのものに集中できないと感じていました。

そこで、
- 「直感的に使える」  
- 「無駄を省いた」  
- 「自分の学習スタイルに合わせられる」

そんなアプリを目指してゼロから設計・開発しました。

---

# 前回
https://qiita.com/JZ8xNeXY/items/3a85ac2115acda2bd1af

---
# 備考
本アプリは個人の学習支援を目的としたもので、現在はローカル／開発環境での運用にとどめています。
本番環境へのデプロイにはFirebase課金やApple Developer登録などのコストが伴うため、必要性が生じた段階で導入を検討する予定です。

---

# ankiAppの特徴

- デッキを自由に作成（英単語、中国語、IT用語などテーマ別管理）
- フラッシュカード（表・裏）登録機能
- 復習タイミングを自動調整（SuperMemo-2アルゴリズム採用）
- お気に入り機能で効率復習
- 音声読み上げ（英・中・日対応）
- ChatGPTを使ったカード作成支援機能も搭載

---

# UIイメージ

| アプリ初期画面 | デッキ画面一覧 
|:--|:--
[![Image from Gyazo](https://i.gyazo.com/8cbcc0cf190baae13b74b4b16fe8ea2d.png)](https://gyazo.com/8cbcc0cf190baae13b74b4b16fe8ea2d) | [![Image from Gyazo](https://i.gyazo.com/d2b99ce40c354fcd8fe30cb8e63d33db.png)](https://gyazo.com/d2b99ce40c354fcd8fe30cb8e63d33db) | 

| 問題画面 | カード登録g 
|:--|:--
[![Image from Gyazo](https://i.gyazo.com/024908b6b5bdaab5e50e27d3abed6c13.png)](https://gyazo.com/024908b6b5bdaab5e50e27d3abed6c13) | [![Image from Gyazo](https://i.gyazo.com/f3427bbde10f8d1168edc26731b6dafc.png)](https://gyazo.com/f3427bbde10f8d1168edc26731b6dafc)

---

# こだわりポイント

- **デザイン統一：** 白ベース＋やさしいグラデーションデザイン
- **直感操作：** ワンタップで学習を進められる
- **軽量設計：** 余計な機能を鋸ぎ落とし、学習に集中できる
- **習慣化設計：** 復習間隔自動調整（SM-2アルゴリズム）

---

# 技術スタック

- React Native / Expo
- Firebase Authentication / Firestore
- TypeScript
- EAS Build（iOS / Android対応）

---

# 苦労したこと

- Firebaseのネスト構造管理
- 復習間隔（SuperMemo-2）ロジックの設計と実装
- デザインとシンプルさのバランス取り

---

# 今後の展望

- 完了済デッキの進捗管理機能
- 過去復習履歴表示機能
- PC版 / Web版への展開

---

# 最後に

「今日も一歩、覚える。」を支える暗記アプリです。

シンプルで使やすく、毎日こつこつ続けられる学習を支援します。

---
Ceph構築がうまくできない、理解が追いつかない

前回デス

https://qiita.com/shimeji_k/items/8f90bd038b21be816727

## Cephの検証をする
そもそも個人の趣味範疇なのでノードになるべく台数が極端に少ないのです。
機材は足りない分追加していかないといけないんだけど・・・

本番稼働中
HP DL360 Gen9
HP DL360 Gen10

余り検証用
Supermicro 2028TP-DC1R　1台

2028TP-DC1Rで検証してみようと開始。

### Ceph検証環境
1. 2028TP-DC1RをProxmoxのクラスタから解体してCeph検証用に降格
1. まず、Proxmoxでクラスタから削除
1. 2028TPに新規にProxmoxをインストール（後々参加させるため）✕２
1. 合わせてハードウェアRAIDに頼っていたのでProxmoxはZFSのRAID1化

#### まずやったこと
全台Proxmox入れているけど今後入れないノード追加したときの練習用に素で入れてみようかと考える
ここが間違いの始まり
ProxmoxはそもそもCeph入っているからそれ使うもの？
1. authorized_keysがシンボリックリンクでクラスタ間の通信用に自動キー追加ができない 
    * authorized_keysを実体化させてクラスタ作成後に実体化
1. そもそもPodmanがうまく動作しない
    *  普通にcephアプリを入れてやればよかったけどcephadmで構築をしようとしていた
    *  まぁ、そもそも知識経験少なすぎるからアプリいれてやってても心折れてたと思う


インストールのログとの格闘をしたけど
そもそもCeph動かしてイメージ掴めないんじゃ今何やってるかわからなくね？？

#### 結論、まず統合機能を使って構築してみよう！

Crush MapとかPoolの勉強はその次だな
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/2f029a5a-904d-4b23-84ec-6ffa8ca23873.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/dea5d769-ced0-4bd6-970a-5929f70de6d9.png)

検証用だからノードは2台、、、、（そもそもCephの検証だったらもう一台はほしいところ）
2台だからしてプールのレプリカ数を2にしたり
```
ceph osd pool set lvm-ceph-rbd size 2
```

とりあえずは動いた

### レプリカネットワークの作成
転がっている10GbpsのNICはとりあえずそのまま放置で
内蔵の1Gbpsでレプリカ
1台目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/b5d02840-4a80-44ee-8606-b9e068d5370d.png)

2台目
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/10b46a20-7ddf-4e17-8db2-fdb8bee5b58d.png)

それぞれeno2をクラスターネットワーク用に割当て
※ここでちゃんと「設定を適用」を押しましょう、Proxmox04押して無くて？？？になりました

ここでは、Proxmox管理画面とCephとの接続用を
`192.168.14.0/24`
にて定義して
クラスターのネットワークを
`192.168.20.0/24`
で独立させております。

cluster_network = 192.168.20.0/24
と
public_network = 192.168.14.0/24
で分離
`vim /etc/ceph/ceph.conf`
```
 [global]
        auth_client_required = cephx
        auth_cluster_required = cephx
        auth_service_required = cephx
+       cluster_network = 192.168.20.0/24
        fsid = 5b5fd5ea-a6e4-42b5-bf38-f3d3a96d9fc6
        mon_allow_pool_delete = true
        mon_host = 192.168.14.23 192.168.14.24
        ms_bind_ipv4 = true
        ms_bind_ipv6 = false
        osd_pool_default_min_size = 2
        osd_pool_default_size = 3
+       public_network = 192.168.14.0/24

 [client]
        keyring = /etc/pve/priv/$cluster.$name.keyring

 [client.crash]
        keyring = /etc/pve/ceph/$cluster.$name.keyring

 [mon.proxmox03]
        public_addr = 192.168.14.23

 [mon.proxmox04]
        public_addr = 192.168.14.24
```


ちなみに、ちゃんと/etc/hostsにも名前解決できるようにIPは書いておきました。
`vim /etc/hosts`
```
root@proxmox03:/etc/ceph# cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1         localhost
192.168.14.23 proxmox03.local proxmox03
192.168.20.23 proxmox03.local proxmox03
192.168.14.24 proxmox04.local proxmox04
192.168.20.24 proxmox04.local proxmox04
```


そうしてようやく！！Cephというものが動き出しました！

未だ全然イメージ掴めない
新しことは難しいわ


とりあえず、HDD12台でPublic/Clusterネットワーク1Gbpsだけど
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4067323/29d9aba0-e2eb-49ce-af10-0df889b1e6e8.png)
こんな感じでそこそこのスピードでます


続きました

https://qiita.com/shimeji_k/items/38644fea1500a246f3c3
windows11で、sketchup6 その86

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題やってみた。

# 練習問題
lifegameを書け。

# 参考にしたページ

https://qiita.com/khsk/items/d15f55065f2c60aa402d

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3a159475-933e-418a-92e4-f97bff9ef877.png)

# サンプルコード

```


class Map
	ALIVE = 1
	DEAD = 0
	def initialize(xNum, yNum, isRandom = false)
		@map = []
		@xNum = xNum
		@yNum = yNum
		(0...xNum).each { |i|
			@map[i] = []
			(0...yNum).each { |j|
				@map[i][j] = isRandom ? rand(ALIVE + 1) : DEAD
			}
		}
	end

	def getState(i, j)
		if i < 0 || j < 0
			return DEAD
		end
		if @map[i].nil?
			DEAD
		elsif @map[i][j].nil?
			DEAD
		else
			@map[i][j]
		end
	end

	def getSum8Neighborhood(i, j)
		sum = 0
		sum = sum + getState(i - 1, j)
		sum = sum + getState(i + 1, j)
		sum = sum + getState(i, j - 1)
		sum = sum + getState(i, j + 1)
		sum = sum + getState(i - 1, j - 1)
		sum = sum + getState(i + 1, j - 1)
		sum = sum + getState(i - 1, j + 1)
		sum = sum + getState(i + 1, j + 1)
	end

	def update
		newMap = []
		(0...@xNum).each { |i|
			newMap[i] = []
			(0...@yNum).each { |j|
				newMap[i][j] = calcNewState(i, j)
			}
		}
		@map = newMap
	end

	def calcNewState(i, j)
		state = @map[i][j]
		sum = getSum8Neighborhood(i, j)
		if state == DEAD && sum == 3
			ALIVE
		elsif state == ALIVE && (sum == 2 || sum == 3)
			ALIVE
		elsif state == ALIVE && (sum <= 1)
			DEAD
		elsif state == ALIVE && sum >= 4
			DEAD
		else
			state
		end
	end

	def clear
		puts "\e[H\e[2j"
	end

	def draw
		clear
		(0...@xNum).each { |i|
			(0...@yNum).each { |j|
				if @map[i][j] == DEAD
					print "_"
				else
					print "@"
				end
			}
			puts ''
		}
	end

	def setState(i, j, state)
		@map[i][j] = state
	end

	def isExtinction
		@map.flatten.inject(:+) == 0
	end

	def out
		@map.flatten
	end
end

def lifegame2
	model = Sketchup.active_model
	entities = model.active_entities
	@view = model.active_view
	@faces = []
	@cycles = 0
	ysize = 18
	xsize = 18
	blk = 2
	@map = Map.new(18, 18, true)
	for j in 0..(ysize - 1)
		for i in 0..(xsize - 1)
			i2 = i + 1
			j2 = j + 1
			pt1 = [(i * blk), (j * blk), 0]
			pt2 = [(i2 * blk), (j * blk), 0]
			pt3 = [(i2 * blk), (j2 * blk), 0]
			pt4 = [(i * blk), (j2 * blk), 0]
			face1 = entities.add_face(pt1, pt2, pt3, pt4)
			@faces << face1
		end
	end
	update_array = @map.out
	#puts update_array
	counter = 0
	for facei in @faces
		if update_array[counter] == 1
			facei.reverse!
		end
		counter += 1
	end
	UI.messagebox("ok")
	def run
		@map.update
		update_array = @map.out
		counter = 0
		for facei in @faces
			if update_array[counter] == 1
				facei.reverse!
			end
			counter += 1
		end
		@view.invalidate
		@cycles += 1
		puts @cycles
		if @map.isExtinction == 0
		#if @cycles > 2
			UI.stop_timer(@conwaytimer)
		end
	end
	@conwaytimer = UI.start_timer(0.9, true) {
		run
	}
end




```

以上。
React + Rails初心者の歩み 〜問題集：初級編〜

# 【初級編（開発できるレベルの初級者向け）】
目標：基礎的なCRUDやログイン処理を理解する。

## React（Viteベース）

<dl>
<dt>1. 簡単なカウンターアプリを作成してください。</dt>
<dd>数字を＋1、−1できるボタンを設置。</dd>
</dl>
<dl>
<dt>2. フォームから名前を入力して表示するアプリを作成してください。</dt>
<dd>入力 → ボタン押下 → 入力した名前が下に表示される。</dd>
</dl>
<dl>
<dt>3. APIからデータを取得してリスト表示するコンポーネントを作ってください。</dt>
<dd>JSONPlaceholder（https://jsonplaceholder.typicode.com/posts）などから取得。</dd>
</dl>
<dl>
<dt>4. コンポーネント分割を練習してください。</dt>
<dd>リスト部分、入力フォーム部分を別ファイルに分ける。</dd>
</dl>
<dl>

## Rails（APIモード）
<dl>
<dt>1. Userモデルを作成して、email, password_digestを持たせてください。</dt>
<dd>bcryptを使ってパスワード暗号化。</dd>
</dl>
<dl>
<dt>2. SessionControllerを作成して、emailとpasswordでログインできるAPIを実装してください。</dt>
<dd>正しくログインできたらsession[:user_id]を設定。</dd>
</dl>
<dl>
<dt>3. Postモデルを作成して、タイトルと本文を保存できるAPIを作成してください。</dt>
<dd>posts#create, posts#index APIを作る。</dd>
</dl>
<dl>
<dt>4. 簡単なバリデーションを設定してください。</dt>
<dd>タイトルは必須、本文は必須ではない、など。</dd>
</dl>
Python実践データ分析100本ノック（11～20本目）の振り返りと学び



## はじめに
本記事では、『Python実践データ分析100本ノック』
（参考: https://www.shuwasystem.co.jp/book/9784798067278.html）
を用いて僕が**第11問～第20問**に挑戦した過程での**失敗談**や**気づき**をまとめます。
Qiita初心者の立場から、**意味がわからなかったポイント**、**理解に苦しんだ処理**、
**遭遇したエラー**、そして**僕の感想**を記載しています。

> **感想**：データには人間のミスが意外と多く潜んでいることを痛感しました。
半角・全角の混在や大文字小文字の揺れ、欠損値など、前処理を怠るとその後の集計が歪んでしまいます。

---

## 目次
1. 意味がわからなかったもの
2. 理解に苦しんだ処理
3. 発生したエラーと対処法
4. 僕の気づきと感想
5. 次のステップ

---

## 1. 意味がわからなかったもの

### `.loc` と条件抽出
```python
filtered = df.loc[df['列名'] == '値']
```
- **解説**：`loc[行条件, 列名]` で DataFrame を絞り込みます。`df['列名'] == '値'` が `True` の行だけを取得できます。

### `.unique()`
```python
values = df['item_name'].unique()
```
- **解説**：Series から**重複を除いた**一意な値を抽出し、NumPy 配列として返します。

### 論理否定の `~`
```python
mask = ~df['フラグ']
```
- **解説**：`True/False` を反転します。`df['フラグ']` が `False` の行を選びたいときに用います。

### Excelシリアル値のバグ補正
Excelは1900年2月29日という**実在しない日**を誤ってカウントします。そのため、シリアル値を日付に変換するときには**2日分**の補正（`- 2`）が必要です。
```python
serial_dates = (
    pd.to_timedelta(serial_number.astype(float) - 2, unit='D')
    + pd.to_datetime('1900-01-01')
)
```

---

## 2. 理解に苦しんだ処理

### `astype('str').str.isdigit()`
```python
mask = df['登録日'].astype('str').str.isdigit()
```
- **目的**：文字列が**すべて数字のみ**で構成されているか判定し、Excelシリアル値を識別します。`

### `pd.concat` による結合
```python
df['登録日'] = pd.concat([serial_dates, parsed_dates])
```
- **目的**：シリアル変換した日付と、既存の日付文字列を日付型に変換した結果を**1列に統合**し、元の DataFrame を更新します。

### `pd.merge(..., how='left')` によるジョイン
```python
joined = pd.merge(
    uriage_data,
    kokyaku_data,
    left_on='customer_name',
    right_on='顧客名',
    how='left'
)
```
- **目的**：売上データと顧客マスタを**左結合**し、一致しない顧客は `NaN` のまま残します。

---

## 3. 発生したエラーと対処法

| エラー内容                                               | 原因                                      | 対処法                         |
|---------------------------------------------------------|------------------------------------------|------------------------------|
| `AttributeError: 'StringMethods' object has no attribute 'uppper'` | `str.uppper()` のタイポ                    | `str.upper()` に修正            |
| `AttributeError: module 'pandas' has no attribute 'to_datetiime'` | `pd.to_datetiime()` のタイプミス            | `pd.to_datetime()` に修正       |
| 欠損値処理で比較マッチしない                             | `NaN` は `==` で比較すると必ず False になる | `isnull()` と `~` を併用してフィルタリング |

---

## 4. 僕の気づきと感想

- **ヒアリングの重要性**：表記揺れ（半角⇔全角、同義語など）はプログラムだけでは完全に解消できないことを知りました。面倒ではありますが担当者への確認とヒアリングが必要です。

- **前処理の徹底**：欠損値補完、文字列クレンジング、データ型統一が不足すると、後続処理が破綻します。**`isnull()` → `fillna()` or `dropna()`** のワークフローを明文化しましょう。

- **テストデータの用意**：予期しない入力に備えて、エッジケースを網羅するテストケースを用意する習慣が必要です。

---

## 5. 次のステップ

次回は**第21問～30問**に取り組み、同様に失敗と学びを記録します。また、処理の自動化やテスト駆動開発（TDD）の導入についても検討したいと考えています。

> **参考**：第1～10問の振り返り → https://qiita.com/do-raku/items/e1b18214fb9b59111066



*ではまたー*
タグが画面からはみ出す問題のBefore / After【Tailwind CSS × Laravel】

# 何をしたい？
テキストの折り返しで whitespace-nowrap を使用すると、単語途中で改行されなくて便利だが、その代わり１単語が長い時 & レスポンシブで画面が小さくなった時に、単語が画面から飛び出してしまう。↓
![スクリーンショット 2025-04-29 14.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/8be728a9-3455-4ef8-9ff2-c41a098aeea7.png)
![スクリーンショット 2025-04-29 14.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/36397cb2-b155-41c0-95b8-aaef043de05c.png)

これをうまく綺麗に表示したい。

### before
![スクリーンショット 2025-04-29 14.01.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/8be728a9-3455-4ef8-9ff2-c41a098aeea7.png)
![スクリーンショット 2025-04-29 14.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/36397cb2-b155-41c0-95b8-aaef043de05c.png)


### after
![スクリーンショット 2025-04-29 14.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/26add24b-329d-4596-beba-8d2a42111562.png)
![スクリーンショット 2025-04-29 14.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3726068/1c60ba1f-d7a1-4d0f-bb3a-ded4cd62a0e4.png)



# beforeコード
```XXX.php
<h3 class="text-lg font-semibold mt-6 text-center">実装機能</h3>
<div class="flex flex-wrap justify-left gap-2 text-sm text-gray-600 mt-2">
    @foreach ($collection->featureTags as $featureTag)
        <span class="whitespace-nowrap">{{ $featureTag->name }}@if (!$loop->last)
                ,
            @endif
        </span>
    @endforeach
</div>
```
whitespace-nowrap によって改行されず、横幅が狭い画面で 画面外にはみ出る

# afterコード
```XXX.php
<h3 class="text-lg font-semibold mt-6 text-center">実装機能</h3>
<div class="flex flex-wrap break-words justify-left gap-2 text-sm text-gray-600 mt-2">
    @foreach ($collection->featureTags as $featureTag)
        <span>{{ $featureTag->name }}@if (!$loop->last),@endif</span>
    @endforeach
</div>
```
## ✅ 解決ポイント
✅ whitespace-nowrap を削除 → 改行が可能に
✅ 親divに break-words を追加 → 長い単語も自然に折り返す
✅ flex-wrap によって2行目に自然に折れる