<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hajime</title>
    <description>The latest articles on DEV Community by Hajime (@marketer2234).</description>
    <link>https://dev.to/marketer2234</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4099962%2Fd827964b-50f0-4697-ac1a-956fe96a91c5.png</url>
      <title>DEV Community: Hajime</title>
      <link>https://dev.to/marketer2234</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marketer2234"/>
    <language>en</language>
    <item>
      <title>見出しと概要だけを持ち、本文は原文へ返す — 業界ニュースの扱い方</title>
      <dc:creator>Hajime</dc:creator>
      <pubDate>Thu, 10 Sep 2026 01:11:58 +0000</pubDate>
      <link>https://dev.to/marketer2234/jian-chu-sitogai-yao-dakewochi-ti-ben-wen-hayuan-wen-hefan-su-ye-jie-niyusunoxi-ifang-51he</link>
      <guid>https://dev.to/marketer2234/jian-chu-sitogai-yao-dakewochi-ti-ben-wen-hayuan-wen-hefan-su-ye-jie-niyusunoxi-ifang-51he</guid>
      <description>&lt;h1&gt;
  
  
  見出しと概要だけを持ち、本文は原文へ返す — 業界ニュースの扱い方
&lt;/h1&gt;

&lt;p&gt;業界のニュースを1か所に集めたい、という要望は珍しくありません。実装だけを考えるなら、取ってきて保存して並べれば終わります。&lt;/p&gt;

&lt;p&gt;厄介なのは、集めたものが&lt;strong&gt;他人の書いた記事&lt;/strong&gt;だという点です。ここをどう扱うかで、設計はまるごと変わります。&lt;/p&gt;

&lt;p&gt;印刷業界のニュースを扱っているサイトが、この方針を明記していたので、設計の観点から読み解いてみます。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbtmvavwnscxk3ekahf1d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbtmvavwnscxk3ekahf1d.png" alt="PrintBiz" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://print-biz.net" rel="noopener noreferrer"&gt;印刷業界のニュースと展示会情報は PrintBiz&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  書かれていた方針
&lt;/h2&gt;

&lt;p&gt;サイトの記載はこうでした。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;掲載するのは&lt;strong&gt;見出しと概要だけ&lt;/strong&gt;で、&lt;strong&gt;出典は必ず明記する&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;本文は必ず原文へリンク&lt;/strong&gt;する&lt;/li&gt;
&lt;li&gt;掲載についての指摘や削除の申し出は、問い合わせ窓口で受ける&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3行ですが、データの持ち方が決まる3行です。&lt;/p&gt;

&lt;h2&gt;
  
  
  保存するもの / 保存しないもの
&lt;/h2&gt;

&lt;p&gt;この方針を素直にモデルに落とすと、こうなります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;持つもの&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;見出し&lt;/li&gt;
&lt;li&gt;概要(自分たちの言葉で書いたもの)&lt;/li&gt;
&lt;li&gt;出典(発信元の名前)&lt;/li&gt;
&lt;li&gt;原文の URL&lt;/li&gt;
&lt;li&gt;公開日時&lt;/li&gt;
&lt;li&gt;カテゴリ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;持たないもの&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;本文&lt;/li&gt;
&lt;li&gt;本文中の画像&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;本文を持たないと決めると、全文検索は成立しません。検索の対象は見出しと概要だけになります。ここを「機能の削減」と見るか「持たない設計の帰結」と見るかで、実装の方針が分かれます。&lt;/p&gt;

&lt;h2&gt;
  
  
  表示の側で必要になること
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs2ed2g76b4geryuqe8o6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs2ed2g76b4geryuqe8o6.png" alt="ニュース一覧" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;本文を持たないなら、一覧の情報量は見出しと概要で決まります。並べ方も効いてきます。&lt;/p&gt;

&lt;p&gt;記事のカテゴリは、機材・技術、パッケージ・紙器、サイン・大判、DX・ソフトウェア、経営・業界動向、実務・ノウハウ、環境・サステナ、展示会・セミナー、調査・市場の9つに分かれていました。&lt;/p&gt;

&lt;p&gt;ニュースの見出しの例として、こういう粒度のものが並んでいます。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;段ボールを使った地域循環型の CO₂ 削減ビジネスの話&lt;/li&gt;
&lt;li&gt;RFID の国際標準規格「TDS2.0」に対応したソリューションの開発&lt;/li&gt;
&lt;li&gt;QR コードを届け先ごとに変えて DM の反応を見る取り組み&lt;/li&gt;
&lt;li&gt;プリンタ向けのソフトウェア RIP の提供開始&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;同じ「印刷」でも、環境の話と RFID の話と DM の話が並ぶ。&lt;/strong&gt;カテゴリを9つに割っているのは、この幅を1本の時系列に流し込まないためだと読めます。&lt;/p&gt;

&lt;h2&gt;
  
  
  削除依頼を受け付ける、ということ
&lt;/h2&gt;

&lt;p&gt;方針の3行目に、指摘・削除依頼を受け付けると書かれていました。運用として当たり前に見えますが、データ構造の要件でもあります。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;レコードを&lt;strong&gt;論理削除できる&lt;/strong&gt;こと&lt;/li&gt;
&lt;li&gt;どの掲載がどの出典に対応するかを&lt;strong&gt;あとから引ける&lt;/strong&gt;こと&lt;/li&gt;
&lt;li&gt;一覧・カテゴリ・ランキングなど、&lt;strong&gt;同じレコードを参照している場所すべてから消える&lt;/strong&gt;こと&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;集めるだけなら追記で済みますが、消せる前提で作るなら、参照の持ち方から変わります。&lt;/p&gt;

&lt;h2&gt;
  
  
  展示会は別のデータになる
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv84uec49r04scuy5nz7n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv84uec49r04scuy5nz7n.png" alt="展示会カレンダー" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;同じサイトでも、展示会は性質の違うデータでした。ニュースが「時点」なのに対して、展示会は&lt;strong&gt;期間&lt;/strong&gt;です。&lt;/p&gt;

&lt;p&gt;掲載件数は終了分を含めて39件(2026年9月9日時点)。会期の並びを見ると、&lt;strong&gt;10月14〜16日に東京で3つ重なり&lt;/strong&gt;(TOKYO PACK / ラベルフォーラムジャパン / プレミアム・インセンティブショー秋)、10月7〜9日にも2つ重なっていました。&lt;/p&gt;

&lt;p&gt;さらに、数年に一度のものが混ざります。日本の総合印刷展 IGAS は2027年8月、ドイツの drupa は2028年5月、包装の interpack は2029年6月。&lt;strong&gt;同じテーブルに入れると、直近の一覧から数年先のものが消えたり、逆に居座ったりします。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;名称の変更も起きます。ラベル関連の国際展は Labelexpo から LOUPE になり、Americas / Europe / Asia が別々の年に開かれる形でした。&lt;strong&gt;識別子を名前にすると、改名で切れます。&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;本文を持たないと決めるだけで、&lt;strong&gt;保存するもの・検索できるもの・消せる範囲&lt;/strong&gt;がすべて決まる&lt;/li&gt;
&lt;li&gt;出典と原文 URL は本文の代わりではなく、&lt;strong&gt;掲載の根拠&lt;/strong&gt;として持つ&lt;/li&gt;
&lt;li&gt;削除依頼を受け付ける運用は、&lt;strong&gt;論理削除と参照の整理&lt;/strong&gt;を前提にする&lt;/li&gt;
&lt;li&gt;「時点」のニュースと「期間」の展示会は、同じ一覧に流し込まない&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;集める仕組みを作る前に、&lt;strong&gt;何を持たないかを先に決める&lt;/strong&gt;。今回いちばん学びになったのはそこでした。&lt;/p&gt;

&lt;p&gt;本ページはプロモーションが含まれています&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>rss</category>
      <category>japan</category>
    </item>
    <item>
      <title>出典表示コンポーネントを、義務の有無で出し分ける</title>
      <dc:creator>Hajime</dc:creator>
      <pubDate>Sun, 30 Aug 2026 00:42:48 +0000</pubDate>
      <link>https://dev.to/marketer2234/chu-dian-biao-shi-konponentowo-yi-wu-noyou-wu-dechu-sifen-keru-bi7</link>
      <guid>https://dev.to/marketer2234/chu-dian-biao-shi-konponentowo-yi-wu-noyou-wu-dechu-sifen-keru-bi7</guid>
      <description>&lt;h1&gt;
  
  
  出典表示コンポーネントを、義務の有無で出し分ける
&lt;/h1&gt;

&lt;p&gt;外部から取り込んだ素材を表示するとき、クレジット表記をどう出すか。地味ですが、条件によって出し方が変わるので分岐が要る部分です。&lt;/p&gt;

&lt;p&gt;素材の入手方法そのものはここでは扱いません。&lt;strong&gt;手元にある素材に、どんな表示を添えるか&lt;/strong&gt;という表示層の話です。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3cka5o6e10bioifz1blv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3cka5o6e10bioifz1blv.png" alt="名画の時間" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://meiganotoki.com/" rel="noopener noreferrer"&gt;出典と確認日を作品ページに出している名画の時間&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  表示の要件は3通りある
&lt;/h2&gt;

&lt;p&gt;利用条件によって、表示側の要件が変わります。&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;条件&lt;/th&gt;
&lt;th&gt;出典表示&lt;/th&gt;
&lt;th&gt;実装上の扱い&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;出典表示が必須のもの&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;必須&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;省略できない。表示位置も検討対象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;表示義務のないもの&lt;/td&gt;
&lt;td&gt;任意&lt;/td&gt;
&lt;td&gt;出すかどうかはこちらの方針&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;権利が切れている状態の表示&lt;/td&gt;
&lt;td&gt;任意&lt;/td&gt;
&lt;td&gt;同上。ただし「誰かが放棄した」ではない&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;3行目を2行目と同じ扱いにしてよいかは、少し考える余地があります。前者は提供元の意思表示ではなく、状態を述べているだけだからです。表示文面を「提供: ◯◯」とするか「所蔵: ◯◯」とするかで、含意が変わります。&lt;/p&gt;

&lt;h2&gt;
  
  
  分岐をコンポーネントに閉じ込める
&lt;/h2&gt;

&lt;p&gt;呼び出し側で条件分岐を書くと、表示漏れが起きます。表示の判断はコンポーネント側に持たせるのが安全でした。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Credit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;rights&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// rights = { sourceName, sourceUrl, rightsText, checkedAt, requiresAttribution }&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;requiresAttribution&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;figcaption&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"credit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;rights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sourceName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* 義務がなくても出す方針にしている。出すこと自体は害にならない */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;details&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;利用条件&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rights-raw"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;rights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rightsText&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt; &lt;span class="na"&gt;dateTime&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;rights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;checkedAt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;確認: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;checkedAt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;details&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;required&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"required-note"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;出典表示が必要な素材です&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;figcaption&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ポイントは2つです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;義務がなくても出す方を既定にする。&lt;/strong&gt; 表示して困ることはまずありません。逆に、義務があるのに出していない状態は事故です。既定を「出す」にしておくと、分岐を間違えたときの失敗が軽くなります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;原文を読める場所を用意する。&lt;/strong&gt; 要約した一行だけを出すと、後から検証できません。折りたたみの中でよいので、提供元の文面をそのまま置いておきます。&lt;/p&gt;

&lt;h2&gt;
  
  
  確認日を表に出す
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2n1r2488lltnas7nf99n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2n1r2488lltnas7nf99n.png" alt="作品ページ" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;time&amp;gt;&lt;/code&gt; で確認日を出しているのは、権利の状態が固定ではないためです。&lt;/p&gt;

&lt;p&gt;提供元が方針を変えることも、特定の対象を公開から外すこともあります。表示している内容が「いつ時点のものか」が読み手に分かる状態にしておくと、情報の鮮度を判断してもらえます。&lt;/p&gt;

&lt;p&gt;社内向けの管理画面だけでなく、公開ページにも出しておく価値があると思っています。表示があること自体が、記録を取っている証明になるからです。&lt;/p&gt;

&lt;h2&gt;
  
  
  クレジットを画像に焼き込まない
&lt;/h2&gt;

&lt;p&gt;たまに見かける実装ですが、クレジットを画像そのものに合成するのは避けたほうがよいです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;条件が変わったときに差し替えられない&lt;/li&gt;
&lt;li&gt;読み上げに乗らない&lt;/li&gt;
&lt;li&gt;翻訳できない&lt;/li&gt;
&lt;li&gt;表示のスタイルを後から変えられない&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;テキストとしてマークアップし、CSSで見た目を整えるほうが、結局のところ扱いやすくなります。&lt;/p&gt;

&lt;h2&gt;
  
  
  alt テキストに条件を書かない
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;alt&lt;/code&gt; は画像の内容を説明する属性です。ここに利用条件を書くと、スクリーンリーダーの読み上げが本題からずれます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* 良くない */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"風景画 CC0 ◯◯美術館"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* 分ける */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"夕暮れの河岸を描いた風景画"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;figcaption&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;◯◯美術館&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;figcaption&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;条件は &lt;code&gt;figcaption&lt;/code&gt; や隣接要素に置き、&lt;code&gt;alt&lt;/code&gt; は内容の説明に専念させます。&lt;/p&gt;

&lt;h2&gt;
  
  
  実例
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvf8ydnpnljq29cxyu1f4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvf8ydnpnljq29cxyu1f4.png" alt="作品をさがす" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;名画の時間は、作品ページに提供元と権利表示を出したうえで、確認した日付まで持っている旨を公開しています。CC0 のように表示義務がないものでも出典を明記する方針だと明示されていて、上に書いた「既定を出す側に倒す」という考え方と一致します。&lt;/p&gt;

&lt;p&gt;表示は義務を満たすためだけの機能ではなく、&lt;strong&gt;どこまで確かめたかを読み手に見せる機能&lt;/strong&gt;でもあるのだと思います。&lt;/p&gt;

&lt;p&gt;本ページはプロモーションが含まれています&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>design</category>
      <category>license</category>
    </item>
    <item>
      <title>配信先7社の入力制約をJSONにして、原稿を投稿前に検査する</title>
      <dc:creator>Hajime</dc:creator>
      <pubDate>Sat, 29 Aug 2026 10:49:47 +0000</pubDate>
      <link>https://dev.to/marketer2234/checking-whether-your-published-backlinks-actually-survived-a-tiny-shell-workflow-2mm3</link>
      <guid>https://dev.to/marketer2234/checking-whether-your-published-backlinks-actually-survived-a-tiny-shell-workflow-2mm3</guid>
      <description>&lt;h1&gt;
  
  
  配信先7社の入力制約をJSONにして、原稿を投稿前に検査する
&lt;/h1&gt;

&lt;p&gt;プレスリリースを複数の配信サービスに出していると、フォームを開いてから「文字数が足りない」「画像が1枚足りない」で止まります。7社それぞれ制約が違うので、毎回そこで時間を使っていました。&lt;/p&gt;

&lt;p&gt;そこで&lt;strong&gt;制約をデータにして、投稿前に原稿を検査する&lt;/strong&gt;ようにしました。この記事はその作り方と、実際に7社のフォームを取得して集めた制約値です(2026年8月実測)。&lt;/p&gt;

&lt;h2&gt;
  
  
  制約をデータにする
&lt;/h2&gt;

&lt;p&gt;サービスごとの制約を1つのJSONにまとめます。コードに条件を書き散らさず、データとして持つのが要点です。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prerele"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body_min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"prfree"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"service_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body_min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"image_min_width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"image_max_mb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pressnow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sections_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"section_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"extra_fields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"subtitle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lead"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"legal_name"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"directpress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lead_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                   &lt;/span&gt;&lt;span class="nl"&gt;"public_contact_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"https"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tsunagugu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lead_min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lead_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"body_min"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                 &lt;/span&gt;&lt;span class="nl"&gt;"headings_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"heading_max"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;body_min&lt;/code&gt; と &lt;code&gt;body_max&lt;/code&gt; が&lt;strong&gt;両方ある&lt;/strong&gt;のがこの領域の面倒なところで、DirectPress! だけ上限、他は下限です。&lt;/p&gt;

&lt;h2&gt;
  
  
  検査する
&lt;/h2&gt;

&lt;p&gt;原稿から本文・タイトル・画像枚数を取り出して、各サービスの条件に当てはめます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 例: 本文の文字数を数える(HTMLタグを除いた実文字数)&lt;/span&gt;
&lt;span class="nv"&gt;body_len&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="s1"&gt;'s/&amp;lt;[^&amp;gt;]*&amp;gt;//g'&lt;/span&gt; draft.html | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'[:space:]'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="nt"&gt;--argjson&lt;/span&gt; n &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$body_len&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'
  to_entries[]
  | select((.value.body_min // 0) &amp;gt; $n or (.value.body_max // 1e9) &amp;lt; $n)
  | "\(.key): 本文 \($n)字 は範囲外 (min=\(.value.body_min // "-") max=\(.value.body_max // "-"))"
'&lt;/span&gt; limits.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;これを投稿前に流すだけで、フォームで止まることがほぼ無くなりました。&lt;/p&gt;

&lt;h2&gt;
  
  
  集めた制約値
&lt;/h2&gt;

&lt;p&gt;以下は各社のフォームを実際に取得して確認した値です。&lt;/p&gt;

&lt;h3&gt;
  
  
  Zero Press
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2coyy53zlfmqlwequgcz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2coyy53zlfmqlwequgcz.png" alt="Zero Press" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;登録料・配信料・掲載料がすべて0円で、大手メディア20社への告知もこの範囲に入ります。掲載されたリリースは、タレントや芸人のSNSで拡散されることがあります。&lt;/p&gt;

&lt;p&gt;この記事の趣旨で言うと、&lt;strong&gt;検査すべき制約が少ない&lt;/strong&gt;のが特徴でした。以降で見ていくとおり、他社は文字数の上下限や必須項目に加えて「掲載後にやること」まで条件に含みます。そこは原稿の検査では拾えません。&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://zero-press.net/" rel="noopener noreferrer"&gt;制約の少ない無料プレスリリース配信ならZeroPress&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ぷれりり
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4gbowdf4rf3qblcm99w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4gbowdf4rf3qblcm99w.png" alt="ぷれりり" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;body_min: 250&lt;/code&gt; / 画像1枚 / 住所・電話ともに不要。会員登録も不要です。審査は最短5分・通過率95%と案内されており、投稿した当日に掲載されました。&lt;/p&gt;

&lt;p&gt;データに入れておくべきなのは&lt;strong&gt;修正不可&lt;/strong&gt;というフラグです。公開後の修正・削除ができないため、検査を通す優先度が他社より高くなります。掲載記事の本文リンク5本は &lt;code&gt;rel&lt;/code&gt; 属性なしで dofollow でした。&lt;/p&gt;

&lt;h3&gt;
  
  
  PR FREE
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgmmu42dv7fxl3r9nrkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgmmu42dv7fxl3r9nrkv.png" alt="PR FREE" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;制約が最も細かい部類です。サービス名10字、タイトル30字、本文300字以上、&lt;strong&gt;HTMLは使用不可&lt;/strong&gt;、画像は横600px以上・2MBまでを1枚。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;html: false&lt;/code&gt; は検査項目として重要で、他社向けに作ったHTML入りの原稿をそのまま渡すと崩れます。プレーンテキスト版を別に生成する分岐が要ります。&lt;/p&gt;

&lt;p&gt;投稿数に上限はなく当日に掲載されましたが、サイトURL欄は &lt;code&gt;rel="nofollow external noopener ugc"&lt;/code&gt;、本文中のURLはリンク化されずテキスト表示でした。&lt;/p&gt;

&lt;h3&gt;
  
  
  FREE PRESS RELEASE
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flskgbf1j6z5sfg65gjc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flskgbf1j6z5sfg65gjc6.png" alt="FREE PRESS RELEASE" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;文字数より&lt;strong&gt;値の形式&lt;/strong&gt;が問われます。電話番号は&lt;strong&gt;ハイフン必須&lt;/strong&gt;、連絡先はURL形式でメールアドレス不可、担当者名は実名でニックネーム・部署名は不可。&lt;/p&gt;

&lt;p&gt;つまり検査は正規表現の仕事になります。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-qE&lt;/span&gt; &lt;span class="s1"&gt;'^0[0-9]{1,4}-[0-9]{1,4}-[0-9]{3,4}$'&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$phone&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'phone: ハイフン必須'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;入口に&lt;strong&gt;Googleアカウントでのログインが必須&lt;/strong&gt;である点も、運用側の前提として持っておく必要があります。審査は最短1時間〜7営業日、リンクは dofollow でした。&lt;/p&gt;

&lt;h3&gt;
  
  
  PRESSNOW
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11b6mw2cnmmvt3xm8bpw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11b6mw2cnmmvt3xm8bpw.png" alt="PRESSNOW" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;他社に無い項目が3つあります。&lt;strong&gt;サブタイトル、リード文、正式社名&lt;/strong&gt;。原稿のデータ構造にこの3つが無いと、ここだけ手作業になります。&lt;/p&gt;

&lt;p&gt;本文は見出し+本文のセクションを最大5つ、各2,000字まで。検査はセクション単位で回す必要があります。&lt;/p&gt;

&lt;p&gt;そして&lt;strong&gt;原稿の検査では拾えない条件&lt;/strong&gt;があります。掲載後3営業日以内に自社サイトへPRESSNOWの紹介ページを設置し、URLを編集部へ返信すること。SNS・無料ブログ・短縮URLでは要件を満たしません。審査は1時間から3営業日。追加URLは最大5本置けるものの実測では原則 nofollow で、公開後の修正・削除も原則できません。&lt;/p&gt;

&lt;h3&gt;
  
  
  DirectPress!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffl2w02fmptu8si0iigj1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffl2w02fmptu8si0iigj1.png" alt="DirectPress!" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;唯一 &lt;code&gt;body_max&lt;/code&gt; を持つサービス&lt;/strong&gt;です。本文3,000字以内、タイトル50字以内、概要リード文300字以内。他社の下限に合わせて長く書いた原稿は、ここで削ることになります。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;public_contact_max: 500&lt;/code&gt; の公開連絡先はそのまま公開され、記載が不明確だと掲載されません。URL欄は任意です。掲載は1日2〜8件、掲載日時は選べません。&lt;/p&gt;

&lt;p&gt;技術的には &lt;code&gt;https: false&lt;/code&gt; をデータに持たせておくのが実務的でした。&lt;strong&gt;httpのみでhttps非対応&lt;/strong&gt;なので、URLを組み立てる処理でスキームを決め打ちにしていると落ちます。&lt;/p&gt;

&lt;h3&gt;
  
  
  ツナググ
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffher9vg249usadpeoi7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffher9vg249usadpeoi7s.png" alt="ツナググ" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;images: 2&lt;/code&gt; が効きます。&lt;strong&gt;画像2枚が必須なのは7社でここだけ&lt;/strong&gt;なので、1枚しか用意していないと止まります。&lt;/p&gt;

&lt;p&gt;冒頭文が &lt;code&gt;lead_min: 50&lt;/code&gt; / &lt;code&gt;lead_max: 200&lt;/code&gt; と上下限の両方を持つのも特徴です。タイトル40字以内、本文300字以上、見出しは40字×最大3。&lt;/p&gt;

&lt;p&gt;運用条件も重く、2026年2月17日適用の利用条件で、配信後に記事URLを自社サイトやSNSで告知し、告知先を指定フォームへ報告する義務があります。報告がない場合は1記事あたり10,000円+税と明記されています。掲載後の修正が1,000円、掲載6ヶ月未満での削除が1,000円。無料で出せるのは月5配信までで、6本目からは1万円。住所と電話番号は公開されます。リンクは &lt;code&gt;rel="noopener noreferrer"&lt;/code&gt; のみが付き、dofollow でした。掲載までは数日かかっています。&lt;/p&gt;

&lt;h2&gt;
  
  
  まとめ
&lt;/h2&gt;

&lt;p&gt;制約をデータにして分かったことです。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;下限と上限が混在する。&lt;/strong&gt; DirectPress! だけ本文が上限で、他は下限&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;枚数が違う。&lt;/strong&gt; ツナググだけ画像2枚&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;形式の検査が要る項目がある。&lt;/strong&gt; 電話番号のハイフン、連絡先のURL形式&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;他社に無い項目がある。&lt;/strong&gt; PRESSNOW のサブタイトル・リード文・正式社名&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;原稿の検査では拾えない条件がある。&lt;/strong&gt; 掲載後の作業義務は別に管理する&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最後の1点だけはデータに入れても検査になりません。掲載後に何かを要求するサービスかどうかは、採用を決める段階で分けておくのが結局いちばん早いです。&lt;/p&gt;

&lt;p&gt;本ページはプロモーションが含まれています&lt;/p&gt;

</description>
      <category>pressreleasesjapaneo</category>
    </item>
  </channel>
</rss>
