
“कुछ काम, शायद, विचार की अधिक गहराई में भिन्न होते हैं
और मानव प्रकृति का बेहतर ज्ञान; अन्य पुस्तकें शायद
मौलिकता और आयतन के मामले में मेरे लिए नीच नहीं,
लेकिन अपनी निराशाजनक, असाध्य विश्वसनीयता के साथ, यह आगे निकल जाता है
अब तक की सभी रचनाएँ।
जे के जेरोम। "एक ही नाव में तीन, कुत्तों की गिनती नहीं"
सामने के दरवाजे पर धूम्रपान न करने के लिए, धूम्रपान नियमावली, ब्रोशर पढ़ने की कोशिश करने या आईटी से अगली कली के उत्साहपूर्ण आश्वासनों को सुनने के लिए, मैं आपको पिछवाड़े से कैश की दुनिया में प्रवेश करने के लिए आमंत्रित करता हूं - इस तरह के अवैध विसर्जन के लिए। एक व्यक्ति के रूप में जो एक दशक से अधिक समय से इस तकनीक के साथ काम कर रहा है (और एक दूसरा!) और इसके बारे में बहुत कम जानकारी है, मुझे आशा है कि मैं इस सरल यात्रा में एक मार्गदर्शक की भूमिका निभा सकता हूं।
मैं उन लोगों के बारे में संक्षेप में रिपोर्ट करता हूं, जो चर्चा के विषय में रुचि रखते हैं: यह एक तरफ DBMS के बारे में होगा, जो बहुत ही स्पष्ट रूप से, दूसरे पर - सभी प्रकार के IP, CIS, IARPi, आदि के डेवलपर के लिए एक चांदी की गोली की भूमिका का दावा करता है। और इसी तरह। यदि आपको सॉफ़्टवेयर बाज़ार से कोई लेना-देना है, तो बिताया गया समय समाप्त हो जाएगा - मैंने हाल के वर्षों के अपने सबसे अच्छे अनुभव को यहाँ फिट करने की कोशिश की। बिलकुल अकादमिक नहीं। और यहां तक कि अगर आपने पहले ही कैशे को असफल रूप से समझने की कोशिश की है - मेरा विश्वास करो, कभी-कभी प्रवेश द्वार से सबसे सम्मानजनक संस्थान (सही एस्कॉर्ट के साथ) में जाना अधिक प्रभावी होता है। और क्यों छिपाना और संयत होना पाप है - अक्सर यह उपग्रह की बात है।
इसलिए, तैनाती के लिए पहले पांच मिनट।
“और अगर तुम अचानक अपनी कोमल रोशनी से ऊब गए हो,
आपको हमारे साथ एक जगह मिलेगी, सभी के लिए पर्याप्त बारिश होगी। ”
वी। त्सोई
आप हँसेंगे, लेकिन इस प्रक्रिया में सबसे कठिन हिस्सा एक वेब सर्वर को स्थापित और कॉन्फ़िगर करना है। सहित और क्योंकि इंटेरसिस्टम के सहयोगियों ने बहुत अच्छा काम नहीं किया।
जैसे, मैंने कई सालों तक अपाचे पर भरोसा किया है। हजारों उपयोगकर्ताओं के साथ, एक पूरी तरह से स्वीकार्य विकल्प। सामाजिक नेटवर्क और अन्य तनावपूर्ण मनोरंजन उनके नाज़िनक्स चर्चा से परे हैं। कैश 'मुख्य रूप से एक डीबीएमएस है, और फिर बाकी सब कुछ। लेकिन! स्केल करना चाहते हैं - आसान। यदि आप अभी 8-800-2600 कॉल करते हैं ... तो मैं आपके लिए केवल स्केलिंग ही नहीं, बल्कि बग और गतिरोध से अलग-अलग ताबीज-ताबीज भी करूंगा, जो आपकी आभा के लिए विशेष रूप से कॉन्फ़िगर किया गया है।
लेकिन बात है।
Http://www.apache.org/dist/httpd/binaries/win32/ पर हम फ़ाइल
httpd- 2.2 .22-win32-x86-no_ssl.msi उठाते हैं । यहां संस्करण 22 है, लेकिन यदि आपको बाद में एक मिलता है, तो यह डरावना नहीं है, मुख्य बात 2.2 है। यदि आपके पास पहले से ही एक अपाचे वेब सर्वर है, तो हम इस कदम को छोड़ देते हैं - कैश 'न्यूनतम सेटिंग्स को प्रभावित करता है - इसके बारे में अगली तस्वीर के बाद। IIS प्रेमी केवल अपने आप ही सेटिंग्स के साथ मज़े करने का सुझाव दे सकते हैं - मैं इन पृष्ठों पर एक सरल तरीका प्रस्तावित करता हूं, और IIS हमेशा सामने के कमरे में घूमता है।

नौ क्लिक, दो बार "लोकलहोस्ट" में प्रवेश किया, कुछ पंख और ... पीछे सबसे कठिन हिस्सा।
अगला कदम दो गुना आसान है। लेकिन हमें पंजीकरण करने की आवश्यकता होगी:
http://download.intersystems.com/download/ । आपको 11 क्षेत्रों में भरना होगा और छह पंक्तियों पर क्लिक करना होगा (सर्वश्रेष्ठ डीबीएमएस निर्माताओं की तुलना में कोई बदतर बाज़ार नहीं है), लेकिन कला के लिए बलिदान की आवश्यकता होती है:

क्या आपने इसे 5 मिनट में किया है? मुझे भी!
मैं यहां "वॉयला" कहना चाहूंगा और विस्मयादिबोधक बिंदुओं को रोकूंगा, लेकिन नहीं - इन्टरसिस्टम के लोग (मैं प्यार से "आईएस" कहूंगा) हमें यह दिखाने की अनुमति देता है कि हम फ़ाइल को कितनी अच्छी तरह से संभालते हैं।
हमें फ़ाइल C: \ Program Files (x86) \ Apache Software Foundation \ Apache2.2 \ conf \
httpd.conf लगती है
इसके बिल्कुल नीचे (याद रखें, हम प्रवेश द्वार से आए थे) हमें फॉर्म का एक भयानक डिजाइन मिला
#### बेगिन-सीएसपी-अनुभाग () ####
LoadModule csp_module_sa "C: / Program Files (x86) / Apache Software Foundation / Apache2.2 / CSPGateway / CSPa22.dll"
उपनाम / csp / "C: / InterSystems / TryCache / CSP /"
<निर्देशिका "C: / InterSystems / TryCache / CSP">
AddType एप्लिकेशन / x-csp .csp .cls .zen .cxw
AllowOverride कोई नहीं
आदेश की अनुमति, इनकार
सभी से अनुमति दें
</ निर्देशिका>
#### END-CSP-SECTION () ####
#### बेगिन-सीएसपी-अनुभाग (TRYCACHE) ####
उपनाम / trycache / csp / "C: / InterSystems / TryCache / CSP /"
#### END-CSP-SECTION (TRYCACHE) ####
हम इससे ही निकलते हैं
#### बेगिन-सीएसपी-अनुभाग () ####
LoadModule csp_module_sa "C: / Program Files (x86) / Apache Software Foundation / Apache2.2 / CSPGateway / CSPa22.dll"
#### END-CSP-SECTION () ####
इसे थोड़ा अलंकृत करने के बाद, हम प्राप्त करते हैं:
#### बेगिन-सीएसपी-अनुभाग () ####
LoadModule csp_module_sa "C: / Program Files (x86) / Apache Software Foundation / Apache2.2 / CSPGateway / CSPa22.dll"
<स्थान / csp>
पर csp
सेटहैंडलर csp- हैंडलर-सा
</ स्थान>
#### END-CSP-SECTION () ####
खुशी सादगी में निहित है। कड़ाई से बोलते हुए, मुझे याद नहीं है कि अंतर क्या है। लेकिन अंत में आप जो देखते हैं वह काम करता है। और यह कैसे काम करता है। और क्या डिफ़ॉल्ट रूप से लिखा है वैसे भी छोटी गाड़ी है।
अपाचे को कैसे रोकें और पुनः आरंभ करें, मुझे आशा है कि यह पता लगाएगा। संकेत: हम एक हरे तीर के साथ ट्रे में एक लाल पंख की तलाश कर रहे हैं - यह माउस का जवाब देता है, मेरा विश्वास करो।
वैसे यहाँ हम कैश में हैं ’!
“एक भयानक दरार थी।
एलिस गिरी हुई पत्तियों और सूखी पत्तियों के ढेर पर गिर गई।
उसने खुद को चोट नहीं पहुंचाई और जल्दी से अपने पैरों पर कूद गई। ”
एल। कैरोल "एलिस इन वंडरलैंड"
आपको यह पता नहीं है कि संचार के पाँच मिनट बाद आपको कैशे में आपका स्वागत करना कितना अच्छा लगता है। ठीक है, अगर थोड़ी देर बाद, तो बुरे के लिए "ये आपके इंटरनेट हैं" मैं जवाब नहीं देता।
हम जाँचते हैं कि सब कुछ काम करता है:
http: //localhost/csp/samples/ZENDemo.Home.cls - एक हाइपो-त्रिकोण का निरीक्षण करते हैं? तो सब कुछ ठीक है। ब्राउज़र आपको एसवीजी सामग्री प्रदर्शित करने के लिए कह सकता है - मैंने अनुमति दी है और मैं आपको सलाह देता हूं।
पहले से ही ट्रे में एक घन देखा? यदि नहीं, तो दिखाएं (स्क्रीन के नीचे दाईं ओर देखें):

यह इस घन से है कि आगे सब कुछ आ जाएगा। लेकिन केवल अगर यह नीला है। लेकिन अगर घन ग्रे है - इसका मतलब है कि कैश 'आपके लिए शुरू नहीं हुआ है - जो कि कैमेट्स के लिए है।
यह अपाचे और एक सकारात्मक तरीके से धुन के गंदा विन्यास के लिए डेवलपर्स को माफ करने का समय है। इसके अलावा, निकट भविष्य में, वे आईपी द्वारा विकसित किए गए, हमसे अधिक असफल होंगे।
उदाहरण के लिए, कैश के घन पर कोई फर्क नहीं पड़ता कि आप कैसे दबाते हैं - चाहे दाएं बटन के साथ या बाएं - मेनू हमेशा एक ही है:

सबसे पहले, सिस्टम प्रबंधन पोर्टल पर एक नज़र डालें। मुझे ऐसी कई कंपनियों के बारे में पता है, जिनमें किसी को भी यह पता नहीं है कि इसका इस्तेमाल कैसे किया जाता है और साथ ही साथ प्रतिष्ठान भी फलते-फूलते हैं। अब हमें काम के लिए एक क्षेत्र बनाने के लिए पोर्टल से आवश्यक है।
हम डेटाबेस और क्षेत्र के बीच अंतर करते हैं:
Cache 'डेटाबेस (डेटाबेस) डिस्क पर एक फाइल है, रिकॉर्ड जिसमें हमारे डेटाबेस से संबंधित हैं साधारण कारण है कि वे इस फाइल में हैं।
एक नेमस्पेस कैश के कॉन्फ़िगरेशन में एक परिभाषा है जो किस डेटाबेस और किस उद्देश्य के लिए हम उपयोग करते हैं, इसके बारे में जानकारी एकत्र करता है। एक क्षेत्र एक डेटाबेस से प्रोग्राम ले सकता है, और दूसरे से डेटा। यह कैशे में स्केलिंग की मूल बातों में से एक है - सरल और बहुत सुविधाजनक। क्षेत्र की परिभाषा को बदलकर, मैं सिस्टम के सभी उपयोगकर्ताओं को तुरंत अद्यतन कार्यक्रमों के साथ काम करने के लिए स्विच कर सकता हूं, लेकिन वर्तमान डेटा के साथ - जो मैं हर दो सप्ताह में एक बार करता हूं - मैं सभी कार्यक्रमों के संस्करणों को बदलता हूं, और उपयोगकर्ता शायद ही इसे नोटिस करते हैं।
एक क्षेत्र बनाएँ:


यहाँ, इस तरह, यह ध्यान देने योग्य है कि
वैश्विक क्षेत्र के लिए (इस शब्द को जानें - यह संग्रहीत डेटा कैश में कहा जाता है) और
प्रोग्राम विभिन्न डेटाबेस से लिए जा सकते हैं।
चूंकि हम नए क्षेत्र के लिए एक नया डेटाबेस बनाना चाहते हैं, पहले हम यह करते हैं:


आगे "अगला", फिर से "अगला" और "खत्म" - डेटाबेस बनाया गया है, और हम क्षेत्र बनाने के लिए लौट आए:

और यहाँ:

कैशे के साथ अगले पांच मिनट की बातचीत पूरी हो गई है। अब हमारे पास प्रयोग के लिए अपना निजी क्षेत्र है। अभी भी कोई परिणाम नहीं है, लेकिन कुछ मिनटों में हम आपके साथ कुछ करेंगे - मैं गारंटी देता हूं।
स्टूडियो से स्टूडियो!
"लेकिन वह इसे एक रिंच के साथ कहीं फिसल गया,
मैंने धूल में कुछ देखा
अंदर मैंने कहीं फूंका, -
आपको क्या लगता है, चलो चलें! ”
ए। तोडोवस्की "वासिली टर्की"
पहाड़ पर कुछ देने के लिए क्या आपके हाथ भी खुजलाते हैं? मैं सहमत हूं। निचले दाईं ओर नीले क्यूब पर क्लिक करें:


स्टूडियो हमसे पूछेगा कि हम किस क्षेत्र में काम करेंगे - बीएस का चयन करें और ओके पर क्लिक करें, पासवर्ड हमारे लिए उपयोगी नहीं होगा:

प्रारंभ में, कैश 'स्टूडियो एक जटिल डिजाइन में प्रकट होता है:

लेकिन क्रॉस और ड्रैग के साथ थोड़ा काम करते हुए, आप एक पर्याप्त प्रतिनिधित्व प्राप्त कर सकते हैं। "इंस्पेक्टर", "देखें" और इतने पर। हमें इसकी आवश्यकता होगी, लेकिन बाद में, और अगली तस्वीर में मैं उन्हें उजागर करता हूं कि उन्हें कैसे चालू करें (शीर्ष पर चार बटन), किस स्थिति में। यह मेरे लिए इस तरह सुविधाजनक है:

इस बिंदु पर, एक और "हैलो दुनिया!" और प्रोग्रामिंग की वास्तविकता के अनुरूप पिछले जीता गया था - हम एक वयस्क तरीके से खेलते हैं।
कार्यक्रम कहां से आते हैं?
"पिरामिड एक सरल लेकिन बहुत दिलचस्प तंत्र निकला -
एक प्रकार का सुधारक जो भ्रम को वास्तविकता में बदल देता है।
आपको बस कुछ के साथ आने की जरूरत है, और फिर पिरामिड को चालू करें, और बनाया
कल्पना के रूप में असली दुनिया के रूप में हो जाता है .. "
के। सयमक "ट्रांसफर स्टेशन"
कल्पना, यह मुझे लगता है, उत्कृष्ट सॉफ्टवेयर डिजाइन में मदद करता है। लेकिन कार्य निर्धारित करते समय, कोई भी बुरा सलाहकार नहीं है - और इसके बारे में नहीं भूलना बहुत महत्वपूर्ण है। इसलिए, हम बस आगे बढ़ेंगे। हम
DatabaseAnswers.org मॉडल
से मुक्त डेटा मॉडल की
लाइब्रेरी में से एक का उपयोग करेंगे
। इस प्रकार, हम समस्या और डिजाइन के बयान के दोनों चरण को छोड़ देते हैं। किसी भी मामले में, कैश एक सहायक नहीं है।
उदाहरण के लिए, मॉडल को लें।

मैं बाएं से दाएं और ऊपर से नीचे तक लागू करने का प्रस्ताव करता हूं। खैर, या ऐसा ही कुछ।
कक्षाएं हमारी सब कुछ हैं। स्टूडियो अनुभाग, "सीएसपी फाइलें" और "अन्य" भूल जाते हैं। यह बच्चों की रुचि के लिए है। और प्रिय के लिए सेवानिवृत्त कैशे 'दिग्गज।
इसलिए, दाएं बटन के एक हल्के आंदोलन के साथ एक वर्ग बनाएं:

यह ध्यान दिया जाना चाहिए कि कैशे में कक्षाएं संकुल में स्थित हैं। उदाहरण के लिए, इस तरह:

पैकेज के नामों और उनके घोंसले के आविष्कार के साथ, मेरा सुझाव है कि आप बहुत सावधान रहें।
ओसम का रेजर , जैसा कि एक बार मेरे सामने प्रस्तुत किया गया था, यह बताता है कि आपको आवश्यक होने से परे संस्थाओं की संख्या में वृद्धि नहीं करनी चाहिए। हालांकि, कुछ इस के साथ सामना करते हैं। सब के बाद, सबसे कठिन बात एक भोज विचार को समझना है - आप इसे जान सकते हैं, विभिन्न अंगों द्वारा इसे पुन: उत्पन्न करने में सक्षम हो सकते हैं, दूसरों को सिखा सकते हैं, और इसका उपयोग करने में सक्षम हो सकते हैं। लेकिन इसे समझ में
नहीं आता।
Le Chatelier ,
Heisenberg , Occam और
Sandwich के सिद्धांत
, बहुत से लोग कभी समझ नहीं पाएंगे। आखिरकार, उन्हें यकीन है कि वे
पहले से ही उन्हें समझ रहे हैं।
इसलिए, क्लास बनाने के अनुरोध के बाद, हमें संबंधित डायलॉग दिखाया जाएगा:

संकुल और कक्षाओं को क्या कहा जाता है?
यहां
डिजाइन पैटर्न को याद करने का समय है। जब प्रश्न के साक्षात्कार के लिए आवेदक "आप किस पैटर्न का अधिक बार उपयोग करते हैं?" वह जवाब देता है: "अलग - अब,
कन्वेयर अच्छी तरह से चल रहा है ...", - आप तुरंत समझते हैं कि आप एक जिम्मेदार व्यक्ति हैं और दिनचर्या के लिए तैयार हैं। और कैशे में संकुल के नाम के लिए तैयार नहीं '।
एक कैश डिजाइनर को हमेशा
डोमेन ऑब्जेक्ट्स (डोमेन मॉडल, डीएम) में सोचना चाहिए। रात। स्ट्रीट। लालटेन। फार्मेसी। कौन अमूर्तता का उपयोग करना चाहता है - कृपया सामने के दरवाजे से प्रवेश करें। हमारे पास यहां सब कुछ सरल तरीके से है - हम पारंपरिक रूप से सभी प्रकार के "लेखांकन रजिस्टर" को तरल अवस्था में लाते हैं और विलय करते हैं। पीड़ा के मुआवजे के रूप में "ठीक है, मैं इसे डीएम में कैसे कह सकता हूं?" जल्दी या बाद में, सही तालमेल सेट होता है - सिस्टम उन प्रभावों के लिए पर्याप्त रूप से प्रतिक्रिया करना शुरू कर देता है जिसके लिए डिजाइनर ने इसे तैयार नहीं किया था।
यह संकेत जो आप जानते हैं कि यह टेम्प्लेट सरल है: आपको ग्राहक के नए अनुरोधों के लिए कुछ भी करने की आवश्यकता नहीं है। सिस्टम बिल्कुल एक वास्तविक व्यवसाय की तरह व्यवहार करता है - यह फलता-फूलता है।
डीएम मुख्य टेम्पलेट है। और वह पहले हमारे लिए उपयोगी होगा।
एक और छोटी टिप्पणी:
कैशे 'एक डोमेन मॉडल के सिर्फ एक अच्छे कार्यान्वयन से अधिक प्रदान करता है। यहां, बहुत संक्षिप्त और सुविधाजनक साधन न केवल डेटा का एन्कैप्सुलेशन प्रदान करते हैं, बल्कि संबंधित कक्षाओं में विषय क्षेत्र की वस्तुओं का व्यवहार भी करते हैं।
तो, हम कहते हैं:

और तुरंत, समाप्त पर क्लिक करें। तथ्य यह है कि "अगला" पर क्लिक करने के बाद वे आपको पूरी तरह से बेकार अतिरिक्त रूप दिखाएंगे, इसलिए मैं अपना समय बर्बाद नहीं करना चाहता।
यह ठीक वैसा ही है जैसा कि कैशे में क्लास खाली दिखता है:

मुझे नहीं पता कि यह आपके साथ कैसे है, लेकिन जब मैं इस तरह के निर्माणों को देखता हूं तो मेरा दिल धड़क जाता है। और कुछ नहीं। ये कोई बेवकूफ नहीं हैं "सार्वजनिक स्थैतिक शून्य मुख्य" और अन्य में शामिल हैं stdio.h - स्वतंत्रता!
अपनी सभी स्पष्ट सादगी के साथ - सिस्टम कोड की हजारों लाइनें, कृपया आईएस द्वारा प्रदान की गई, अब (संकलन के बाद, निश्चित रूप से) इस वर्ग के साथ काम करने की अनुमति देगा। हमने अभी तक कुछ नहीं किया है, लेकिन सिस्टम पहले से ही जानता है कि इसके उदाहरण कैसे बनाएं, उन्हें हटाएं, अनुरोधों को पूरा करें, और बहुत कुछ। सिर्फ इसलिए कि यह% Persistent System क्लास से विरासत में मिला है, जो वस्तुओं के भंडारण और उन तक पहुंच को लागू करता है।
लेकिन डेटा के बिना, ऐसा करना बहुत स्मार्ट नहीं है। गुणों के साथ हमारी कक्षा भरें (दाएं माउस दाएं बटन का उपयोग करें):


मेरा सुझाव है कि तुरंत "समाप्त" पर क्लिक करें। हम "अगला" बटन का उपयोग करते हैं, लेकिन थोड़ी देर बाद।
हम योजना की जांच करते हैं। "प्रस्तुति का स्थान" इकाई के दो और गुण हैं - उन्हें दाहिने बटन द्वारा उसी तरह से जोड़ा जाता है। या "Ctrl-C + Ctrl-V" का उपयोग करना। फिर मैं तुरंत क्लास को संकलित करने का सुझाव देता हूं:

अब जांचें कि यह वर्ग काम करता है।
पहले हम इसे एक वस्तु के रूप में स्पर्श करते हैं। सरलता के लिए, हम यह कैशे टर्मिनल के माध्यम से करेंगे। ट्रे में क्यूब पर क्लिक करें, "टर्मिनल" चुनें:


हमें कमांड लाइन कैश के साथ टर्मिनल विंडो मिलती है। "USER" डिफ़ॉल्ट क्षेत्र है। आप इसे "बीएस" में बदलने के लिए सेटिंग्स के माध्यम से अफवाह कर सकते हैं।

लेकिन एक सरल तरीका है - "
zn " क्षेत्र को बदलने की आज्ञा। हमारे क्षेत्र में जाने के बाद, कक्षा का एक उदाहरण बनाएं, इसके गुणों को भरें और सहेजें:
नोड: पापाहॉस्ट, इंस्टेंस: TRYCACHE
USER> zn "बीएस"
BS> set obj = ## वर्ग (place.One)।% नया () // कंस्ट्रक्टर की परवाह न करें
बीएस> सेट obj.Name = "बिग टॉप" // गेट्टर सेटर के बारे में परवाह न करें
BS> सेट obj.Description = "स्टेशन के पास स्थित स्टेशन पर"
BS> do obj।% Save () // डेटा की बचत कैसे होती है, इसकी परवाह न करें
चौंकिए मत। यह केवल सत्यापन के लिए है। वास्तविक विकास में, ऑब्जेक्ट दिखाई देते हैं और अधिक सभ्य संग्रहीत होते हैं। इसके बारे में थोड़ा कम।
हमारी सभी वस्तुओं को SQL टेबल के रूप में भी दर्शाया गया है। वास्तव में, डेटा तक कई पहुंच हैं - आप उनके साथ वस्तुओं के रूप में काम कर सकते हैं (हमने इसे ऊपर की कोशिश की), जैसा कि तालिकाओं के साथ (उस पर नीचे), और तथाकथित प्राप्त करें "सीधी पहुँच"। मैं आम तौर पर उत्तरार्द्ध के बारे में चुप रहता हूं - यदि आप इसके बारे में नहीं जानते हैं, तो आप कम खो देंगे, लेकिन यदि आप इसका पता लगाना चाहते हैं, तो मुझे लगता है कि आप इसमें महारत हासिल कर सकते हैं।
हमारे घन पर डेटा के लिए SQL-एक्सेस के लिए आपको "सिस्टम प्रबंधन पोर्टल" का चयन करने की आवश्यकता है, और SQL- प्रश्नों पर जाएं:

अगला:
1. हमारे क्षेत्र "बीएस" चुनें
2. जगह "से एक चयन करें" क्वेरी दर्ज करें। एक "
3. हम अनुरोध को निष्पादित करते हैं
4. हम उस तालिका की पंक्ति देखते हैं जहां हमने जो ऑब्जेक्ट सहेजा है वह प्रदर्शित होता है।

SQL एक्सेस आपको सामान्य SQL सिंटैक्स का पूर्ण उपयोग करने की अनुमति देता है। आप प्रयोग कर सकते हैं, लेकिन एक सलाह है: मैं INSERT, UPDATE, और DELETE कमांड का उपयोग डोमेन कक्षाओं के लिए नहीं करता। ट्रिगर और घटनाओं की हैंडलिंग (उदाहरण के लिए, जब बचत) भिन्न हो सकती है। और इन आदेशों का उपयोग करते समय विषय क्षेत्र के कार्यान्वयन में लगाए गए सभी श्रम राख हो जाएंगे। SQL कमांड के बजाय, हम विधियों का उपयोग करेंगे% नया (),% सहेजें (),% DeleteId ()।
इसलिए, मुझे आशा है कि आप भी सफल हुए। यही है, हमने सरल गुणों के साथ एक वर्ग बनाया और इसके प्रदर्शन के प्रति आश्वस्त हो गए।
पहला आवेदन
"प्लेबॉय आकृति, कोको चैनल अधोवस्त्र,
और जो भी एक लड़की सिर्फ एक नया मॉडल है ...
चबूतरे की अनुमति दें, मैं बिना छुपाये कहूंगा।
चबूतरे की अनुमति दें, मैं संपर्क में हूं। "
आई। लैगुटेंको
मुझे ठीक से याद नहीं है कि कैश का ZEN का कौन सा संस्करण सामने आया था, लेकिन मुझे यकीन है कि अब से अल्ट्रा-थिन क्लाइंट मेरे लिए कैशे का एकमात्र और एकमात्र वैकल्पिक ग्राहक बन गया है। मैं और अधिक कहूंगा - यदि CSP (कैश सर्वर पेज - एस्प, जेपी सीरीज़, आदि से प्रौद्योगिकी) के समय के दौरान, CSP + कैश पर एक कार्य से संक्रमण + PHP और MySQL पर कार्य और इसके विपरीत शांत और चिकना था, तो ZEN के साथ। अब और नहीं - ZEN (और एक डेटाबेस जो विषय क्षेत्र को लागू करता है) का उपयोग करने की श्रम लागत इतनी हास्यास्पद है कि डिजाइन, विकास और रखरखाव के किसी भी अन्य तरीके को कठिन श्रम माना जाता है। सामान्य तौर पर, जैसा कि दाढ़ी वाले मजाक में - नए कार्यों के लिए ZEN इन कैशे का उपयोग नहीं करते हैं, आप ग्राहक के प्रति मूर्खतापूर्ण या कथित रूप से कार्य करते हैं।
और मैंने इसे अब एक प्रदर्शन पर खर्च किए जाने की तुलना में अधिक लंबा लिखा। "बनाएँ" पर क्लिक करें:

"ज़ेन" टैब पर जाएं और "न्यू ज़ेन पेज" चुनें:

अगला, हमें इनपुट के लिए एक फॉर्म की पेशकश की जाती है। ईमानदार होने के लिए - 5 से अधिक वर्षों के लिए ZEN के साथ काम करना, मैं शायद उसे तीसरी बार देख रहा हूं। मूल रूप से, पृष्ठों को बनाने के लिए, मैं सबसे उपयुक्त ZEN पृष्ठ के कोड की प्रतिलिपि बनाता हूं जो पहले से ही कुछ समय में बनाया गया था और आवश्यक परिवर्तन करता है। लेकिन पहले पृष्ठ के लिए हम इसका उपयोग करते हैं:

आप पहले से ही समझ गए हैं कि ज़ेन पृष्ठ समान कक्षाएं हैं। और उन्हें बैग में पैक भी किया जाता है। आइए एक नाम के साथ आते हैं:

और तुरंत "समाप्त करें" पर क्लिक करें। "अगला" कृपया स्पर्श न करें - आपको एक ऐसे स्थान पर ले जाया जाएगा जहां आप उत्पाद आपूर्तिकर्ता के लिए कुछ अजीब अनुभव कर रहे हैं। यह इस तरह होना चाहिए:

वाह! जब मैंने कहा कि मैंने टेम्पलेट का उपयोग नहीं किया है, तो मेरे मन में इस तरह के प्रभाव थे। हम क्रम और संकलन (Ctrl-F7):

असल में, हमने एप्लिकेशन बनाया। "हैलो वर्ल्ड!" न देखें। मुझे भी। लेकिन आवेदन जाने के लिए तैयार है। आप मेनू (संकलन बटन के दाईं ओर) या "F5" में ग्लोब पर क्लिक करके इसे एक्सेस कर सकते हैं। लेकिन दो बारीकियां हैं:
1. देखने का पता
http: // localhost: 57772 / csp / bs / zui.Places.cls जैसा दिखेगा - तथ्य यह है कि जब आप कैश स्थापित करते हैं, तो यह अपनी जरूरतों के लिए पोर्ट 57772 पर एक वेब सर्वर को तैनात करता है और किसी कारण के लिए कोशिश करता है इसके माध्यम से, स्टूडियो में हमारी सफलता को प्रदर्शित करता है। इस वेब सर्वर की कई सीमाएँ हैं और हम इसका उपयोग नहीं करना चाहते हैं। इसलिए, हम अपनी अपाचे में स्टूडियो से पृष्ठों के प्रदर्शन को कॉन्फ़िगर करेंगे - इसके लिए, स्टूडियो मेनू में "प्रोजेक्ट" - "सेटिंग्स" का चयन करें, और दिखाई देने वाली विंडो के "उन्नत" टैब में, पोर्ट को साफ़ करें (हम कॉलो से सब कुछ हटा देंगे
लोकलहोस्ट पाने के लिए):

उसके बाद, स्टूडियो मेनू में, प्रोजेक्ट को सहेजें - "फ़ाइल" - "प्रोजेक्ट सहेजें"।
2. तथ्य यह है कि जब हमने क्षेत्र बनाया था, तो सिस्टम ने इसके लिए एक csp एप्लिकेशन बनाया था (ZEN csp के शीर्ष पर चलता है)। नए बनाए गए एप्लिकेशन तक पहुंच सीमित है - हमें एक नाम और पासवर्ड दर्ज करने के लिए प्रेरित किया जाएगा। और यह अच्छा है! लेकिन एक उपयोगकर्ता बनाने और उसे अधिकार सौंपने के लिए थोड़ा समय देना होगा। हम क्यूब के लिए इंतजार कर रहे हैं और "सिस्टम मैनेजमेंट पोर्टल" खोलें

(और कब, आखिर में, आईएस ने डीपसी सेक्शन को हटा दिया है ... या इस मार्केट को आग लगा देता है - मैं इसके बावजूद नहीं खरीदूंगा!)

बटन "एक नया उपयोगकर्ता बनाएं" काफी ध्यान देने योग्य है - और विशेष रूप से उस व्यक्ति की आंखों को नुकसान पहुंचाता है जो रूसी भाषा से थोड़ा परिचित है। दिलचस्प है, इस अनुवादक ने भी इस पर परीक्षा उत्तीर्ण की? ऐसा लगता नहीं है कि हम पुराने ढंग के हैं। सुरक्षा के बारे में, यदि आप कैशे उठाते हैं, तो मैं ध्यान देने की सलाह देता हूं - कम से कम
"इन्टरसिस्टम कैश 'डीबीएमएस सिक्योरिटी स्टैंडर्ड" पर ध्यान दें - कभी-कभी एक तकनीकी लेखक का एक महीने का काम विकास टीम के एक वर्ष की तुलना में अधिक उपयोगी होता है - पाठ गंभीर रूप से उपयोगी है। यदि आप पाते हैं कि पोर्टल में सुरक्षा ऑडिट कहाँ स्थित है - यह भी सुनिश्चित करें कि यह पता लगाया जा सके - यह आपके क्षितिज को व्यापक बनाता है।
डेटिंग के उद्देश्य के लिए, हम बस यह करेंगे - अधिकार% वाले उपयोगकर्ता बनाएं - अर्थात, "सभी समावेशी" - सब कुछ अनुमत है - आईपी आपको एक भगवान की तरह महसूस कर सकता है (कभी-कभी):

नाम और पासवर्ड दो बार दर्ज करें - अपने हाथों से कुछ और न छुएं। अलविदा। "सहेजें" पर क्लिक करें और "रोल्स" टैब पर जाएं। % सभी भूमिका का चयन करें, और इसे उपयोगकर्ता को सौंपें:

यह इस तरह होना चाहिए:

दरअसल, कैश '(और ZEN) उपयोगकर्ता-भूमिका-संसाधन दृष्टिकोण को पूरी तरह से लागू करता है। लेकिन मुझे डर है कि इसके लिए मेरा समय पर्याप्त नहीं होगा - खुद प्रयोग करें। बहुत सारी सकारात्मक भावनाओं को प्राप्त करें। मुझे उम्मीद है। लेकिन स्टूडियो में वापस जाएं और "F5" (या ग्लोब) दबाएं। ज़ेन पृष्ठ पर उपयोगकर्ता नाम और पासवर्ड दर्ज करें, हमारा पहला आवेदन खुलता है:

और फिर से - और कुछ नहीं। ब्यूटी! यह कल्पना करना कठिन है कि कुछ "हैलो, दुनिया!" अपनी उपस्थिति के साथ इस खुशी से स्वच्छ पृष्ठ को खराब कर सकता है। (विदेशी एजेंट)।
एक अनुभवी डेवलपर समझ जाएगा कि मैं वास्तव में किस बारे में खुश हूं - बेशक, कोई त्रुटि नहीं। वह घूम रही है! 90% काम हो गया है।
पहला काम (!) अनुप्रयोग
"मैं एक आंधी बनाना चाहता था - लेकिन मुझे एक बकरी मिली,
एक पीले रंग की पट्टी के साथ गुलाबी बकरी।
पूंछ के पैर के बजाय, और सींग के पैर पर।
मैं उस बकरी से दोबारा मिलना नहीं चाहूंगा। ”
अज्ञात लेखक
यह हिस्सा पिछले वाले से थोड़ा छोटा होना चाहिए। क्या स्वाभाविक है - एक रिक्त पृष्ठ के रूप में एक उत्कृष्ट कृति बनाने के लिए सर्कस प्रदर्शन के स्थानों में प्रवेश करने और प्रदर्शित करने के लिए एक फॉर्म तैयार करने की तुलना में बहुत अधिक कठिन है।
याद रखें कि हमने पहले ही डेटाबेस में "प्लेस ऑफ व्यू" श्रेणी का एक ऑब्जेक्ट बचा लिया है? चलो इसके प्रदर्शन से निपटते हैं। ऐसा करने के लिए, हमें "टेबलपैन" नामक एक ZEN घटक की आवश्यकता है:

इसके बाद मैं उन स्रोतों को पोस्ट करूँगा जिन्हें मेनू "टूल्स" से स्टूडियो में डाउनलोड किया जा सकता है - "स्थानीय रूप से आयात करें"।
स्रोत:
Places1.xmlसंकलन करें और देखें कि क्या हुआ:

लेआउट के साथ समस्याएं हैं, लेकिन यह ठीक करने योग्य है। मुख्य बात यह है कि हमने डेटा प्रदर्शित करना सीख लिया है। अब उन्हें यूजर इंटरफेस से रिकॉर्ड करते हैं। ZEN डॉक्यूमेंटेशन में
MVC (मॉडल - व्यू - कंट्रोलर) टेम्प्लेट के कार्यान्वयन के बारे में बहुत कुछ लिखा गया है, लेकिन मैंने इसे नहीं पढ़ा है और आपको सलाह नहीं देता - मैं बेहतर दिखाता हूं कि यह कैसे काम करता है।
सबसे पहले, हमें% ZEN.DataModel.Adaptor से अपने संग्रहीत वर्ग को इनहेरिट करना होगा:

स्रोत:
one1.xmlऔर इंटरफ़ेस वर्ग में जोड़ें:
1. नियंत्रक
2. एक फॉर्म जो दर्शाता है कि हमारा कंट्रोलर इसके डेटा में लगा हुआ है
3. घटना प्रसंस्करण के तरीके (यहाँ विधि डेटा बचाता है और तालिका अद्यतन करता है)

स्रोत:
Places2.xmlब्राउज़र में:

एक रिकॉर्ड जोड़ें:

मुझे आशा है कि आप भी सफल हुए?
तालिका पंक्ति का चयन करते समय नियंत्रक में ऑब्जेक्ट डेटा लोड करने के लिए, हमें थोड़ा कोड भी चाहिए। उसी समय, विलोपन, इंडेंटेशन और अन्य सुविधाएं जोड़ें।

स्रोत:
Places3.xmlआखिरी हेडिंग से शुरू होने वाले अपने टेक्स्ट को देखते हुए, मुझे पैथोस और इमोडिटी की स्पष्ट कमी महसूस होती है - लेकिन हमने ऐसा किया - सीखा कि कैसे AJAX का उपयोग करके अल्ट्रा-थिन क्लाइंट में DBMS डेटा के साथ काम करना है। वस्तुतः इससे अनभिज्ञ।
संचार
"सिस्टम की गुप्त कार्रवाई,
मन के नीचे छिपा हुआ
सब कुछ से बंधा हुआ गधा
भगवान की रचना। ”
आई। हबर्मन
Intersystems वस्तुओं के बीच संबंधों के लिए कई विकल्प प्रदान करता है, जिनमें से दो जीवित हैं - प्रकार की वस्तु की संपत्ति और एक-से-कई संबंध। मैं आपको कैशे के साथ अपने सभी अनुभव के साथ जोड़ता हूं - किसी भी मामले में ऑब्जेक्ट-कलेक्शन प्रॉपर्टीज, पैरेंट-चाइल्ड रिलेशनशिप या अन्य वन-टू-वन रिलेशनशिप का इस्तेमाल न करें। मैं व्यक्तिगत रूप से उन स्थितियों को विशेषता देता हूं, जहां इस तरह की विकृतियों के लिए दोषों को डिजाइन करने की आवश्यकता होती है। मुझे उन प्रोग्रामर्स के काम के लिए भी खेद है जिन्होंने "माता-पिता-बच्चे" के कार्यान्वयन को लिखा था, लेकिन यह काम कैलोरी और बजट की बर्बादी थी। बकवास।
एक-से-कई संबंधों और ऑब्जेक्ट गुणों का उपयोग करना आपको सिस्टम में सभी बाध्यकारी समस्याओं को आसानी से और सार्वभौमिक रूप से हल करने की अनुमति देता है। यह वह है - उदाहरण के लिए हमारे सर्कस ले लो।
आरेख के स्थान ऑब्जेक्ट में, हम Ref_Place_Types वर्ग का जिक्र करते हुए, place_type_code नाम के
फॉरेन फॉरेन की टाइप की संपत्ति (यदि आप कैशे के साथ काम करने का इरादा रखते हैं तो भूल जाएं)।
"संदर्भ" जैसा कि यह इंगित करता है कि हम एक संदर्भ पुस्तक के साथ काम कर रहे हैं, लेकिन मैं "संदर्भ पुस्तक" की अवधारणा के उपयोग का विरोध कर रहा हूं - जब तक कि हम उपायों और भार या ब्रैडिस तालिकाओं के संदर्भ पुस्तक के साथ काम नहीं कर रहे हैं। कोई भी वस्तु जिसे हम मूर्खतापूर्वक संदर्भ (संदर्भ मूल्यों की तालिका) कहते हैं, कुछ बिंदु पर व्यवहार पा सकते हैं और एक संदर्भ होना बंद कर सकते हैं - नए गुण और नए तर्क दिखाई देंगे - और तथाकथित पर लगाए गए प्रतिबंध एक "गाइड" काम को बहुत नुकसान पहुंचा सकता है।
तो बस कक्षा बनाएं "प्रस्तुति का प्रकार"। मैंने अपनी जगह पर क्लिक किया। सही माउस बटन के साथ स्टूडियो क्लास पदानुक्रम में। "कॉपी" का चयन किया, जिसके बाद मैंने क्लास कोड को थोड़ा ठीक किया। उसी तरह, मैंने साइट प्रकारों के साथ काम करने के लिए एक इंटरफ़ेस बनाया।
स्रोत:
type1.xml ,
placeTypes1.xmlएक ब्राउज़र में, यह इस तरह दिखता है:

अब हमें "प्रेजेंटेशन के स्थल" वर्ग में "टाइप" संपत्ति को परिभाषित करने की आवश्यकता है। थोड़ा विचार करने के बाद, आप इस निष्कर्ष पर आ सकते हैं कि अवांछनीय प्रकार का विलोपन हमारे लिए अवांछनीय है - मैं यह देखना चाहूंगा कि जब कोई प्रकार हटा रहा हो, तो हटाए जाने वाले प्रकार के लिए कोई स्थान नहीं हैं। चूंकि इसके लिए तर्क लिखने में बहुत आलसी है, और रिश्तों के उपयोग पर प्रतिबंध ध्यान देने योग्य नहीं है, हम रिश्ते को "एक-से-कई" के रूप में वर्णित करते हैं। स्टूडियो में, जगह में। एक वर्ग में, "जोड़ें" - "नई संपत्ति" पर राइट-क्लिक करें।



* "स्थान" गुण जगह में नहीं हैं। अभी तक वर्ग - इसलिए, मैंने इसे अपने हाथों में टाइप किया है - स्टूडियो इसके निर्माण का ध्यान रखेगा:

फिर, दो वर्ग विवरणों में, ब्लॉक एक-से-कई संबंधों के लिए जिम्मेदार दिखाई दिए:
जगह में। एक:
/// साइट का प्रकार
संबंध प्रकार जगह के रूप में। टाइप [कार्डिनैलिटी = एक, उलटा = स्थान];
सूचकांक टाइपइंडेक्स प्रकार पर;
और जगह में। टाइप करें:
स्थान के रूप में संबंध। एक [कार्डिनैलिटी = कई, उलटा = प्रकार];
हम संकलन करते हैं।
इंटरफ़ेस पर "साइट प्रकार" फ़ील्ड के इनपुट को व्यवस्थित करने के लिए, हम नए ज़ेन नियंत्रण (इनपुट फ़ील्ड के बाद
dataCombo के लिए
देखें ) का उपयोग करेंगे:
<टेक्स्ट लेबल = "नाम" dataBinding = "नाम" />
<टेक्स्ट लेबल = "विवरण" dataBinding = "विवरण" />
<पाठ लेबल = "विवरण" डेटाबाइंडिंग = "विवरण" />
<dataCombo dataBinding = "टाइप"
sql = "select ID, विवरण from place.Type"
sqlLookup = "प्लेस से विवरण चुनें। जहां आईडी =?"
/>
Sql पैरामीटर में, हमने नियंत्रण को बताया कि उपयोगकर्ता को विकल्प कैसे पेश किया जाए, और sqlLookup में कंट्रोलर से डेटा कैसे लोड किया जाए (उदाहरण के लिए, टेबल में एक नई पंक्ति चुनते समय)।
तालिका में प्रदर्शित करने के लिए, हम "तीर" के माध्यम से निहित JOIN की मेरी बहुत पसंदीदा विशेषता का उपयोग करेंगे।
<tablePane id = "PlacesTable"
तालिका नाम = "जगह। एक"
onselectrow = "zenPage.onSelectPlace ()"
valueColumn = "ID"
>
<कॉलम colName = "ID" छिपाया गया = "सही" />
<कॉलम हेडर = "नाम" कॉलनेम = "नाम" चौड़ाई = "20%" />
<कॉलम हेडर = "विवरण" कॉलनाम = "विवरण" चौड़ाई = "30%" />
<कॉलम हेडर = "विवरण" कॉलनाम = "विवरण" चौड़ाई = "30%" />
<कॉलम हेडर = "टाइप" कॉलनेम = "टाइप" कोलएक्सप्रेशन = "टाइप-> विवरण" />
</ TablePane>

उसी तरह, आप त्वरित रूप से ईवेंट क्लासेस और उनके प्रकार बना सकते हैं:

परियोजना के स्रोत:
circus1.xmlपरिणामी इंटरफ़ेस इस तरह दिखता है:

वह क्षण आ गया है जब या तो आपको ईमानदारी से रुकने और अगले भाग या पोस्टपोन के बारे में सोचने की जरूरत है - यह मात्रा अप्रत्याशित रूप से बड़ी हो गई है।
मैं कैश के बारे में क्या कहना चाहता था:हमें डोमेन ऑब्जेक्ट्स, उनके संबंधों और व्यवहार को डिजाइन करने के लिए एक शक्तिशाली उपकरण मिला। कम से कम तर्कहीन रूप से "कैश के साथ काम करते समय" डोमेन मॉडल "पैटर्न का उपयोग न करें।
ZEN आपको डेटाबेस डिज़ाइन से GUI कार्यान्वयन के लिए जल्दी से जाने की अनुमति देता है, जो ग्राहक को संतुष्ट करने तक सैकड़ों स्केच और प्रोटोटाइप प्रदर्शन करना संभव बनाता है।
कल का छात्र कुछ ही दिनों में प्रौद्योगिकी को मानता है। दो हफ्ते बाद, उसने जो कोड लिखा, वह आसानी से उत्पादन में समाप्त हो सकता है।
परिवर्तन करना अक्सर अगली रिलीज़ की प्रतीक्षा नहीं कर सकता है - उपयोगकर्ता की आवश्यकताओं को एक टेलीफोन वार्तालाप के भीतर पूरा किया जा सकता है। अक्सर एक उपयोगकर्ता को संशोधित कोड के साथ काम करने के लिए "F5" का उपयोग करने की आवश्यकता नहीं होती है।
मेरे पास बताने के लिए समय नहीं है:भंडारण-स्तर की विरासत एक महान उपकरण है जो एक ही डेटा तक पहुंचने के लिए अलग-अलग इंटरफेस प्रदान करता है।
प्रबल जोइन। पाठ (और स्रोत) में एक उदाहरण है, लेकिन उपकरण की शक्ति का खुलासा नहीं किया गया है।
और लेखक से:मैं केवल एक आश्वस्त व्यक्ति नहीं हूं, मैं आलस्य का प्रचारक हूं। आलसी बनाया कोड तुरंत दिखाई देता है - यह संक्षिप्त, समझ में आता है, और बहुत कुशलता से सटीक और केवल वही करता है जो इसके लिए इरादा है। अंतिम कारक महत्वपूर्ण है - अक्सर प्रोग्रामर सार्वभौमिक कोड के बारे में सोचता है और लिखता है, जिसका भाग्य सिस्टम के जीवन चक्र के अंत तक मापदंडों के अनुमानित द्रव्यमान में बिल्कुल कुछ भी नहीं मिलता है और प्रोग्रामर द्वारा कल्पना की गई सैकड़ों की बजाय केवल दो मान लौटाता है (बदतर अगर विश्लेषक)। एक आलसी प्रोग्रामर को भेद करना भी आसान है - वह हंसमुख और कुशल है। वह धर्मनिरपेक्ष गपशप और NoSQL होलिवर्स से अवगत है। वह सिनेमाघरों का दौरा करते हैं और बच्चों से मिलते हैं। यदि वह कार्यक्रम करता है, तो केवल तब जब आप इसके बिना नहीं कर सकते।
कुछ लोगों का तर्क है कि इंटेरसिस्टम की योग्यता छोटी है - मुख्य बात गैर-भाषा वास्तुकला की एम-भाषा, ग्लोबल्स और अन्य खुशियाँ हैं (पहले संस्करण में, मुझे यहां फ्रायड में सील कर दिया गया था, टाइपिंग का काम)। हमारे कई प्रोग्रामर कैश के साथ कई वर्षों से काम कर रहे हैं और ग्लोबल्स, ओह हॉरर के साथ काम करने की आज्ञा भी नहीं जानते हैं!
इंटेरसिस्टम की योग्यता यह है कि उन्होंने "रोजमर्रा के एम" के बारे में भूलना संभव बना दिया - उन्होंने इसे केवल एक मसाले के रूप में उपयोग करने की पेशकश की जो पूरी तरह से अलग पकवान का स्वाद सजता है, जिसके व्यंजनों के साथ मैंने आपको शुरू करने की कोशिश की।
महत्वपूर्ण फुटनोट: उपरोक्त सभी रूसी लेखांकन मानकों पर लागू नहीं होते हैं - कुख्यात आरएएस, जो आपको लेखांकन को व्यवस्थित करने की आवश्यकता नहीं है का एक घृणित उदाहरण है। मैं लेखांकन सॉफ्टवेयर कभी नहीं लिखूंगा। मैंने खुद को 20 साल पहले बताया था। का पालन करते हैं। स्टाल में कोई "वायरिंग" ऑब्जेक्ट नहीं है! एक शोकेस, विक्रेता, कैश डेस्क है। 22 बजे तक एक अल्कोहल ऑब्जेक्ट है। लेकिन वायरिंग ऑब्जेक्ट नहीं है। क्या वह वायरिंग है?
आपका ध्यान देने के लिए धन्यवाद।