OmniAICreator/Qiita-1.07M huggingface dataset:
キーボード沼の旅路（1）

### 改めて自己紹介
私はエンジニアではなく金融機関に勤務する専門職です。一時期、データ処理や自動化のためにPythonの勉強をしようと頑張っていた時期もあり、こういうサイトに出入りするようになったのですが、その後は転職に伴い専門職としての仕事が忙しくなりすぎ、Pythonの勉強は放置した状態です。

そもそも私程度の用途であればPythonなんか勉強しなくても、生成AIに投げればコード吐いてくれるので余計にコーディングについてはやる気を喪失しています。

### 環境
私の勤務先はフルリモートを許容している上に、BYODもかなり柔軟に認めてくれるため、金融機関勤務であるにも関わらず在宅では自腹で購入したMacを中心に環境を構築しています。

### キーボードに興味を持ったきっかけ（デスクトップ）
私はマウスではなくMagic Trackpadの愛好者です。そのため、デザイン的にMagic Trackpadとデザイン的な相性の良いAppleの純正キーボードを長年愛用してきました。一方で、 AppleのデバイスがThunderboltからUSB Type-Cに移行することに伴い、Magic TrackpadについてはType-Cバージョンに買い替えましたが、キーボードについてはふと立ち止まって、Magic Keyboardでいいのかと考え込んでしまいました。

### Magic Keyboardのpros/cons
Proは以下の2点であろうと思います。
- Trackpadとのデザインの親和性
- Touch ID

そして私の認識するConは以下のとおりです
- 打鍵感がとにかくよくない
- いい加減に飽きた

そしてConsのほうが最近私の中で大きくなってきて、デザインとTouch IDは捨ててでも、打鍵感を求めて気分を一新することにしました。

### 私がキーボードに求めるもの
新たなキーボードを探すにあたって私が最初に設定した条件は以下のとおりです。
- ロープロファイル
- 無線
- フルサイズ
- デザインがよいもの
- 打鍵感がよいもの

ロープロファイルであることは、Magic Keyboardからの連続性と、Trackpadとの見た目の親和性をできるなら維持したいと思ったことによるものです。また、私はミニマリストであり、机の上からケーブル含めて不要なものを可能な限り排除したい指向があり、リストレストなどは置きたくありません。そのためにはキーボードの高さについては、打鍵感は重視しつつも、可能な限り低いものを好みます。

フルサイズであることは私の職業と関連しています。私は金融専門職であり、数字の入力が普段から多くテンキーのヘビーユーザーです。そして業務用アプリケーションがファンクションキーを前提にしています。また、Excelの使用頻度も高いことからカーソルキーは必須です。<b>この時点でフルサイズキーボードしか選択肢はないことになります。</B>
【メモ】セキュリティインシデントを調べるときに参考になるサイトまとめ

## 概要
- セキュリティインシデントを調査してほしいというタスクがあった。今後調べるときにサイトを忘れないためにまとめておくことにする

## 日本のセキュリティ関連

https://www.jpcert.or.jp/

https://jvn.jp/

https://jvndb.jvn.jp/

## アメリカのセキュリティ関連

https://pulsesecurity.co.nz/

https://nvd.nist.gov/

## Microsoft製品

https://msrc.microsoft.com/update-guide/vulnerability

⇒1年ずつ検索していくイメージ

## Google
google cloud

https://cloud.google.com/support/bulletins


## まとめ

今回利用したものはこのぐらいであったが、今後ほかのサイトも見つけ次第追記していこうと思う。
Eclipseはtomcat11には対応していません！

# 最新バージョンに対応してないとかしらんて

Eclipseをダウンロードし、Webアプリケーションを作る際に各種設定をいじっていました。（初心者のくせに張り切りすぎました、、、）

tomcatのversion11とJava23を使ったサーバとコードを作ろうとしていたのですが、

原因不明のweb.xmlのエラーが解消できなかったり、
JavaのVersionがおかしいとエラーが出たり、
サーバーにプロジェクトが追加できなかったり。

今思うと早く非対応だということに気づくべきだったと思います。


短い文章ですが、僕と同じ苦しみを味わう初心者が減るように、今回の体験を記事にして残したいと思います。
これを体験した僕や初心者の方は、教科書通りにやってみてから色々調べながら
次のステップに挑戦することを覚えましょう。
「React Native」に決定！個人開発で学ぶフロントエンド技術選定のポイント🔥

# 開発日記7日目：フロントエンド技術選定完了！React Nativeに決定！🔥

群馬県民がもっと地元イベントを楽しめるように！イベント発見アプリを個人開発している🐮です！

開発7日目の今日は、フロントエンド開発に必要な技術の選定を行い、数ある候補の中からついに**React Native**を選びました！✨

---

🌟 **今日のハイライト**

- ✅ フロントエンドフレームワークを**React Native**に決定！
- ✅ 各技術のメリット・デメリットを比較検討
- ✅ 今後の開発環境構築に向けて準備開始

---

🛠 **今日の作業内容**

### 1. フロントエンド技術の候補を比較検討

まず、以下の3つの技術候補について、それぞれのメリット・デメリットを洗い出しました。

#### 🔹 React Native (TypeScript)

- **メリット**
  - JavaScriptベースで、既に慣れ親しんだ技術
  - **クロスプラットフォーム対応**でiOSとAndroidを同時に開発可能
  - 豊富なライブラリと活発なコミュニティサポート

- **デメリット**
  - ネイティブに比べてパフォーマンスが劣る場合がある
  - 複雑なUIやアニメーションの実装に制約があることも

#### 🔸 Flutter (Dart)

- **メリット**
  - 高性能なUI描画で美しいデザインが実現
  - クロスプラットフォームで一貫性のあるUIを提供
  - **Hot Reload**機能で開発スピードが速い

- **デメリット**
  - Dart言語の学習が必要で、学習コストがかかる
  - 一部のプラグインやパッケージが未成熟

#### 🔺 SwiftUI / Kotlin (ネイティブ開発)

- **メリット**
  - ネイティブならではの高パフォーマンスと安定性
  - プラットフォーム固有の最新機能が利用可能

- **デメリット**
  - iOSとAndroidで別々に開発する必要があり、**開発コストと時間が増大**
  - 開発効率が低下する可能性

### 2. **React Native**を選定！

悩みに悩みましたが、最終的に**React Native**を選ぶことにしました！🎉

**選定理由**

- **開発効率の向上**：一つのコードベースでiOSとAndroidの両方を開発できるのは大きな魅力。
- **学習コストの低さ**：JavaScriptとTypeScriptに精通しているため、スムーズに開発に入れる。
- **コミュニティの活発さ**：豊富な情報があり、問題解決がしやすい。

Flutterの美しいUIやSwiftUIのネイティブ性能も魅力的でしたが、今回は**開発スピードと慣れた技術を活かすこと**を優先しました。

### 3. 比較検討を通じての学び

技術選定を通して、それぞれの技術の特性や自分のプロジェクトに適した選択を深く考える機会になりました。

- **ユーザー体験**を最優先する場合はネイティブ開発が有利
- **スピードとコスト効率**を重視するならクロスプラットフォーム開発
- **新しい技術への挑戦**も大切だが、**プロジェクトの目的や自分のスキルセット**に合った選択が重要

---

📊 **プロジェクト進捗状況**

| フェーズ          | 進捗率 | 主要成果物                     |
| ----------------- | ------ | ------------------------------ |
| 要件定義          | 100%   | ユーザーストーリーマップ        |
| UI/UX設計         | 90%    | デザインシステムガイドライン   |
| 技術選定          | 100%   | フロントエンド技術選定レポート |
| 開発環境構築      | 10%    | 開発ツールリスト               |

---

💡 **今日の気づきと学び**

**良かった点**

- **最適な技術選定ができたこと**で、今後の開発の方向性が明確になりました。
- 技術比較を通して、最新のフロントエンド技術について知識を深めることができました。

**改善したい点**

- Flutterに関してはまだ理解が浅いので、今後時間を見つけて学習してみたいです。
- ネイティブ開発のメリットも魅力的なので、将来的な機能拡張時に検討したいと思います。

---

🚀 **次回予告：バックエンド技術の選定と開発環境の構築！**

次回は、バックエンドの開発に必要な技術選定と、開発環境の本格的な構築に取り組みます！

**候補技術**

- **Node.js (Express)**：JavaScriptでフロントエンドと統一感のある開発が可能
- **Django (Python)**：高い信頼性と豊富なパッケージ
- **Firebase (BaaS)**：サーバーレスで迅速な開発が可能

皆さんのおすすめや経験談があれば、ぜひコメントで教えてください！🙌

---

✨ **今日のひとこと**

群馬の皆さんに喜んでもらえるアプリを目指して、明日も頑張ります！
応援のいいねやコメントが、日々のモチベーションになっています！😊

---

最後までお読みいただきありがとうございます！
引き続き応援よろしくお願いします！では、また明日〜！👋
【題名だけの内容です】Excelファイルが壊れて読めなかった。LibreOfficeで治せた

# 要約
苦労して作ったExcelが「file format or file extension is not valid」と怒られて開かない。
ExcelのOpen-Repairというのを使ったが治らない。
Libre OfficeのCalcで開いて再保存するとなんか治った。
# 以下余談
暇で暇でしょうがない人だけ読んでください。

昨日苦労して作ったExcelファイルを今日開こうとするとエラーになった。
以下のメッセージが出る。


![noExcel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/10ab762a-fc22-5727-2bdb-b7d69ba6eac7.png)

フォーマットか拡張子が間違っているのでファイルが開けない。
壊れていないか確認するか（それが分かったら苦労しねーっつーの）拡張子がファイルとあっているか確認しろと言う。

いちおう変わったことはしていて、aaa.xlsmというマクロ可能ブックで作業した後にマクロを無効にするために納品時にxlsxに保存している。同じソリューションを過去に数回適用しているが、それで怒られたことはなかった。

Excelファイルを無理やりエディターに突っ込むと先頭がPKとなっている。

![pk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107571/29ba39ae-db51-11a9-9b51-d7ced7fd80e4.png)


このような文字列をマジックナンバーと総称し、PKはzipファイルのマジックナンバーだ。
拡張子をzipにして解凍してみると、OpenDocという規格に対応した構造になっている。
だからと言ってぼくは何も分からないのでそっと閉じた。

Microsoft公式に当たると、ファイルを開くダイアログのOpenボタンが実はドロップダウンボタンになっていて、RepairとかExtract Dataとか色々選べるようになっているから試してみろと言う。
いろいろ試してみたがそれも最初のメッセージが出て終わり。

万事休す！と思ったが、MS Office互換のOSSであるLibre OfficeのCalcを使ってみるとなんか開いた。
LibreOfficeは以下からダウンロードできる。
https://www.libreoffice.org/

マクロが無効になっていますが無効のままにしますか、と言われるのでハイ、と答える。
消したつもりのマクロを起動するフォームボタンが残っているので消す。
この辺はExcelで開けない現象と関係あるのかないのか分からない。
（ひどくてゴメン）
Alt+F11を押してマクロエディターを開くとマクロモジュールがあった。
消す。
別名を付けて保存する。
拡張子はxlsxのママ。
果たしてExcelでも読めるようになった。

問題の真相は分からないのだが、ぼくに関してはこれでＯＫ牧場。

***（この項終わり）***
React Native で プッシュ通知のデータが取得できなかった問題

## 前書き

ある日、React Native アプリで **androidだけ**「プッシュ通知をタップした時のデータを取得できない」ことに気付いた。
調査にめっちゃ時間かかった上に、解決策がネットになかった（AIさんも教えてくれなかった）のでここに書く。

## 環境

- React Native 0.64.x
- react-native-firebase/messaging
- node v16（元々15）

## バグの調査内容

messaging()の各種イベントハンドラで、機能するものと機能しないものがある

- OK: onMessage()
- OK: setBackgroundMessageHandler()
- NG: getInitialNotification()
- NG: onNotificationOpenedApp()

OKのものはイベントが機能していて、データも取得可能。
NGのものは、そもそもイベントが発火しない。データも取れない。

iOSで動いていることからソースコードは問題ないはずなのに、androidでだけ動かない。
ライブラリの問題か、バージョンか？と色々試行錯誤した。

## ネットによくある解決策

### スプラッシュスクリーンが原因では？
 ⇒ 使ってない

### プッシュ通知のデータの問題では？
 ⇒ 送ったデータには notificationと dataの両方が含まれていて、データ的におかしなところは見当たらなかった

### バージョンの問題？
 ⇒ firebaseなどのバージョンを上げてみたが、変化なし。そもそもよく起きる事象にしてはネット上の情報が少なすぎるので、バージョンの問題じゃないかもしれない。。。


## 結局、なんだったのか

Android側の設定の問題だった。

以前、別の修正で「Android Manifestの設定を変更して、MainActivityの他に LaunchActivityを作る」「MainActivityの launchModeを standardにする」といった変更をしていたのだが、このせいでバックグラウンドからの復帰時のデータ取得がうまくいってなかった模様。

この変更を元に戻し、launchModeを singleTaskに設定することで、ちゃんとデータが取れるようになった。


## 最後に

この記事が刺さる人は少ないと思うが、もし役に立つことがあれば良いなと思う。
文系未経験エンジニアが「ここで躓いた！」シリーズ～HTTPリクエストって何？編～

# はじめに
このシリーズでは、文系出身未経験入社の開発エンジニア2年目の自分が、
なんとなく分からずにモヤモヤしていた知識や疑問をざっくりと解説していきます。
ざっくりとなので、多少正確性を欠くことがありますが、もし誤った記載がありましたらご指摘いただけますと幸いです。

# HTTPメソッド-GET,POST,PUT,DELETE-
HTTPリクエストとは何かを知る上で、先にHTTPメソッドについて理解をしておくとよいです。
### HTTPメソッドとは
HTTPメソッドとは、HTTPリクエストが **「どんなタイプのお願いなのか」** を示すものです。
HTTPメソッドの種類は以下の4つです。
**GET**：情報の取得
**POST**：新規情報の送信
**PUT**：既存情報の上書き
**DELETE**：情報の削除

特によく使うのはGETとPOSTです。
例えば、ユーザーがURLをブラウザに打ち込んでサイトAが表示されたら、
「ユーザーはサイトAのサーバーに対してGETリクエストを送信した」
ということになります。

PUTとDELETEは行う前に再認証（パスワード入れたりメール確認したり）をすることが多いです。
身近な例だと、SNSのプロフィール情報の更新（PUT）や、アカウントの削除（DELETE）が挙げられます。

この4つの種類のリクエストを理解した上で、HTTPリクエストとは何かを見ていきましょう。

# HTTPリクエストとは
先に例を載せると、HTTPリクエストの実体は以下のような文字列です。
```
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
Authorization: Bearer <token>

{
  "name": "John",
  "age": 30
}
```
パッと見だと「なんのこっちゃ？」という印象だと思うので、
整理して見てみましょう。

HTTPリクエストは、ざっくり分けると以下の3つのパーツで構成されています。
①リクエストライン
②ヘッダー
③ボディ（リクエストボディ）

**リクエストライン**
```
POST /api/users HTTP/1.1
```
リクエストの最初の行。
以下のような情報がここに書かれます。

>HTTPメソッドの種類
>URL（アクセスしたいリソースの指定）
>HTTPバージョン


**ヘッダー**
```
Host: example.com
Content-Type: application/json
Authorization: Bearer <token>
```
リクエストの詳細情報。
以下のような情報がここに書かれます。
>リクエスト先のホスト名
リクエストボディのデータ形式（例：application/json）
>認証情報

**ボディ（リクエストボディ）**
```
{
  "name": "John",
  "age": 30
}
```
クライアントから送信するデータ。
必ずあるとは限らず、HTTPメソッドの種類によってあったりなかったりします。
GETメソッドではクライアントからデータを送る必要がないので、ボディなしである場合が大半です。


# 補足：HTTPとは？なぜ必要？
HTTP = Hypertext Transfer Protocol の略です。
クライアントとサーバーが通信をする上で、
共通の決まり（プロトコル）がないと不便なので導入されました。

使い古された喩え話ですが、
共通のプロトコルがない通信＝言語が通じない人同士の会話
のようなものです。
私たち日本人は、「日本語」という共通のプロトコルがあるからこそ、会話が成立します。

**例：プロトコルがない場合**

:::note alert
クライアント「こういう情報が欲しいです！」（リクエスト）
サーバー「umm... is it Japanese? Chinese? I don't understand!!!」（レスポンス不可）
クライアント「あれ？レスポンスが返ってこないなぁ」

→クライアントは日本語、サーバーは英語を使っているため、共通の言語（プロトコル）がない
　→**通信ができない！**
:::

**例：プロトコルが同じ場合**

:::note info
クライアント「こういう情報が欲しいです！」（リクエスト）
サーバー「おお、日本語でリクエストが来たよ！じゃあ、この情報を渡そう！」（レスポンス）

→クライアントもサーバーも、日本語という共通の言語（プロトコル）を使っている
　→**通信ができる！**
:::


「サーバーにリクエストを送るときは、HTTPという規格に沿った形式にしてね」
「クライアントにレスポンスを返すときは、HTTPという規格に沿った形式にしてね]
と決めておくことで、クライアントとサーバーの通信が簡単になります。
Webコーダーからフロントエンドエンジニアになるまで

## はじめに
私は街のデザイン会社でWebコーダーとして働いています。
最近は、将来的なキャリアも考えて、よりフロントエンドの対応力を強化するためにReactを勉強しています。
自分の現在位置を記録し、どのように学習してWebコーダーからフロントエンドエンジニアになれるのかを記録していきます。

## フロントエンドエンジニアの定義について
2025年1月現在では、一般的に以下のような技術を会得していることです。
- Vanilla JSに精通している
- JSフレームワーク（React.js、Vue.js、Anguler.js）を使える

求められることは多く、これに加えてバックエンドやサーバーサイドの知識、JSライブラリやモジュールバンドラなど様々なツールを扱える必要があります。

## フロントエンドエンジニアの仕事について
大きく以下の２つに分類されます。
- Webサイト制作
- Webアプリケーション開発

### Webサイト制作
Webサイトからユーザーへ情報を伝えることを主目的とします。
デザインにアニメーションを加えることで、印象や雰囲気をより演出することができます。
フロントエンドの技術は主にHTML / CSS / JavaScriptを使用しますが、UXを向上させる方法としてSPA（シングル・ページ・アプリケーション）があります。
ページ遷移時に1ページの内容を書き換えることで、ユーザーにページ遷移を感じさせない手法です。
SPAを実装するためには、ReactやVueの理解が必須になります。

### Webアプリケーション開発
情報の流れが一方通行なWebサイト制作と違って、
ユーザーとWebサイトが双方向で情報をやりとりする特徴があります。
わかりやすい例で言うと、FacebookやNetflix、Dropboxなどです。
どのWebサイトもSPAで構築されており、画面遷移を感じることなくスマホアプリのように操作が可能です。
Webアプリケーション開発は、工期がWebサイト制作の2倍以上だったり、関わる人数も多く、JSフレームワークの知識もより深く学ぶ必要があります。

参考：[フロントエンドの知識地図](https://ics.media/entry/231120/)

## Webサイト、Webアプリのどちらの仕事をしたいのか
私の業務経験から言うと、BtoCのWebサイト制作が長いので、やはりWebサイト制作にやりがいを感じます。
とはいえ、Webアプリーケーション開発にもチャレンジしてみたい気持ちがあります。
Reactを勉強することは、どちらにしても価値のあることなので、仕事を限定せずに勉強に取り組んでいく所存です。

## 私がReactを学ぶために使用しているツール
### Udemy
動画学習ツールのUdemyです。現在はこのサービスをメインに学習しています。
様々な技術の学習コースがあり、以下のような機能で学習しやすいです。

- コース内でセクションごとに動画が分かれている
- 動画の再生秒数の位置にメモを記述できる
- 動画の再生スピードが0.25刻みで選択できる
- デバイスを問わず利用でき、スマホで動画ダウンロードもできる
- コースごとのQ&Aで投稿者に質問ができる

私はReactの学習に、「じゃけえ」さんの動画を購入しました。
以下にリンクを載せておきます。

基礎編
[【最新ver対応済】モダンJavaScriptの基礎から始める挫折しないためのReact入門](https://www.udemy.com/course/modern_javascipt_react_beginner/)
応用編
[Reactに入門した人のためのもっとReactが楽しくなるステップアップコース完全版](https://www.udemy.com/course/react_stepup/)

### 本
技術書はたくさん出ており、情報の正確性が高いです。
付箋を挟んでおけば、知りたい情報にもすぐアクセスできます。
本はモニターと違って、目が疲れないのもいいです。
Udemyの講座については、本を通して知ることができました。
以下の本です。
[モダンJavaScriptの基本から始める　React実践の教科書](https://www.sbcr.jp/product/4815610722/)

### Progate
オンラインプログラミング学習サービスの[Progate](https://prog-8.com/)です。
こちらでは、スライド資料による学習と、課題の実践を通して学んでいけます。
JavaScriptの講座は、かなりの数があり、基礎から勉強するにはもってこいです。
一番の魅力は作業環境の準備が0ということです。
Progateのサイト上でエディタが準備されているので、自分で用意するものが１つもありません。

## いま作りたいものと、Reactの不明点について
### 作りたいもの
#### ・SPAで構築したポートフォリオサイト
ページ遷移に待ち時間がなく、素早くページが表示される仕様を自分のサイトで実装する。

#### ・Reactを使用したWebアプリケーションを個人開発
Reactの様々なメソッドを使用して、オリジナルのアプリを作成する。
自分好みのToDoアプリ、ファンサイトなど。

### Reactの不明点
#### 自分のサーバーにReactで構築したサイトをアップする
HTMLとCSSのみならば、FTPソフトでサーバーにアップするだけで公開できますが、Reactは同じようにいきません。
学習ツールの多くは、最初の環境構築の課題をスキップさせてくれるため、学びやすいですが、いざ自分で1から構築→公開しようとすると難しいです。
2年前に挑戦したときは、パッケージマネージャーのnpmを使い、Node.jsも使用して環境構築をした記憶があります。ただ、アップできるファイルにするには、モジュールバンドラを使用して1つにまとめて...というところからわからない現状です。

#### コンポーネント指向の真価について
大規模なサイト制作を経験していないので、コンポーネントを分ける作業に手間を感じてしまいます。
ただ、整理整頓や共通化とかは好きなので、大規模な開発でどういきてくるのか楽しみです。

## 最後に
2年前にReactを勉強したときはちんぷんかんぷんで挫折しました。
しかし、今は楽しみながら勉強を進められています。
当時に比べるとJavaScriptの理解が進んでいることや、案件でオリジナルのJavaScriptを組んだ経験があるからかなと思います。制作物→[診断コンテンツ](https://hotelion.jp/enjoyment?key=diagnose)
今回は、転職を控えての勉強なので、精一杯がんばります。
Webコーダーからフロントエンドエンジニアになる過程で感じたことについて、また投稿していこうと思います。
Android システムバー設定（ナビゲーションバー・アクションバー）

### 従来
```html:AndroidManifest.xml
 <application>
     <!--直接記述でよかった -->
     android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen"
  </application>
```

### 現在
```html:AndroidManifest.xml
 <application>
    android:theme="@style/Theme.アプリ名"
```
アプリ独自スタイルを持ってきているのでそこで記述すればいいらしい。
(場所がわからなくなったらCtrlボタンで追ってみよう)
```html:Themes.html
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Base.Theme.アプリ名" parent="Theme.Material3.Light.NoActionBar">
        <!--追加 -->
        <item name="android:windowFullscreen">true</item>
        <!-- Customize your light theme here. -->
    </style>

    <style name="Theme.アプリ名" parent="Base.Theme.アプリ名" />
</resources>
```

### おまけ　Activtyごとに設定する
```kotlin:Activity
    fun barHide(activity: Activity){
        val windowInsetsController =
            WindowCompat.getInsetsController(activity.window, activity.window.decorView)
        windowInsetsController.systemBarsBehavior =
            //隠れたシステムバーを表示
            BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
        ViewCompat.setOnApplyWindowInsetsListener(activity.window.decorView) { view, windowInsets ->
            //両方のシステムバーを非表示
            windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
            ViewCompat.onApplyWindowInsets(view, windowInsets)
        }
    }
```
公式パラメータ

https://developer.android.com/develop/ui/views/layout/immersive?hl=ja

上記のようにアクションバー、ナビゲーションバーを消すより
AndroidManifestでデフォルトを消して必要な時に表す方が自然。
デフォルトをどちらにするかはご自由に。
PGスタイルシリーズ：共通化の妙


## 「関数化=共通化」ではない

- 引数のない関数
- フラグを受け取り関数内で分岐している関数

これらは関数化の効果を半減させているかもしれない！

----
## 共通化より部品化

- 小さい部品の組み合わせで大きな部品を作る
- 最も大きな部品がイベントハンドラやリクエストハンドラ、main関数

----
## 分岐への対処
- 同じ条件分岐がたくさん現れたら作りのまずさを疑うべき
- フラグによる分岐はなるべく最も大きな部品の根元で解決する

----
## 関数内での分岐

- せいぜい１～２個の分岐で済ませる
　（それ以上になるときは更に関数を分離できないか、と考える）

 ※２個の独立した分岐があったとして、組み合わせは４つ。３個だと・・・？
 　→分岐は怖い！

----
## 具体例：メニュー操作

```C#
void OnMenuClick(MenuKind kind)
{
    switch (kind)
    {
        case MenuKind.Add:
            // 何かの処理・・・
            DbOperation(kind);
            break;
        case MenuKind.Edit:
            // 何かの処理・・・
            DbOperation(kind);
            break;
        case MenuKind.Delete:
            // 何かの処理・・・
            DbOperation(kind);
            break;
        default:
            throw new NotImplementedException();
    }
}

void DbOperation(MenuKind kind)
{
    switch (kind)
    {
        ...
    }
}
```


----
## 具体例：メニュー操作、改善

```C#
void OnMenuClick(MenuKind kind)
{
    switch (kind)
    {
        case MenuKind.Add:
            // 何かの処理・・・
            InsertDb();
            break;
        case MenuKind.Edit:
            // 何かの処理・・・
            UpdateDb();
            break;
        case MenuKind.Delete:
            // 何かの処理・・・
            DeleteDb();
            break;
        default:
            throw new NotImplementedException();
    }
}

void InsertDb()
{
    ...
}
...
```



----
## 心がけ（コツ）

感覚的な話ではあるが・・・

- 部品化が目的の関数に**処理の流れを持ち込まない**
- 処理の流れは根元の関数に書く
画面フロー : 再アクセス画面の値(Revisited Screen Values)


ユーザーが前の画面に戻ってからもう一度この画面に進んだ場合、このコンポーネントの値がどうなるかを制御します。

+ ユーザーがこの画面に最後にアクセスしたときの値を使用(Use values from when the user last visited this screen)
+ 入力を更新してフローの他の場所での変更を組み込む(Refresh inputs to incorporate changes elsewhere in the flow)

# 質問

+ [フローでのデータテーブルコンポーネントの値の保存：前の画面に戻ったあともチェックボックスで選択された行を保持したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000KCJiq)

私も同じように２つの画面の間にループを挟んでみましたが、ユーザーがこの画面に最後にアクセスしたときの値を使用は機能していました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/0e871675-8e1d-ec7c-2434-9dc0205b6d4e.png)

この中で気になったのはループの中身を設定していないと画面２には進めないこと...
エラーは出てないけど。

ループの中も３つにしましたが、機能しますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/3a8b25dc-e4a8-c14b-ccb4-2de5e40f0f95.png)
現状の確認とこれからの目標

## 現状
大学2年生
大学は情報系を専攻
プログラミングは
C,JAVA,C#,Python,Rを授業で学んだ。
Unityでゲーム制作をしたことがあるがそれ以外でプログラミングでのものづくり経験なし
PaizaのランクがAランク
就職でIT関係のところに行ったほうが大学での学びを生かすことができると考えているが、まだちゃんとどの職種に行くかは決めていない。
IT業界の長期インターンの面接を2回受けたが失敗し、この春休み期間で何かIT系で誇れる強みをつくり、サマーインターンの面接に備える。

## 目標
まだどこに就職するか決めていないのでできるだけ幅広く学んでいきたい。
下記の3つの軸で行動していく。
AI、アルゴリズム、ポートフォリオ作成。

AIについては勉強してKaggleで上位10％をめざす。

アルゴリズムはAtCoderで水色をめざす。

ポートフォリオはUdemyでWebアプリケーションの作り方を学びながら、自分独自のものを作っていきたい。

達成は困難を極めるが、なるべく近づけられるようにする
【E2Eテスト】2025年版最新版：注目のWebアプリテストツールの人気度！

# 初めに

テストツールを選ぶ際、人気度を重視する理由はシンプルです。人気のあるツールは、コミュニティのサポートが活発で、ドキュメントやチュートリアルが充実しているため、問題が発生したときに解決策を見つけやすいからです。また、活発なユーザー基盤があると、新しい機能や改善が頻繁に行われ、ツールが時代に追いつきやすくなります。つまり、人気があるツールは安心して使えるというわけです！

本記事では、2025年に注目すべきE2Eテストツールの人気度を比較したいと思います！

# 比較対象の選定

以下の特徴を持つツールに焦点を当てます：

- オープンソース
- Node.js環境で実行できる
- TypeScriptでの実装が可能
- 成熟しており、比較的人気がある

これらの条件を満たすツールの中から、以下の3つを選定しました：

- [Cypress](https://www.cypress.io/)

https://www.cypress.io/

- [Playwright](https://playwright.dev/)

https://playwright.dev/

- [Selenium WebDriver](https://www.selenium.dev/documentation/webdriver/)

https://www.selenium.dev/documentation/webdriver/


:::note warn
注意
Selenium WebDriverは、他のツールとは異なり、単体ではテストフレームワークとして機能しません。これは（ブラウザの自動化を行う）ツールに過ぎません。ウェブアプリのテストを行うには、MochaやJestなどのテストフレームワークと組み合わせて使用する必要があります。
:::

# Googleトレンド

[Googleトレンド](https://trends.google.com/trends/explore?date=2020-12-22%202025-01-22&q=%22cypress%20test%22,%22playwright%20test%22,%22selenium%20test%22&hl=en)を使って比較することで、特定のツールや技術がどれほど注目されているか、時期ごとの関心の変化を把握できます。

![Screenshot 2025-01-23 at 0.09.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951404/ec71f8df-dba6-12a9-dd11-85a747aeb424.png)

GoogleトレンドのグラフでPlaywrightがCypressを追い越し、現在もSeleniumより人気が高いこと確認できます。

:::note info

一部のツール名はスクレイピングなどの用途でも使用されているため、テストの文脈での人気度を統計的に絞り込むために、「test」というキーワードを追加しました。
:::

# npmトレンド

[npmトレンド](https://npmtrends.com/cypress-vs-playwright-vs-selenium-webdriver)を比較することで、ツールのインストール数や利用頻度を確認でき、実際にどれだけ多くの開発者に使用されているかを把握できます。

![Screenshot 2025-01-23 at 0.18.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951404/a2578474-e099-73ae-6d7a-90818e79d9ea.png)

Googleトレンドと同様にPlaywrightがCypressを上回り、Seleniumよりも多くの開発者が利用されていることが確認できます。

# GitHub

GitHubでの人気度を比較することで、ツールの信頼性や活発なサポート、コミュニティの規模を把握でき、実際の利用状況や進化のスピードを確認できます。

| ツール | スター数 | フォーク数 | PRマージ数 ※ | コミット数 ※ | 年数 | 
|-|-|-|-|-|-|
| [Cypress](https://github.com/cypress-io/cypress) | 47,669 | 3,210 | 51 | 211 | 7年前 |
| [Playwright](https://github.com/microsoft/playwright) | 68,692  | 3,797 | 130 |139 | 5年前 |
| [Selenium](https://github.com/SeleniumHQ/selenium) | 31,356  | 8,297 | 19 (全173) | 29 (全238) | 12年前 |

※ 直近1カ月 = 2024-12-24から2025-01-24まで

Playwrightは最も多くのスター数を持ち、比較的新しいツールです。Cypressはスター数、フォーク数、PR数、コミット数が中程度で、人気があり活発に利用されているツールです。Seleniumは最も古いツールでありながら、フォーク数、PR数、コミット数が最も多いです。Seleniumのリポジトリは、ブラウザ自動化をサポートする複数の言語用パッケージを含む[モノレポ](https://qiita.com/470_aaa/items/b129900e98df234a1670#monorepo%E3%81%A8%E3%81%AF)です。直近1カ月のjavaScriptパッケージが含むPRマージ数は19件で、コミット数は29件です。

:::note info

マージされたPR数とコミット数はリポジトリの健康状態を示す指標の一つです。しかし、dependabotのような非人間によるコミットも含まれる可能性があるため、これらの指標は参考程度にしてください

:::

# おわりに

テストツールを選ぶ際には、人気度だけでなく、チームのニーズやプロジェクトの要件、ツールの機能や拡張性など、さまざまな視点から総合的に判断することが重要です。今回の比較は、あくまで各ツールの現在の人気動向を把握する一つの参考として捉えてください。それぞれのツールには独自の強みと適した用途がありますので、実際のプロジェクトに最適な選択をするためには、実際に使ってみたり、コミュニティの意見を調べたりすることをお勧めします。

生成AI時代になった今、これらのツールの人気度も上昇しているため、その関係性について次回調べたいと思います。
「知能とはなにか ヒトとAIのあいだ」要約

本日発売の拙著をDeepSeek-r1に要約してもらったらさすがの出来栄えだったので共有します。まさか中読んでないよね？

-------------------------------
「知能とはなにか ヒトとAIのあいだ」は、2025年1月23日に講談社現代新書から発売された田口善弘氏の著作です。以下に、本書の概要と特徴を整理します。

---

### **1. 書籍の概要**
- **テーマ**: AIと人間の知能の本質的差異を探り、生成AIの可能性と限界、シンギュラリティ（技術的特異点）の妥当性を論じる。
- **著者の立場**: 生成AIが人間を超える知能や自我を持つ可能性は「現状の延長線上では存在しない」と主張。その根拠として、人間の知能とAIの「知能」は根本的に異なる構造を持つ点を指摘。
- **構成**:  
  - 第0章「生成AI狂騒曲」で現代のAIブームを分析。
  - 第1~4章で過去の知能研究から脳の機能・構造を解説。
  - 第5~9章で生成AIのメカニズムや非線形系非平衡多自由度系の視点を導入し、人間との差異を考察。

---

### **2. 核心的な主張**
- **知能の再定義**: 「知能」を曖昧な概念と捉え直し、人間の脳が生み出す「生物学的知能」とAIの「アルゴリズム的知能」を対比。例えば、脳は少ないデータで学習できる柔軟性を持つ一方、AIは大規模データに依存する。
- **シミュレーター理論**:  
  - 人間の脳は現実を「古典力学」という仮想モデルで解釈するシミュレーターであり、生成AIも世界のシミュレーターと位置付ける。ただし、脳の生物学的進化とAIのアルゴリズム的進化は根本的に異なる。
  - **非線形非平衡多自由度系**としての生成AIを提唱。複雑性と予測不可能性を強調し、AIの動作原理を物理学的視点から解説。

---

### **3. 著者の背景**
- **田口善弘**: 中央大学理工学部教授。機械学習とバイオインフォマティクスを専門とし、1996年に『砂時計の七不思議』で講談社科学出版賞受賞。スタンフォード大学の「世界で最も影響力のある研究者トップ2%」に4年連続選出。
- **他の著作**: 『生命はデジタルでできている』『はじめての機械学習』など、複雑な概念を一般向けに解説する著作が多い。

---

### **4. 社会的位置付け**
- **AI脅威論への反論**: 「AIが人類を排除する」という懸念に対し、現行技術の延長では意識や自発的行動が生じないと否定。ただし、制御不能な学習リスクは指摘。
- **学際的アプローチ**: 物理学・神経科学・機械学習を横断し、専門家以外にも理解しやすい解説を試みる。

---

### **5. 出版情報**
- **価格**: 1,012円（新書判、208ページ）。
- **電子版**: 主要プラットフォーム（Amazon Kindle、Reader Store等）で配信。
- **反響**: 発売直後のためレビューは未掲載ですが、著者がChatGPTとの対話で本書の内容を検証し「まともな会話が成立した」と報告。

---

### **関連書籍との比較**
- **『AI vs Humans』（心理学視点）**: AIの限界を人間の認知機能から分析。田口の物理学的アプローチと対照的。
- **『Co-Intelligence』（実用性重視）**: AIとの協働を提唱する欧米の潮流とは異なり、日本発の「知能の本質論」として独自性を持つ。

---

本書は、生成AIが普及する現代において「知能とは何か」という根源的な問いを再考させる一冊です。技術的な解説に加え、哲学的な考察も含まれる点が特徴で、AIに関心を持つ一般読者から専門家まで幅広い層に推奨されます。
改行が３連続で入力されるまで入力を受け付けるスクリプト

```python:
import sys

def read_input_until_three_newlines():
    """
    標準入力から複数行を受け付け、改行が3連続で入力された場合に確定する。
    最後の改行2つはリストから削除して返す。
    """
    lines = []
    empty_line_count = 0

    print("複数行の入力を開始します。改行を3回連続で入力すると確定します（Ctrl+Dで終了）。")

    while True:
        try:
            # 1行入力を取得
            line = sys.stdin.readline()
            if line == "":  # EOF（Ctrl+D）
                print("入力を終了します。")
                break

            line = line.rstrip("\r\n")  # 改行を削除
            if line == "":
                empty_line_count += 1
                if empty_line_count >= 2:
                    # 改行3連続で入力終了
                    print("確定します。")
                    break
            else:
                empty_line_count = 0  # リセット
            lines.append(line)
        except KeyboardInterrupt:
            print("\nキャンセルされました。")
            return []

    # 最後の2つの改行を削除
    while lines and lines[-1] == "":
        lines.pop()

    return lines

if __name__ == "__main__":
    while True:
        result = read_input_until_three_newlines()
        print("\n取得された行:")
        for idx, line in enumerate(result, start=1):
            print(f"{idx}: {line}")

```
npm 7以上でViteを使用する際の--オプションの必要性

# はじめに
プログラミング学習中の[@kat_log](https://twitter.com/kat__log "Twitter")と申します。

viteでプロジェクトを作成する時に`npm create vite@latest project-name -- --template react-swc`
というふうにコマンドを使用していたのですが、**途中の`--`は要るのか**どうなのか気になった際の知識のご共有です

# 結論：要る
要りました

`--`無しで（`npm create vite@latest project-name --template react-swc`）実行すると、
後半で指定している`--template react-swc`が適用されません

reactを指定しているのですが、どのフレームワークを使いますかなど聞かれちゃいます↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/f4722a7d-c15a-a7f5-d2b0-0bd44e1dea4d.png)

# どうして？
`npm create vite@latest FilterableProductTable --template react-swc`
の場合、`--template react-swc` オプションが Vite に正しく渡されず、npm 自身がこれを引数として解釈しようとするためみたいです。

## npmのバージョンが7以上だと`--`必要
Vite公式ドキュメントに載っていました！

> npm 7+, extra double-dash is needed

とのことです！
```terminal
# npm 7+, extra double-dash is needed:
$ npm create vite@latest my-vue-app -- --template vue
```

https://vite.dev/guide/#scaffolding-your-first-vite-project

# 結論　正しいコマンド↓
最初に記述した通り、
`npm create vite@latest FilterableProductTable -- --template react-swc`
が正解となります

# ちなみに
こちらChatGPT o1 miniが正しく教えてくれました！
4o miniは間違えていました…！（--要らないと言われました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1455073/e6bb1b7a-8490-5013-62e2-2b85ce13ffb7.png)

# おわりに
お読みいただきありがとうございました。
どなたかの参考になれば嬉しいです。

# 参考

https://vite.dev/guide/#scaffolding-your-first-vite-project
簡単Python　docstring

## 概要
Pythonのメソッドに注釈（説明コメント）を加えることは、コードの可読性や理解を深めるために重要です。
特に、**docstring** を利用すると、メソッドの機能や使用方法を詳細に記述できます。
本記事では、Pythonでメソッドに注釈を追加する方法と、その際の注意点を丁寧に解説します。

### コメントや注釈の追加方法
#### 1. 単行コメント
簡単な説明で十分な場合、# を使って1行コメントを記述します。
メソッドがシンプルな場合に適しています。
```python
def add(a, b):
    # 2つの数値を足して返します
    return a + b
```

#### 2. 複数行コメント（docstring）
Pythonでは、3つのダブルクォート """ またはシングルクォート ''' を使用して、複数行の説明をメソッドの直後に記述します。
これにより、コードエディタやドキュメント生成ツールに対応する詳細な説明を追加できます。

**基本構成**
以下のような情報を含めるのが一般的です：
1. メソッドの概要: メソッドの目的や機能を簡潔に説明
2. 引数: メソッドが受け取るパラメータとその説明
3. 戻り値: 返り値の型や意味
4. 例外（エラー）（必要に応じて）: 発生し得る例外やその条件
5. 補足情報（必要に応じて）: 使用例や注意点など

### 主な書き方の形式
#### 1. Googleスタイル
Googleが提案している形式です。簡潔でわかりやすく、広く採用されています。
```python
def multiply(a, b):
    """
    2つの数値を掛け算します。

    Args:
        a (int): 最初の数値。
        b (int): 2番目の数値。

    Returns:
        int: 掛け算の結果。

    Raises:
        ValueError: 入力値が数値以外の場合。
    """
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise ValueError("入力値は数値型である必要があります。")
    return a * b
```

#### 2. Sphinxスタイル
Sphinxなどのツールにより、利用しやすい形式で、Python公式ドキュメントなどでも使われています。
```python
def divide(a, b):
    """
    2つの数値を割り算します。

    :param a: 割られる数。
    :type a: int または float
    :param b: 割る数。
    :type b: int または float
    :return: 割り算の結果。
    :rtype: float
    :raises ZeroDivisionError: `b` がゼロの場合。
    """
    if b == 0:
        raise ZeroDivisionError("割る数はゼロであってはなりません。")
    return a / b
```

#### 3. 自由スタイル
ドキュメント生成ツールを必要としない小規模なプロジェクトや、短いメソッド向けの簡素な形式です。
```python
def greet(name):
    """
    指定された名前の人に挨拶メッセージを返します。

    Args:
        name (str): 挨拶する人の名前。

    Returns:
        str: 挨拶のメッセージ。
    """
    return f"こんにちは、{name}さん！"
```

ちなみに、筆者はGoogleスタイルが好きです。

### 適切なコメント記述のポイント
1. 簡潔さと正確さを心がける
説明はわかりやすく、過度に詳しくなりすぎないように注意します。

2. 仕様変更時はコメントも更新する
コードに変更があれば、その注釈も整合性を保つように更新する必要があります。

3. ドキュメント生成を意識する（必要に応じて）
Docstringを統一的なスタイルで記述すれば、Sphinxなどのツールを使って自動生成したドキュメントが正確で見やすくなります。

### 実用例
以下は実際のアプリケーションで利用できる詳細な説明例です。
```python
def save_to_file(filename, data):
    """
    指定されたデータをファイルに保存します。

    Args:
        filename (str): 保存先のファイル名。
        data (str): 保存するデータ。

    Returns:
        bool: 保存が成功した場合はTrueを返します。

    Raises:
        IOError: 書き込みエラーが発生した場合。

    Example:
        save_to_file("output.txt", "こんにちは、世界！")
    """
    try:
        with open(filename, "w") as file:
            file.write(data)
        return True
    except IOError as e:
        print(f"ファイル {filename} の書き込み中にエラーが発生しました: {e}")
        return False
```

### 最後
注釈が充実したコードは、共同開発者や将来の自分にとっての「優れたドキュメント」となります。適切な形式を選び、読みやすい説明を心がけましょう。

初心者ですので、誤りがございましたら、ご指摘をお願いいたします。
OCI Cloud Free Tier をもぎ取れ その6

# 概要
OCI Cloud Free Tierを取得してみた。
ubuntuにapache、phpをインストールした。
apacheが動いたので、ddnsをセットする。

# 参考にしたページ

https://qiita.com/cvp/items/3aa17a3a5a46c6271d46

# 手順
 
## ddnsに登録する。


- ドメイン取得
まずはDDNSNowでドメインを取得します。

- 新規登録手順
希望するサブドメインとパスワードを入力します
登録ボタンを押すと、ドメインの取得が完了します
パスワードやドメインは後で使うので忘れないでください。
取得時点では、取得の際に使用していたIPアドレスに対してドメインが紐づけられています。
ただし、この設定は後で変更することが可能です。

- ドメイン設定の変更方法
以下のクエリーを組み立てる。
```
"https://f5.si/update.php?domain=" + ユーザ名 + "&password=" + パスワード + "&ip=" + サーバーのIPアドレス
```

- ブラウザから登録。
上のクエリーを、ブラウザで開く。
```
OK:SUCCESS (good)

```

# 確認
以下のクエリーを組み立てる。
```
"http://" + ユーザ名 + ".f5.si"
```
上のクエリーを、ブラウザで開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/99527178-e62b-bef5-443b-a13db9383025.png)


以上。
LaTeXでソースコードを挿入する方法のメモ(2024)

和文（日本語）混じりのソースコードをLaTeX文章に貼り込むには、これまでいくつかの方法が紹介されてきましたが、近年(TeXLive2024)では、必要とされているスタイルファイル(jlisting.sty)が入手しにくくなっていたり、使えるとされていたもの(jvlisting)がエラーとなったりしていて、状況が混乱しているように思えます。

で、個人的に対策をまとめたのが以下。

* lualatex を使えば listings パッケージを使うだけで問題は起きない
* uplatex の場合は [plistings.sty](https://github.com/h-kitagawa/plistings "h-kitagawa/plistings")をダウンロードしてきてtexファイルと同じところに置き、`\usepackage{plistings}` などとして使う
* ソースコード番号やキャプションなどが不要であるなら、fvextra パッケージで `\VerbatimInput` 命令を使う。書きぶりとしては例えばこんな感じ`\VerbatimInput[frame=lines,numbers=left,tabsize=4,breaklines,breakanywhere]{file/sample.c}`

今のところこんなところっぽいです。

plistings はCTAN入りしてもいいと思うんですけど、入ってないってことは何か理由があるんでしょうか。それは追い切れてません。

以上、取り急ぎ
ServiceNow＞リストのフィールド値を簡単に入手する（小ネタ）

※この記事はServiceNow初心者が学習用のために記載した記事です。内容について誤っている場合がございます。不足点などございましたらコメントいただけますと幸いです。

# 目的
ServiceNowのリストにおけるフィールド（カラム）の名前を取得する

# 方法

- 原始的なやり方を紹介します。
- カーソルでカラムを選択してコピー

- サクラエディタを開き、ペースト
※自分の仕事環境がサクラエディタの使用が許可されているのでこちらのエディタを使用しています。

- Ctrl + Rで置換を開く
    - 以下を入力する
        - 置換前：\t
            - \t はタブ文字を表す
        - 置換後：¥r¥n
            - \r\n は改行コードを表す
    - 正規表現モードにチェックを入れる
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/cb4883b0-2a16-64a4-9fec-b4092107098c.png)
    - 置換を押下
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624279/f8f77c29-530f-a768-5db6-aaf8a9246301.png)
- これでカラム名を入手できた
【電脳少女プログラミング2088 ─壊レタ君を再構築─】「街外れの戦場跡」をやってみた。

paizaの新作プログラミングゲーム【電脳少女プログラミング2088 ─壊レタ君を再構築─】[「街外れの戦場跡」（paizaランク：E相当）](https://ppg.paiza.jp/denno2088/areas/5)をやってみました。
- - -
###### 問題
https://ppg.paiza.jp/denno2088/challenges/denno2088_choice_01

> 以下のPythonのコードを実行した時に出力される値を選択してください。
> ```py
> a = "RE"
> b = "IMI"
> print(a+b)
> ```
- - -
1行目
```py
a = "RE"
```
は、「変数$a$に文字列`RE`を代入せよ」ということです。
- - -
同様に、2行目
```py
b = "IMI"
```
は、「変数$b$に文字列`IMI`を代入せよ」ということです。
- - -
最後の
```py
print(a+b)
```
は、変数$a$, $b$にはそれぞれ文字列が代入されていますので、`a+b`で「文字列$a$と$b$を結合」し、その結果を`print`（出力）せよ、ということになります。
- - -
変数$a$, $b$にはそれぞれ`RE`, `IMI`が代入されていますので、答えは`RE`と`IMI`を結合した`REIMI`となります。
- - -
他の選択肢は
- IMIRE
```py
a = "RE"
b = "IMI"
print(b+a)
```
- IMIIMI
```py
a = "RE"
b = "IMI"
print(b+b)
```
- RERE
```py
a = "RE"
b = "IMI"
print(a+a)
```
の出力結果です。
- - -
他の言語で、問題文のPythonのコードと同じ動作をするコードを書いてみました。
- C
```c
#include <stdio.h>
#include <string.h>

int main() {
	char a[] = "RE";
	char b[] = "IMI";
	char s[6];
	strcpy(s, a);
	strcat(s, b);
	puts(s);
	return 0;
}
```
- - -
- C++
```cpp
#include <iostream>
using namespace std;

int main() {
	string a = "RE";
	string b = "IMI";
	cout << (a + b) << endl;
	return 0;
}
```
- - -
- C#
```cs
using System;

class Program
{
	public static void Main()
	{
		string a = "RE";
		string b = "IMI";
		Console.WriteLine(a + b);
	}
}
```
- - -
- Go
```go
package main
import "fmt"

func main() {
	a := "RE"
	b := "IMI"
	fmt.Println(a + b)
}

```
- - -
- Java
```java
public class Main {
	public static void main(String[] args) {
		String a = "RE";
		String b = "IMI";
		System.out.println(a + b);
	}
}
```
- - -
- JavaScript
```js
const a = "RE";
const b = "IMI";
console.log(a + b);
```
- - -
- Kotlin
```kotlin
fun main() {
	val a = "RE"
	val b = "IMI"
	println(a + b)
}
```
- - -
- PHP
```php
<?php
	$a = "RE";
	$b = "IMI";
	echo $a . $b . PHP_EOL;
?>
```
- - -
- Perl
```pl
my $a = "RE";
my $b = "IMI";
print $a . $b . $/;
```
- - -
- Ruby
```rb
a = "RE"
b = "IMI"
puts a + b
```
- - -
- Scala
```scala
object Main extends App{
	val a = "RE"
	val b = "IMI"
	println(a + b)
}
```
- - -
- Swift
```swift
let a = "RE"
let b = "IMI"
print(a + b)
```
図書館(読書・自習)へ行く時の持ち物リスト


注意:この記事にはAmazonリンクが貼られていますが、アフィリエイトリンクではありません。筆者には一切の収益は入りません。ただの情報共有を目的とした記事となっております。

# インプット用

## ipad mini

電子書籍を読む用

https://www.amazon.co.jp/dp/B0DK467P86

## お好きな本 2冊

お勧めの本は特に他意はありません。

https://www.amazon.co.jp/dp/4873117763

https://www.amazon.co.jp/dp/4814400616

## 本に寄り添う文鎮
オライリーなどのちょっと大きめの技術書でもしっかりと抑え込んでくれるので地味に重宝しております。パソコンを使用しながらでも参照できるのは大変便利です。

https://www.amazon.co.jp/dp/B0CS69PP64




# アウトプット用

## Pomera DM200
ネットが使えないので、集中してアウトプットができる優れもの　コンパクトなサイズで読書しながらでも使える点が気に入ってます。

https://www.amazon.co.jp/dp/B01LXQZ4WI

## システム手帳　A5 ディープ ライフオーガナイザー リング径15mm

手帳術みたいな記事書けたら良かったんですけど、あんまりよそ様の参考になるような使い方はしてなくて、ただただアイディア自由帳みたいな使い方をしております。

https://www.amazon.co.jp/dp/B07PMMVF8

## デルフォニックス ロルバーン ポケット付メモ リング式/切離しミシン目付き A5

ライフオーガナイザー はノートを挟めるシステム手帳でして、このロルバーンを挟んで使用しております。

https://www.amazon.co.jp/A5-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97-%E3%83%A9%E3%82%A4%E3%83%95%E3%82%AA%E3%83%BC%E3%82%AC%E3%83%8A%E3%82%A4%E3%82%B6%E3%83%BC-%E3%83%AA%E3%83%B3%E3%82%B0%E5%BE%8415mm%E3%80%90%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%80%91%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%89%8B%E5%B8%B3%E3%83%90%E3%82%A4%E3%83%B3%E3%83%80%E3%83%BC-3706/dp/B07PMMVF82




## レーニエクラッチジャケットMINI6zip13mmリフィルパッド

これはミニ6のシステム手帳兼財布機能もある優れもの商品です。愛用しております。

+ お札入れ
+ 小銭入れ
+ カード入れ
+ ペン入れ(1本)
+ mini6のシステム手帳
+ スマホ入れ(xperia aceが入ります。 他の機種のサイズだとたぶん無理)

の６機能を１つでこなせて大変重宝しております。

https://www.amazon.co.jp/dp/B08KJ23CZD


# その他

## 目薬
これが無いと何もできない
## メガネケースとメガネ拭き
## メガネ
目が悪い


## モバイルバッテリー兼充電器 Anker PowerCore Fusion 5000

1人で2役をこなせるので重宝しております。

https://www.amazon.co.jp/dp/B01LATWL5G

## 三又ケーブル
1つで3役をこなせるすごい奴　便利ですよ

https://www.amazon.co.jp/dp/B0DNS8J27Q



## オーディオプレイヤー  Astell&Kern KANN Astro Silver

SDカードが使えるDAP 中古で安い奴を買いました。
https://www.amazon.co.jp/dp/B072553XSF

## Shokz (ショックス) OpenRun 骨伝導イヤホン
長時間つけっぱなしでも耳が痛くならないので重宝しています。デメリットは大きい音を鳴らすと爆音で音漏れすることと、うるさい場所では全く機能しなくなることです。
https://www.amazon.co.jp/dp/B0D9JFC7JC






## ギアケース　# WILDTECH(ワイルドテック) GEAR CASE(ギアケース)L CORDURA(コーデュラ)ファブリック 215-AFXP213 YouTuber「FUKU」コラボ商品アウトドア カトラリーケース スパイスケース Lサイズ

本に寄り添う文鎮やメガネケースや目薬・モバイルバッテリーなどの小物をまとめていれております。アウトドア用ですが、まあ便利に使えております。

https://www.amazon.co.jp/dp/B0BJTJKCF1

## 水筒　Nalgene 広口0.5L
水筒　水分補給はやっぱり大事です。水分不足だと集中力も切れますしね。

https://www.amazon.co.jp/dp/B09LMQ27BB

## リュックサック
特にこだわりが無いのでどこのメーカーの奴を使ってるのかよくわからないので、リンクは張りません。オタクはリュックサックが好き。

## スマートフォン　Xperia Ace
レーニエクラッチジャケットにすっぽり収まるという事で気に入って使っているミニスマホです。性能はまあ、そうねえって感じです。オタクはAndroidとXperiaが好き。

https://www.amazon.co.jp/dp/B0B7D5XT3V

## ラムネ
ブドウ糖補給 集中力維持のため

https://www.amazon.co.jp/dp/B0B1TLPG9R

## ブロックタイプの大きな付箋
気付いたことなどをメモして本に貼り、家に帰ってから確認する用。
Go言語の可変長引数を徹底解説！実はスライスだった？スライスでの呼び出し方法も解説

## はじめに 

Go言語で関数を設計する際に便利な**可変長引数**。複数の引数を柔軟に扱えるこの機能ですが、その実体はスライスであることをご存じでしょうか？本記事では、可変長引数の基本から、スライスを使った応用的な呼び出し方までを詳しく解説します。

## 可変長引数とは？

可変長引数は、関数に渡す引数の個数を動的に決定できる仕組みです。Go言語では、引数の型の前に`...`を付けることで可変長引数を宣言できます。以下の例を見てみましょう。

```go
package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    fmt.Println(sum(1, 2, 3))       // => 6
    fmt.Println(sum(10, 20, 30, 40)) // => 100
}
```

### 基本的な仕組み
- 可変長引数は、複数の値を1つの**スライス**として受け取ります。
- 上記の例では、`numbers`は`[]int`型のスライスとして扱われます。


## 実体はスライス！これが意味すること

Go言語の可変長引数の実体はスライスです。つまり、関数内で操作するときはスライスと同じ方法でアクセスできます。例えば以下のようなコードで確認できます。

```go
package main

import "fmt"

func printDetails(values ...string) {
    fmt.Printf("Type: %T, Length: %d\n", values, len(values))
    for i, v := range values {
        fmt.Printf("Index %d: %s\n", i, v)
    }
}

func main() {
    printDetails("Go", "Python", "Ruby")
}
```

出力結果:
```text
Type: []string, Length: 3
Index 0: Go
Index 1: Python
Index 2: Ruby
```

このように、可変長引数はスライスとして扱われるため、`len`関数や`range`を使用して操作できます。


## スライスを使って可変長引数関数を呼び出す

可変長引数関数は、スライスを展開して引数として渡すことも可能です。その場合は、引数にスライスを渡す際に`...`を付けます。以下の例を見てみましょう。

```go
package main

import "fmt"

func sum(numbers ...int) int {
    total := 0
    for _, num := range numbers {
        total += num
    }
    return total
}

func main() {
    nums := []int{10, 20, 30}
    fmt.Println(sum(nums...)) // => 60
}
```

### 注意点
- `...`を付けないと、スライス全体が1つの引数として渡されてしまいます。
- `nums...`とすることで、スライスの要素が展開され、可変長引数として渡されます。


## 可変長引数を使うときのベストプラクティス

1. **必要最低限の引数を分けて定義する**  
   必須の引数がある場合は、可変長引数の前に明示的に定義するとよいでしょう。

```go
   func printMessages(header string, messages ...string) {
       fmt.Println(header)
       for _, msg := range messages {
           fmt.Println(msg)
       }
   }

   printMessages("Messages:", "Hello", "World")
```

2. **パフォーマンスに注意**  
   可変長引数のスライスは、新たに割り当てが行われるため、大量の引数を頻繁に渡す場合は注意が必要です。

## おわりに

Go言語の可変長引数は、柔軟な引数管理を可能にする便利な機能です。しかし、その実体がスライスであることを理解することで、さらなる応用が可能になります。特に、スライスを展開して引数として渡す方法は非常に便利です。

この記事を参考に、Go言語の可変長引数を使いこなして、より効率的で柔軟なコードを書きましょう！
アナログジョイスティックで遊ぶ(入力)(H743)(RKJXV122400R)


目的
秋葉原の秋月電子で売っている。
あの、ベストセラーのアナログジョイスティックで
遊ぶ。(RKJXV122400R)(約300円で硬い安い方)
(アナログジョイスティックで硬いとは、入力時の戻りが...省略)
(あと、入力の制限が...省略)
(ようは、お値段なり)
工夫した点は、半固定抵抗をかませて、中心が1.650Vに
なる様に調整した。(少し基板を切って繋いで改造した)
(改造箇所は、Y側の電源を切り離して、別のピンから出力した)
注意点、配線の都合、XとYが逆でソフト側で対応
(さらに逆でいいかんじ)


結果
----

![Screenshot from 2025-01-23 07-39-09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/604c69f2-3644-b46b-0445-61d9e444f6ed.jpeg)



![image_original (33).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7bcf1fa9-1011-0b42-2e83-c70249f556d5.jpeg)


![image_original (34).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/bfb3a338-7286-01db-ab21-acfbb5af2edd.jpeg)



プログラム
----



```c++


//ser_analog_joystick_1_stm32h743_1


//インクルド
#include <Arduino.h>


//初期化
void setup() {

  //シリアルポートの初期化
  Serial.begin(9600);

}  //setup


//メインループ
void loop() {

  int s;         //センサーの値
  int Voltage;   //電圧
  char data[16]; //出力用文字列

  //電圧を入力する(3.3Vを4096に分解した値)
  analogReadResolution(12);  //センサーの分解度4096
  s = analogRead(A4);        //センサーの値

  //電圧に変換 ex 1650
  Voltage = (s * 3300) >> 12;  // v = s * 3300 / 4096 電圧こと

  //文字列に変換する
  data[5] = 0;                   //終端記号
  data[4] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[3] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[2] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[1] = '.';                 //小数点の区切り
  data[0] = '0' + Voltage;       //整数1桁目(1の位)

  //整数.小数点3桁で表示 ex 1.650
  Serial.print(data);

  Serial.print(","); //区切り

  //電圧を入力する(3.3Vを4096に分解した値)
  analogReadResolution(12);  //センサーの分解度4096
  s = analogRead(A5);        //センサーの値

  //電圧に変換 ex 1650
  Voltage = (s * 3300) >> 12;  // s = v * 3300 / 4096 電圧こと

  //文字列に変換する
  data[5] = 0;                   //終端記号
  data[4] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[3] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[2] = '0' + Voltage % 10;  //小数点の値
  Voltage = Voltage / 10;
  data[1] = '.';                 //小数点の区切り
  data[0] = '0' + Voltage;       //整数1桁目(1の位)

  //整数.小数点3桁で表示 ex 1.650
  Serial.print(data);

  Serial.println(""); //改行

  //2msの待ち
  delay(2);

}  //loop


```
ウォーターフォール開発

# はじめに
最近よく聞く開発手法としては、以下が挙げられる。
・アジャイル開発
・ウォーターフォール
・アジャイルとウォーターフォールのハイブリッド型
・プロトタイピング型開発
・スパイラル型開発
・DevOps（デブオプス）
・MVCモデル

その中でも昔からある開発手法として、今更ながらウォーターフォール型開発とはなんぞ？という記事を記載していく。
メリット/デメリットを整理して、具体例を交えながら記載していこうと思う。

# ウォーターフォール型開発とは
システムやソフトウェアの開発を、滝が上から下へ流れ落ちるように、段階的に進めていく手法です。
具体的には、以下の工程を順番に進めていきます：
1.要件定義
2.設計
3.実装
4.テスト
5.リリース・運用

それぞれの工程について、具体例を交えて説明しましょう。

# 要件定義
まず、システムに何が必要かを明確にします。
例えば、オンライン書店システムを開発する場合：
　本の検索機能
　ユーザー登録・ログイン機能
　注文・決済機能
　在庫管理機能

これらの機能を詳細に定義します。
要件定義書に明確に定義することになり、ユーザーなどと合意した上で次のフェーズに進む。

# 設計
要件に基づいて、システムの設計を行います。
例えば：
　データベース設計：本の情報、ユーザー情報、注文情報をどのように保存するか
　ユーザーインターフェース設計：検索画面や注文画面のレイアウト
　システム構成：Webサーバー、データベースサーバーなどの構成

# 実装
設計に基づいて、実際にプログラムを書いていきます。
例えば：
　検索機能のプログラミング
　ユーザー認証システムの実装
　決済システムとの連携

# テスト
開発したシステムが正しく動作するかテストします。
例えば：
　検索結果が正確か
　注文処理が正しく行われるか
　大量のアクセスに耐えられるか

# リリース・運用
テストが完了したら、システムを公開し、運用を開始します。

# ウォーターフォール型開発の特徴
各工程を順番に進め、前の工程が完了してから次の工程に進むことです。
これにより、計画的に開発を進められる一方で、途中での大きな変更が難しいという特徴があります。

例えば、政府の大規模システムや銀行のコアシステムなど、要件が明確で変更が少ないプロジェクトに適しています。
一方で、要件が頻繁に変わるWebサービスなどの開発には、アジャイル開発のような柔軟な手法が適していることもあります。
プロジェクトの特性に応じて、適切な開発手法を選択することが重要です。

# 成功させるには
* 要件定義の徹底
　ユーザーのニーズを的確に反映させた仕様を早期に確定
　顧客からの要求やシステムが必要とする機能を正確に把握し、明確に文書化
 　→後の設計や実装段階での変更を最小限に抑制

* 計画的な進行
　各工程の期限を守りながら進行2
　プロジェクト全体のスケジュールから各工程のスケジュールを算出
　→スケジュールの進捗を管理

* 効果的なテスト実施
　事前に計画されたシナリオに沿ってテストを実施
　リリース後のトラブルを最小限に抑制

* 安定稼働の実現
　綿密な計画と各フェーズでの品質管理により、システムの安定稼働を達成

大規模な開発であればあるほどリスクは高まるため、以下要素も重要。
・各フェーズごとの完了条件の明確化
・レビューの徹底
・各フェーズごと、もしくは各フェーズのサブタスクのある程度のまとまりを考慮して、
　適宜チェックポイントを設けてOutputが適切かチェックする
 （最後に一気にまとめてチェックするのではなく、ある程度の粒度でチェックすることで早期のリスクを検知することが可能となる）


以上
Nordic nPM1300でnPM FuelGaugeを使ってみた

# 要約
NordicSemiconductor社製PMICのnPM1300を使ってnPM Fuel Gaugeライブラリを動かしてみたところ、メーカ提供の[サンプルコード](https://github.com/nrfconnect/sdk-nrf/tree/v2.6.2/samples/pmic/native/npm1300_fuel_gauge)に対して以下の工夫を施す。
* 充電中に`nrf_fuel_gauge_init`を実行してはいけない
* 充電完了時には`nrf_fuel_gauge_init`を実行しよう
* `nrf_fuel_gauge_process`の実行頻度は1秒毎で良い
* Discharge current limitを適切に設定しよう
* BatteryModelは5℃, 25℃, 45℃の3温度でプロファイルしよう

## 充電中に`nrf_fuel_gauge_init`を実行してはいけない
nrf_fuel_gauge_init関数を実行してからバッテリ充電を有効化する。
参考: https://devzone.nordicsemi.com/f/nordic-q-a/116777/understanding-and-improving-state-of-charge-measurement-variability-with-nordic-52840-and-npm1300/512354

例えば、以下のようなコードでBCHGENABLESETレジスタに1をセットすると良い。
```c
fuel_gauge_init(dev2);
mfd_npm1300_reg_write(dev1, 0x03U, 0x04U, 0b1U);
```
※DeviceTreeで`charging-enable;`が指定されていると、RESET状態から遷移してきた時(ユーザアプリケーション実行時)には既に充電が有効化されてしまっているので、DeviceTreeで充電を有効にしておかないように注意する。

## 充電完了時には`nrf_fuel_gauge_init`を実行しよう
BCHGCHARGESTATUSレジスタの1bit目(COMPLETEDビット)が立ったら、nrf_fuel_gauge_initを実行すると良い。（将来的にはnPM Fuel Gaugeライブラリ側で実施されるようになるらしい）
参考: https://devzone.nordicsemi.com/f/nordic-q-a/116430/soc-values-after-battery-profiling/510928

COMPLETEDビットは状態が変化するまでラッチされるので、割り込みで実行するかポーリングで行う場合は以下のようなコードを用いて立ち上がりエッジで1回だけ実行する。
```c
static bool flag = false;
uint8_t tmp = 0U;
mfd_npm1300_reg_read(dev1, 0x03U, 0x34U, &tmp);
if (0 != (tmp & 0x1CU)) {
  flag = true;
} else if ((true == flag) && (0x03U == tmp)) {
  flag = false;
  fuel_gauge_init(dev2);
}
```

## `nrf_fuel_gauge_process`の実行頻度は1秒毎で良い
バッテリ消費電流が少ない場合は実行頻度を落として、バッテリ残量演算に要する電力を節約できるらしい。
参考: https://devzone.nordicsemi.com/f/nordic-q-a/110576/npm1300-fuel-gauge-update-rate-requirements-for-accuracy-nrf_fuel_gauge_process/487363

## Discharge current limitを適切に設定しよう
nPM1300のデータシートにも記述があるとおり、バッテリ電流測定の分解能は電流制限値に依存する。
参考: https://docs.nordicsemi.com/bundle/ps_npm1300/page/keyfeatures_html5.html

バッテリ消費電流が少ないのであれば、例えば、データシートに記載がある200mA (MSB=42, LSB=0)に設定する場合のコード。
```c
mfd_npm1300_reg_write(dev1, 0x03U, 0x0AU, 42U);
mfd_npm1300_reg_write(dev1, 0x03U, 0x0BU, 0b0U);
```

Charge current limitも併せて設定しておくと良い。
例えば、データシートに記載がある32mA (MSB=8, LSB=0)に設定する場合のコード。
```c
mfd_npm1300_reg_write(dev1, 0x03U, 0x08U, 8U);
mfd_npm1300_reg_write(dev1, 0x03U, 0x09U, 0b0U);
```


## BatteryModelは5℃, 25℃, 45℃の3温度でプロファイルしよう
`nPM1300 EK`と`nPM Fuel Gauge board`と`nPM PowerUP`を用いてバッテリプロファイルを行う際は、必ず、5℃, 25℃, 45℃の3温度で測定してBatteryModelを作成する。
※なお、Nordicからプリセットとして提供されているBatteryModelは5℃, 25℃, 45℃でプロファイルされている。
参考: https://devzone.nordicsemi.com/f/nordic-q-a/114657/temperature-for-battery-profiling-npm1300-using-fuel-gauge/502553

## 動作確認環境
- toolchains v2.6.2
- nRF Connect SDK v2.6.2 ([nRF Fuel Gauge library](https://docs.nordicsemi.com/bundle/ncs-latest/page/nrfxlib/nrf_fuel_gauge/README.html) v0.9.2)
- nPM1300 EK (FirmwareVersion 1.2.4)
- nPM PowerUP v1.3.1
Rails 7でフォームのファイル選択時にファイル名を表示する方法（Stimulus使用）

## はじめに

フォームでファイルを選択した際、選択したファイル名を表示したい場面がありますよね？Rails 7では、Stimulusを使うことでシンプルに実現できます。この記事では、ファイル名を表示する機能を、Stimulusを活用して実装する方法を解説します。

## 実現したいこと

以下のフォームのように、ファイルを選択するとそのファイル名をフォームの下に表示する仕組みを作ります。

![動作イメージ](https://via.placeholder.com/500x300?text=ファイル名表示イメージ)

### 特徴:
- 複数ファイルを選択可能。
- ファイル名が長い場合は30文字で切り詰めて表示（トランケート）。

## 実装手順

### 1. Stimulusコントローラを作成

Rails 7ではStimulusがデフォルトで導入されているため、Stimulusコントローラを作成します。

以下のコマンドを実行して、新しいStimulusコントローラを生成します：

```bash
bin/rails generate stimulus file_input
```

これにより、`app/javascript/controllers/file_input_controller.js` が作成されます。

### 2. コントローラにロジックを追加

`file_input_controller.js`に、ファイル選択時に名前を表示する機能を追加します。

#### **修正後のコード**

```javascript
import { Controller } from "@hotwired/stimulus";

// Connects to data-controller="file-input"
export default class extends Controller {
  static targets = ["input", "fileNames"]; // ファイル入力と名前表示用ターゲットを定義

  connect() {
    // ファイル選択時にイベントをトリガー
    this.inputTarget.addEventListener("change", this.displayFileNames.bind(this));
  }

  displayFileNames(event) {
    // 選択されたファイルリストを取得
    const files = Array.from(this.inputTarget.files);
    // ファイル名をトランケートして表示
    const truncatedFileNames = files.map((file) => {
      const maxLength = 30; // 最大文字数
      return file.name.length > maxLength
        ? file.name.substring(0, maxLength) + "..."
        : file.name;
    });

    // ファイル名をリストとしてHTMLに挿入
    this.fileNamesTarget.innerHTML = `
      <ul>
        ${truncatedFileNames.map((name) => `<li>${name}</li>`).join("")}
      </ul>
    `;
  }
}
```

### 3. ビューでStimulusコントローラを適用

Stimulusコントローラをフォームに適用します。`data-controller`と`data-target`属性を利用して、ファイル選択フィールドとファイル名表示エリアを関連付けます。

#### **修正後のフォーム（例: `app/views/documents/_form.html.erb`）**

```erb
<div data-controller="file-input">
  <div class="field">
    <%= form.label :files, "Attach Files" %>
    <%= form.file_field :files, multiple: true, data: { target: "file-input.input" } %>
  </div>
  <div id="file-names" data-target="file-input.fileNames"></div> <!-- ファイル名を表示 -->
</div>
```

### 4. Stimulusを読み込む

Stimulusコントローラを有効にするために、エントリーポイント（`app/javascript/application.js`）でStimulusをロードします。

#### **修正後の`app/javascript/application.js`**

```javascript
// Load all Stimulus controllers
import "./controllers";
```

### 5. 動作確認

以下を確認してください：

1. **ファイル選択時に名前が表示されること**：
   - フォームでファイルを選択すると、ファイル名が表示されます。
   - 長いファイル名は30文字にトランケートされます。

2. **複数ファイルを選択可能**：
   - 複数ファイルを選択すると、全てのファイル名がリスト表示されます。

## まとめ

Rails 7ではStimulusを使うことで、フロントエンドの機能を簡単に拡張できます。ファイル選択時に名前を表示する仕組みも、わずか数ステップで実現可能です。

### **ポイント**
- Stimulusの`data-target`でHTML要素を簡単に管理。
- 長いファイル名はJavaScriptで切り詰めて表示。

これでフォームのUXが向上します！ぜひ試してみてください。
Pythonで動くTableauライクな可視化ツール「PyGWalker」

## この記事のターゲット
・Tableau使ってる方でPythonやデータサイエンティスト等に興味を持ち始めた人。
・逆にPython使ってる方でTableau等のBIツールに興味のある人
等

## この記事を書いた背景
　2024年夏から半年間マナビDXでAI開発(機械学習)を学びました。
機械学習を学習していく過程でEDA(探索的データ分析)で様々なツールを活用するようになりました。
　最近は、Data Wrangler等をよく使うのですが、2024/11からTableauコミュニティ資格のDATA Saberにチャレンジ中なので、Tableauライクな可視化ツール「PyGWalker」の紹介をしたいと思います。

## PyGWalkerとは？
　Python環境で動く、Tableauライクな可視化ツールです。
　PyGWalkerは、Pythonのデータ分析ツール（Pandas）と直感的なUIを組み合わせたツールで、Tableauライクな操作感で操作出来ます。

## PyGWalkerの特徴とTableauとの違い
### PyGWalkerの特徴
　・Tableauに似たインターフェースで、データの可視化がドラッグ＆ドロップで簡単にできる。
　・コードを書く量を大幅に削減しつつ、Python内で分析ワークフローを完結できる。
　・Altairベースで軽量かつ拡張性が高い。
### Tableauとの違い
　・TableauはWindowsやMacにインストールするソフトウェアですが、PyGWalkerはPython環境上で動作するソフトウェアです。
　・PyGWalkerは無料で利用が出来、GUI上でのドラッグ＆ドロップ以外に「スクリプト・コードベース」で分析も行えます。
　・Tableauより動作は軽量だが、出来ない事も多い。
　・UIが英語なので慣れるまで少し大変かも。

## PyGWalkerを始める準備
自分のPC上で動かしたい場合はPython環境の構築が必要(わからない方は「Python anaconda」とかで調べてね)ですが、オンライン上でPythonが動かす事が出来るGoogle Colab等でも動かす事が可能です！
Google Colabの使い方は割愛しますが。
```
# 必要なライブラリをインストール　※各自足りないものを追加インストール
!pip install pygwalker

# 必要なライブラリを使えるようにする（PandasとPyGWalker）
import pandas as pd
import pygwalker as pyg

# PyGWalkerで使用するデータファイルを読み込む。
df = pd.read_csv(r'サンプル - スーパーストア.csv', encoding='utf-8')
# PyGWalkerを実行
walker = pyg.walk(df)
```

なんと、たったこれだけのプログラムコードでPyGWalkerを利用できます。
UIが英語ですがTableauユーザーならさほど困らないんじゃないかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951242/8edb1f71-fb9e-736d-d0ca-0e381621c6eb.png)

よく使う項目として下があるのですが、左から
　・連続・不連続の変更
　・チャートの変更
　・スタックモードの変更
 　　そのまま（None）、積み上げ(Stack)、や正規化（Normalize）、ピラミッド※正負の値を中心（Center）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3951242/a0a322b0-0d8a-6eba-1185-9513e67bbbac.png)

## 現在、使い方を勉強中
Pythonのプログラムコードを書かなくても直感的にableauライクで可視化が出来るPyGWalker。
私も使い方の勉強中で
　・値を表示できないの？
　・色をもっと柔軟に設定できないの？
　・Centerがズレる時があるんだけど？
等など、課題がたくさんあります。

# でも簡単に可視化できる「PyGWalker」は便利！
もう少し使い慣れたら情報を追記したいと思います。(｀・ω・´)

---
参考URL
PyGWalker（https://chatgpt.com/c/678f7409-bf24-8003-ad92-8b265cc9c97c）
Google Colab（https://colab.research.google.com/?hl=ja）
DATA Saber（https://datasaber.world/）
マナビDXクエスト（https://dxq.manabi-dx.ipa.go.jp/）
偶発的プログラミング

## はじめに
当記事では達人プログラマー第二版の38.偶発的プログラミングについて解説をする
筆者は背景の知識の理解が不足したまま勢いだけでコードを書く傾向がある
そのために業務の理解が不足し仕事をうまく進められない状況が発生した
その際にこの偶発的プログラミングを読むようにアドバイスをいただいた
そこでその内容の理解と解説を行い、偶発的プログラミングを避けられるようになることを狙いとする

本記事は以下の書籍を元に作成されている

https://www.ohmsha.co.jp/book/9784274226298/

所感以外は本書の抜粋または要約となる

## 偶発的プログラミングとは何か？
幸運と行き当たりばったりの成功に頼るようなプログラミング
誤った結論を前提として行動し誤った結末に陥る

## それを避けるためには？
・もし何らかの機能を呼び出す場合には、ドキュメント化されている振る舞いのみを前提とするようにする
そして、何らかの理由でそれができないのであれば、仮定をドキュメント化しておく
・常に何をやっているのかを意識する
・新人プログラマーに対して、コードの詳細を説明できるか？できない場合偶発的プログラミングに頼っている可能性が高い
・目隠しでコーディングしてはいけない。完全に理解していないアプリケーションを作成しようとしたり、なじみのない技法を使おうとするのは、偶発的なプログラミングに通じる近道。上手く実行できてい成る理由を説明できないのであれば、おかしな動作をする理由も説明できないはず
・まずプランから進めるようにする
・信頼のおけるものごとだけを前提とする。偶然や仮定に依存してはいけない
・仮定をドキュメント化する
・単にコードをテストするのではなく、あなたの置いた仮定もテストする。推量は抜きにして、実際に試してみる。
・作業に優先順位をつける。そして重要な部分に時間をかける。もし基礎やインフラが正しくないのであれば、本質的でない部分は何の意味も持ちません。
・過去のしがらみにとらわれてはいけない。既存のコードによって未来のコードが影響されないようにしてください。陳腐化したコードがあれば、それが全部であっても置き換える。

## 所感
正直こういったやり方は時間がかかるので敬遠する傾向があった
時間が取られ、それによって得られる成果は小さいものに感じていた
社会はより速くより良い物を求めているのでそれに合わせて多少出来栄えに問題があっても速くリリースすることが求められていると感じていた
また思考に時間がかかることは一般的に推奨されることでないと感じていた
より優秀な周りや成果が上がらない自分の境遇により焦りがあり焦りのため精密な思考よりも短絡的な成果を欲していた
考えることは大変で頭が混乱してしまうのはフラストレーションが溜まる


またわからない部分を質問するのはフラストレーションになりがちである
相手の時間を奪っているという感覚があるためなるべく避けたいのと理解できないとイラつかれる経験があるため聞くのことがやや苦手である
そういったコミュニケーションの問題から自己判断を下しがちだしその点をすり合わせるのも苦手な傾向がある
逆に聞きすぎて鬱陶しがられた経験もあるためその辺りのコミュニケーションもまた苦手である

ただそういったやり方に問題が発覚した以上修正の必要性は大きいと感じている
今日明日ですぐに修正できるものではないだろうし、思考するトレーニングや適切な質問の仕方も必要になってくると考えられる
少しずつ良くなるために偶発的プログラミングを避けられるように努力をしたい