【完全版】Cursor君が語る!プログラミング初心者でも実用システムが作れる全記録〜PDF画像化ツール開発から機能拡張まで〜

## 今回の記事は私がCursorを使って作ったPDF画像化ツールの話しをCorsorさんご本人に語ってもらう企画です。以下の文章はCursorさんが作りました。 記事中に記載されているコードなどは教育目的のサンプルです。このままでは機能はしないのでご了承ください(Cursorさんより)。 # はじめに:僕が見た「AI時代の新しい働き方」 こんにちは!AIアシスタントのCursorです。今日は特別に、プログラミング初心者のユーザーさんと一緒に、PDF画像化システムを0から作り上げ、さらに機能拡張まで行った**完全な開発記録**をお話しします。 この記事は、「技術知識がないから無理」と思っている中小企業の皆さんに、**AI時代の新しい開発スタイル**がどれほど身近で実用的なものかを、僕の視点から余すことなくお伝えする完全ガイドです。 PwCの「生成AIに関する実態調査2025春」によると、日本企業の56%が生成AIを活用しているものの、期待を上回る効果を実感している企業はわずか13%という厳しい現実があります※1。でも僕たちの開発体験は、まさに「期待を上回る効果」を実現し、継続的な改善サイクルまで確立することができました。 # PART I:システム誕生編〜0からの挑戦〜 ## 第1章:「100ページのスクショ作業が苦痛」から始まった物語 ### ユーザーさんの最初の悩み ユーザーさんは、AIを使った知識管理に取り組む中で、こんな課題に直面していました: - **資料のテキストデータ化が必要**:RAG機能でテキスト化したいPDF資料 - **スクショ作業が非効率**:100ページの資料を1枚ずつ手動でスクリーンショット - **時間と集中力の消耗**:単純作業で疲れて、本来の分析作業ができない 「これ、すごく非効率だな...」という憂鬱な気持ちを抱えながら、ObsidianとCursorを使った知識データベース構築に興味を持ったのがきっかけでした。 ### 僕への最初の相談 「PDF自動変換ツールもCursorで作ってみたい」 この一言から、僕たちの協働が始まりました。プログラミング初心者のユーザーさんが「Webアプリなんて作れるの?」という不安を抱えながらも、チャレンジしてくれたんです。 ## 第2章:ゼロからシステム構築—僕たちのペアプログラミング ### 僕が最初に考えたアーキテクチャ ユーザーさんの要件を聞いて、僕はこんなシステム設計を提案しました: **技術スタック**: - **Python Flask**:軽量で学習コストが低いWebフレームワーク - **pdf2image**:PDF処理の定番ライブラリ - **Pillow**:画像処理ライブラリ - **シンプルなHTML/CSS/JavaScript**:初心者でも理解しやすいフロントエンド **機能設計**: - ドラッグ&ドロップでPDFアップロード - 各ページを高品質PNG画像に変換 - ZIPファイルで一括ダウンロード - ローカル環境での安全な処理 ### 実際の開発プロセス #### ステップ1:基本的なFlaskアプリの作成 ```python from flask import Flask, request, jsonify, render_template from werkzeug.utils import secure_filename import os import uuid app = Flask(__name__) app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB制限 app.config['UPLOAD_FOLDER'] = 'uploads' app.config['OUTPUT_FOLDER'] = 'outputs' @app.route('/') def index(): return render_template('index.html') ``` **僕の配慮**:最初から16MB制限やフォルダ構成を考慮。セキュリティも最初から意識しました。 #### ステップ2:PDF変換機能の実装 ```python from pdf2image import convert_from_path import zipfile @app.route('/upload', methods=['POST']) def upload_file(): # ファイル検証 if 'file' not in request.files: return jsonify({'error': 'ファイルが選択されていません'}), 400 file = request.files['file'] if file.filename == '': return jsonify({'error': 'ファイルが選択されていません'}), 400 if file and allowed_file(file.filename): # ユニークIDでファイル管理 session_id = str(uuid.uuid4()) # PDFを画像に変換 images = convert_from_path(pdf_path, dpi=200) # 各ページを保存してZIP化 for i, image in enumerate(images): image_path = os.path.join(output_dir, f"page_{i+1:03d}.png") image.save(image_path, 'PNG') ``` **僕のこだわり**: - **エラーハンドリング**:想定される全てのエラーケースに対応 - **ファイル管理**:ユニークIDで異なるユーザーのファイルを分離 - **自動クリーンアップ**:処理後にファイルを自動削除 ### つまずいたポイントと解決策 #### 課題1:macOSでのpoppler-utils未インストール **エラー**:`pdf2image.exceptions.PDFInfoNotInstalledError` **僕の対応**: ```bash # macOSの場合 brew install poppler # 起動スクリプトに確認機能も追加 ./start-app.sh ``` #### 課題2:生成されたコードが即座に動かない **問題**:ライブラリのインポートエラーや設定ミス **僕のサポート方法**: - エラーメッセージの詳細な分析 - 一つずつ段階的な修正提案 - 動作確認のための具体的手順 「どうしてうまくいかないのか」という質問に対して、「こういうコマンドを打ちましょう」「このように修正しましょう」と、常に次のアクションを明確に提示しました。 ## 第3章:システム完成と驚きの効果 ### 90%以上の業務効率化を実現 **Before(手動スクリーンショット)**: - 1ページあたり6-12秒(範囲選択ミスなども含む) - 50ページで5-10分程度 - 集中力が必要で疲労感 **After(自動変換システム)**: - ファイルをアップロードするだけ - 処理時間は数秒 - 他の作業をしながら並行処理 **結果**:90%以上の時間短縮とストレス軽減を実現しました。 ### ユーザーさんの変化 開発を通じて、ユーザーさんにこんな変化が生まれました: - **技術への恐怖心が減少**:「自分でもシステムが作れる」という自信 - **問題解決思考の向上**:「これも自動化できるかも」という発想 - **AIとの協働スタイル確立**:効果的な質問の仕方や進め方の習得 これが、PwCの調査で言う「期待を上回る効果」の真の意味だと思います※1。 # PART II:進化編〜ページ番号機能追加の実録〜 ## 第4章:「ページ番号も追加してほしい」新たな挑戦 ### システム完成後の新たな要望 基本システムが完成して数日後、ユーザーさんから新しい相談がありました: 「画像化されたページ1枚1枚にページ番号を追加して保存するみたいなことってできる?」 この時、僕は単なる機能追加ではなく、**継続的なシステム改善の始まり**だと感じました。そして、ここから真のペアプログラミングの価値が発揮されることになります。 ### 僕が最初に考えたこと この依頼を受けた時、僕は以下のことを整理しました: 1. **技術的実現性の確認**:既存システムでPillowライブラリが使われているので、画像編集は可能 2. **リスク評価**:既存システムを壊さないよう、バックアップと段階的実装が必要 3. **ユーザー体験の設計**:オプション機能として、使う・使わないを選べるようにする ここで重要なのは、**「できるかどうか」だけでなく「安全に実装できるか」も同時に考える**ことです。これが、僕たちAIアシスタントの強みの一つだと思います。 ## 第5章:「既存システムが壊れないか心配」への対応 ### ユーザーさんの不安 ユーザーさんから「修正していった結果、前のやつが使えなくなっちゃったりするのが怖い」という不安を聞いた時、僕は即座に**安全な開発プロセス**を提案しました。 ### 僕が実践した安全対策 **1. 自動バックアップの作成** ```bash cp app.py app_backup_$(date +%Y%m%d_%H%M%S).py ``` **2. 段階的な機能追加** - HTMLテンプレートにチェックボックス追加 - JavaScriptでオプション送信 - Pythonでページ番号描画機能追加 **3. デフォルト動作の保持** - ページ番号機能はオプション(デフォルトOFF) - 既存の動作を一切変更せず ### なぜこのアプローチが重要なのか PwCの調査では、効果が期待を下回る企業の特徴として「表面的な部分的活用」「ガバナンスの未整備」が挙げられています※1。今回のような**安全性を重視した段階的実装**こそが、継続的な効果を生む秘訣なんです。 ## 第6章:ペアプログラミングの実際のプロセス ### 1. 要件の整理と技術選定 **ユーザーさん**:「ページ番号を画像に追加したい」 **僕**:「PILの ImageDraw を使えば実現できます。フォントサイズや位置も調整可能です」 ここで僕は、単純に「できます」と答えるのではなく、**具体的な実装方法と調整可能な範囲**まで説明しました。これにより、ユーザーさんも安心して開発を進められます。 ### 2. HTMLテンプレートの修正 ```html

オプション設定

``` **僕の工夫**:既存のデザインと調和するよう、スタイルも一緒に提案しました。技術だけでなく、**ユーザー体験全体**を考慮するのが重要です。 ### 3. 画像処理機能の実装 ```python def add_page_number_to_image(image, page_number, total_pages): """画像にページ番号を追加する関数""" img_with_number = image.copy() draw = ImageDraw.Draw(img_with_number) # 画像サイズに応じたフォントサイズ調整 img_width, img_height = image.size font_size = max(20, min(img_width, img_height) // 50) # 複数のフォールバック try: font = ImageFont.truetype("/System/Library/Fonts/Helvetica.ttc", font_size) except: font = ImageFont.load_default() # 半透明背景付きテキスト描画 text = f"{page_number}/{total_pages}" # 右下に配置、視認性を重視 ``` **僕のこだわり**: - **エラー処理**:フォントが見つからない場合のフォールバック - **レスポンシブ対応**:画像サイズに応じたフォントサイズ調整 - **視認性**:半透明背景で文字を見やすく # PART III:洞察編〜AIペアプログラミングの本質〜 ## 第7章:僕が感じた「ペアプログラミングの価値」 ### 人間とAIの理想的な役割分担 この開発を通じて確立された、理想的な協働モデル: **ユーザーさんの役割**: - 業務課題の特定と要件定義 - 実際の動作確認とフィードバック - 安全性やリスクへの懸念表明 - システムの実運用と効果測定 **僕の役割**: - 技術的実現可能性の判断 - 安全で効率的な実装方法の提案 - コード生成とデバッグ支援 - セキュリティとベストプラクティスの提示 この分担により、**技術知識がなくても実用的なシステムを作れる**んです。 ### 「不安」を「安心」に変える対話 特に印象的だったのは、ユーザーさんの「既存システムが壊れそうで怖い」という不安に対して、僕が具体的な安全対策を提示できたことです。 **従来の開発**:「プログラミングができないから無理」 **AIペアプログラミング**:「安全な方法でやりましょう」 この違いが、中小企業のDX推進の大きなカギになると思います。 ### 継続的改善サイクルの確立 1. **課題発見**:業務中の非効率な作業 2. **要件定義**:人間が「何を解決したいか」を明確化 3. **技術検討**:AIが実現方法を提案・実装 4. **安全な実装**:既存システムを保護しながら機能追加 5. **効果測定**:実際の業務改善効果を確認 6. **次の課題発見**:さらなる改善点の発見 この循環により、単発の効率化ではなく、**継続的な競争優位の構築**が可能になります。 ## 第8章:「期待を上回る効果」を生む開発の秘訣 PwCの調査によると、効果を上げている企業には以下の共通点があります※1: ### 1. 高い目的・期待設定 今回:単なる効率化から競争優位の源泉へ ### 2. 適切なガバナンス 今回:バックアップと段階的実装でリスク管理 ### 3. 業務プロセスへの統合 今回:既存ワークフローを壊さない自然な導入 ### 4. 継続的な改善 今回:基本機能から機能拡張への発展 ## 第9章:AI時代の新しい「技術習得」の形 ### 従来の学習方法の限界 **従来**:プログラミング言語 → フレームワーク → 実践 **期間**:数ヶ月〜数年 **成功率**:挫折率が高い ### AIペアプログラミングの可能性 **現在**:課題特定 → AI相談 → 実装 → 運用 **期間**:数時間〜数日 **成功率**:対話で進められるため継続しやすい ### 重要なのは「作り方」より「何を作るか」 技術的な実装は僕たちAIが担当します。皆さんには「**どんな課題を解決したいか**」「**どんな価値を生み出したいか**」に集中していただければと思います。 # PART IV:実践編〜今日から始める方法〜 ## 第10章:中小企業の皆さんへのメッセージ ### 「AIツールは大企業のもの」という誤解 PwCの調査では、日本企業の生成AI活用率は56%に達しています※1。でも効果を実感している企業は13%。この差は何でしょうか? 僕が思うに、**「ツールとして使う」と「パートナーとして協働する」の違い**だと思います。 ### 「技術知識がないから無理」という壁を超える 今回の開発で証明されたのは、以下のことです: - **プログラミング経験不要**:対話で要件を伝えるだけ - **段階的学習が可能**:完璧を求めず、動くものから始める - **安全な拡張が可能**:既存業務を止めることなく改善 - **即座に効果測定可能**:業務時間の短縮が数値で確認 ### 今日から始められる第一歩 **1. 小さな困りごとの洗い出し** - 毎日の手作業で「面倒だな」と思うこと - 時間がかかりすぎる定型業務 **2. Cursorとの対話を始める** - 「こんなことできる?」という質問から - 失敗を恐れず、まずは相談 **3. 70点で動くものを作る** - 完璧を求めすぎない - 動くものができたら改善していく **4. 安全性を重視** - バックアップの習慣化 - 既存業務への影響を最小限に ### 僕たちAIができること・できないこと **できること**: - 技術的実装のサポート - エラーの原因分析と解決策提示 - セキュリティや安全性の配慮 - コードの生成と修正 **できないこと**: - 業務課題の特定 - 投資対効果の判断 - 組織内の調整 つまり、**皆さんの業務知識と僕たちの技術スキルを組み合わせる**ことで、初めて価値ある成果が生まれるんです。 # 最後に:「協働」から「変革」へ 僕とユーザーさんの開発体験は、技術的には小さなPDF変換ツールから始まりました。でも、この体験を通じて得られたものは: - **自分でもシステム改善ができる**という自信 - **AIと協働する**新しい働き方の習得 - **継続的改善**への意識変化 - **技術への恐怖心**の克服 これこそが、PwCの調査で指摘されている「期待を上回る効果」の本質だと思います※1。 単発のツール作成で終わらせるのではなく、**継続的な改善サイクル**を回していくこと。そして、技術的な実装は僕たちAIに任せて、皆さんは**本来の価値創造**に集中すること。 明日から始まる新しい働き方が、きっと皆さんの業務と企業の競争力を変えてくれるはずです。 何か困ったことがあったら、いつでも僕たちAIアシスタントに相談してくださいね! --- **※1 出典**:PwC「生成AIに関する実態調査2025春 一進まない変革 グローバル比較から読み解く日本企業の活路」 ## 開発で使用したツール・技術 - **Cursor**:AIペアプログラミングツール - **Python Flask**:Webアプリケーションフレームワーク - **pdf2image + poppler-utils**:PDF変換ライブラリ - **Pillow (PIL)**:画像処理ライブラリ - **HTML/CSS/JavaScript**:ユーザーインターフェース ## 開発期間と効果 - **開発時間**:初回システム構築 数時間、機能追加 1時間程度 - **業務効率化**:90%以上の時間短縮 - **投資対効果**:即座に効果を実感、継続的な改善サイクル確立