رفتن به مطلب
جامعه‌ی برنامه‌نویسان مُدرن ایران

تمامی فعالیت ها

این جریان به طور خودکار بروزرسانی می شود     

  1. دیروز
  2. هفته گذشته
  3. هم اکنون بیش از 85 درصد ایرانیان از گوشی موبایل استفاده می کنند که نزدیک به 90 درصد آنها مجهز به گوشی های هوشمند می باشند. این موضوع درحالی جالب توجه است که طبق آمار امروزه بیشتر زمان فراغت مردم پای گوشی های هوشمند و استفاده از اپلیکیشن ها سپری می شود. یعنی هر یک از کاربران گوشی های هوشمند روزانه بطور میانگین 3 تا 4 ساعت با گوشی خود کار می کنند. درنتیجه بعد از اینترنت، اپلیکیشن های موبایل بیشترین ضریب نفوذ را در بین مردم دنیا کسب کرده اند. برهمین اساس در چند سال اخیر مهاجرت توسعه دهندگان نرم افزار از پلتفرم های دیگر به سمت پلتفرم گوشی های هوشمند همچون سیستم عامل های Android و iOS رشد چشمگیری را شاهد بوده است. از طرفی دیگر مطمئناً خیلی از توسعه دهندگان اپلیکیشن موبایل در ایران اهداف بزرگی برای طراحی و تولید برنامه های متنوع و کاربردی در سر دارند اما متاسفانه نمی توانند در بازارهای خارجی همانند دیگر توسعه دهندگان رقابت کنند و ناچاراً کارهایشان تنها به مارکت های کوچک و معمولی داخلی همچون کافه بازار محدود شده است. درآمد کم و جامعه کاربری کوچک طبیعتاً آن چیزی نیست که امروزه یک توسعه دهنده نرم افزار داخلی به دنبال آن باشد، همینطور بزرگترین مشکل مربوط به توسعه دهندگان اپلیکیشن iOS است که به سادگی امکان انتشار اپ خود را نخواهند داشت... اگر به دنبال ارائه اپلیکیشن موبایل خود در بازار جهانی و کسب درآمد دلاری هستید، از شما دعوت می کنیم تا با سرویس اپوزیتوری همراه شوید. اپوزیتوری یک سرویس ارائه خدمات انتشار و مشاوره در حوزه اپلیکیشن های موبایل است که به توسعه دهندگان و ایده پردازان حوزه نرم افزار موبایل این امکان را خواهد داد تا برنامه های خود را بروی مارکت های Google Play و App Store منتشر و درآمد دلاری کسب کنند. ما یک تیم ایرانی استرالیایی هستیم که برای توسعه دهندگان اپ ایرانی فرصت حضور قانونی در بازارهای معروف گوگل و اپل را فراهم ساخته ایم تا علاوه بر دستیابی به جامعه مخاطبین گسترده تر، امکان کسب درآمد دلاری توسط توسعه دهندگان میسر شود. خدمات اپوزیتوری تنها به انتشار اپلیکیشن شما ختم نخواهد شد، بلکه با استفاده از سرویسهای ابری اپوزیتوری مدیریت و بروزرسانی اپلیکیشن های شما بسیار ساده و منظم تر خواهد بود، همچنین توسط تیم فنی اپوزیتوری امکان استفاده از API های آمازون و فایربیس در برنامه ی شما قابل استفاده خواهد بود و درآمد دلاری برنامه شما نیز به صورت منظم و هفتگی به حساب شما منتقل خواهد شد. "با اپوزیتوری از اپلیکیشن خود در مارکت جهانی درآمد دلاری کسب کنید" برای اطلاعات بیشتر می توانید به وب سایت Appozitory.com مراجعه کنید.
  4. جدیدا
  5. فرهاد شیری

    جناب رمضانی منش به نظرم سوال شما اصلا مبتدی نیست بلکه دقت نظر بالای شما را می رساند! در این کلاس عملگر (=) را مجدد بارگذاری کردم، که باعث می شود در زمان تعریف یک property مقداردهی اولیه را انجام دهد و در صورتی که رشته باشد طول این رشته نیز مقدار دهی می شود. بنابراین در سازنده کلاس هم باید این منطق تکرار شود و به علت اینکه از کد تکراری استفاده نشود عمگر (=) را به این صورت فراخوانی شده است. فراخوانی متدهای عضو کلاس از داخل متدهای عضو که برای فراخوانی عملگرهای بارگذاری شده به این صورت ((-)=operator) فراخوانی می شود. که می توان به این شکل هم نوشت ... explicit CProperty(const property_type& rhs) : m_property(rhs) ,length(0) ,data(get()) { this->operator =(rhs); } OR explicit CProperty(const property_type& rhs) : m_property(rhs) ,length(0) ,data(get()) { ::operator =(rhs); } و دراین قسمت هم اگر در زمان تعریف یک property یک رشته داشته باشیم، جهت اینکه در زمان اجرا به مقدار کلاس string صحیح اشاره کنم به این صورت تبدیل کرده ام. بنابراین به علت اینکه مقدار m_property یک عضو const تعریف شده است، لذا با استفاده از const_cast رفرنس متغیر عضو m_property را از حالت const خارج میکنم و در زمان اجرا به یک اشاره گر *string با استفاده از عملگر reinterpret_cast تبدیل میکنم و در نهایت هم که مقدار اشاره گر را دی رفرنس میکنم و یک رفرنس از کلاس property که به string تبدیل شده را در سازنده به یک متغیر عضو به نام data منتقل میکنم. و البته به این صورت هم می شد نوشت... property_type& get(){ return *(reinterpret_cast<property_type*>(&const_cast<property_type&>(m_property))); } OR property_type& get(){ return *((property_type*)&const_cast<property_type&>(m_property)); } بازهم تشکر میکنم از حسن توجه شما دوست گرامی.
  6. قاسم رمضانی منش

    @فرهاد شیری درود بر شما؛ بابت مبتدی بودن سوأل عذرخواهی می‌کنم؛ ابهام‌هایی در قسمت‌هایی از کد برایم وجود داشت که درست متوجه نشدم. در این قسمت : explicit CProperty(const property_type& rhs) : m_property(rhs) ,length(0) ,data(get()) { operator =(rhs); } هدف‌تان از ;operator =(rhs) چه بوده ؟ مگر عملگر = نیاز به دو عملوند ندارد ؟ چگونه به یک‌باره فراخوانی شده ؟ و چه نیازی بوده ؟ در قسمت دیگر: property_type& get(){ return *(reinterpret_cast<property_type*>(&const_cast<property_type&>(m_property))); } متوجه هدفتان از این تبدیل‌های پیاپی نشدم. با تشکر از شما.
  7. کامبیز اسدزاده

    درود، بستگی داره که پروژه شما دقیقاً بر چه اساسی باشه، وقتی صحبت از بحث نرم‌افزاری هست مسلماً به تنهایی میشه بخش بزرگی از اون رو حداقل تا زمان قبل از تجاری شدن توسعه بدین. اما وقتی محصول شما وارد بازار میشه بحث رقابتی پیش میاد و برای این مسئله شما باید تلاش‌های بسیاری داشته باشید مثل، دریافت و اعمال تجربیات‌کاربری، تبلیغات، توسعه و سرمایه‌گذاری‌های مختلف در زیرساخت‌ها و مسائل مشابه. محصولتون هم تا زمانی که ناقص باشه و ایرادات احتمالی و فنی داشته باشه نمیشه بهش گفت MVP. بنابراین از فرایند چرخه‌ی تولید نرم‌افزار حتماً تبعیت کنید تا این موضوع رو مشخص کنه. در کل بهتره وقتی ایده‌ای به ذهنتون می‌رسه از استاندارد‌هایی که بسیاری از مشکلات رو شفاف و راه‌حل‌ها رو به درستی مشخص می‌کنند دنبال کنید. مثل اعتبار‌سنجی‌های اولیه، تحقیقات بازار، استفاده از بوم‌ناب و یا بوم مدل کسب‌و‌کار. درضمن، هر چقدر هم محصول شما کامل از آب در بیاد، بهتره برای توسعه و موفقیت‌های آینده‌ به فکر تشکیل تیمی باشید که از پس توسعه و پشتیبانی اون خواهد آمد. موفق باشید.
  8. سید محمد عباسی

    ممنونم از مطالبتون ، شاید سخت بیاد که شریک داشته باشی ولی توانایی لازم رو نداشته باشه و یا اصلا در حین کار جا بزنه که دیگه من نیستم! بهتر نیست تنهایی فعلا کار رو پیش ببرم ؟ و البته به این نکته رو فراموش نمی‌کنم که هر چقدر محصول نهاییم ناقص باشه باید قبل از اینکه ارتباط رو با مشتری از دست بدم محصول رو ارائه بدم تا بازخورد‌هارو دریافت کنم .
  9. معمولا یکی از چالش های برنامه نویسی شی گراء که همواره بر سر راه برنامه نویسان وجود دارد، Map شدن دیتاهای موجود در بانک های اطلاعاتی در کلاس های model می باشد. به این ترتیب که بتوان داده ها را در فیلدهایی که در کلاسهای مدل که تعریف شده اند را به این داده ها متصل نمود به همین علت بعد از این Map شدن داده ها باید متدهایی جهت یکپارچه سازی داده ها در این کلاسهای model تعریف نمود تا هم بتوان مقادیر این داده ها را بازیابی کرد وهم بتوان به راحتی این داده ها را به روز رسانی نمود. در صورتی که تجربه کار با entity framework ها را داشته باشید، قطعا متوجه شده اید که وقتی داده ها را به Property کلاسهای مدل Map میکنیم به راحتی با خود همین خصیصه های تعریف شده هم عملیات بازیابی را انجام می دهیم و هم به راحتی مقدار های جدید فیلدهای مرتبط به خصیصه راهم به روز رسانی می نماییم، که با این کارهم بازدهی برنامه بالاتر خواهد بود وهم از نوشتن متدهای پردردسر هم راحت میشویم. با ذکر این مقدمه قصد دارم کلاسی را خدمتتان معرفی کنم که جهت تعریف property ها استفاده می شود، البته استفاده از خصیصه ها در entity framework یکی از کاربرد property می باشد. با استفاده از کلاس زیر می توانید انواع مختلف داد های رایج را به صورت خصیصه تعریف کنید و به راحتی بدون نیاز به تعریف متدهای اضافی از این خصیصه ها استفاده نمایید. البته به علت اینکه این خصیصه ها قابلیت تعریف const را دارا می باشند بسیار مناسب پردزاش های چند نخی می باشند. #ifndef PROPERTY_H_ #define PROPERTY_H_ #include "MyException.h" #include "typeinfo" template<typename Tp> struct CProperty{ typedef Tp property_type; private: inline void setLength(property_type& rhs) throw(MyException){ const_cast<size_t&> (length) = (reinterpret_cast<std::string*>(&rhs))->length(); } const property_type m_property; public: /*Preorder: * default constructor is commented! because if * uncommented and create new object from this and no passed * default value property and when compile the program compiler * no sending error but show error in linker program. */ //CProperty(); //Preorder: copy constructor CProperty(const CProperty<property_type>& rhs): m_property(rhs.m_property) ,length(0) ,data(get()) {} //Preorder: copy operator const CProperty& operator=(const CProperty<property_type>& rhs){ const_cast<property_type&>(m_property) = rhs.m_property; return *this; } /*Preorder: * when create new property must pass the default value of * property! */ explicit CProperty(const property_type& rhs) : m_property(rhs) ,length(0) ,data(get()) { operator =(rhs); } //PreOrder: setter method inline void operator=(const property_type& rhs) throw(MyException){ const_cast<property_type&>(m_property) = rhs; if(strcmp(typeid(property_type).name(),"Ss") == 0) setLength(const_cast<property_type&>(rhs)); } //override comapre method in string class inline bool operator==(const property_type& rhs) throw(MyException){ return get().compare(rhs) == 0; } inline bool operator==(const property_type& rhs) const throw(MyException){ return get().compare(rhs) == 0; } operator Tp() { return m_property; } operator Tp() const { return m_property; } //get the value property property_type& get(){ return *(reinterpret_cast<property_type*>(&const_cast<property_type&>(m_property))); } const property_type& get() const { return *(reinterpret_cast<property_type*>(&const_cast<property_type&>(m_property))); } const size_t length; const property_type data; }; typedef struct CProperty<bool> Bool; typedef struct CProperty<int> Int; typedef struct CProperty<std::string> String; #endif /* PROPERTY_H_ */ و به راحتی به روش های زیر هم می توانید از کلاس فوق استفاده کنید. /*define and set new string property in direct mode*/ const String myStr1("test1"); String myStr2("test1"); /*change property value.l*/ //myStr1 = "change test1"; std::cout << "My String 1 property is:(" << myStr1.data << ") and this length is:(" << myStr1.length << ") " << '\n'; std::cout << "My String 2 property is:(" << (string)myStr2 << ") and this length is:(" << myStr2.length << ") " << '\n'; /*comapre two strings*/ if(myStr2 == myStr1) std::cout << "myStr2 and myStr1 is equal!" << '\n'; else std::cout << "myStr2 and myStr1 is not equal!" << '\n'; /*define boolean property*/ Bool bol(false); std::cout << bol << '\n'; Bool bol2(false); std::cout << bol << '\n'; if((bool)bol2 == (bool)bol) std::cout << "bol2 and bol is equal!" << '\n'; else std::cout << "bol2 and bol is not equal!" << '\n'; /*define int property*/ Int myInt(10); //myInt = 20; //change property در صورتی که ابهام وجود داشت بفرمایید. و اگر هم پیشنهادی و یا انتقادی داشته باشید، خوشحال خواهم شد مطرح کنید. موفق باشید
  10. قاسم رمضانی منش

    کتابخانه‌های استاتیک و داینامیک (پویا)

    توضیحات موردنیاز، قبلاً در این‌پیوند داده شده. حال بیاید ببینیم در عمل چگونه‌است ؟ Static Library یا کتابخانه‌های استاتیک : معمولاً تحت عنوان Archives هم شناخته می‌شوند، یک Static Library شامل مجموعه‌ای از Object-Fileها هست. Object-Fileها سورس‌های کامپایل‌ شدهٔ ما به زبان‌ماشین هستند. این فایل‌ها قابل اجرا نیستند چراکه هنوز کتابخانه‌های موردنیازشان Link نشده. برای کامپایل به‌صورت Object-File از فلگ -c استفاده می‌کنیم : $> cc -c func.c $> cc -c main.c $> cc *.o -o output در اینجا ما سورس‌کدهای func.c و main.c را فقط کامپایل کردیم و بعد (در خط سوّم) Object-Fileها را به کامپایلرمان دادیم تا عمل لینک کردن کتابخانه‌ها و خروجی‌نهایی را تولید کند. برای ساخت Static Library ما از Object-File‌ها به همراه برنامهٔ ar استفاده می‌کنیم، به این‌صورت که اوّل Object-Fileها را تولید می‌کنیم : $> cc -c func1.c $> cc -c func2.c و حالا یک کتابخانه متشکل از Object-Fileها برای ساخت Static-Libraryمان خروجی می‌گیریم : $> ar rcs libfunc.a func1.o func1.o خب ! در این قسمت دو نکتهٔ کوچک و مهم وجود دارد : فایل‌هایی که با استفاده از فلگ -c کامپایل می‌کنید، خروجی‌حاصل فایلی با همان نام فایل ورودی به همراه پسوند .o می‌باشد. اسم کتابخانهٔ شما باید به‌صورت lib*.(a|os) باشد. و این‌چیزی هست که Linker به دنبال آن برای لینک‌کردن می‌گردد. برای کتابخانه‌های‌استاتیک ما از پسوند .a استفاده می‌کنیم و برای کتابخانه‌های‌داینامیک از .so . حال برای استفاده از این کتابخانه‌ما نیاز به دوکار کوچک داریم هنگام کامپایل نهایی داریم : $> cc main.c -L. -lfunc -o output فلگ -L برای مشخص کردن دایرکتوری‌ای که کتابخانهٔ ما در آن قرار دارد استفاده می‌شود. (میدانیم که در UNIX هر دایرکتوری دارای دو لینک می‌باشد؛ یک . (dot) که اشاره به دایرکتوری جاری دارد و.. (dot-dot) که اشاره به دایرکتوری-پدر (parent-directory یا دایرکتوری بالایی دارد). فلگ -l برای مشخص کردن اسم کتابخانهٔ ما استفاده می‌شود، دیدید که ما فقط اسم func را آوردیم، چرا که خود تصور می‌کند اوّل اسم فایل lib و پسوند آن .a یا .so می‌باشد. یک نمونهٔ عملی را می‌توانید از این‌قسمت امتحان کنید : در این مثال از GNU Make استفاده شده است، درصورتی‌که آشنایی ندارید می‌توانید از این‌قسمت با GNU Make آشنا بشوید. امّا نکته‌ای که قابل ذکر هست : در این‌جا شما فقط کتابخانه‌ای که خودتان نوشتید را به‌صورت Static لینک کردید، کتابخانه‌هایی مثل glibc به‌صورت خودکار درحالت Dynamic لینک می‌شوند. Shared Library یا کتابخانه‌ داینامیک : در این روش بازهم ما نیاز به Object-Fileهای سورس‌کد‌ها داریم، با تفاوت اینکه باید فلگ -fPIC یا -fpic را اضافه کنیم که به معنی Position-independent Code می‌باشد؛ می‌دانید که Shared Libraryها یک‌بار فقط در حافظه بارگذاری می‌شوند از این رو نیاز است که سورس‌کدماشینی که تولید می‌شوند وابسته به این نباشد که در جای به خصوصی از حافظه بارگذاری شود. خب Object-Fileها را به صورت PIC کامپایل می‌کنیم : $> cc -c -fPIC add.c $> cc -c -fPIC sub.c حال باید کتابخانهٔ‌اشتراکی خود را با استفاده از فلگ -shared ایجاد کنیم : $> cc -shared add.o sub.o -o libmat.so در اینجا ما از فلگ -shared استفاده کردیم و Object-Fileهای تولیدشده را به عنوان ورودی وارد کرده‌ایم. و حالا می‌توانیم از shared library خودمان استفاده کنیم : $> cc main.c -o output -L. -lmath حال بیاید برنامه را اجرا کنیم : $> ./output ./output: error while loading shared libraries: libmat.so: cannot open shared object file: No such file or directory چرا ؟ به خاطر اینکه linker در آدرس‌های تعریف شده به دنبال کتابخانهٔ‌اشتراکی libmat.so می‌گردد. راه‌های مختلفی برای مشخص کردن مسیر کتابخانهٔ خودمان وجود دارد. انتقال کتابخانهٔ خود به آدرس /usr/lib دستکاری LD_LIBRARY_PATH ... راه‌های مختلف را می‌توانید از لینک‌های زیر دنبال کنید : https://renenyffenegger.ch/notes/development/languages/C-C-plus-plus/GCC/create-libraries/index https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html موفق‌وپیروز باشید .
  11. کامبیز اسدزاده

    چشم‌انداز فنی برای کیوت ۶

    این چشم‌انداز احتمالاً برای دوست‌‌داران کتابخانه‌ی قدرتمند Qt و طرفدارانش جذاب باشد! بنابراین من سعی کرده‌ام تا نتایج پست رسمی کیوت را در رابطه با چشم‌انداز فنی برای آینده‌ی کیوت نسخه‌ی ۶ است در اختیار شما قرار دهم. تقریباً ۷ سال پیش کیوت نسخه‌ی ۵.۰ منتشر شد! از آن زمان بسیاری از چیز‌ها در دنیای اطراف ما تغییر پیدا کرده است. و اکنون وقت آن رسیده است که چشم‌انداز جدیدی را از نسخه‌ی جدید‌تر تعریف کنیم. بنابراین در این پست ما به معرفی مهمترین مواردی که به کیوت ۶ مرتبط است را می‌پردازیم. به نقل از مدیر فنی کیوت Lars Knoll، کیوت ۶ دقیقاً ادامه‌ی کارهایی است که در نسخه‌ی ۵ انجام داده شده است. بنابراین توسعه باید به گونه‌ای باشد که کاربران نباید اذیت شوند. اما نسخه‌ی جدید می‌تواند یک آزادی بالاتر را در اجرای ویژگی‌های جدید، عملکرد و پشتیبانی بهتر از شرایط امروز و فردا از آنچه در حال حاضر می‌توان در سری ۵ داشته باشیم را به ما خواهد داد. همانطور که جزئیات بیشتر در زیر شرح داده شده است، کیوت ۶ هدف زیادی از سازگاری با نسخه‌ی قبلی خود یعنی کیوت ۵ را خواهد داشت. همچنین ما در حال توسعه روی نسخه‌ی ۵ نیز هستیم که قصد داریم برخی از ویژگی‌های کیوت ۶ را در نسخه‌های کیوت ۵.۱۴ و کیوت ۵.۱۵ LTS معرفی کنیم. بنابراین با ثابت نگه‌داشتن ویژگی‌ها در کیوت ۵.۱۴، بیشترِ تمرکزِ تحقیق و توسعه به سمت کیوت ۶ تغییر خواهد یافت. بنابراین انتظار می‌رود کیوت ۶ تا پایان سال ۲۰۲۰ آماده شود. قبل از اینکه همه به چیز‌های جدید بپردازیم، بیایید برخی از ارزش‌های پایه از هسته‌ی اصلی کیوت را برای کاربران خود یادآوری کنیم تا چیز‌هایی که نمی‌خواهیم تغییر کنند را تعریف کنیم. چه چیزی Qt را برای کاربران ما ارزشمند می‌کند؟ کیوت محصولی است که در بازار‌های مختلفی مورد استفاده قرار می‌گیرد، ارزش‌های اصلی در هسته‌ی کیوت برای مشتریان و کاربران ما عبارتند از: ماهیت چند-سکویی آن، به کاربران این امکان را می‌دهد تا برنامه‌های خود را با استفاده از این فناوری به تمامی سیستم‌عامل‌های رو میزی، موبایل و سیستم‌های تعبیه شده (اِمبِد‌ها) مستقر کنند. مقایس پذیری آن از دستگاه‌های کم مصرف و یک منظوره تا برنامه‌های دسکتاپ پیچیده و یا سیستم‌های متصل شده. رابط‌های برنامه‌نویسی و ابزار‌ها و مستندات در سطح جهانی، ایجاد برنامه‌ها را ساده‌تر می‌کند. حفظ، ثبات (پایداری) و سازگاری، امکان حفظ بانک بزرگی از کد‌ها با حداقل تلاش برای نگه‌داری آن‌ها. یک اکو سیستم بزرگ توسعه‌دهنده با بیش از ۱ میلیون کاربر. یک نسخه‌ی جدید از کیوت باید خواسته‌های محصول ما را مطابق با نیاز‌های بازار تنظیم کند، و در عین حال پنج ویژگیِ بالا را به خوبی حفظ کند. بازار دسکتاپ، ریشه‌ی پیشنهادات و یک بازار قوی و مهم برای کیوت است؛ در این مرحله است که بیشترین تماس‌ها با ما و در انجمن‌های کیوت از طرف کاربران صورت می‌گیرد که باید سالم نگه‌ داشتن و رشد آن مهم باشد. بزرگترین بخش از رشد کیوت نیز مربوط به دستگاه‌های تعبیه شده و متصل شده می‌باشد؛ صفحات نمایش لمسی به تعداد تصاعدی در حال افزایش است که در کنار آن افزایش قیمت سخت‌افزار برای این دستگاه‌ها وجود دارد. چیپست‌های کم مصرف، میکرو‌کنترلر‌ها، همراه با صفحه نمایش لمسی به اندازه‌های کوچک در همه جا استفاده می‌شوند. بسیاری از این دستگاه‌ها عملکردی نسبتاً ساده‌ای دارند، اما به رابط کاربری صیقلی و صافی نیاز دارند. بنابراین حجم زیادی از این دستگاه‌ها ایجاد می‌شود و ما باید اطمینان حاصل کنیم که می‌توانیم با ارائه‌ی خود آن فضا را هدف قرار دهیم تا بتوانیم قوبل مقیاس پذیری خود را عملی کنیم. در عین حال، رابط‌های کاربری در طیف دستگاه‌‌ها همچنان به افزایش پیچیدگی ادامه می‌دهند که شامل هزاران صفحه مختلف و برنامه‌های بسیاری است. ادغام عناصر سه بعدی و دو بعدی در یک رابط کاربری مشترک خواهد بود که در کنار آن استفاده از واقعیت افزوده و مجازی نیز وجود خواهد داشت. عناصر هوش مصنوعی بیشتر در حوزه‌ی برنامه‌ها و دستگاه‌ها مورد استفاده قرار می‌گیرد و ما نیاز به روش‌های آنسان برای ادغام با آن‌ها داریم. رشد شدید تعداد دستگاه‌های متصل به هم و همچنین الزامات بسیار بالاتر در تجربه‌کاربر باعث می‌شود تا برای ساده سازی ایجاد برنامه‌ها و دستگاه‌ها، روی ابزار‌های کلاس جهانی تمرکز کنیم. هماهنگ سازی و ادغام طراحان UX در گردش کار توسعه یکی از اهداف است؛ اما بسیاری از زمینه‌های دیگر وجود خواهد داشت که ما باید برای ساده سازی زندگی کاربران تلاش کنیم. کیوت ۶ یک نسخه‌ی اصلی و جدید برای Qt خواهد بود؛ هدف اصلی با چنین نسخه‌ی اصلی و جدید، آماده سازی کیوت برای شرایط مورد نیاز در سال ۲۰۲۰ و بعد از آن، تمیز کردن کد‌های پایه‌ی ما و حفظ آسان‌تر است. به همین ترتیب تمرکز روی آن مواردی خواهد بود که نیاز به تغییرات معماری در کیوت دارند و بدون شکستن برخی از سازگاری‌ها با سری‌های کیوت ۵ قابل انجام نیست. در زیر برخی از تغییرات اساسی که ما باید در کیوت ایجاد کنیم برای مناسب‌تر کردن آن برای سال‌های آینده ارائه شده است. نسل بعدی کیو‌اِم‌اِل (QML) زبان QML و فناوری Qt Quick فناوری‌های اصلی رشد سال‌های گذشته‌ی ما بوده است. روش‌های بصری ایجاد واسط‌های کاربری با استفاده از آن فناوری‌ها نقطه فروش بی نظیری از پیشنهاد ما است. اما QML، همانطور که برای کیوت ۵ ایجاد شده است، دارای تعداد زیادی تغییرات ناگهانی و محدودیت است. این به نوبه‌ی خود به این معنا است که، امکان پیشرفت‌های چشم‌گیری وجود دارد که ما قصد داریم با کیوت ۶ آن‌ها را پیاده سازی کنیم. معرفی وابستگی زیاد به نوع (strong typing)، در واقع وابستگی کم به نوع باعث می‌شود تا کاربران تغییرات زیادی را در کد‌های پایه‌ی خود اعمال کنند. یک سیستم از نوع وابستگی قوی به IDE‌ها و سایر ابزار‌ها اجازه می‌دهد تا کاربران در این کار ما را پشتیبانی کنند و نگهداری آن به طرز چشمگیری کاهش می‌یابد. همچنین ما قادر به تولید کد بسیار بهتر و کاهش سربار خواهیم بود. اعمال JavaScript به عنوان یک ویژگی اختیاری، با توجه به این موضوع، داشتن یک موتور کامل جاوا اسکریپت هنگام استفاده از QML می‌تواند مشکلات را پیچیده‌تر کند و به خصوص هنگام هدف قرار دادن سخت‌افزار کم مصرف مانند میکرو کنترلرها یک مشکل اصلی محسوب می‌شود. اما در بسیاری از موارد استفاده از آن بسیار مفید است. حذف نسخه سازی QML، با ساده کردن برخی از قوانین بررسی و جستجو و تغییرات در برخی از خواص می‌توانیم نیاز به نسخه را در QML حذف کنیم. این به نوبه‌ی خود منجر به ساده سازی‌های زیاد در موتور کیو‌ام‌اِل می‌شود. حجم کار در حفظ فناوری کیوت کوئیک و ساده‌تر کردن استفاده از QML و Qt Quick را برای کاربران بسیار ساده‌تر خواهد کرد. حذف ساختار داده‌های تکراری بین QObject و QML در حال حاضر، برخی از ساختار داده‌ها بین meta-object و QML کپی و تکرار می‌شوند و عملکرد (کارایی و پرفرمنس) را در استارتاپ برنامه کاهش می‌دهد و باعث افزایش مصرف حافظه نیز می‌گردد. بنابراین با متحد کردن ساختار‌های داده‌ها، ما قادر خواهیم بود بخشی اعظمی از آن را حذف کنیم. خودداری کردن از ساختار‌های داده تولید شده این مربوط به نکته‌ی قبل است، جایی که در حال حاضر بسیاری از ساختار‌های داده تکراری در زمان اجرا تولید می‌شوند. باید تولید اکثر آن‌ها در زمان کامپایل کاملاً امکان‌پذیر باشد. پشتیبانی از کامپایل QML برای بهره‌وری از کد‌های بومی C++، با وابستگی زیاد به نوع و قوانین جستجوی ساده‌تر، می‌توانیم QML را به کد‌های بومی C++ تبدیل کنیم که نتیجه‌ی آن به طور قابل توجهی عملکرد زمان اجرا را افزایش می‌دهد. پشتیبانی از پنهان کردن جزئیات اجرا، روش و خصوصیات «خصوصی» یک نیاز طولانی مدت است تا بتوانید داده‌ها و عملکرد‌ها را در اجزای QML پنهاد کنید. هماهنگ‌سازی و ادغام بهتر ابزار‌ها، مدل کد‌های ما غالباً برای QML ناقص است و باعث می‌شود که تغییر مکان و خطاها را در زمان کامپایل غیر ممکن کند. با تغییرات فوق، می‌توان تشخیص کامپایلر را ارائه داد که بتواند با C++ و همچنین پشتیبانی از آن پالایشِ کد‌ها را بهبود بخشد. نسل بعدی گرافیک‌ها بسیاری از موارد در حوزه‌ی گرافیک در نسخه‌ی کیوت ۵ تغییر یافته‌اند. این باعث می‌شود که برای حفظ رقابت و توسعه در پُشته انجام شود. با کیوت ۵، ما از رابط‌های برنامه‌نویسی OpenGL را برای گرافیک‌های ۳ بعدی استفاده کردیم. از آن زمان به بعد، میزبانی از رابط‌‌های برنامه‌نویسی جدید نیز تعریف شده است. بنابراین وُلکان (Vulkan) جانشین مشخصی برای OpenGL در لینوکس است، اپل نیز مِتال (Metal) را تحت فشار قرار داد تا آن را جایگزین کند و مایکروسافت DirectX را دارد. این بدان معنی است که کیوت در آینده مجبور است به صورت یکپارچه با تمام رابط‌های برنامه‌نویسی کار کند. برای اینکه این ویژگی امکان‌پذیر باشد، باید یک لایه‌ی جدید که رابط‌های برنامه‌نویسی گرافیکی را انتزاع می‌کند مانند (QPA برای ادغام سکو) به نام رابط سخت‌افزاری RHering تعریف شود. ما نیز باید زیر ساخت‌های ارائه شده‌ی خود (Qt Quick Scenegraph، QPainter و پشتیبانی ۳ بعدی) را در بالای آن لایه قرار دهیم. مجموعه‌ی رابط‌های برنامه‌نویسی گرافیکی مختلف باعث می‌شود که ما از زبان‌های مختلف سایه‌زنی پشتیبانی کنیم. ابزار Qt Shader به عنوان یک ماژول به ما کمک می‌کند تا سیستمِ سایه‌زنی را به صورت هم‌زمان (کراس‌-کامپایل) و در زمان اجرا کامپایل کنیم. بحث ۳ بعدی نقش مهم و مهمتری را ایفا می‌کند، و پشتیبانی فعلی ما یک راه حل یکپارچه برای ایجاد رابط کاربری (UI) ‌هایی که حاوی هر دو عنصر ۲ و ۳ بعدی باشد را ندارد. ادغام QML با محتوا از Qt3D و یا Qt 3D Studio در حال حاضر کار دشواری است و باعث سر‌ریز شدن برخی از کارایی‌ها و عناصر نمایشی می‌شود. علاوه بر این همگام سازی انیمیشن‌ها و انتقال‌ها بر روی یک فریم با سطح فریم بین محتوای ۲ و ۳ بعدی غیر ممکن است. ادغام جدید محتوای ۳ بعدی با فناوری کیوت کوئیک با هدف حل این مشکل ایجاد شده است. در این حالت، یک سیستم ساخت (رندر) کامل و جدید به شما امکان می‌دهد تا محتوای ۲ و ۳ بعدی را با هم ظبط کنید. با این کار QML به زبان UI تعریف و تبدیل می‌شود که سه بعدی هستند و نیاز به فرمت UIP برطرف می‌شود. ما یک پیش‌نمایش از کیوت کوئیک جدید با پشتیبانی سه بعدی در حال حاضر با کیوت ۵.۱۴ ارائه می‌دهیم که اطلاعات بیشتر در یک پست جداگانه ارائه خواهد شد. سرانجام پشته‌ی گرافیکی جدید نیاز به پشتیبانی از خط لوله‌ی برای چیز‌های گرافیکی هستند که این امکان را می‌دهد تا آن‌هایی که در زمان کامپایل برای سخت افزار مورد نظر تهیه شده‌اند آماده کرده و از موارد مورد نظر استفاده کند. برای مثال، فایل‌های PNG را به بافت‌های فشرده تبدیل می‌کند و بسیاری از آن‌ها را به بافت (Texture) تبدیل کند. سایه‌ها و مِش‌ها را به قالب‌های باینری بهینه شده و موارد دیگر تبدیل خواهد کرد. همچنین هدف ما این است که یک موتور متحد برای پوسته/ظاهر در کیوت ۶ ارائه دهیم که به ما این امکان را می‌دهد تا از نظر ظاهری و احساسات بر روی دسکتاپ و موبایل آن را بر روی هر دو فناوری کیوت‌ ویجت و کیوت‌ کوئیک ارائه کنیم. ابزار یکپارچه و سازگار ابزار‌های گرافیکی ما برای ساخت رابط‌های کاربری به دو بخش با استودیو کیوت ۳ بعدی (Qt 3D Studio) و استودیو طراحی کیوت (Qt Design Studio) تقسیم بندی شده‌اند. علاوه بر آن، استودیو ۳ بعدی اند;ی از بقیه کیوت جدا شده است که باعث می‌شود کمی بیشتر سعی بر آن شود! ابزار‌های طراحی نیز به ایجاد محتوا مانند، محتوای ساخته شده در Photoshop، Sketch، Illustrator، Maya، 3DsMax و دیگر موارد ادغام شده است. ابزار‌های توسعه به توجه زیادی برای تمرکز دارد تا بتوانیم بهترین‌ها را در پشتیبانی کلاس برای QML، C++ و پایتون ارائه دهیم. یک ابزار متحد و یکپارچه این اجازه را می‌دهد که یک طراح UX بتواند از قابلیت‌های طراحی در کیوت کریتور استفاده کند و طراحان می‌توانند از ویژگی‌های ابزار‌های توسعه‌دهنده مانند تهیه یک پروژه یا آزمایش روی یک دستگاه بهره‌مند شوند. ابزار ساخت QMake به عنوان ابزار ساخت در کیوت ۵ مورد استفاده قرار می‌گیرد که تعداد زیادی تغییرات ناگهانی و محدودیت‌ها خواهد دارد. برای کیوت ۶، هدف ما این است که CMake را به عنوان سیستم ساخت ثالث و استاندارد برای ساخت خود کیوت استفاده کنیم. چرا که سی‌میک تاکنون پرکاربرد‌ترین سیستم ساخت در جهان برای سی‌پلاس‌پلاس بوده است و ادغام هرچه‌بهتر آن کاملاً مورد نیاز است. البته پشتیبانی از QMake ادامه خواهد داشت، اما آن را توسعه نخواهیم داد یا از آن برای ساخت فریم‌ورک کیوت استفاده نخواهیم کرد. بهبود رابط‌های برنامه‌نویسیC++ سی‌پلاس‌پلاس طی سال‌های گذشته تغییرات بسیار زیادی کرده است؛ در حالی که ما مجبور بودیم کیوت ۵.۰ را روی سی‌پلاس‌پلاس ۹۸ پایه‌گذاری کنیم. اما اکنون می‌توانیم به سی‌پلاس‌پلاس ۱۷ برای پایه‌گذاری کیوت ۶ اطمینان کنیم. این بدان معنی است که C++ عملکرد بسیار بیشتری را نسبت به زمان توسعه و اجرای کیوت ۵ که در دسترس نبود ارائه خواهد کرد. هدف ما با کیوت ۶ بهتر شدن با یکپارچه‌سازی و ادغام قابلیت‌ها بدون از دست دادن پشتیبانی و سازگاری از روش‌های پیشین (رو به عقب یا همان backward compatibility) است. برای کیوت ۶، هدف ما این است که برخی از قابلیت‌های معرفی شده با QML و فناوری Qt Quick را از طرف C++ در دسترس قرار دهیم. بنابراین ما در تلاش برای معرفی یک سیستم خاص برای QObject و کلاس‌های مرتبط هستیم. موتور اتصال دهنده را از QML در هسته‌ی کیوت ادغام می‌کنیم و آن را از سی‌پلاس‌پلاس در دسترس قرار می‌دهیم. این سیستم خاص از موتور اتصال به کاهش قابل توجهی در سربار زمان کار و مصرفه حافظه در اتصال منجر می‌شود و آن‌ها را برای همه‌ی قسمت‌های Qt، نه تنها Qt Quick قابل دسترس می‌کند. پشتیبانی از زبان با کیوت ۵.۱۲، پشتیبانی از پایتون معرفی شده است. همچنین مرورگر را به عنوان پلتفرم جدید از طریق کیوت برای وِب اسمبلی اضافه کرده‌ایم. پس از انتشار کیوت ۶.۰ نگه‌داشتن و گسترش بیشتر بر روی سطح چند‌-سکویی بخش مهمی از اهداف و مسیر توسعه‌ی سری‌های کیوت ۶ خواهد بود. سازگاری با کیوت ۵ و افزایش سازگاری‌ها و بهبود‌ها سازگاری با نسخه‌های قدیمی‌تر بسیار مهم است، بنابراین وقتی کیوت ۶ را توسعه می‌دهیم یک نیاز اساسی محسوب می‌شود. توسط چهارچوب کیوت میلیون‌ها خط کد نوشته شده است و هرگونه تغییرات در ناسازگاری که انجام شود هزینه‌ای را برای کاربران خواهد داشت. علاوه‌ بر این، کار بیشتری برای تغییرات در کیوت ۶ نیاز است تا کاربران کم کم با آن سازگار شوند که منجر به هزینه‌های بیشتر از طرف تیم توسعه‌ی کیوت برای حفظ آخرین نسخه کیوت ۵ خواهد بود. به این ترتیب، ما باید به فکر جلوگیری از ساطع شدن خطاهای احتمالی در زمان کامپایل و یا زمان اجرا برای کاربران می‌شود باشیم. در حالی که ما نیاز به حذف بخش‌هایی از کیوت خواهیم داشت، باید اطمینان حاصل کنیم که کاربران ما از عملکرد مورد نیاز خود برخوردار هستند. این بدان معنا است که کلید‌هایی مانند Qt Widgets و سایر قسمت‌هایی که توسط بخش بزرگی از کاربران ما مورد استفاده قرار می‌گیرد، در دسترس باشد. ما در حال برنامه‌ریزی برای افزایش بسیاری از پیشرفت‌ها در کلاس‌های اصلی و عملکردی هستیم که در سری کیوت ۵ نتوانستیم انجام دهیم. هدف این است که سازگاری کامل منبع را حفظ کنیم، اما از آنجا که می‌توانیم سازگاری باینری را با کیوت ۶ بشکنیم، می‌توانیم پاک‌سازی‌ها و اصطلاحات کاملاً زیادی را انجام دهیم که در کیوت ۵ نمی‌توانستیم آن را عملی کنیم. با این وجود، ما باید به جلو پیش برویم و برخی از پاک‌سازی‌ها که در کیوت ۵ در مورد کلاس‌ها، توابع و یا ماژول‌ها عنوان شده بود را در کیوت ۶ به طور کامل اعمال کنیم. این کار باعث می‌شود ما روی مبنای کد‌گذاری شده‌ی فعلی تمرکز بیشتر و بهتری داشته باشیم. با این حال، انتقال به دور از قسمت‌های منسوخ شده باید تا حد امکان ساده باشد و کاربران ما می‌توانند با استفاده از کیوت ۵.۱۵ «پشتیبانی بلند مدت» به صورت ایده‌آل این کار را انجام دهند. هدف ما باید این باشد که کیوت ۶ به اندازه‌ی کافی با نسخه‌ی ۵.۱۵ سازگار باشد تا فرد بتواند به راحتی یک بخش اعظمی از کد خود را حفظ کند، به طوری که کد آن در هر دو نسخه‌ی ۵ و ۶ قابل کامپایل باشد. بازار و ساختار فنی محصول علاوه بر بهبود چهارچوب و ابزار‌های کیوت، هدف ما ایجاد بازار جدیدی برای قطعات و ابزار‌های توسعه است. این بازار بر روی کاربران مستقیم ما متمرکز خواهد شد که برنامه‌های کاربردی و دستگاه‌های تعبیه شده را طراحی و توسعه می‌دهند؛ به این ترتیب این یک مرکز تجمع اصلی برای اکو سیستم کیوت خواهد بود که این امکان را به شخص ثالث می‌دهد تا نسخه‌های اضافی خود را در کیوت منتشر کنند و هم محتوای رایگان و تجاری را که برای آن هزینه پرداخت می‌کنند. کیوت طی سال‌های گذشته رشد بسیار زیادی داشته است، تا جایی که ارائه‌ی نسخه‌ی جدید آن یک کار مهم است. با استفاده از کیوت ۶ فرصتی برای باز‌سازی محصولات ارائه شده ما وجود دارد و یک محصول اصلی و کوچکتر که شامل چهارچوب‌ها و ابزار‌های اساسی است. ما از بازار استفاده خواهیم کرد تا چهارچوب و ابزار‌های اضافی خود را ارائه دهیم، نه به عنوان یک بسته‌نرم‌افزاری وابسته به کیوت! چشم‌انداز فنی تا اولین نسخه‌ی کیوت ۶ تکامی خواهد یافت. اگرچه معتقد هستیم که این سند بسیاری از مهمترین نکات را برای نسخه‌ی بعدی کیوت معرفی می‌کند اما مطمئناً کامل نیست. اگر شما هم ایده‌ی دیگری دارید می‌توانید آن را با ما در میان بگذارید.
  12. سید محمد عباسی

    با سلام و عرض ادب خدمت دوستان آی او استریمی عزیز ، امیدوارم که هر کجای ایران زمین هستید پیروز و سربلند باشید . با جلسه دوم از آموزش کتابخانه‌ی SIGIL در خدمت شما عزیزان هستم . در این جلسه و چند جلسهٔ آینده به معرفی توابع کاربردی این کتابخانه می‌پردازم و از هر کدام هم مثالی برای شما ‌‎هم ارائه خواهم داد که کامل APIهای این کتابخانه را درک و یاد بگیرید . دقت داشته باشید این کتابخانه مناسب برای کارهای کوچک گرافیکی و حتی پروژهای دانشجویی نیز می‌باشد و در نهایت سادگی می‌توانید از آن استفاده کنید در نهایت برای اطمینان از صحت مطالب در آخر فایلی را ضمیمه خواهم کرد که به شرح هر یک از توابع این کتابخانه پرداخته است ، پس با من در ادامه همراه باشید . توابعی که در این جلسه به آن‌ها پرداخته می‌شود در زیر مشاهده می‌کنید . توابع مربوط به بخش پنجره ( Window ) slWindow slClose slShouldClose توابع مربوط به بخش ورودی ( Input ) slGetKey slGetMousetButton slGetMouseX slGetMouseY توابع مربوط به بخش رندر ( Rendering ) slRender توابع تا همین‌جا باشند که توضیحات درمورد هر کدام کمی زیاد است و حوصله‌سربر که در واقع با زیاد شدن توضیحات حوصله شما هم سرریز می‌کند و خسته می‌شوید که از خواندن ادامه‌ی آموزش صرف‌نظر می‌کنید . پس بی معطلی برویم سر اصل مطلب! از توابع مربوط به بخش پنجره شروع می‌کنیم ، جایی که شما با در دست داشتن توابع ذکر شده می‌توانید به ایجاد پنجره ، بستن پنجره ، و واکنش به بستن پنجره اقدام کنید . slWindow : این تابع با داشتن چهار آرگومان ورودی باعث ایجاد یک پنجره می‌شود، شما می‌توانید به دادن چهار آرگومان ورودی که شامل عرض ( Width ) ، ارتفاع ( Height ) ، عنوان پنجره ( Title ) و تنظیم اینکه پنجره تمام صفحه ( FullScreen ) باشد یا به اندازه‎هایی که در دو آرگومان ورودی یعنی عرض و ارتفاع مشخص کردید نمایش داده شود . همچنین شما می‌توانید از مقادیر بولین که شامل True ( درست ) و یا False ( غلط ) در آرگومان آخر که مشخص کننده‎ی نمایش تمام صفحه و یا نمایش به صورت اندازه‌های دلخواه که مشخص کردید ، استفاده کنید ، بدین صورت که اگر از مقدار True استفاده کنید پنجره صرف‌نظر از اینکه چه مقدارهایی برای عرض و ارتفاع مشخص کردید به حالت تمام صفحه به نمایش در خواهد آمد و اگر از مقدار False استفاده کنید در اندازه‌های دلخواه که در همان آرگومان‌های اول مشخص کردید نمایش داده می‌شود . slClose : اگر از این تابع انتظار دارید که فقط باعث بستن پنچره شود ، کاملا در اشتباهید! چرا که بدون این تابع هم پنجره به خوبی و خوشی بسته می‌شود! اما پس این تابع این وسط چه کاری می‌کند ؟ در حقیقت این تابع وظیفهٔ نابودسازی کامل پنجره را از حافظه بر عهده دارد ، بدین صورت که هنگامی که پنجره ایجاد می‌شود فضایی معین از حافظه را می‌گیرد و بدین ترتیب وظیفه‌ی بازگرداندن حافظه‌ی اشغال شده بر عهده‌ی ماست که این کار توسط تابع slClose انجام می‌شود . این تابع هیج آرگومان ورودی دریافت نمی‌کند و پنجر‌ه‌ی جاری را از حافظه آزاد و نابود می‌کند . slShouldClose : اگر اقدام به ایجاد پنجره کردیم و به هر روشی پنجره را بستیم این تابع فعال شده و مقداری غیر صفر به ما بر می‌گرداند ، کاربرد این تابع توی شروط هستش که می‌توان چک کرد که کاربر پنجره را بسته است یا نه ؟ که در حالت عادی مقدار برگشتی 0 است این یعنی هنوز کاربر اقدام به بستن پنجره نکرده است و در غیر اینصورت اگر کاربر پنجره را ببندد مقدار برگشتی 1 است . در تصویر زیر همان‌طور که مشاهده می‏‌کنید یک مثال از هر سه تابع آورده شده است که شما هم می‌توانید امتحان کنید و با دستکاری کدها بیشتر این موضوع را درک کنید . نتیجه‌ی اجرای کدهای بالا را در تصویر زیر مشاهده می‌کنید : در اینجا بنده پنجره را بستم تا بتوانید خروجی را ببینید و همان‌طور هم که مشاهده می‌کنید در صورتیکه پنجره در حال نمایش و رندر باشد ( منظور از رندر اشیائی هستند که در پنجره در حال نمایش هستند ) مقدار برگشتی عدد 0 و در غیر اینصورت اگر پنجره بسته شود مقدار برگشتی 1 خواهد بود . با توابع ورودی می‌توانید از کاربر ورودی از صفحه کلید ، مختصات موس ، و کلیک کردن موس را در دست بگیرید و استفاده کنید . slGetKey : با استفاده از این تابع می‌توانید یک کلید از صفحه کلید را در صورتیکه کاربر بر بروی کلید مورد نظر از صفحه کلید کلیک کند را دریافت کنید . نحوه کارکرد این تابع به این صورت است که یک مقدار از مقادیر زیر دریافت کرده و در صورتیکه کاربر بر روی کلید مورد نظر در صفحه کلید کلیک کند 1 برگشت داده می‌شود و در غیر اینصورت 0 . به صورت کاراکتر مانند 'W' دقت کنید حتما باید همان‌طور که در فایل ضمیمه هم اشاره شده است باید کارکتر مورد نظر بزرگ نوشته شود در غیر اینصورت عمل نخواهد کرد . دلیلش هم در کدهای اسکی است که با هم تفاوت دارند . مقدار بصورت عددی باشد مانند 290 که در این تابع حکم کلید F1 را دارد . یا استفاده از ثابت‌های عدد که خود این کتابخانه در نظر گرفته است که لیست این ثابت ها در زیر آمده است . دقت کنید که تعداد کمی از این ثابت‌ها در این کتابخانه تعریف شده‌اند و شما به ناچار باید از روی کد اسکی یا حروف بزرگ به بررسی کلیدها بپردازید . SL_KEY_ESCAPE SL_KEY_ENTER SL_KEY_TAB SL_KEY_BACKSPACE SL_KEY_INSERT SL_KEY_DELETE SL_KEY_RIGHT SL_KEY_LEFT SL_KEY_DOWN SL_KEY_UP SL_KEY_PAGE_UP SL_KEY_PAGE_DOWN SL_KEY_HOME SL_KEY_END SL_KEY_CAPS_LOCK SL_KEY_SCROLL_LOCK SL_KEY_NUM_LOCK SL_KEY_PRINT_SCREEN SL_KEY_PAUSE SL_KEY_F1 SL_KEY_F2 SL_KEY_F3 SL_KEY_F4 SL_KEY_F5 SL_KEY_F6 SL_KEY_F7 SL_KEY_F8 SL_KEY_F9 SL_KEY_F10 SL_KEY_F11 SL_KEY_F12 SL_KEY_F13 SL_KEY_F14 SL_KEY_F15 SL_KEY_F16 SL_KEY_F17 SL_KEY_F18 SL_KEY_F19 SL_KEY_F20 SL_KEY_F21 SL_KEY_F22 SL_KEY_F23 SL_KEY_F24 SL_KEY_F25 SL_KEY_KEYPAD_0 SL_KEY_KEYPAD_1 SL_KEY_KEYPAD_2 SL_KEY_KEYPAD_3 SL_KEY_KEYPAD_4 SL_KEY_KEYPAD_5 SL_KEY_KEYPAD_6 SL_KEY_KEYPAD_7 SL_KEY_KEYPAD_8 SL_KEY_KEYPAD_9 SL_KEY_KEYPAD_DECIMAL SL_KEY_KEYPAD_DIVIDE SL_KEY_KEYPAD_MULTIPLY SL_KEY_KEYPAD_SUBTRACT SL_KEY_KEYPAD_ADD SL_KEY_KEYPAD_ENTER SL_KEY_KEYPAD_EQUAL SL_KEY_LEFT_SHIFT SL_KEY_LEFT_CONTROL SL_KEY_LEFT_ALT SL_KEY_LEFT_SUPER SL_KEY_RIGHT_SHIFT SL_KEY_RIGHT_CONTROL SL_KEY_RIGHT_ALT SL_KEY_RIGHT_SUPERint ببب slGetMousetButton : اگر می‌خواهید به بررسی کلیک شدن یکی از دکمه‌های موس بپردازید باید از این تابع استفاده و یکی از این مقادیر را به عنوان آرگومان در هنگام فراخوانی این تابع وارد کنید. در صورتیکه کاربر دکمه‌ای از موس را کلیک کند و منطبق با ورودی تابع باشد 1 را برگشت می‌دهد و در غیر اینصورت نتیجه 0 خواهد بود . استفاده از مقدار عددی مانند 2 که نشانگر دکمه‌ی سمت راست موس است . استفاده از ثابت‌های عدد تعریف شده در خود این کتابخانه که لیست این ثابت‌ها در زیر آورده شده است . SL_MOUSE_BUTTON_1 SL_MOUSE_BUTTON_2 SL_MOUSE_BUTTON_3 SL_MOUSE_BUTTON_4 SL_MOUSE_BUTTON_5 SL_MOUSE_BUTTON_6 SL_MOUSE_BUTTON_7 SL_MOUSE_BUTTON_LEFT SL_MOUSE_BUTTON_RIGHT SL_MOUSE_BUTTON_MIDDL slGetMouseX : این تابع موقعیت X موس را بر می‌گرداند ، به طور مثال شما در حال تکان دادن موس خود هستید و مشاهده هم می‌کنید که مکان نمای موس در حال حرکت بر روی صحفه نمایش است ، حال برای اینکه بتوانید با استفاده از این کتابخانه موقعیت مکان نمای موس را در جهت X بدست بیاوردید باید از این تابع استفاده کنید . مقدار برگشتی این تابع موقعیت مکان نما در صفحه نمایش است . slGetMouseY : این تابع هم دقیقا مشابه تابع slGetMouseX عمل می‌کند با این تفاوت که در جهت Y موقعیت را بر می‌گرداند . البته بنده در اینجا برای اینکه بهتر متوجه بشوید تمام ورودی‌های ممکن را داده‌ام و شما بهتر است جداگانه آزمایش کنید و نتیجه را ببینید که در این مثال نتیجه به دلیل عدد‌های زیاد قابل تشخیص نیست . و در نهایت تابع بخش رندر که در ادامه به توضیح آن خواهم پرداخت . slRender : این تابع وظیفه رندر ( پردازش اشیا و نمایش آن‌ها در پنجره ) تمام اشیائی که در صحنه حضور دارند را بر عهده دارد ، این اشیا می‌توانند شکل باشند و یا متن و سایر مواردی دیگر که در جلسات بعد به توضیح آنها خواهیم پرداخت . در نهایت بعد از مطالعه این آموزش برای یادگیری بهتر و کامل‌تر به تمرین نیاز دارید ، پس تا می‌توانید تمرین کنید . فایل ضمیمه
  13. مدتی است در مورد مسدود شدن اپلیکیشن‌های ایرانی برای iOS از طرف شرکت اپل خبر‌هایی به گوش می‌رسد که در سایت‌ها و پایگاه‌های خبری از سمت نویسندگان و افراد غیرفنی تجزیه تحلیل و روش‌های دور زدن آن‌ها ارائه می‌شود. واقعیت بر دلیل نوشتن این مقاله این است که این فرصت و مشکلات کنونی آبی گل‌آلود برای سود‌جویانی شده است که کاربران از آن بی‌خبرند! هر روز یک توسعه‌دهنده یک سایت جدید راه‌اندازی می‌کند و با ادعای ارائه بستری نامحدود اقدام به تبلیغات می‌کند. بنده نیز به عنوان توسعه‌دهنده وظیفه‌ی خودم می‌دانم که یک بار برای همیشه توضیحات شفاف و روشنی را در اختیار کاربران iOS قرار دهم تا متوجه اصلِ موضوع باشند (بعد از آن تصمیم با خود شما). اول از خودمان شروع کنیم، آیا واقعاً حرکت‌هایی که ما داشته‌ایم درست بوده است؟ به گونه‌ای که انگار اقدامات ما ایرانی‌ها بدون عیب و ایراد بوده و اپل بدون دلایل منطقی اقدام به تحریم ما کرده است! (هدف از این مقاله به هیچ عنوان طرفداری از اقدامات شرکت اپل نیست، چرا که این شرکت به عنوان فروشنده‌ی محصولات خود وظیفه دارد به پشتیبانی و ارائه‌ی خدمات به کاربرانش باشد نه اینکه هم سود کند و هم به خاطر مسائل سیاسی برخی از مشتریان خود را محدود کند. بنابراین ما اپل را هم محکوم به آن می‌کنیم که هیچ ارزشی به کاربران و توسعه‌دهندگان ایرانی به خاطر مسائل سیاسی قائل نیست)، و در مقابل مشترکین و حتی شرکت‌ها و فروشگاه‌های اپلیکیشن موظف هستند به جای توجیح کار‌های غیر قانونی و ناعادلانه‌ی خود (و استفاده از چنین فرصت‌ها)، اقدامات به شفاف سازی روش‌های انتشار و توسعه کنند که مسلماً کاربران عادی و غیر حرفه‌ای از این امر بی خبرند! به گونه‌ای که انگار ما عادت کرده‌ایم هر زمان که مشکلی گریبان گیر ملت ما می‌شود به جای حل آن از روش صحیح و قانونی، اقدام به فشار بیشتر و سوء استفاده از آن فرصت کنیم که اصلاً روش انسان‌ دوستانه‌ای نیست (حداقل از فرهنگ اصیل ایرانی چنین انتظاراتی نداریم). اما واقعیت امر در چیست و دلایل مسدود سازی نرم‌افزار‌ها بر روی iOS در چیست؟ اینطور که به گوش می‌رسد و به گفته‌ی پایگاه‌های خبری و سایت‌های فناوری خبر‌ها اینگونه است که، اپل تا کنون چندین بار برخی اپلیکیشن‌های ایرانی را مسدود یا رَد اعتبار کرده است ولی این بار، اپلیکیشن‌های پرداخت الکترونیکی و موبایلی مانند آسان پرداخت و نرم‌افزار‌ بانک‌های معروف ایرانی تحریم شدند. افزون بر این، اپ‌های محبوب و پر کاربردی مانند اسنپ، تپسی، فون‌پی، دیجی‌کالا، فیدیبو، سیب‌اپ نیز جزو تحریم شده‌ها هستند. در قدم اول ممکن است دلایل این کار را به خاطر مسائل سیاسی بدانیم، این مسئله تا حدی ممکن است درست باشد، اما با بازنگری و یادآوری حریم خصوصی و حقوق مشتری در جامعه‌ی بشری از سمت اپل نیز حکم می‌کند که جوابگوی خدمات پس از فروش خودش باشد. بنابراین بهانه‌ تراشی بخشی از اقدامات می‌تواند باشد اما مسئله‌ی اصلی این نیست! اجازه دهید جایگاه خودمان را برعکس در نظر بگیریم، با این حساب که ما به عنوان خدمات دهنده‌های ایرانی بستری را فراهم کرده‌ باشیم که به جامعه‌ی بزرگی از دنیا خدمات ارائه می‌دهیم. بنابراین قوانین و چهارچوب‌های شفاف و مشخصی را عنوان خواهیم کرد که خارج از آن باید اقدام به یادآوری و گوشزد، تذکر و در نهایت برخورد قانونی و تحریم را در برنامه‌ داشته باشیم که یک روند قانونی و طبیعی است. این قوانین در صورتی اجرا می‌شوند که حقوق توسعه، تولید، نشر و پشتیبانی رسمی محصولات نادیده گرفته شود. بنابراین فرض کنید شما صاحب فروشگاهی هستید که نویسندگان (توسعه‌دهندگان) و ارائه‌دهندگان خدمات آن همگی ساعت‌ها، ماه‌ها و سال‌ها زمان بر توسعه و تولید محصولات خود گذاشته‌اند. حال ممکن است آن را رایگان و یا حتی با دیدگاه تجاری در اختیار کاربران قرار دهند. بنابراین عقل و منطق اجازه می‌دهد که شما نرم‌افزار رایگان را به صورت رایگان و نرم‌افزار‌های تجاری را در قبال پرداخت هزینه‌ی آن مورد استفاده قرار دهید. در غیر این صورت اگر محصولی که شما ارائه داده‌اید با نقض این موارد مواجه شود (بدون شک اولین تصمیمی که خواهید گرفت حذف خدمات پس‌ از فروش، پشتیبانی و ... خواهد بود). اما واقعیت این مسئله چیست؟ آیا اپل اقدام به تحریم بی دلیل بر روی اپلیکیشن‌های ایرانی داشته است؟ اگر منطقی به قضیه فکر کنیم، به راحتی می‌توان این مسائل را بررسی و دلایل تحریم را درک کرد؛ من در این مقاله ابتدا به دلایل تحریم اپل می‌پردازم که پاسخ روشن و صریح این اقدامات اخیر را در این باره به شما خواهد داد. هرچند من به عنوان یک برنامه‌نویس باید به دنبال توسعه و تولید محصولات و حتی دور زدن تحریم‌های ناشیانه در این حوزه باید باشم، اما اینکه هم نوعان و همکاران خودم هم در این باره خبر‌ها و اطلاعات دروغ را به مشتریان این حوزه می‌دهند قابل تحمل نیست! چرا که اول باید از خودمان شروع کنیم! بهتر است در نظر داشته باشیم قوانینی که در اپل نیز ذکر شده‌اند به این اشاره دارد که در صورت خروج از این چهارچوب که ممکن است امنیت و حقوق مادی و معنوی توسعه‌دهنده و ناشر را پایمال کند، هیچ گونه تعهدی در رابطه با ادامه‌ی همکاری و یا پشتیبانی از آن خدمات را نخواهند داشت. بنابراین شخصاً ندیدم حتی در یکی از فروشگاه‌های ایرانی اشاره‌ای به این حقوق شده باشه (حتی برعکس و شدیداً بر خلاف مواردی هستند که ذکر شده‌اند که با دلیل و اسناد معتبر خود مرجع اپل آن‌ها را شفاف سازی خواهم کرد). به عنوان مثال، اگر شما یک کاربر عادی یا حتی تازه کار باشید، یا اگر شما یک توسعه‌دهنده‌ی تازه‌کار و حتی حرفه‌ای باشید بهتر است به این بخش از قوانین اپل (App Store Review Guidelines) توجه جدی کنید! این بخشی از قوانین صریح و شفاف اپل در حوزه‌ی اپلیکیشن‌های iOS و فروشگاه خودش است که در زیر آمده است: App Store Review Guidelines Introduction Apps are changing the world, enriching people’s lives, and enabling developers like you to innovate like never before. As a result, the App Store has grown into an exciting and vibrant ecosystem for millions of developers and more than a billion users. Whether you are a first time developer or a large team of experienced programmers, we are excited that you are creating apps for the App Store and want to help you understand our guidelines so you can be confident your app will get through the review process quickly. The guiding principle of the App Store is simple - we want to provide a safe experience for users to get apps and a great opportunity for all developers to be successful. We do this by offering a highly curated App Store where every app is reviewed by experts and an editorial team helps users discover new apps every day. For everything else there is always the open Internet. If the App Store model and guidelines are not best for your app or business idea that’s okay, we provide Safari for a great web experience too. On the following pages you will find our latest guidelines arranged into five clear sections: Safety, Performance, Business, Design, and Legal. The App Store is always changing and improving to keep up with the needs of our customers and our products. Your apps should change and improve as well in order to stay on the App Store. A few other points to keep in mind: We have lots of kids downloading lots of apps. Parental controls work great to protect kids, but you have to do your part too. So know that we’re keeping an eye out for the kids. The App Store is a great way to reach hundreds of millions of people around the world. If you build an app that you just want to show to family and friends, the App Store isn’t the best way to do that. Consider using Xcode to install your app on a device for free or use Ad Hoc distribution available to Apple Developer Program members. If you’re just getting started, learn more about the Apple Developer Program. We strongly support all points of view being represented on the App Store, as long as the apps are respectful to users with differing opinions and the quality of the app experience is great. We will reject apps for any content or behavior that we believe is over the line. What line, you ask? Well, as a Supreme Court Justice once said, “I’ll know it when I see it”. And we think that you will also know it when you cross it. If you attempt to cheat the system (for example, by trying to trick the review process, steal user data, copy another developer’s work, manipulate ratings or App Store discovery) your apps will be removed from the store and you will be expelled from the Developer Program. You are responsible for making sure everything in your app complies with these guidelines, including ad networks, analytics services, and third-party SDKs, so review and choose them carefully. Some features and technologies that are not generally available to developers may be offered as an entitlement for limited use cases. For example, we offer entitlements for CarPlay Audio, HyperVisor, and Privileged File Operations. Review our documentation on developer.apple.com to learn more about entitlements. We hope these guidelines help you sail through the App Review process, and that approvals and rejections remain consistent across the board. This is a living document; new apps presenting new questions may result in new rules at any time. Perhaps your app will trigger this. We love this stuff too, and honor what you do. We’re really trying our best to create the best platform in the world for you to express your talents and make a living, too. در قوانین ذکر شده به صراحت عنوان شده است که اگر به فکر برنامه‌های آزمایشی هستید بهتر است از محیط Xcode با همان حساب توسعه‌دهندگی استفاده کنید که تنها بر روی دستگاه‌ خودتان می‌تواند اجرا شود. در صورتی که به فکر بحث تجاری آن هستید باید تمامی حقوق مربوطه را رعایت کنید و حتی نباید به فکر کپی کردن، درز اطلاعات، به خطر اندازی حریم خصوصی و دیگر مسائل بپردازید که در این صورت اپل محصول شما را رَد خواهد کرد. فشار دو طرفه، بهانه تشدید بهانه... بهانه و باز هم بهانه!!! مسلماً برای همه روشن است که سیاست‌های آمریکایی و شرکت‌های آن منتظر بهانه‌هایی هستند که سریعاً فشار‌ها را به سمت ملت ایران وارد کنند، بنابراین مانند اقدامات اخیر Github که متأسفانه مجبور هستند بر اساس سیاست‌های دولتی خود اقدام به محدود سازی خدمات خود به ایرانی‌ها باشند (اپل بسیار مشتاقانه‌تر به دنبال بهانه و ایجاد فشار به ملت ما می‌شتابد). بنابراین باز هم یادآوری کنیم محصولی که بابت آن پول پرداخت می‌شود اعمال محدودیت و فشار بر آن دیگر جایز و انسان‌دوستانه نیست! جالبتر از این موارد یادآوری این موضوع است که دوستان داخلی به جای حل مشکلات با فرصت طلبی‌ها و سوء استفاده‌‌ها و بی‌انصافی‌ها هم فشار وارده را بر کاربران iOS بیشتر کرده‌اند و هم وضعیت و بهانه‌های بیشتری به دست شرکت اپل می‌دهند! این واقعیتی است که باید پذیرفت (به گونه‌ای که در شرایط اقتصادی کنونی هم فشار از خارج هم داخل بر ملت ما وارد است). کاش منصفانه به فکر راه حل‌های مشکلات کنونی باشیم... ملت ما در چنین شرایطی هر جا که به کمک هم شتاب کرده‌اند موفق‌تر بوده‌اند و خواهند بود (اما به روش درست نه غلط!!!). حال با در نظر گرفتن نقض قوانین صریح از سمت فروشگاه‌های ایرانی که به آن‌ هم افتخار می‌کنند، آیا نباید انتظار داشت تا روزی اپل یا هر شرکت دیگری صبرش به پایان برسد و خیس و خُشک را باهم بسوزاند؟! بخشی از ادعاهایی که بزرگترین مرجع ایرانی (سیب‌اپ) اپلیکیشن‌های iOS ارائه شده است به صورت زیر می‌باشد: زمانی که دسترسی به هزاران اپلیکیشن خارجی با ارزش ۵۰،۰۰۰ دلار در کشور ما با افتخار حقوق توسعه‌دهنده و ناشر را زیر سوأل می‌برد نباید انتظار داشت چنین تحریم‌هایی حق ماست؟ حال آنکه چنین فروشگاه‌هایی جدیداً از محدودیت‌های اخیر سوء استفاده کرده و حتی با وعده‌های دروغین اقدام به فروش اشتراک ویژه می‌کنند که در ازای آن هیچ تضمینی از امنیت، حقوق مادی و معنوی و حتی اجرا شدن نرم‌افزار‌های موجود در آن فروشگاه وجود ندارد! متأسفانه دروغ‌ها و فرصت‌ طلبی‌ها از چنین فرصت‌ها به جای حل مسائل و اختلاف‌های سیاسی و تجاری چیزی به جز بدتر کردن وضعیت کنونی نخواهد داشت. حتی هیچ شانسی برای بهتر شدن وضعیت کنونی باقی نخواهد ماند. نقل قول زیر از طرف سیب‌اپ است که ادعا کرده است با پرداخت اشتراک شما قادر به دانلود بدون مشکل اپلیکیشن‌ها خواهید بود. راه حل‌های ناشیانه و واقعا مسخره که از طرف فروشگاه‌ها و نویسندگان خبری اخیر به دستمان رسیده است به صورت زیر هستند: استفاده از نسخه وب اپلیکیشن حقیقت نفهته در پشت این راه حل‌ها به این صورت است که یک فناوری به عنوان PWA یا همان (Progressive web applications) وجود دارد که همان نسخه‌ی وب به شمار می‌آید! در واقع اپلیکیشن‌های نوشته شده به این روش بسیار بدتر از حتی یک وب‌سایت کامل هستند و تنها به روش‌های غیر بومی و خارج از محیط Xcode تحت فناوری‌های وب مانند HTML, CSS و JavaScript توسعه داده می‌شوند. در نهایت هیچ ربطی به نسخه‌ی اصلی و نوشته شده‌ به روش طبیعی نرم‌افزار‌های iOS ندارد و تنها نسخه‌ی محدود شده‌ای از وب‌سایت خدماتی است که با حقه‌های فریبنده و کاملاً ناشیانه اقدام به ساخت میان‌بر و ایجاد آیکون بر روی صفحه گوشی شما می‌کنند که اینطور برداشت کنید نسخه‌ی واقعی اپلیکیشن را نصب کرده اید!!! در حالی که بهتر است به جای آن از همان وب‌سایت استفاده کنید. مسخره است نه؟! دسترسی به برنامه‌هایی که پیش‌تر از اپ استور دانلود کرده‌اید دسترسی به برنامه‌هایی که پیش‌تر از اپ‌استور دانلود شده است روشی کاملاً مسخره‌تر است که به شما پیشنهاد می‌دهد تا نسخه‌های قدیمی اپلیکیشن‌هایی که اپل آن‌ها را نگه‌داشته است اما توسعه‌دهنده‌گان آن‌ها هم نمی‌توانند آن را به‌روز رسانی کنند استفاده کنید! این کار چه فایده‌ای دارد دقیقاً؟ تعداد اپلیکیشن‌هایی این چنینی بسیار محدود هستند مانند دیوار ... که آخرین به‌روز رسانی آن به ۲ سال پیش مربوط است!!! جیلبریک کردن این روش ممکن است کارایی داشته باشد، اما تمامی مسائل امنیتی و خدماتی که اپل آن‌ها را ارائه می‌کند را از بین برده و در واقع در این روش هیچ تضمینی برای حفظ اطلاعات و صحت عملکرد دستگاه شما وجود ندارد (در واقع شما از روش بسیار خطرناک از بین هزاران حفره‌های شکافته شده‌ی امنیتی عبور کرده و از برنامه‌ی مورد نظرتان که شاید آن یک اپلیکیشن بانکی و ... باشد استفاده می‌کنید). راه حل سیب اپ (بزرگ‌ترین فروشگاه ایرانی برای برنامه های iOS) این پیشنهاد زمانی معتبر است که فروشگاه و یا فروشگاه‌های مربوطه با شفافیت کامل بیان کنند که راه‌حل‌های فعلی هیچکدام نهایی نیست و اصلاً مخصوص کاربر نیست!!! چرا که مشتری نه توسعه‌دهنده است و و نه شرکت! بنابراین زمانی که با حرکت‌های ظاهراً حرفه‌ای اما در حقیقاً کاملاً غیر حرفه‌ای از هر کاربر یک توسعه‌دهنده یا شرکت و یا سازمان می‌سازند طبیعی است که باید هزینه‌هایی مانند ۹۹ تا ۲۹۹ دلار در سال را بپردازند که مسلماً منجر به پولی شدن حق نصب اپلیکیشن خواهد بود که از بیخ غلط است! بنابراین انتظار می‌رود تحت هیچ شرایطی مردم را نَفَهم فرض نکنیم! مطمئنان هر عقل سلیمی می‌تواند تشخیص دهد که این روش دقیقاً همان مثال معروف (ماهی گرفتن از آب گل‌آلود است) در واقع شما باید پول به چیزی بپردازید که خودش روش غیرقانونی و نامناسب است!!! برخی از توسعه‌دهندگان و سایت‌های خبری و حتی استور‌ها چنین ادعا می‌کنند که هیچ محدودیتی در توسعه و انتشار برنامه‌های iOS وجود ندارد، آیا این حقیقت است؟ طبق توضیحاتی که در بالا اشاره کردم، هیچ روش منطقی در داخل کشور وجود ندارد که قانونی باشد، اگر کسی مدعی به انتشار است مطمئنان از همین روش‌هایی که اشاره شد استفاده می‌کند که خارج از این نیست. فروشگاه‌های جدید و مدعی بدون محدودیت چگونه کار می‌کنند؟ متأسفانه با وجود شرایط کنونی و محدودیت‌های اپل افراد و فروشگاه‌های زیادی در چندین ماه اخیر ایجاد شده‌اند که از این فرصت برای ارائه خدمات به شیوه‌ی PWA و دو روش دیگر که ذکر شد استفاده می‌کنند که هیچ یک از آن‌ها ارائه دهنده‌ی خدمات واقعی نیستند. (اگر شما فروشگاهی را می‌شناسید که از روش‌های قانونی برای نشر برنامه‌ها استفاده می‌کند که نیاز نباشد هر چند وقت یک بار برنامه‌ را حذف و دوباره نصب کنند و یا در بهترین حالت شما را به عنوان توسعه‌دهنده‌ی اپل معرفی نکنند به ما معرفی کنید تا به گوش همگان برسانیم!). روش‌های پیشنهادی و رسمی اپل چیست؟ طبق اسناد رسمی، اپل می‌گوید اگر شما برنامه‌ی خودتان را به صورت استاندارد توسعه‌ داده‌اید می‌توانید به دو روش آن را منتشر کنید؛ روش اول این است که آن را در فروشگاه اپل منتشر کنید (که در این روش بنابر اساس سیاست‌هایی که دارند مسلماً تحریم ما خواهد بود که شاهدش بودیم - حذف اپلیکیشن‌های ایرانی از فروشگاه اپل). روش دوم آن است که شما اپلیکیشن خود را در قالب روش‌های Ad-Hoc ایجاد کنید که محدود بر ۱۰۰ دستگاه (کاربر) خواهد بود. این روش نیز به گونه‌ای قابل استفاده است اما محدود بر تعداد کاربران خواهد بود و برای اهداف داخلی و سازمانی خودمان طراحی شده است و بدون شک امضاء و مدیریت آن همراه با تولید آمار بسیار زیادی از تأییدیه‌ها سرسام آور خواهد بود. درواقع اپل می‌گوید اگر می‌خواهید در دامنه‌ی بزرگتر یعنی جهان، استفاده کننده‌ی اپلیکیشن شما باشد باید در فروشگاه من آن را منتشر کنید تا هم امنیت و هم پشتیبانی آن را تضمین کنم. روش‌های دیگر نیز با عنوان (Enterprise Program) مطرح هستند که مخصوص تیم‌های توسعه‌ای که در برنامه Enterprise یا همان تجاری ثبت نام کرده‌اند نیز می‌توانند از توزیع داخلی استفاده کنند. این روش همان روشی است که اپل برای عموم اکثراً محدود کرده است و مختص تحریم‌های ایران نیست. درواقع همان روشی که بعضی از شرکت‌های ایرانی هر روز می‌گویند اپلیکیشن را از لینک جدید دریافت کنید!!! که البته همراه با هزینه‌ی سالانه ۲۹۹ دلار است! روش‌های محدود‌تر دیگری وجود دارد که کاربران با محدودیت بیشتری با آن می‌توانند برنامه‌ها را صرفاً برای مصارف ازمایشی و خودمانی استفاده کنند که این دسته با عنوان University Program شناخته شده اند و توانایی نشر برنامه به جامعه‌ی هدف بزرگتری را نخواهند داشت. با توجه به این تعاریف مشخص است که دو روش پیش‌فرض استاندارد و Ad-Hoc باقی مانده است. تکلیف روش اول مشخص است که تا زمانی که تحریم‌ها وجود دارد نباید انتظار داشت که در اپ‌استور بتوان اپلیکیشن‌های ایرانی را بارگذاری کرد. اما روش اد‌هاک همان روشی است که اجازه می‌دهد با خرید و ثبت دستگاه در بانک گواهی‌های معتبر اپل اپلیکیشن‌های خود را به مدت ۱ سال یا بیشتر امضا کنید (این روش برای توسعه‌دهندگان) پیشنهاد شده است که احتمالاً روش‌های فعلی استور‌ها این باشد! مسلماً این روش هزینه‌ی شارژ و امضای توسعه‌دهنده را خواهد داشت. البته لازم به ذکر است این روش قطعی نیست و اگر اپل بداند که به زودی هم خواهد دانست میلیون‌ها کاربر توسعه‌دهنده پیدا کرده است مسلماً طی اقداماتی روش‌هایی برای حل آن ارائه خواهد داد. خب راه حل منطقی چیست؟ با توجه به مستندات و منابع رسمی که اعلام کرده‌اند، از اولین ساعت‌های مسدود شدن نرم‌افزار‌های بانکی و پرداختی، شرکت‌هایی که در این مجموعه اپ یا اپ‌هایی داشتند؛ راه‌حل موقت خود را ارایه کردند، عمده‌ترین راه‌حل استفاده از اپ‌های مسدود شده روی گوشی‌های آیفون، مراجعه به نسخه وب اپلیکیشن یا استفاده از پلتفرم‌های دیگری مانند اندروید است. مدیران اسنپ و دیجی‌کالا از کاربران‌شان درخواست کردند به طور موقت نسخه وب آن‌ها را استفاده کنند تا مشکل حل شود. برخی شرکت‌ها مانند سیب‌اپ و تپسی، نسخه جدید و مجزایی از اپ‌استور ارایه داده و از کاربران‌شان درخواست کردند این اپلیکیشن را از روی سایت آن‌ها دریافت و نصب کنند. سیب‌اپ در پیام‌های ویدیویی و اطلاعیه رسمی، به کاربران خود وعده داده است به‌زودی نسخه جدیدی از اپلیکیشن سیب‌اپ ارایه خواهد شد که دیگر مشکل مسدود بودن یا عدم اعتبارسنجی توسط اپل را ندارد (که این روش زمانی قابل تأیید خواهد بود که به روش‌هایی غلطی که در بالا اشاره شد عمل نشود و رسالت و شعار‌های فریبانه‌ی خود را تغییر دهند) که مسلماً باید اول حقوق مادی و معنوی و حریم خصوصی مصرف کننده را تضمین کنند و در نهایت به روش‌های قانونی مجوز‌های لازم را از اپل دریافت کنند که با توجه به شرایط حاکم کمی غیر ممکن و دور از انتظار است!!! روش‌های بهتری جهت نصب و راه‌اندازی اپلیکیشن‌های ایرانی وجود دارد که با نام‌های Add-Hoc نیز معروف هستند که محدود به نوع توسعه‌دهنده و تجاری معرفی می‌شوند. البته روش‌های تجاری همان روش‌هایی است که سیب‌اپ و دیگر شرکت‌ها مورد استفاده قرار داده‌اند. اما روش روش نوع توسعه‌دهنده می‌تواند با در نظر گرفتن ثبت دستگاه شما در پروفایل این مشکل را تا حدی برطرف کند که فروشگاه‌هایی مانند اناردونی با در نظر گرفتن هزینه‌ی ثبت دستگاه آن را تا به مدت ۱ سال تضمین می‌کنند. روش درست و صحیح‌تر آن است که دقیقاً طبق قوانین اپل عمل شود، در واقع تمامی ماده‌ها و تبصره‌های عنوان شده توسط شرکت اپل در اپ‌استور را باید پذیرفت. اما مشکل اصلی و اساس این مشکلات این است که اپل قبلاً هم گفته است حاضر به ارائه‌ی خدمات به ایران نیست. (یاد شعار استیو جابز مرحوم افتادم که ما خواهیم گفت کاربر از چه چیزی باید استفاده کنند نه آن‌ها) در واقع اپل با این اقدامات و فشار‌های خود رسماً می‌گوید شما بهتر است از محصولات دیگر استفاده کنید که عمل زشت و بسیار نژاد‌پرستانه است. آیا فروشگاه‌های داخلی به داد مردم می‌رسند یا از آب گل‌آلود ماهی می‌گیرند؟ قضیه این است!!! خوشبختانه در حالت عادی خدمات فروشگاه‌های داخلی خوب به نظر می‌رسد، اما وقتی به واقعیت‌های آن‌ها می‌پردازیم می‌بینیم که فرصت‌های خوبی برای پول به جیب زدن‌های خیلی خوشگل فراهم شده است که هرچند برای فراهم سازی بستر آن باید زحمت کشید و پول خرج کرد... اما در ازای چه خدماتی چه چیزی به دست می‌آورند؟ وقتی به خدماتی قرار است پولی پرداخت شود، آن سرویس باید بدون هیچ دغدغه و مشکلات مادی و معنوی قابل استفاده باشد. با توجه به عدم شفاف سازی کاربران که دلیل آن را نداشتن دانش فنی می‌دانند. از جانب بعضی از توسعه‌دهندگان و فروشگاه‌های ایرانی ترجیح داده‌شده است که، خدمات ارائه شود اما با دریافت هزینه! کافی است یک حساب کتاب ساده انجام دهید، وقتی شما قرار است توسعه‌دهنده‌ی اپل باشید باید هزینه‌ی سالیانه آن را پرداخت کنید که چیزی حدود ۹۰ تا ۱۲۰ دلار بسته به مالیات متغیر است. و اگر قرار است امضاء از نوع سازمانی داشته باشید باید هزینه‌ای معادل ۲۹۹ دلار برای آن بپردازید که در نهایت هر ۱۰ الی ۲۰ روز یک بار هزینه نزدیک به ۳ میلیون تومان برای خرید اکانت تجاری باید تقدیم کنید! در قبال آن به دست آوردن برخی از فروشگاه‌ها مانند سیب‌اپ هزینه‌‌ی حداقل ۳۰،۰۰۰ تومان را بابت آن دریافت می‌کنند. به گفته‌ی خودشان تعداد کاربران میلیونی... با پرداخت چنین هزینه‌هایی معادل صد‌ها شاید هم هزاران و میلیون‌ها برابر آن را به دست خواهند آورد!!! فرصت خوبی برای راه‌اندازی کسب‌و‌کار و به قول قدیمی‌ها (ماهی گرفتن از آب گل‌آلود) است نه ؟ البته فروشگاه‌هایی هم وجود دارند که با روش‌های PWA ادعای به اشتراک گذاری اپلیکیشن‌ها را دارند که از اشاره به نسخه وب بودن و محدودیت‌های آن دریغ می‌کنند. حالا که در جریان واقعیت قرار گرفته‌اید، بهتر است خودتان قضاوت کنید (چرا که به عنوان یک برنامه‌نویس این ننگ است که بدانیم اما به زبان نیاوریم که چه چیزی به خُرد ملت می‌دهیم). آینده‌ی نرم‌افزار‌های iOS ایرانی چطور خواهد شد؟ شما کاربران عزیز باید در نظر داشته باشید که هیچ روش رسمی و قانونی به جز مواردی که اشاره شده است وجود ندارد، مشخص نیست با این وضعیت چه بلایی به بازار اپلیکیشن‌های ایرانی در پلتفرم iOS خواهد آمد، اما با توجه به مسائل سیاسی که دولت ایالات متحده‌ی آمریکا اعمال کرده است و تمامی تحریم‌های بانکی و ... از قبل گریبان گیر ما شده است کمی بعید است بدون حل مسائل سیاسی این دو کشور به این راحتی ها بتوان راه حل‌های دائمی و مطمئن معرفی کرد. بنابراین، باید منتظر ماند تا دید آیا نظر اپل در این بهانه تراشی‌ها تغییر خواهد کرد یا خیر! البته بر اساس نظرات کارشناسی برخی از حقوق‌دان‌ها و سیاست‌مداران اینطور عنوان می‌شود که شرکت‌ها بعضاً مجبور هستند بر خلاف میل خود طبق دستورات دولت خودشان اقدام کنند. در نهایت، باید منتظر ماند و دید که آیا حتی با پذیرفتن هزینه‌های بسیار بالا و رعایت قوانین کامل اپل باز هم اقدام به مسدود کردن برنامه‌های ایرانی خواهد کرد یا خیر. هدف از این مقاله این است که با چشمان باز حقیقت پنهاد در پشت این مسائل را بدانید.
  14. قاسم رمضانی منش

    درود بر شما؛ برای اینکار می‌توانید شما از QScrollArea استفاده کنید. این کلاس یک منطقهٔ‌نمایش Widgetها و یک QScrollBar را به شما می‌دهد، و شئ را که می‌خواهید Scroll کنید را باید به عنوان Child Widget به آن معرفی کنید. برای مثال : #include <QApplication> #include <QDialog> #include <QGroupBox> #include <QList> #include <QScrollArea> #include <QTextEdit> #include <QVBoxLayout> int main(int argc, char** argv) { QApplication application(argc, argv); QDialog dialog; QVBoxLayout layout; QScrollArea scroll(&dialog); QGroupBox groupedArea; QList<QTextEdit*> widgets; for (int i {}; i < 20; ++i) { widgets.append(new QTextEdit); layout.addWidget(widgets.at(i)); } scroll.setWidget(&groupedArea); scroll.setWidgetResizable(true); groupedArea.setLayout(&layout); dialog.show(); return application.exec(); } دقّت کنید که باید حتماً تابع setWidgetResizable را با مقدار true برای تغییر اندازهٔ مناسب Widget فراخوانی کنید. خروجی حاصل از کد بالا : با تشکر از آقای‌رضوی.
  15. mohsenzard67

    به نام خدا سلام و وقت بخیر من یه برنامه دارم مینویسم توی یه فرم یک groupbox ایجاد کردم که widget هایی که توش هست از صفحه بشتر میشه حالا میخوام بدوم چطور این کار رو دقیق انجام بدم؟ لازم به ذکر هست که من از ابزارهای محیط ui استفاده کردم. من تازه کارم...
  16. ممنون از توضیحات و منابعی که معرفی کردید
  17. قاسم رمضانی منش

    @nabegheh95 درود بر شما؛ لازم به ذکر بود که، برنامهٔ Microsoft Visual Studio یک IDE توسعه داده شده توسط شرکت Microsoft می‌باشد. و برای توسعهٔ هرچه بهتر برنامه‌های سیستم‌عامل Windows تحت Microsoft .Net می‌باشد. درواقع شما با کامپایلر Microsoft Visual C++.Net کارکردید. برای فریمورک Qt هم یک IDE بسیارعالی وجود دارد که سرعت توسعهٔ نرم‌افزار با استفاده از این فریمورک را افزایش می‌دهد، پس پیشنهاد می‌کنم به جای استفاده از آن افزونه مستقیم از این IDE استفاده کنید چرا که یک IDE بسیار خوب نیز برای ++C\C می‌باشد. تنها پیشنهاد می‌شود که در سیستم‌عامل Microsoft Windows از کامپایلر Microsoft Visual C++.Net استفاده کنید، این کامپایلر برای سیستم‌عامل خود به خوبی عمل می‌کند. هرچند که باید حواستان به تنبلی‌های مایکروسافت باشد مواردی مثل مورد زیر اصلاً پیاده‌سازی نشده‌اند: void char_exception() throw(int){ throw 'x'; } int main(void){ try{ char_exception(); } catch (...){ std::cout << "Caught it." << std::endl; } return 0; } توضیح. فریمورک Qt یک مجموعهٔ عظیم از کتابخانه‌ها می‌باشد، که تماماً نیز در این‌سایت مستند شده‌اند. برای رفع ابهامات کافی است که مستندات را به دقّت مطالعه و نمونه‌های نوشته شده را بررسی و امتحان کنید. اجرا شدن یک فایل، بسته به کرنل یک سیستم‌عامل و نحوهٔ پیاده‌سازی آن می‌باشد. پس مسلماً ساختاری که در کرنل Windows NT به عنوان فایل اجرایی شناخته شده است، در کرنل Linux قابل قبول نیست. برای اطلاعات بیشتر درمورد این ساختارها می‌توانید ساختار PE و ELF را بررسی کنید. در حالت ایده‌آل، بلی باید تلاش داشته‌باشید که از APIهایی که Qt فراهم می‌کند استفاده کنید، امّا همیشه این کار شدنی نیست. شما همیشه نیازی به استفاده از Qt‌ ندارید و ممکن است قابلیّتی در یک سیستم‌عامل نیاز داشته‌باشید که مشابه آن در یک سیستم‌عامل دیگر متفاوت هست. برای مثال : این سورس Telegram/ThirdParty/minizip/ioapi.c هست، ببینید به چه صورت در خط‌های ۱۳ و ۱۷ و ۲۲ بسته به سیستم‌عامل مقصد مشخص کرده‌است که چه توابعی باید کامپایل شوند. با این روش شما درحالی که از قابلیّت خاص یک سیستم‌عامل استفاده کردید ولی برنامهٔ شما Cross-Platform می‌باشد. پیشنهاد می‌کنم کتاب «++API Design For C» نوشتهٔ آقای «Martin Reddy» را مطالعه کنید.
  18. فرهاد شیری

    عرض کردم کلید خصوصی را چطوری مهندسی معکوس میکنه وقتی تقریبا 99/99 درصد امکان نداره که کلید را از روی داده رمز شده بدست آورد چون اصولا برگشت پذیر رمز نشده! حالا چه fiddler چه هر ابزار دیگه برای sniff امکان نداره به این سادگی مجوز های SSL را دور بزنه(که اگر اینطوری بود حتی یک ریال هم نمیتونستیم با اطمینان بین چندتا حساب جابجا کنیم! مطمئن باش دوست عزیز! تا زمانی که ابر کامپیوتر های کوانتومی برای مهندسی معکوس رمزها ساخته نشده اند با ابر کامپیوترهای باینری حتی به صورت پردازش موازی ویا حتی پردازشگرهای توزیع شده هم بازهم تقریبا در خوشبینانه ترین حالت نزدیک 50 سال طول میکشه که یک رمز SSL را بشکنند!) بنابراین با خیال راحت استفاده کن!
  19. اگر دنبال یک نرم افزار قدرتمند برای مشاهده فایلها به صورت Hex هستید، پیشنهاد میکنم از نرم افزار WinHex را حتما نصب کنید. از قابلیتهای فوق العاده این نرم افزار این هست که همانطور که می دانید اگر در نرم افزار VmWare نسخه لینوکسی داشته باشید که دیسک های آن را به صورت VMDK تعریف کرده باشید، وهمچنین اگر فرمت FAT دیسک های لینوکس را هم از نوع Ext3 تعریف کرده باشید ودر صورتی که به هردلیلی نسخه لینوکس را از دست بدید ونتوانید آن را بازیابی کنید! دیگه به راحتی نمیتوانید این دیسک ها را در سیستم عامل میزبان خود بازیابی کنید. اما با استفاده از نرم افزار WinHex می توانید فایلهای دیسک VMDK خودتون را باز کنید و به فایلهای لینوکس تون دسترسی داشته باشید، این چالش بدترین کابوس ما برنامه نویسانی هست که در لینوکس کد میزنیم از دست دادن این سورس کدها واقعا استرس زیادی به آدم وارد میکنه! همانطور که در تصویر هم مشاهده میکنید من برای لینوکس خودم همین اتفاق افتاد که تونستم به این روش سورس کدهای تحت لینوکس ام را بازیابی کنم (البته قبلش یکی دوتا کار دیگه باید انجام بدید تا WinHex فایل دیک را براتون باز کنه! اگر کسی علاقمند بود اطلاع بدید تا اون راه ها را هم توضیح بدم)
  20. در بعضی از پروژه های تجاری نیاز هست که به لاگ فایل ها ویا اطلاعاتی که در یک ماشین راه دور دریک سیستم عامل مانند لینوکس که در یک کانال خاص با میزبان شما در ارتباط می باشد، دسترسی داشته باشید واین لاگ فایل ها ویا اطلاعات را در یک پایگاه داده ذخیره کنید، البته بیشتر هدف این است که سیستم عامل های لینوکسی که در مد kernel کار میکنند و به علت های زیادی امکان استفاده از پایگاه داده را ندارند به همین علت باید این اطلاعات را برای یک ماشین میزبان ارسال کنیم و درآنجا دریک Data Where House ذخیره کنیم.! برای این کار می توانید از نرم افزار قدرتمند Kiwi SysLog Service استفاده کنید!
  21. amirb

    امنیت ssl را اطلاع دارم. شیوه ی کار fiddler این گونه هست که به عنوان یک پروکسی عمل می کنه و وقتی مجوز خودش به صورت دستی روی سیستم فعال بشه ترافیک ssl رو هم sniff می کنه.داخل لینکی که گذاشتم آموزش داده شده.هر چند این شیوه نیاز به نصب دستی مجوز داره ولی من می خوام مطمئن بشم همین مقدار نا امنی هم وجود نداشته باشه. نیازی هم به فهمیدن کلید خصوصی اصلی نیست چون fiddler کلید خصوصی و عمومی خودش رو می سازه و ما در حقیقت به اون وصل میشیم.
  22. فرهاد شیری

    وقتی صحبت از SSL میکنید که قطعا به این سادگی ها فقط با یکسری ابزار sniff و network packet analyzer مثل WireShark که نمی توان داده ها را تغییر داد! به فرض که شما به اون پکت های درست هم دسترسی پیدا کردید چطوری میخواهید بدون استفاده از کلید اختصاصی SSL رمزگشائی کنید، از روی داده رمزشده هم امکان استخراج کلید اصلی تقریبا محال ممکن هست! پس امنیت SSL به این راحتی ها قابل شکستن نیست ودرضمن مجوز جعلی هم برای SSL نمی توان ساخت که بخواهید ازش استفاده کنند. در ثانی این ابزاری که شما می فرمایید معمولا برای استفاده در ابزارهای تست نفوذ استفاده می شوند، به این صورت که سیستم های تست نفوذ الگوریتم های هوش مصنوعی هستند و برای train کردن این نرم افزارها نیاز به داده هایی دارند که براساس نوع پکت های شبکه نفوذهای انجام گرفته را بررسی کنند، حالا ابزارهایی مثل WireShark چنین خروجی هایی را تولید میکنند البته اونهم به صورت هگز.
  23. فرهاد شیری

    والبته توجه داشته باشید که در SDK های پایینتر از 24 نحوه اجازه دسترسی به محتواها با SDK های بالاتر از 24 متفاوت می باشد، یعنی در SDK های قدیمی نیازی نبود که شما دسترسی ها را در اکتیویتی هندل کنید ولی در SDK های جدید حتما باید برنامه نویس متدهای لازم برای تعیین دسترسی ها را در اکتیویتی اصلی Override کنه! بنابراین اگر این پروسه دریافت دسترسی از کاربر را به درستی انجام نداده باشید، بعد از اینکه به اکتیویتی برگردید با خطا مواجه می شوید. برای مشاهده خطا از log اندروید استفاده کنید در صورتی که موفق نبود یکبار User Debug Mode انجام بدید ویک break Point در سورس کد در نقطه مورد نظر قرار بدید تا خطا را شناسایی کنید. در صورتی که بازهم دلیل منطقی پیدا نکردید بهتر Kernel Debug Mode را انجا بدید کافی که از خروجی پردازشگر و همچنین از رم گوشی در هنگام اجرای برنامه خودتون یک فایل Dump تهیه کنید وبا ابزار eclipse memory analyzer فایل مورد نظر را بررسی نمایید.
  24. فرهاد شیری

    می توانید با کد زیر تست کنید که دسترسی های لازم وجود داره یا نه! و عملکرد مناسب را انجام بدید.! auto result = QtAndroid::checkPermission(QString("android.permission.CAMERA")); if(result == QtAndroid::PermissionResult::Denied){ QtAndroid::PermissionResultMap resultHash = QtAndroid::requestPermissionsSync(QStringList({"android.permission.CAMERA"})); if(resultHash["android.permission.CAMERA"] == QtAndroid::PermissionResult::Denied) return 0; resultHash = QtAndroid::requestPermissionsSync(QStringList({"android.permission.READ_EXTERNAL_STORAGE"})); if(resultHash["android.permission.READ_EXTERNAL_STORAGE"] == QtAndroid::PermissionResult::Denied) return 0; resultHash = QtAndroid::requestPermissionsSync(QStringList({"android.permission.WRITE_EXTERNAL_STORAGE"})); if(resultHash["android.permission.WRITE_EXTERNAL_STORAGE"] == QtAndroid::PermissionResult::Denied) return 0; } حالا وقتی این تکه کدها را اجرا بشوند، منتظر دریافت اجازه دسترسی از کاربر خواهد بود در صورت عدم تایید دسترسی به محتوا مربوطه مقدار Denied ارسال میشود!(توجه هم داشته باشید که این توابع به صورت سنکرون هستند یعنی نخ اصلی منتظر تایید کاربر برای دسترسی خواهد بود تا روند اجرا برنامه ادامه یپدا کند! از این منبع هم می توانید برایاطلاعات بیشتر استفاده نمایید.( QtAndroid Namespace)
  25. سید محمد عباسی

    با سلام بنده هم قبلا مشکل شمارو داشتم تا اینکه یه ویدیو توی یوتیوب دیدم و مشکلم رو کاملا برطرف کرد! به این صورت که در باید ماشین مجازی java رو دانلود کنید البته نسخه‌ی 8 و بعد از خود اندروید استودیو sdk و ndk رو دانلود کنید و توی پوشه‌ی Android باید مسیر‌هارو معرفی کنید ، و بعد یک بار Qt رو مجدد راه‌اندازی کنید . اگر باز با مشکل برخوردید همینجا بگید که یه ویدیو بگیرم همراه با توضیحات لینک بدم و مشکلتون برطرف بشه .
  26. ahmad azimi

    سلام منم این مشکل رو داشتم . با نصب jdk نسخه 8u221 علاوه بر پکیج هایی که جناب اسدزاده فرمودن مشکلم حل شد . محض اطمینان دستور "sdkmanager" رو توی محیط ترمینال ران کنید و ببینید مشکلی داره یا نه برا من که فقط با JDK8u221 ارور نداد .
  27. ممنون از جواب کاملتون. چون خیلی تازه شروع کردم به یادگیری Qt، بعضی جاها مبهم هست برام . ولی به طور کلی فهمیدم که برای اجرایی شدن برنامه نهایی در هر سیستم عامل، باید پروژه را در همان سیستم عامل کامپایل کنم ، تا اگر تضادی با آن سیستم عامل داشت، همانجا خطا بدهد (احتمالا) و همیشه سعی براین داشته باشم که فقط و فقط از توابع و apiهای خود Qt استفاده کنم با تشکر فراوان
  28. کامبیز اسدزاده

    سلام، افزونه‌ی Qt در Visual Studio تنها امکان توسعه‌ی برنامه‌های تحت کیوت رو در محیط ویژوال استودیو می‌دهد (بنابراین هماهنگی کامل با فناوری‌های اختصاصی کیوت را نخواهد داشت). در صورتی که شما کامپایلر و تنظیمات qmake یا cmake را برای پلتفرم‌های مورد نظر به درستی تنظیم کنید می‌تونید خروجی مناسب را تهیه کنید. دقت کنید که برای iOS و Linux شما باید روی پلتفرم‌های مک و لینوکس خروجی بگیرید. برای iOS و macOS بهترین روش همین هست که شما در پلتفرم مربوط به خودشون کامپایل کنید. حتی برای لینوکس هم بهتره از همین روش استفاده کنید (هرچند به کمک روش کراس کامپایل می‌تونید خروجی بگیرید). سعی کنید از استاندارد‌ها و رابط‌های خاص ویندوز استفاده نکنید، سعی کنید استاندارد‌های هر پلتفرم رو برای خودش اعمال و تحت چهارچوب و قوانین کیوت طراحی و توسعه انجام بدین. در این صورت بدون دردسر‌های متداول می‌تونید برنامه‌ی خودتون رو برای پلتفرم مقصد خروجی و اجرا کنید. این بخش هم مقالات و آموزش‌های مناسبی موجود هستند که پیشنهاد می‌کنم بررسی بفرمایید.
  1. نمایش فعالیت های بیشتر
×
×
  • جدید...