【ITニュース解説】How An Upload Tracker And Three Platform CSVs Kept My Stock Portfolio From Falling Apart
2026年10月22日に「Dev.to」が公開したITニュース「How An Upload Tracker And Three Platform CSVs Kept My Stock Portfolio From Falling Apart」について初心者にもわかりやすく解説しています。
ITニュース概要
ストック素材の大量アップロード時、CSVヘッダーの誤りや重複投稿で失敗。これを防ぐため、プラットフォームごとに正確なCSVを生成するスクリプトと、アップロード履歴を記録するスクリプトを開発した。これにより、効率的でミスのない作業を実現している。
ITニュース解説
システムエンジニアを目指す皆さんは、日々の作業の中で効率化や自動化の重要性を感じることが多いだろう。この記事は、デジタル素材を複数のオンラインプラットフォームにアップロードするという具体的な作業を通して、いかにシンプルなツールと明確なルールが大きな問題を解決し、作業を安定させるかを教えてくれる。
まず、著者が直面した最初の大きな問題は、素材をアップロードする際に使うCSVファイル(カンマ区切りデータファイル)のヘッダーが間違っていたために、せっかく準備した40個もの素材が全て瞬時に却下されてしまったことだ。これは、Adobe StockやVecteezy、Dreamstimeといった各プラットフォームが、それぞれ異なるCSV形式を要求するためだ。例えば、Adobe Stockは「filename, title, keywords, category, releases」という5つの列を求める一方、Vecteezyは「filename, title, keywords, category」の4列、Dreamstimeはさらに多くのメタデータを必要とするため15列を要求する。もしCSVファイルの最初の行(ヘッダー行)が、プラットフォームが期待する形式と少しでも異なれば、アップロードは内容を確認されることなく即座に失敗してしまう。手作業でマスターCSVをプラットフォームごとに編集する方法は、数ファイル程度なら問題なくても、40ファイル、そして複数のプラットフォームとなると、ミスが発生するリスクが格段に高まる。
この問題の解決策として生まれたのが、「make_metadata.py」というPythonスクリプトだ。このスクリプトは、特定のフォルダにある素材ファイルを指定し、どのプラットフォーム向けかを示すだけで、そのプラットフォームが要求する正確なCSVファイルを自動的に生成してくれる。例えば、python make_metadata.py ./my-assets --platform adobe --out metadata.csvと入力すれば、my-assetsフォルダ内の素材に対し、Adobe Stock向けの正しいヘッダーを持つCSVファイル「metadata.csv」が作成される。このスクリプトの重要な設計思想は、「プラットフォームが要求する列だけを生成し、余計な列は一切追加しない」という点だ。著者は当初、日付やコレクション名など「役立つかもしれない」と感じる列を追加したくなったそうだが、余計な列は即座の却下につながるため、これは避けるべきだと強く主張している。シンプルに、求められる情報だけを提供する、これが確実な方法なのだ。
次に著者が直面したのは「重複投稿」という、誰もが陥りがちな罠だ。例えば、アップロード中にネットワーク接続が途切れてしまい、作業を再実行したとする。すると、既にアップロードされたはずのファイルの一部、あるいは全てが再度アップロードされてしまう可能性がある。さらに悪いことに、ファイルの生成プロセスによっては、同じ素材が異なるファイル名で複数回アップロードされてしまうこともあり得る。ストックフォトプラットフォームは、重複した提出を「品質の低い信号」と見なし、繰り返しの重複投稿はアカウントに警告マーク(フラグ)が付く原因となる。
この恐ろしい問題を解決したのが、「upload_tracker.py」という、これもまたシンプルなPythonスクリプトだ。このスクリプトは、アップロード済みのファイルを記録する「台帳」のような役割を果たす。具体的には、プレーンテキストファイルとして「まだアップロードされていないファイル」のリストを保持し、アップロードスクリプトはこのリストからのみファイルを読み込む。これにより、万が一作業を途中でやり直しても、既に処理されたファイルが再度アップロードされることは物理的に不可能となる。この追跡スクリプトは、Pythonの標準ライブラリだけで動作し、外部パッケージのインストールもデータベースも不要だ。シンプルであるからこそ、確実で信頼性の高いツールとなっている。
さらに、増え続けるデジタル素材を効率的に管理するため、著者は明確なフォルダ構成を導入している。例えば、プロジェクト全体をまとめるproject/、素材の元データや出力結果を置くassets/やoutput/、最終的なパッケージを保存するpacks/、そして何よりも重要なのが、調査メモやスクレイピングログ、参照資料などを保存するresearch/だ。著者は一度「整理整頓」のためにresearch/フォルダの内容を削除してしまい、3つもの製品アイデアの元となる情報を失ってしまったという苦い経験から、research/は永久に保存すべき「生の素材」であり、決して「散らかりもの」ではないと強調している。体系的なフォルダ管理は、ファイルの検索や再利用を容易にし、長期的なプロジェクト運営には不可欠な要素となる。
この一連のシステムは、1 vCPU、2GB RAMという非常に限られたサーバーリソースで稼働していた。この制約が、著者に多くの価値ある習慣を身につけさせた。例えば、画像処理のような重いタスクは、たとえ複数のコアがあっても並行処理させず、一度に一つのプロセスだけを実行する。また、各アセットの処理後にはgc.collect()というメモリ解放のコマンドを呼び出し、メモリが次の処理のために確実に空くようにする。メモリ使用量を測定する際も、平均値ではなく「ピークRSS」(最大メモリ使用量)を監視し、実際のメモリ上限を把握する。重いレンダリング処理は、1ファイルごとにサブプロセスを生成し、処理が完了したらメモリがOSに返却されるように設計することで、システム全体の安定性を保つ。make_metadata.pyやupload_tracker.pyといったスクリプトは、テキストファイルしか扱わないため、これらのメモリ制約の中で非常にスムーズに動作し、外部の依存関係を一切持たない。このような制約の中で培われた最適化の習慣は、たとえより高性能なマシンを使う場合でも、システムの堅牢性と効率性を高める上で非常に有用な教訓となる。
結果として、これらのシンプルなスクリプトと明確なルール、そして体系的なアプローチによって、著者は39ものデジタルプロダクトをパッケージ化し、膨大な量の出力ファイルを安定して管理できるようになった。これらのスクリプトは、単なる推測に基づいて作られたものではなく、実際にプラットフォームが拒否する原因となる「間違ったヘッダー」の情報を元に構築されている。この経験から生まれたツールは「compliance metadata kit」としてまとめられており、デジタルプロダクトを扱う開発者にとって、同様の問題を解決するための実践的なソリューションを提供している。この事例は、複雑な問題を解決するために、必ずしも複雑な技術が必要なわけではなく、シンプルなアイデアと着実な実行が、いかに大きな価値を生み出すかを示している。