<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Jeffrey Heer on Visualizing.JP</title>
        <link>https://visualizing.jp/tags/jeffrey-heer/</link>
        <description>Recent content in Jeffrey Heer on Visualizing.JP</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja-JP</language>
        <copyright>Yuichi Yazaki</copyright>
        <lastBuildDate>Wed, 04 Nov 2026 00:00:00 +0900</lastBuildDate><atom:link href="https://visualizing.jp/tags/jeffrey-heer/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>ドラッグの動きを書かず、ドラッグの結果を並べる──Declarative Dragging</title>
        <link>https://visualizing.jp/declarative-dragging/</link>
        <pubDate>Wed, 04 Nov 2026 00:00:00 +0900</pubDate>
        
        <guid>https://visualizing.jp/declarative-dragging/</guid>
        <description>&lt;img src="https://visualizing.jp/declarative-dragging/images/how-it-works.png" alt="Featured image of post ドラッグの動きを書かず、ドラッグの結果を並べる──Declarative Dragging" /&gt;&lt;p&gt;Declarative Dragging は、ドラッグの動きを座標の計算で書く代わりに、ドラッグの結果として画面が取りうる状態を並べて書く方法です。システムは、並べた状態をそれぞれ前もって描いてみて、要素が行き着く位置から、ドロップ先と途中の動きを組み立てます。&lt;/p&gt;
&lt;p&gt;提案したのは Joshua Horowitz（ジョシュア・ホロウィッツ）、Andrew Blinn（アンドリュー・ブリン）、Jeffrey Heer（ジェフリー・ヒア）の3人です。論文「Declarative Dragging」は UIST 2026（2026年11月2〜5日、デトロイト）で発表され、6本の Best Paper Award の1本に選ばれました。実装は Dragology という TypeScript のライブラリで、MIT ライセンスで公開されています。以下は、著者サイトにある論文 PDF とプロジェクトページに沿います。&lt;/p&gt;
&lt;h2 id=&#34;動きを書く代わりに状態を並べる&#34;&gt;動きを書く代わりに、状態を並べる
&lt;/h2&gt;&lt;p&gt;論文は冒頭で、質の高いドラッグ＆ドロップは作るのが難しいと書きます。ドロップ先の計算、遷移のアニメーション、ドラッグ中のプレビューが要るからです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In many cases, the complexity of drag-and-drop causes interface developers to forsake it entirely in favor of simpler forms and widgets.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;複雑さのせいで、開発者がドラッグをあきらめ、フォームや部品で済ませてしまう、という要旨です。&lt;/p&gt;
&lt;p&gt;仕組みの核は、§3.1 の Scrabble のラックの例です。状態が &lt;code&gt;[A, B, C]&lt;/code&gt; のとき、B をドラッグした結果としてありうる状態は &lt;code&gt;[B, A, C]&lt;/code&gt;、&lt;code&gt;[A, B, C]&lt;/code&gt;（元のまま）、&lt;code&gt;[A, C, B]&lt;/code&gt; の三つです。従来は、それぞれにドロップ先を手で作っていました。ここでは、&lt;strong&gt;三つの状態を描画関数に通して三つのラックを描き、それぞれで B が描かれた位置を取り出します&lt;/strong&gt;。離した瞬間に一番近い位置を選び、その状態に切り替えます。&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/how-it-works.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/how-it-works.png&#34; width=&#34;1600&#34; height=&#34;596&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/how-it-works_hu_7f91dd8c045939fc.png 480w, https://visualizing.jp/declarative-dragging/images/how-it-works_hu_9a981885717c7b40.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;状態を画面に描き、ドラッグ開始時に候補の状態を先に描いて、要素の位置からドロップ先を決める仕組みの図&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;図&#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;状態を画面に描き、ドラッグ開始時に候補の状態を先に描いて、要素の位置からドロップ先を決める仕組みの図&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Horowitz, Blinn, Heer／Declarative Dragging プロジェクトページ「How it works」より引用&lt;/p&gt;
&lt;p&gt;作り手が書くのは、状態を画面に変える描画関数と、ドラッグできる要素ごとの候補の状態の集合だけです。論文はこれを model-driven dragging、前もって描くことを speculative rendering と呼びます。React などの描画関数を、順番の更新だけでなく、枝分かれする未来の状態にも使う、という位置づけです（§2.2）。&lt;/p&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;SVG の画面&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;code&gt;closest&lt;/code&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;code&gt;between&lt;/code&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;code&gt;vary&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DOM の &lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;画面どうしの要素の対応&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;lerpViews&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;ring-of-beads-と-scheduler演算子で途中の動きを選ぶ&#34;&gt;Ring of Beads と Scheduler──演算子で途中の動きを選ぶ
&lt;/h2&gt;&lt;p&gt;ドロップ先が決まっても、途中の動きは決まりません。論文はこれを演算子の組み合わせで選ばせます（§3.2）。各演算子は、ポインタの位置から、その瞬間のプレビューと、いま離したときの状態を返す関数を作ります。&lt;/p&gt;
&lt;p&gt;§4 の Ring of Beads は、数学の教員 Alex が輪に並んだビーズの並べ替えを見せる、という想定です。状態は &lt;code&gt;{beads: [&amp;quot;A&amp;quot;, &amp;quot;B&amp;quot;, &amp;quot;C&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;E&amp;quot;]}&lt;/code&gt;。ビーズの描画に、次の属性を足します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;dragologyOnDrag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newStates&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;beads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;targetIdx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newState&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;structuredClone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;newState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;beads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;splice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;newState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;beads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;splice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;targetIdx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bead&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;newState&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;closest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;newStates&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;前半で、つかんだビーズを各位置に入れ直した状態を作り、最後の行で &lt;code&gt;closest&lt;/code&gt; にまとめます。足すコードはこれだけです。&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/ring-of-beads-closest-floating.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/ring-of-beads-closest-floating.png&#34; width=&#34;1122&#34; height=&#34;569&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/ring-of-beads-closest-floating_hu_48efc8c3e7e64c85.png 480w, https://visualizing.jp/declarative-dragging/images/ring-of-beads-closest-floating_hu_6ef05c23e3892425.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Ring of Beads。上の d.closest(…) では A が途中まで動かず、下の withFloating() 付きでは A がポインタに付いて動く&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;図&#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Ring of Beads。上の d.closest(…) では A が途中まで動かず、下の withFloating() 付きでは A がポインタに付いて動く&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Horowitz, Blinn, Heer／論文「Declarative Dragging」Figure 2 A より引用（Crossref の記載では CC BY 4.0）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;closest&lt;/code&gt; だけでは、A は一番近い位置に飛び移り、最初のうちは動きません。最後の行を &lt;code&gt;d.closest(newStates).withFloating()&lt;/code&gt; にすると、A はポインタに付いて動き、ほかのビーズがよけて落ちる先を予告します。&lt;/p&gt;
&lt;p&gt;動きの理由は、三つの可視化ツールで確かめられます。&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/visualizers-overlay-dropzones-spectree.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/visualizers-overlay-dropzones-spectree.png&#34; width=&#34;902&#34; height=&#34;982&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/visualizers-overlay-dropzones-spectree_hu_46f82c1c7c5e84e9.png 480w, https://visualizing.jp/declarative-dragging/images/visualizers-overlay-dropzones-spectree_hu_1b00f2ae992ef317.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Overlay はポインタと各候補の距離を、Drop Zones はポインタの位置ごとに働く挙動を色分けで、Spec Tree は演算子の木を示す&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;図&#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Overlay はポインタと各候補の距離を、Drop Zones はポインタの位置ごとに働く挙動を色分けで、Spec Tree は演算子の木を示す&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Horowitz, Blinn, Heer／論文「Declarative Dragging」Figure 3 より引用（Crossref の記載では CC BY 4.0）&lt;/p&gt;
&lt;p&gt;Scheduler は、会議を部屋に割り当てる問題です。部屋を変えるドラッグでは、部屋番号だけを変えた状態を並べて &lt;code&gt;between&lt;/code&gt; に渡し、会議の棒を縦の線の上で滑らせます。開始時刻は連続値で並べられないので、&lt;code&gt;vary&lt;/code&gt; を使います。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;dragologyOnDrag&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;vary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;param&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;meetings&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;constraint&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lessThan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;meetings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;lessThan&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;meetings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;meetings&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;end&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;MIN_LENGTH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;]});}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;meetings[i].start&lt;/code&gt; だけを制約の範囲で動かし、端点がポインタに一番近づく値を探し続ける指定です。端点の描き方を後で変えても、この指定は変わりません。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It is expressed semantically, in terms of control over parameters, not fragile coordinate logic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;壊れやすい座標の計算ではなく、パラメータの意味で書かれている、という要旨です。&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/scheduler-between-track.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/scheduler-between-track.png&#34; width=&#34;1081&#34; height=&#34;471&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/scheduler-between-track_hu_8c52e69293cf9c87.png 480w, https://visualizing.jp/declarative-dragging/images/scheduler-between-track_hu_a76d14b08e58fff.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Scheduler。会議の棒が、between の作る縦の線（マゼンタの枠）に沿って部屋の間を滑る&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;図&#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Scheduler。会議の棒が、between の作る縦の線（マゼンタの枠）に沿って部屋の間を滑る&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Horowitz, Blinn, Heer／論文「Declarative Dragging」Figure 2 B より引用（Crossref の記載では CC BY 4.0）&lt;/p&gt;
&lt;p&gt;Figure 4 は、演算子を三種類に分けています。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&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;Primitives（基本の挙動）&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;state&lt;/code&gt;、&lt;code&gt;d.vary&lt;/code&gt;、&lt;code&gt;d.dropTarget&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Combinators（組み合わせ）&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;d.closest&lt;/code&gt;、&lt;code&gt;d.between&lt;/code&gt;、&lt;code&gt;spec.whenFar&lt;/code&gt;、&lt;code&gt;d.switchToStateAndFollow&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Modifiers（機能を重ねる）&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;withFloating&lt;/code&gt;、&lt;code&gt;withSnapRadius&lt;/code&gt;、&lt;code&gt;onDrop&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;式の木と木の写像抽象をつかんで動かす&#34;&gt;式の木と木の写像──抽象をつかんで動かす
&lt;/h2&gt;&lt;p&gt;§6 のデモは、組み合わせを広げます。Animate Algebra は、木の形の式を、交換法則や結合法則に沿ってドラッグで書き換えます。書き換えごとに &lt;code&gt;d.between([state, newState_i])&lt;/code&gt; という線路を作り、それらを &lt;code&gt;d.closest&lt;/code&gt; でまとめます。&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/animate-algebra-tracks.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/animate-algebra-tracks.png&#34; width=&#34;944&#34; height=&#34;701&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/animate-algebra-tracks_hu_1366d975667ae180.png 480w, https://visualizing.jp/declarative-dragging/images/animate-algebra-tracks_hu_d1a79eeaedea3c10.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Animate Algebra。ノードを上へ動かすと交換法則、左へ動かすと結合法則で式が組み替わる&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;図&#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Animate Algebra。ノードを上へ動かすと交換法則、左へ動かすと結合法則で式が組み替わる&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Horowitz, Blinn, Heer／論文「Declarative Dragging」Figure 2 E より引用（Crossref の記載では CC BY 4.0）&lt;/p&gt;
&lt;p&gt;Twisted Trees は、木から木への順序を保つ写像です。候補の状態をすべて一つの &lt;code&gt;between&lt;/code&gt; に入れ、凸包の中を自由に動かせます。動かす間、灰色の円が少しずつ伸び縮みし、このまま進めば何が出入りするかを先に見せます。論文はこれを feedforward と呼びます。&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/twisted-trees-feedforward.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/twisted-trees-feedforward.png&#34; width=&#34;891&#34; height=&#34;578&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/twisted-trees-feedforward_hu_f1495f3d0e42f7fe.png 480w, https://visualizing.jp/declarative-dragging/images/twisted-trees-feedforward_hu_f37dd873ec5e4e6c.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Twisted Trees。黒いノードを動かす途中で、灰色の円が伸び縮みする&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;図&#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Twisted Trees。黒いノードを動かす途中で、灰色の円が伸び縮みする&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Horowitz, Blinn, Heer／論文「Declarative Dragging」Figure 2 F より引用（Crossref の記載では CC BY 4.0）&lt;/p&gt;
&lt;p&gt;論文の後、プロジェクトページには、置換を複数の表現で同時に見せる Permutation lab が加わっています。Horowitz は新しい数学の explorable に取り組んでいる、とページにあります。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;interacting with any one representation fluidly updates the others, even halfway through a drag&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ドラッグの途中でも、ほかの表現が更新される、という要旨です。この動きは&lt;a class=&#34;link&#34; href=&#34;https://declarative-dragging.github.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;プロジェクトページ&lt;/a&gt;の動画で、論文の例は&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=l7v-UwpsEbk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;5分の紹介動画&lt;/a&gt;で見られます。&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/permutation-lab.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/permutation-lab.png&#34; width=&#34;1200&#34; height=&#34;674&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/permutation-lab_hu_46a53d2d5fadf9e6.png 480w, https://visualizing.jp/declarative-dragging/images/permutation-lab_hu_8fcdcd5cbbe354fc.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;Permutation lab。二行記法、置換行列、巡回図、配線図、置換多面体が並ぶ&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;図&#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;Permutation lab。二行記法、置換行列、巡回図、配線図、置換多面体が並ぶ&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Horowitz, Blinn, Heer／Declarative Dragging プロジェクトページ「Since the paper」の動画のポスター画像より引用&lt;/p&gt;
&lt;h2 id=&#34;13人の開発者はどこで驚きどこでつまずいたか&#34;&gt;13人の開発者は、どこで驚き、どこでつまずいたか
&lt;/h2&gt;&lt;p&gt;評価の中心は、ドラッグ＆ドロップを作った経験のある13人へのインタビューです（§7–8）。ゲーム開発者、データ可視化の研究者、教育者などが、1回90〜120分で6つの例を順に進め、うち4つでは参加者が自分でドラッグを実装しようとしました。&lt;/p&gt;
&lt;figure class=&#34;vz-figure gallery-image vz-figure--captioned&#34;&gt;
&lt;a href=&#34;https://visualizing.jp/declarative-dragging/images/study-six-examples.png&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;https://visualizing.jp/declarative-dragging/images/study-six-examples.png&#34; width=&#34;1023&#34; height=&#34;677&#34; srcset=&#34;https://visualizing.jp/declarative-dragging/images/study-six-examples_hu_ddb91b7d7eb62acd.png 480w, https://visualizing.jp/declarative-dragging/images/study-six-examples_hu_6d8061ac42f78d47.png 1024w&#34; sizes=&#34;(min-width: 768px) 700px, 100vw&#34; loading=&#34;lazy&#34; alt=&#34;調査で使った6つの例。Switch、Three-Way Switch、Reorderable List、Slider、Rotary Dial、Timeline&#34;&gt;&lt;/a&gt;&lt;figcaption&gt;&lt;span class=&#34;vz-figure__no&#34; data-label=&#34;図&#34;&gt;&lt;/span&gt;&lt;span class=&#34;vz-figure__text&#34;&gt;調査で使った6つの例。Switch、Three-Way Switch、Reorderable List、Slider、Rotary Dial、Timeline&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;Horowitz, Blinn, Heer／論文「Declarative Dragging」Figure 7 より引用（Crossref の記載では CC BY 4.0）&lt;/p&gt;
&lt;p&gt;参加者は、コードの短さと、色や位置の補間が自動で付くことに驚きました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Once the states (the what) is defined, playing around with how the drag interaction could be in between was much less of a stressful concern…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;状態を決めてしまえば、間の動きをいじっても結果が壊れる心配がない、という P10 の言葉です。&lt;/p&gt;
&lt;p&gt;つまずきは、並べ替えリストの課題に集中しました。論文は &amp;ldquo;a sharp cliff&amp;rdquo; と書き、§8.3 の小見出しを &amp;ldquo;Enumerating states isn&amp;rsquo;t very declarative.&amp;rdquo; としています。P09 は、一つの遷移を考えるのには慣れているが、ドラッグで生じうる N 個の状態をまとめて考えるのは不慣れだった、と述べています。&lt;/p&gt;
&lt;p&gt;LLM のコーディングエージェントによる予備比較もあります（付録 C）。同じ仕様を7通りの手段で各5回実装させ、完全に満たしたのは Dragology で5回中4回、ほかは0〜2回でした。Dragology の条件だけに作者が用意した AGENTS.md を渡しており、作者は &amp;ldquo;overfit&amp;rdquo; の恐れも認めています。人による評価の代わりにはならない、とも断っています。&lt;/p&gt;
&lt;p&gt;限界は §9 にあります。対象は置いた所に要素が残るドラッグ（repositional）が中心で、描くジェスチャーなどは書きにくいか、書けません。マルチタッチにも対応していません。状態を並べる手間は &amp;ldquo;perhaps the biggest conceptual hurdle to adoption&amp;rdquo; とされます。計算コストは状態の数とともに増え、512状態ではドラッグ開始の初期化が1500msを超えました。参加者の偏りも、論文は限界に挙げています。&lt;/p&gt;
&lt;h2 id=&#34;第三者はこの研究をどう見たか&#34;&gt;第三者はこの研究をどう見たか
&lt;/h2&gt;&lt;p&gt;2026年11月4日の時点で、独立した第三者の評価はほとんど見つかりません。13人の発言は著者が集めて選んだものなので、ここには含めません。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&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;UIST 2026 の Best Paper（6本）。基準は &amp;ldquo;originality, research rigor, supporting evidence, clarity, and potential impact&amp;rdquo;。個々の講評は非公開&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;第三者のリポジトリの PR（題名のみ確認）&lt;/td&gt;
          &lt;td&gt;Spencer Chang の playhtml に &amp;ldquo;website: declarative dragging prototype and examples&amp;rdquo; という PR（#678）がある。本文は未確認&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;議論&lt;/td&gt;
          &lt;td&gt;Hacker News への投稿（2026-11-04）は、調査時点でコメント0&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;独立したブログ、講演、SNS 上の論評は見つかりませんでした。&lt;/p&gt;
&lt;h2 id=&#34;使い道&#34;&gt;使い道
&lt;/h2&gt;&lt;p&gt;可視化の仕事に持ち帰れるのは、&lt;strong&gt;描画関数があれば、操作はその関数を何度も呼んで組み立てられる&lt;/strong&gt;という考え方だと読めます。D3 や React でデータから SVG を描いていれば、足すのは状態のリストで済むと考えられます。&lt;/p&gt;
&lt;p&gt;Vega-Lite と比べると、宣言する対象の違いが見えると読めます。Vega-Lite の選択（selection）は、操作の結果を主にデータの絞り込みやエンコーディングにつなぎます。Declarative Dragging は、マークを直接つかんで、図が表す状態そのものを切り替えます。論文が引く Vega と Vega-Lite の文献には、どちらも Heer が著者に入っています。&lt;/p&gt;
&lt;p&gt;Permutation lab のような画面は、連動したビュー（linked views）に近いと読めます。&lt;/p&gt;
&lt;p&gt;一方で、状態を並べる手間は残ります。並べ替えのように組み合わせが増える操作では、状態の数と計算コストを先に見積もる必要があると考えられます。論文 §8.5 は、what と how を分けることが試行の危険を減らす、とまとめています。描画関数と状態の設計を先に固め、途中の動きは演算子を差し替えて比べる。その順番が使い道だと読めます。&lt;/p&gt;
&lt;h2 id=&#34;参考出典&#34;&gt;参考・出典
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;一次情報&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Joshua Horowitz, Andrew Blinn, Jeffrey Heer, &amp;ldquo;Declarative Dragging,&amp;rdquo; &lt;em&gt;Proceedings of the 39th Annual ACM Symposium on User Interface Software and Technology (UIST &amp;lsquo;26)&lt;/em&gt;, 2026, pp. 1–16. &lt;a class=&#34;link&#34; href=&#34;https://doi.org/10.1145/3830398.3830556&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;doi:10.1145/3830398.3830556&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;論文 PDF（著者の版）. &lt;a class=&#34;link&#34; href=&#34;https://andrewblinn.com/papers/D2.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;andrewblinn.com/papers/D2.pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Crossref のメタデータ（ライセンスの記載を含む）. &lt;a class=&#34;link&#34; href=&#34;https://api.crossref.org/works/10.1145/3830398.3830556&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;api.crossref.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Declarative Dragging プロジェクトページ. &lt;a class=&#34;link&#34; href=&#34;https://declarative-dragging.github.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;declarative-dragging.github.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;対話型の補足資料. &lt;a class=&#34;link&#34; href=&#34;https://declarative-dragging.github.io/uist26/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;declarative-dragging.github.io/uist26&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Declarative Dragging - UIST 2026 Submission Video&amp;rdquo;. &lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=l7v-UwpsEbk&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;YouTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dragology（GitHub）. &lt;a class=&#34;link&#34; href=&#34;https://github.com/declarative-dragging/dragology&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github.com/declarative-dragging/dragology&lt;/a&gt; / &lt;a class=&#34;link&#34; href=&#34;https://raw.githubusercontent.com/declarative-dragging/dragology/main/LICENSE&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LICENSE&lt;/a&gt; / &lt;a class=&#34;link&#34; href=&#34;https://raw.githubusercontent.com/declarative-dragging/dragology/main/README.md&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dragology（npm）. &lt;a class=&#34;link&#34; href=&#34;https://www.npmjs.com/package/dragology&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;npmjs.com/package/dragology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dragology デモギャラリー. &lt;a class=&#34;link&#34; href=&#34;https://joshuahhh.com/dragology/#/demos&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;joshuahhh.com/dragology/#/demos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;UIST 2026（会期・会場）. &lt;a class=&#34;link&#34; href=&#34;https://uist.acm.org/2026/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;uist.acm.org/2026&lt;/a&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;UIST 2026 Awards. &lt;a class=&#34;link&#34; href=&#34;https://uist.acm.org/2026/awards/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;uist.acm.org/2026/awards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;spencerc99/playhtml, PR #678 &amp;ldquo;website: declarative dragging prototype and examples&amp;rdquo;（本文は未確認）. &lt;a class=&#34;link&#34; href=&#34;https://github.com/spencerc99/playhtml/pull/678&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hacker News への投稿（調査時点でコメント0）. &lt;a class=&#34;link&#34; href=&#34;https://news.ycombinator.com/item?id=50361586&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;news.ycombinator.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
        </item>
        
    </channel>
</rss>
