वर्तमान कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग कार्यान्वयन की स्थिति क्या है?


90

मैं हास्केल में कुछ सरल स्वचालित भौतिक प्रणालियों (जैसे पेंडुलम, रोबोट हथियार, आदि) की कल्पना करने की कोशिश कर रहा हूं। अक्सर उन प्रणालियों को समीकरणों द्वारा वर्णित किया जा सकता है

df/dt = c*f(t) + u(t)

जहाँ u(t)किसी प्रकार का 'बुद्धिमान नियंत्रण' का प्रतिनिधित्व करता है। वे प्रणालियां कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग प्रतिमान में बहुत अच्छी तरह से फिट दिखती हैं।

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

मेरा सवाल यह है कि आज और अधिक उन्नत, या अधिक व्यावहारिक, या यहां तक ​​कि व्यावहारिक अभ्यास के लिए अधिक परिपक्व, अप-टू-डेट, सुव्यवस्थित, प्रदर्शन-ट्यून विकल्प क्या है?

यह विकी पृष्ठ हास्केल के लिए कई विकल्पों को सूचीबद्ध करता है, लेकिन मैं निम्नलिखित मामलों के बारे में स्पष्ट नहीं हूं:

  1. कॉनियल एलियट की परियोजना "प्रतिक्रियाशील" की स्थिति, जो (जैसा कि मैं इसे समझता हूं) इस प्रोग्रामिंग प्रतिमान के अन्वेषकों में से एक, थोड़ा बासी दिखता है। मुझे उसका कोड बहुत पसंद है, लेकिन शायद मुझे अन्य अप-टू-डेट विकल्पों की कोशिश करनी चाहिए? वाक्यविन्यास / प्रदर्शन / रनटाइम-स्थिरता के संदर्भ में, उनके बीच प्राथमिक अंतर क्या है?

  2. 2011 में एक सर्वेक्षण से उद्धृत करने के लिए , धारा 6, " ... एफआरपी कार्यान्वयन अभी भी पर्याप्त रूप से कुशल या पूर्वानुमान के लिए पर्याप्त नहीं हैं जो कि डोमेन में प्रभावी ढंग से उपयोग किए जाने के लिए विलंबता की गारंटी की आवश्यकता है ... "। सर्वेक्षण में कुछ रोचक संभावित अनुकूलन का सुझाव दिया गया है, इस तथ्य को देखते हुए कि एफआरपी 15 से अधिक वर्षों के लिए है, मुझे यह धारणा मिलती है कि यह प्रदर्शन समस्या बहुत कम या कुछ वर्षों के भीतर कम से कम हल करने के लिए स्वाभाविक रूप से कठिन हो सकती है । क्या ये सच है?

  3. सर्वेक्षण का वही लेखक अपने ब्लॉग में "समय लीक" के बारे में बात करता है । क्या समस्या एफआरपी के लिए अद्वितीय है, या कुछ ऐसा है जो हम आम तौर पर शुद्ध, गैर-सख्त भाषा में प्रोग्रामिंग करते समय करते हैं? क्या आपने कभी यह पाया है कि समय के साथ एफआरपी-आधारित प्रणाली को स्थिर करना बहुत मुश्किल है, अगर पर्याप्त प्रदर्शन न हो?

  4. क्या यह अभी भी एक अनुसंधान स्तर की परियोजना है? क्या प्लांट इंजीनियर, रोबोटिक्स इंजीनियर, फाइनेंशियल इंजीनियर इत्यादि लोग वास्तव में इनका उपयोग कर रहे हैं (अपनी आवश्यकताओं के अनुरूप जो भी हो)?

यद्यपि मैं व्यक्तिगत रूप से हास्केल कार्यान्वयन को प्राथमिकता देता हूं, मैं अन्य सुझावों के लिए खुला हूं। उदाहरण के लिए, एर्लैंग कार्यान्वयन के लिए विशेष रूप से मजेदार होगा --- फिर एक बुद्धिमान, अनुकूली, स्व-सीखने की सर्वर प्रक्रिया करना बहुत आसान होगा!

जवाबों:


82

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

  • Netwire दक्षता, लचीलेपन और पूर्वानुमानशीलता पर ध्यान केंद्रित करता है। इसकी अपनी घटना प्रतिमान है और इसका उपयोग उन क्षेत्रों में किया जा सकता है जहां पारंपरिक एफआरपी काम नहीं करता है, जिसमें नेटवर्क सेवाएं और जटिल सिमुलेशन शामिल हैं। शैली: लागू और / या तीक्ष्ण। प्रारंभिक लेखक और अनुचर: एर्टुग्रुल सोएलेमेज़ (यह मैं हूं)।

  • प्रतिक्रियाशील-केला पारंपरिक एफआरपी प्रतिमान पर बनाता है। जबकि इसका उपयोग करना व्यावहारिक है, यह क्लासिक FRP अनुसंधान के लिए जमीन के रूप में भी कार्य करता है। इसका मुख्य फोकस यूजर इंटरफेस पर है और wx के लिए तैयार इंटरफेस है। शैली: लागू। प्रारंभिक लेखक और अनुचर: हेनरिक एपेल्मस।

आपको दोनों की कोशिश करनी चाहिए, लेकिन आपके आवेदन के आधार पर आपको एक या दूसरे से बेहतर फिट होने की संभावना होगी।

गेम, नेटवर्किंग, रोबोट नियंत्रण और सिमुलेशन के लिए आपको नेटवायर उपयोगी साबित होंगे। यह उन अनुप्रयोगों के लिए तैयार तारों के साथ आता है , जिसमें विभिन्न उपयोगी अंतर, इंटीग्रल और पारदर्शी इवेंट हैंडलिंग के लिए बहुत सारी कार्यक्षमता शामिल है। एक ट्यूटोरियल के लिए, Control.Wireमेरे द्वारा लिंक किए गए पृष्ठ पर मॉड्यूल के प्रलेखन पर जाएं।

ग्राफिकल यूजर इंटरफेस के लिए वर्तमान में आपकी सबसे अच्छी पसंद प्रतिक्रियाशील-केला है। इसमें पहले से ही एक wx इंटरफ़ेस है (एक अलग लाइब्रेरी रिएक्टिव-केला-wx के रूप में) और हेनरिक ब्लॉग कोड सैंपल सहित इस संदर्भ में FRP के बारे में बहुत कुछ बताते हैं।

अपने अन्य सवालों के जवाब देने के लिए: FRP उन परिदृश्यों में उपयुक्त नहीं है जहाँ आपको वास्तविक समय की भविष्यवाणी की आवश्यकता होती है। यह काफी हद तक हास्केल के कारण है, लेकिन दुर्भाग्य से एफआरपी को निचले स्तर की भाषाओं में महसूस करना मुश्किल है। जैसे ही हास्केल खुद वास्तविक समय के लिए तैयार हो जाता है, एफआरपी भी वहां मिल जाएगा। वैचारिक रूप से नेटवायर वास्तविक समय के अनुप्रयोगों के लिए तैयार है।

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

मैं FRP का उपयोग कर अभी कोई वाणिज्यिक या अन्यथा बड़े पैमाने पर परियोजनाओं के बारे में नहीं जानता। पुस्तकालय तैयार हैं, लेकिन मुझे लगता है कि लोग अभी तक नहीं हैं।


शानदार जवाब, धन्यवाद .. यह आपके पुस्तकालय के शीर्ष पर कुछ सुदृढीकरण सीखने के एल्गोरिदम को लागू करने के लिए एक मजेदार एक्सर्साइज़ होगा।
mnish

3
विशेष रूप से, हाल ही में हास्केल ( निक्की और रोबोट ) में लिखे गए इंडी गेम ने एफआरपी का उपयोग करने का निर्णय लिया ।
एलेक्स आर

23

हालाँकि कुछ अच्छे उत्तर पहले से ही हैं, मैं आपके विशिष्ट प्रश्नों के उत्तर देने का प्रयास करने जा रहा हूँ।

  1. समय पर रिसाव की समस्याओं के कारण गंभीर परियोजनाओं के लिए प्रतिक्रियाशील उपयोग करने योग्य नहीं है। (देखें # ३)। सबसे समान डिजाइन वाला वर्तमान पुस्तकालय प्रतिक्रियाशील-केला है, जिसे एक प्रेरणा के रूप में प्रतिक्रियाशील के साथ विकसित किया गया था, और कॉनल इलियट के साथ चर्चा में।

  2. यद्यपि हास्केल स्वयं कठिन वास्तविक समय के अनुप्रयोगों के लिए अनुपयुक्त है, लेकिन कुछ मामलों में नरम रीयलटाइम अनुप्रयोगों के लिए हास्केल का उपयोग करना संभव है। मैं वर्तमान शोध से परिचित नहीं हूँ, लेकिन मेरा मानना ​​है कि यह एक समस्याजनक समस्या है। मुझे संदेह है कि याम्प जैसी प्रणालियाँ, या एटम जैसी कोड जनरेशन सिस्टम, संभवतः इसे हल करने का सबसे अच्छा तरीका हैं।

  3. एक "टाइम लीक" एक समस्या है जो switchable एफआरपी के लिए विशिष्ट है। रिसाव तब होता है जब कोई सिस्टम पुरानी वस्तुओं को मुक्त करने में असमर्थ होता है क्योंकि भविष्य में किसी बिंदु पर एक स्विच होने पर उन्हें इसकी आवश्यकता हो सकती है। एक मेमोरी लीक (जो काफी गंभीर हो सकती है) के अलावा, एक और परिणाम यह है कि, जब स्विच होता है, तो सिस्टम को रोकना होगा जबकि पुरानी वस्तुओं की श्रृंखला वर्तमान स्थिति उत्पन्न करने के लिए ट्रैवर्स की गई है।

यंपा और प्रतिक्रियाशील-केले के पुराने संस्करणों जैसे गैर-स्विचेबल फ्रेज़ लाइब्रेरी समय लीक से ग्रस्त नहीं हैं। स्विचेबल frp लाइब्रेरी आमतौर पर दो योजनाओं में से एक को नियोजित करती है: या तो उनके पास एक विशेष "निर्माण मोनाड" होता है जिसमें FRP मान बनाए जाते हैं, या वे संदर्भों को सीमित करने के लिए "एजिंग" प्रकार के पैरामीटर का उपयोग करते हैं जिसमें स्विच हो सकते हैं। elerea (और संभवतः netwire?) पूर्व का उपयोग करते हैं, जबकि हाल ही में प्रतिक्रियाशील-केला और अंगूर बाद वाले का उपयोग करते हैं।

"Switchable frp" से मेरा मतलब है कि जो कॉनल के कार्य switcher :: Behavior a -> Event (Behavior a) -> Behavior aया समान शब्दार्थ को लागू करता है । इसका मतलब यह है कि नेटवर्क का आकार गतिशील रूप से स्विच कर सकता है क्योंकि यह चलता है।

यह वास्तव में विरोधाभासी इंटरफेस के बारे में @ ertes के बयान का खंडन नहीं करता है: यह पता चलता है कि Monadएक Eventबनाता है जो संभव बनाता है समय लीक के लिए एक उदाहरण प्रदान करता है, और उपरोक्त दृष्टिकोणों में से किसी के साथ भी समान मोनाड उदाहरणों को परिभाषित करना संभव नहीं है।

अंत में, हालांकि अभी भी बहुत सारे काम बाकी हैं, जो कि एफआरपी के साथ किया जाना है, मुझे लगता है कि कुछ नए प्लेटफॉर्म (रिएक्टिव-केला, एलेरिया, नेटवायर) स्थिर और पर्याप्त परिपक्व हैं कि आप उनसे विश्वसनीय कोड बना सकते हैं। लेकिन अच्छा प्रदर्शन पाने के तरीके को समझने के लिए आपको ins और बहिष्कार को सीखने में बहुत समय लगाना पड़ सकता है।


2
तीर-आधारित पुस्तकालयों (यंपा, नेटवायर) के बारे में, वे स्वैचेबल भी हैं। कारण यह है कि एरो में एजिंग बिल्ट-इन है, आप वास्तव में इससे छुटकारा नहीं पा सकते हैं। (स्ट्रीम ट्रांसफॉर्मर होने के नाते, तीर उनके इनपुट स्ट्रीम के शुरुआती समय के बारे में अज्ञेय हैं।)
हेनरिक एपेल्मस


1
@ हाइनरिचअफेल्मस: यह एक दिलचस्प बिंदु है। मैं आमतौर पर तीर-आधारित पुस्तकालयों के बारे में नहीं सोचता, जैसे कि एलिया / ग्रेपफ्रूट / करंट-रिएक्टिव-केला। मुझे लगता है कि प्रतिक्रियाशील-केला के पिछले संस्करणों में उनकी स्विचिंग काफी करीब थी। यह सिर्फ एक आंत की भावना है, हालांकि, मैंने इसे पर्याप्त रूप से नहीं बताया कि मैं क्या मतलब है।
जॉन एल

2
@DanBurton धन्यवाद, मैं उस नाम को याद करने की असफल कोशिश कर रहा था। मैं मानता हूं कि सोडियम को एक आधुनिक एफआरपी पुस्तकालय माना जाना चाहिए, हालांकि यह प्रतिक्रियाशील-केला जितना लोकप्रिय नहीं है।
जॉन एल

यद्यपि चल रही चर्चा का पालन करना थोड़ा मुश्किल है, यह इंगित करता है कि एक नरम-रीयलटाइम प्रणाली वास्तव में संभव है, बशर्ते जीसी समय किसी तरह से बाध्य हो सकता है। वैसे भी आपके महान जवाब के लिए धन्यवाद।
mnish

20

मैं मोनो और नेट स्थान में कुछ वस्तुओं की सूची देने जा रहा हूं और एक हास्केल स्थान से हूं जो मुझे बहुत पहले नहीं मिला था। मैं हास्केल के साथ शुरू करूँगा।

एल्म - लिंक

इसकी साइट के अनुसार इसका विवरण:

एल्म का लक्ष्य फ्रंट-एंड वेब डेवलपमेंट को अधिक सुखद बनाना है। यह GUI प्रोग्रामिंग के लिए एक नया दृष्टिकोण प्रस्तुत करता है जो HTML, CSS और जावास्क्रिप्ट की प्रणालीगत समस्याओं को ठीक करता है। एल्म आपको दृश्य लेआउट के साथ जल्दी और आसानी से काम करने, कैनवास का उपयोग करने, जटिल उपयोगकर्ता इनपुट का प्रबंधन करने और कॉलबैक नरक से बचने की अनुमति देता है।

इसका FRP का अपना संस्करण है । इसके उदाहरणों के साथ खेलने से यह काफी परिपक्व लगता है।

प्रतिक्रियात्मक विस्तार - लिंक

इसके फ्रंट पेज से विवरण:

रिएक्टिव एक्सटेंशन्स (आरएक्स) अवलोकनीय और ईवेंट-आधारित प्रोग्रामों का पालन करने के लिए एक पुस्तकालय है जो अवलोकन योग्य अनुक्रमों और LINQ- शैली क्वेरी ऑपरेटरों का उपयोग करता है। Rx का उपयोग करते हुए, डेवलपर्स वेब्सवेब के साथ अतुल्यकालिक डेटा धाराओं का प्रतिनिधित्व करते हैं, LINQ ऑपरेटर्स का उपयोग करते हुए क्वेरी एसिंक्रोनस डेटा स्ट्रीम करते हैं, और शेड्यूलर का उपयोग करते हुए अतुल्यकालिक डेटा धाराओं में पैरामीटर को पैरामीटर करते हैं। सीधे शब्दों में कहें, Rx = वेधशालाएं + LINQ + शेड्यूलर।

प्रतिक्रियात्मक विस्तार MSFT से आता है और कई उत्कृष्ट ऑपरेटरों को लागू करता है जो हैंडलिंग घटनाओं को सरल बनाते हैं। यह कुछ दिनों पहले ही खुला हुआ था। यह बहुत परिपक्व है और उत्पादन में उपयोग किया जाता है; मेरी राय में, यह टीपीएल-पुस्तकालय प्रदान करता है की तुलना में विंडोज 8 एपीआई के लिए एक अच्छा एपीआई होगा; क्योंकि वेधशालाएँ गर्म और ठंडी और निवृत्त / विलीन दोनों तरह की हो सकती हैं, जबकि कार्य हमेशा गर्म या किए गए संगणों का प्रतिनिधित्व करते हैं जो या तो चल रहे हैं, दोषपूर्ण या पूर्ण हैं।

मैंने सर्वर-साइड कोड को Ryn का उपयोग करके एसिंक्रोनसिटी के लिए लिखा है, लेकिन मुझे यह स्वीकार करना होगा कि C # में कार्यात्मक रूप से लिखना थोड़ा कष्टप्रद हो सकता है। एफ # में कुछ रैपर होते हैं, लेकिन एपीआई विकास को ट्रैक करना कठिन होता है, क्योंकि समूह अपेक्षाकृत बंद होता है और अन्य परियोजनाओं की तरह एमएसएफटी द्वारा इसका प्रचार नहीं किया जाता है।

इसका ओपन सोर्सिंग इसके IL-to-JS कंपाइलर की ओपन सोर्सिंग के साथ आया है, इसलिए यह शायद जावास्क्रिप्ट या एल्म के साथ अच्छी तरह से काम कर सकता है।

आप शायद F # / C # / JS / Haskell को एक साथ बहुत अच्छी तरह से एक संदेश दलाल का उपयोग करके बांध सकते हैं, जैसे RabbitMQ और SocksJS।

ब्लिंग यूआई टूलकिट - लिंक

इसके फ्रंट पेज से विवरण:

Bling Microsoft की WPF / .NET पर आसानी से प्रोग्रामिंग की गई छवियों, एनिमेशन, इंटरैक्शन और विज़ुअलाइज़ेशन के लिए एक C #-आधारित लाइब्रेरी है। ब्लिंग डिज़ाइन टेक्नोलॉजिस्टों की ओर उन्मुख है, अर्थात, डिज़ाइनर जो कभी-कभी प्रोग्राम करते हैं, जो कि समृद्ध UI डिज़ाइन विचारों के तेजी से प्रोटोटाइप में सहायता के लिए होता है। छात्रों, कलाकारों, शोधकर्ताओं और शौकियों को भी ब्लिंग को विचारों या विज़ुअलाइज़ेशन को जल्दी से व्यक्त करने के लिए एक उपकरण के रूप में उपयोगी मिलेगा। ब्लिंग के एपीआई और निर्माणों को उत्पादन कोड की सावधानीपूर्वक प्रोग्रामिंग के विपरीत, दूर फेंक कोड की तेज प्रोग्रामिंग के लिए अनुकूलित किया जाता है।

मानार्थ LtU- लेख

मैंने इसका परीक्षण किया है, लेकिन क्लाइंट प्रोजेक्ट के लिए इसके साथ काम नहीं किया है। यह बहुत अच्छा लग रहा है, इसमें अच्छा C # ऑपरेटर है जो मानों के बीच बाइंडिंग को ओवरलोड करता है। यह घटना स्रोतों के रूप में WPF / SL / (WinRT) में निर्भरता गुणों का उपयोग करता है। इसके 3D एनिमेशन वाजिब हार्डवेयर पर अच्छा काम करते हैं। यदि मैं विज़ुअलाइज़ेशन की आवश्यकता में प्रोजेक्ट पर समाप्त होता हूं, तो मैं इसका उपयोग करूंगा; शायद इसे विंडोज 8 में पोर्ट करना।

प्रतिक्रियाशील - लिंक

पॉल बेट्ट्स, पहले एमएसएफटी में, अब गितुब में, उस रूपरेखा को लिखा। मैंने इसके साथ बड़े पैमाने पर और मॉडल की तरह काम किया है। यह ब्लिंक की तुलना में अधिक डिकॉफ़्ड है (इसकी प्रकृति से आरएक्स और इसके सार का उपयोग करके) - इसका उपयोग करके यूनिट टेस्ट कोड को आसान बनाना। Windows के लिए github git क्लाइंट को इसमें लिखा गया है।

टिप्पणियाँ

प्रतिक्रियाशील मॉडल अधिकांश प्रदर्शन-मांग वाले अनुप्रयोगों के लिए पर्याप्त है। यदि आप कठिन वास्तविक समय के बारे में सोच रहे हैं, तो मैं चाहता हूं कि अधिकांश जीसी-भाषाओं में समस्याएं हों। Rx, ReactiveUI कुछ छोटी वस्तु बनाता है, जिसे GCed करने की आवश्यकता होती है, क्योंकि इसी तरह से सदस्यताएँ बनाई जाती हैं / निपटाई जाती हैं और कॉलबैक के प्रतिक्रियाशील "मोनड" में मध्यवर्ती मूल्यों को आगे बढ़ाया जाता है। सामान्य तौर पर। नेट में मैं कार्य-आधारित प्रोग्रामिंग पर प्रतिक्रियाशील प्रोग्रामिंग पसंद करता हूं क्योंकि कॉलबैक स्थिर होते हैं (संकलन समय पर जाना जाता है, कोई आवंटन नहीं), जबकि कार्यों को गतिशील रूप से आवंटित किया जाता है (ज्ञात नहीं है, सभी कॉल को एक उदाहरण की जरूरत है, कचरा पैदा होता है) - और लैम्ब्ड संकलन में संकलित-उत्पन्न कक्षाएं।

जाहिर है C # और F # का कड़ाई से मूल्यांकन किया जाता है, इसलिए समय-रिसाव यहां कोई समस्या नहीं है। जेएस के लिए भी। हालांकि यह पुन: प्रयोज्य या कैश्ड वेधशालाओं के साथ एक समस्या हो सकती है।


महान जवाब के लिए धन्यवाद। हास्केल एफआरपी कार्यान्वयन के लिए मुझे जो चीजें पसंद थीं उनमें से एक यह है कि वे मुझे नियंत्रण u(t)और गणना के लिए कम्प्यूटेशंस को स्पष्ट रूप से कम करने की अनुमति देते हैं f(t)। एफ # कार्यान्वयन के लिए मामला है?
mnish

मुझे लगता है कि आप कह सकते हैं कि उन दो कार्यों को अस्थायी रूप से डिकॉय किया गया है, हाँ। वे संभवत: तार्किक रूप से विघटित नहीं हैं। ;)
हेनरिक

जहां तक ​​मुझे पता है, रिएक्टिव एक्सटेंशन्स और अन्य अधिक पॉलिश किए गए यूआई - केंद्रित पैकेज (और हास्केल के बाहर सब कुछ, वास्तव में) केवल ईवेंटेड सिमेंटिक्स का उपयोग करते हैं - जो यह कहना है कि उनके पास उन घटनाओं की धारणा है जिन्हें आप स्विच कर सकते हैं। लेकिन निरंतर समय संकेतों की एक धारणा नहीं जो समान रूप से बातचीत कर सकती है। गाइ के निर्माण के लिए यह ठीक है, मुझे लगता है। हालांकि, सिमुलेशन और मॉडल के निर्माण के लिए, यह दुर्भाग्यपूर्ण हो सकता है।
scvv

क्या आप यह समझ रहे हैं कि सभी कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग काम के कार्यान्वयन के लिए विवेक के बजाय लगातार समय मॉडल की आवश्यकता है? मुझे "प्रक्रिया बीजगणित के साथ समय: वास्तविक समय और असतत समय" नामक एक पेपर मिला है - क्या यह समझने का एक अच्छा प्रारंभिक बिंदु है कि आप किस बारे में बात कर रहे हैं?
हेनरिक

मैं यह नहीं कह रहा हूँ - कुछ करते हैं, कुछ नहीं करते हैं। लेकिन जो लोग करते हैं वे कुछ कार्यों के लिए अधिक अनुकूल होते हैं, और वे जो दूसरों के लिए अधिक अनुकूल नहीं होते हैं ...
sclv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.