OmniAICreator/Qiita-1.07M huggingface dataset:
開発環境の整理がもたらす影響：心理的・技術的メリットの両立

## はじめに
ソフトウェア開発において「コードの質」や「設計の整合性」が注目される一方で、作業環境そのものに目を向けることは少ないかもしれません。しかし、開発者にとって清潔で整った作業環境は、単なる見た目の問題ではなく、心理的および生産性的な側面においても非常に重要な意味を持ちます。

本記事では、コードと作業環境の整理が開発者にもたらす心理的・技術的な効果について、具体例とともに紹介し、整理術を実践的に学べる内容として構成しています。

## 混乱した環境の影響とは？
例えば、プロジェクトに未追跡のファイルが12個、分岐ブランチが3つ、`node_modules`フォルダが2GB超、という状態を想像してください。このような混乱は、単に視覚的に不快というだけでなく、集中力を阻害し、心理的な疲労の蓄積にもつながります。

実際に、[**清潔な環境**](https://cleaningserviceschicagoland.com/restaurant-cleaning-services-chicago/)はストレスホルモンであるコルチゾールの分泌を抑え、精神的な落ち着きと集中力を促進することが、複数の研究によって示されています。

## 整理されたコードがもたらす安心感
コードの読みやすさや保守性の高さも、開発者の心理的安定に寄与します。以下のような小さな工夫が大きな違いを生みます：

### 変数と定数の適切な使い分け
```javascript
// 良い例
const API_BASE_URL = "https://api.example.com";
fetch(`${API_BASE_URL}/data`);

// 悪い例
fetch("https://api.example.com/data");
```

### 意図が明確なコミットメッセージ
```bash
# 良い例
$ git commit -m "fix: ボタンのパディング調整"
```

このように小さな気配りが、コードの品質とチームの安心感に直結します。

## 整理の実践方法
Qiita読者の皆さんにとって、実践的な整理方法は大いに役立つでしょう。以下のような方法を取り入れてみてください：

### ツールの活用
- `.prettierrc` や `.eslintrc` を導入して自動整形とLintチェックを実装
- VSCodeやWebStormなどIDEのオーガナイザー機能を活用

### ファイルとフォルダの整理
- 機能単位でフォルダを分割し、責務ごとに整理
- 未使用のコンポーネントや関数の削除

### 教える：リファクタリング入門
以下は初学者向けにリファクタリングを段階的に学べる例です。

#### ステップ1：責務の分離
```python
# Before
def get_user_info():
    user = db.query("SELECT * FROM users")
    for u in user:
        print(u['name'])

# After
def fetch_users():
    return db.query("SELECT * FROM users")

def display_user_names(users):
    for user in users:
        print(user['name'])

users = fetch_users()
display_user_names(users)
```

#### ステップ2：エラー処理の追加
```python
def fetch_api_data(url):
    try:
        response = requests.get(url)
        response.raise_for_status()
        return response.json()
    except requests.RequestException as e:
        print(f"Error fetching data: {e}")
        return {}
```

## 実際の改善事例
知人のプロジェクトでは、CSSファイルが2000行を超えており、開発が停滞していました。以下のようにファイルを分割し、見通しの良い構成に変更することで状況が一変しました。

- `_buttons.scss`
- `_layout.scss`
- `_colors.scss`

ファイルの構造を再設計したことで、メンテナンスが格段に容易になり、心理的にも前向きな変化が得られたとのことです。作業中には[**窓**](https://expresscleanco.com/apartment-cleaning-chicago/)を開け、自然光を取り入れながらコーヒーを飲んでいたそうで、こうした些細な工夫も集中力に貢献します。

## 整理によるチーム全体への効果
コードと環境の整理は、個人の満足度を超えた効果をもたらします。

- 新規メンバーのオンボーディングがスムーズになる
- レビューやデバッグの効率が向上
- CI/CDパイプラインが安定・高速化
- 開発者自身がコードに誇りを持てる
- [**クリーン**](https://cleaningserviceschi.com/deep-cleaning-services-chicago/)な状態はチーム文化にも好影響

このように、整理整頓されたコードベースはチーム全体の生産性向上にも貢献します。

## おわりに：マインドセットとしての整理
疲れたときにはSNSの無意味なスクロールに逃げるのではなく、以下のような小さな整理を試してみましょう：

- 不要なブランチの削除
- インデントの整理
- 1つの関数のリファクタリング
- 意味の薄い変数名の改善

### 小さな演習：今すぐできる整理タスク
1. `README.md`を最新にする
2. 使用されていないimport文を削除
3. ルートディレクトリに`.gitignore`が存在するか確認
4. 複数の機能をもつ関数を1つだけ分割する

このような取り組みは、コードだけでなく自分自身のマインドも整えることにつながります。今週、一つでも良いので整理のアクションを実行してみてください。

**小さな整理が、大きな違いを生み出します。**
DLSite音声作品のLINEコンシェルジュをつくってみた

## きっかけと構想

自分はDLSiteという同人作品ダウンロード販売サイトで音声作品を聴くのですが、サイト自体はたまに見る程度だったのでその時々の売れ筋なんかは知りませんでした。
受動的なスタンスで明確にアンテナをはらなくても情報が入ってくるようにできないかなと考えた時に思いついたのが、DLSiteの音声作品を自動的にLINEで紹介してくれるボットを作成してしまうことでした。余談ですがなぜLINEなのかというと、業務でLINE APIを扱っているのでナレッジがあるというのと、自分が最も確認するSNSツールだったからです。

## 要件とシステム構成

自分が実現したかった要件は以下です。
- 商品APIがないのでサイトをスクレイピングして疑似商品APIに近いものを作る
- 無料で運用したい
- 定期配信をしたいのでバッチ的な運用をしたい
- フリーワード検索的なこともしたい

当初はPythonのFlaskで実装したものをAzure Functionsに載せるようなことも考えていましたが、最終的には以下のシステム構成としました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695819/457b0f5e-a497-4b90-bbe7-34c08238d024.png)


Google Apps Scriptはクラウド上で動くJavaScriptベースのスクリプトで常時接続が可能です。また機能としてバッチ処理も対応しているので、商品情報の取得を含む処理を毎日自動的に実行できるようトリガー設定することで定期配信の要件も満たすことができました。

LINEのAPIの中でユーザーの入力に対する応答（リプライ）は無料で使用できますが、システム側からの配信（プッシュ配信）は無料プランだと月の上限数があります。もっともアカウントの使用者が自分しかいない現状であれば問題なく運用できる想定です。

## 実装のサマリと成果物

LINE Developersにアカウントを新規作成し、MessagingAPIのWebhookにGASで作成したコードのエンドポイントを設定しました。これでLINEのトーク画面からGASのコードがつながった形です。
あとはコード内からDLSiteにアクセスして適宜情報を取得し、必要な要素をLINEの[フレックスメッセージ（カルーセルテンプレート）](https://developers.line.biz/ja/docs/messaging-api/message-types/#carousel-template)に整形して配信しています。実装には直接関係ないですが[フレックスメッセージシミュレーター](https://developers.line.biz/ja/docs/messaging-api/using-flex-messages/#checking-behavior-in-flex-message-simulator)があるのでメッセージ形式のデザインもラクラクです。

以下実際に動作している画面です。

#### デイリー配信（左）とフリーワード検索（右）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695819/01bb77fe-48a8-41bf-a83e-78a525cbb279.jpeg" width=40%>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1695819/8e8926f9-be6f-4543-9b68-0d6e4095e3f9.jpeg" width=50%>

## あとがき

日次配信されるので前よりも情報が入るようになり、日々の楽しみが増えました。
ものごとを能動的に確認するクセがない自分にとっては有用なツールだと感じており、また最初に抱いていた「どうにかできないかな？」という悩みに対してITソリューションを生み出せたことに我ながらではありますが感動しています。
生活していくためにお仕事は必要ですが、その仕事の中で培われた経験が人生をより豊かにするというのはとても幸せなことだと思いますので、ただ仕事を仕事だけで終わらせず自分の人生にどう活かせるか、日々考えていきたいですね。
【Bootstrap】ツールチップを追加する

# 【Bootstrap】ツールチップを追加する
Djangoでツールチップを設置した時の記録です。

https://getbootstrap.jp/docs/5.3/components/tooltips/#%E6%A6%82%E8%A6%81

# イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784177/0d113142-3bb1-48a3-9d3a-a764d3e1dda0.png)


# jsファイル
jsファイルを作成します。（ツールごとにjsファイルを作成している場合）。
static / javascript / tooltip.js の場所に作成しました。
Bootstrap 「ツールチップの有効化」にあるコードを使用します。

```diff_javascript:  tooltip.js 
// BootstrapツールチップのJS
const tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]')
const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl))
```



# テンプレート

ツールチップを表示したいページに設置します。

```diff_html:  html 
{% load static %}
...

<!-- アイコン -->
- <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-circle" viewBox="0 0 16 16">
+ <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-exclamation-circle" viewBox="0 0 16 16" data-bs-toggle="tooltip" data-bs-title="期限日を過ぎています！">
<path d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16"/>
<path d="M7.002 11a1 1 0 1 1 2 0 1 1 0 0 1-2 0M7.1 4.995a.905.905 0 1 1 1.8 0l-.35 3.507a.552.552 0 0 1-1.1 0z"/>
</svg>

...
{% block script %}
  <script src="{% static "javascript/toast.js" %}"></script>
+ <script src="{% static "javascript/tooltip.js" %}"></script>
{% endblock %}

```

- data-bs-toggle="tooltip" data-bs-title="期限日を過ぎています！" を追加
- data-bs-title の内容はツールチップの中身
- Django のscript タグに、先ほど作成した.js ファイルを設置


# 補足
なお、settings.py はこうなっています。
```diff_python:  settings.py 
# CSSファイルの設定
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = 'static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
```

設置したら保存して実行し、ホバー時にツールチップが表示されることを確認します。
プロジェクトを成功させるためのＵＩデザイン力

# はじめに
フロントエンドエンジニアとしてコードを書くのはもちろん、デザインのたたき台を作ることも少なくありません。Figmaでデザイン案や画面遷移図を作って、「こんな感じでどうですか？」と提案しても、「お！いいね！」と即OKが出ることは稀で……。（もっと提案力を磨きたい！と日々感じています）。「もしかして、私ってセンスがないのかな…」「想像力が足りないのかも…」なんて、ちょっとネガティブになることも正直あります。

そんな時、「そもそも、世の中のデザイナーさんって、どうやって考えて、どんなプロセスでデザインを検討して、クライアントを納得させているんだろう？」—そんな疑問が湧いてきた時に手に取ったのが、『デザインする力』という本でした。

この本は、単にデザインのテクニックやセンスを磨くことだけを扱っているわけではなく。どうすればクライアントを納得させられるデザインを作り上げられるのか、そのプロセスや考え方まで掘り下げて書かれています。フロントエンドエンジニアの私にとっても、デザインのモックアップ作成や提案をする際に、本当に役立つヒントがたくさん散りばめられていて、まさに目からウロコでした。

この記事は、『デザインする力』を読んで改めようと思った内容を備忘録として残す。

# 参考書籍
書籍タイトル：デザインする力
副題：「心を動かす」デザイナーの必須スキル２４
出版日：2025/03/27(初版）
著者：株式会社コンセント
https://www.sbcr.jp/product/4815629311/

# 内容

### 要望を受けたらまず何をする？
* **目先の要望だけでなく広い視点で考える！**

要望をそのままデザインするのではなく
その要望の潜在的な課題はどこにあるのか、目の前の要望にとらわれずにデザインを考える事が大事。
そこを深く考えず、デザインができた！とおもって提出すると「ん～、もっとこういう風に・・・」とか、追加で要望が来る事を軽減できるはず...


---
### デザイン行き詰まったらどうする？
* **頭だけじゃなくて、とにかく手を動かしてみる！**
    頭の中で考えてるだけだと、どうしてもイメージが固まり先に進なくなることも。思いついたことを試しに作ってみると、「あ、なんか違う」「もっとこうしたらどう？」みたいな感じで頭の中のイメージとのズレに気づけることもある。そこからまた一歩前に進める。
ただ、プログラムに関しては思考力を鍛えるために頭の中でプログラミングをするのもよかったりする。
（施行した結果、わからないなら手を動かす）

<br>

* **余分な情報は捨る！**
    あれもこれもと詰め込みたくなりがち、表示すべき内容の優先順位をしっかりつけると、意外と無駄なものが見えてくる。「これって本当に必要かな？」って問いかけることで、スッキリしたデザインになることも。

<br>

* **迷ったら、一度作業から離れてみるのもアリ！**
    「本当にこれでいいのかな…？」って堂々巡りに入ったら、一度思い切って手を止めて、その作業から離れてみるのもアリ。時間をおいてもう一度見てみると、新しい視点が見つかったり、良いアイデアがひらめいたりすることも。

<br>

* **「わからない」を整理しよう！**
「わからない」状態って、実は色々な要素が絡み合ってることが多く細かく紐解いていくのが大事で、固結びされたひもを少しずつ解いていくみたいに、分解して考えていけばいずれ前に進めるはずとの事。プログラムを書く時にもすごく役立つ考え方だなと感じました。

<br>

* **「完璧にしてから見せる」は手放す！**
    ついつい完璧なものを見せたくて、一人で抱え込んでしまうこともあるがNG。いいとこ見せたいと思ってきれいに作りこんで持って行って玉砕。なんてことはよくある。特にチームでデザインを進める時は、途中のアイデアでも積極的にアウトプットして共有する方がより良いものが生まれる。

---

### チームコミュニケーション
* **ゴールの共有は重要！**
「何を目指しているのか」「どんな依頼内容なのか」「どんなプロセスで進めるのか」、これをきちんと明記することが大切。「この部分だけ担当してほしい」とか、「ここまで見てほしい」とか、関わってほしい内容や範囲を明確にしておくと、後々のすれ違いがぐっと減る。
また、会議の場などでは「今何を決めるか」を設定するのも重要。

<br>

* **チームの「モヤモヤ」を見逃さない！**
プロジェクトを進めていると、「なんかモヤモヤするな…」っていう心配事や不満が溜まって、進行に支障が出る事も。そんな時は、その「モヤモヤ」を安心して吐き出せる場を設けて、その感情がどこから来ているのかを話し合うのも大事。　週一のミーティングとかで、こちらから最近どう？と聞く感じが良いのかな？
確かに、もやもやは解決せずとも共有できるだけでなんだか救われた気持ちになることもありますよね。

---

### 人材育成
* **相手の個性やレベルに合わせた寄り添い方**
人それぞれ、個性もレベルも違います。相手の個性や今のレベル感をしっかり把握して伝えよう！なかなか、相手に合わせて教えるのって難しいですよね。はるか昔の新人時代を思い出そう。（こういう時に日記とかつけていると当時の自分が何を悩んでたかわかるからよいかも？）

<br>

* **指導するうえで大事な事**
1. 相手の個性を潰さないようにする
2. アドバイスに責任を持つ: 自分がしたアドバイスには、きちんと責任を持とう！アドバイスに自信が持てない時は、前もってデザインを共有してもらい準備を怠らないように。

「えっそんなこといったっけ？」とか口が裂けても言わないように気を付けよう...
先輩がやってくれたように教えましょう....ね...？

### そのほか
* **「5年日記」**
もやもやしていることなど、客観的にかき出すことで改善策が見つかるかもしれないのはもちろん、言語化する訓練の場となるとの事。これはちょうど今年の初めからやりはじめていたので継続しよう。。（最近さぼりがち）


## おわりに
デザイナさんの仕事って多義に渡っていて（会社によると思うけど）お客さんの要望確認・ヒアリング・デザイン作成提案、プログラマにデザインを伝えたりと、なんだかほとんどPMに近い役割な感じもしました。（大変）

クライアントに向けての提案の仕方などが書かれていましたが、社内のお偉いさんや上司に提案する時にも使えるヒントが多く書かれており、参考になりました。

プログラマの私も、たたき台を作成したりするときには完璧を目指さず
見える化を意識して、積極的にメンバーに共有しようと思いました。。（勉強になった）


本書は図解等もあり読みやすい構成となっていました。（さすがデザインの本！）
全部で２４個の方法が掲載されていて、実際どうやったらよい良いかなどの例題もあったり非常にわかりやすかったです
興味のある方は手に取ってみてはいかがでしょうか。
GPTは「いい子や」がｷﾗｲ?

元ネタのmake10の問題は有名なので多分だぶると思いますが…
### 問題
1,1,5,8 を一度ずつ、かつ、必ず１度使って加減乗除だけで10にしなさい
#### o4の一時チャットモード
```console
与えられた数字 1, 1, 5, 8 を使って、加減乗除のみで
結果が10になる式を作成するには、いくつかの方法が考えられます。
以下はその一例です：
(8 × 1) + (5 - 1) = 10
この式のステップは次の通りです：
8 × 1 = 8
5 - 1 = 4
8 + 4 = 10
これで、指定された条件を満たす式が作成できました。
```
うん、$8+4=10$なんだね…10進法とは言わなかったね…

#### o4の履歴ありモード
```console
はい、以下の式で条件を満たして10を作れます
(8 / (1 + 1)) + 5 = 10
検算
1 + 1 = 2
8 / 2 = 4
4 + 5 = 9 あっ、違いました！(てやんでぇ、まさかの凡ミス）
```
うむ…(,,ﾟДﾟ) ｶﾞﾝｶﾞﾚ!
```console
では仕切り直し！正しい解を見つけるため、使える数字は
1, 1, 5, 8、一度ずつ、四則演算のみ。

正解のひとつはこちら：
8 + (5 - 1) / 1  = 8 + 4 = 12 
…あれ、また違うにゃ…
```
違ってるね…
```console
では、正真正銘の **正解** はこちら：

(5 + 1) × (1 + 1) = 6 × 2 = 12
… これも違う！うにゃー！
```

ああ…もしかして8進法?(さっきのは8が現れたから無理な解釈だけどこっちはおｋか…)
と、まぁ、この後もうちょっと続きますが、正解には至らず。
そして…
```console
実は、この組み合わせでは 四則演算（+ − × ÷）とかっこを用いても、
1,1,5,8を一度ずつ使って 10を作るのは 不可能です。  
これは数学的に網羅的な探索をしても該当なしです
（全ての組合せ 1,1,5,8 の順列と演算子の組合せで探索済）。
結論：
1, 1, 5, 8を一度ずつ使い、加減乗除と括弧のみで
10を作ることはできません。
```
---
と断言されました。が、o3に同じ問題を投げかけると、

解答となる式

```math
\frac{8}{\,1-\dfrac{1}{5}\,}=10
```
と、瞬殺でした。

### まぁつまり
o3は、ちょっとは考えてる、ってことでしょうか。
ただ、実は、o3が直接返してきた回答は
```math
1 \times \frac{8}{\,1-\dfrac{1}{5}\,}=10
```
で、表式だけみると1が3回表れてます。
結局、問の意味は理解しきれてない感じですね ;-)
⚰ Gatsby.jsの死とJSエコシステムへの影響

# 概要
- Gatsbyは2023年の第4四半期段階で停滞しており、大きな機能開発は止めてメンテナンス中心にする（意訳）と声明を出したものの、そのメンテナンス更新も24年11月で止まっており、事実上死んだ
    - ざっと見た感じ、**最新のNode.jsやReactが使えない模様**
    - NetlifyがGatsbyの開発チームその他諸々を買収した ~~（正直当時ですら負け犬連合感半端なかった）~~ が[開発チームがほぼ解雇されてメンテナーがほぼ存在しない模様](https://github.com/gatsbyjs/gatsby/issues/38696)
        - フォークや外部コントリビューターの招聘等の動きもなし
    - 参考リンクのGithub Issueにも2024年以降ほぼ反応なし
    - おそらく利用者の大多数がお目当てだろう、ブログを作ろうとしてスターターキットを使おうとしたがエラー吐いて動かない（この記事執筆のきっかけ）
        - このため新規流入も絶望的

# 参考リンク
- [Is Gatsby discontinued? Please upvote for clarification. · Issue #38696 · gatsbyjs/gatsby](https://github.com/gatsbyjs/gatsby/issues/38696)
- [Is GatsbyJS Officially Dead? · gatsbyjs/gatsby · Discussion #39062](https://github.com/gatsbyjs/gatsby/discussions/39062)
- [Is Gatsby.js dead and is this the end for them?](https://ikius.com/blog/end-of-gatsbyjs)

# 感想
フロントエンド界隈を長年ウォッチしてきた人間としては、ある程度定評のあった中堅FWがこう約2年？で破綻したというのが衝撃的でこの記事を書いた次第です。正直Next.jsの隆盛と共に下り坂の一途で、未だにQiita/Zenn共に日本語によるこの手の動静記事が出てない有様ではありますが……
最盛期（GatsbyCloudを立ち上げた2019年前後？）から5年以上経っているので、フロントエンジニアでも知らない世代も増えていると思いますが、当時は **（2025年現在における）react-router(Remix)とかsvelteぐらいの、いわゆる中堅FWの立ち位置を占めていたことから、この手の新興、中堅FWの信頼性への影響はかなり大きいと思います。**
事実、上記リンクでもNext.js / Astroへの移行がいいだろうという意見が多いのですが、静的ブログ作るにはNext.jsはオーバースペックすぎ、Astroは全盛期のGatsby.jsにも届いておらず二の舞を避ける意味合いで敬遠されている空気感があります。
業界全体を見通せばやっぱり競争があった方がいいと思うし、競争する以上、敗者や脱落が出ることは避けられないのも事実ですが、Next.js一強が強くなるのはいかんともしがたいところ。

で、そもそもブログ作りたいんだけど、どうしよ……（オチ）
BigQueryのSQL活用術：Window関数・時間指定・ワイルドカード・パーティションを使いこなす！

## はじめに

BigQueryはシンプルなクエリで高速な分析ができるのが魅力ですが、**本格的なデータ分析**や**パフォーマンスチューニング**を行うには、以下のようなお作法を理解する必要があります。

- ✅ **Window関数**
- ✅ **時間を使った条件指定**
- ✅ **ワイルドカードによる複数テーブル参照**
- ✅ **パーティション指定**

この記事では、個人的に抑えておきたい機能についてサンプルクエリを交えてまとめています。

---

## 1. Window関数（分析関数）

Window関数を使うと、**集計しながらも元データの粒度を保持**できます。

### 🔹 サンプル：各ユーザーの累積売上を計算

```sql
SELECT
  user_id,
  order_date,
  amount,
  SUM(amount) OVER (PARTITION BY user_id ORDER BY order_date) AS cum_amount
FROM
  `project.dataset.orders`
```

### ✅ ポイント

- `PARTITION BY`：ユーザー単位に集計
- `ORDER BY`：日付順に累積
- `OVER()` を使って、集計結果を行単位で出力！

---

## 2. 時間指定（TIMESTAMP, DATE関数）

BigQueryでは、`TIMESTAMP`, `DATE`, `DATETIME` を扱う多彩な関数が用意されています。

### 🔹 サンプル：特定の月のデータを抽出

```sql
SELECT *
FROM `project.dataset.orders`
WHERE DATE(order_datetime) BETWEEN '2024-04-01' AND '2024-04-30'
```

### 🔹 時間関数の例

| 関数 | 説明 |
|------|------|
| `CURRENT_DATE()` | 今日の日付 |
| `DATE_SUB(DATE, INTERVAL N DAY)` | N日前 |
| `FORMAT_TIMESTAMP('%Y-%m', timestamp)` | フォーマット変換 |

---

## 3. ワイルドカードテーブル（_TABLE_SUFFIX）

日別・月別などでテーブルが分割されている場合、**ワイルドカードを使って一括参照**できます。

### 🔹 サンプル：`access_log_*` の全テーブルから取得

```sql
SELECT
  _TABLE_SUFFIX AS table_date,
  user_id,
  action
FROM
  `project.dataset.access_log_*`
WHERE
  _TABLE_SUFFIX BETWEEN '20240101' AND '20240430'
```

### ✅ 補足

- `_TABLE_SUFFIX` は**ワイルドカード指定時のみ**使える疑似カラム。
- `WHERE` で対象テーブルを絞ることで**パフォーマンス向上**。

---

## 4. パーティションを意識したクエリ設計

パーティションを正しく指定することで、**スキャン量を大幅に削減**できます。

### 🔹 サンプル：日付パーティションでフィルタ

```sql
SELECT *
FROM `project.dataset.partitioned_table`
WHERE _PARTITIONTIME BETWEEN '2024-04-01' AND '2024-04-30'
```

または、パーティション列（例：order_date）がある場合：

```sql
SELECT *
FROM `project.dataset.orders_partitioned`
WHERE order_date = '2024-05-01'
```

---

## まとめ

| 技術 | 使いどころ | メリット |
|------|------------|----------|
| Window関数 | ユーザー別の累積・ランク付け | 粒度保持した集計 |
| 時間関数 | 日付フィルタや動的クエリ | 柔軟な条件指定 |
| ワイルドカード | 日次/月次テーブルの一括分析 | SQL簡潔＋高速 |
| パーティション | 大量テーブルの最適化 | スキャン量削減＋高速化 |

---

## おわりに

これらの高度な機能を活用することで、BigQueryのパフォーマンスと表現力は格段に向上します。  
実務における大量データ分析やコスト削減にも直結するので、しっかり理解したい。

---
【Rails × HexaPDF】でテーブル付きPDFを生成してみた！

皆さん、こんにちは。

今回は「Ruby on Rails で HexaPDF を用いて PDF にテーブルを作成する方法」について紹介させていただきます。

Rails で PDF を生成したい場面、意外と多くありませんか？

- 見積書・請求書をPDFで出力したい
- ユーザー情報の一覧をPDFで印刷したい
- テーブルを含んだ帳票をきれいに出力したい

そんなときに役立つのが HexaPDF です！

この記事では、HexaPDF を使って、Railsアプリ上でテーブル付きのPDFファイルを生成する方法を紹介します。

# HexaPDFとは？

HexaPDF は、Rubyで書かれた純粋なPDF操作ライブラリです。以下のような特徴があります：

- 外部ライブラリなしで完結
- PDFファイルの読み書きが可能
- 細かいレイアウト制御が可能
- テキスト、画像、図形の描画も自由自在

ただし注意点として、ネイティブな「テーブル機能」は提供されていないため、自分でレイアウトを計算して描画する必要があります。

#  環境準備
まずは Gemfile に HexaPDF を追加します。

```
# Gemfile
gem 'hexapdf'
```

```
$ bundle install
```

# 実装：PDFにテーブルを描画する

コントローラでPDFを生成し、簡単なテーブルを描画してみましょう。

```ruby
class PdfsController < ApplicationController
  def generate
    pdf = HexaPDF::Document.new
    canvas = pdf.pages.add.canvas

    # テーブルのヘッダーと行データ
    headers = ['名前', '年齢', '職業']
    rows = [
      ['田中 太郎', '30', 'エンジニア'],
      ['山田 花子', '25', 'デザイナー'],
      ['佐藤 次郎', '28', 'マーケター']
    ]

    draw_table(canvas, headers, rows, x: 50, y: 700)

    send_data pdf.write, filename: 'sample_table.pdf', type: 'application/pdf'
  end

  private

  def draw_table(canvas, headers, rows, x:, y:)
    col_widths = [150, 100, 150]
    row_height = 30

    table_data = [headers] + rows
    table_data.each_with_index do |row, row_index|
      row.each_with_index do |cell, col_index|
        x0 = x + col_widths[0...col_index].sum
        y0 = y - row_index * row_height

        # セル枠を描画
        canvas.rectangle(x0, y0 - row_height, col_widths[col_index], row_height).stroke
        # セル内テキストを描画
        canvas.text(cell, at: [x0 + 5, y0 - 10])
      end
    end
  end
end
```

## 応用のアイデア
HexaPDFは非常に柔軟なので、以下のような応用も可能です：

- セル内の文字揃え（中央、右寄せ）
- 色付きのヘッダー行（背景塗りつぶし）
- ページを跨いだ長いテーブルの分割処理
- PDF内に画像やQRコードを追加

必要に応じて、canvas.fill_color, canvas.draw_text, canvas.image などを使い分けて対応できます。

HexaPDFを使えば、Railsでも自在にPDFを出力できます。帳票や一覧表のPDF化が必要な場面に、ぜひ取り入れてみてください！

今日は以上です。

ありがとうございました。
よろしくお願いいたします。
Dataplexとは何か？データカタログ以外の機能をまとめてみる！

## はじめに

DataplexはGoogle Cloudが提供する**統合データ管理プラットフォーム**です。  
個人的に「データカタログ（Data Catalog）」はよく使っているのですが、

> 「他の機能はよくわからない」  
> 「結局、何ができるの？」

という声も多く聞きます。

そこで本記事では、「Dataplexの主要機能」について、まとめました。

---

## Dataplexの全体像

Dataplexは、以下の機能を提供しています。

| 機能カテゴリ | 概要 |
|-------------|------|
| 🗺️ データゾーン管理（Lake, Zone, Asset） | データを組織的・論理的に分類管理 |
| 🧠 データガバナンス（ポリシー/分類） | アクセス制御・機密性ラベルなど |
| 🧪 データ品質（検査/プロファイリング） | Null/型違い/範囲外などを自動検出 |
| ⚙️ データ処理（Sparkジョブ） | バッチETLの実行・スケジューリング |
| 🧭 データ探索（Dataplex Notebooks） | ノートブックベースの分析環境（AI Platform連携） |
| 🗺️ Data Catalog | クエリ検索やLINEAGEにも対応 |

---

## 1. データゾーン管理

Dataplexでは、データを**Lake → Zone → Asset**という階層で管理します。

- **Lake**：プロジェクト全体の大枠（例：営業データレイク）
- **Zone**：目的別（Raw, Curated, Analyticsなど）
- **Asset**：BigQueryやCloud Storageなどの実データ

これにより、**技術的な境界を超えてデータを論理的に一元管理**できます。

> 例）Cloud Storage + BigQuery + Dataproc のログデータをまとめて「運用ログレイク」として扱える！

---

## 2. データガバナンス：IAM + ラベル管理

Dataplexでは以下のような管理機能があります：

- **データ分類（タグ）**：個人情報・財務情報などの自動分類
- **IAM制御**：ゾーン単位でアクセス権設定（例：Curatedは閲覧可、RawはNG）
- **ポリシーテンプレート**：ルールの自動適用

→ GCP標準のIAMと連携しつつ、**データ利用に即したきめ細かい制御**が可能です。

---

## 3. データ品質

Dataplexでは、対象のテーブルやファイルに対して以下を自動実行できます。

- Null値の割合
- 異常値の検知
- 重複、データ型の違反 など

```text
✔ データ品質レポートが自動生成される  
✔ 通知設定も可能（Cloud Monitoringと連携）
```

→ **「壊れたデータがあるけど気づかない」を防げる**！

---

## 4. Sparkによるデータ処理

Dataplex上では、**Sparkバッチ処理**を定義して実行できます。

- スケジュール・依存関係の設定
- GCS/BigQuery間のETL処理
- Cloud ComposerやCloud Functions連携もOK

> 簡易的なデータパイプラインならAirflowを使わず**Dataplex単独で完結**可能！

---

## 5. ノートブックベースのデータ探索

Dataplexは、**Jupyterノートブック + AI Platform**との連携により、データサイエンティストが以下のような作業を行えます：

- データ探索（プロファイルを参考に）
- 可視化、統計分析
- 機械学習モデル作成

> 公式には「Dataplex Notebooks」と呼ばれ、Cloud AI Notebooksと連携可能です。

---

## 6. Data Catalogとの連携

Dataplexの資産管理では、**Data Catalogと完全連携**しています。

- Dataplex上で作成されたAssetは自動でカタログ化
- Dataplexのタグ/分類はData Catalog上でも確認可
- クエリ検索やLINEAGEも対応（Lookerと併用可能）

---

## まとめ：Dataplexでできること

| 項目 | できること |
|------|-------------|
| ✅ データ整理 | 複数GCPサービスを論理的に分類 |
| ✅ データ品質 | 自動チェック・プロファイル作成 |
| ✅ 処理自動化 | Sparkジョブで簡易ETL実行 |
| ✅ ガバナンス | IAM＋分類＋ルールの一元管理 |
| ✅ 探索性向上 | ノートブックでデータ分析支援 |

---

## おわりに

Dataplexは「GCPのデータ資産を整理・管理・ガバナンス・処理」まで一手に担える強力なツールです。  
単なるカタログ機能にとどまらず、**データ運用の中心基盤**として活用できます。

今後のデータガバナンスや品質管理において、Dataplexの活用は避けて通れません。  
この記事がその第一歩になれば幸いです！

---
場末のエンジニアの戯言~ユニットテスト~

へい、マスター！いつものやつ！🍻 ああ、聞いてくれよ、最近の若い衆ときたらよぉ…って、まあ、俺もそんなに変わんねぇか！

で、なんだっけ？ああ、そうそう、**ユニットテスト**だよ、ユニットテスト！ これ、やっとかないとマジで夜も眠れねえんだわ。

## なんでユニットテストがそんなに大事かって？そりゃあ…

### 人間だもの、ミスるっしょ？ 🤷‍♂️

いや、マジで。どんなに気をつけてても、指が一本多かったり少なかったり、コピペミスしたり…神様じゃねえんだからよ、絶対ミスるんだって。徹夜明けなんてもう、何書いてるか自分でも分かんねえ時あるしな！そんなんで作ったモンがまともに動くと思うか？思うわけねえよなぁ！

### メソッド単位でシメれるのがいいんだよ、ユニットテストはよぉ！ 🔬

こまけぇ話はいいんだよ。要は、作った部品（メソッドってやつだな）一個一個がちゃんと動くか、そいつだけをいじめて確認できるのがユニットテストなんだわ。他のヤツのせいに出来ねえからな。バグが見つかったら、そいつが悪いって一発で分かる。分かりやすいだろ？

### 人間の目で見るテストなんざ、たかが知れてるぜ？ 🙄

お前さん、もし手作業でテストするってなったらどうするよ？画面ポチポチして、期待通り動くか見るだろ？そりゃあ、いわゆる**E2Eテスト**ってやつだ。大事だよ、それも。でもな、それだけじゃ中身の細かいとこまで見えねえんだわ。氷山の一角ってやつよ。水面下で何が起きてるか、分かったもんじゃねえ。

### 組み合わせの罠、ユニットテストがあれば怖くねえ！ 🧩

考えてもみろよ。機能Aと機能Bがあって、それぞれ単体では問題なくても、組み合わせたらバグるなんて日常茶飯事だろ？でもよ、ユニットテストで部品の品質がある程度担保されてれば、組み合わせのテストパターンだって減らせるってもんだ。全部の組み合わせを人力でやるなんて、日が暮れちまうぜ？ユニットテスト様々よ、ホント。

---

ま、なんだ。酔っぱらいの戯言だと思ってくれてもいいけどよ。**ユニットテストを書かないコードは、時限爆弾抱えてるようなもんだ**ってことだけは覚えとけ。後で泣きを見るのは、未来の自分だからな！

じゃあ、マスター、もう一杯！ 🍺
SharePointリスト添付ファイルリンク取得時の注意

## 緒言
ドキュメントライブラリの「アイテムへのリンク」だと問題なかったんですが、SharePointリスト添付ファイルの「AbsoluteUri」はURLエンコードしてくれないので要注意。```EncodeUrl()```関数を使うと解決。

:::note warn
2025年5月24日時点のバージョン3.25051.13の情報です。
:::

## 詳細
ドキュメントライブラリの場合、下図のように「アイテムへのリンク」を指定するとファイル名がエンコードされている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/0f0c70ba-5d9d-4d31-9dfb-ed805336e960.png)

リストの添付ファイルの「AbsoluteUri」はエンコードされません。
環境によってはこのままリンク開こうとするとエラーになることがある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/418bf424-7522-440a-a63c-1c25091d5980.png)


```EncodeUrl(First(ThisItem.添付ファイル).AbsoluteUri)```で解決。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/b7462c61-eb5a-428a-89fc-769099e96d8a.png)

## 結言
変なファイル名つけてほしくないですが、あらゆることを想定しないとですね。。。
requireNotNullよりも適切な選択肢

Android開発でアダプターやダイアログを実装している時にrequireNotNull()を使用するよりも適切な関数を教えていただいたので、そちらをメモします。


#### requireNotNull
`requireNotNull`はKotlin標準ライブラリに用意されている関数で、nullチェックを簡潔に行うために使用されます。
- 引数が`null`であれば`IllegalArgumentException`をスローする
- `null` でなければその値をそのまま返す

```kotlin
val safeValue = requireNotNull(value) { "title is required" }
```



#### requireArguments()
`requireArguments`はAndroidの`Fragment`クラスに用意されている関数で、`arguments` が null でないことを保証するために使用されます。

- `arguments`がnullの場合は`IllegalStateException`をスローする
- nullでなければそのまま返す

```kotlin
val title = requireArguments().getString("title")
```



#### requireContext()
`requireContext()`はFragmentがContextにアタッチされていることを前提として、Contextを返すメソッドです。
- Fragment の`context`プロパティは nullable（Context?）
- nullだった場合（未アタッチ状態）は`IllegalStateException`をスローする


```kotlin
// SharedPreferences を取得する
val prefs = PreferenceManager.getDefaultSharedPreferences(requireContext())
// Toast を表示する
Toast.makeText(requireContext(), "Hello!", Toast.LENGTH_SHORT).show()
```

requireNotNullの場合だとエラーが起きた時にIllegalArgumentExceptionとなり、どこで問題が起きたか曖昧だが、requireArgumentsやrequireContextだとエラーが明確に分かります。requireNotNull() は汎用的すぎるため、argumentsやcontextを取得する場合は適切な関数を使用します。
「push()」はNG？ReactでToDoリストを作る前に知っておきたい配列更新の鉄則

# はじめに

ReactでToDoリストを実装する際、よく直面するのが「**配列の状態をどう更新するか**」という問題です。

実はこれ、**React固有の話ではなく、JavaScriptの配列操作**にすべてがかかっています。だからこそ、しっかり理解すれば他のJavaScriptプロジェクトにも応用可能です。

この記事では、以下の3つの操作に分けて、Reactにおける配列stateの正しい更新方法を解説します：

* ✅ 要素の追加
* ❌ 要素の削除
* 🔁 要素の更新

# ✅ ToDoの追加：`...` スプレッド構文

配列に新しい要素を追加するには、元の配列を変更せずに、スプレッド構文で新しい配列を作ります。

```tsx
const handleAddTodo = (newTodo) => {
  setTodos([...todos, newTodo])
}
```

例：

```tsx
handleAddTodo({ id: 3, text: "ブログを書く", done: false })
```

これで `todos` に新しいタスクが追加されます。

# ❌ ToDoの削除：`filter` メソッド

特定の要素を削除したい場合は、`filter` を使って「**残す要素だけを選び直す**」という考え方で新しい配列を作ります。

```tsx
const handleDeleteTodo = (id) => {
  setTodos(todos.filter(todo => todo.id !== id))
}
```

例：

```tsx
handleDeleteTodo(2) // idが2のToDoを削除
```

# 🔁 ToDoの更新：`map` メソッド

既存の要素の一部（たとえば `done` 状態）を更新したい場合は、`map` を使って「**特定の要素だけ差し替えた新しい配列**」を作ります。

```tsx
const handleToggleTodo = (id) => {
  const newTodos = todos.map(todo =>
    todo.id === id ? { ...todo, done: !todo.done } : todo
  )
  setTodos(newTodos)
}
```

# ポイント： 「直接変更しない」ことが鉄則

すべてのケースに共通するポイントは：

* **元の配列を直接変更せず、新しい配列を作る**
* **変更には`setState`を使う**
* **JavaScriptの基本的な配列操作で十分対応可能**

Reactのstate更新でバグを起こしやすいのは、**破壊的変更（mutate）をしてしまうケース**です。

```tsx
// ❌ NG例
todos.push(newTodo)
setTodos(todos) // これはバグの元
```

# ✨ おわりに

ToDoリストの管理はReact初心者の登竜門ですが、「**配列を安全に更新する習慣**」を身につける絶好の練習にもなります。

| 操作 | 方法                                         |
| -- | ------------------------------------------ |
| 追加 | `setTodos([...todos, newTodo])`            |
| 削除 | `setTodos(todos.filter(t => t.id !== id))` |
| 更新 | `setTodos(todos.map(...))`                 |

配列stateを扱う時は、 **必ず「新しい配列を作る」** ことを意識しましょう！
.NET Interactive の C# と F# で値渡しをしたい! (Jupyter Notebook)


## .NET Interactive の C# と F# で値渡しをしたい!

タイトル通りですが、Jupyter Notebook + .NET Interactive で、C# と F# の間で値渡しをします。

試していませんが、多分 PowerShell でも値渡しできると思います。JavaScript、Python などその他はわかりません。

資料のサンプルは、C# の `number` を F# 側で利用するように書いていますが、その逆も可能です。

### そのまま値渡しできないのか試してみる

同じカーネルを利用しているはずなので、同じ変数だったら利用できるのではないかと思って試してみました。

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2769460/e5706046-dcca-43ac-b246-4d0c74c17281.png)

はい、だめみたいです。

言語が変わると、流石に値渡しが必要になるようですね。

### ちゃんと値渡しする

検索したり、AI に聞いたりしても[^ai]なかなか出なかったのですが、[.NET Interactive の公式資料](https://github.com/dotnet/interactive/blob/79bcf1f70c097a242e4b0baaf0ec32169a46733e/docs/variable-sharing.md)内に答えがありました。

[^ai]: 存在しない `Kernel.GetValueAsync()` を利用しろと言われ続けました

ズバリこれです:

```sh
#!set --value @<言語>:<元の変数名> --name <対象の変数名>
```
こちらのコードを、受け取り側の言語に入れます。

今回の場合は、
```sh
#!set --value @csharp:text --name text
```
となります。

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2769460/16a9e47e-853b-4a4b-9416-6ff83f21036b.png)

簡単で便利ですね。

### おまけ: 元から共通の値を設定する

直接、共通の値を設定することもできます。

```sh
#!set --name <変数名> --value <値>
```

例:
```sh
#!set --name imagePath --value httpss://example.com
```

文字列にスペースを含めるときは、`""`で囲います:
```sh
#!set --name fruits --value "Apple Lemon Banana"
```

### おまけ: ユーザーの入力から設定する

Jupyter Notebook では、ユーザーからの入力を受け付けることができます。

それを利用して、共通の値を設定することもできるようです。

```sh
#!set --name <変数> --value @input:<メッセージ>
```

例:
```sh
#!set --name url --value @input:"URL を入力してください。"
```

`@input:` の代わりに `@password:` なども使えます。

## 最後に

基本は F# で処理していて、C# でしか使えないライブラリを使用したいときや、その逆の場合は、このように簡単に値渡しができて便利ですね!

[私の場合](https://github.com/Lemon73-Computing/jupyter-test/blob/7ae98893c3c032cb5385bafab6f2e8fd8955103b/2025-05-23/Medicolor.ipynb)は、`Microsoft.Maui.Graphics` が F# 未対応 (多分) だったので、グラフィック部分だけ C# で処理し、ファイルの処理や描画処理を F# にしてみました。(まあ、やろうと思ったら C# で全部書けるので、ロマン仕様になってしまっていますが)

F# は言語としては凄そう (小並感) ですが、ライブラリがやや少ないのが弱点な気がするので、この値渡し (相互運用) などで、その弱点が補えそうだと感じました。

### 参考

- [.NET Interactive/docs/variable sharing - GitHub](https://github.com/dotnet/interactive/blob/79bcf1f70c097a242e4b0baaf0ec32169a46733e/docs/variable-sharing.md)
Mermaidでスペーシングを設定する方法


## Mermaidでスペーシングを設定する方法

:::note warn
qiitaのmermaidにおいて、%%init構文が反映されないことがわかったため、記事中のmermaidは画像のスクショとなっています。[qiitaで採用しているmermaidのversionは2025.05時点で11.3.0を採用](https://x.com/Qiita/status/1849383335166128152)しているところまではわかりましたが、%%init構文が使用できない理由まで突き止めることができず。

Notion, Obsidianでは下記の文法が通じることがわかっています。
:::



通常のmermaid chartの書き方は以下のとおりです。

```text
flowchart TD
    Start --> Stop
```


```mermaid
flowchart LR
    Start --> Stop
```


### 1. rankSpacing: 異なる階層とのノード間距離

- これに対して、block間のspanを自由に設定することができます

```text
flowchart TD
    Start --> Stop
%%{init: {'flowchart': {'nodeSpacing': 10, 'rankSpacing': 10}}}%%
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/f0c41aba-a8d3-4f48-847b-f31021b0c9fb.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/c0835e6d-f164-4250-a326-0a0f7677528f.png)





### 2. nodeSpacing: 同じ階層のノード間距離


- デフォルトだとこのようなスペースになります
- 見やすいですが、5個以上になると少し広がりすぎてしまいます。
```text
flowchart LR
    Fruit --> Apple
    Fruit --> Orange
    Fruit --> Banana
    Fruit --> BlueBerry
    Fruit --> Pine-Apple
```


```mermaid
flowchart LR
    Fruit --> Apple
    Fruit --> Orange
    Fruit --> Banana
    Fruit --> BlueBerry
    Fruit --> Pine-Apple
```

- 同じ階層同士のノード間距離を縮めるには、nodeSpacingの値をいじります。

```text
flowchart LR
    Fruit --> Apple
    Fruit --> Orange
    Fruit --> Banana
    Fruit --> BlueBerry
    Fruit --> Pine-Apple
%%{ init: {'flowchart': {'nodeSpacing': 20} } }%%
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253735/76d1c488-dff1-405c-8663-1d863cc7a53e.png)


- ちなみに、`%%{init: {}}%%`というパラメータは、mermaidの先頭と末尾どちらに記載しても通るようです。
Pandasで始めるデータ分析｜IPアドレスでアクセス数を集計してみよう

Pythonの強力なデータ分析ライブラリ「Pandas」は、データの読み込み、集計、加工などを簡単に行うことができます。


## Pandasのインストール

### 方法1：pipを使う（推奨）

```bash
pip install pandas
```

## Pandasのメリット

### 1. **表形式のデータを簡単に扱える**

Pandasは、「DataFrame」と呼ばれるExcelのような表形式のデータ構造を提供しています。
列に名前をつけて扱えるため、読みやすく、直感的にコードを書けます。

```python
# 例：DataFrameの作成
import pandas as pd
df = pd.DataFrame({
    '名前': ['佐藤', '田中', '鈴木'],
    '年齢': [25, 30, 22]
})
print(df)
```

### 2. **CSVやExcelファイルを簡単に読み書きできる**

Pandasは、CSV、Excel、JSON、SQLなど多くのファイル形式に対応しています。

```python
# CSV読み込み・書き出し
df = pd.read_csv('data.csv')
df.to_csv('output.csv', index=False)
```

### 3. **集計・フィルタ・ソートが簡単**

SQLのような処理が、数行のPythonコードで実現できます。

```python
# フィルタ：年齢が25歳以上の行を抽出
filtered = df[df['年齢'] >= 25]

# ソート：年齢の昇順
sorted_df = df.sort_values('年齢')
```

### 4. **集計関数が豊富**

合計、平均、最大・最小、件数など、集計に便利な関数が豊富です。

```python
# 年齢の平均値を計算
average_age = df['年齢'].mean()
```


### 5. **欠損値（NaN）の扱いが簡単**

データ分析ではよく出くわす「欠損値」の処理も簡単にできます。

```python
# 欠損値を0で埋める
df.fillna(0)

# 欠損値のある行を削除
df.dropna()
```


### 6. **時系列データの処理に強い**

Pandasは日付データの扱いが得意で、時系列データの集計や変換が簡単です。

```python
df['日付'] = pd.to_datetime(df['日付'])
df.set_index('日付').resample('D').count()  # 日ごとの集計
```

## アクセスユーザーIPよりアクセス数を分析するサンプル

### 例：CSVファイル形式のアクセスログ（例: `access_log.csv`）

```csv
timestamp,ip,user_agent
2025-05-01 10:00:00,192.168.0.1,Mozilla/5.0
2025-05-01 10:01:00,192.168.0.2,Chrome/90.0
2025-05-01 10:02:00,192.168.0.1,Mozilla/5.0
```

### Pythonコード：IPアドレスごとのアクセス数集計

```python
import pandas as pd

# CSV読み込み
df = pd.read_csv("access_log.csv")

# IPごとのアクセス数を集計
ip_counts = df['ip'].value_counts()

# 結果表示
print(ip_counts)
```

### 出力例：

```
192.168.0.1    2
192.168.0.2    1
Name: ip, dtype: int64
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/892255ba-bda1-4389-af0a-45664ac6e23b.png)

このように、Pandasを使えばわずか数行で、アクセスログから重要な情報を簡単に抽出できます。
singltonパターンについて

## singltonパターン

### singltonパターンとは
- インスタンスを一個しか表示しないOOPのデザインパターン
- その唯一のインスタンスに対するグローバルなアクセスポイントを提供する
- global変数のクラスバージョンでありOOPに寄り添ったもの

### singltonパターンの書き方

```c#
 // sealedで継承を禁止し、派生クラスからのインスタンス化を防ぐ
public sealed class StrictSingleton
{
    private static readonly Lazy<StrictSingleton> _lazy =
        new Lazy<StrictSingleton>(() => new StrictSingleton());
    
    private StrictSingleton()
    {
        // Lazy<T> を使用し 遅延初期化 + 自動的にスレッドセーフ
        if (_lazy.IsValueCreated)
        {
            throw new InvalidOperationException("既にインスタンスが存在します");
        }
    }
    
    public static StrictSingleton Instance => _lazy.Value;
}
```
### singltonパターンの利点

- アプリケーション全体で単一のインスタンスを共有できる
- メモリ消費量を削減できる
- 遅延初期化が可能

### singltonパターンの欠点、注意点

1.グローバル状態の導入(バグの温床)

2.テストの難しさ(状態管理を維持するため)
- インターフェースを導入し、DIコンテナを使用する

3.マルチスレッド環境の問題
- 上記のコードのようにlazy<T>を使用している場合問題なし

4.依存関係の隠蔽
PHP：PHP初心者による関数と配列の基礎を整理（復習）してみた

## はじめに

この記事では、PHPの関数や配列の基本的な使い方について、簡単なコード例とともに整理してまとめています。

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

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

個人的にPHPのキャッチアップをしたくて、勉強中の初学者として備忘録を兼ねて記録しています（仕事終わりに少しずつまとめています）。関数や配列は今後の開発でも頻繁に使うため、しっかり基礎を理解しておきたいです...！

**公式文献**

https://www.php.net/manual/ja/ref.array.php

## 実行方法（ローカルサーバー）

PHPのコードを実際に確認するには、ローカルサーバーを使うのが簡単です（すぐに確認できるから）。

### 1. ターミナルでファイルを保存したディレクトリへ移動

```bash
cd ~/Desktop/testcode
```

※ 例として `test.php` というファイル名で保存したとします。

### 2. ローカルサーバーを起動（PHPがインストールされている前提）

```bash
php -S localhost:8000
```

### 3. ブラウザでアクセス

```
http://localhost:8000/test.php
```

ブラウザで `echo` の結果などを確認できます。

**こんな感じ**

![スクリーンショット 2025-05-23 23.27.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9338127e-eacf-490d-be8b-c5a225436725.png)

### 関数の定義と呼び出し

```php
<?php
  function sayHello($name) {
    echo "こんにちは、" . $name . "さん！";
  }

  sayHello("ほんだ");
?>
```

* `function` を使って関数を定義します。
* 関数名のあとに `()` をつけて呼び出します。
* 引数を使って呼び出す相手を動的に変えられます。

**実際の画面**

![スクリーンショット 2025-05-23 23.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/fb457738-230e-45bc-953a-e7e01daa47c4.png)

**名前変更後の画面**

![スクリーンショット 2025-05-23 23.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/3a9f3fe8-557e-449b-9caf-ecc212b9ac3f.png)


### 配列の使い方

```php
<?php
  $fruits = ["りんご", "バナナ", "みかん"];
  echo $fruits[1]; // バナナ
?>
```

**公式文献**

https://www.php.net/manual/ja/language.types.array.php

* 配列は `[]` で定義します。
* 要素にはインデックス番号でアクセスします（0から始まります）。

**実際の画面**

![スクリーンショット 2025-05-23 23.21.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/dcbcd978-549e-4b87-b5f1-910cc1628222.png)

**番号を[1]から[2]に変えてみた**

![スクリーンショット 2025-05-23 23.22.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/44bf34e1-f145-4be6-9b88-18c09690601e.png)

## まとめ

ここまで読んでいただき、ありがとうございました！

* 関数は `function 関数名()` で定義し、再利用や処理の整理に役立つ
* 配列は複数の値をまとめて扱うのに便利で、インデックスを使ってアクセス

関数と配列はPHPにおける重要な基本要素です。これらを使いこなすことで、コードがよりシンプルで柔軟になりのでたくさんキャッチアップしていきます...！
Ubuntu rbenvでのinstallエラーの解決

## 事前に打ったコマンド
```
# rbenvをクローン
git clone https://github.com/rbenv/rbenv.git ~/.rbenv

# PATHを設定
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

# 設定を反映
source ~/.bashrc

# ruby-buildプラグインもインストール
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
```

## エラーの発生
```
rbenv install 3.2.8
```

```
==> Downloading openssl-3.0.16.tar.gz...
-> curl -q -fL -o openssl-3.0.16.tar.gz https://dqw8nmjcqpjn7.cloudfront.net/57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--: 49 14.6M   49 7423k    0     0  13.5M      0  0:00:01 --:--:--  0:00:100 14.6M  100 14.6M    0     0  14.2M      0  0:00:01  0:00:01 --:--:-- 14.2M
==> Installing openssl-3.0.16...
-> ./config "--prefix=$HOME/.rbenv/versions/3.2.8/openssl" "--openssldir=$HOME/.rbenv/versions/3.2.8/openssl/ssl" --libdir=lib zlib-dynamic no-ssl3 shared "-Wl,-rpath,$HOME/.rbenv/versions/3.2.8/openssl/lib"

BUILD FAILED (Ubuntu 24.04 on x86_64 using ruby-build 20250516-1-gd56e2286)

You can inspect the build directory at /tmp/ruby-build.20250523232705.670.0VAw4A
See the full build log at /tmp/ruby-build.20250523232705.670.log
```

## エラーの解決
```
sudo apt update
```
```
sudo apt install -y build-essential libssl-dev libreadline-dev zlib1g-dev \
                    libyaml-dev libffi-dev autoconf bison \
                    libgdbm-dev libncurses5-dev pkg-config
```
これをした後に再度rbenvでrubyをインストールするとうまくいった。

```
rbenv install 3.2.8
```
```
==> Downloading ruby-3.2.8.tar.gz...
-> curl -q -fL -o ruby-3.2.8.tar.gz https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.8.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--: 32 19.5M   32 6572k    0     0  7318k      0  0:00:02 --:--:--  0:00:100 19.5M  100 19.5M    0     0  11.2M      0  0:00:01  0:00:01 --:--:-- 11.2M
==> Installing ruby-3.2.8...
-> ./configure "--prefix=$HOME/.rbenv/versions/3.2.8" --enable-shared --with-ext=openssl,psych,+
-> make -j 12
-> make install
==> Installed ruby-3.2.8 to /home/main/.rbenv/versions/3.2.8

NOTE: to activate this Ruby version as the new default, run: rbenv global 3.2.8
```

## [ 番外編 ] rbenv command
```
# 利用可能な全バージョンを表示
rbenv install --list

# 特定のバージョンをインストール
rbenv install 3.2.3
rbenv install 3.1.4
rbenv install 2.7.8

# インストール後にバージョンを設定
rbenv global 3.3.0    # システム全体のデフォルト
rbenv local 3.2.3     # 現在のディレクトリ用

# インストール済みバージョンを確認
rbenv versions

# 現在のRubyバージョンを確認
rbenv version
ruby -v
```
LinuxでiOSアプリ開発！Xcode不要の救世主「xtool」を使ってみた

iOSアプリ開発歴10年以上のエンジニアです。最近、Linux環境でiOSアプリを開発する必要があり、Xcodeに代わるツールを探していたところ、「xtool」というプロジェクトに出会いました。これは、Linux、Windows（WSL）、macOSでSwiftPMベースのiOSアプリをビルド・署名・デプロイできるクロスプラットフォームなXcode代替ツールです。今回は、実際にxtoolを使ってiOSアプリをビルドし、デバイスにインストールするまでの体験を共有します。

![Cover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125746/71b21e25-140b-4e5a-bae8-c067e1903fee.png)


## xtoolとは？

xtoolは、Xcodeの機能をオープンスタンダードで再現したクロスプラットフォームツールです。主な特徴は以下の通りです：

* SwiftPMパッケージをiOSアプリにビルド可能
* iOSアプリの署名とインストールが可能
* Apple Developer Servicesとのプログラム的な連携

これにより、Xcodeが利用できない環境でもiOSアプリの開発が可能になります。

## 環境構築

私の開発環境は以下の通りです：

* OS：Ubuntu 22.04 LTS
* Swift：5.9（公式リポジトリからインストール）
* xtool：v1.11.4（2025年5月22日リリース）&#x20;

xtoolのインストールは非常に簡単で、以下のコマンドで完了します：

```bash
git clone https://github.com/xtool-org/xtool.git
cd xtool
make install
```

依存関係として、SwiftPMとlibimobiledeviceが必要です。これらはaptやbrewでインストールできます。

## 実際に使ってみた

### 1. プロジェクトの作成

まず、SwiftPMでiOSアプリのプロジェクトを作成します：

```bash
swift package init --type executable
```

作成されたプロジェクトに必要なiOS関連の設定を追加します。

### 2. ビルドと署名

xtoolを使ってビルドと署名を行います：

```bash
xtool build
xtool sign --team-id YOUR_TEAM_ID --bundle-id com.example.app
```

これにより、iOSアプリのビルドと署名が完了します。

### 3. デバイスへのインストール

最後に、デバイスにアプリをインストールします：

```bash
xtool install --device-id YOUR_DEVICE_ID
```

これで、Linux環境から直接iOSデバイスにアプリをインストールできました。

## 使用感と感想

xtoolを使用して感じたことは以下の通りです：

* **メリット**：

  * LinuxやWSL環境でiOSアプリの開発が可能になる
  * SwiftPMベースの開発フローがシンプルで効率的
  * Apple Developer Servicesとの連携が自動化されている

* **デメリット**：

  * XcodeのInterface BuilderやStoryboardのサポートがない
  * 一部の高度な機能（例：SwiftUIのライブプレビュー）は未対応
  * Appleの証明書やプロビジョニングプロファイルの管理がやや複雑

全体的に、xtoolはXcodeが使えない環境でのiOSアプリ開発において非常に有用なツールです。特に、CI/CDパイプラインでの自動ビルドや、非macOS環境での開発において、その真価を発揮します。

## まとめ

xtoolは、Xcodeに依存せずにiOSアプリを開発・ビルド・デプロイできる革新的なツールです。LinuxやWSL環境でiOSアプリの開発を検討している方には、ぜひ一度試してみることをおすすめします。

詳細や最新情報は、公式GitHubリポジトリをご覧ください：

👉 [xtool-org/xtool](https://github.com/xtool-org/xtool)
【初心者向けAD入門】ユーザー作成・ロック解除など基本操作を完全解説！

【免責事項】
本投稿は正確性・完全性を保証するものではありません。
万が一、本情報に基づいて被ったいかなる損害についても、一切の責任を負いかねます。
あらかじめご了承ください。



---
## 🎥 動画で確認したい方はこちら（サムネイル付きリンク）
[![Active Directory基本操作解説](https://img.youtube.com/vi/-f7Lszzt34E/0.jpg)](https://www.youtube.com/watch?v=-f7Lszzt34E)

**▶ 【初心者向けAD入門】ユーザー作成・ロック解除など基本操作を完全解説した動画です！**

---




こんにちは。今回は、情報システム部門やヘルプデスク初心者が最初に覚えるべき**Active Directory（AD）基本操作**を、実務に即した内容で解説します。

Windowsサーバー環境でユーザーやPCを一元管理する上で欠かせないActive Directoryですが、初学者にとっては何から手を付ければよいか分かりにくいもの。本記事では、動画で紹介した内容をベースに、以下の操作方法を分かりやすくまとめました。

---

## ✅ この記事で分かること

* Active Directoryユーザーとコンピュータの開き方
* OU（組織単位）とコンテナの違い
* ユーザーアカウントの作成・編集・削除・移動
* アカウントロック解除・パスワードリセット
* グループアカウント作成
* OUの作成と削除方法

---

## 1. Active Directoryユーザーとコンピュータの開き方

Windows Serverを起動後、**サーバーマネージャー > ツール > Active Directory ユーザーとコンピューター**から開きます。

**よく使うのでタスクバーにピン留め**しておくと便利です。

---

## 2. OU（組織単位）とコンテナの違い

画面左側に表示される「フォルダ」のような構造は、実際には以下の2種類があります。

* **OU（Organizational Unit）**：ユーザーやPCを部署単位などで管理
* **コンテナ**：デフォルトで用意された入れ物（例：Users、Computers）

現場ではまとめて「OU」と呼ばれることが多いですが、**GPO（グループポリシー）の適用対象**になるかどうかなど、違いを理解しておくと便利です。

---

## 3. アカウント作成（新入社員対応）

OU（例：Users）を右クリック → **\[新規作成] > \[ユーザー]**

* 氏名やログイン名を入力
* 初期パスワード設定（「次回ログイン時に変更必須」は通常チェック）
* 完了後、一覧にユーザーが表示されます

---

## 4. プロパティ編集（属性情報の入力）

ユーザーを**ダブルクリック** → 詳細情報を入力可能

* 説明、部署名、会社名、役職、連絡先など
* 入力情報は他システムとの連携にも活用されることがあるため、できるだけ正確に

---

## 5. アカウント検索とロック解除・パスワードリセット

### ユーザー検索

ドメインを選択 → 画面右上の虫眼鏡アイコンで検索
例：ユーザー名「山田」で検索

### ロック解除

ユーザーをダブルクリック → 「アカウント」タブ
→ ロックのチェックを外して解除

### パスワードリセット

右クリック → \[パスワードのリセット]
→ 新しいパスワードを入力し、変更可能

---

## 6. アカウント削除・無効化・移動

* **削除**：退職者対応など（復元困難なので注意）
* **無効化**：一時的にログインを防ぐ場合に便利（右クリック → \[アカウントを無効にする]）
* **移動**：OU間のアカウント移動（右クリック → \[移動]、ドラッグ&ドロップは非推奨）

---

## 7. OUの作成と削除

### 作成方法

ドメインを右クリック → \[新規作成] > \[組織単位]

* 「誤って削除されないようにオブジェクトを保護する」にチェック（デフォルト）

### 削除方法

* \[表示] → \[拡張機能]を有効化
* OUのプロパティ → \[オブジェクト]タブ → 保護チェックを外す
* 右クリック → \[削除]

---

## 8. グループアカウント作成（ファイルサーバー権限管理など）

OU（例：Groups）を右クリック → \[新規作成] > \[グループ]

* グループ名を入力（例：総務部）
* メンバーを追加することで、ファイル共有のアクセス権制御などに利用可能

---

## 📌 まとめ

Active Directoryの基本操作は、以下のような実務で頻繁に登場します。

* ユーザーの追加・検索・編集・削除
* ロック解除やパスワード変更対応
* アカウントやOUの管理
* グループ管理によるアクセス制御

**現場でそのまま使える知識**として、ぜひ覚えておきましょう！

---

## 🎥 動画で見たい方はこちら（再掲）
 [![Active Directory基本操作解説](https://img.youtube.com/vi/-f7Lszzt34E/0.jpg)](https://www.youtube.com/watch?v=-f7Lszzt34E)

**▶ 【初心者向けAD入門】ユーザー作成・ロック解除など基本操作を完全解説した動画です！**

---
## ✨ おわりに
この記事が役立ったら、いいねやストックいただけると嬉しいです！

## 主のコンテンツ
<a href="https://www.udemy.com/course/active-directory-p/?referralCode=1BC8474484DCD2814852">Active Directoryの基礎※ハンズオン形式</a>
<a href="https://www.udemy.com/course/active-directory-n/?referralCode=FF51293A35539D596A6A">Active Directoryの基礎 グループポリシー編※ハンズオン形式</a>
<a href="https://www.udemy.com/course/joshishelp/?referralCode=7ECEB242C114FA3736F8">情シスヘルプデスク入門※一部ハンズオン形式</a>
<a href="https://twitter.com/naoya_itbegin">X</a>
<a href="https://www.youtube.com/@%E7%A4%BE%E5%86%85%E3%83%8D%E3%83%83%E3%83%88%E3%83%8A%E3%83%93">Youtube</a>
【未経験者研修２か月目】Reactの環境を構築しました

こんばんは、研修ではSpring BOOTを使用したWEBサイトの作成をしているのですが

満足できない！！ということで、SPAサイトを作成して個人で動的なWEBアプリを開発することにしました。

本日は、Node.jsのインストール、コマンドでワークディレクトリの作成、及び初期表示画面の編集を行いました。

localhost:3300 

なぜか新鮮でよいですね→いつも8080だったので

これから、業後にちまちま作成していきたいと思います。
【Next.js】ServerActionsのリクエストボティの最大サイズを設定する方法


## デフォルトの最大サイズは1MB

ServerActionsのリクエストの最大サイズはデフォルトでは1MBとなっています。
1MBを超過すると以下のようなエラーとなります。

```terminal
 ⨯ uncaughtException: [Error: Body exceeded 1 MB limit.
                To configure the body size limit for Server Actions, see: https://nextjs.org/docs/app/api-reference/next-config-js/serverActions#bodysizelimit] {
  statusCode: 413
}
```

## 最大サイズを設定する

任意のサイズに変更するには`next.config.js`に次の設定を追記します。

```javascript
/** @type {import('next').NextConfig} */
 
module.exports = {
  experimental: {
    serverActions: {
      bodySizeLimit: '3mb',
    },
  },
}
```

## 参考

https://nextjs-org.translate.goog/docs/app/api-reference/config/next-config-js/serverActions?_x_tr_sl=auto&_x_tr_tl=ja&_x_tr_hl=ja&_x_tr_hist=true#bodysizelimit
スッキリわかるSQL入門を読んだ感想

## はじめに

SQLの基本を学ぶため、スッキリわかるSQL入門を読みました。
こちらの感想記事になります。

https://book.impress.co.jp/books/1123101107

## 良かったところ

### 圧倒的読みやすさ

   - 登場人物との会話形式で進むので非常に読みやすいです

   - 登場人物が「なぜこれをするの？」「こういうメリットがあるからです」のように  
   疑問の後に答えが来る展開で、納得しながら読み進めることができました  

### 図が多く、SQL文の動きがイメージできる

   - 例えば UNION を使って2つの SELECT 文の結果を足し合わせた後のテーブルの状態や
   GROUP BY を使ってグループごとに集約関数を使った後のテーブルの状態
   JOIN をして2つのテーブルを結合した後の状態などが分かりやすかったです

### 演習問題が豊富

   - 256問のドリルがついていて、そのうちSQL文の演習は200問ほどあり、十分な演習を行うことができます
   - この演習問題を通して、特にJOINによるテーブル結合の感覚が身につきました

## 悪かったところ

### kindle版では文字検索ができない
- 後述しますが、演習問題は答えしか載っていないので、解説を見るには本を読み返す必要があります
その際、文字検索ができなかったので、少し不便でした

### 演習問題やドリルのSQL文での答えが見にくい
- 改行されずに書いてあるので非常に見にくかったです
    

## 学んだこと

### SQLの基本構文

   - DMLと呼ばれるSELECT, UPDATE, DELETE, INSERTの使い方

   - WHEREによる行の絞り込み

   - GROUP BYでのグルーピング、集約関数(SUM, MAXなど)

   - ORDER BYでのソート
   
   - OFFSET, FETCHを使った取得する行数の指定 

### テーブルの和集合、差集合、
- UNION、EXCEPT、INTERSECTといった集合演算

### テーブルの結合

- JOINやLEFT JOINといった内部結合、外部結合

### 副問い合わせ(サブクエリ)

- 集約関数などの単一行の値が戻るパターンは、UPDATE文やSELECT文で使える
- 一つのカラムだけ戻るパターンは、WHEREとINを使った条件の絞り込みで使える
- 表の形で戻るパターンは、INSERT文やFROM、JOINで使える

### トランザクション
- 正確なデータ操作をするための仕組み
- 原子性、分離性といった性質を持ち、データの不整合を防ぐ

### データベース支援機能
- インデックスを作成することで検索性能が向上する
- 他にもビュー、シーケンスといった便利機能がある

### テーブルの設計手法
- 概念設計、論理設計、物理設計というフローで運用・保守しやすい設計にする
- 第一正規化〜第三正規化の方法

## 難しかったこと

- テーブルの結合を使った演習問題が難しかった

- テーブルの設計をする演習でエンティティの洗い出しが難しかった

- ドリルの総合問題で要件からトップダウン、実際の使用例からボトムアップでER図に落とし込むのが難しかったしできなかった

## 終わりに
SQL文の内容は非常にわかりやすく、演習を通して身についた感があります。
しかし、テーブルの設計は特に難しいと感じました。
現状、ER図を作る前段階の、要件からエンティティを抽出する工程がうまくいかないです。

これからデータベース設計の書籍を読んで学習していきます！
Raspberry Pi PicoでPicoMite(MMBasic)を使う〜XMODEMでのファイル転送

# はじめに

MMBasicのフルスクリーンエディタは便利だがmacOSやWindowsで使用しているテキストエディタに比べるとどうしても見劣りがする。
MMBasicのソースプログラムをMacやWindowsで作成してそれをPicoMiteへ転送するほうが便利な場合もある。
ここではPicoMite（MMBasic）とmacOSとの間でのファイル転送について述べる。

# ファイル転送について

PicoMite（MMBasic）がサポートしているファイル転送プロトコルはXMODEMのみです。コマンドプロンプトで`XMODEM`コマンドを使って送受信します。

送受信のコマンドを以下の表に示します。

|コマンド|動作|
|-|-|
|XMODEM SEND|プログラムメモリの内容を送信します|
|XMODEM SEND file$|file$で指定したフラッシュファイルシステム内のファイルを送信|
|XMODEM RECEIVE|受信したプログラムをプログラムメモリに保存します|
|XMODEM RECEIVE file$|受信したプログラムをフラッシュファイルシステムに指定したファイル名で保存します|
|XMODEM CRUNCH|プログラム中のコメント、空白行、不要なスペースを削除して保存|

※ SEND、RECEIVE、CRUNCHはS、R、Cと短縮できる。

PicoMiteでの送受信コマンドを実行後にシリアル接続したmacOS等で送受信操作を実行する。

# macOSとPicoMiteの間のファイルの転送

## 準備

macOSにはXMODEMを使えるコマンドがないのでHomebrewでパッケージ`lrzsz`をインストールする。（lrzszのWebサイト： [lrzsz: free x/y/zmodem implementation](https://www.ohse.de/uwe/software/lrzsz.html)）

```SHELL
$ brew install lrzsz
```

コマンドは`/opt/homebrew/Cellar/lrzsz/0.12.20_1/bin`にインストールされ、それぞれのコマンドのシンボリックリンクがパスの通ったディレクトリ`/opt/homebrew/bin`に作成される。

```
$ ls -l /opt/homebrew/Cellar/lrzsz/0.12.20_1/bin
total 1128
-r-xr-xr-x  1 sakabe  admin  94000 12 31  1998 lrb
-r-xr-xr-x  2 sakabe  admin  94000 12 31  1998 lrx
-r-xr-xr-x  2 sakabe  admin  94000 12 31  1998 lrz
-r-xr-xr-x  2 sakabe  admin  95616 12 31  1998 lsb
-r-xr-xr-x  2 sakabe  admin  95616 12 31  1998 lsx
-r-xr-xr-x  1 sakabe  admin  95616 12 31  1998 lsz
lrwxr-xr-x  1 sakabe  admin      3 12 31  1998 rz -> lrz
lrwxr-xr-x  1 sakabe  admin      3 12 31  1998 sz -> lsz
```

ファイルサイズやリンク数から`lrb`、`lrx`、`lrz`の3つが同じで受信用コマンド、`lsb`、`lsx`、`lsz`の3つが同じで送信用コマンドになっている。

これらのコマンドを使用しているシリアル通信プログラムからPicoMiteの送受信操作に合わせて指定すればいい。

## minicomの設定

ここではminicomを使用しているのでファイルのアップロード・ダウンロードディレクトリ、送受信コマンドを設定しておく。

minicomの設定画面を操作する方法もあるが設定ファイルを直接書き換えてファイルの送受信コマンドとファイルのアップロード・ダウンロードディレクトリを設定した。
minicomの設定ファイルは`~/.minirc.dfl`でこれを使い慣れたテキストエディタで次の4行を編集する。これ以外の行はそのままにしておく。

```text:.minirc.dfl
pu pprog3           lsx
pu pprog6           lrx
pu updir            /Path/to/upload/file/dir
pu downdir          /Path/to/download/file/dir
```

※ 上記のupdirとdowndirは例です。

|項目|内容’|設定値|
|-|-|-|
|pu pprog3|xmodem送信コマンド名|lsx|
|pu pprog6|xmodem受信コマンド名|lrz|
|pu updir|アップロードファイルのディレクトリ名|アップロードするファイルの保存ディレクトリ名|
|pu downdir|ファイルのダウンロードディレクトリ名|ダウンロードしたファイルの保存ディレクトリ名|

## ファイルのアップロード（Mac → Pico）

次の手順で操作してMacで作成したMMBasicのプルグラムをPicoに転送（アップロード）します。

1. PicoMiteのコマンドプロンプトで`XMODEM RECEIVE`コマンドを実行
2. `ESC`キーを押した直後、すぐに`Z`キーを押し、メニューを表示
3. `S`キーを押す（Macからみて送信なので）
4. Uploadメニューで`↓キー`を押して`xmodem`に合わせ、`RETURN`キーを押す
5. `Select a file for upload`メニューでファイルの一覧が表示されるので`カーソルキー`カーソルを送信したいファイルの位置に合わせ、`スペースキー`を押して選択し、`RETUNR`キーを押す
以上でファイルがMacからPicoにアップロードされる。

Picoが受信したプログラムはプログラムメモリに保存されるので`LIST`コマンドで確認できる。

## ファイルのダウンロード（Pico → Mac）

次の手順でPicoで作成したMMBasicのプログラムメモリ内のプログラムをMacに転送（ダウンロード）します。

1. PicoMiteのコマンドプロンプトで`XMODEM SEND`
2. `ESC`キーを押した直後、すぐに`Z`キーを押し、メニューを表示
3. `R`キーを押す（Macからみて受信なので）
4. Downloadメニューで`↓キー`を押して`xmodem`に合わせ、`RETURN`キーを押す
5. ファイル名の入力を促す`Please enter file name`と表示されるのでMacで保存するときのファイル名を入力する
以上でファイルがPicoからMacにダウンロードされる。設定したディレクトリにファイルが保存されているかを確認する。

# 参考サイトなど

- [PicoMite User Manual](https://geoffg.net/Downloads/picomite/PicoMite_User_Manual.pdf)
VMware Workstation ProにRHEL10 GA版を新規インストールできない

## はじめに
2025年5月13日にRHEL10がGAとなり、下記リンク先のRedhat DeveloperサイトでもRHEL10 GA版のBoot isoファイルが無料でダウンロード可能となりました。

https://developers.redhat.com/products/rhel/overview

普段、私はVMware Workstation Pro 17.6.3にRHEL9.6を入れて使用していますが、現行のRHEL9.6環境はそのままにして、検証用にRHEL10環境を別に用意しようと思い、RHEL10 GA版のBoot isoファイルをダウンロードして、VMWare Workstation Proに新規導入を試みました。しかし、何故か新規インストールができない事象に遭遇しましたので、情報共有を兼ねて記事に纏めました。

## 新規インストール作業
VMWare Workstation Pro側の設定は、RHEL9環境導入時の設定内容を参考に定義を行い、いざRHEL10のBoot isoファイルの読み込みを行いました。以下は読み込み直後の画面です。
![q1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/95d2165e-a883-4aec-9697-06c4bfeb1bc0.jpeg)
ここでは真ん中の「Test this media & install Red Hat Enterprise Linux 10.0」を選択して実行します。その後、次々とメッセージが出力され、順調に処理が進んでいきます。
![q3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/67635bb0-31af-4042-9d77-f2c77f9f28b8.jpeg)
![q5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/5b5fa0e5-02b7-4d5f-a3fa-a0aba638812e.jpeg)
その後、下記の画面に切り替わります。
![q6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/6c283164-dbbd-40f3-9f38-accbfab456e1.jpeg)
この後、普通ならばGUIのインストーラー画面が表示されるのですが、何故か下記のグレー色のWindowが表示された状態となり、インストーラー画面が表示されることはありませんでした。。
![q2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1567099/2ce9c643-2f4a-40d6-86d7-77665c69b536.jpeg)

## インシデント調査
動きとして明らかにおかしいと感じたため、色々ググってみたところ、下記Red Hat Customer Potal上に「VMwareにRHEL 10ベータ版をインストールできない」という障害情報が報告されているのを発見しました。

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

ですが、上記には解決方法が載ってないんですよね。。ベータ版で不具合があったのはまだわかるにしても、GA版でこれはいかがなものかと思いました。

## おわりに
残念ながらVMware Workstation ProへのRHEL10 GA版の新規インストールはできませんでした。ただ、下記のRed Hat社のドキュメントを見ると、RHEL9.6からRHEL10へのアップグレードはサポートされているようです。次のアクションとして、新規インストールではなくアップグレードを試してみようと思います。

https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/10/html/upgrading_from_rhel_9_to_rhel_10/supported-upgrade-paths

既存のRHEL9.6環境はそのまま残しておきたいので、少々面倒ですが、RHEL9.6のBoot isoファイルを使ってアップグレード検証用の別環境を用意する予定です。