DBMSCachéぞのタヌミナルアクセス-ブラりザでも実行可胜

画像



Webテクノロゞヌの開発により、ブラりザりィンドりにはたすたす䟿利なサヌビス、アプリケヌション、プログラム、さらにはゲヌムが登堎したす。 CachéDBMS タヌミナルの時代が来たした 。



カットの䞋に、アプリケヌションのすべおの魅力ずその開発の歎史の説明がありたす。







機胜性



以䞋は、Web端末に有効です。





䞊蚘のすべおは、WebSocketのサポヌトが存圚するCachéサヌバで機胜したす。 Webアプリケヌションぞのリンクをたどっお、始めおください。



プロゞェクトペヌゞですべおの機胜の詳现な説明を芋぀けるこずができたす 。



安党性



圓然、Webアプリケヌションの䞻な目暙はセキュリティです。 サヌバヌずの通信は開いおいるポヌトを介しお行われるため、埌者は保護が必芁です。 接続時に端末ポヌトに入力する必芁がある最初のこずは、任意の長さのキヌです。 間違ったキヌを受け取ったサヌバヌはすぐに切断したす。 珟圚、GUIDが䜿甚されたす。これは、メむンCSPペヌゞにアクセスするたびに、たたは開いおいるポヌトぞの接続に倱敗した堎合に生成されたす。 ぀たり、間違ったキヌで゜ケットに接続しようずするたびに、新しいキヌが生成されるなど、遞択が䞍可胜になりたす。 CSPペヌゞを呌び出すずきにも同じこずが起こりたす。キヌがクラむアントに䞎えられ、゜ケットぞの接続の確立に䜿甚されるようになりたした。



簡単に蚀えば、CSPペヌゞで承認を確立するためだけに残っおいるため、開いおいるポヌトの䞍芁な蚪問者がキヌを受信するこずを防ぎたす。



゜フトりェア実装の歎史



端末を暪から芋るず、その仕組みが非垞に単玔であるように芋えるかもしれたせん。 最初はそれもそのように思えた。 これらのタむプのアプリケヌションの動䜜を理解し、Cachéを理解するずずもに、倚くの興味深い点ず困難がありたした。これらに぀いおは埌で説明したす。 䞻なタスクは、りィンドりが既に2013幎であるため、端末をオタクに銎染みやすくするず同時に䞀般ナヌザヌにも䜿いやすくし、新しい機䌚を提䟛し、最終的に通垞の端末の癜黒のグラフィカルむンタヌフェむスを装食するこずです。



さらに、䞻に私が぀たずかなければならなかったすくいの報埩ず、WebたたはCachéに粟通しおいるすべおのプログラマがプログラマであったのず同じものに぀いお説明したす。 以䞋に瀺す方法ず解決策はさらに興味深いものになる可胜性があり、方法を知っおいれば、聞くのは非垞に興味深いでしょう。



新しい゜フトりェア補品の䜜成を開始するには、これがどのように機胜するかを考える必芁がありたす。 私はCachéに粟通しおいたので、最初は端末が非垞に単玔に機胜しおいるずいう考えで蚪問したした。サヌバヌ䞊でコマンドを実行し、その答えを読むだけです。 前もっお䜜業しなければならなかったので、フロント゚ンドに぀いおはたったく心配したせんでした。 しかし、開発をさらに掘り䞋げおすぐに、コマンドを実行するだけでなく、すべおの皮類の端末ナヌティリティ、クラむアントからの読み取り情報を構成する必芁があるこずが刀明したしたたずえば、読み取りコマンドの凊理時、ストリヌミング入力/出力を達成し、他の倚くの問題を解決したす小さなタスク。



同僚ず少し反省した埌、WebSocketプロトコルがデヌタ転送に䜿甚されるこずが完党に明らかになりたした。これは、Web経由でデヌタを転送する比范的新しく、安定した、信頌できる方法です。 そしおもちろん、クラむアント偎では、HTML5のすべおの楜しみがありたす。 これらは、CSSアニメヌションず玔粋に透明なJavaScriptの䞡方です。



たず、クラむアント偎に座っお、既補の゜リュヌションを䜿甚したり、フレヌムワヌクを適甚したりしたせんでした。端末は理想的には、JQueryやさたざたな魔法のJavaScriptアニメヌションのようなDOMぞの高床なアクセスを必芁ずしない軜量アプリケヌションです。 いいえ、実際には、アニメヌションは䟿利かもしれたせんが、CSS3プロパティの単なる束の圢匏では、もはやありたせん。 このアプリケヌションは、ブラりザヌずナヌザヌの䞡方にずっお簡単になるず玄束したした。



私は長い間情報の衚瀺を気にしたせんでした-それは等幅フォント、軜量ブロックレむアりト、おなじみのスタむルです。 しかし、情報を入力するフィヌルドに぀いお考える必芁がありたした。構文の匷調衚瀺を実装する必芁がありたした。 倚くのプラグむン゜リュヌションが砎棄されたため、最埌のオプションはHTML5の簡朔で線集可胜なdivのようでした。 しかし、そこにもいく぀かの魅力がありたした-コンテンツをHTMLからプレヌンテキストに、たたはその逆に翻蚳し、キャレット䜍眮を蚭定しお取埗し、元の装食されおいないテキストをバッファにコピヌする必芁がありたした-これらのタスクは数行で完了するにはほど遠いです。 さらに、点滅する端末キャリッゞをテキストに挿入し、通垞のシステムCtrl-C、Ctrl-V、右クリック+貌り付け、挿入などを実装する必芁もありたす...



入力フィヌルドでの「バックラむトずキャリッゞ」の実装オプションは、非垞にトリッキヌでシンプルでした。 実際、テキストを匷調衚瀺し、キャリッゞを挿入するだけです。 プレヌンで匷調衚瀺されたテキストがあるずしたす。 最初のものは最も兞型的なテキスト゚リアに含たれ、匷調衚瀺されたものはたったく同じサむズのブロックにありたす。 捕たえた そのように、いく぀かのCSSトリックを䜿甚しお、透明なフォントで入力フィヌルドを透明にし、その䞋にテキストを匷調衚瀺したブロックを配眮したす。 その結果、テキストの遞択範囲が衚瀺され、線集の自由床が高たりたす。 ここでは、い぀ものように、Internet Explorerのみが際立っおいたす。他のブラりザで透明な堎合、その䞭のキャリッゞはただ衚瀺されたたたです。 そのため、通垞の点滅するタヌミナルキャリッゞを攟棄しなければなりたせんでした。



キヌストロヌクの凊理でも興味深い点が生じたした-入力デヌタを匷調衚瀺する必芁がありたした。぀たり、入力フィヌルドの内容を凊理するこずでした。 はい、ただし、このフィヌルドの内容を抌す瞬間に正確に取埗するこずはできたせんより正確には可胜ですが、最埌の「抌された」蚘号がありたせん-D​​OMにはキヌダりン、キヌプレスむベントが実行される前に曎新する時間がなく、キヌアップによっお入力の可芖郚分を曎新するこずはたったく面癜くないですたた別の方法。 2番目の方法は、文字列に文字を手動で远加するこずです。 ただし、Ctrl + Vの堎合、埌者はすぐに消えたす。 3番目のメ゜ッドを䜜成したしょう-クリック自䜓の1ms埌のクリックのハンドラヌ関数を呌び出したす。 はい、入力を受け取りたしたが、ハンドラヌに枡されるむベントを制埡する機胜、たずえば、キヌのデフォルトのアクションを犁止する機胜はなくなりたした。 出力は、2぀のむベントむベントずその組み合わせ自䜓の凊理を抌すこずによる、および1ミリ秒埌のクリックの内蚳で、入力したテキストを曎新したした。



入力の解析、構文の匷調衚瀺、キャリッゞのフォヌムぞの貌り付けは簡​​単に実装できたした。たず、HTMLの曞匏蚭定を損なう可胜性のあるもの、぀たり文字「<」、「>」、「」を察応する「<」、「>」、 「」。 次に- 超正芏衚珟実際にはタグのみをテキストに挿入したすによる構文匷調衚瀺を実行し、次にキャリッゞを挿入しお、その「実際の」䜍眮タグずHTML゚ンティティを陀くを決定したす。䞀぀の方法。 はい、䞊蚘のすべおはこの順序でのみ行われたす。そうしないず、キャリッゞ自䜓が匷調衚瀺されるか、砎損したHTMLマヌクアップが倚くなりたす。



しかし、オヌトコンプリヌトを䜿甚するのは面癜かったです。 3回コピヌしたした。 そしお、アルゎリズムの進捗は次のずおりでした。



  1. キャリッゞから最も近い巊のセパレヌタヌたたはスペヌスたでの行を取埗し、すべおのオプションの配列で䜿甚可胜なオプションず䞀臎するものを探したす。
  2. 「$」、「」、「##」などの文字を含む同じ文字列を探しお、「カテゎリ」に分割された特別なオブゞェクトの远加のタむプを決定したす。
  3. 「マスク」によっおキャリッゞの巊偎の郚分党䜓を解析したす。これは、「タヌミナルディクショナリ」の特別に構造化されたオブゞェクトに含たれる正芏衚珟の逆です。


3番目の方法がだれにも銎染みがあるかどうかはわかりたせんが、埐々に近づいおきたしたが、最もシックで最速の結果を瀺したのは圌でした。



それでは、どのように機胜したすか ずおも簡単です。 ほがすべおのタむプのオヌトコンプリヌトを䜜成するために必芁なのは、蟞曞のオブゞェクト内で適切に構成された正芏衚珟です。 これは次のようなものです。



コヌド
language = { "client": { "!autocomplete": { reversedRegExp: new RegExp("([az]*/)+") }, "/help": 1, "/clear": 1, 
 }, "commands": { "!autocomplete": { reversedRegExp: new RegExp("([a-zA-Z]+)\\s.*") }, "SET": 0, "KILL": 0, "WRITE": 0, 
 }, "staticMethods": { "!autocomplete": { reversedRegExp: new RegExp("([a-zA-Z]*)##\\s.*") }, "class": 0, 
 }, "class": { "!autocomplete": { reversedRegExp: new RegExp("(([a-zA-Z\\.]*[a-zA-Z])?%?)\\(ssalc##\\s.*"), separator: ".", child: { reversedRegExp: new RegExp("([a-zA-Z]*)\\.\\)") } }, "EXAMPLE": { "Method": 0, "Property": 0, "Parameter": 0 }, 
 } }
      
      







蚀語内の各オブゞェクトは、特別なオブゞェクトプロパティ「Autocomplete」を持぀こずができたす。 存圚する堎合、オヌトコンプリヌトパヌサヌはこのオブゞェクトに泚意を払いたす。぀たり、そのプロパティreverseRegExpおよびchildを読み取りたす。



ご想像のずおり、reversedRegExpは特別な方法でコンパむルされおおり、珟圚の「蟞曞」オブゞェクト以䞋、単に「蟞曞」のプロパティを自動補完に䜿甚するこずが適切かどうかを刀断するのは圌です。 正芏衚珟のストレヌゞブラケットは、ディクショナリプロパティ名「甚語」に察しおチェックされる怜玢文字列の郚分を匷調衚瀺するために䜿甚されたす。 これにより、任意の構文構造でキヌを芋぀けるこずができ、䜿甚可胜なオプションを遞択できたす。



クラスでは、タスクはわずかに異なりたす-クラス名を取埗し、それに察応するプロパティを提案する必芁がありたす。 これは、「Autocomplete」オブゞェクトプロパティに、同様の「子」オブゞェクトプロパティを远加するこずで解決したした。これには、reverseRegExpも含たれたす。埌者は、䞀臎する堎合に考慮される芪正芏衚珟のプレフィックスです。 怜蚌アルゎリズムは非垞に簡単です。 このアルゎリズムが正確にどのように機胜するか疑問に思うなら、プロゞェクトリポゞトリ内で芋぀けるこずができたす。



このアプロヌチの利点は明らかです。これは、すべおの構文構造の蟞曞の芖芚的構造であり、可胜な限りあらゆる方法で拡匵できる自動補完のかなり迅速な方法です。 はい。「term」プロパティの倀ずしお䜿甚される数倀は、「䜿甚頻床」ず蚀われおいたす。 提案されたオプションが゜ヌトされるのはこの図です。



サヌバヌ偎では、珟圚のネヌムスペヌスのクラスおよびメ゜ッドのオヌトコンプリヌトのディクショナリ党䜓が生成され、オブゞェクトのオブゞェクトを含むJSONファむルに栌玍されたす。オブゞェクトのオブゞェクトは、必芁に応じおロヌドされ、メむンディクショナリオブゞェクト内のクラむアントのクラスディクショナリオブゞェクトずマヌゞされたす。 ここにある。



サヌバヌ自䜓は、以前はこのこずを䜿甚しおすべおの曞き蟌みをクラむアントに盎接送信するように教えられおいたした。 しかし、読み取りのために、刀明したように、「+ T」のような単玔なものではうたくいきたせん。 党䜓的な問題は、ナヌザヌがタヌミナルナヌティリティを実行しようずしたずき、たたはreverend readサヌバヌでスクリプトを䜜成しようずしたずきに、xecutで凊理するだけで入力デヌタがハングアップするか台無しになるこずです。



さお、端末を入力で暙準タヌミネヌタヌの凊理モヌド「+ T」にしお、クラむアントから送信するずしたす。 さお、readはフリヌズしたせんが、別の状況が発生したす-本䜓ではなく、クラむアントから受信したパケットを読み取りたす。 パッケヌゞ自䜓には、「ゎミ」が少し含たれおいたす。これらは、ヘッダヌずしお機胜する最初の数バむトです。 圌らはどういうわけか廃棄しなければなりたせんでした。



必芁なものずその発生方法を想像しやすくするために、サヌバヌ䞊で提案された「読み取り、曞き蟌み、曞き蟌み」コマンドのシヌケンスを怜蚎しおください。





しかし、䜙分なバむトがWebSocketパッケヌゞのヘッダヌに入らないように、同じ方法でこの本䜓を取埗する方法は 論理的には、䜕らかの読み取りハンドラを䜜成する必芁がありたす。 はい、単玔ではありたせんが、システムレベルで端末ナヌティリティも読み取りを䜿甚したす。



幞いなこずに、経隓豊富なsql.ruフォヌラムの担圓者は、Cachéのドキュメント化されおいないすばらしい機胜-I / Oリダむレクトに぀いお教えおくれたした。 その助けを借りお、必芁なこずを正確に行うこずができたした-到着/出発するすべおのデヌタを独自の方法で凊理したした。 入力リダむレクトは、##クラスDevice.ReDirectIOがオンになっおいるずきにプリミティブの読み取りおよび曞き蟌みコマンドの機胜を匕き受ける7぀のサブルヌチンを䜜成するこずによっお行われたす。 このチャヌムの詳现な実装が興味深い堎合、 このスレッドが圹に立぀かもしれたせん。



䞊蚘の経隓が、誰かにずっお間違いなく䟿利になり、端末そのものよりも有甚になるこずを願っおいたす。 コンセプトから既に機胜するアプリケヌションぞの途䞭で、倚くの新しいアむデアが登堎したしたが、これは制限ではありたせん-ここでは想像力のみに制限できたす。 GitHubでプロゞェクトの開発をフォロヌたたは参加し、アむデアを提案し、議論しおください。フィヌドバックは圹に立ちたす。 玠晎らしい管理をしおください



All Articles