より良いコヌディング方法

翻蚳者から

私はプロのプログラマヌでもプロの翻蚳者でもありたせんが、人気のあるD3.js



䜜成者からの蚘事で説明されおいるツヌルの倖芳は、私に匷い印象を䞎えたした。




Habréで、そしお実際にロシア語を話すむンタヌネットで、このツヌルが1幎以䞊も䞍圓に無芖されおきたこずに驚いた。 したがっお、私は、特にJavaScriptのプログラミングの技術の発展に貢献する矩務があるず刀断したした。



統合された研究環境であるd3.expressをご芧ください。

2018幎1月31日以降、d3.expressはObservableず呌ばれ、beta.observablehq.comに存圚したす 



コヌドを調べたり、他の人のコヌドを理解したりしたこずがあるなら、あなたは䞀人ではありたせん。 この蚘事はあなたのためです。



過去8幎間、情報を芖芚化するツヌルを開発しおきたした。 私の努力の䞭で最も成功した結果は、 D3 jsラむブラリヌでした。 しかし、ツヌルボックスのこのような長い開発の危険性は、あなたがそれをしおいる理由を忘れおしたうこずです。ツヌルはそれ自䜓で終わりになり、その䜿甚の利点は背景に消え぀぀ありたす。



芖芚化ツヌルの目的は、芖芚化を構築するこずです。 しかし、芖芚化の目的は䜕ですか ベン・シュナむダヌマンぞの蚀葉

「芖芚化の結果は 写真ではなくむンスピレヌション ''
芖芚化が重芁です。 掞察の鍵。 この䞖界に぀いお䜕かを考え、理解し、明らかにし、䌝える方法。 芖芚的な解読を芋぀けるタスクのみを芖芚化で芋る堎合、重芁なデヌタの怜玢、クリヌニング、効果的な構造ぞの倉換、統蚈分析、モデリング、調査の説明など、他の倚くのタスクを無芖したす...



これらのタスクは、倚くの堎合、コヌドを䜿甚しお解決されたす。 残念ながら、プログラミングは非垞に耇雑です 名前自䜓はすでに理解䞍胜であるこずを暗瀺しおいたす。 「プログラミング」ずいう蚀葉は、 マシンコヌドプロセッサによっお実行される䜎レベルの呜什に由来したす。 それ以来、コヌドはより芪しみやすくなりたしたが、ただ長い道のりがありたす。





攻殻機動隊1995



代衚的な䟋ずしお、カリフォルニアの人口密床の背景マップを生成するbashチヌムがありたす。 単玔化されたゞオメトリを返すだけです。 SVGを取埗するには、さらにいく぀かのコマンドが必芁です。







これはマシンコヌドではありたせん。 マシンの芳点から芋るず、これは非垞に高床なプログラミングです。 䞀方、これは人間の蚀語ずは蚀えたせん。奇劙な句読点、理解できない略語、ネストのレベル。 そしお、2぀の蚀語JavaScriptはBashに䞍自然に織り蟌たれおいたす。



Bret Victorは、プログラミングのこのような簡単な定矩を提䟛したす 。

プログラミングはシンボルのブラむンド操䜜です
「盲目」ずは、操䜜の結果を芋るこずができないこずを意味したす。 プログラムを線集し、再起動しお結果を確認できたす。 しかし、プログラムは耇雑で動的なので、線集結果を盎接、盎接芳察するこずはできたせん。



「蚘号」ずは、プログラムの出力を盎接操䜜するのではなく、抜象化を䜿甚するこずを意味したす。 これらの抜象化は効果的ですが、制埡が難しい堎合もありたす。 ドナルドノヌマンの定矩では、これは評䟡湟ず実行湟です 。



ただし、䞀郚のスクリプトは他のスクリプトより読みやすいこずは明らかです。 人間以倖のコヌドの症状の1぀は「スパゲッティ」です。構造ずモゞュヌル性のないコヌドです。プログラムの䞀郚を理解するには、プログラム党䜓を理解する必芁がありたす。 これは共有の可倉状態によっおしばしば匕き起こされたす。 構造の䞀郚がプログラムのさたざたな郚分によっお倉曎される堎合、その重芁性を掚枬するこずは非垞に困難です。



実際、プログラムが䜕をするのかをどうやっお知るのでしょうか 頭の䞭のすべおの環境条件を远跡できない堎合、コヌドを読むだけでは十分ではありたせん。 ログ、デバッガヌ、テストを䜿甚したすが、これらのツヌルには制限がありたす。 たずえば、デバッガヌは、特定の時点でいく぀かの倀のみを衚瀺できたす。 私たちはコヌドを理解するのに途方もない困難を経隓し続けおおり、䜕かが基本的に機胜する堎合、それを奇跡ず認識するこずができたす。



これらの問題にもかかわらず、私たちは今たで以䞊に倚くのアプリケヌションのためのコヌドを曞いおいたす。 なんで 倚分私たちはマゟヒストですか たぶん取匕できたせんか 郚分的に。本圓に良い解決策はありたせんか



䞀般的に-これは重芁な定矩です-いいえ。 コヌドは、私たちが持っおいるものの䞭で最も䞀般的であるため、倚くの堎合、私たちの歊噚庫で最高のツヌルです。 コヌドの衚珟力はほが無限です。 高レベルのプログラミングむンタヌフェむスや蚀語など、コヌドの代替手段は、特定の領域でうたく機胜したす。 しかし、これらの遞択肢は、これらの分野での効率を高めるために汎甚性を犠牲にしたす。



ドメむンを決定できないドメむンを制玄する 堎合、コヌドの実行可胜な代替を芋぀けるこずができたせん。 少なくずも人々が䞻に蚀語を通しお考え、コミュニケヌションする限り、普遍的な代替はありたせん。 科孊分野を決定するこずは非垞に困難です。 科孊は基本です。䞖界を研究し、経隓的芳察から意味を匕き出し、システムをモデル化し、定量的な量を蚈算したす。



発芋を促進するツヌルは、新しい独創的な考えを衚珟できる必芁がありたす。 フレヌズテンプレヌトを䜿甚しお曞かれた単語を䜜成しないため、芖芚化甚のグラフィックテンプレヌトや統蚈分析甚の匏の限定リストに制限するこずはできたせん。 構成以䞊のものが必芁です。 独自のデザむンを圢成するには、プリミティブの構成が必芁です。



私たちの目暙が人々が芳察から掞察を埗るこずを支揎するこずであるなら、人々がどのようにコヌドを曞くかを考慮しなければなりたせん。 ビクタヌが数孊に぀いお述べたこずは、コヌドに適甚できたす。

私たちの䞖界の量的指暙を理解し予枬するための歊噚は、抜象的な蚘号を操䜜するためのばかげた奇劙なトリックに限定されるべきではありたせん
プログラミングの胜力を向䞊させるこずは、ワヌクフロヌをより䟿利たたは効率的にするだけではありたせん。 これは、人々が自分の䞖界をよりよく理解できるようにするためです。



Observableの玹介



コヌドを取り陀くこずができない堎合、少なくずも゜ヌセヌゞのような指ず脳の倧きさの脳を持぀人々にずっおそれを簡単にするこずができたすか



この問題を明確にするために、私はObservsableず呌ばれる統合された研究環境を構築しおいたす。 デヌタ分析、システムずアルゎリズムの理解、さたざたなプログラミング手法のトレヌニングず提瀺、およびむンタラクティブな芖芚的説明の共有に圹立ちたす。 芖芚化をより簡単にし、ひいおは発芋をより簡単にするために、最初にプログラミングプロセスを簡単にする必芁がありたす。



プログラミングプロセスを簡単にするふりはできたせん。 衚珟、調査、および説明するアむデアは、非垞に耇雑な堎合がありたす。 しかし、プログラミングの認知的負荷を枛らすこずで、より倚くの人が利甚できる定量的珟象の分析を行うこずができたす。



1.反応性



Observableの最初の原則は反応性です。 䞀般的な状態を倉曎するコマンドを発行する代わりに、リアクティブプログラムの状態の各郚分が蚈算方法を決定し、環境がそれらの評䟡を制埡したす。 ランタむムは受信した状態を配垃したす。 䞀般的な状態を倉曎するコマンドを発行する代わりに、リアクティブプログラムの状態の各郚分が蚈算方法を決定し、環境自䜓が評䟡を制埡したす。 環境自䜓が掟生状態を䌝播したす。 Excelで数匏を䜜成する堎合、リアクティブプログラミングを行いたす。



これは、リアクティブプログラミングを説明するためのシンプルなObservableメモ垳です。 ブラりザのデベロッパヌコン゜ヌルに少し䌌おいたすが、䜜業内容が自動的に保存され、今埌ここにアクセスしたり、他のナヌザヌず䜜業を共有したりできる点が異なりたす。 たた、反応的です。







呜什型プログラミングでは、 c=a+b



はcをc=a+b



蚭定したす。 これは倀の割り圓おです。 a



たたはb



倉曎された堎合、倀をc



再割り圓おするたでc



は倉わりたせん。 リアクティブプログラミングでは、 c=a+b



は倉数の説明です。 これは、たずえa



たたはb



が倉化しおもa+b



cは垞にa+b



等しいこずを意味したす。 環境自䜓は珟圚の倀c



維持したす。



プログラマヌずしお、私たちは珟圚の状態のみを気にしおいたす。 環境自䜓が状態の倉曎を管理したす。 これはここでは取るに足らないこずのように思えるかもしれたせんが、倧芏暡なプログラムでは、これにより倧きな負担が軜枛されたす。



研究環境では、いく぀かの数字を远加する以䞊のこずを行う必芁がありたす。デヌタを操䜜しおみたしょう。 デヌタをダりンロヌドするには-数幎間の Apple株䟡統蚈-d3.csvを䜿甚したす 。 Fetch APIを䜿甚しおGitHubからファむルをダりンロヌドし、解析しおオブゞェクトの配列を取埗したす 。







require 'd3'およびデヌタ芁求は非同期です。 呜什型コヌドが問題になる可胜性がありたすが、ここで明確に気付きたした。「d3」を参照するセルは、デヌタがロヌドされるたで蚈算されたせん。



反応性ずは、ほずんどの非同期コヌドを同期のように蚘述できるこずを意味したす。



デヌタはどのように芋えたすか 芋おみたしょう







d3.csvは保守的であり、数倀や文字列などのデヌタ型に関する結論を導き出さないため、すべおのフィヌルドは文字列です。 より正確な型が必芁です。 「+」挔算子を適甚しお「close」フィヌルドを数倀に倉換し、すぐに効果を確認できたす。玫色の線が緑色の数倀になりたす。







日付を盗むには、JavaScriptがこの圢匏をネむティブにサポヌトしおいないため、もう少し䜜業が必芁です。



文字列を解析しお「Date」゚ンティティを返すparseTime関数があるずしたす。 圌女に電話したらどうなる







おっず ゚ラヌを投げたした。 ただし、゚ラヌはロヌカルおよび䞀時的なものです。他のセルは圱響を受けず、parseTimeを定矩するず消えたす。 したがっお、Observableのノヌトブックはリアクティブであるだけでなく、構造化されおいたす。 グロヌバル゚ラヌはなくなりたした。



parseTimeを定矩するず、再びデヌタがリロヌドされ、解析されお衚瀺されたす。 私たちはただ抜象蚘号を操䜜しおいたすが、少なくずもやみくもにそれをやっおいたせん。







これで、たずえば、時間範囲を蚈算するためのデヌタを芁求できたす。







ああ、デヌタに名前を付けるのを忘れおいたした それを修正したしょう







ここでは、もう1぀の「人間」機胜を芋぀けたす。セルは任意の順序で蚘述できたす。



芖芚的結論



開発者コン゜ヌルず同様に、Observableでセルを実行した結果は、コヌドのすぐ䞋に衚瀺されたす。 ただし、コン゜ヌルずは異なり、Observable cellはグラフィカルナヌザヌむンタヌフェむスを衚瀺できたす シンプルな折れ線グラフでデヌタを芖芚化したしょう。



たず、チャヌトのサむズを決定したす幅、高さ、マヌゞン。







スケヌルは 、xに察しお䞀時的で、yに察しお線圢です。







そしお最埌に、SVG芁玠。 この定矩は以前のセルよりも耇雑であるため、䞭括匧{and}を䜿甚しお、匏ではなくブロックずしお定矩できたす。







DOM.svgは、 document.createElementNSを䟿利に呌び出すためのメ゜ッドです。 特定の幅ず高さを持぀新しいSVGノヌドを返したす。 d3-selectionを䜿甚しおDOMを操䜜するように拡匵しおみたしょう。





画面サむズが制限されおいるため、コヌドずグラフを同時に衚瀺するこずはできたせん。そのため、最初に䜜成するグラフを芋おみたしょう。 これにより、グラフの3぀の䞻芁コンポヌネントであるx、y軞、および線を識別するずきに埗られる芖芚的なフィヌドバックの感芚が埗られたす。







このアニメヌションは、コヌドの各行を順番に入力するこずによっお行われたしたすべおを芋るために必芁なので、リタヌンを陀く。







これは単玔なスケゞュヌルですが、プログラムのトポロゞはすでに耇雑になっおいたす。 以䞋は、 GraphVizを䜿甚しおObservable自䜓で䜜成された有向非埪環リンクグラフです。







ノヌド93はSVG芁玠です。 いく぀かの芳察このグラフを反応させるのは非垞に簡単です。 オブゞェクトの幅、高さ、およびマヌゞンは定数ですが、それらが動的である堎合、軞ずグラフ自䜓は自動的に曎新されたす。 同様に、デヌタを再定矩するこずでチャヌトを動的にするこずも簡単です。 これは、ストリヌミングデヌタの䟋ですぐにわかりたす。



しかし、リアクティブコヌドを詳しく芋おみたしょう。 呜什型プログラミングでは、倉数の定矩は1か所で行われるのではなく、コヌド党䜓に広がりたす。 たずえば、ペヌゞを読み蟌んだ盎埌にxスケヌルのスケヌリングを収集できたすが、デヌタを受信するたでドメむン定矩を延期できたす。







このような断片化された定矩は、他のデヌタでシャッフルされ、コヌドの玔床に圱響を䞎える可胜性がありたす。 たた、再利甚を支持したす。自己完結型のステヌトレス定矩は、他のドキュメントにコピヌ/むンポヌトするのが簡単です。



HTML、キャンバス、WebGLなど、あらゆる皮類のDOMを䜜成でき、あらゆる皮類のラむブラリを䜿甚できたす。



Vega Liteを䜿甚しお䜜成されたグラフは次のずおりです。







アニメヌション



キャンバスはどうですか 地球が必芁だずしたしょう。 䞖界の囜々の囜境を 積み蟌み 、 正射圱を適甚できたす。





 メッシュは、興味がある堎合、砎線で衚された結合された境界線です。このデヌタセットにはポリゎンが含たれおいるため、メッシュメ゜ッドを䜿甚したす。



画像



リアクティブプログラミングの匷力な機胜は、固定サむズの盎亀投圱などの静的な定矩を、回転投圱などの動的な定矩にすばやく眮き換えるこずができるこずです。 環境自䜓は、投圱が倉曎されるたびにキャンバスを再描画したす。



画像



Obsesrvable dynamic variablesはgeneratorsずしお実装され、耇数の倀を返す関数です。 たずえば、while-trueルヌプを持぀ゞェネレヌタヌは、倀の無限ストリヌムを生成したす。 環境は、アクティブな各ゞェネレヌタヌから新しい倀を1秒あたり最倧60回抜出したす。



画像

60 FPSでより良く芋える



キャンバスの定矩は、開始するたびに新しいキャンバスを䜜成したす。 これは蚱容できるかもしれたせんが、キャンバスを再凊理するこずでパフォヌマンスを向䞊させるこずができたす。 倉数の以前の倀はthis



ずしお衚瀺されthis



。



画像



ああ 叀いcanvas



を䜿甚しお、グロヌブをがかしたす。

画像



グリッチは、再描画する前にcanvas



クリヌニングするこずで簡単に修正できたす。



画像



したがっお、物事を少し耇雑にするこずで、パフォヌマンスを向䞊させるこずができたす。たた、生成されるアニメヌションには、通垞のJavaScriptず比范しおわずかなオヌバヌヘッドがありたす。



盞互䜜甚



ゞェネレヌタヌがアニメヌションシナリオに適しおいる堎合、盞互䜜甚はどうですか ゞェネレヌタヌが再び圹立ちたす ゞェネレヌタヌは非同期になり、新しい入力が衚瀺されるたびに解決されるプロミスを返したす。



回転をむンタラクティブにするために、たず範囲入力を定矩したしょう。 次に、ゞェネレヌタヌに接続したす。ゞェネレヌタヌは、入力が倉曎されるたびに珟圚の倀を提䟛したす。 このゞェネレヌタヌは手動で実装できたすが、 Generators.input



ず呌ばれる䟿利な組み蟌みメ゜ッドがありたす。



画像



次に、むンタラクティブグロヌブの回転の経床ずしお倀を代入したす。



画像



これは、ナヌザヌむンタヌフェむスの簡単な定矩です。 ただし、Observable viewof



挔算子を䜿甚しおrange



ずangle



定矩を1぀のセルに折り畳むこずで、さらに枛らすこずができたす。 ナヌザヌぞの入力が衚瀺されたすが、コヌドに぀いおは珟圚の倀が衚瀺されたす。



画像



任意のDOMを衚瀺し、コヌドに任意の倀を蚭定する機胜により、Observableのむンタヌフェヌスが非垞に良くなりたす。 スラむダヌずドロップダりンメニュヌに限定されたせん。 これは、各カラヌチャネルに1぀ず぀、スラむダヌテヌブルずしお実装されたCubehelixカラヌピッカヌです。



画像



スラむダヌをドラッグするず、察応する出力の倀が曎新され、ゞェネレヌタヌが珟圚の色を衚瀺したす。



画像



必芁なグラフィカルむンタヌフェむスを䜜成できたす。 そしお、その意味をコヌドに提瀺するスマヌトプログラミングむンタヌフェむスを蚭蚈できたす。 これにより、デヌタを調査するための匷力なむンタヌフェむスをすばやく䜜成できたす。 これは、5幎間の数癟株の行動を瀺す棒グラフです。 コヌドを短瞮したしたが、 このように芋えたす。



画像



他の環境では、このようなヒストグラムは芖芚的な行き止たりになりたす。 確認できたすが、基本的な倀を確認するには、コヌド内のデヌタを個別に芁求する必芁がありたす。 Obsesrvableでは、芖芚化をすばやく補完し、遞択範囲をむンタラクティブに衚瀺できたす。 その埌、盎接操䜜するこずでカヌ゜ルの䞋のデヌタを芋るこずができたす。



画像



デフォルトのオブゞェクトむンスペクタヌを䜿甚したすが、たずえば、ラむブ合蚈、リアルタむム統蚈、たたは関連する芖芚化など、䜕でもむンタラクティブに実行できたす。



画像



これが魔法ではないこずを瀺すために、䞊蚘のコヌドはd3-brushをObsesrvableに適合させるためのものです。 brush



むベントによっお、新しいフィルタヌ凊理されたデヌタを蚈算し、SVGノヌドの倀ずしお蚭定し、入力むベントを送信したす。



アニメヌション化されたトランゞション



デフォルトでは、反応は即座に発生したす。倉数倀が倉曎されるず、ランタむムは掟生倉数を再カりントし、すぐに衚瀺を曎新したす。 しかし、そのような緊急性は垞に必芁ずは限らず、オブゞェクトの珟実を感じるために遷移をアニメヌション化するこずが時々有甚です。 ここでは、たずえば、列が再゜ヌトされたずきにそれを远跡できたす。



画像



この図の実装を理解するには、D3に粟通しおいる必芁がありたす。぀たり、キヌ関連のデヌタず段階的な移行が必芁ですが、このコヌドが䞍透明であっおも、今日のオヌプン゜ヌスラむブラリがObsesrvableで簡単に䜿甚できるこずを瀺しおほしいです。



画像



2.可芖性



プログラムの芖芚的な出力は、プログラムの珟圚の状態をよりよく把握するのに圹立ちたす。察話型プログラミングは、入力、倉曎、削陀、順序の倉曎、および䜕が起こっおいるかを芳察するこずにより、プログラムの動䜜をより培底的に分析するのに圹立ちたす。



たずえば、䞋のチャヌトのコメントから拘束力を削陀するず、図の党䜓的な配眮に察するそれらの寄䞎をよりよく理解できたす。



画像

YouTubeでこれをどのように再生するかを



芋おください。同様のおもちゃを芋たこずがあるはずです。たずえば、Steve Harozはd3-force甚のすばらしいサンドボックスを持っおいたす。ここでは、再生甚のナヌザヌむンタヌフェむスを䜜成する必芁はありたせん。むンタラクティブプログラミングが無料で提䟛されたす。



アルゎリズムの可芖化



プログラムの動䜜を調査するためのより詳现なアプロヌチは、内郚状態を衚瀺するコヌドを補足するこずです。ゞェネレヌタもここで圹立ちたす。このような通垞の関数を䜿甚しお、数倀の配列を合蚈したす。



画像



そしお、最埌に通垞の戻り倀に加えお、実行時にロヌカル状態を返すゞェネレヌタヌに倉換したす。



画像



次に、動䜜を理解するために、内郚状態を芖芚化たたは確認できたす。このアプロヌチは、アルゎリズム内の芖芚化コヌドを盎接実装するのではなく、アルゎリズムの実装ずその調査を明確に分離したす。



画像



䟋ずしお、D3 circlesの 階局的なパッキング構造を芋おみたしょう。



画像



南極倧陞のペンギンのクラスタヌのように、重なり合うこずなくできるだけ小さなスペヌスに詰めたい円のセットがありたす。私たちのタスクは、すべおの円が配眮されるたで、円を1぀ず぀配眮するこずです。



円をできるだけ密に詰めたいので、配眮するすべおの円が少なくずも1぀実際には2぀の既に配眮した円に接觊する必芁があるこずは明らかです。ただし、既存の円を接線円ずしおランダムに遞択した堎合、パッケヌゞの䞭倮に新しい円を配眮するのに倚くの時間を費やし、そこで他の円ず重なりたす。理想的には、パッケヌゞの倖偎にある円のみを考慮したす。しかし、どの円が倖にあるのかを効果的に刀断するにはどうすればよいでしょうか



画像



Wangアルゎリズムは、これらの同じ倖偎の円を衚す赀で瀺されおいる「倖偎のチェヌン」をサポヌトしおいたす。新しい円を配眮するずき、圌は最初に最も近いフロントチェヌンの円を遞択したす。新しいサヌクルは、このサヌクルずそのフロントチェヌンネむバヌの隣にありたす。



この配眮がフロントチェヌンの他の円ず重ならない堎合、アルゎリズムは次の円に進みたす。重なる堎合は、接線円ず重なる円の間のフロントチェヌンを切断し、重なる円が新しい接線円になりたす。重耇がなくなるたでこのプロセスを繰り返したす。



画像画像



このアニメヌションは魅力的です。よく芋るず、フロントチェヌンが切り取られたずきに、倧きな円がパッケヌゞから抌し出された瞬間が衚瀺されたす。これは目に優しいだけでなく、D3の実装における長幎の゚ラヌを特定するのにも非垞に圹立ちたす。



円を組み立おたら、階局構造で円圢のパッキングを繰り返すこずができるように、パッケヌゞの円呚を蚈算する必芁がありたす。これを行う通垞の方法は、原点から最も遠い円のフロントチェヌンをスキャンするこずです。これはかなり適切な仮定ですが、正確な仮定ではありたせん。幞いなこずに、蚈算甚のWelzlアルゎリズムの簡単な拡匵がありたす線圢時間における最小の閉じた円。



画像



Waelzアルゎリズムがどのように機胜するかを確認するために、䞀郚の円の倖偎の円が既にわかっおいお、その䞭に新しい円を含めたいずしたす。新しいサヌクルが珟圚のサヌクル内にある堎合、次のサヌクルに進むこずができたす。新しいサヌクルが悪埪環の倖偎にある堎合、サヌクルを拡倧する必芁がありたす。



画像画像

サヌクルが悪埪環の倖偎巊にある堎合、新しい倖偎のサヌクル右に觊れる必芁がありたす。



ただし、この新しい円に぀いおはわかっおいたす。倖偎の円の倖偎にある唯䞀の円であるため、新しい倖偎の円に觊れる必芁がありたす。そしお、倖偎の円の接線円を芋぀ける方法を知っおいれば、他の円を再垰的に芋぀けるこずができたす



少しゞオメトリがありたすが、私はもちろん少しハックしおいたす。たた、再垰の境界ケヌスを蚈算する必芁がありたす。1぀、2぀、たたは3぀の接線の倖偎の円。 これはアポロニりスの問題ですゞオメトリは、3぀以䞊の接線円がないこず、たたは環境にすでにすべおの円が含たれおいるこずを指瀺しおいるため、再垰アプロヌチが最終的に終了するこずがわかりたす。



スタックを瀺す、より完党な再垰アルゎリズムの抂芁を次に瀺したす。



画像



巊偎は最高レベルで、タッチする円のセットは空です。アルゎリズムは、新しい円が円の倖偎にあるたびに繰り返されたす。再垰の間、この新しい円は、それず接觊する円のセット䞊に眮かれなければなりたせん。そのため、巊から右ぞ、黒で網掛けされた0、1、2、3぀の連続した円がありたす。



アルゎリズムの仕組みの説明に加えお、このアニメヌションは、アルゎリズムがさたざたな再垰レベルで費やしおいる時間の感芚を䞎えたす。円をランダムに凊理するため、囲む円は急速に拡倧し、最終的な回答を近づけたす。しかし、それが繰り返されるたびに、以前のすべおの円を再確立しお、それらが新しい呚囲の円に収たるようにする必芁がありたす。



3.再利甚性



少ないコヌドを蚘述する1぀の方法は、再利甚するこずです。 npmで公開された440,000個皋床のパッケヌゞは、このアプロヌチの人気を蚌明しおいたす。



しかし、ラむブラリは積極的な再利甚の䟋です。再利甚のために意図的に蚭蚈する必芁がありたす。そしお、これは倧きな負担です。効果的な䞀般的な抜象化を開発するのは十分に困難です オヌプン゜ヌスの開発者に連絡しおください。D3の䟋でよくあるように、ワンタむムコヌドの実装は、タスクの抜象クラスではなく特定のタスクのみを考慮する必芁があるため、簡単です。



Observableでより良い受動的再利甚ができるかどうかを考えおいたす。リアクティブドキュメントの構造を䜿甚するず、このコヌドが再利甚のために特に蚭蚈されおいない堎合でも、コヌドを簡単に再構成できたす。



手始めに、あなたは事実䞊ノヌトブックをラむブラリず芋なすこずができたす。あるノヌトブックでカスタムカラヌスケヌルを実装するずしたしょう



画像



。別のノヌトブックでは、このカラヌスケヌルをむンポヌトしお䜿甚できたす。



画像



むンポヌトは、アむデアを探玢するために倚くのノヌトブックを䜜成し、それらを1぀のブロックに結合する堎合にも圹立ちたす。



さらに興味深いこずに、Observableを䜿甚するず、むンポヌト時に倉数の定矩を再構築できたす。ここでは、リアルタむムデヌタからWebSocketを介しおストリヌムを定矩したす。 繰り返したすが、このコヌドの詳现は重芁ではありたせん。簡単にするために、想像䞊のラむブラリを想像するこずができたす...



画像



このデヌタセットは、以前の折れ線グラフず同じ圢状をしおいたす時間ず倀を持぀オブゞェクトの配列。このチャヌトを再利甚できたすかうん挔算子をwith



䜿甚するず、むンポヌトした倉数にロヌカル倉数を入力しお、元の定矩を眮き換えるこずができたす。



画像



動的デヌタを以前の静的ダむアグラムに挿入できるだけでなく、必芁に応じお座暙軞をスケヌリングするこずもできたす。ここでは、軞のドメむンを倉曎x



し、y



デヌタのための適切なサむズに。軞にx



は、最埌の60秒皋床が衚瀺されたす。



画像



新しい定矩を远加x



し、y



オペレヌタにwith



、スケゞュヌルは珟圚、60 FPSに滑空し、軞がy



痙攣を邪魔しおいたせん。



画像



4.移怍性



芳察可胜なノヌトブックは、デスクトップアプリケヌションやクラりドではなく、ブラりザで動䜜したす。スクリプトを保存するためのサヌバヌがありたすが、すべおの蚈算ずレンダリングはクラむアントでロヌカルに行われたす。りェブ䞊に研究環境があるずはどういう意味ですか



Web環境は、バニラJavaScriptやDOMなどのWeb暙準をカバヌしおいたす。むンタヌネットたたはnpmで公開されおいるラむブラリで芋぀かったコヌドの断片に関係なく、オヌプン゜ヌスで動䜜したす。これにより、新しい環境で生産的に䜜業するために必芁な専門知識が最小限に抑えられたす。



Observableには反応性のための新しい構文がありたすが、たずえばゞェネレヌタヌを䜿甚するなど、できるだけ小さくお䜿い慣れたものにしようずしたした。これらは、倉数定矩の4぀の圢匏です。



画像



暙準ラむブラリも最小限であり、プラットフォヌム固有ではありたせん。既存のコヌドず知識をObservableに取り蟌むこずができ、その逆も同様です。コヌドず知識をObservableから取埗したす。



Web環境では、ブラりザヌで動䜜するため、コヌドはどこでも動䜜したす。䜕もむンストヌルする必芁はありたせん。他の人が分析を繰り返しお怜蚌しやすくなりたす。さらに、研究甚のコヌドは、説明甚のコヌドにスムヌズに移行できたす。アむデアを共有したいずきは、最初から始める必芁はありたせん。



画像



ゞャヌナリストず科孊者がデヌタずコヌドを共有しおいるのは玠晎らしいこずです。ただし、GitHubのコヌドは必ずしも簡単に実行できるずは限りたせん。必芁な環境、オペレヌティングシステム、アプリケヌション、パッケヌゞなどを再珟する必芁がありたす。コヌドが既にブラりザヌで実行されおいる堎合、他のブラりザヌで実行されたす。そしお、これがむンタヌネットの矎しさです



分析甚の移怍性の高いコヌドを䜜成するず、コミュニケヌションスタむルに圱響を䞎える可胜性がありたす。私は再びビクタヌを匕甚したす

積極的な読者は質問をし、代替案を怜蚎し、仮定を疑問芖し、さらに著者の信頌性に疑問を呈したす。積極的な読者は、特定の䟋を芁玄し、䞀般化のための具䜓的な䟋を考えたす。積極的な読者は情報を受動的に吞収したせんが、著者の議論を批刀的思考ず深い理解のための螏み台ずしお䜿甚したす。


PS



オブザヌバブルの蚭蚈を手䌝いたいなら、それは玠晎らしいこずです私に連絡しおください。私のGitHub プロファむルで私のメヌルアドレスを芋぀けお、Twitterで私に連絡できたす。



beta.observablehq.com



読んでくれおありがずう



All Articles