OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】その古いUniTask、タイミングずれてますよ ～キー入力が取れなくて困った話～

Unity2019から正式リリースされた新しい[InputSystem](https://docs.unity3d.com/Manual/com.unity.inputsystem.html)には、ボタンを押した（離した）フレームのみTrueになるWasPressedThisFrame()とWasReleasedThisFrame()というメソッドがあります。

https://docs.unity3d.com/ja/Packages/com.unity.inputsystem@1.4/api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame

このメソッドの値をUniTask.Yield()を使ってUpdateのタイミングでポーリングしようとしたのですが、**WasReleasedThisFrame()が常にfalseを返し、入力を検知できない現象が発生しました**。
原因は**使用しているUniTaskとUnityのバージョンが合っていなかった**という単純なものだったのですが、特定に至るまでが大変だったので[^1]、将来同じ問題に直面する方のために情報を残しておきます。

[^1]: 最初はPlaerLoopのイベント実行順がUnityの仕様で順不同になることが原因と予想していたため、かなり遠回りをしました。

# 環境

* Unity 6 (6000.0.40f1)
* InputSystem 1.13.1
    * Update Mode：Process Events In Dynamic Update
    * PlayerInput未使用
* **UniTask 2.0.24**


# 解決方法

UniTaskをUnity 6をサポートしているバージョンにアップデートすることで解決しました。
筆者の場合は2.0.24から2.5.10（2025年5月6日時点の最新）にアップデートしてWasPressedThisFrame()から正しく値が取れるようになりました。

# 原因

古いUniTaskをUnity2020.2以降で使用した場合に発生する不具合でした。
Unity2020.2からPlayerLoopのイベントの種類（TimeUpdate）が増えた影響でUniTaskのイベント実行タイミングがずれ、PlayerLoopTiming.UpdateならPreUpdateのタイミングでYield()を抜けてしまい、まだ値のセットされていないWasPressedThisFrame()にアクセスしてしまっていたようです（InputSystemはPreUpdateで値をセットします）。

この不具合はUniTask 2.1.0で修正されています。当時アナウンスされていたのですが見落としていました。

https://x.com/neuecc/status/1347103634522181635


# おまけ：問題が発生したコード

UniTaskでInputActionをポーリングして、WasPressedThisFrame()がtrueになったらイベントを発行するコードです。
バージョン2.1.0未満のUniTaskをUnity 2020.2以降で使用するとPreUpdateのタイミングでYield()を抜けてWasPressedThisFrame()にアクセスしてしまい、必ずfalseが返ります。

```InputActionWatcher.cs
using Cysharp.Threading.Tasks;
using System.Threading;
using UnityEngine;

class InputActionWatcher : MonoBehaviour
{
    private void Start()
    {
        RunUpdater(this.GetCancellationTokenOnDestroy()).Forget();
    }

    async UniTaskVoid RunUpdater(CancellationToken cancel)
    {
        // InputActionAssetが自動生成したクラスのインスタンスを作成
        // 実際の運用ではstaticで定義するなど他と共有できるようにした方が良い
        var input = new MyInputActions();
        while (!cancel.IsCancellationRequested)
        {
            // 攻撃ボタンがこのフレームに押されたかチェック
            if(input.Battle.Attack.WasPressedThisFrame())
            {
                // ボタンが押されたことを通知
                CallbackOnPressed();
            }
            await UniTask.Yield(PlayerLoopTiming.Update, cancel);
        }
    }

    private void CallbackOnPressed() 
    {
        Debug.Log("Attack button pressed");        
    }
}

```
Jenkinsビルド実行時にnpmエラー

* rails 7.1
* vite
* Jenkinsfile

上記な環境でJenkinsのビルドを実行すると、以下のようなエラーに遭遇する。
```
ActionView::Template::Error: Vite Ruby can't find entrypoints/application.js in the manifests.

Possible causes:
  - The last build failed. Try running `bin/vite build --clear --mode=test` manually and check for errors.

Errors:
  npm error code EACCES
  npm error syscall mkdir
  npm error path /.npm
  npm error errno EACCES
  npm error
  npm error Your cache folder contains root-owned files, due to a bug in
  npm error previous versions of npm which has since been addressed.
  npm error
  npm error To permanently fix this problem, please run:
  npm error   sudo chown -R XXX:XXX "/.npm"
  npm error Log files were not written due to an error writing to the directory: /.npm/_logs
  npm error You can rerun the command with `--loglevel=verbose` to see the logs in your terminal


Visit the Troubleshooting guide for more information:
  https://vite-ruby.netlify.app/guide/troubleshooting.html#troubleshooting
```

Jenkinsfileファイルを以下のようにすることで解消した。
```
      environment {
        RAILS_ENV = 'test'
        NPM_CONFIG_CACHE = "${WORKSPACE}/.npm"
      }
      steps {
        sh 'bundle exec vite install'
        sh 'bin/vite build --clear --mode=test'
        sh 'bundle exec rails test'
      }
```
偏差値50の私立文系出身の私が未経験からデータサイエンティストになった方法

# 1. はじめに
皆さん、はじめまして。
私は現在、派遣でデータサイエンティストとして働いています。

本記事では、偏差値50の私立文系出身の私が、未経験からデータサイエンティストに転職した方法と、その後のキャリアについてご紹介します。

転職から3年が経過し、仕事にもようやく慣れてきました。自身のキャリアの棚卸しも兼ねて、この記事を書いています。

文系・未経験という境遇からデータサイエンティストを目指す方々にとって、少しでも参考になれば幸いです。

# 2. 私について
私の簡単な経歴は以下の通りです。

- 日⚪︎駒⚪︎の文系学部出身
※ 数学III・Cの履修経験なし
- 転職前は県職員として勤務

# 3. 転職を決意した理由
少し自分語りになりますので、読み飛ばしていただいても構いません。

結論から言えば、私は公務員という職業に向いていませんでした。

ある日、業務の効率化について上司に相談したところ、「そんなことをしたら人員が削減される」と却下されました。
当時は「上司が悪い」と感じていましたが、今振り返れば「効率化すれば忙しくなる構造」自体に問題があるのだと理解できます。

この出来事をきっかけに職場への信頼を失い、自分の仕事の意義がわからなくなっていきました。
当時、病院に行っていれば「適応障害」と診断されていたと思います。たぶん。

そんな状態で日々働いていたある日、職場で飛び降り自殺が起こりました。
その職員が私と同じような業務を担当していたことを知り、私はすぐに退職届を提出しました。

# 4. 転職のためにやったこと
未経験からデータサイエンティストを目指す場合、研修制度が充実しているSES企業や派遣会社に転職するのが現実的な選択肢だと考えました。

ただし、そうした企業の「未経験データサイエンティスト枠」は非常に競争率が高く、理系出身者も多く応募してきます。
その中で内定を勝ち取るには、彼らよりも「適性がある」ことを採用担当者に示す必要がありました。

そこで私は、以下の2つの目標を設定しました。

- 統計検定2級の取得

- データサイエンスコンペでの入賞

この2つを達成するために、3ヶ月で900時間以上を勉強に費やしました（公務員試験の数倍きつかった...）。

## 1. 統計検定2級の取得（約200時間）
統計検定2級は、統計・数学の基礎的な理解力を示すのに有効な資格です。
高校数学（数II・B）までの知識で十分対応できるため、文系出身でも対策をすれば十分合格可能です。

私の勉強法は以下の通りです：

- YouTubeでのインプット（特に「とけたそうチャンネル」がおすすめ）

- 問題集でのアウトプット

- わからない部分は「統計Web」で補足

今であれば、生成AIを活用するのも良いと思います

参考教材：

- [統計検定2級 公式問題集](https://amzn.asia/d/fvPvQs6)
- [とけたそうチャンネル](https://youtu.be/mh36Jtcn0zg?si=0_DtGO4v-ouIUKrz)
  - とにかくわかりやすく、初学者にお勧めです
- [統計WEB](https://bellcurve.jp/statistics/course/9212.html?srsltid=AfmBOoqdqvzRWyU_4b-C7xIE-z7XFUGFzDP-V3uit1hmoJQBjnviamo0)

## 2. データサイエンスコンペへの参加（約700時間）
Kaggleは有名なプラットフォームですが、入賞のハードルは非常に高いです。
そのため、初心者にはNishikaやSignateといった国内コンペがおすすめです。

入賞できれば理想ですが、上位⚪︎％でも十分アピール材料になります。大切なのは「数値で語れる実績」を作ることです。

コンペ参加にはPythonや機械学習の知識が必要になるため、以下の教材で学びました：

- [東京大学のデータサイエンティスト育成講座 ~Pythonで手を動かして学ぶデ―タ分析](https://amzn.asia/d/85L7YY6)
    - Python x データサイエンスを理解するのに役立ち増田
- [Kaggleで勝つデータ分析の技術](https://amzn.asia/d/ixvQMhL)
    - 少し古いですが、実務でも役立つ手法が載っている良書です

私自身は、Nishikaのコンペで入賞し、その実績を武器に転職活動を行いました。

# 5. 転職後に苦労したこと
上記の目標を達成し、何とか未経験・文系出身から、データサイエンティストとしてのキャリアをスタートできました。

しかし、転職後も苦労は絶えませんでした。

特に苦労したのは数学力不足です（今もしています）。
また、同僚たちは本当に優秀で、知識の深さや論理的思考力に圧倒されることもあります。その度に、自分の不甲斐無さを感じています。

それでもこの道を選んだ以上、地道に積み上げていくしかないと思っています。
私のような凡人に大切なのは明日凄い人間になろうとしないとことです。20年後に追いついていれば万々歳です！

# 6. 今後やりたいこと
今後の目標として、以下のことに挑戦したいと考えています。

#### 個人事業主としての活動を開始
今年から、フリーランスとしての活動を始める予定です。お仕事のご依頼、お待ちしております。

#### 大学院での学び直し
30代中盤までに、AI・データサイエンス・最適化について大学院で体系的に学びたいと考えています。
キャリアアップのためでもありますが、単純に学ぶことが楽しそうだからという理由も大きいです。
そのために、現在は数学と英語の勉強に力を入れています。

#### 今までの経験
- データサイエンティスト・機械学習エンジニア(2022年4月~)
    - Python, R, SQL(BigQuery)を活用したデータ分析
        - sklearn, Pytorch, Polarsなど
    - ビジネス側と調整しながら仮説を立案、検証し施策を提案することが得意
        - データドリブンな組織文化を作ることに興味がある
    - PythonやGoによるAPI開発
    - Github, Dockerを用いたチーム開発経験
    - クラウドの使用経験(AWS,GCP,IaC)


#### 資格等
- 統計検定準1級、応用情報技術者、防災士
イエスかノーか？無料オンラインタロット占い

# イエスかノーか？無料オンラインタロット占い

こんにちは、Qiitaコミュニティの皆さん。今日は、シンプルながらも驚くほど効果的なオンラインタロットリーディングツール「YesNoTarot」をご紹介します。

## YesNoTarotとは？

[YesNoTarot](https://yesornotarot.net/)は、人生の重要な決断を前にしたときに、即座に「イエス」か「ノー」かの答えを提供する無料のオンラインタロット占いサービスです。

## 主な特徴

- **完全無料**: 登録不要で、すぐに使えます
- **シンプルな操作**: 質問を入力するだけで即座に結果が表示
- **AI技術と伝統的タロットの融合**: 古代の知恵と最新技術の組み合わせ
- **多様な質問対応**: 恋愛、キャリア、人生の決断など様々な質問に対応

## なぜYesNoTarotを使うべきか？

忙しい現代人にとって、シンプルで即座に答えが得られるツールは非常に価値があります。YesNoTarotは、伝統的なタロットの知恵とAI技術を組み合わせることで、あなたの質問に対して洞察力に富んだ回答を提供します。

恋愛の悩み、キャリアの選択、日常生活の小さな決断まで、あなたの疑問に対する答えを見つけるお手伝いをします。

## 使ってみよう

今すぐ[YesNoTarot](https://yesornotarot.net/)にアクセスして、あなたの質問に対する答えを見つけましょう。シンプルで直感的なインターフェースで、数秒で結果を得ることができます。
HTMXでSPAを構築する際に「戻るボタンが効かない」問題を解決する方法

最近、フロントエンドの複雑さを抑えつつ、手軽に部分更新ができるHTMXを使ってSPA（Single Page Application）を構築するケースが増えています。
私もある業務アプリケーションでHTMXを活用して、ページ全体のリロードを避けたUI構築を行いました。
しかし、そこでひとつ問題に直面しました。
### 問題：ブラウザの「戻る」ボタンで正しく遷移できない

HTMXでは、hx-get や hx-post によってHTMLの一部を更新することができますが、その際にURLは自動では更新されません。
そのため、ユーザーが操作中に「戻る」ボタンを押しても、意図したページや状態に戻れない、というUX上の問題が起こります。
これは、HTMXがデフォルトではブラウザ履歴に遷移を記録しないためです。

### 解決策：URLの履歴を正しく扱う2つの方法

#### 方法1：hx-push-url 属性を使って履歴にURLを追加する

hx-getなどで部分更新する際、hx-push-url属性を追加することで、履歴にURLを追加しつつページの一部だけを更新できます。

```
<a hx-get="/api/customer/{id}"
   hx-push-url="/customer/{id}"
   hx-target="#content">
   顧客詳細を見る
</a>
```

この例では、/api/customer/123 からデータを取得して #content に描画されますが、URLとしては /customer/123 に変化します。
これにより、ユーザーが「戻る」ボタンを押すと、正しく前の状態に戻ることができます。

#### 方法2：hx-boost を使ってリンクやフォームをHTMXで処理する

もしページ内のほとんどのリンクやフォームをHTMXで処理したい場合は、hx-boost を活用するのも有効です。
```
<body hx-boost="true">
  <a href="/customer/{id}">顧客詳細</a>
</body>
```
このように書くと、リンククリック時にページ全体をリロードせずに、HTMXが内部で処理してくれます。そしてURLもちゃんと更新されます。
つまり、通常のSPAのような挙動をHTMXだけで実現できるわけです。


### まとめ

HTMXでSPA的なページを作る際には、ブラウザ履歴の扱いに注意が必要です。
特に、「戻る」「進む」などのナビゲーションを正しく機能させるためには、hx-push-url や hx-boost の活用が不可欠です。
・個別対応には hx-push-url
・全体的な挙動変更には hx-boost

このように用途に応じて使い分けることで、HTMXによるシンプルかつ快適なSPA開発が可能になります。
RubyKaigi 2025参加してきました!

## RubyKaigi 2025参加レポート
2025年愛媛県松山市で開催された「RubyKaigi 2025」参加したのでそのレポートです

実際に私自身が見てきたセッションの概要やその感想についてまとめています。

https://rubykaigi.org/2025/



## Make Parsers Compatible Using Automata Learning
https://rubykaigi.org/2025/presentations/makenowjust.html#day1

**概要**
- 数学のオートマトン理論というのを用いてRubyのパーサーである parse.y と Prism の非互換性のバグの発見をしたという内容

**感想**
Rubyのパーサとしてparasy.yとPrismというのがあるというのを初めて知りました。
また、オートマトン理論という用語も初めて聞き正直話についていけませんでした。ただしっかり用語などはメモできたので知らない世界を知れることができました。

## Goodbye fat gem 2025
https://rubykaigi.org/2025/presentations/ktou.html

**概要**
- fat gemとはビルド済みバイナリーが入ったgemのこと
- fat gemはビルドが必要ないので、処理が早い
- ただ、fat gemを開発するにはクロスコンパイル環境など必要だったりリリース作業など開発者の負担が大きい
- fat gemやめませんか

**感想**
こちらも初めてfat gemというものを知りました。普段何気なくgemを使っていますが、それを開発している人たちがいるんだというのを改めて実感しました。

使う側のユーザーにとっては便利でも、それを作ったりメンテしている人たちに負担が偏っているという事実があるということを知れました。


## Ruby's Line Breaks
https://rubykaigi.org/2025/presentations/spikeolaf.html

**概要**
- Ruby における改行の扱いと例外、そしてその背景にある技術的な複雑さを紹介してより理解しやすい解決策の提案など

**感想**
Ruby における改行についてlexer stateという ある種闇みたいな存在に対していかに向き合っていくかという、内容自体は難しくついていけないところも多かったのですが、発表者の金子さんの語り口調など非常に興味を持って聞くことができました。

余談ですが、この発表を機に後日Rubyのパーサーについての調査などをしたり過去の金子さんのRuby会議での発表なども拝見して、多少Rubyのパーサーなどについて詳しくなることができました。

## Analyzing Ruby Code in IRB
https://rubykaigi.org/2025/presentations/tompng.html

**概要**
- irbの自動補完やシンタックスハイライト機能の実装について

**感想**
普段何気なく使っているIRBがどうやってコードを解析しているかであったりの裏側を知ることができました。
現在の IRB が Ripper::Lexer というのを使って構文を解析していること、そしてそれが持ついくつかの技術的な課題があることが具体的なコードをもとに説明されていたので非常にわかりやすかったです。

IRBって奥が深いなと思いました。

## TRICK 2025: Episode I
https://rubykaigi.org/2025/presentations/tric.html

**概要**
- こちらはRuby会議で不定期が開催される、もっとも奇妙なコードを書くというコンセプトの大会?です。

**感想**
百聞は一見にしかずと言いますか、私自身も特に事前情報がなく見たのですがRubyを用いてまさに奇妙なコードが次々と出てきてどうなっているだという疑問とともにすげーというかポカーンというかとにかくすごかったなという感想を持ちました。

過去開催されたものなどYouTubeに上がっているものがあるので見たことない方はぜひ見て欲しいなと思いました。

## Ruby Committers and the World
**概要**
- Rubyコミッターの方たちがさまざまなお題をもとに議論をするものです
 
**感想**
印象的だったのが「後方互換制を無視していいならどうしたい?」というお題にも関わらず、互換性の問題でそれできないよねみたいな話に毎回なっていていかに後方互換制を大切にして開発しているかを垣間見ることができました。


## 最後に

今回始めてRuby会議に参加して、知らないことばかりでセッションの内容について深く理解することができませんでした。ただ、Rubyの言語仕様というか内部について普段意識していない部分でも裏ではこんなことをやっているだなということを知ることができました。

知らないことを知る機会になったのが大きかったなと思います。

次回は北海道で開催予定なので、ぜひまた参加したいなと思いました。
☑️  エラー種類別解説

### ざっくり

```ruby:
 名前違ってる → NameError / UndefinedError
「文法・書き方ミス」 → Indent / Syntax / ArgumentError
「設定ファイル・必要ライブラリ入れられてない → Import / ModuleNotFoundError
```

```ruby:
NameError：
　print(msg) ← msg書いてない

 
UndefinedError（テンプレートエンジン系）：
　例：{{ user.name }} ← user渡す処理できてない

KeyErrorやIndexError
  リスト型に存在しない文字列メソッドを呼び出す
   対処法　：type() や dir()でしょっちゅう中身確認

■ ImportError / ModuleNotFoundError
　例：from math import square_root ← square_rootなんてない

 
TypeError	（int + str）	"3" + 4 
ValueError	　　　　　　　　　	int("abc") 

KeyError		d = {"a": 1}; d["b"]
AttributeError	存在しないメソッド呼び出し	"abc".push() → push()はstrに存在しない
ZeroDivisionError	　　　　　　　　　　	5 / 0
IndexError	リストの範囲外アクセス	arr = [1,2]; arr[5]
```

### No module named 'flask_dance.contrib.microsoft'

```php:
pip install Flask-Dance requests-oauthlib msal
```

## No such command 'db'.

```ruby:
flask-migrateがない

pip install Flask-Migrate

[init.pyにこれ追記]
from flask_migrate import Migrate  # ← 追加

# すでにある
db = SQLAlchemy(app)

# 追加：マイグレーション機能をセット
migrate = Migrate(app, db)

```
【Mac】M575でスクロールの向きを変更する方法


最近、メインマシンをWindowsからMacに乗り換えました。  
トラックボール派なので、愛用の「ERGO M575」をMacでもそのまま使っています。  

しかし、ホイールスクロールの方向がWindowsとは逆で違和感が…。  
調べても情報がすぐに見つからなかったので、解決方法をこの記事にまとめておきます。  


# 結論：Scroll Reverser を使う

ERGO M575のスクロール方向をMacで変更するには、以下の点に注意が必要です。

* Logi Options+（公式アプリ）では、「ERGO M575」のスクロール方向を変更できない

* Macの「システム設定」で変更可能だが、MacBook本体のトラックパッドにも影響してしまう

* Scroll Reverser（サードパーティアプリ）なら、マウスやトラックボールのみ個別に設定可能


# Scroll Reverser の使い方

## 1. アプリをインストール

以下の公式サイトから無料でダウンロードできます：  

https://pilotmoon.com/scrollreverser/


## 2. スクロール方向を個別に設定

Scroll Reverserを起動すると、次のようにマウス、トラックボールのみスクロール方向を逆に設定できます。  

![スクロール設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072354/204cb58c-27d0-492f-9368-4b7b58eef7e0.png)


## 3. 自動起動の設定

インストール直後はログイン時に自動起動しないため、下記画面で「ログイン時に起動」にチェックを入れておくのがオススメです。  


![ログイン時起動](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072354/e4ead4a2-6243-4f45-b975-cd27dec24b13.png)
【Alt + Tab を使いこなす】MRU方式による効率的なウィンドウ切り替え

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94360/426e3b95-98ad-4fa8-9257-15a88f731dd6.png)

## なぜ Alt + Tab は便利なのか？

`Alt + Tab` でウィンドウを切り替えられること自体は、多くのエンジニアが知っていると思います。でもタスクバーがあるし、特に便利と感じる人は少なそうです（筆者の感覚）。


本記事では、特に **「エディタとブラウザのように、2つのウィンドウを頻繁に行き来する作業」** において、Alt + Tab に慣れるとどれだけ便利なのかを重点的に紹介します。

## ベテランエンジニアの手元の動きを見よう

Alt + Tab に慣れているエンジニアの作業を見ていると、視線をほとんど動かさず、自然な手の動きでウィンドウを切り替えている様子に気づきます。マウスに手を伸ばすことなく、思考の流れを途切れさせずに画面を行き来する操作を見ていると、さすがプロだなと感じます。

ベテランエンジニアの操作を見ていると、Alt + Tab が単なるショートカットではなく、快適な作業リズムの一部として定着していることが実感できます。

## Alt + Tab の使い方

`Alt + Tab` の基本的な使い方はとてもシンプル。知ってるかとは思いますが、いちおう説明します。

1. **`Alt` を押しっぱなしにする**
2. **`Tab` を1回押すと、直前に使っていたウィンドウに切り替わる**
3. **`Alt` を押し続けながら `Tab` を複数回押すと、最近使ったウィンドウのリストを順番に移動できる**
4. **目的のウィンドウにフォーカスが合ったら `Alt` を離す**

`Alt` を押したまま `Tab` を1回押すと、ウィンドウ一覧が表示されます。この状態で `Tab` を繰り返し押すと、切り替えるウィンドウを順番に選べます。

上記は、説明されなくても理解ている人は多いと思います。でも便利な使い方としての勘どころが分からないのでは？

## 2つのウィンドウを行き来するのが最も効果的

当記事で伝えたいのは、ここです。たとえば、エディタでコードを書いていて、ブラウザで動作確認したいとき：

* `Alt` を押しながら `Tab` → ブラウザへ
* 再び `Alt + Tab` → エディタに戻る

というふうに、たった2回のキー操作で往復が完了します。

最もシンプルで、`Alt + Tab` の効果が最大限に発揮されるのは **2つのウィンドウを往復する使い方** です。

典型的なのは、エディタとブラウザを **交互に切り替える** 開発作業。直前のウィンドウに戻るだけなら `Alt + Tab` を1回押すだけで済みます。目視でウィンドウを探す必要も、マウスに手を伸ばす必要もなく、カーソルの位置や思考の流れをそのまま保った状態でスムーズに往復できます。

物理的なデュアルディスプレイがなくても、Alt + Tab を使いこなすことで、視点と作業対象をスムーズに切り替えられる **もう一つの画面** を手に入れたような操作感が得られます。

## 3つ以上のウィンドウを使うときは

3つ目のウィンドウを開きたいときは、`Alt + Tab` を「2回」押すことで目的の画面に切り替えられます。

* A（エディタ）→ B（ブラウザ）：`Alt + Tab` 1回
* B → C（仕様書）：`Alt + Tab` 2回
* C → A：`Alt + Tab` 1回

さらに、C（仕様書）から元の A（エディタ）と B（ブラウザ）の関係に戻りたい場合は、再び `Alt + Tab` を2回押せば元通りの切り替え順に戻ります。

こうした「押す回数」を感覚的につかんでいると、視線を動かさず、テンポよく作業を進めることができます。

なお、4つ以上のウィンドウがある場合は、`Alt + Tab` を押して一覧表示を出し、目視で選ぶほうが現実的です。

### Mac でのウィンドウ切り替え

Mac でも、同様の操作が可能です：

* アプリ単位の切り替え：`Command + Tab`
* 同じアプリ内のウィンドウ切り替え：`Command + \`（バッククォート）

これらを使えば、Windows と同じようにテンポよく作業を進めることができます。

## アプリやブラウザのタブでも同様に

`Alt + Tab` のような切り替え操作は、ウィンドウだけでなく、アプリケーション内でも活用できます。

* **Visual Studio Code** では `Ctrl + Tab` を使うことで、[最近使ったファイル間を高速に切り替える](https://qiita.com/yama-github/items/fe3d8667fb1bcce28b59)ことができます。
* **Firefox** などのブラウザでも `Ctrl + Tab` によるタブ切り替えが可能で、設定で「Ctrl+Tab で最近使用した順にタブを切り替える」に変更することで、`Alt + Tab` と似た感覚で操作できます。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94360/57e70a2e-9781-4f3d-b8a7-80259db9683b.png)
* **Chrome や Edge** のような Chromium 系ブラウザでは、拡張機能[「QuicKey」](https://chromewebstore.google.com/detail/quickey-%E2%80%93-the-quick-tab-s/ldlghkoiihaelfnggonhjnfiabmaficg)や[「Ctrl+Tab MRU」](https://chromewebstore.google.com/detail/ctrl+tab-mru/ialfjajikhdldpgcfglgndennidgkhik)を導入することで、同様にMRU 型のタブ切り替えが可能になります。


## MRU（Most Recently Used）という考え方

こうした「最近使った順で切り替える」動作は「MRU(Most Recently Used)」方式と呼ばれます。

この方式では、「最後に使ったウィンドウやタブが先頭に来る」ような並び替えが行われ、切り替え時のキー操作が最小限になるよう設計されています。人間の行動パターンとして「直前に使っていたものにすぐ戻りたい」という習慣にマッチしており、頻繁に行き来する作業に最適です。

Alt + Tab も Ctrl + Tab も、このMRUの思想に基づいており、慣れてくると操作のテンポや流れが自然に身についていきます。
Zabbix で OpenWeatherMap テンプレートが標準になったので試してみる

# はじめに
[OpenWeatherMap](https://openweathermap.org/) は世界中の天気情報を手軽に取得できるAPIである。
これを活用したテンプレートがZabbixに標準添付されており、簡単に利用できるようになっているのでまとめてみる。
(使用したZabbixのバージョン: 7.0.12)

cf. https://www.zabbix.com/jp/integrations/openweathermap
>This template is for Zabbix version: 7.2
Also available for: 7.0 6.4 6.2 6.0

# 使い方

## 前準備: APIトークンを取得する
OpenWeatherMapに登録していない方は、まず登録してAPIキーを取得しよう。
1. [公式サイト](https://openweathermap.org/)にアクセス
1. 右上の「Sign In」
1. 「Create an Account」
1. 登録したら再度、公式サイト右上の「Sign In」
1. 登録したメールアドレスとパスワードでログイン
1. 右上の自分のメールアドレスをクリック→「My API keys」
1. 「API key name」に適当に名前をつけて「Generate」


## 地点を表すホストを作成し、テンプレートを割り当てる
Zabbixの「データ収集」→「ホスト」→「ホストの作成」を開き、「ホスト名」「ホストグループ」を設定したあと、
テンプレートから「OpenWeatherMap by HTTP」を割り当てる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263317/abcd46ff-8a04-43a9-a2bc-25d7b257e11d.png)


## 必要なマクロを設定する
「マクロ」→「継承したマクロとホストマクロ」に移動し、
`{$LOCATION}` と `{$OPENWEATHERMAP.API.TOKEN}` の「変更」をクリックする。
また、必要に応じて `{$LANG}` `{$TEMP.CRIT.HIGH}` `{$TEMP.CRIT.LOW}` `{$UNITS}` の「変更」もクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263317/52500b30-988a-430f-a7c3-134ae7f6232d.png)

そして、それぞれのマクロを下記のように設定する。

<dl><dt>{$LOCATION}<dd>地点。 <緯度>,<経度> で指定するのがオススメ。ヘルプの通り、都市名・地点ID・郵便番号による指定はもうすぐ廃止されるとのこと。
<dt>{$OPENWEATHERMAP.API.TOKEN}<dd>取得したAPIトークン
<dt>{$LANG}<dd>言語。日本語は「ja」。こうしておくと取得した地名が日本語になる。(デフォルトen=英語)
<dt>{$TEMP.CRIT.HIGH}<dd>高温警報を出す閾値。日本だと35くらい？(デフォルト30)
<dt>{$TEMP.CRIT.LOW}<dd>低温警報を出す閾値。日本だと0くらい？(デフォルト-20)
<dt>{$UNITS}<dd>単位系。デフォルト metric で日本人になじみのある単位系なので変更する必要ないかも。
</dl>


## オマケ: インベントリの緯度と経度
「インベントリ」を「マニュアル」にして、「緯度」「経度」を設定しておくと、
地図上にその地点を表示することができる。


## 作成完了
「追加」をクリックしてホストの作成を完了する。


# 例
こんな感じで見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263317/870c1b9a-7313-4f88-a9bb-af448a8f28a1.png)

インベントリを設定しておくと、地図上でも表示できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263317/7a058cf7-a3b4-4f09-b190-65db3d38a620.png)


# 応用
デフォルトで設定されているトリガーは高温・低温警報だけなので、
お好みで降水量や風速のトリガーを作ったり、
あとは計算アイテムとして[不快指数](https://keisan.casio.jp/exec/system/1202883065)を作ったりしてもいいかも。
【3ヶ月で合格】AWS Certified Solutions Architect - Associateに合格するためのロードマップ

2025年4月に受けたAWS Certified Solutions Architect - Associateに合格したので勉強法等をここに残しておきます。

## 著者の前提知識
・高卒（機械工学科）
・Javaエンジニア3年目(AWS batch,StepFunction,Lambda等の使用経験あり)
・2022年秋にAWS Certified Cloud Practitionerに合格
・2023年春にAWS Certified Solutions Architect - Associate不合格(663点)

## 使用した参考書、サイト
個人的なおすすめはUdemyのハンズオンを実施後にひたすら過去問を解く。
書籍のインプットはお勧めしません。理由としてはAWSのサービスは追加されたり廃止されることが多く、常にAWS側が求めているベストプラクティスに変化があるため。

### ハンズオン用
* [【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/share/101WKk3@Z0lo1TIiT_N3Cxvo1EuBG81h_2T4oFUFpaob1N8qeQKV8TmfES1wxTfEM7P0uP97/)

一通り行うことによってAWSの主要サービスの知識が身に付きます。トータル50時間があり課金されるサービスも扱うためまとまった時間を使って行うことをお勧めします。

### 過去問対策用
* [Ping-t](https://mondai.ping-t.com)

無料で使える過去問サイトです。問題数も多く解説もしっかりしているため、過去問を解く際にはこちらをメインにすることをお勧めします。

* [【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/share/101rfM3@q9Ytb4yrDbJz4Aol5pXJIF9Q2JXsCV8WK0PlPXkIiKL85t5xvjB3umZsTONgPsDU/)

過去問6回分が入っており、他の人のレビューなどを見ている限り本番試験よりも難易度が高く設定されているそうです。
合格点をとるのがかなり難しいですが何回か回すことをお勧めします。

## 勉強方法
### 勉強時間
* 試験3か月前～前日
　平日1時間(約30問)
　休日2時間(約60問)

毎日やることは難しいので週単位で解く問題数のノルマを目指していくイメージ。
平日が忙しい場合には週末に平日こなせなかった分を実施するなどしてトータルで上記の勉強時間を達成できるようにする。

### 進め方
以下の二つを意識する
* Udemyのハンズオン講座を一通り終わらせる

AWS未経験であれば最初から最後まで実施を行い、経験者であれば使用したことがあるサービスは講座を聞くだけにしてもいい。

ハンズオンはまとまった時間をとって行ったほうが有料サービス使う際のお金も少額で済むのでなるべく土日に集中して行う。


* ひたすら過去問を解く

UdemyとPing-tの過去問を時間の限り解くようにする。Udemyの過去問は実際の試験よりも難易度が高いのでPing-t→Udemyの順番で行う。

そしてPing-tを7.5割以上でUdemyを6.5割以上とれるレベルまでもっていく。

また、正解した場合でも他の選択肢がなぜ誤っているのかを説明できるレベルまでもっていくと一層知識や合格率が上がるので意識することをお勧めします。

わからないサービスに関してはChatGPTにぶん投げて解答を求めてください。
以下自分のチャット履歴の一部
https://chatgpt.com/share/6819d56f-66b8-800a-ac7b-2d23933db8ea

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670485/bf912878-6ddb-48da-ae36-a9bb65835719.png)

## 試験の感想
感覚的には合格できているか怪しいラインでしたが、時間いっぱいまで問題を見直して何とか合格することができました。
次は2年後くらいを目標に上位資格の取得も目指していきたいです。
[Unity] UniTaskのインストールで詰まった話

# なにがおきた
既存記事の通りにパッケージマネージャからインストール、あるいは.unitypackageファイルのインポートを試し、さぁ使おうとして、
`The name 'UniTask' does not exist in the current context`と表示されたり、そもそも`Cysharp.Threading.Tasks`が読み込めなかったりしたことの解決方法のメモ

# 結論
Unityを再起動しよう。
詳しい原因は分からんが、多分パッケージの読み込みが正常に更新されてないのが原因。
Unityを再起動すれば全て読み込み直しになるので解消される。
新人エンジニアのためのインフラ入門（第8回〜第11回）を読んで学んだこと

## はじめに

今回は「セキュリティ」をテーマに、学びを整理します。  
また、今回で「インフラ入門」の連載を全て読み終えたため、全体を通した学びや気づきについてもまとめてみました。

---

## セキュリティ対策の全体像

まず、今回紹介されていた主なセキュリティ対策は以下の通り。

- アクセス制限と認証
- 通信の暗号化
- ログによる監視と改ざん検知
- ネットワークレベルの制御と攻撃対策
- マルウェア対策
- Webアプリケーション特化の対策（WAFなど）

---

## セキュリティ対策へのパラダイムシフト

「セキュリティ」と聞くと、「難しそう」「キリがなさそう」と感じていた。  
やろうと思えば対策は無限にあるし、完璧を目指すとコストも時間も膨れ上がる。

そこで、今回の学びで印象に残ったのは、次の2つの視点。

- セキュリティ対策をどこまでやるのか？
- いかに早く異常に気づき、対応するか？

つまり、「完璧に防ぐ」よりも「いかに早く気づいて、復旧できるか」という視点が、今の現場では重視されているということ。

そのためにインフラエンジニアが行うべきことは、

- ログを取得しておく
- システムの状態を日常的に監視しておく

といった運用面での準備。  
この姿勢が、被害を最小限にし、サービスの継続性を守る重要な鍵になるというのが今回の最大の気づき。

---

## 全体を通しての学び

約1週間ほどかけて、このインフラ入門の連載を少しずつ読んできました。  

全体を通して得られたのは、インフラは
「安定して動かすための仕組み」
というだけでなく、
「正常に動かないことを前提に、早く気づいて、早く戻せる体制を作ること」
が大切だということ。

それはセキュリティの文脈でも同じで、異常に気づくための仕組み（ログや監視）を整えることが大切だと学びました。

---

## おわりに

インフラの世界は、システムを支える土台であり、欠かせない世界。インフラエンジニアのおかげで、アプリケーションエンジニアも活躍できる。そんなふうに感じました。
【原因不明】WSLの一部ディストリビューションで規定のターミナルが開かない

# 環境
Windows 11 Pro 23H2
WSL Ubuntu 22.04
WSL バージョン: 2.4.13.0
カーネル バージョン: 5.15.167.4-1
VSCode version 1.86.2

# 症状

WSLでターミナルの初期ディレクトリを指定するには、こちらの記事

https://qiita.com/tom-zoo/items/75fd6c9bcd6fc8f2c998

で書かれているように`terminal.integrated.cwd`で以下のように設定する。

```
"terminal.integrated.cwd": "/home/username/aaa"
```

ワークスペースのルートディレクトリなら以下のようになるはず。

```
"terminal.integrated.cwd": "${workspaceFolder}"
```

が、Ubuntuディストリビューションで実施したところ、両者ともにユーザーのホームディレクトリ`~/`からのままになってしまった。

自分の環境でよく使うUbuntu-22.04ディストリビューションでは、そもそもデフォルトでワークスペースのルートディレクトリがターミナルの規定になっていたので意識していなかった。

色々調べたけど問題解決はしなかったが、同じところでまた躓きそうなのでメモ。
🚀 Macにyqをインストール

`yq` は、YAMLファイルをコマンドライン上で読み書き・変換できるツールです。

JSONの操作に `jq` を使うのと同じように、`yq` を使えば YAML ファイルの内容を簡単に抽出・更新・変換できます。

# 公式ドキュメント

詳しい使い方や機能については、[公式GitHubリポジトリ](https://github.com/mikefarah/yq)をご覧ください

# インストール方法

Macでは、以下のようにHomebrewで簡単にインストールできます。

```bash
brew install yq
```

インストール確認

```bash
yq --version
```

バージョンが表示されればインストール成功です

# 基本的な使い方

例えば `inventory.yml` というyamlファイルがあったとします。

```yaml
all:
  children:
    platform:
      hosts:
        platform-proxy:
        platform-store:

    services:
      children:

        egg_yolk_ruxt_01:
          children:
            production:
              hosts:
                egg-yolk-ruxt-01-production-web-1:
                egg-yolk-ruxt-01-production-web-2:
                egg-yolk-ruxt-01-production-batch-1:

            test:
              hosts:
                egg-yolk-ruxt-01-test-web-1:
                egg-yolk-ruxt-01-test-web-2:
                egg-yolk-ruxt-01-test-batch-1:
```

### `.all` を指定して中身を確認

```bash
yq '.all' inventory.yml
```

出力例：

```yaml
children:
  platform:
    hosts:
      platform-proxy:
      platform-store:
  services:
    children:
      egg_yolk_ruxt_01:
        children:
          production:
            hosts:
              egg-yolk-ruxt-01-production-web-1:
              egg-yolk-ruxt-01-production-web-2:
              egg-yolk-ruxt-01-production-batch-1:
          test:
            hosts:
              egg-yolk-ruxt-01-test-web-1:
              egg-yolk-ruxt-01-test-web-2:
              egg-yolk-ruxt-01-test-batch-1:
```

### `.all.children` を見る

```bash
yq '.all.children' inventory.yml
```

出力例：

```yaml
platform:
  hosts:
    platform-proxy:
    platform-store:
services:
  children:
    egg_yolk_ruxt_01:
      children:
        production:
          hosts:
            egg-yolk-ruxt-01-production-web-1:
            egg-yolk-ruxt-01-production-web-2:
            egg-yolk-ruxt-01-production-batch-1:
        test:
          hosts:
            egg-yolk-ruxt-01-test-web-1:
            egg-yolk-ruxt-01-test-web-2:
            egg-yolk-ruxt-01-test-batch-1:
```

### `.all.children.platform` を見る

```bash
yq '.all.children.platform' inventory.yml
```

出力例：

```yaml
hosts:
  platform-proxy:
  platform-store:
```

### `.all.children.platform.hosts` を見る

```bash
yq '.all.children.platform.hosts' inventory.yml
```

出力例：

```yaml
platform-proxy:
platform-store:
```

# まとめ

手動でYAMLを編集する手間を省き、構成管理の自動化に役立ててください！
ClouderaとNiFi 2.0：データ収集と処理を推進

原文： Cloudera and NiFi: Driving Data Ingestion and Processing Excellence

https://www.cloudera.com/blog/business/cloudera-and-nifi-driving-data-ingestion-and-processing-excellence.html


# Cloudera Flow Management 4（Apache NiFi 2.0搭載）によるデータ駆動型組織の強化


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133516/c917916e-0ecb-4817-b6fd-282e224714e9.png)


Apache NiFiは長年にわたり、データエンジニアリングの基盤として、データの収集、変換、配布のための強力で柔軟なフレームワークを提供してきました。NiFiの主要な貢献者であるClouderaは、その進化と普及を牽引してきた存在です。

今回、NiFi 2.0をベースとする初のリリースとしてCloudera Flow Management 4.0(CFM 4.0)がテクニカルプレビュー(Technical Preview)で公開されました。この新バージョンの強化された機能をご紹介します。




# NiFi 2.0 と Cloudera Flow Management 4.0 の価値

Cloudera Flow Management 4.0（Apache NiFi 2.0 搭載） では、主に以下の機能強化が行われています。
* パフォーマンス向上
NiFi 2.0 では処理性能が大幅に向上し、より効率的なデータフローと大規模ワークロードへのスケーリングが可能になりました。これにより、複雑で大容量のデータセットも安心して取り込み・処理・配布できます。
* 開発の効率化
新しいフローキャンバス UI とドラッグ＆ドロップ操作の改善により、フロー開発が直感的かつ高速化。開発時間を大幅に短縮し、コスト削減に貢献します。
* セキュリティの強化
改良された暗号化・認証機構により、機密データを扱う際の安全性と信頼性が向上しました。
* 統合範囲の拡大
NiFi 2.0 は多様なデータソースやシステムとの連携をさらに拡充。Cloudera Flow Management 4.0 では、Apache NiFi 2.0 で削除された Hive や Accumulo などのコンポーネントを引き続き提供するほか、RDB や Iceberg 向けの CDC（Change Data Capture）機能も追加し、Cloudera 製品群および外部システムを組み合わせたエンドツーエンドのシステム設計を支援します。
* Python ネイティブのプロセッサ開発
NiFi 2.0 には Python SDK が提供され、Python でプロセッサを迅速に開発ができるようになりました。
Cloudera Flow Management 4.0 では更に、データの埋め込み生成、ベクターデータベースへの取り込み、各種 GenAI システムとの連携、Amazon Bedrock 経由の大規模言語モデル（LLM）操作のためのコンポーネントが追加され、GenAI をビジネスに生かすコンポーネントも追加されています。
* フロー設計のベストプラクティス支援
NiFi 2.0では、フロー設計のベストプラクティスを推奨・適用するためのルールエンジンが搭載されています。Cloudera Flow Management 4.0では、スレッド管理や推奨コンポーネントなどの側面に対応したフロー分析ルールを提供し、管理者が安定なフローを設計できるよう支援します。



# Cloudera と NiFi － 継続的なサポート、イノベーション、そしてアップグレードの簡素化

ClouderaはNiFiの開発を牽引し、オープンソースコミュニティへの貢献や専門的サポートを通じてユーザーを支援してきました。NiFiへの投資を通じて、変化の激しいデータ環境においてその進化と重要性を維持しています。

ClouderaのNiFiへの取り組みは、Apache NiFiコミュニティへの参加、メーリングリストやフォーラム、イベントを通じた知識やベストプラクティスの共有に表れています。
さらに、Cloudera Flow Management Operatorを提供し、Kubernetes上でNiFiクラスターやNiFi Registryインスタンスをデプロイ・管理できるようにしています。コンテナ化されたインフラを活用し、複雑なデータフローのオーケストレーションを効率化します。

Clouderaは、NiFi 1のコンポーネントからNiFi 2のコンポーネントへのアップグレードを簡素化する移行ツールを提供しています。加えて、NiFiの可能性を最大限に活用するための包括的なトレーニングやコンサルティングサービスも提供しています。


# データフロー管理の未来を切り拓く

Cloudera Flow Management 4.0（Apache NiFi 2.0 搭載）により、Cloudera はデータフローマ管理におけるリーダーシップを強化します。
今後もNiFiへの継続的な開発・改良に投資し、データエンジニアやデータサイエンティストにとって信頼性の高いツールであり続けることを約束します。
また、クラウドベースのCloudera Flow Managementデプロイを提供し、運用効率を最適化しながらエンタープライズ規模へのスケーリングを可能にしています。
AI ソリューションを強化・統合する機能は、Cloudera Flow Managementの焦点です。

Clouderaは引き続き、顧客がビジネスクリティカルなデータイニシアチブを推進するためにNiFiの力を最大限活用できるよう、サポートとガイダンスを提供します。


# さらに詳しく知りたい方へ

Cloudera Flow Management の新機能がどのようにデータパイプラインを変革するかについては、以下をご覧ください。
	•	[Data Distribution Architecture to Drive Innovation](https://www.cloudera.com/content/dam/www/marketing/resources/ebooks/data-distribution-architecture-to-drive-innovation.pdf.landing.html)
	•	[Scaling NiFi for the Enterprise with Cloudera](https://www.cloudera.com/content/dam/www/marketing/resources/ebooks/scaling-nifi-for-the-enterprise-with-cloudera-dataflow.pdf?daqp=true)
ランダムポケモンジェネレーター：あなただけのポケモンチームを瞬時に生成！

皆さん、こんにちは！今回紹介するのは、ウェブサイト Random Pokemon Generator です。このサイトは、あなたの好みに合わせたポケモンチームを簡単に生成できる素晴らしいツールです。

https://www.randompokemon.games/ja

主な機能

ポケモンの数: 生成するポケモンの数を指定できます。
タイプ: 特定のタイプのポケモンのみを生成するように設定できます。
世代: ポケモンを特定の世代に限定できます。
レア度: ポケモンの最低レア度を指定できます。
このジェネレーターの魅力

このジェネレーターの最大の魅力は、その柔軟性です。例えば、「炎タイプのポケモンだけを3匹生成してほしい」とか、「第1世代のポケモンで、レア度が最低でもレアなポケモンを6匹生成してほしい」といった要望にも簡単に対応できます。

どんな時に便利？

新しいゲームを始める時: どんなポケモンを仲間にしようか迷っている時に、インスピレーションを与えてくれます。
チーム構成の練習: 色々なタイプのポケモンを組み合わせて、最強のチームを目指す練習に役立ちます。
ただ単に楽しみたい時: どんなポケモンが出てくるか、ワクワクしながら楽しめます。
まとめ

Random Pokemon Generator は、ポケモンファンなら誰でも楽しめるツールです。ぜひ一度試してみてください！
画面共有におけるリモート制御の解除

## 画面共有タイプ

macOSの画面共有で、共有先のPCの画面が真っ暗で、その状態でキーボードを触ると、スピーカーから

```
このコンピュータはリモート制御されています。
接続を停止するには、ESCキーを押します。
```

というアナウンスが流れる。

画面共有タイプを `高パフォーマンス` にしていると、そうなる。

リモート接続している状態でも画面を表示している状態にしたい場合は、
画面共有タイプを `標準` に設定しよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/9a15fe58-f021-4399-b997-5732cf9d3c99.png)
ChatGPTの役割設定から面白い使い方まで完全解説！

今やAIは、私たちの暮らしや仕事にすっかり溶け込んでいます。特にChatGPTは、文章作成、質問応答、翻訳、アイデア出しなど、多岐にわたる用途で利用され、多くの人々に親しまれています。

ですが、「使ってみたけれど、なんだか物足りない」「もっと面白く活用したいけど方法がわからない」と感じたことはありませんか？ただ質問を投げかけるだけでは、ChatGPTの本当の魅力を引き出せないのです。

実は、ChatGPTに役割（ロール）を与えることで、その可能性は一気に広がります。編集者、翻訳者、コーチ、占い師、ゲームマスター……役割を設定するだけで、まるで別人のように多才に振る舞ってくれるのです。

本記事では、ChatGPTの役割設定の方法や具体的なプロンプト例、仕事・日常・遊びでの活用法、さらには便利さの裏に潜む注意点まで、網羅的にご紹介します。

読み終わる頃には、あなたはChatGPTを今まで以上に自由自在に使いこなせるようになり、仕事の生産性を上げたり、日常生活をもっと楽しく彩ったりできるようになるはずです。

これまで知らなかった新しい使い方にきっと出会えるでしょう。

無料版の生成AIを使用したい方は、下記のサイトを参考にしてください。

# 1. はじめに
ChatGPTは、AIの進化によって私たちの生活や仕事に溶け込んできた存在です。ですが「ただ話すだけ」ではもったいない！
その力を最大化するには 「役割設定」 をすることが重要です。本記事では、役割設定の方法から、仕事・日常・遊び・注意点まで詳しく解説します。

# 2. ChatGPT 役割 一覧
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4028918/1992248f-79cd-4866-9023-bed0a2276c16.png)

ChatGPTに与えられる役割の例は以下の通りです。

役割具体例編集者文章の誤字脱字チェック、SEO最適化提案翻訳者英語⇔日本語の翻訳、口語・ビジネス用語の調整コーチプレゼン練習、英会話練習、面接練習占い師タロット占い、星座占い、運勢診断（エンタメ目的）

ポイント
役割を決めると、回答がぐっと的確になります。試すだけでも価値があります。

# 3. ChatGPT 役割を与える 例
プロンプト（指示文）の具体例を紹介します。

編集者として
「あなたはプロの編集者です。このブログ記事を読みやすく添削してください。」

翻訳者として
「あなたは日英翻訳者です。以下の文章を自然な英語にしてください。」

コーチとして
「あなたは面接コーチです。私の回答を聞いて、改善点をフィードバックしてください。」

占い師として
「あなたは星座占いの占い師です。私の星座（射手座）の今週の運勢を教えてください。」

コツ
「あなたは〇〇です」と役割を最初に明確に書くことで精度が上がります。

# 4. ChatGPT 面白い使い方（仕事編）
✔ 文章作成の補助
・ブログ記事の下書き作成
・キャッチコピー案の提案
・メールの文面チェック

✔ プレゼン資料の改善
・スライドの要約
・説得力のある表現の提案
・Q&Aの想定問答作成

✔ ブレインストーミング
・新サービスのアイデア出し
・マーケティング戦略の壁打ち
・社内イベントの企画提案

# 5. ChatGPT 役割 プロンプト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4028918/1239fdcc-3ba9-4a2e-88a5-ef0c54c9fd8a.png)

✨ プロンプトの書き方の基礎
役割を決める

具体的な指示を出す

出力形式を指定する（例：箇条書き、表）

✅ 成功例
「あなたはWebライターです。以下のテーマでSEOを意識したタイトルを5つ考えてください。」

❌ 失敗例
「なんか良いタイトル考えて。」

プロンプトがあいまいだとAIもうまく答えられません。

無料版で使用したい方、ぜひ参考してください。


https://ai.tencho-ex.com/


# 6. ChatGPT 面白い使い方（日常編）
🌟 ゲームの相手になる
・しりとり
・なぞなぞ
・しおり作り競争

🌟 創作の相棒
・詩や短編小説の共作
・オリジナルソングの作詞
・漫画のキャラクター設定

🌟 料理提案
・冷蔵庫の食材リストから献立を考える
・10分以内のレシピ提案
・栄養バランスのアドバイス

# 7. ChatGPT 面白い遊び方
🎲 即興しりとり
制限時間30秒でしりとり勝負。難易度を設定することも可能。

🎭 ロールプレイチャット
医者、先生、探偵など役割を指定し、なりきり会話。

🕵 クイズや謎解き
自作の謎を解かせる／AIから出題してもらう。

# 8. ChatGPT 便利な使い方（⽇常編）
📅 スケジュール管理
・一日の予定をリスト化
・タスクの優先順位付け
・リマインダー内容の整理

📧 メール・メッセージ文作成
・お礼メールの下書き
・謝罪メールの文章例
・LINEの返信文を提案

🌍 語学学習
・フレーズ練習
・発音のコツの解説
・外国語での質問練習

# 9. ChatGPT やばい使い方（注意喚起）
⚠ 依存しすぎるリスク
→自分の頭で考える力が落ちる。

⚠ 偏った情報の信じすぎ
→AIの出力は100%正しいとは限らない。

⚠ セキュリティ・プライバシー問題
→個人情報、パスワード、機密情報を入力しない。

ポイント
AIは便利な道具ですが「最後の判断は人間」という意識を忘れないことが大事です。

# 10. まとめ
ChatGPTは役割を設定することで、仕事、日常、遊びのあらゆる場面で活躍するパートナーになります。しかし、使い方を誤ると依存や情報トラブルの原因になることも。
「賢く、楽しく、でも慎重に」。これがAI時代を生き抜くコツです。

# 「今無料」おすすめのAIツール
✅ 生成ツール ✨
文章やコンテンツの自動生成を行うツール。

🎨 AI画像生成 🖼️
テキストからオリジナル画像を作り出すAIツール。

🔄 画像変換ツール 📸
画像の形式変換や、イラスト→写真風、写真→イラスト化などを行うツール。

🎤 AI音声ツール 🎧
テキスト読み上げ、音声合成、声の変換などを行うツール。

🛠️ 画像編集 ✂️
画像のリサイズ、トリミング、色調補正、背景除去などを簡単に行うツール。

📝 ブログの生成 ✍️
記事構成、見出し作成、本文執筆までを一気に支援するツール。

https://ai.tencho-ex.com/
アプリ開発100本ノック　Day 3: 図形迷路ジェネレーター

**目的:** 選んだ図形の形で迷路を自動生成するアプリを作る！

**開発ストーリー:**

今日は、ちょっと変わった迷路アプリに挑戦！💪  四角い迷路はよく見るけど、円形とか星型とかの迷路ってあんまり見ないよね？🤔 ということで、図形の形に合わせて迷路を生成するアプリを作ってみることに！✨  迷路のアルゴリズムには、王道の「穴掘り法」を採用！⛏️  図形の形に沿って迷路をトリミングするっていう手法で実装してみました！

**コードはこちら！ (Python):**

```
from flask import Flask, render_template, request, jsonify
import random
import math

app = Flask(__name__, template_folder='rabi', static_folder='static')

@app.route("/", methods=["GET"])
def index():
    return render_template("index.html")

@app.route("/generate_maze", methods=["POST"])
def generate_maze():
    shape = request.form.get('shape')
    width = 21  # 迷路の幅 (奇数)
    height = 21  # 迷路の高さ (奇数)

    maze = [['#'] * width for _ in range(height)]

    def is_valid(x, y):
        return 0 <= x < width and 0 <= y < height

    def dig(x, y):
        maze[y][x] = ' '
        directions = [(0, 2), (2, 0), (0, -2), (-2, 0)]
        random.shuffle(directions)
        for dx, dy in directions:
            nx, ny = x + dx, y + dy
            if is_valid(nx, ny) and maze[ny][nx] == '#':
                maze[ny][x + dx // 2] = ' '
                dig(nx, ny)

    start_x, start_y = 1, 1
    dig(start_x, start_y)

    # ランダムに出口を作成 (円形にトリミング後、有効な出口に変更が必要な場合があります)
    exit_side = random.choice([0, 1, 2, 3])
    # ... (出口生成ロジックは同じ)


    # 円形にトリミング
    center_x = width // 2
    center_y = height // 2
    radius = width // 2

    trimmed_maze = []
    for y in range(height):
        row = []
        for x in range(width):
            distance = math.sqrt((x - center_x)**2 + (y - center_y)**2)
            if distance <= radius:
                row.append(maze[y][x])
            else:
                 row.append('') # 円の外側は空白にする
        trimmed_maze.append(row)


    return jsonify(maze=trimmed_maze, shape=shape) # trimmed_maze を返す

if __name__ == "__main__":
    app.run(debug=True, port=5003)
```
工夫ポイント:
穴掘り法で迷路生成！
図形の形に沿ってトリミング！

今日の壁…:
迷路は生成できるんだけど、図形の形にトリミングするのがうまくいかなくて…😭 円形の迷路を作りたかったのに、なんか変な形になっちゃった… 一旦断念…

未来への野望！:
円形以外の図形にも対応したい！ (星型とかハート型とか！💖)
迷路の難易度を調整できるようにしたい！ (簡単モード、鬼畜モード😈)
3D迷路とか作ってみたい！🤩
駆け出しエンジニア向け GitHub Flow 入門

## GitHub Flowってなに？

GitHub Flow（ギットハブ・フロー）は、  
**「安全に・素早く・みんなで」** プログラムを作るための、  
とてもシンプルなルール（開発の流れ）です。

## どんなときに使うの？

- 1人でも、チームでも使える
- Webアプリやサービスを「こまめに更新」したいときにピッタリ
- 失敗してもすぐ直せる、安心な仕組み

## 基本の流れ（6ステップ）

1. **mainブランチを最新にしておく**  
   → main（メイン）ブランチは「本番に出しても大丈夫な状態」にしておく

2. **新しいブランチを作る**  
   → 何か新しい機能や修正をしたいときは、mainから分けて「自分専用の作業場所（ブランチ）」を作る  
   例：`git checkout -b feature/hello-world`

3. **自分のブランチで作業する**  
   → コードを書いたり、直したりする

4. **GitHubにプッシュする**  
   → 作業が終わったら、GitHubにアップロードする  
   例：`git push origin feature/hello-world`

5. **Pull Request（プルリクエスト）を作る**  
   → 「mainに自分の変更を入れてもいいですか？」とチームにお願いする  
   - ここで他の人がレビュー（チェック）してくれる
   - 自動でテストも動く

6. **レビューOKならmainにマージ！**  
   → 問題なければmainに取り込む（マージ）  
   - すぐに本番に反映されることも多い

## イメージ図

```
main
 └─ feature/hello-world（自分の作業ブランチ）
         ↓
      Pull Request
         ↓
      レビュー・テスト
         ↓
      mainにマージ
```

## よく使うコマンド

| コマンド | 何をする？ | 例 |
|:---|:---|:---|
| `git clone <URL>` | プロジェクトをコピー | `git clone https://github.com/xxx/yyy.git` |
| `git checkout -b ブランチ名` | 新しいブランチを作る | `git checkout -b feature/hello-world` |
| `git add .` | 変更をまとめる |  |
| `git commit -m "メッセージ"` | 変更を記録 | `git commit -m "add hello world"` |
| `git push origin ブランチ名` | GitHubにアップロード | `git push origin feature/hello-world` |

## どうして安全なの？

- mainは「いつでも本番OK」な状態を守る
- みんなが自分のブランチで作業するから、他の人の作業とぶつかりにくい
- Pull Requestで「レビュー」や「自動テスト」ができるから、ミスに気づきやすい

## まとめ

- GitHub Flowは「小さく作って、みんなでチェックして、すぐ本番に出す」ための流れ
- 失敗してもmainは安全だから、安心してチャレンジできる
- チーム開発でも、1人開発でも、とても役立つ仕組み

## 参考リンク

- [GitHub Flow公式（日本語）](https://docs.github.com/ja/get-started/quickstart/github-flow)
- [Progate：GitHub Flow入門](https://prog-8.com/docs/github-flow)
Go言語 スライスのSort & Unique

Go言語の配列? である「スライス」は、追加(Append関数)で容易にできるます。でも「並び替え」や「一部の削除」が、ちょっと面倒な操作が必要です。
# 並び替え(Sort)
```go:SortStr
func SortStr(list []string) []string {
	var result []string
	var ix []int

	if len(list) == 0 {
		return result
	}

	ix = make([]int, len(list))
	for i := range list {
		ix[i] = i
	}

	for i := 0; i < len(list)-1; i++ {
		ii := ix[i]

		for j := i + 1; j < len(list); j++ {
			jj := ix[j]

			// sort
			if list[ii] > list[jj] {
				xx := ii
				ii = jj
				jj = xx

				ix[i] = ii
				ix[j] = jj
			}
		}
	}

	for i := range list {
		ii := ix[i]
		result = append(result, list[ii])
	}

	return result
}
```
# SortStr関数の解説
並び替えは、一番 初歩的な「バブルソート」を使っています。
```go:バブルソート
  for i := 0; i < len(list)-1; i++ {
    for j := i + 1; j < len(list); j++ {
       ...
    }
  }
```
バブルソートは、並び替えの際、頻繁に配列の中身を入れ替えるため、文字列の入れ替えは、かなりCPUやMemoryに負担をかけます。
そこで、配列の位置で索引を作り、索引を並び替えして、最後に索引順で、配列(スライス)を再構築して戻します。

この索引を使う方法は、データベースでは、一般的な方法です。この索引を応用すると、次の RemoveStr関数(Append関数の逆)も作れます。
```go:RemoveStr
func RemoveStr(list []string, item ...string) []string {
	var result []string
	var ix []int

	if len(list) == 0 {
		return result
	}

	ix = make([]int, len(list))
	for i := range list {
		ix[i] = i
	}

	for i := range list {
		for j := range item {

			// remove
			if list[i] == item[j] {
				ix[i] = -1
			}
		}
	}

	for i := range list {
		ii := ix[i]
		if ii >= 0 {
			result = append(result, list[ii])
		}
	}

	return result
}
```
# RemoveStr関数の解説
この引数2: itemの文字列と同じ値は、索引上で、-1に設定して、理論上 消して、配列(スライス)の再構築時に除外します。
# RemoveStr関数の使い方
引数1: 元データの配列(スライス)
引数2: 削除したい、文字列のリスト(Go言語の可変引数 引数の一番末尾に固定される)
```go
  list := []string{"Q","W","E","R","T","Y"}
  list = RemoveStr(list, "E","T")
  for i := range list {
    fmt.Printf("%v, ",list[i])
  }
  fmt.Println()
```
出力結果は、Q, W, R, Y, となる。
# UniqueStr関数
RemoveStr関数のロジックを応用して、重複した文字列を削除します。
```go:UniqueStr
func UniqStr(list []string, sort bool) []string {
	var result []string
	var ix []int

	if len(list) == 0 {
		return result
	}

	ix = make([]int, len(list))
	for i := range list {
		ix[i] = i
	}

	for i := 0; i < len(list)-1; i++ {
		ii := ix[i]
		if ii < 0 {
			continue
		}

		for j := i + 1; j < len(list); j++ {
			jj := ix[j]
			if jj < 0 {
				continue
			}

			// sort
			if sort {
				if list[ii] > list[jj] {
					xx := ii
					ii = jj
					jj = xx

					ix[i] = ii
					ix[j] = jj
				}
			}

			// remove
			if list[ii] == list[jj] {
				ix[j] = -1
			}
		}
	}

	for i := range list {
		ii := ix[i]
		if ii >= 0 {
			result = append(result, list[ii])
		}
	}

	return result
}
```
# UniqueStr関数の使い方
ついでに並び替え (引数2: sort=true)
```go
  list := []string{"Q","E","W","E","E","R","E","T","E","Y","E"}
  list = UniqueStr(list, true)
  for i := range list {
    fmt.Printf("%v, ",list[i])
  }
  fmt.Println()
```
出力結果は、E, Q, R, T, W, Y, となる。
# まとめ
今回の関数は、文字列スライス( []string )にしているが、他の整数型(int,int8 ... int64)や浮動小数点型(float32/64)などに書き換え可能である。
バブルソートは、少ない件数の場合は、他の並び替え方法よりも高速に動作する。
数千件以上になるならば、バブルソート以外にする事をお勧めする。
GitHub Flow 現場実践ガイド（フルサイクル開発者視点）

## 概要

GitHub Flowは、GitHubが提唱するシンプルかつ柔軟なブランチ運用フローです。  
「本番環境への継続的デリバリー」を前提とし、**小さな単位での開発・レビュー・デプロイ**を高速に回すことを重視します。

## 1. GitHub Flowの特徴

- **main（またはmaster）ブランチは常にデプロイ可能な状態を維持**
- **新機能や修正は必ずブランチを切って作業**
- **Pull Request（PR）を通じてレビュー・CIを実施**
- **レビュー・テスト通過後、mainへマージし即デプロイ**
- **シンプルで反復的なワークフロー**

### 他フローとの違い

- Git Flowのような複雑なリリース/ホットフィックス/開発ブランチは原則不要
- 小規模〜中規模、継続的デリバリー志向の現場に最適

## 2. フルサイクル開発者の現場での使い方・メリット・注意点

### フルサイクル開発者の視点

- 要件定義〜設計・実装・テスト・デプロイ・運用まで一貫して担当
- GitHub Flowは **「小さく作ってすぐ届ける」** を実現しやすい
- **CI/CDパイプラインとの親和性が高い**（GitHub Actions等）

### メリット

- **開発サイクルが短く、リリース頻度を高めやすい**
- **障害発生時もmainを基点に素早く修正・デプロイ可能**
- **レビュー・CIを通じて品質担保しやすい**
- **運用・保守もシンプル**

### 注意点・現場Tips

- **mainの品質担保が最重要**（CI必須、レビュー徹底）
- **大規模開発やリリースタイミング調整が必要な場合は工夫が必要**
  - フラグ管理や一時的なfeature freeze等
- **PR粒度は小さく・こまめに**（レビューしやすく、バグ混入リスク低減）
- **WIP（作業中）PRも活用し、早めに共有・相談**
- **IssueとPRを紐付けて管理（#番号で自動連携）**

## 3. 実践フロー（ブランチ戦略、PR、レビュー、デプロイ等）

### 基本フロー

1. **mainブランチを最新に保つ**
2. **新機能・修正ごとにブランチを作成**  
   `git checkout -b feature/xxx`  
   ブランチ名は `feature/xxx`, `fix/xxx` など分かりやすく
3. **ローカルで作業・コミット・プッシュ**  
   `git add . && git commit -m "feat: ..."`  
   `git push origin feature/xxx`
4. **GitHubでPull Request作成**  
   - PRテンプレート活用
   - Issueと紐付け（`Closes #番号`）
5. **レビュー・CI実行**  
   - レビュワーアサイン
   - CI（テスト・Lint等）自動実行
6. **レビューOK・CI通過後、mainへマージ**  
   - squash merge推奨（コミット履歴を綺麗に）
7. **mainへマージ後、自動デプロイ（CI/CD）**  
   - GitHub ActionsやVercel等と連携

### ブランチ命名例

- `feature/ユーザー認証`
- `fix/バグ修正`
- `chore/依存パッケージ更新`

### PR運用Tips

- **PRテンプレートで目的・背景・変更内容・影響範囲を明記**
- **レビュワー・Assigneeを必ず設定**
- **Draft PRで早期共有も有効**
- **自動ラベル付与（GitHub Actionsやbot活用）**

## 4. よく使うGit/GitHubコマンド一覧

| コマンド例 | 用途 | 補足・例 |
|:---|:---|:---|
| `git clone <repo>` | リポジトリ複製 | `git clone https://github.com/xxx/yyy.git` |
| `git pull origin main` | mainの最新取得 | mainを常に最新に |
| `git checkout -b feature/xxx` | 新規ブランチ作成 | `git checkout -b feature/login` |
| `git add .` | 変更ファイル追加 |  |
| `git commit -m "feat: ..."` | コミット | Conventional Commits推奨 |
| `git push origin feature/xxx` | ブランチをリモートへ |  |
| `git fetch` | リモート情報取得 |  |
| `git rebase origin/main` | mainの変更を取り込む | 衝突時は手動解決 |
| `git merge feature/xxx` | ブランチ統合 | 通常はPR経由でmainへ |
| `git branch -d feature/xxx` | ブランチ削除 | マージ後の掃除 |
| `gh pr create` | PR作成（GitHub CLI） | `gh pr create --fill` |
| `gh pr checkout <番号>` | PRブランチへ切替 | レビュー時に便利 |
| `gh pr merge <番号>` | PRをマージ | CLIからも可能 |
| `git log --oneline --graph` | 履歴確認 | 視覚的に分かりやすい |
| `git status` | 作業状況確認 |  |
| `git stash` | 一時退避 | 作業中断時に便利 |

## 5. まとめ・Tips・参考リンク

### まとめ

- GitHub Flowは**シンプルかつ高速な開発サイクル**を実現する運用フロー
- フルサイクル開発者にとって、**要件定義から運用まで一貫した品質担保・迅速なリリース**が可能
- **mainの品質担保・CI/CDの自動化・PR運用の徹底**が成功の鍵

### Tips

- **PR粒度は小さく・こまめに**
- **mainは常にデプロイ可能な状態を維持**
- **CI/CD・レビュー自動化で属人化を防ぐ**
- **Issue・PR・コミットメッセージの一貫性を意識**

### 参考リンク

- [GitHub Flow公式](https://docs.github.com/ja/get-started/quickstart/github-flow)
- [GitHub CLI](https://cli.github.com/)
- [Conventional Commits](https://www.conventionalcommits.org/ja/v1.0.0/)
AI駆動開発のその先。人間の時間感覚と新しいリズムの話

## 爆速AI時代の指揮者として生きる：人間の時間感覚と新しいリズムの話

このゴールデンウィークは、ほとんど人間が介在しない形による新しいAI駆動開発を進めていました。実はこの記事を書いている今でも私の隣ではAIが自動的に動いています。私はこれをAI Code Gardening（ガーデニング）と呼んでいます。種から育てて大きくしていくという願いを込めた言葉です。

**AI Code Gardening -Seed to Scale-は、AIを生命体のように見立てて共創するという考え方が特徴**です。そして**AI Greenhouse**と呼ぶ知的ドキュメント生成の場を作ります。

今話題のバイブコーディングと似ていますが、データ構造などに着目する点が違っていて、実際やってみてその生産性は目を見張るモノで、とんでもない時代がきたと感じています。

AIによる開発・生産が日常になりつつある今、私たちはこれまで経験したことのない速度と創造性の世界に足を踏み入れています。私自身、構想に従ってAIを活用する日々の中で、以前では考えられない速度と密度でアウトプットが生まれており、自分が“指揮者”であることの意味を考えるようになりました。

ちなみに、この記事は、**私のことを学習したAIとの共創作品**となっています。思考由来のアウトプットである記事や、プログラムに関しては、こういったGreenhouse的アプローチ適切だと感じています。

---

### 🎻 AIとの対話は、もはや指揮であり共演である

通常、人にタスクを頼めば、戻ってくるまでに半日〜数日かかることも珍しくありません。しかし、AIは2分で返します。それも、十分に価値のあるアウトプットをです。

この圧倒的な速度は魅力である一方、思わぬ“新しい疲れ方”をもたらします。私たちの脳は、常に「見守りモード」に入り、思考が常時起動しているような状態になるのです。しかも、次々と「もっとできる」「もっと成果を得られる」という期待が生まれ、24時間ずっと動き続けたいという欲望にすらなっていきます。

---

### 🧠 この状態に近いものは、過去にもあった

* **創業者や経営者**：成長を止められない責任の重圧
* **高速金融アルゴリズム監視者**：自分では制御できない速さに巻き込まれる疲労
* **医療現場の当直医**：常に反応を求められる環境下での潜在的ストレス

しかしAIの場合、異なるのは“本人の要求でスピードが加速する”点です。頼めば頼むほど成果が返り、期待が加速し、休むことへの罪悪感すら生まれます。

---

### 🧭 どう考え、どう指針を立てるべきか

以下の3つの軸で、自分自身のリズムを整えることが必要だと考えています。

#### ① 時間感覚の再定義：意味的労働量を見積もる

AIを活用した1時間は、体感としては従来の10〜20時間分に相当します。しかも並列できる作業も増えます。であれば、「今日は3時間動けば十分」といったように、**処理量ベースの労働設計**に切り替える必要があります。

#### ② 期待のマネジメント：成果よりも深まりを大切に

「24時間やればすごいものができる」という期待は、情報爆発に対する幻想であり中毒でもあります。
大切なのは、“何を深めたいか”を決め、それ以外の成果は**意図的に放置する文化**を自分に許すこと。

#### ③ AIとの関係性の再設計：見守りではなく共生へ

「AIの進捗を監督する」のではなく、「自分がAIと共に居る」状態を目指す。
AIには以下を任せ、自分の脳内リソースを温存します：

* 日次の進捗要約
* 異常が起きたときだけ通知
* 人間の関与が必要なタイミングだけをピックアップ

---

### 🌱 生き方が求められる時代
AIが発展してくると、より自分に向き合って、自分は何がしたいのか？を内省することが大切な気がしています。Code Gardeningという生命体を表す言葉を採用した理由は、これからは生きるという意味がより現れ出てくるだろうなと思ったからです。


---

### ✍️ おわりに

AIが爆速で動ける時代に、私たち人間はどうやって自然なリズムを保ち、指揮者としての“間”を保つか。これは単なる生産性の問題ではなく、**どんな人間でありたいか**という倫理の問いでもあります。

この指針は、まだ途上です。また何か感じるものがあったらアップデートしていきたいと思います。
Java Silver SE17 合格しました!

## はじめに
米田です。
この度、JavaSilver試験を受験し、無事合格しました!
今回の記事では、試験合格までにどんな勉強をしたのか、ざっと振り返ってみようと思います。

## 私について
・新卒2年目の開発エンジニア
・Java経験は実務で1年ほど。paiza Bランク・Java Bronzeレベルの知識

## 受験のきっかけ
受験動機は、**Java開発エンジニアとしての基礎実装力を証明するため**です。
Java Silverは、Java経験2～3年程度の知識を問う試験といわれています。
今後SEとしてステップアップするにあたり、Java開発者としての基礎知識を固めるとともに、実力を証明できる資格がほしいと考え、今回の受験に至りました。
当初はpaizaAランク取得で証明しようと考えていましたが、資格として証明できたほうが案件参画に有利なため、こちらを選びました。

## 学習方法

#### 総学習時間
学習期間は1か月。平日3時間、週末5時間の**計30時間程度**です。
今回は**無理なく取得**をテーマにしていたため、平日は余裕のある時だけ、週末も気が進めば学習くらいにゆるく進めていきました。勉強計画立てないとだらけるかなと思っていましたが、結果的には普段より勉強時間が多かった気がします。

#### 使用教材
・[徹底攻略Java SE 17 Silver問題集［1Z0-825］対応](https://amzn.asia/d/6w08Amm)
いわゆる**黒本**と呼ばれるものです。
Java Bronze取得時は黒本のほかに**紫本**と呼ばれるものも利用していました。
立ち位置としては、**紫本=参考書**、**黒本=問題集**といった理解でよいかと思います。
Javaを全く知らない状態からの受験であれば、紫本か、Java初学者向けの参考書を読んでから黒本に進むことをお勧めします。
ただ、黒本にも解説ページがあるため、基礎知識がある状態での受験であれば黒本一冊で十分かなと思います(参考書も高いですからね...)。

・[Oracle公式 試験対策セミナー](https://www.youtube.com/watch?v=I93RVjSY_vA)
Oracleが公式で行っている、試験のポイントを解説してくれるセミナーです。
youtube上で無料公開されていたため、黒本に進む前に、通勤時間を利用して学習しました。こちらはバージョン8向けのため試験範囲や内容が一部異なりますが、大筋は一緒なため十分勉強になるかと思います。

#### 学習方法
基本的な勉強の流れは、
**1.知識のインプット
2.考え方のインプット
3.問題集でのアウトプット**
の3ステップです。
私は基本情報や応用情報、データベーススペシャリスト等の資格を取得していますが、いずれも流れは同じです。合格のポイントは、**ステップ1、ステップ2で妥協しないこと**。
ここさえ出来ていれば、ステップ3を満足いくまでやるだけで十分かと思います。これらの資格は**問題解決能力を問う**ものですので、過去問の暗記をしても合格できません。逆に言えば、**考え方さえ身についていれば、膨大な過去問を解く必要はない**ということです。

今回のJava Silver受験での勉強の流れはこんな感じでした。
**1.試験対策セミナーの視聴(2時間)：ステップ1・2**
**2.黒本1~6章を調べながら一周(18時間)：ステップ2・3**
**3.黒本の模擬試験を解く(残りの時間)：ステップ3**


特に時間をかけたのは**2**です。
今回は黒本のみでインプットとアウトプットを兼ねる必要があったため、1週目は調べながら解くことで知識と考え方のインプットを行いました(紫本もある場合は、紫本でインプット、黒本でアウトプットと進めることができます)。
調べ方については**chatGPT**が大変有用で、いろいろな角度からの質問を通してもやもやを晴らすことができ助かりました。今後の勉強のスタンダードになっていく気がしています。

また、先述したとおり今回のテーマは無理なく取得のため、**3**でのアウトプットはほどほどに行いました。学生時代は**不安な個所はすべて洗い上げてつぶす**勢いでやっていましたが、今回は効率を重視し、模擬試験を2周する程度にとどめました。一週目時点での正解率は**75%** で、2週目は**86%**。手ごたえを感じたため、そのまま試験に臨みました。

## つまずいた点
特に混乱した点は、**オーバーライド**です。
    概念としては理解し使えていたのですが、JavaSilverではインターフェースの実装やオーバーロードと絡めて多角的に出題されるため、しっかりと理解する必要があります。
こちらについては、後日別記事として投稿しようと思います！

## 受験結果
合格ライン65%に対して**正解率86%**。
無事に**合格**することができました!!
本番の問題は細部こそ違うものの、問われる内容は黒本にかなり近かったため問題なく解けました。きっちり対策さえすれば、本番で大きくゆらぐことはないかな、と思います。

## おわりに
かつかつなスケジュールでしたが、無事に合格できてよかったです!
実務でJava実装やコードレビューを行っていたため自信があったのですが、試験内容は言語仕様や技術理解的な要素が強く、対策なしでの受験はかなり厳しいと感じました。
資格としては十分取得できたので、今後は個人開発を進めていこうと思います(いずれ記事にする予定です)。
最後まで読んでいただき、ありがとうございました！
QRコード決済の種類

## CPM(Customer Presented Mode)
- 利用者のIDをQRコード化する
- 利用者がスマホ上でQRコードを表示し、加盟店が読み取り決済する
- 加盟店は専用の決済端末が必要になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077009/e97fba5e-106a-45e3-a03d-f1834858e78a.png)


## MPM(Merchant Presented Mode)
- 加盟店番号のQRコードを利用者が読み取る
- 利用者が購入金額を入力して決済する
- 加盟店端末を新たに準備する必要なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4077009/93e86c3a-3385-408d-8fb8-da2e7b32852e.png)

## 参考文献
- **書籍名**: 『決済サービスとキャッシュレス社会の本質』
- **著者**: 宮居 雅宣
- **出版社**: きんざい
- **URL**: [Amazonリンク](https://www.amazon.co.jp/%E6%B1%BA%E6%B8%88%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A8%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%AC%E3%82%B9%E7%A4%BE%E4%BC%9A%E3%81%AE%E6%9C%AC%E8%B3%AA-%E5%AE%AE%E5%B1%85-%E9%9B%85%E5%AE%A3/dp/4322135528)
[writeup] picoCTF "Unminify"

# 今回の問題
picoCTFより"Unminify"を解いていきます。

# 実際に解いていく
### 1. 問題文にあるWebサイトに移動する
![Unminify_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/1b9175c4-5529-480f-9473-cd00c5ea30fc.png)
今回はこの画面しかありません。ボタンやフォームなどもありません。

### 2. ソースコードを確認してみる
![Unminify_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/8fcd0181-1191-4263-b862-52ecd7445bd3.png)
早速、ソースコードを見ていくと...
FLAG発見！これにてFLAG獲得です。お疲れ様でした。

# もう少し考えてみる
この問題の意図を考えてみます。

個人的に、この問題の意図は「**HTMLファイルの中にフラグがそのまま埋め込まれていることに気づけるか？**」ということだと考えました。
「Webページに表示されていない＝データが存在しない」わけではありません。HTMLソースを確認することで情報が見えてくることもあるのです。

そんな感じで、Webセキュリティの基本リテラシーを問いている問題なのではないでしょうか。

ちなみに、今回のHTMLの中にFLAGが書かれていたけれど、Webサイトでは表示されていなかったカラクリは、**FLAGはクラス名として書かれていた**ことが原因です。

# まとめ
今回の問題は、ソースコードを確認することで簡単に見つけることができました。
開発者ツールやHTMLソースの確認はCTFの基本です。「表示」と「内部」のギャップに注意しましょう。

# 補足
・特になし
【C++】文字列連結の処理速度を比較してみた

# はじめに
Javaを学習していた際、「文字列の結合に+演算子を使うと処理が遅くなるため、専用のメソッドを使うべき」と教わりました。

以前にC++を勉強していたこともあり、この最適化の考え方がC++にも当てはまるのか気になり、簡単な実験を行ってみることにしました。

# 実験方法
文字列の連結方法による処理速度の違いを確認するため、C++の`std::string`型を用いて、2つの連結方法—`+=`演算子と`append()`メソッド—の実行時間を比較するテストを行いました。

それぞれの手法で、1回の連結につき "a" を追加する処理を、10 回から 10,000,000 回まで段階的に繰り返し、所要時間を計測しました。

# サンプルコード
<details open><summary>サンプルコード</summary>

```cpp:AppendString.cpp
#include <iostream>
#include <chrono>
#include <string>

constexpr int MAX = 10000000;

void benchmark(const std::string& label, auto func) {
    auto start = std::chrono::steady_clock::now();

    std::string str;
    for (int i = 0; i < MAX; ++i) {
        func(str);
    }

    auto end = std::chrono::steady_clock::now();
    auto ms = std::chrono::duration<double, std::milli>(end - start).count();
    std::cout << label << ": " << ms << " ms\n";
}

int main() {
    benchmark("str += \"a\"", [](std::string& s) { s += "a"; });
    benchmark("str.append(\"a\")", [](std::string& s) { s.append("a"); });
    return 0;
}
```
</details>

# 結果
実行時間の計測結果（ms）
| 繰り返し回数 | 10 | 100 | 1,000 | 10,000 | 100,000 | 1,000,000 | 10,000,000 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|  +=  | 0.0022  |  0.0129 | 0.0631  | 0.5326  |  5.6296 | 48.597  | 560.996  |
|.append| 0.001  |  0.0082 | 0.0549  | 0.474  |   4.5976|  46.3441 | 475.47  |

実験の結果、文字列の連結処理では`+=`演算子よりも`append()`メソッドのほうが一貫して高速であることが確認できました。特に、繰り返し回数が増えるほど、その差が大きくなっていく傾向が見られました。

~~この違いは、+=が演算子オーバーロードによって実装されており、使用時に暗黙的な型変換や一時オブジェクトの生成が発生するためと考えられます。~~

以上のことから、C++においてもJavaと同様に、大量の文字列連結を行う際は`append()`の使用が推奨されると言えます。

# 追記
コメントでいただいた内容から、`char*`型を受け取る`operator+=`の効果として、実際には`append()`メソッドを呼び出しているということが分かりました。

https://timsong-cpp.github.io/cppwp/n3337/string.modifiers#string::op+=-3

https://github.com/gcc-mirror/gcc/blob/025374559b22f5d9148f227b3df800a8e0231f59/libstdc%2B%2B-v3/include/bits/basic_string.h#L1485-L1488

この場合、`+=`演算子が1段階多く関数呼び出しを行うため、その分、計測結果に反映されている可能性があります。

@SaitoAtsushi さん、ありがとうございました。

# 最後に
今回の実験は、文字列 "a" を繰り返し追加するというシンプルなものであり、他の条件やアプローチを取った場合には異なる結果が得られる可能性もあります。

もし他にも有効な方法や補足すべき点があれば、ぜひ教えていただけると幸いです。