<?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>NotebookLM | imakat.com</title>
	<atom:link href="https://imakat.com/tag/notebooklm/feed/" rel="self" type="application/rss+xml" />
	<link>https://imakat.com</link>
	<description>工夫と改善で人生をちょっと豊かに</description>
	<lastBuildDate>Mon, 20 Jul 2026 22:18:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.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>NotebookLM | 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>【NotebookLM活用】第３弾、日々の備忘録を全自動でAIの頭脳へ還流させるエコシステムを作った</title>
		<link>https://imakat.com/2026/06/29/29358/</link>
		
		<dc:creator><![CDATA[imakat]]></dc:creator>
		<pubDate>Mon, 29 Jun 2026 05:32:44 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[デジタル]]></category>
		<category><![CDATA[ものづくり]]></category>
		<category><![CDATA[NotebookLM]]></category>
		<guid isPermaLink="false">https://imakat.com/?p=29358</guid>

					<description><![CDATA[2026.7.20更新：NotebookLMの名称が、Gemini Notebookに変更になっています。 はじめに 前回、生成AIを活用したコード生成システム（第２弾）をご紹介しましたが、今回はその仕組みをさらに拡張し [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">2026.7.20更新：NotebookLMの名称が、Gemini Notebookに変更になっています。</p>



<h2 class="wp-block-heading"><strong>はじめに</strong> </h2>



<p class="wp-block-paragraph">前回、生成AIを活用したコード生成システム（第２弾）をご紹介しましたが、今回はその仕組みをさらに拡張した「第３弾」のお話です。 AIとの高度な対話メモや、Webで見つけた有益な情報、日々の備忘録を、いかにして無駄なく・手間なくNotebookLM（あるいはカスタムGem）の知識ソースへ送り込み、自分のAIを賢く育てていくか。今回は、その進化のループを回す、私なりの最強インフラをご紹介します。</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="https://imakat.com/ds62/?drid=100" target="_blank"
         onclick="return scStopAndGo(event, this);">
        👉低画質・枠外字幕はこちら
      </a>
    </p>
  </div>

  <style>
            :root{ --dr5emd-max: 1920px; }
            #subtitleOverlay, #scSubtitleOverlay, .overlay-cue, .band { display: none !important; opacity: 0 !important; }
            .imk-line { display: inline-block; width: 100%; border-radius: 2px; transition: background-color 0.1s; }
            .dr5emd-sublist details > p{ height:200px; overflow:auto; background-color:#EDF7FF; padding:2px 6px; margin:0; box-shadow:3px 3px 4px black; position: relative; }
            .dr5emd-sublist details > summary{ padding:2px 6px; width:100%; background-color:#ddd; border:none; box-shadow:3px 3px 4px black; cursor:pointer; list-style:none; }
            
                .video-wrap{position:relative;width:100%;margin:0 auto}
                #myVideo{width:100%;height:auto;min-height:200px;display:block;background:#000;}</style><div class="dr5emd-container"><div class="video-wrap"><video id="myVideo" controls poster="https://imakat.com/rd.php?id=JL43fs90.png" playsinline preload="none" style="width:100%;height:auto;">  <source src="https://imakat.com/rd.php?id=lnUK0wRC.mp4" type="video/mp4">  <track src="https://imakat.com/rd.php?id=7sAZ6pz9.vtt" label="日本語" srclang="ja" kind="subtitles"></video></div><div class="dr5emd-sublist"><details translate="yes"><summary translate="yes">字幕一覧(クリック)</summary> <p translate="yes">
(<a href="#" class="imk-cue" data-seek="0:00" translate="no">00:00:00</a>) ええとですね、NotebookLM活用ということで、<br>
(<a href="#" class="imk-cue" data-seek="0:05" translate="no">00:00:05</a>) 日々の備忘録を全自動でAIの頭にですね、還流させる仕組み、<br>
(<a href="#" class="imk-cue" data-seek="0:11" translate="no">00:00:11</a>) エコシステムを作りましたので紹介します。<br>
(<a href="#" class="imk-cue" data-seek="0:17" translate="no">00:00:17</a>) 「君だけの『天才AI相棒』を作る魔法の仕組み」なんて書かれてますが、<br>
(<a href="#" class="imk-cue" data-seek="0:23" translate="no">00:00:23</a>) まあ、それほど大げさなもんではないです。<br>
(<a href="#" class="imk-cue" data-seek="0:27" translate="no">00:00:27</a>) 現状の課題を整理しますと、<br>
(<a href="#" class="imk-cue" data-seek="0:32" translate="no">00:00:32</a>) AIの頭の中っていうのはですね、<br>
(<a href="#" class="imk-cue" data-seek="0:36" translate="no">00:00:36</a>) 人間がアレコレ情報を取ってきては、そのまま勝手にどんどん中に放り込むのでですね、<br>
(<a href="#" class="imk-cue" data-seek="0:43" translate="no">00:00:43</a>) まあ、すぐにゴミ屋敷状態になってしまいます。<br>
(<a href="#" class="imk-cue" data-seek="0:48" translate="no">00:00:48</a>) まあ、一度に読み込める数には制限があるので、<br>
(<a href="#" class="imk-cue" data-seek="0:53" translate="no">00:00:53</a>) すぐ限界がくる。容量オーバー、ということが起きます。<br>
(<a href="#" class="imk-cue" data-seek="0:59" translate="no">00:00:59</a>) また、あとですね、<br>
(<a href="#" class="imk-cue" data-seek="1:03" translate="no">00:01:03</a>) NotebookLMにつけるソースはですね、フォルダごとの設定ができないんですね。<br>
(<a href="#" class="imk-cue" data-seek="1:08" translate="no">00:01:08</a>) 残念ながら、1枚ずつGoogleドキュメントとかスプレッドシートなどをですね、<br>
(<a href="#" class="imk-cue" data-seek="1:13" translate="no">00:01:13</a>) 1枚ずつ手作業で登録するということになります。<br>
(<a href="#" class="imk-cue" data-seek="1:23" translate="no">00:01:23</a>) これがまあ、結構超めんどくさいってこともあります。<br>
(<a href="#" class="imk-cue" data-seek="1:28" translate="no">00:01:28</a>) それから、そのソースに登録する、チャットをした場合ですね、<br>
(<a href="#" class="imk-cue" data-seek="1:34" translate="no">00:01:34</a>) 「メモに保存」っていうのを選ぶんですが、<br>
(<a href="#" class="imk-cue" data-seek="1:40" translate="no">00:01:40</a>) 残念ながらですね、その仕組みがちょっとまだ何て言うかな、中途半端で、<br>
(<a href="#" class="imk-cue" data-seek="1:47" translate="no">00:01:47</a>) その質問者の質問内容がですね、残らないんですね。<br>
(<a href="#" class="imk-cue" data-seek="1:56" translate="no">00:01:56</a>) AIからの回答、それがですね、保存されるんです。<br>
(<a href="#" class="imk-cue" data-seek="2:02" translate="no">00:02:02</a>) だから、あとで見返したときに、<br>
(<a href="#" class="imk-cue" data-seek="2:05" translate="no">00:02:05</a>) 自分がどんな質問をしたことに対しての返答かという、関係がわからなくなるんですね。<br>
(<a href="#" class="imk-cue" data-seek="2:12" translate="no">00:02:12</a>) これは非常によろしくないです。<br>
(<a href="#" class="imk-cue" data-seek="2:15" translate="no">00:02:15</a>) そこで、「メモに保存」というのは使わなくて、<br>
(<a href="#" class="imk-cue" data-seek="2:20" translate="no">00:02:20</a>) チャットで表示された自分の質問とAIの返答をすべてコピーして、<br>
(<a href="#" class="imk-cue" data-seek="2:29" translate="no">00:02:29</a>) それをテキストファイルに貼り付ける。<br>
(<a href="#" class="imk-cue" data-seek="2:37" translate="no">00:02:37</a>) その内容をさらに要約すると。<br>
(<a href="#" class="imk-cue" data-seek="2:41" translate="no">00:02:41</a>) それを、その今作ったテキストファイルに貼り付けるということをします。<br>
(<a href="#" class="imk-cue" data-seek="2:48" translate="no">00:02:48</a>) それを、そのパソコンにある専用のフォルダに放り込む。「note_sum」っていうフォルダに放り込むわけです。<br>
(<a href="#" class="imk-cue" data-seek="2:58" translate="no">00:02:58</a>) そうすると、その後Pythonを中心としたシステムが動いて、<br>
(<a href="#" class="imk-cue" data-seek="3:05" translate="no">00:03:05</a>) それをですね、まとめてGoogleドキュメントの方に送り込むということをやります。<br>
(<a href="#" class="imk-cue" data-seek="3:12" translate="no">00:03:12</a>) そのGoogleドキュメントですけれども、<br>
(<a href="#" class="imk-cue" data-seek="3:16" translate="no">00:03:16</a>) 今10本のファイルにしてありまして、<br>
(<a href="#" class="imk-cue" data-seek="3:20" translate="no">00:03:20</a>) その1つのGoogleドキュメントの中に、今、30個のテキストファイルが入るように設定してあります。<br>
(<a href="#" class="imk-cue" data-seek="3:30" translate="no">00:03:30</a>) その中身はですね、最新順にどんどん自動アップデートされるようになっていて、<br>
(<a href="#" class="imk-cue" data-seek="3:37" translate="no">00:03:37</a>) 常に新しいものから順番に読み込むというようなですね、仕組みになってます。<br>
(<a href="#" class="imk-cue" data-seek="3:45" translate="no">00:03:45</a>) 何分にもAIっていうのは、まだまだ頭が良くなくて、<br>
(<a href="#" class="imk-cue" data-seek="3:50" translate="no">00:03:50</a>) 一番最新に読み込んだ情報をよく覚えているということになりますので、<br>
(<a href="#" class="imk-cue" data-seek="3:59" translate="no">00:03:59</a>) 今はそういう使い方をするしかないという状況です。<br>
(<a href="#" class="imk-cue" data-seek="4:00" translate="no">00:04:00</a>) 本の中身だけを最新順に自動アップデートすると。<br>
(<a href="#" class="imk-cue" data-seek="4:05" translate="no">00:04:05</a>) 「断捨離も連動」って書いてありますけれども、<br>
(<a href="#" class="imk-cue" data-seek="4:12" translate="no">00:04:12</a>) 要は、この「note_sum」フォルダからですね、<br>
(<a href="#" class="imk-cue" data-seek="4:16" translate="no">00:04:16</a>) テキストファイルを削除すれば、自動的にGoogleドキュメントの中身を削除されるという関係になります。<br>
(<a href="#" class="imk-cue" data-seek="4:26" translate="no">00:04:26</a>) そういうような形で、Googleドキュメントが整理されるので、それをノートブックにリンクさせておく。<br>
(<a href="#" class="imk-cue" data-seek="4:33" translate="no">00:04:33</a>) そうすれば、新しい情報を追加すると、<br>
(<a href="#" class="imk-cue" data-seek="4:42" translate="no">00:04:42</a>) ほぼ即座にNotebookLMが新しい情報を取得できるようになるという関係です。<br>
(<a href="#" class="imk-cue" data-seek="4:53" translate="no">00:04:53</a>) そういうところのですね、仕組みを新たに追加しました。<br>
(<a href="#" class="imk-cue" data-seek="4:57" translate="no">00:04:57</a>) 以上でした。<br>
</p> </details>
<style>
details { font: 16px "Open Sans", Calibri, sans-serif; width: 100%; }
details > summary { padding: 2px 6px; width: 100%; background-color: #ddd; border: none; box-shadow: 3px 3px 4px black; cursor: pointer; list-style: none; }
details > p { font: 14px "Open Sans", Calibri, sans-serif; height:150px; overflow: scroll; background-color: #EDF7FF; padding: 2px 6px; margin: 0; box-shadow: 3px 3px 4px black; }
</style>
</div></div>            <script>
            document.addEventListener("DOMContentLoaded", function(){
                var video = document.getElementById("myVideo");
                if(!video) return;

                            });
            </script>
            

  <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 = ''; 
      }

      function isSpecialMode() {
        var isFs = !!(document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement);
        var isPiP = !!(document.pictureInPictureElement && document.pictureInPictureElement === video) || (video.webkitPresentationMode === "picture-in-picture");
        var isIOSFs = !!video.webkitDisplayingFullscreen; 
        return isFs || isPiP || isIOSFs;
      }

      // 初期状態のセット（リストがなければ最初から showing に）
      try {
        if(video.textTracks && video.textTracks.length > 0){
          for(var i=0; i<video.textTracks.length; i++){
             if(video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions'){
                 video.textTracks[i].mode = (!listContainer) ? "showing" : "hidden";
             }
          }
        }
      } catch(e){}

      // 字幕一覧が存在する場合のみ、リストのフォーマット処理を行う
      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(_){}
            });
          }
      }

      // ★ dr52.php と全く同じ「常時監視」のロジック
      // これにより、Safariが読み込み遅延を起こしても確実にONになります
      video.addEventListener("timeupdate", function(){
        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++){
                    if((video.textTracks[i].kind === 'subtitles' || video.textTracks[i].kind === 'captions') && video.textTracks[i].mode !== desiredMode) {
                        video.textTracks[i].mode = desiredMode;
                    }
                }
            }
        } catch(e){}

        // リストがない場合はこれ以降のハイライト処理をスキップ
        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">考え方としては、自分にとってのほぼ全ての分野を網羅するNotebookLMを一つ持って、なんでも相談できる相手に育てたいというところです。</p>



<a rel="noopener" target="_blank" href="https://docs.google.com/presentation/d/1rndjesC2orBsrCojLktlcN6TaUzQQNBXgu-F7E0OzmY/edit?usp=sharing" 
>
<img decoding="async" src="https://docs.google.com/presentation/d/1rndjesC2orBsrCojLktlcN6TaUzQQNBXgu-F7E0OzmY/export/svg"
></a>



<div class="wp-block-cocoon-blocks-toggle-box-1 toggle-wrap toggle-box block-box not-nested-style cocoon-block-toggle"><input id="toggle-checkbox-202607210716370" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202607210716370"><strong><span class="marker">コードと要約</span><span class="marker">(クリック)</span></strong></label><div class="toggle-content">
<figure class="wp-block-flexible-table-block-table"><table class="has-fixed-layout"><tbody><tr><td>要約：このシステムは、ローカルの指定フォルダにあるテキストファイルをGoogleドキュメントへ自動同期するものです。主要なコンポーネントは以下の通りです。 1. `sync_note_sum.py`: ローカルフォルダ内の`.txt`ファイルを更新日時順に取得し、複数のGoogleドキュメントに目次付きで分割して同期（上書き）します。Google Docs APIを利用し、認証情報を管理しながら実行します。 2. `watcher_note_sum.py`: `sync_note_sum.py`と連携し、監視対象フォルダ内の`.txt`ファイルの変更をリアルタイムで検知します。変更後、5秒のクールダウン期間を経て`sync_note_sum.py`を自動実行し、Googleドキュメントの同期をトリガーします。これにより、ファイル更新時に自動で同期が行われます。 3. `com.XXXXXX.notesum-updater.plist`: macOSのLaunchAgents設定ファイルで、ユーザーログイン時に`watcher_note_sum.py`を自動的にバックグラウンドで起動・常駐させます。これにより、システムは常に稼働し、ローカルのメモをGoogleドキュメントに最新の状態に保つ自動化された環境を提供します。</td></tr><tr><td><a href="https://imakat.com/script_list/?pubtxt=%E5%82%99%E5%BF%98%E9%8C%B2%E3%81%AEnotebookLM%E3%81%BB%E3%81%8B%E5%85%A8%E8%87%AA%E5%8B%95%E5%90%8C%E6%9C%9F%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3_pub.txt" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=zrU95MiY.png" alt="" style="width:120px; height:auto;"></a></td></tr><tr><td>公開スクリプトに関するお問い合わせは以下へ↓</td></tr><tr><td><a rel="noopener" target="_blank" href="https://notebooklm.google.com/notebook/aa64cc3d-0160-4433-b934-ecc5ab902287"><img decoding="async" src="https://imakat.com/rd.php?id=NgFHFYXH.png" alt="" style="width:120px; height:auto;"></a></td></tr></tbody></table></figure>
</div></div>



<h2 class="wp-block-heading"><strong>１　現状の課題：AIの知識ソース管理の壁</strong> </h2>



<p class="wp-block-paragraph">NotebookLMやGeminiなどのAIエージェントに自分専用の知識を持たせる際、直面するのが以下の壁です。</p>



<ul class="wp-block-list">
<li><strong>フォルダごとの登録ができない：</strong> Googleドライブのフォルダを丸ごと指定して読み込ませることができません。<br></li>



<li><strong>ソース数の上限：</strong> メモを1件1件テキストファイル等で追加していくと、すぐに上限（現状はNotebookLMで無料版は50個など）に達し、ナレッジベースが「ゴミ屋敷化」してしまいます。<br></li>



<li><strong>「メモに保存」機能の弱点：</strong> AI側の標準機能でメモを保存すると、AIの回答だけが残り、「自分がどのような前提条件や問題意識で質問したか」という文脈が欠落しがちです。<br></li>
</ul>



<h2 class="wp-block-heading"><strong>２　解決策：ローカルの「note_sum」フォルダを起点とした全自動・製本パイプライン</strong> </h2>



<p class="wp-block-paragraph">これらの課題を解決するため、私は「手元のMacでメモを保存するだけで、裏でシステムが自動的に複数のメモを束ねてGoogleドキュメント（Gdoc）化し、AIへ同期する」仕組みを構築しました。</p>



<h3 class="wp-block-heading"><strong>① 作成とトリアージ（選別）はローカルで</strong></h3>



<p class="wp-block-paragraph">AIとの対話で「これは残したい！」と思った瞬間、自作の『<a href="https://imakat.com/2025/10/12/27668/" target="_blank">Gemini/ChatGPT連携_要約保存Mac用スクリプト</a>』を使って、まずは「要約＋本文」のテキストファイルとして一時保存します。 そして、後で時間があるときに「本当にAIの知識に組み込む価値があるか」を判断（トリアージ）し、有益なものだけをMac内の指定フォルダ（note_sum）へポンと放り込みます。</p>



<p class="wp-block-paragraph">特に有効な使い方は、<strong>トラブル対策の作業記録(備忘録)</strong>としての活用です。 トラブル発生から解決、そして記録保存までの流れは以下の通りです。</p>



<ol class="wp-block-list">
<li><strong>NotebookLMで状況説明</strong> 2026年7月現在、チャット欄にスクリーンショットを直接貼れないため、少し手間ですが「ソース」欄にスクショを貼り付けてから状況を説明します。</li>



<li><strong>Gemini / AI Studio(あるいはChatGPT Claudeなど)でコード修正</strong> エラー対策の多くはコード修正になるため、より適したGeminiやGoogle AI Studio、あるいは他のAIにチャットを移行し、作業を完結させます。</li>



<li><strong>テキストファイルへの記録と保存</strong> 複数のAIを渡り歩いた一連のやり取りをtxtファイルにコピペし、要約を追記して「note_sum」フォルダに保存します。</li>
</ol>



<p class="wp-block-paragraph">この一連の作業記録を（最終的にソースとして）NotebookLMに集約しておくことで、<strong>あちこちのAIで散らばった全プロセスが1箇所に保存され</strong>、非常に安心です。</p>



<h3 class="wp-block-heading"><strong>② 常駐システムによる「自動製本」</strong></h3>



<p class="wp-block-paragraph">note_sum フォルダにテキストファイルが入ると、バックグラウンドで待機している監視スクリプト（watcher_note_sum.py）が自動検知します。 システムは、フォルダ内のテキストファイルを更新順に並べ替え、目次を自動生成し、1冊につき当面は30個のメモを収納した分厚い「備忘録まとめ」へと束ねていきます。</p>



<h3 class="wp-block-heading"><strong>③ 「聖域」の固定ID・Gdocを上書き更新</strong> </h3>



<p class="wp-block-paragraph">システムは、新しくファイルを作るのではなく、Googleドライブの絶対に動かさない場所（cannot_moved/gdoc_imakat/）にあらかじめ用意しておいた当面10個の「空のGdoc」の中身だけを、APIを使って丸ごと最新の状態に書き換えます。</p>



<h2 class="wp-block-heading"><strong>３　このエコシステムを導入するメリット</strong></h2>



<ul class="wp-block-list">
<li><strong>操作の手間がゼロ：</strong> ファイルのID自体は変わらないため、NotebookLMの自動同期機能が完璧に働き、私が何もしなくても勝手にAIの頭脳が最新の備忘録にアップデートされ続けます。<br></li>



<li><strong>NotebookLMのソース数の限界を突破できる感：</strong>2026年7月現在、NotebookLMの最大ソース数は300個となっています。しかしメモやgdocをそのままソースに追加すると、そのままソース数を消費してしまいます。しかし今回の方法を使えば、一つのgdocの中に現在設定で30個のtxtファイルが入ります。単純の計算で、内容的には300&#215;30個=9000個のソースが追加できるようになります。<br></li>



<li><strong>いつでも思考の続きからスタート：</strong> 過去の深い考察やトラブル解決の文脈がAIに共有されているため、久しぶりにそのテーマを扱う際も、前提条件を説明する手間が省けます。</li>



<li><strong>txtファイルはどこでも再利用できる：</strong>上の続きですが、ローカルのnote_sumフォルダにあるtxtファイルは、そのまま、Gemini Gemほか生成AIにコピペでき万能です。<br></li>



<li><strong>ゴミ屋敷化の防止と断捨離の連動：</strong> ローカルの note_sum フォルダから不要になったtxtファイルを削除すれば、システムが即座にGdoc内を丸ごと書き直すため、AIの知識からも跡形もなく消え去ります。「ローカルのフォルダ整理＝AIの脳内の整理」が直結しています。<br></li>
</ul>



<h2 class="wp-block-heading"><strong>おわりに</strong></h2>



<p class="wp-block-paragraph">システムが自動で行うべき「面倒な処理（Gdoc化と同期）」は裏側のPythonとLaunchAgentに完璧に任せ、人間は最も重要な「トリアージ（選別・移動）」だけを行う。これこそが、人とAIの完璧な役割分担だと感じています。 当面最大300件(=30txtファイルx10gdocファイル)の備忘録を全自動で受け入れるこの「特大の本棚」に、これからも様々な有益な情報を追加して、AIの考察レベルを限界まで引き上げていこうと思います。</p>



<p class="wp-block-paragraph">以上</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">29358</post-id>	</item>
		<item>
		<title>【NotebookLM活用】第２弾、コード生成のエコシステムを作ってみた</title>
		<link>https://imakat.com/2026/06/18/29269/</link>
		
		<dc:creator><![CDATA[imakat]]></dc:creator>
		<pubDate>Thu, 18 Jun 2026 12:39:33 +0000</pubDate>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[デジタル]]></category>
		<category><![CDATA[ものづくり]]></category>
		<category><![CDATA[Gem]]></category>
		<category><![CDATA[NotebookLM]]></category>
		<category><![CDATA[Google AI Studio]]></category>
		<guid isPermaLink="false">https://imakat.com/?p=29269</guid>

					<description><![CDATA[先日、生成AI（Gem）を活用したコード生成システム（投稿ID-28530）を紹介しましたが、世界中で生成AIへの需要が集中しているせいか、現在の環境にはいくつか大きな悩ましい問題が出てきました 。 現状の混沌とした状況 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">先日、生成AI（Gem）を活用したコード生成システム（投稿<a href="https://imakat.com/2026/02/16/28530/" target="_blank">ID-28530</a>）を紹介しましたが、世界中で生成AIへの需要が集中しているせいか、現在の環境にはいくつか大きな悩ましい問題が出てきました 。</p>



<p class="wp-block-paragraph">現状の混沌とした状況で、私がAntigravityのようなAIに丸投げして自動処理に委ねるのは時期尚早 。そこで今回は、仕組みを大幅に改善した「第２弾：コード作成のエコシステム」を構築しましたのでご紹介します 。</p>



<p class="wp-block-paragraph">私は現在、Google AI Proを利用中です。</p>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=eySC95du.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=eySC95du.png" alt="" style="width:311px;height:auto"/></a></figure>



<h2 class="wp-block-heading"><strong>現状の課題：コード生成の「利用制限」と「中抜け」</strong></h2>



<p class="wp-block-paragraph">現在、AIによるコード生成において、主に次の2つの問題に直面しています。</p>



<ol class="wp-block-list">
<li>利用制限の壁：アクセス集中により、すぐに利用制限を超えてしまう 。</li>



<li>長文コードの欠落（中抜け）：特に長文のコードを生成しようとすると、全文記述をお願いしても、途中が省略されたり欠落したまま出力されるエラーが頻発する 。</li>
</ol>



<p class="wp-block-paragraph">部分ごとに完成させる方法もありますが、最終的には全体を通して動作させる必要があるため、やはり「修正済みの全文」をそのまま出力してほしいのが本音です 。</p>



<h2 class="wp-block-heading"><strong>解決策：NotebookLM × Gem × AI Studioの連携エコシステム</strong></h2>



<p class="wp-block-paragraph">これらの課題を解決するため、それぞれのAIの強みを活かした連携フローを組みました。</p>



<a rel="noopener" target="_blank" href="https://docs.google.com/presentation/d/1j-mEqNO_4LKjnv9UHr1PnJuzlumQ_y8q8i1DxO2zkko/edit?usp=sharing" 
>
<img decoding="async" src="https://docs.google.com/presentation/d/1j-mEqNO_4LKjnv9UHr1PnJuzlumQ_y8q8i1DxO2zkko/export/svg"
></a>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">【エラー発生・新規開発】<br>&nbsp; ▼<br>1. NotebookLMに相談（現状分析 ＆ 指示書の作成）<br>&nbsp; ▼<br>2. コードの長さに応じて分岐<br>&nbsp; ├─ 通常（600行未満） ⇒ Gemに依頼（生のコードを使用）<br>&nbsp; └─ 長文（600行以上） ⇒ Google AI Studioに依頼（秘匿化コードを使用）<br></p>



<h3 class="wp-block-heading"><strong>① NotebookLM：仕様の自動同期と「指示書」の作成</strong></h3>



<p class="wp-block-paragraph">最近のアップデートにより、NotebookLMのソースに登録したGoogleドキュメント、スプレッドシート、スライドが自動同期されるようになりました 。これにより、現在動作中の最新コードを常にNotebookLMに理解・分析させることができます 。</p>



<p class="wp-block-paragraph">万が一エラーが出た場合は、画面のスクリーンショットなどをソースに追加して、現状に即した対策を講じてもらうことも可能です 。</p>



<p class="wp-block-paragraph">&#x1f4a1; ポイント ：NotebookLMはまだコーディング能力や長文出力が非力なため、「Gemに処理を引き継ぐための指示書（プロンプト）」を出力させる役割に集中させます 。</p>



<h3 class="wp-block-heading"><strong>② Gem（通常コード）：テスト実行から検証まで</strong></h3>



<p class="wp-block-paragraph">NotebookLMが作った指示書を、使い慣れたGemにコピペします 。Gemには現在動作中のコード（Googleドキュメント）が同期されているため、指示書を渡すだけでスムーズにコーディング、テスト実行、検証まで完結できます 。大半の小〜中規模なコードは、このGemの環境で問題なく処理できます 。</p>



<p class="wp-block-paragraph">&#x1f4a1; ポイント ：Gemには、NotebookLMを知識ソースとして付けることができます。さらにそのNotebookLMに付いているソースをGemが理解できる仕組みにはなっていますが、どうも情報が遠いのか薄くなり欠落が生じやすいです(26年6月)。従って現状、Gemの知識ソースとしてコード(gdoc)を同期させる方が、はるかに精度が高いです。</p>



<h3 class="wp-block-heading"><strong>③ Google AI Studio（長文コード：600行以上）：中抜け対策の切り札</strong></h3>



<p class="wp-block-paragraph">マイライブラリの中核となるGAS（Google Apps Script）や一部のPHPなど、600行を超える長文コードで「中抜け」を防ぎたいときだけ、オプションとしてGoogle AI Studioを利用します 。</p>



<ul class="wp-block-list">
<li>セキュリティ対策（秘匿化）：AI Studioは基本無料で強力ですが、データが外部へ漏洩するリスクがあります 。そのため、外部公開用のフォルダ（scripts_pub）内にある、重要な情報（APIキーやパスワード等）を隠した「秘匿化コード（_pub.txt）」をコピペして作業を行います 。</li>
</ul>



<p class="wp-block-paragraph">&#x1f4a1; ポイント ：一応、600行を境界として、GemとAI Studioを選別する考えではありますが、作業途中で行数が境を上下することはあり得ますので、実際はほとんどは管理者である私が判断することになります。実際は、長文コードであっても、修正箇所と修正方法が容易である場合は、NotebookLMの返答あるいはGemとのやり取りで解決することになります。AI Studioを使うのは、大掛かりで困難になった時だけになると思います。</p>



<h3 class="wp-block-heading"><strong>④ </strong>GoogleAIProからAIPlusにダウングレードした時に、境界行数を変更する</h3>



<p class="wp-block-paragraph">コーディング作業はいつも高度な能力が必要なわけではなく、安定期や軽微な修正、小規模な新規開発なら能力を下げても問題は起きません。AIProは月2900円、AIPlusは月725円とびっくりするほどの料金の差があります。ですから、考え方としては、高度なコーディングを行いたい時には、AIProにアップグレードして、安定期はAIPlusにダウングレードするという柔軟な運用を行いたいです。そのAIPlusのダウングレードに合わせて、上記の境界行数をたとえば<strong>600行から300行に変更する</strong>、といった対応を行えば良いわけです。AIPlusにしたときに、ストレージが400GBに制限される点は、私の場合、別途、DAS棚田システムにて、自動的にコントロールがされます。</p>



<h2 class="wp-block-heading"><strong>このエコシステムを導入するメリット</strong></h2>



<ul class="wp-block-list">
<li>エラー対応の迅速化：最新のコードが自動同期されているため、前提条件をいちいち説明する手間が省けます 。</li>



<li>コードの品質安定：長文コードをAI Studioに任せることで、イライラする「コードの中抜け」を完全に回避できます 。</li>



<li>安全性の確保：無料の強力なAIを使いつつも、秘匿化コードを挟むことでセキュリティリスクを最小限に抑えられます 。</li>
</ul>



<h2 class="wp-block-heading"><strong>今後の展望：1年後の「第３弾」へ向けて</strong></h2>



<p class="wp-block-paragraph">現時点（2026年6月）では、私が考えるベストな組み合わせですが、もし将来的にNotebookLMが長文コードの出力を得意とするようになれば、全ての作業が1つで完結します 。</p>



<p class="wp-block-paragraph">テクノロジーの進化スピードを考えると、1年後くらいにはNotebookLMやGemのさらなる改善によって、もっとシンプルな「第３弾のエコシステム」へ移行していることでしょう 。</p>



<h3 class="wp-block-heading"><strong>終わりに：私のAIとの付き合い方</strong></h3>



<p class="wp-block-paragraph">私がデジタル分野に触れているのは、趣味としての楽しみと認知症防止のためです 。そのため、生成AIの利用も以下のように2つに分けて、無理のないペースで楽しんでいます 。</p>



<ol class="wp-block-list">
<li>専門的な利用：このimakatブログやシステムの維持・改善（Google Gemini中心）</li>



<li>日常的な利用：生活サポート（Apple製品中心なので、Siri AIにゆったり親しむ方向）</li>
</ol>



<p class="wp-block-paragraph">あまりお金をかけず、最新技術の恩恵を賢く受けながら、これからもマイペースに開発を楽しんでいこうと思います 。</p>



<p class="wp-block-paragraph">以上</p>



<figure class="wp-block-image size-large is-resized"><a href="https://imakat.com/rd.php?id=j6Uyit2K.png" target="_blank"><img decoding="async" src="https://imakat.com/rd.php?id=j6Uyit2K.png" alt="" style="aspect-ratio:0.9162586106730849;width:276px;height:auto"/></a></figure>



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