क्या प्रोग्रामिंग सीखने के लिए गेम विकसित करना सबसे अच्छा तरीका है? [बन्द है]


21

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

ध्यान दें कि यह .net / xna / c # विकास की ओर था।


3
"तथ्य यह है कि सब कुछ कोड में बनाया जाना था"। 3D मॉडल, बनावट, आवाज़ और अन्य संसाधनों के बारे में क्या? आप उनके बिना एक गेम इंजन बना सकते हैं, लेकिन बहुत कम संसाधनों के साथ एक पूर्ण गेम, भले ही असंभव नहीं हो, काफी चुनौती होगी।
POSIX_ME_HARDER

@ शायर: ठीक है, आप प्रोसेसिंग जैसी चीजों के साथ प्रोग्राम कर सकते हैं। मैं यह नहीं कह रहा हूँ कि यह बहुत व्यावहारिक है।
एनटी

2
@ शायर: हाँ, कुछ लोग इस चुनौती को बहुत सीधे तौर पर लेते हैं, सब कुछ प्रक्रियात्मक रूप से बनाकर । वाणिज्यिक खेलों में बहुत आम नहीं है (जहां तक ​​मुझे पता है), लेकिन यह साबित करने के लिए लोकप्रिय है कि यह किया जा सकता है और मैंने इस तरह कुछ बहुत प्रभावशाली डेमो देखा है।
FrustratedWithFormsDesigner

6
मैं इस सवाल को गेमिंग के बारे में पूछने के बजाय 'गेम डेवलपमेंट' का मतलब मानता हूं? कॉल ऑफ़ ड्यूटी से C ++ तक बौद्धिक छलांग नहीं लगा सकते ...
HorusKol

1
यदि आप चाहते हैं कि खेल खेलने योग्य हो तो आप अच्छी तरह से जान सकते हैं कि आपको गति के पक्ष में शुद्ध OO डिजाइन से समझौता करने की आवश्यकता है।
पीटर टेलर

जवाबों:


25

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

  • ग्राफिक्स
    • 3 डी गणना
    • गति अनुकूलन
    • ग्राफिक्स हार्डवेयर के साथ इंटरफेस
  • खेल
    • डेटा संरचनाएं
    • बचत के लिए फ़ाइल प्रारूप
    • सामान्य डिज़ाइन, या फिर आप एक गड़बड़ बना देंगे जिसमें सुविधाओं को जोड़ना असंभव है
    • नेटवर्क ज्ञान अगर खेल मल्टीप्लेयर है
  • एआई एल्गोरिदम
    • रास्ता पाना
    • लड़ाई लड़ना
  • प्रकाशन
    • ओएस ज्ञान जैसे कि इंस्टॉलर कैसे काम करते हैं
    • संभवतः शब्द को बाहर निकालने के लिए वेब विकास

तुम देखो, एक खेल एक कवर कर सकते हैं बहुत कुछ एक साथ क्षेत्रों के। यदि आप समय बिताना और इसे अच्छा बनाना चाहते हैं तो यह एक उत्कृष्ट शिक्षण उपकरण है।

OOP के लिए, यह एक पैटर्न है जो अच्छी तरह से काम करता है। आप अच्छी डिजाइन तकनीकों का अभ्यास करने के लिए एक खेल के रूप में एक खेल उपकरण का उपयोग कर सकते हैं।

हालाँकि, आपके प्रश्न का उत्तर देना, यह प्रोग्रामिंग सीखने का एकमात्र तरीका नहीं है। एक बार जब आप एक मध्यवर्ती डेवलपर बन जाते हैं, तो गेम बनाने से आप बहुत सारी प्रोग्रामिंग अवधारणाओं और स्तरों को छू पाएंगे। इसके अलावा, यह मजेदार है!


12
आप एक बात भूल गए, उस खेल के लिए एक कहानी, और कभी-कभी, कहानी यह सब मायने रखती है।
महमूद होसाम

यह मानता है कि यह एक 3 डी गेम है।
एडम हर्ट

1
@ एडम: यह करता है, लेकिन 2 डी की गणना भी है। मैं अब जानबूझकर परीक्षण-आधारित आरपीजी को छोड़कर;)
माइकल के

1
@Mohmoud कहानी कभी भी "सभी मायने रखती है"। यह एक बुरी / लापता कहानी के रूप में बस एक बड़ी गलती है। ऐसे कई पहलू हैं जो एक अच्छा खेल बनाते हैं। मैं एक उबाऊ खेल नहीं खेलना चाहता, चाहे कहानी कितनी भी शानदार क्यों न हो। इसके अलावा सबसे सफल पहेली खेल एक कहानी नहीं है।
एडम हेर्टे

गेम थ्योरी भी आसान है।
पुण्योसोमीडिया

46

टॉटोलॉजिकल नहीं है, लेकिन प्रोग्रामिंग सीखने के लिए प्रोग्रामिंग सबसे अच्छा तरीका है। यदि आप कंप्यूटर गेम में रुचि रखते हैं, तो प्रोग्रामिंग गेम प्रोग्रामिंग सीखने का एक शानदार तरीका हो सकता है।

मुझे खेलों की परवाह नहीं है, लेकिन मुझे गणित से प्यार है, इसलिए मेरी सीखने की बहुत सारी परियोजनाएं स्वभाव से बहुत गणितीय थीं।

लब्बोलुआब यह है, आपको कोड के साथ समस्याओं को हल करने के तरीके खोजने की आवश्यकता है, और कई लोगों के लिए गेम काम करते हैं।


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

@ पेंग्विन किस तरह से कॉल ऑफ ड्यूटी या हैल्लिफ आपको प्रोग्रामिंग सिखाएगा?
jwenting

13

यह अन्य तरीकों के अलावा, प्रोग्रामिंग सीखने का एक तरीका है। जब आप कोड लिखते हैं, तो आप चीजें सीखते हैं। अब, क्या यह सबसे अच्छा तरीका है? पूरा यकीन नहीं।

कम से कम, आपके शिक्षक द्वारा दिए गए दो कारण मान्य नहीं हैं

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

  • "आपको वास्तव में अपने कार्यक्रमों में पूरी तरह से अनुभव करने और ओओपी को लागू करने के लिए मिलता है" : किसी को मुझे यह समझाना होगा कि यह केवल खेलों के लिए ही क्यों मान्य है, लेकिन किसी अन्य चीज के लिए अमान्य है। यदि आप OOP को समझते हैं और इसका उपयोग करना चाहते हैं, तो आप इसे व्यावसायिक अनुप्रयोगों में भी उपयोग कर सकते हैं। यदि आप इसे प्राप्त नहीं करते हैं या इसका उपयोग नहीं करना चाहते हैं (और उदाहरण के लिए कार्यात्मक प्रोग्रामिंग का उपयोग करना पसंद करते हैं), गेमिंग विकास आपको बदलने के लिए मजबूर नहीं करेगा।

परंतु:

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

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


4
खेल OOP के साथ अच्छी तरह से काम यह देखना चाहते हैं कि हर बहुत आसान है क्योंकि BadGuy, Weapon, PowerUp, और एक खेल में अन्य मदों आसानी से एक वस्तु हो सकता है। आपको ऑब्जेक्ट्स और उन्हें स्क्रीन पर देखने के बीच प्रोग्राम इंटरेक्शन मिलता है । मुझे लगता है कि दृश्य भाग वह है जो इसे इतना आकर्षक बनाता है। व्यावसायिक अनुप्रयोग ServerTaskScheduler, जिनमें AbstractDataProcessor, की UserQueryAgent, आदि प्रकार की पदानुक्रम हैं ... उतने रोमांचक नहीं हैं , भले ही वे गेमिंग में ओओपी अवधारणाओं को सिखा सकते हैं।
FrustratedWithFormsDesigner

4
@FrustratedWithFormsDesigner: शायद मैं सिर्फ यह है क्योंकि मैं बहुत ज्यादा समय बिताया व्यापार एप्लिकेशन विकसित नहीं मिलता है, लेकिन मुझे समझ नहीं आता क्यों यह कैसे को देखने के लिए और अधिक कठिन हो जाएगा Customerया Productया Transactionवस्तुओं हो सकता है। लेकिन मैं समझता हूं कि BadGuyबोरिंग Transactionएस के बजाय एस से निपटने के लिए यह अधिक सुखद है ।
आर्सेनी मूरज़ेंको

यह अमूर्त सोच के स्तर के बारे में अधिक है। कुछ प्रोग्रामर्स नामों पर बहुत अधिक लटके हुए हैं क्योंकि उन्हें पता नहीं है कि किससे संबंधित होना चाहिए। उदाहरण के लिए, मैं कुछ देवों से मिला हूँ जिन्हें पता नहीं है कि क्या होता है Transaction
Spoike

7

गेम्स प्रोग्रामिंग गेम्स प्रोग्रामिंग सीखने का सबसे अच्छा तरीका है। यदि आप वेब विकास सीखना चाहते हैं, तो ऐसा करें, यदि आप सिस्टम प्रोग्रामिंग सीखना चाहते हैं, तो ऐसा करें।

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

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


7

प्रश्न: प्रोग्रामिंग सीखने का सबसे अच्छा तरीका क्या है

उत्तर: वह विधि जो आप वास्तव में करते हैं

यानी, जब कुछ सीखते या करते हैं, तो इससे कोई फर्क नहीं पड़ता है कि आप किस विधि को इतनी देर तक चुनते हैं, यह एक ऐसी विधि है जिसे आप वास्तव में देखते हैं।

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

... लेकिन हाँ, गेमिंग एक बहुत अच्छा तरीका है प्रोग्रामिंग सीखने का, क्योंकि इसमें गणित, संगामिति, एल्गोरिदम, ऊप, ग्राफिक्स आदि शामिल हैं।


4

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

इसके अलावा, माना जाता है कि बहुत ही शानदार जवाब है, हां, खेल विकास आपको बहुत सारे अच्छे कौशल सिखाएगा जो मुझे लगता है, और यदि आप कंप्यूटर गेम का आनंद लेते हैं तो यह आपको विकास प्रक्रिया में रुचि रखेगा। यह किताबों में आपके द्वारा देखे जाने वाले अन्य सरल ऐपों की तुलना में अधिक दिलचस्प है।


2

मैं कहूंगा कि कोड सीखने का सबसे अच्छा तरीका यह है कि आप इसे मज़ेदार बनाएं। यह एक असली खेल नहीं है, लेकिन आप के लिए खेल के कुछ प्रकार है। मेरे लिए, यह एल्गोरिथम विकसित करने वाली कुछ गणित की समस्याओं को इस तरह से हल करने का खेल है कि मैं एक जटिल समस्या को सबसे तेज़ तरीके से हल कर सकता हूं। अपने आप को चुनौती देना मैं एक समस्या को हल करने के हर प्रयास में एक बेहतर कोडर बन जाता हूं। समस्या उतनी ही कठिन होगी।

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


2

मैंने उन दावों के बारे में कभी नहीं सुना है जिनमें हैल्लिफ़ या कॉल ऑफ़ ड्यूटी बजाना आपको प्रोग्रामिंग कौशल सिखाता है।

प्रोग्रामिंग उन्हें हो सकता है, लेकिन प्रोग्रामिंग कुछ ऐसा है कि कुछ भी नहीं है एक शुरुआत भी थोड़ा सा प्रयास करना चाहिए। और विशेष रूप से शुरुआती अक्सर इस धारणा के तहत होते हैं कि वे अपने गैर-मौजूद प्रोग्रामिंग ज्ञान के साथ अगली ब्लॉकबस्टर बना सकते हैं। उन्हें पहले एक PacMan या Tetris क्लोन बनाने की कोशिश करने के लिए कहें और वे चिल्लाएं कि यही वह नहीं है जो वे करना चाहते हैं और आपको 'मुझे zhh koduz' देना चाहिए।


1

नहीं वास्तव में कोई नहीं। प्रोग्रामिंग सीखने के लिए एक सर्वोत्तम प्रकार का प्रोजेक्ट नहीं है । सबसे अच्छी प्रकार की परियोजना वह है जो आपके हितों के लिए प्रासंगिक है।

उदाहरण के लिए, मैंने कुछ अलग तरीके से प्रोग्रामिंग सीखने की कोशिश की, जिसमें प्रोग्राम गेम सीखना भी शामिल है। यह सिर्फ छड़ी करने के लिए कभी नहीं लग रहा था।

फिर जब मुझे यह सीखने की ज़रूरत थी कि मैं अपने शोध में क्या कर रहा था, उसके लिए कैसे कार्यक्रम बनाऊँ? अभी मैं यह कहने के लिए काफी सहज हूं कि मुझे 2 भाषाएं पता हैं, और मैं तीसरे पर काम कर रहा हूं। क्यूं कर? क्योंकि यह मेरे हितों के लिए प्रासंगिक था। मेरे पास इसके साथ रहने का एक कारण था, सीखने का एक कारण, और पुस्तक में सिर्फ "व्यायाम 8" की तुलना में अधिक समस्याएं।

यह, संयोग से, इसका मतलब यह नहीं है कि प्रोग्रामिंग महामारी मॉडल प्रोग्रामिंग सीखने का सबसे अच्छा तरीका है। लेकिन यह मेरे लिए सबसे अच्छा तरीका था। आपका पता लगाएं यह खेल हो सकता है, लेकिन यह बहुत अच्छी तरह से नहीं हो सकता है।


"परियोजना का सर्वोत्तम प्रकार वह है जो आपके हितों के लिए प्रासंगिक है"। तथास्तु।
ब्रायन ओकली

0

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

इसके अलावा, यदि यह एक बहुत ही जटिल खेल है, तो आप इस पर कुछ महीनों तक काम करेंगे, और आपको अपने द्वारा किए जाने वाले हर चीज के दस्तावेजीकरण के महत्व का एहसास होगा - जो बाद में आपको एक टीम का बेहतर सदस्य बना देगा।


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

0

मुझे लगता है कि यह खेल के विकास पर एक उत्कृष्ट लेख है।

यह कुछ बुनियादी क्षेत्रों पर ध्यान केंद्रित करने की बात करता है

  1. खेल के विकास के लिए जुनून।
  2. सीखने की प्रवृत्ति।
  3. खेल खेल का आनंद लेना महत्वपूर्ण है।
  4. आपके प्रोग्रामिंग कौशल का महत्व।

0

मैं सहमत हूँ सिवाय ...

यह संभवत: पहला प्रोग्रामिंग अनुभव है जैसा कई लोग लेगो रोबोट (माइंडस्टॉर्म) का निर्माण और प्रोग्रामिंग कर रहे थे।

जबकि सामान्य शब्द "गेम" एक श्रेणी को इतना विशाल रूप में परिभाषित कर सकता है कि लगभग सभी प्रोग्रामिंग को समाहित कर लेता है, जब मूल पोस्टर के संदर्भ में उपयोग किया जाता है तो इसका मतलब हमेशा "कयामत शैली के खेल लिखना" होता है।

जैसा कि पहले कहा जा चुका है - प्रोग्रामिंग सीखने का सबसे अच्छा तरीका कुछ ऐसा है जो आप वास्तव में चाहते हैं जिसे एक कार्यक्रम की आवश्यकता है। वह है - आप जो प्रोग्राम चाहते हैं, उसे लिखकर प्रोग्रामिंग सीखें।

मेरे पहले विंडोज प्रोग्राम्स में से एक MIDI कंट्रोलर प्रोग्राम था, क्योंकि मैं वास्तव में एक MIDI कंट्रोलर प्रोग्राम चाहता था, और Windows एकदम सही लग रहा था (MIDI, आदि के लिए स्लाइडर, बटन, एसडीके सपोर्ट)। मैंने उस प्रोग्राम से विंडोज प्रोग्रामिंग के बारे में एक टन सीखा (यह विन 3.1 दिनों में वापस आ गया था)।

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

अंत में मैं शिक्षक के कथन से काफी असहमत हूं। प्रोग्रामिंग सीखने का सबसे अच्छा तरीका उस प्रोग्राम को लिखना है जिसे आप वास्तव में चाहते हैं।

आर

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