<?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, 05 Oct 2026 19:12:29 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</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>【Notebook活用】第３弾、日々の備忘録を全自動で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で見つけた有益な情報、日々の備忘録を、いかにして無駄なく・手間なくNotebookの知識ソースへ送り込み、自分の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="/ds62/?drid=100" target="_blank"
         onclick="return scStopAndGo(event, this);">
        👉低画質・枠外字幕はこちら
      </a>
    </p>
  </div>

  <!-- ★環境依存排除：[dynamic_external_html] にルート相対パスを指定し、functions.phpにURL動的解決を委ねる設計 -->
  <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>) ~Notebookへ備忘録の反映〜NotebookLM活用ということで、<br>
(<a href="#" class="imk-cue" data-seek="0:04" translate="no">00:00:04</a>) 日々の備忘録を全自動で<br>
(<a href="#" class="imk-cue" data-seek="0:08" translate="no">00:00:08</a>) AIの頭にですね、還流させる仕組み、<br>
(<a href="#" class="imk-cue" data-seek="0:12" translate="no">00:00:12</a>) エコシステムを作りましたので紹介します。<br>
(<a href="#" class="imk-cue" data-seek="0:16" translate="no">00:00:16</a>) 「君だけの天才AI相棒を作る魔法の仕組み」なんて書かれてますが、<br>
(<a href="#" class="imk-cue" data-seek="0:22" translate="no">00:00:22</a>) まあ、それほど大げさなもんではないです。<br>
(<a href="#" class="imk-cue" data-seek="0:26" translate="no">00:00:26</a>) 現状の課題を整理しますと、<br>
(<a href="#" class="imk-cue" data-seek="0:30" translate="no">00:00:30</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:44" translate="no">00:00:44</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:52" translate="no">00:00:52</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:12" translate="no">00:01:12</a>) 残念ながら1枚ずつGoogleドキュメントとかスプレッドシートなどをですね、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:39" translate="no">00:01:39</a>) 残念ながらですね、その仕組みがちょっとまだ中途半端で、<br>
(<a href="#" class="imk-cue" data-seek="1:48" translate="no">00:01:48</a>) 質問者の質問内容がですね、残らないんですね。<br>
(<a href="#" class="imk-cue" data-seek="1:55" translate="no">00:01:55</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:11" translate="no">00:02:11</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:21" translate="no">00:02:21</a>) チャットで表示された自分の質問とAIの返答を全てコピーして、それをテキストファイルに貼り付ける。<br>
(<a href="#" class="imk-cue" data-seek="2:36" translate="no">00:02:36</a>) で、その内容をさらに要約すると。それを今作ったテキストファイルに貼り付けるということをします。<br>
(<a href="#" class="imk-cue" data-seek="2:46" translate="no">00:02:46</a>) それをパソコンにある専用のフォルダに放り込む。note_sumといったようなフォルダに放り込むわけです。<br>
(<a href="#" class="imk-cue" data-seek="2:58" translate="no">00:02:58</a>) そうすると、その後Pythonを中心としたシステムが動いて、それをですね、まとめてGoogleドキュメントの方に送り込むということをやります。<br>
(<a href="#" class="imk-cue" data-seek="3:11" translate="no">00:03:11</a>) で、そのGoogleドキュメントですけれど、今10本のファイルにしてありまして、<br>
(<a href="#" class="imk-cue" data-seek="3:18" translate="no">00:03:18</a>) その1つのGoogleドキュメントの中に、今30個のテキストファイルが入るように設定してあります。<br>
(<a href="#" class="imk-cue" data-seek="3:29" translate="no">00:03:29</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:55" translate="no">00:03:55</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フォルダからですね、テキストファイルを削除すれば、自動的にGoogleドキュメントの中身も削除されるという関係になります。<br>
(<a href="#" class="imk-cue" data-seek="4:27" translate="no">00:04:27</a>) ま、そんなような形でGoogleドキュメントが整理されるので、それをNotebookにリンクさせておく。<br>
(<a href="#" class="imk-cue" data-seek="4:36" translate="no">00:04:36</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:48" translate="no">00:04:48</a>) 新しい情報を取得できるようになるという関係です。<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:59" translate="no">00:04:59</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; }

/* 動画パッケージ（mu1emd, dr5, dr6等）内での上書き専用スタイル */
.mu1emd-sublist details > p, .dr5-sublist details > p, .dr6-sublist details > p {
    display: block;
    min-height: 180px;
    max-height: 240px;
    overflow-y: auto;
    background-color: #EDF7FF;
    padding: 6px 8px;
    margin: 0;
    box-shadow: 3px 3px 4px black;
    border-radius: 0 0 5px 5px;
}
</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 = ''; 
      }

      // 全画面・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">考え方としては、自分にとってのほぼ全ての分野を網羅するNotebookを一つ持って、なんでも相談できる相手に育てたいというところです。</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-202610060412130" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202610060412130"><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">NotebookやGeminiなどのAIエージェントに自分専用の知識を持たせる際、直面するのが以下の壁です。</p>



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



<li><strong>ソース数の上限：</strong> メモを1件1件テキストファイル等で追加していくと、すぐに上限（現状はNotebookで無料版は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でtxtを保存するだけで、裏でシステムが自動的に複数のtxtを束ねて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>』を使って、まずは「要約＋本文」のテキストファイルとして一時保存します(pre_note_sum)。 そして、後で時間があるときに「本当にAIの知識に組み込む価値があるか」を判断（トリアージ）し、有益なものだけをMac内の指定フォルダ（note_sum）へポンと放り込みます。</p>



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



<ol class="wp-block-list">
<li><strong>Notebookで状況説明</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">この一連の作業記録は（最終的にソースとして）Notebookに集約されることになり、<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自体は変わらないため、Notebookの自動同期機能が働き、私が何もしなくても勝手にAIの頭脳が最新の備忘録にアップデートされ続けます。<br></li>



<li><strong>Notebookのソース数の限界を突破できる感：</strong>2026年7月現在、Notebookの最大ソース数は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>【Notebook(旧LM)活用】第２弾、コード生成のエコシステムを作ってみた</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[26.10.6: Gemについては近々廃止になるようです。機能は新しい方法で維持されるとされていますが、一応、Gemを利用しないエコシステムを第３弾で紹介しています。 先日、生成AI（Gem）を活用したコード生成システム [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">26.10.6: Gemについては近々廃止になるようです。機能は新しい方法で維持されるとされていますが、一応、Gemを利用しないエコシステムを<a href="https://imakat.com/2026/06/29/29358/" target="_blank">第３弾</a>で紹介しています。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<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>解決策：Notebook × 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. Notebookに相談（現状分析 ＆ 指示書の作成）<br>&nbsp; ▼<br>2. コードの長さに応じて分岐<br>&nbsp; ├─ 通常（400行未満） ⇒ Gemに依頼（生のコードを使用）<br>&nbsp; └─ 長文（400行以上） ⇒ Google AI Studioに依頼（秘匿化コードを使用）<br></p>



<p class="wp-block-paragraph">【エラー発生】<br>エラー発生の場合は、大抵は、スクショでエラーの状況を説明したいのですが、Notebookでは画像を読めません。そこで、コード生成Gemを使って解析して〜コード生成Gemに、そのままGemで処理するか、AI Studioにリレーするか、Notebookに鳥瞰的に分析させるか〜を判断させます。</p>



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



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



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



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



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



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



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



<p class="wp-block-paragraph">マイライブラリの中核となるGAS（Google Apps Script）や一部のPHPなど、400行を超える長文コードで「中抜け」を防ぎたいときだけ、オプションとして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; ポイント ：一応、400行を境界として、GemとAI Studioを選別する考えではありますが、作業途中で行数が境を上下することはあり得ますので、実際はほとんどは管理者である私が判断することになります。実際は、長文コードであっても、修正箇所と修正方法が容易である場合は、Notebookの返答あるいは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>400行から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>今後の展望：もっとシンプルなエコシステムへ向けて</strong></h2>



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



<p class="wp-block-paragraph">テクノロジーの進化スピードを考えると、1年後くらいにはNotebookや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>
