[email protected] [email protected] [email protected]
多分多分多分おそらく、私が Rust で構築しているまったく新しいプラットフォームを導入することを選択することになるでしょう。これは、ビジュアル プログラミングと知識がスリザーと並んでスリザーに興味を持っているものです。 データ エンジニアリング、アルゴリズムの購入と販売、プロシージャル グラフィックスなど、さまざまな分野で状況が発生する可能性があると思います。 私は設計とプロトタイピングの中心にいますが、関連する家について十分な定義を得ることができます。これは、私のソリューションを断片化するために選択する可能性があり、今後数年間で向かうことを望んでいる場所です. この投稿が、クリエイティビティのエビが、おそらくもはや存在しない分野でそのスキルを発揮する方法を証明できることを願っています.
ここは一面的な挑戦であり、まだ始まったばかりの穏やかな時期であることを心に留めておいてください。目標は間違いなく、関数プロトタイプのために後でもう一度調整したいと思うでしょう.
では、なぜビジュアルプログラミングなのですか? 可視プログラミングは着実に私を魅了してきました.Houdiniと呼ばれる可視FXツールを研究した後、私の虚弱な業界に種が植えられたことを明かします. Houdini は長い年月をかけて大きく成長し、データフローとビジュアル プログラミングを中心とした VFX 業界のこの種の非常に効率的で効果的に尊敬されているユーティリティです。 だから私の考えでは、Houdini がビジュアル プログラミングを業界内で主流にする魔法のトリックを成功させる準備ができていたなら、おそらく私は技術的に Rust を使って他の分野でこれをやってのけることができ、モデルの知識が横に滑り落ちるのと同じように
私は間違いなく、解決策がもはや単純ではないという感覚を生みます。私は、Visible プログラミング言語 (VPL) がこれらの領域よりも低く解決すべき課題を生み出すことを明らかにします:
スキル: モデル目標のプログラミング言語と比較すると、過度に緻密または制約されている感があります.
複雑さ: g で視覚的な複雑さのぶら下がりを取るのはめったに簡単ではありません 効率性:VPLベースがほとんどという考えもありそうです。プログラムは、モデルの目標言語で作成されたものよりも明らかに遅くなります. スティグマ: 目に見えるコーディングは、コーディングの簡単な解決策を知らない人のためのものです.
さらに、Unreal Engine のブループリント VPL は、ビデオ ゲーム プログラミングのモデルとしてビジュアル プログラミングを利用することに圧倒的な成功を収めており、一部のブループリントでは、Houdini と Unreal がビジュアル プログラミングを証明していることを認識しておく必要があります。プログラミングは、かなり巨大な市場で注目を集めることができます.
NGenate プラットフォーム
NGenate は、これらの質問に対する私の回答であり、私が目指すことができる過剰なステージ関数の最初のスペースに近づいてきました。 証明された事実にもかかわらず、この段階では、私がこれらの人々に製品を提供しているため、彼らがそれを必要としている、または望んでいることにさえ気付かないため、これは長い道のりです. そして、彼らがそれを尊重してくれることを望んでいるので、おそらく私は過度に素朴です! でも、コツとしては、スクートと手順をマスターすれば、それで十分です
Twinワークフロー プログラミング
生産性とスキルの課題に答えるために、私は最初に実行することを選択するかもしれませんデュアル モード スキル モデルのすべてのコーダーとテクニカル ユーザー向けのクラス ツールです。 コーダーは、技術ユーザー向けのパーツ/ノードを発明するために安全で効果的に確立された言語を使用して、強力な機能を備えたプログラミングモードに調整する準備ができているため、間違いなく生産性を感じるはずです. 逆に、テクニカル ユーザーは、VPL の段階で非常に生産的であると感じ、ノード グラフと式を構築および構成する必要があります。 どちらのタイプの人も、いつでもモードを自由に調整できます。私は、想像できる限りシームレスにこれを実行することを選択するかもしれません.
Rust はもはやデータ エンジニアリング コミュニティに巨大な足跡を残していますが、ユーザーが新しいノードを実行するために利用できる最初の言語として、Rust を最大限に活用することにしました。 将来的には他の言語を強化することを目標にするかもしれませんが、今のところ Rust は、私がプラットフォームを構築しているのと同じ言語とはかけ離れているため、簡単に始めることができます。これをスキルとして利用して、データ エンジニアリング コミュニティで Rust a Shrip Extra への扉を開きます。
Expose: I’m no上記で説明したことは間違いなく、ワークフローと、主に VPL と下位ステージ言語としての Rust に基づく式との間の互換性にすぎないため、上記とのラウンド トリップを発明しようとしています。 あるいは、VPL エディタとそのシリアライズ可能な構造との間のラウンド トリップを強化することを選択するかもしれません
人が読める/編集可能な VPL シリアライゼーション構造
VPL プログラムの生産性と共有性をさらに高めるために私は、VPL グラフの単純なシリアル化の図を発明しようと考えました。 VPL 環境/ツールは、シリアル化された beget と VPL エディター自体の間のシームレスなラウンドアウト切り替えを容易にする必要があります.
インラインノード表現言語 さらに過度なステージ機能モデルを実験中エクストラ スキルと生産性をテクニカル ユーザーに提供するノードの期間にストレート インラインを使用する式言語。または、それが彼らのヘッドスペースがうまく機能する場所である場合。 私は、Microsoft Robotics Developer Studio がその式ノードで使用する VPL から、ほとんどのスキルに基づいたこのインライン式のインスピレーションを得たことを明かします。 一等市民としてのキーボードと自動構造 特定の人が青写真として、キーボードから明白なイニシアチブのためのマウス。 これは、新しいノードの作成、ノード フォームの決定、ノード式の入力と入力の選択 (ワイヤリング)、およびノード レイアウトの更新に匹敵するイニシアチブがすべて、マウスに切り替えることなく達成できることを意味します。
マウスは期待通りの強さをもたらします。実際には、ピンチ ズームとパンがタッチ モニターでもサポートされていることを確認してください。 しかし、ご想像のとおり、私は Vim を高く評価するツールのファンであり (Helix は私のレーダーに入っています)、VPL エディターのキーボードを全体的に強化することは、明らかなコーダー グループの生産性を大幅に向上させます。
VPL から Rust へのコンパイル ここは狙いよりも勉強相談のオマケです。 グラフの記述をRustコードにコンパイルすることに何らかの利点があるかどうかを知ることを選択するかもしれません. 下位ステージのノードを解放する提供コードは、コンパイルされた Rust コードのように見えるため、それらが実行する処理はすでに効率的です。 あるいは、ノード グラフをコンパイルして、ソケットのフォームを動的にディスパッチする必要がある場合に、ノード ソケットの具体的なストレージ フォームを取り囲むことを制定することで、いくつかの利点が得られる可能性があります。 私は間違いなくここで答えを知ることはできません.キャリア 顧客は、ベア メタル構成での計算から逃れる力を身につけるべきですが、一部の青写真 ユーザーがインフラストラクチャを気にすることなく、コンピューティングがクラウドで問題なく実行され、スケーリングされることを望んでいます。 Rust Playground や Compiler Explorer など、ここで尊敬しているツールから教えてもらえることが 1 つあるのではないかと考えています。
リアルタイム処理とバッチ処理の計算の願いをひとつひとつ強化していきます Aドエルアルゴリズムの売買手順に匹敵するリアルタイム手順は、膨大な量の知識を処理するバッチ処理の要望に次に置かれる場合、異なる要望とアーキテクチャの意味を持ちます。 CPU の特定のワークロードまたは IO の特定のワークロードの両方を強化するために、型にはまらないスキルで async Rust を使用することで疲れ果てるようにプッシュする必要があるスキルを、すべての使用環境を強化するための青写真として評価することができます。 Andrew Lamb はどうにかしてトキオを適応させたCPU の特定のイニシアチブに対処するために、Tokio の 2D ランタイム インスタンスを導入します。どこで想像できますか
私が従来から使ってきた、小さくて効果的に認識されている箱の無限の品揃えがありますプロトタイピングですが、今のところ、私の環境に深刻に関連しているものがかなりありますが、ここにリストできることを完全に調査する必要があります. このリストは、Rust コミュニティの市場で既に入手可能な、データ エンジニアリングに適した非常に膨大な作業について教えられているため、時間の経過とともに発展することは明らかです
私が教えられるように選ぶかもしれないクレートと研究 Neetly timed-dataflow:データフローと分散コンピューティング。 私はおそらく、私のbeget計算グラフでプレイ中の完全な部分を調整する過度の段階を啓発することを選択するかもしれません.おそらく、私が生んだものとは異なる計算バックエンドとしてサポートする可能性があるという仮定を楽しませるために選択するでしょう.
私が組み合わせて選ぶかもしれないクレート
ディーゼル: Diesel は、クエリに対する安全で構成可能な抽象化のおかげで、Rust でデータベースを操作する最も生産的なスキルです。 ロードマップ I’私はスクートの早い段階で静かですが、実験を行い、初期のパーツとライブラリを構築するのと同じくらい効果的に視覚言語がおそらく最終的に軽蔑される可能性があるものをモックアップするのに忙しくしています.
私は次のプロトタイプを作成したので、長い道のりです: FlexStorage: ノードベースの計算グラフ StorageTable: 明示的な射影を実行し、これらの射影に対して圧縮された反復子を返すマクロと同じくらい効果的に、ストレージのテーブル/フォーム マップ表現を有効にします
- NodeGraph: ノード、エッジ、知識入出力ソケットをビッドするための知識構築物
- VisualEngine: カスタマイズされた 2D/3D グラフィック エンジン。 ckends
上記のプロトタイプ完成度のさまざまな段階にあります。 私の次の主な目標は、これらのクレートを、VPL 機能の視覚的およびインタラクティブな側面を下回らない最初のプロトタイプを作成できる卒業証書まで成長させることです
この投稿の残りの部分では、VPL で可視化されたデザインの反復を断片化することを選択する可能性があります。 FlexStorage へ – コンピューティング グラフ / VPL のストレージ要求を活性化する NGenate ライブラリ。 VPL キャッチ イテレーション これは、特定の VPL 式言語とグラフ インターフェイスがおそらく軽視される可能性があるものについて、私の最初のスリザーです。 これらは、この段階で最も効率的なワイヤーフレームです。 これの機能プロトタイプ (正確な計算なし) は、私の次のターゲットの 1 つです。 1 ~ いくつかの場合、視覚的な複雑さが減少します。 理想的には、VPL を評価して、モデル 3 を過度に評価するのをやめ、モデル 1 を評価しないようにすることをお勧めします。ビジュアル コーダーを巧妙な知識の段階に関連付けるグラフに誘導する方法。 知識の非常に優れた段階の定義は人によってさまざまですが、Rust 開発者として私たちの知識を中断する方法を決定する際に日々直面していることと、実際にはまったく同じであることは明らかです。能力。 Rust コードを理解するのに役立つ経験則が得られたら、私はそれについて耳を傾ける価値があると思うかもしれません.
Iこれらの例では、ドエル アルゴリズムによる売買手順をモックアップすることを選択しましたが、これは、すべての形式のデータフローおよびデータ エンジニアリング ドメインに適用される可能性のあるモデル内の目標ツールとして想定しています。
伝説
モデル1
視覚的に複雑すぎて、熱心に踏み込みすぎている
モデル2
ステートメント ステージ コードは表示されません。 それはまた、知識の適切な段階の候補であるか、またはプリンシパルの場合にグラフが拡張される可能性のある関係の候補でもあります.
モデル3
私はこれの単純さを高く評価しており、ビジュアル部分の適切な種類のデフォルト ステージを実行する可能性があることを明らかにします。 特定の人がモデル 2 の一部のステージにぶら下がりたい場合は、「Attain Trade」ノードを拡大して内部のサブノードを確認することができます。 このバージョンが理想主義的/単純すぎるか、またはもはやそうでないかどうかは、時間とプロトタイプによって示されます。
Flex Storage[email protected] 私は提供する NGenate のどの側面を正確に解決していませんが、できる限り断片化したいと思います。 という私の実験的な Storage ライブラリを断片化することを選択するかもしれません)Flex Storage. 通常の lib および crate の品揃えライブラリの大部分は、遅かれ早かれその形式で共有される特性の効果的なオフスペースを強制することに、もはや確固たる焦点を生み出すことはなくなり、ダイナミックな機能を強化するために多くの組み込まれたインフラストラクチャを着実に生み出すこともなくなります。
Flex Storage は、共通の特性と汎用性の高いキャスティングに焦点を当てることで、API を知識よりもさらに要約できるようにします。 これは、動的または静的ディスパッチがプリンシパルである場合にカウントされる具体的なストレージ フォームまたは特性オブジェクトの両方を解釈するためのストレージ ハンドルと、特性オブジェクト間のキャスト、特性オブジェクトを形成するためのキャスト インフラストラクチャ、特性オブジェクトへの種類のサイズ変更を提供します。
ライブラリはかつて、描画が次のようなビジュアル プログラミング環境に基づいたノード内のデータフロー処理の優勢な利用事例を強化するために作成されました。ストレージフォームを処理の入力として利用するための設計図であり、実行時に交換可能なストレージハンドルで切り替えることもできます。 このようにランタイムの柔軟性が過度に高い段階になると、効率の問題と同様に API の複雑さが増します。そのため、ストレージの発明のほとんどがアセンブル時に明確になる可能性がある場合は、より簡単な静的ディスパッチに焦点を当てたワークフローに集中してください。
これはまた、きらめく量の発明のチャーンのトピックでもあるので、今のところスパークリングの github リポジトリです。 、あなたが元気に集まっていることが1つある場合は、私に知らせてください。遅かれ早かれ、安定したときに、より広いコミュニティのためのクレートを通じてこれをサポートすることに集中できます.
ファセット 動的および静的ディスパッチのたびに強化しますが、動的ディスパッチ ワークフローには余分な作業が必要です。 ストレージ トレイト 世帯の期間中、任意のフォームまたはトレイト オブジェクト間の多用途のキャスティング。
- さらに、使用ケースを比較するために、すべてのポインターが異なる特性オブジェクトまたは具体的な形式としてストレージに入札できる同一のストレージに 1 つ以上のハンドルをぶら下げるのが従来の方法である可能性があります。 ここは、主に知識処理を行うグラフベースの非常に優れたものです。すべてのストレージ フォームとハンドルは Ship + Sync で、Arc を使用します
NIGHTLY + UNSAFE: ライブラリは単一の unsafe ステートメントを使用して、Arc を含むキャストを発明します。
実例 次は、StorageHandles の助けを借りて、異なるストレージ特性オブジェクト間で偽造された問題なしでどのように想像できるか、さらにストレージがどのように項目を形成するかを示していますおそらく、これらの異なる特性オブジェクトを介して、動的ディスパッチとさらにプリンシパルの場合は静的ディスパッチを介してアクセスできます。 ngenate_flex_storage::{ storage_handle::{address, StorageHandle}, storage_traits::{ItemSliceStorage, KeyItemStorage, Storage}, storage_types::V を利用する ecストレージ、}; fndominant() { // 具体的なストレージ形式で true として受け入れる let storage: VecStorage- =VecStorage::new_from_iter(vec! ); // それを dyn ストレージ トレイト オブジェクト (すべてのストレージ トレイトのルート トレイト) へのアドレスに入れます。 let storage_handle: StorageHandle
- =アドレス::ビルダー( storage).invent(); // アドレスは、サポートされているスーパートレイトのいずれかの間で // ストレージ トレイトのハンドル フォージド ソリューション全体で自由にフォージすることができます。 // dyn ItemSliceStorage let slice_handle: StorageHandle へのアドレスに偽造された Inter trait オブジェクト
>=storage_handle .cast_to_slice_storage:: - () .unwrap(); println!("特性 ItemSliceStorage 特性オブジェクト項目にアクセス"); { let ガード=slice_handle.try_read().unwrap(); ニックをしましょう: &[i32]=Guard.as_item_slice(); dbg!(ニック[0]); dbg!(ニック[1]); } // dyn KeyItemStorage let key_item_handle: StorageHandle へのアドレスに偽造された Inter trait オブジェクト
>=slice_handle.cast_to_getitem_storage().unwrap(); println!("特性 KeyItemStorage 特性オブジェクト項目にアクセス"); { // dyn KeyItemStorage StorageHandle へのガードをキャッチ let guard=key_item_handle.try_read().unwrap(); dbg!(guard.get dangle of(0).unwrap()); dbg!(guard.get dangle of(1).unwrap()); } // いつでも静的ディスパッチ アドレスへの // 救済を規定することが考えられます。 println!("静的ディスパッチを使用して繰り返す"); { // 具体的な ptr に偽造された let storage_ptr: StorageHandle>=key_item_handle.cast_to_sized_storage().unwrap(); let ガード=storage_ptr.try_read().unwrap(); let mut sum: i32=0; for i in guard.into_iter() { 合計 +=i; } dbg!(合計); } } ワークフローの焦点は動的ディスパッチですが、ストレージ内のすべてのアイテムに何らかの特性を利用するよりも早く、適切な具体的な形式に自動的にダウンキャストする特定の人物の計算を容易にするいくつかのソリューションを作成します。 アトマイズ内で、静的ディスパッチと動的ディスパッチの間の最も効率的なすべての世界の余分なものをぶら下げたいと思うかもしれませんが、ここで実行する必要がある実験の広がりがあります.
このライブラリを作成した後、 と呼ばれる他のクレートをすべて見つけました任意の入力
これは、堅実な静的ディスパッチ態度から、ストレージ フォーム用の非常に統一されたインターフェイスを作成することに関連しています。 )私は静かに長い高速道路を前に進んでいますが、大まかに言えば、NGenate と同じくらい私が行ってきたことです。 あなたはこれらの問題のいずれかに興味があるか、または取り組んでおり、間違いなくあなたのネットワークを拡大したいと思っているかもしれませんが、どもるこんにちは: [email protected] – 私は、この家の中で仲間を増やして演奏することをおそらく尊重するかもしれません.
ngenate_flex_storage::{ storage_handle::{address, StorageHandle}, storage_traits::{ItemSliceStorage, KeyItemStorage, Storage}, storage_types::V を利用する ecストレージ、}; fndominant() { // 具体的なストレージ形式で true として受け入れる let storage: VecStorage- =VecStorage::new_from_iter(vec! ); // それを dyn ストレージ トレイト オブジェクト (すべてのストレージ トレイトのルート トレイト) へのアドレスに入れます。 let storage_handle: StorageHandle
- =アドレス::ビルダー( storage).invent(); // アドレスは、サポートされているスーパートレイトのいずれかの間で // ストレージ トレイトのハンドル フォージド ソリューション全体で自由にフォージすることができます。 // dyn ItemSliceStorage let slice_handle: StorageHandle へのアドレスに偽造された Inter trait オブジェクト
>=storage_handle .cast_to_slice_storage:: - () .unwrap(); println!("特性 ItemSliceStorage 特性オブジェクト項目にアクセス"); { let ガード=slice_handle.try_read().unwrap(); ニックをしましょう: &[i32]=Guard.as_item_slice(); dbg!(ニック[0]); dbg!(ニック[1]); } // dyn KeyItemStorage let key_item_handle: StorageHandle へのアドレスに偽造された Inter trait オブジェクト
>=slice_handle.cast_to_getitem_storage().unwrap(); println!("特性 KeyItemStorage 特性オブジェクト項目にアクセス"); { // dyn KeyItemStorage StorageHandle へのガードをキャッチ let guard=key_item_handle.try_read().unwrap(); dbg!(guard.get dangle of(0).unwrap()); dbg!(guard.get dangle of(1).unwrap()); } // いつでも静的ディスパッチ アドレスへの // 救済を規定することが考えられます。 println!("静的ディスパッチを使用して繰り返す"); { // 具体的な ptr に偽造された let storage_ptr: StorageHandle>=key_item_handle.cast_to_sized_storage().unwrap(); let ガード=storage_ptr.try_read().unwrap(); let mut sum: i32=0; for i in guard.into_iter() { 合計 +=i; } dbg!(合計); } } ワークフローの焦点は動的ディスパッチですが、ストレージ内のすべてのアイテムに何らかの特性を利用するよりも早く、適切な具体的な形式に自動的にダウンキャストする特定の人物の計算を容易にするいくつかのソリューションを作成します。 アトマイズ内で、静的ディスパッチと動的ディスパッチの間の最も効率的なすべての世界の余分なものをぶら下げたいと思うかもしれませんが、ここで実行する必要がある実験の広がりがあります.