<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>gemini notebook | imakat.com</title>
	<atom:link href="https://imakat.com/tag/gemini-notebook/feed/" rel="self" type="application/rss+xml" />
	<link>https://imakat.com</link>
	<description>工夫と改善で人生をちょっと豊かに</description>
	<lastBuildDate>Sat, 03 Oct 2026 21:12:16 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://i0.wp.com/imakat.com/wp-content/uploads/2023/07/cropped-80d64ecd340db4e2ca3224859b04caed.png?fit=32%2C32&#038;ssl=1</url>
	<title>gemini notebook | imakat.com</title>
	<link>https://imakat.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">160909258</site>	<item>
		<title>【AI活用】第４弾！コード生成エコシステムを成功させる3つのポイント 〜AI連携をハンドメイドする〜</title>
		<link>https://imakat.com/2026/09/29/29847/</link>
		
		<dc:creator><![CDATA[imakat]]></dc:creator>
		<pubDate>Tue, 29 Sep 2026 01:36:10 +0000</pubDate>
				<category><![CDATA[デジタル]]></category>
		<category><![CDATA[ものづくり]]></category>
		<category><![CDATA[Google AI Studio]]></category>
		<category><![CDATA[gemini notebook]]></category>
		<category><![CDATA[ローカルLLM]]></category>
		<category><![CDATA[Gemini]]></category>
		<guid isPermaLink="false">https://imakat.com/?p=29847</guid>

					<description><![CDATA[はじめに&#160; まずは、動画をご覧ください。 生成AIブームがここ数年急激に発展してきているわけですが、生成AIを個人が利用する場合は、ネットワークを通じてクラウドを使うしかないだろうと最初は見ていましたが、 最近 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading"><strong>はじめに</strong>&nbsp;</h2>



<p class="wp-block-paragraph">まずは、動画をご覧ください。</p>


<div class="sc-dynamic-embed">
  <style>
  /* リンクの見た目を整える */
  .sc-dynamic-embed .sc-link-container { 
      display: flex; 
      margin-bottom: 10px; 
      flex-wrap: wrap; 
      align-items: center; 
  }
  .sc-dynamic-embed .sc-link { margin-bottom: 0; }
  .sc-dynamic-embed .sc-link a {
    font-size: 15px; 
    font-weight: normal;
    text-decoration: underline;
    color: #0073aa;
  }
  .sc-dynamic-embed .sc-link a:hover { text-decoration: none; color: #000; }
  
  @media (max-width: 500px) {
    .sc-dynamic-embed .sc-link a { font-size: 13px; }
  }

  .sc-dynamic-embed .imk-line {
      display: inline-block;
      width: 100%;
      border-radius: 2px;
      transition: background-color 0.1s;
  }

  .sc-dynamic-embed #subtitleOverlay,
  .sc-dynamic-embed #scSubtitleOverlay,
  .sc-dynamic-embed .overlay-cue,
  .sc-dynamic-embed .band {
      display: none !important;
      opacity: 0 !important;
      visibility: hidden !important;
      pointer-events: none !important;
  }
  </style>

  <div class="sc-link-container">
    <p class="sc-link">
      <!-- ★環境依存排除：固定ドメインをルート相対パスへ置換完了 -->
      <a href="/ds62/?drid=107" target="_blank"
         onclick="return scStopAndGo(event, this);">
        👉低画質・枠外字幕はこちら
      </a>
    </p>
  </div>

  <!-- ★環境依存排除：[dynamic_external_html] にルート相対パスを指定し、functions.phpにURL動的解決を委ねる設計 -->
  テキストの読み込みに失敗しました。

  <script>
  (function(){
    var me = document.currentScript;
    var wrapper = me ? me.closest('.sc-dynamic-embed') : null;

    function protectVideo() {
      var target = wrapper ? wrapper : document;
      var mediaEls = target.querySelectorAll('video, audio');
      mediaEls.forEach(function(v){
        if(v.dataset.protected === 'true') return;
        v.dataset.protected = 'true';
        v.setAttribute('controlsList', 'nodownload');
        v.oncontextmenu = function() { return false; };
        v.addEventListener('contextmenu', function(e){ e.preventDefault(); return false; }, false);
      });
    }

    function initSubtitles() {
      var target = wrapper ? wrapper : document;
      var video = target.querySelector('video, audio');
      var listContainer = target.querySelector('details > p');
      
      if (!video) return false; 
      
      if (video.dataset.subInit === 'true') return true; 
      video.dataset.subInit = 'true';

      var oldOverlay = target.querySelector('#subtitleOverlay') || target.querySelector('#scSubtitleOverlay');
      if (oldOverlay) {
          oldOverlay.style.setProperty('display', 'none', 'important');
          oldOverlay.innerHTML = ''; 
      }

      // 全画面・PiP・iOS全画面の判定（dr52.php準拠＋Safari presentationMode完全対応）
      function isSpecialMode() {
        var fsEl = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;
        var isFs = !!fsEl;
        var isWebkitFs = (video.webkitPresentationMode === "fullscreen") || !!video.webkitDisplayingFullscreen;
        var isPiP = !!(document.pictureInPictureElement && document.pictureInPictureElement === video) || (video.webkitPresentationMode === "picture-in-picture");
        return isFs || isWebkitFs || isPiP;
      }

      // 字幕トラックの表示/非表示を更新
      function updateTrackMode() {
        var hasList = (listContainer !== null);
        var desiredMode = (isSpecialMode() || !hasList) ? "showing" : "hidden";
        try {
          if (video.textTracks && video.textTracks.length > 0) {
            for (var i = 0; i < video.textTracks.length; i++) {
              var track = video.textTracks[i];
              if ((track.kind === 'subtitles' || track.kind === 'captions') && track.mode !== desiredMode) {
                track.mode = desiredMode;
              }
            }
          }
        } catch(e) {}
      }

      // 初回の反映
      updateTrackMode();

      // 各種全画面・PiP切り替えイベントの即時検知リスナーを登録（video本体・document双方を監視）
      ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange'].forEach(function(evtName) {
        document.addEventListener(evtName, updateTrackMode, false);
        video.addEventListener(evtName, updateTrackMode, false);
      });
      video.addEventListener('webkitbeginfullscreen', updateTrackMode, false);
      video.addEventListener('webkitendfullscreen', updateTrackMode, false);
      video.addEventListener('webkitpresentationmodechanged', updateTrackMode, false);
      video.addEventListener('enterpictureinpicture', updateTrackMode, false);
      video.addEventListener('leavepictureinpicture', updateTrackMode, false);
      video.addEventListener('play', updateTrackMode, false);
      video.addEventListener('pause', updateTrackMode, false);

      // 字幕一覧が存在する場合のみ、リストのフォーマット処理を行う
      if (listContainer) {
          var detailsEl = target.querySelector("details");
          if (detailsEl) {
              detailsEl.open = true; 
              var summaryEl = detailsEl.querySelector("summary");
              if (summaryEl) summaryEl.textContent = "字幕(シーン)はここをクリック";
          }

          if (!listContainer.dataset.formatted) {
              var html = listContainer.innerHTML;
              var lines = html.split(/<br\s*\/?>/i);
              var newHtml = "";
              for(var j=0; j<lines.length; j++) {
                  if(lines[j].trim() === "") continue;
                  newHtml += "<span class='imk-line'>" + lines[j] + "</span><br>";
              }
              listContainer.innerHTML = newHtml;
              listContainer.dataset.formatted = "true";
          }

          var rootSublist = target.querySelector(".dr5-sublist") || listContainer.parentElement;
          if (rootSublist) {
            rootSublist.addEventListener("click", function(e){
              var a = e.target.closest && e.target.closest("a.imk-cue[data-seek]");
              if(!a) return;
              e.preventDefault();
              var ts = a.getAttribute("data-seek");
              if(!ts) return;
              var p = ts.trim().split(":").map(function(x){return parseInt(x,10)||0;});
              var sec = (p.length===2) ? p[0]*60+p[1] : (p.length===3 ? p[0]*3600+p[1]*60+p[2]: null);
              if(sec==null) return;
              try{ video.currentTime = sec; if(video.paused) video.play(); }catch(_){}
            });
          }
      }

      // 再生中（時間進行時）の追従とハイライト更新
      video.addEventListener("timeupdate", function(){
        updateTrackMode();

        var hasList = (listContainer !== null);
        if (!hasList) return;

        var cues = listContainer.querySelectorAll("a.imk-cue");
        if(cues.length === 0) return;
        var cur = video.currentTime;
        var activeA = null;

        for(var i=0; i<cues.length; i++){
            var ts = cues[i].getAttribute("data-seek");
            if(!ts) continue;
            var p = ts.trim().split(":").map(function(x){return parseInt(x,10)||0;});
            var t = (p.length===2) ? p[0]*60+p[1] : (p.length===3 ? p[0]*3600+p[1]*60+p[2] : null);
            if(t !== null && cur >= t - 0.5){ activeA = cues[i]; } 
            else if(t > cur){ break; }
        }

        if(activeA){
            var activeLine = activeA.closest(".imk-line");
            if(!activeLine) activeLine = activeA;

            if(activeLine.classList.contains("active-hl")) return;

            var allLines = listContainer.querySelectorAll(".imk-line");
            for(var k=0; k<allLines.length; k++) {
                allLines[k].classList.remove("active-hl");
                allLines[k].removeAttribute("style"); 
            }
            var allLinks = listContainer.querySelectorAll("a");
            for(var m=0; m<allLinks.length; m++) {
                allLinks[m].classList.remove("active-hl");
                allLinks[m].removeAttribute("style"); 
            }

            activeLine.classList.add("active-hl");
            activeLine.style.setProperty("background-color", "#ffff00", "important");
            activeLine.style.setProperty("color", "red", "important");
            activeLine.style.setProperty("font-weight", "normal", "important");
            
            var newLinks = activeLine.querySelectorAll("a");
            for(var n=0; n<newLinks.length; n++) {
                newLinks[n].style.setProperty("color", "red", "important");
                newLinks[n].style.setProperty("text-decoration", "none", "important");
            }

            if(listContainer.offsetParent !== null){
                var containerRect = listContainer.getBoundingClientRect();
                var activeRect = activeLine.getBoundingClientRect();
                var targetScroll = listContainer.scrollTop + (activeRect.top - containerRect.top) - (listContainer.clientHeight / 2) + (activeLine.clientHeight / 2);
                listContainer.scrollTo({ top: targetScroll, behavior: "smooth" });
            }
        }
      });

      return true;
    }

    var checks = 0;
    var checkTimer = setInterval(function(){
      protectVideo();
      var success = initSubtitles();
      checks++;
      if (success || checks > 20) { 
        clearInterval(checkTimer);
      }
    }, 500); 

    if (!window.scStopAndGo) {
      window.scStopAndGo = function(event, link){
        try{
          var mediaEls = document.querySelectorAll('video, audio');
          mediaEls.forEach(function(m){
            try{
              if (!m.paused) m.pause();
              if (document.pictureInPictureElement === m && document.exitPictureInPicture) {
                document.exitPictureInPicture().catch(function(){});
              }
            }catch(e){}
          });
        }finally{
          event.preventDefault();
          setTimeout(function(){
            if (link.target === '_blank') {
              window.open(link.href, '_blank');
            } else {
              window.location.href = link.href;
            }
          }, 50);
        }
        return false;
      };
    }
  })();
  </script>
</div>



<p class="wp-block-paragraph">生成AIブームがここ数年急激に発展してきているわけですが、生成AIを個人が利用する場合は、ネットワークを通じてクラウドを使うしかないだろうと最初は見ていましたが、</p>



<p class="wp-block-paragraph">最近はそれをMac mini上のローカルLLMで行おうとする人も増えています。これは、かつて流行した「自宅Webサーバー」を思い起こさせます。しかし「自宅Webサーバー」ブームは短命でした。というのは、機器のメンテナンスやウイルス感染、災害リスクが重くのしかかって個人が自宅で抱えていくのにはちょっと無理な発想だったわけです。</p>



<p class="wp-block-paragraph">ローカルとクラウドの長所短所を考え合わせれば、やはりハイブリッド化していくのが合理的に思えてきますね。</p>



<p class="wp-block-paragraph">私の場合ですが、今のところはクラウドだけを使っています。どの大手のAIにも移行できるように、ソースはtxtファイルをベースにして言語はPythonなどの一般的な言語を中心にしています。現在は成り行き上、Googleを使っています。Googleは何でも揃うのでラクと言うことでしょうか。Notebook・Gemini・Google AI Studioを連携させています。これらをうまく活用するための3つのポイントについて、<strong>大手IT企業のアプローチとの対比</strong>を交えながら解説します。</p>



<h2 class="wp-block-heading"><strong>ポイント1：Gemini Notebookに「知識」を蓄える</strong></h2>



<figure class="wp-block-image size-large"><a href="https://imakat.com/rd.php?id=ncOHywu5.jpeg" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=ncOHywu5.jpeg" alt=""/></a></figure>



<p class="wp-block-paragraph">AIを開発パートナーとして機能させるための第一歩は、例えばNotebookへ前提知識（コンテキスト）を溜め込むことだと思います。溜め込みを判断するのはあくまで私です。生成AIに勝手に任せることはしません。やっぱり自分が中身を知っていることは重要ですから。私が生成AIによるコーディングを実行できたのも、imakatブログへの投稿の蓄積、自前でネットから拾い上げながらコツコツ作ってきたプログラムコードの蓄積、その他もろもろ、それらを知識ソースとして投入できたことが非常に大きいです。<br>古臭いと感じるかもしれませんが、年月かけてブログ投稿を積み重ねるのが役に立つと思います。SNSは瞬間の出来事の切り取りと感じた印象だけを記録するので知見の蓄積としてはちょっと弱い、やっぱりブログがいいと思います。始めるのは若ければ若いほどいいと思います。身近な改善や経験を備忘録のつもりで書いていく、記事の投稿の目標は、ばらつきはあるとしても月１点以上がいいと思います。大事な事は職業上の秘密には絶対に触れないことです。私としてはこのWordPressのブログをコツコツと続けてきて本当によかったと感じています。</p>



<p class="wp-block-paragraph">Notebookを用途に合わせて明確に区分し、知識資産を分類・配置します。</p>



<p class="wp-block-paragraph"><strong>大手IT企業と個人ハンドメイドの対比</strong></p>



<figure class="wp-block-table"><table class="has-border-color has-key-color-border-color has-fixed-layout" style="border-width:1px"><tbody><tr><td><strong>比較項目</strong></td><td><strong>大手IT企業の通常アプローチ</strong></td><td><strong>本エコシステムのハンドメイド手法</strong></td></tr><tr><td><strong>知識ソースの基盤</strong></td><td>社内Wiki（Confluence等）や全社ポータルを専任チームが運用・保守</td><td><strong>Notebookの用途別「図書館」</strong>（自分用／公開用）に直接集約</td></tr><tr><td><strong>コンテキスト管理</strong></td><td>ベクターDBや高額な社内RAGシステムをインフラ構築して検索</td><td><strong>ノートブックのソース投入機能</strong>を活用し、追加費用ゼロで即時参照</td></tr><tr><td><strong>情報区分の統制</strong></td><td>複雑なアクセス権限（ACL）と閲覧ロール設定によるアクセス制限</td><td><strong>exe.txt（実行用）／pub.txt（公開用）／内外備忘録の命名規則</strong>でシンプルに統制</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>具体的な運用設計</strong></p>



<ul class="wp-block-list">
<li><strong>目的別に「図書館」を分ける</strong>
<ul class="wp-block-list">
<li><strong>自分用imakat図書館</strong>：日々の開発・ブログ記事執筆、メンテナンス・デバッグを行うためのプライベートな知識ベース。</li>



<li><strong>公開用imakat図書館</strong>：外部共有、ブログ記事発信、公開向けのオープンな知恵袋。</li>
</ul>
</li>



<li><strong>ソース（ファイル）の厳格な区分ルール</strong>
<ul class="wp-block-list">
<li><strong>実行用コード（exe.txt）</strong>：手元で実際に動作するコード。自分用図書館にのみ格納し、公開用には一切含めません。</li>



<li><strong>公開用コード（pub.txt）</strong>：後述のソフト秘匿化（サニタイズ）を施したコード。両方の図書館で共有します。</li>



<li><strong>imakatブログ（公開）.txt</strong>：オープンな技術ノウハウや趣味雑学他の発信記事。両方の図書館に配置します。</li>



<li><strong>外部備忘録.txt（※重要）</strong>：
<ul class="wp-block-list">
<li><strong>内部備忘録【内】</strong>：個人情報や個人的な日記など、外部秘にしたい記録（AI・Notebookには一切連携しない）。今後、セキュリティに強いAppleのAIに含めることになると思います。</li>



<li><strong>外部備忘録【外】</strong>：作業記録、試行錯誤のチャットログ、技術アイデアなど。知識や経験の蓄積として自分用図書館にリンクさせ、AIの頭脳を育てます。</li>
</ul>
</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading"><strong>ポイント2：ハード秘匿化するモジュールを組み込む</strong></h2>



<figure class="wp-block-image size-large"><a href="https://imakat.com/rd.php?id=NgsIlwpv.jpeg" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=NgsIlwpv.jpeg" alt=""/></a></figure>



<p class="wp-block-paragraph">クラウド型生成AIにコードを渡す際、最も恐ろしいのが認証情報や特定ファイルIDの漏洩です。これを防ぐため、「二層秘匿化」を行いました。ただし、この秘匿化の登録もAIに任せるのではなく私が判断します。</p>



<p class="wp-block-paragraph"><strong>大手IT企業と個人ハンドメイドの対比</strong></p>



<figure class="wp-block-table"><table class="has-border-color has-key-color-border-color has-fixed-layout" style="border-width:1px"><tbody><tr><td><strong>比較項目</strong></td><td><strong>大手IT企業の通常アプローチ</strong></td><td><strong>本エコシステムのハンドメイド手法</strong></td></tr><tr><td><strong>機密情報の保管</strong></td><td>クラウド金庫サービス（AWS Secrets Manager, HashiCorp Vault等）を有料導入</td><td><strong>ローカルの .env ファイル</strong>に隔離し、外部アクセスを物理遮断</td></tr><tr><td><strong>パラメータの払い出し</strong></td><td>専任のセキュリティ基盤がトークンを動的発行・認可管理</td><td><strong>Notebookを管理塔</strong>とし、プロンプト指示でパラメータのみをAIに持ち帰らせる</td></tr><tr><td><strong>プライバシー対策</strong></td><td>リポジトリ監視ツール（GitGuardian等）によるコミット自動遮断</td><td><strong>ソフト秘匿化ルール</strong>により、公開用コード生成時に固有名詞を自動サニタイズ</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>具体的な運用設計</strong></p>



<ul class="wp-block-list">
<li><strong>第1層：ハード秘匿化（実質的セキュリティ）</strong><strong><br></strong> スプレッドシートIDやAPIキーをコード内に直接ベタ書き（SPREADSHEET_F8_ID = &#8220;1_ABCDabcd&#8230;&#8221;）せず、ローカルの .env ファイルへ隔離します。コード側は、Pythonの場合、 os.getenv(&#8220;SPREADSHEET_F8_ID&#8221;) で環境変数から動的ロードする構成を標準化します。</li>



<li><strong>ハード秘匿化モジュールはNoteBookで一元管理</strong><strong><br></strong> 生成AIのカスタム指示に「プログラムを作成している最中に、秘匿情報の設定が必要になったら、NoteBookへ行って秘匿情報にパラメータを設定してもらってパラメータだけを持ち帰って来ること。」と設定しておきます。AIに直接生データを触らせず、Notebookが安全なパラメータ名だけをコード側に橋渡しします。</li>



<li><strong>第2層：ソフト秘匿化（見た目・見栄えの安全性）</strong><strong><br></strong> メールアドレスや氏名などの固有名詞は、認証突破に直結しなくてもコードに残ると不格好で不用心です。公開用コード（pub.txt）を出力する段階で、これらの文字列を安全にマスキングします。</li>
</ul>



<h2 class="wp-block-heading"><strong>ポイント3：エラー修正プロセスを確実に実行する</strong></h2>



<figure class="wp-block-image size-large"><a href="https://imakat.com/rd.php?id=TlLuCaVF.jpeg" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=TlLuCaVF.jpeg" alt=""/></a></figure>



<p class="wp-block-paragraph">実は、エラーへの対処が一番難しいところです。２つの問題があります。一つは、時間が経つと、記憶も薄れ、このエラーはどのプログラムが関係していたのか思い出せなくなることです。突然のエラーは焦りまくるので尚更です。もう一つは、NoteBookが画像動画の解析能力がほとんどないことです。従って、エラー時につきものの、エラーのスクショはGeminiに解析してもらうことが入り口になります。ここは将来はNoteBookにその解析能力がつくことを期待するものですが。そうした得手不得手のある中で、強みを活かした連携フローを敷いてみました。</p>



<p class="wp-block-paragraph"><strong>大手IT企業と個人ハンドメイドの対比</strong></p>



<figure class="wp-block-table"><table class="has-border-color has-key-color-border-color has-fixed-layout" style="border-width:1px"><tbody><tr><td><strong>比較項目</strong></td><td><strong>大手IT企業の通常アプローチ</strong></td><td><strong>本エコシステムのハンドメイド手法</strong></td></tr><tr><td><strong>障害受付（一次切り分け）</strong></td><td>運用監視ツール（Datadog等）＋ヘルプデスク／一次運用オペレーター</td><td><strong>Geminiによる画像解析</strong>（エラー画面のスクショを投げるだけで即座に言語化）</td></tr><tr><td><strong>原因特定・影響調査</strong></td><td>構成管理DB（CMDB）の突合＋熟練アーキテクトによる設計書レビュー</td><td><strong>Notebookによる全コード台帳の横断検索</strong>＋修正指示書の自動起票</td></tr><tr><td><strong>修正・リファクタリング</strong></td><td>大規模リファクタリング専門チームによる設計・テスト・実装作業</td><td><strong>Google AI Studioの広大なコンテキスト長</strong>を活かした一括修正</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>具体的な運用設計</strong></p>



<ul class="wp-block-list">
<li><strong>新規開発・改善のフロー</strong>
<ul class="wp-block-list">
<li><strong>NoteBookに相談</strong>：まずは知識が蓄積されているNoteBookで過去資産や影響範囲を照合。</li>



<li><strong>規模に応じた切り分け</strong>：軽微な内容はNoteBook内で完結。400行を超える大規模ロジックや複雑な構造刷新は、広大なコンテキスト長を持つ <strong>Google AI Studio</strong> へ引き継いで一気に生成します。</li>



<li><strong>秘匿化連携</strong>：コード生成の途中でキーやIDが必要になったら、常に横の「NoteBook（ハード秘匿化モジュール）」へ依頼してパラメータを取得します。</li>
</ul>
</li>



<li><strong>エラー修正のリレー</strong>
<ul class="wp-block-list">
<li><strong>Geminiにエラー画像を投入（一次受付・言語化）</strong>：画面スクショをGeminiに渡すだけで、根本原因や関連キーワードを正確にテキスト化（短い修正ならそのままGeminiで修正完了）。</li>



<li><strong>NoteBookに投げてファイル特定＆指示書作成（司令塔）</strong>：言語化されたキーワードをもとにNoteBookが全コード（exe.txt等）を横断検索し、「該当ファイルの特定」と「AI Studio用の修正指示書」を出力。</li>



<li><strong>AI Studioで修正・完結（確実な実行）</strong>：指示書をAI Studioに流し込み、長文コードの整合性を保ったまま確実に修正を完了。</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading"><strong>まとめ</strong></h2>



<p class="wp-block-paragraph">さて、今回は、クラウド型生成AIについてその核心を３つのポイントにまとめたわけですが、こうやって記事を書いていても、まだなお、モヤモヤしているのは、3番目の、エラー処理のところです。Geminiに画像解析をさせてNotebookに引き継いでコードを抽出する、というところです。ここを一つにまとめたいのです。そこで、「画像解析からコード抽出」の部分を、ローカルLLMで処理することに挑戦してみたいと思います。その後で、コードが大規模の場合AI Studioへ引き継ぐのは、これはもう仕方ない事だと思います。だからハイブリッド型になりますね。</p>



<p class="wp-block-paragraph">ただし挑戦するにしても、私にとって生成AIを含めたデジタル関係の趣味に掛けられるお金は月3000円くらいまでです。YouTubeを見ていると、３社以上の生成AIを契約して月10万円以上かけているような、おそらく本職がデジタル関係の方がたくさんいらっしゃるわけですが、私は生活費の一部から出費するわけですので、身の丈に合ったサービスを利用することになります。</p>



<p class="wp-block-paragraph">改めて感じることですが、大企業から学ぶ真似ることは面白いと感じます。AIに聞けば、大企業がどのように諸課題を乗り越えているか解説してくれます。それを参考にして、それを小さくして簡単にして自分で作り込む。そのプロセスは結構未知な世界でワクワクするところです。そんなマインドが、個人開発を破綻させず、安全な長期利用につながっていくものと考えます。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29847</post-id>	</item>
	</channel>
</rss>
