<?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>棚田式ファイル管理 | imakat.com</title>
	<atom:link href="https://imakat.com/tag/%E6%A3%9A%E7%94%B0%E5%BC%8F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E7%AE%A1%E7%90%86/feed/" rel="self" type="application/rss+xml" />
	<link>https://imakat.com</link>
	<description>工夫と改善で人生をちょっと豊かに</description>
	<lastBuildDate>Mon, 23 Mar 2026 20:39:30 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</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>棚田式ファイル管理 | 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>デジタル成果物を効率的に管理・配信する2つの自作システム</title>
		<link>https://imakat.com/2026/03/16/28734/</link>
		
		<dc:creator><![CDATA[imakat]]></dc:creator>
		<pubDate>Mon, 16 Mar 2026 05:26:51 +0000</pubDate>
				<category><![CDATA[デジタル]]></category>
		<category><![CDATA[ものづくり]]></category>
		<category><![CDATA[マイライブラリ]]></category>
		<category><![CDATA[棚田式ファイル管理]]></category>
		<category><![CDATA[メタデータ]]></category>
		<guid isPermaLink="false">https://imakat.com/?p=28734</guid>

					<description><![CDATA[今回は、動画や画像といった「デジタル成果物」を効率よく生成し、スムーズに流通（配信・管理）させるための独自の仕組みについてお話しします。 日々増え続ける大容量データをどのように安全かつ柔軟に扱うか、悩んでいる方も多いので [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>今回は、動画や画像といった「デジタル成果物」を効率よく生成し、スムーズに流通（配信・管理）させるための独自の仕組みについてお話しします。</p>



<p>日々増え続ける大容量データをどのように安全かつ柔軟に扱うか、悩んでいる方も多いのではないでしょうか？</p>



<p>詳しい解説は以下の動画にまとめていますので、まずはご覧ください。</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; /* dynamicと合わせた基本サイズ */
    font-weight: normal;
    text-decoration: underline;
    color: #0073aa;
  }
  .sc-dynamic-embed .sc-link a:hover { text-decoration: none; color: #000; }
  
  /* ★スマホ画面（幅500px以下）の時は文字を縮小して統一感を出す */
  @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=75" target="_blank"
         onclick="return scStopAndGo(event, this);">
        👉低画質・枠外字幕はこちら
      </a>
    </p>
  </div>

  <br />
<b>Warning</b>:  file_get_contents(https://imakat.com/gd_proxy/?f=videoct.json): Failed to open stream: HTTP request failed! HTTP/1.1 429 Too Many Requests
 in <b>/home/imakat/imakat.com/public_html/wp-content/themes/cocoon-child-master/dr52emd.php</b> on line <b>32</b><br />


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

    /* -----------------------------------------------
       1. 動画・音声の保護機能（右クリック禁止・DL防止）
       ----------------------------------------------- */
    function protectVideo() {
      var target = wrapper ? wrapper : document;
      // ★修正箇所：videoだけでなくaudioも保護の対象に含めました
      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);
      });
    }

    /* -----------------------------------------------
       2. 字幕制御＆ハイライト機能
       ----------------------------------------------- */
    function initSubtitles() {
      var target = wrapper ? wrapper : document;
      // ★修正箇所：videoだけでなくaudioも取得できるようにしました
      var video = target.querySelector('video, audio');
      var listContainer = target.querySelector('details > p');
      
      if (!video || !listContainer) 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;
      }

      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 = "hidden";
             }
          }
        }
      } catch(e){}

      video.addEventListener("webkitbeginfullscreen", function() {
          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 = "showing";
                  }
              }
          } catch(e){}
      });
      video.addEventListener("webkitendfullscreen", function() {
          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 = "hidden";
                  }
              }
          } catch(e){}
      });

      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";
      }

      function parseTs(ts){
        if(!ts) return null;
        var p = ts.trim().split(":").map(function(x){return parseInt(x,10)||0;});
        if(p.length===2) return p[0]*60 + p[1];
        if(p.length===3) return p[0]*3600 + p[1]*60 + p[2];
        return null;
      }

      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 sec = parseTs(a.getAttribute("data-seek"));
          if(sec==null) return;
          try{ video.currentTime = sec; if(video.paused) video.play(); }catch(_){}
        });
      }

      video.addEventListener("timeupdate", function(){
        var desiredMode = isSpecialMode() ? "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){}

        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 t = parseTs(cues[i].getAttribute("data-seek"));
            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); 

    /* -----------------------------------------------
       3. 画面遷移時の停止機能
       ----------------------------------------------- */
    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>



<h3 class="wp-block-heading"><strong>動画で紹介している2つのシステム</strong></h3>



<p>動画内で解説しているのは、私がローカルの <strong>Mac mini</strong> 上で構築・稼働させている以下の2つのシステムです。</p>



<h4 class="wp-block-heading"><strong>1. 配信を自由自在に操る「マイライブラリ」</strong></h4>



<p>Dropboxをデータの「製造工場」として活用し、ウェブ配信用の素材（動画、画像、VTT字幕、書類など）をシームレスに配信所へ渡すシステムです。</p>



<ul class="wp-block-list">
<li><strong>複数の配信所を管理:</strong> 複数の配信サーバーを用意しておき、リクエストや用途に応じて自由自在に配信先を切り替えることが可能です。</li>
</ul>



<h4 class="wp-block-heading"><strong>2. NASの弱点を克服する「棚田式ファイル管理システム」</strong></h4>



<p>一般的なNAS（RAID構成など）は、専用のフォーマットが必要なため「HDDを直接取り外して別のPCですぐに読み込む」といった物理的な使い回しが難しいという弱点があります。そこを解決したのがこのシステムです。</p>



<ul class="wp-block-list">
<li><strong>抜き差ししてすぐ使える:</strong> 一般的な外付けHDDやSSDと同じ感覚で、パコッと抜いて他のPCやMacに挿せば、すぐにデータを読み込めます。</li>



<li><strong>階層型（棚田式）の管理:</strong> データを「作業段」「保管段」「長期保管段」という3つの階層に分けて管理。使わず眠っている古いハードディスクも有効活用できます。</li>
</ul>



<h3 class="wp-block-heading"><strong>2つのシステムに共通する「最大の秘密」</strong></h3>



<p>用途の異なるこの2つのシステムですが、設計の根底には共通する重要なコア技術があります。それは、**「メタデータの変更に基づき、実体データを操作する」**という仕組みです。</p>



<ul class="wp-block-list">
<li><strong>棚田式システムでの活用:</strong><br>いきなり重い実体データを動かすのではなく、まずは「メタデータ」だけを移動させるシミュレーションを何度も実行します。これにより、移動先の容量オーバーや操作ミスを事前に防ぐことができます。</li>



<li><strong>マイライブラリでの活用:</strong><br>スプレッドシートに登録した「属性（メタデータ）」を書き換えるだけで、それに連動して実際のファイルが自動で移動したり、再生サーバーが切り替わったりします。<br><br>もともとマイライブラリは、図書館をイメージしていて、図書館の本は質量のある物体のため、それぞれの図書館に受付窓口が必要になりますが、メディアアセットは、質量のない、ほぼ瞬間コピー、瞬間移動ができる存在であるため、図書館カードのようなメタデータは１箇所に集中することができるわけです。その１箇所でメタデータを変更することにより実体データを操作できるわけですね。</li>
</ul>



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



<p>大容量のハードディスクが高価になっている今、手元にあるストレージをいかに安全・確実、そして無駄なく使い切るかは大きなテーマです。</p>



<p>「メタデータによる実体データの制御」を取り入れることで、日々のクリエイティブ作業やデータ管理は驚くほど快適になります。ご自身のファイル管理や配信のヒントにしてみてください。</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">28734</post-id>	</item>
	</channel>
</rss>
