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

کامبیز اسدزاده

بنیـــان گذار
  • تعداد ارسال ها

    387
  • تاریخ عضویت

  • روز های برد

    208

آخرین بار برد کامبیز اسدزاده در 29 شهریور

کامبیز اسدزاده یکی از رکورد داران بیشترین تعداد پسند مطالب است !

اعتبار در سایت

541 عالی

درباره کامبیز اسدزاده

اساتید
توسعه‌ دهنده بَک اِند
توسعه‌ دهنده فرانت اِند
توسعه دهنده فول اِستَک
منتور‌ها و مشاورین
  • تاریخ تولد 12 فروردین 1368

اطلاعات شبکه‌ای

موقعیت

  • شهر
    اورمیه

آخرین بازدید کنندگان نمایه

4,774 بازدید کننده نمایه
  1. اگرچه که زبان برنامه‌نویسی سی‌پلاس‌پلاس به عنوان یک زبان بسیار قدرتمند و قدیمی شناخته شده است، اما کتابخانهٔ استاندارد و پیشفرض آن برخی از موارد واقعاً مهم را به تازگی تعبیه کرده است. ویژگی‌هایی که در زبان‌هایی مثل جاوا و یا سی‌شارپ دات‌نت سال‌هاست وجود دارند. به هر حال این ویژگی‌ها در سی++ ۱۷ موجود شده‌اند و این یک بهبود و پیشرفت بسیار خوب است. برای مثال ما الآن فایل‌سیستم استانداردی را در اختیار داریم. این ویژگی به عنوان یک کتابخانه، امکان برای انجام عملیات بر روی سیستم‌فایل‌ها و اجزای آن‌ها مانند، مسیر‌ها، فایل‌ها و پوشه‌ها را فراهم می‌کند. کتابخانهٔ فایل‌سیستم در فایل سرآیند <filesystem> قرار گرفته است که توسط فضای نام مخصوص خود std::filesystem قابل فراخوانی است. به مثال زیر توجه کنید: namespace fs = std::filesystem; استفاده از این کتابخانه بسیار ساده و کاربردی است، بنابراین اگر بخواهیم به سادگی مسیری از یک ریشه را به دست آوریم، کد آن به صورت زیر خواهد بود: #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { fs::path p = fs::current_path(); std::cout << "The current path " << p << " decomposes into:\n" << "root name " << p.root_name() << '\n' << "root directory " << p.root_directory() << '\n' << "relative path " << p.relative_path() << '\n'; } فراخوانی کتابخانه، نمونه‌سازی از کلاس current_path و سپس چاپ نام، ریشه و مسیر مربوطهٔ آن صورت گرفته است. بنابراین این کتابخانه دارای کلاس‌های زیر است که توضیح و کاربرد هر کدام را آورده‌ایم: کلاس path، این کلاس امکان کار با مسیر‌ها را فراهم می‌کند، در واقع برای نمایش یا مشاهدهٔ یک مسیر از این کلاس استفاده خواهیم کرد. کلاس filesystem_error یک شیء استثناء در اثر سربارگذاری بیش‌از حد کتابخانهٔ فایل‌سیستم ایجاد می‌کند، در واقع برای مدیریت خطاها کاربردی خواهد بود. کلاس directory_entry برای کنترل ورودی یک مسیر استفاده می‌شود، برای مثال بررسی وجود یا عدم وجود در زیر مجموعه‌های این کلاس امکان‌پذیر است. کلاس directory_iterator یک تکرار کننده از محتوای یک مسیر (دایرکتوری) را ارائه می‌کند. کلاس recursive_directory_iterator یک تکرار کننده از محتوایت یک مسیر یا زیر مسیر‌های آن را ارائه می‌کند. کلاس file_status نوع فایل و مجوز‌های آن را ارائه می‌کند. کلاس space_info اطلاعات مربوط به فضای آزاد و موجود در سیستم‌فایل را ارائه می‌کند. کلاس file_type اطلاعات مربوط به نوع فایل را ارائه می‌کند. کلاس perms مجوز‌های سیستم‌فایل را شناسایی می‌کند. کلاس perm_options معانی هر یک از عملیات مرتبط با مجوز‌ها را ارائه می‌کند. کلاس copy_options معانی عملیات کپی را مشخص می‌کند. کلاس directory_options معانی عملیات مربوط به مسیر (دایرکتوری) را مشخص می‌کند. کلاس file_time_type مقادیر زمانی مربوط به فایل را ارائه می‌کند. هر یک از کلاس‌های فوق دارای متد‌ها و توابعی هستند که در مدیریت فایل‌سیستم بسیار کاربردی و مفید خواهد بود. در کلاس path شما می‌توانید با متد‌های مفیدی کار کنید، برای مثال کد زیر پسوند یک فایل موجود که در مسیر به آن اشاره می‌شود را، در صورت وجود ارائه خواهد کرد. fs::path("/foo/bar.txt").extension(); اگر مسیر فوق دارای فایل ذکر شده باشد، مقدار برگشتی آن .txt خواهد بود. و یا اگر نیاز باشد نام فایل را ارائه کند کافی است از متد file_name آن استفاده کنید! به مثال‌های زیر توجه کنید: #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { std::cout << fs::path("/foo/bar.txt").filename() << '\n' << fs::path("/foo/.bar").filename() << '\n' << fs::path("/foo/bar/").filename() << '\n' << fs::path("/foo/.").filename() << '\n' << fs::path("/foo/..").filename() << '\n' << fs::path(".").filename() << '\n' << fs::path("..").filename() << '\n' << fs::path("/").filename() << '\n' << fs::path("//host").filename() << '\n'; } همچنین جهت مدیریت خطا و دریافت یک کد یا پیغام خطا به کد زیر توجه کنید: try { cout << fs::file_size("path&file"); } catch (fs::filesystem_error &e) { cout << "Error Message = " << e.what() << " with Code : " << e.code(); } در صورتی که خطایی رخ دهد، کد خطا ساطع خواهد شد، جهت نمایش پیام خطا از تابع what و دریافت کد خطا از تابع code استفاده می‌شود. این مقاله ادامه دارد...
  2. جزئیات در ۱۱ ++C و برخی بهبود‌ها در ویرایش ۱۷ جدا کننده رقم استاندارد ۱۱ تا قبل از استاندارد ۱۴ شما مجبور بودید تعداد رقم‌ها و یا صفر‌ها را بشمارید. از استاندارد ۱۴ به بعد دیگر نیازی به این کار نیست. این کار در زمان محاسبهٔ آدرس در کلمه، مرز‌های رقمی یا نیم کاراکتر‌ها مفید خواهد بود. در واقع با گروه‌بندی ارقام کد شما رسا‌تر خواهد شد. int no = 1'000'000; long addr = 0xA000'EFFF; uint32_t binary = 0b0001'0010'0111'1111; تعریف نام مستعار (Type aliases) استاندارد ۱۱ از لحاظ معنایی مشابه typedef است، هرچند نام‌های مستعار تعریف شده به این شیوه ساده‌تر بوده و تحت انواع الگو‌ها سازگار‌تر هستند. به مثال‌های زیر توجه کنید: template <typename T> using dynamicArray = std::vector<T>; dynamicArray<int> nums; // equivalent to std::vector<int> using func_ptr = int (*)(int); و یا اگر بخواهید نام مستعاری از یک نوع std::map با کلید و مقدار از نوع رشته تعریف کنید، آنگاه به صورت زیر خواهد بود: using mapString = std::map<std::string, std::string>; این روش برای موارد متنوعی مورد استفاده قرار که قبل و بعد از وجود آن را در مثال زیر می‌بینیم: // C++11 using counter = long; // C++03 equivalent: // typedef long counter; // C++11 using fmtfl = std::ios_base::fmtflags; // C++03 equivalent: // typedef std::ios_base::fmtflags fmtfl; fmtfl fl_orig = std::cout.flags(); fmtfl fl_hex = (fl_orig & ~std::cout.basefield) | std::cout.showbase | std::cout.hex; // ... std::cout.flags(fl_hex); // C++11 using func = void(*)(int); // C++03 equivalent: // typedef void (*func)(int); // func can be assigned to a function pointer value void actual_function(int arg) { /* some code */ } func fptr = &actual_function; template<typename T> using ptr = T*; // the name 'ptr<T>' is now an alias for pointer to T ptr<int> ptr_int; الفاظ رشته‌ای تعریف شده توسط کاربر (User-defined literals) استاندارد ۱۱ در مواقع نیاز شما مجبورید با اصطلاحات واضحی مثل MB, KB, GB یا km، cm و یا واحد‌های دیگری جهت تبدیلات در زمان اجرا کار‌ی انجام دهید. اکنون به عنوان کاربر می‌توانید اصلاح مورد نیاز خود را همانند انواع pt (انواع ابتدائی) دیگر انجام دهید. این شیوه برای واحد‌ها و اندازه‌گیری بسیار مناسب است. اضافه کردن constexpr اثر هزینهٔ صفر از کارایی را در زمان اجرا فراهم می‌کند. using ull = unsigned long long; constexpr ull operator"" _KB(ull no) { return no * 1024; } constexpr ull operator"" _MB(ull no) { return no * (1024_KB); } int main() { std::cout << 1_KB << std::endl; std::cout << 1_MB << std::endl; return 0; } ویژگی مقداردهی لیست اولیه (std::initializer_list) استاندارد ۱۱ std::pair<int, int> p = {1, 2}; std::tuple<int, int> t = {1, 2}; std::vector<int> v = {1, 2, 3, 4, 5}; std::set<int> s = {1, 2, 3, 4, 5}; std::list<int> l = {1, 2, 3, 4, 5}; std::deque<int> d = {1, 2, 3, 4, 5}; std::array<int, 5> a = {1, 2, 3, 4, 5}; این شیوه مشابه آرایه‌ها به سبک C مقادیر را مستقیماً با لیست مقدار دهندهٔ اولیه «std::initializer_list» اختصاص می‌دهد. همچنین به لطف استاندارد ۱۱ این مورد در مورد نگه‌دارنده‌های تو در تو هم صدق می‌کند. ویژگی auto و decltype استاندارد ۱۱، بهبود و اضافات در استاندارد ۲۰ متغیر‌های تعریف شده به وسیلهٔ کلمهٔ کلیدی auto بر اساس نوع مقدار توسط کامپایلر استنباط می‌شوند. متغیر‌های تعرف شده به کمک کلمهٔ کلیدی decltype بر اساس بررسی موجودیت یا نوع و مقادیر عبارت تعیین می‌شوند. این ویژگی‌ها به شدت برای خواندن، به ویژه انواع پیچیده مفید است. auto a = 3.14; // double اجازه دهید یک مثال با ترکیب auto و decltype داشته باشیم. به عنوان مثال، توابع می‌توانند به وسیلهٔ کلمهٔ کلیدی auto نیز نوع بازگشتی خود را استنباط کنند. در استاندارد ۱۱ نوع بازگشتی باید به طور صریح یا با استفاده از نوع decltype رمزگشایی شود، به مثال‌های عادی و الگو (template) مانند زیر توجه کنید: auto getResult(std::string var) -> decltype (var) { return var; } template <typename X, typename Y> auto add(X x, Y y) -> decltype(x + y) { return x + y; } add(1, 2); // == 3 add(1, 2.0); // == 3.0 add(1.5, 1.5); // == 3.0 ویژگی Range-based for-loops استاندارد ۱۱ به علاوهٔ اضافات و بهبود‌ها در استاندارد ۱۷ و ۲۰ یک نحوِ شیرین برای تکرار عناصر در یک نگه‌دارنده یا ظرف (container) std::vector<int> v = {0, 1, 2, 3, 4, 5}; for (const int& i : v) // access by const reference std::cout << i << ' '; std::cout << '\n'; برای بررسی برخی از ویژگی‌های مرتبط با این موضوع به مقالات زیر مراجعه کنید: اشاره‌گر‌های هوشمند استاندارد ۱۱، بهبود‌ها در استاندارد ۱۷ استاندارد ۱۱ با خود اشاره‌گر‌های هوشمند را معرفی کرده است مانند std::unique_ptr، std::shared_ptr و std::weak_ptr که سپس std::auto_ptr در استاندارد ۱۷ به عنوان منسوخ شده معرفی و حذف شده است. std::unique_ptr<int> p = std::make_unique<int>(128); برای آشنایی با این ویژگی، لازم است در رابطه با اصطلاح RAII آشنا شوید، برای این منظور مقالهٔ زیر را برای مطالعه پیشنهاد می‌کنم. صفت‌های استاندارد جدید مانند، [[fallthrough]]، [[maybe_unused]] و [[nodiscard]] استاندارد ۱۷ این بحث به خودی خود بسیار جذاب است، بنابراین برای آن یک مقالهٔ ویژه در نظر گرفته‌ام که در ادامه می‌توانید به آن مراجعه کنید. ویژگی فضاهای نام تو در تو (Nested namespace) استاندارد ۱۷ فضاهای نام یکی از کاربردی‌ترین ویژگی‌های سی++ از زمان استاندارد ۱۱ به بعد می‌باشد که نحوهٔ تعریف آن به صورت زیر است: namespace Base { namespace Person { class PersonInfo { public: std::string name = {"Kambiz"}; }; } } در ادامهٔ استاندارد ۱۷ بهبود آن به شیوهٔ تو در تو صورت گرفته است و می‌تواند به صورت زیر تعریف شود: namespace Base::Person { class PersonInfo { public: std::string name = {"Kambiz"}; }; } در نهایت دسترسی به فضای نام و اعضای آن به همان شیوهٔ ساده ممکن است: Base::Person::PersonInfo pInfo; std::cout << pInfo.name << std::endl; یک کاراکتر u8 لفظی استاندارد ۱۷ این ویژگی برای ترجمهٔ صحیح کاراکتر‌ها به اسکی (ASCII) در پلتفرم‌های مختلف استفاده می‌شود. auto c = {u8'C'}; و یا به صورت یک رشتهٔ کامل: auto str = u8"سلام"; std::cout << str << "/n"; امکان استفاده از auto در template استاندارد ۱۷ این ویژگی امکان این را می‌دهد تا نوع پارامتر‌ها را در الگو‌ها تعریف کنیم، در استاندارد ۱۴ این ویژگی به صورت زیر ممکن است: template<typename Type, Type x> constexpr auto value = x; int main() { auto x = value<int,3>; return 0; } و اینک به لطف استاندارد ۱۷ استفاده از کلمهٔ کلیدی auto نیز فراهم شده است که به طور زیر تعریف می‌شود: template<auto x> constexpr auto value = x; int main() { auto x = value<3>; return 0; } نوع متغیر x توسط کامپایلر استنباط می‌شود، البته باید در نظر داشت این ویژگی در استفاده از variadic templates هم کاربرد دارد. به مثال زیر توجه کنید: template<auto ... values> struct A {}; int main() { auto k = A<1, 2, 'c'>(); return 0; } الفاظ رشته‌ای (لیترال) با ممیز شناور‌ (Floating point) در مبنای هگزادسیمال استاندارد ۱۷ در استاندارد ۱۷ ممیز شناور در مبنای هگزادسیمال اضافه شده است. اگر یک حرف شناور لفظی، آغازش با دنبالهٔ کاراکتر‌های 0x یا 0X باشد، آن در مبنای هگزا دسیمال شناور محسوب می‌شود. در غیر این صورت در مبنای شناور دسیمال (مبنای ۱۰) تعریف می‌شود. 0x | 0X hex-digit-sequence exponent suffix double d = 0x1.2p3; // hex fraction 1.2 (decimal 1.125) scaled by 2^3, that is 9.0 به مثال زیر توجه کنید: #include <iostream> int main() { std::cout << 58. << '\n' << 4e2 << '\n' << 123.456e-67 << '\n' << .1E4f << '\n' << 0x10.1p0 << '\n'; } نتیجهٔ تحت این ویژگی به این صورت است: 58 400 1.23456e-65 1000 16.0625 این مقاله ادامه دارد...
  3. بارها شده است که شما به این فکر کنید برنامه‌ای بنویسید که تحت کامپایلر‌ها و سیستم‌عامل‌های مختلف اجرا شود. بنابراین شما باید از ویژگی‌های خاص این روش مراقب باشید چرا که هر سیستم‌عامل نسبت به خود ساختار و عملکرد متفاوتی را دارد. برای مثال بین رابط‌های برنامه‌نویسی Windows و لینوکس تفاوت بسیار است. یا نوع سیستم‌عامل‌های FreeBSD یا Linux تفاوت‌های بسیاری دارند که نباید کد‌های شما در همهٔ آن‌ها یکسان باشد. در این بخش من قصد دارم در رابطه با برخی از پرکاربرد‌ترین متغیر‌های CMake اشاره‌ای داشته باشم. بنابراین متغیر‌های زیر را در نظر بگیرید: متغیر UNIX: تمامی سیستم‌عامل‌های شبه‌-یونیکس مانند macOS را شامل می‌شود. درواقع زمانی true است که پلتفرم آن مک یا شبه‌-یونیکس باشد. متغیر WIN32: زمانی true خواهد بود که پلتفرم مقصد و توسعه ویندوز باشد. متغیر MINGW: پلتفرم ویندوز را بر پایهٔ MinGW شامل می‌شود و زمانی true خواهد بود که پلتفرم ویندوز همراه با کامپایلر Mingw پیکربندی شده باشد. متغیر MSVC: زمانی برابر true خواهد بود که پلتفرم ویندوز همراه با کامپایلر MSVC پیکربندی شده باشد. برای مثال اگر بخواهیم کاری انجام دهیم که صرفاً در پلتفرم ویندوز اعمال شود، باید آن را در دامنهٔ چنین شرطی قرار دهیم: if(WIN32) # for Windows operating system in general endif() شما می‌توانید در بین این کد متغیری تعریف کنید، مسیر کتابخانه‌ای را شناسایی کنید و یا هر کاری که نیاز است مختص پلتفرم ویندوز اعمال شود را تنظیم نمایید. مثال برای شناسایی محصولات شرکت اپل، تحتِ سیستم‌عامل‌های macOS، iOS و حتی watchOS , tvOS if(APPLE) # for MacOS X or iOS, watchOS, tvOS (since 3.10.3) endif() مثال برای بررسی نوع سیستم‌عامل‌های یونیکس و لینوکس به غیر از محصولات اپل if(UNIX AND NOT APPLE) # for Linux, BSD, Solaris, Minix endif() یک شرط نسبتاً کامل‌تر به صورت زیر خواهد بود: if(APPLE) # for MacOS X or iOS, watchOS, tvOS (since 3.10.3) MESSAGE("Current platform is macOS!") elseif(Linux AND NOT APPLE) # for Linux and not Unix base such as macOS! MESSAGE("Current platform is Linux!") elseif(WIN32) # for Windows only! MESSAGE("Current platform is Windows!") elseif(UNIX AND NOT APPLE) # for Linux, Unix base Free-BSD, Solaris, Minix MESSAGE("Current platform is Unix!") elseif(ANDROID) # for Linux base, Android only! MESSAGE("Current platform is Android!") endif() مثال برای تشخیص بر اساس نوع کامپایلر، مختص پلتفرم ویندوز تحت Mingw، MSys و MSVC if(MSVC OR MSYS OR MINGW) # for detecting Windows compilers endif() روش‌های دیگری نیز برای مقایسه صریح دیگری وجود دارد، برای مثال عملگر STREQUAL می‌تواند گزینهٔ خوبی در تشخیص و اعمال شرط باشد. مثل مقایسه‌ای، در صورتی که نوع کامپایلر Clang باشد یا گزینه‌های دیگر: if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # using Clang elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # using GCC elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") # using Intel C++ elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # using Visual Studio C++ endif() در این صورت می‌توان بر اساس تشخیص شناسهٔ کامپایلر عملیات مورد نظر را اعمال کرد. همچنین می‌توان از عملگر MATCHES در بررسی شرط استفاده کرد: if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") MESSAGE("MSVC") endif() این مقاله ادامه خواهد داشت...
  4. کامبیز اسدزاده

    اکنون ++C سریع‌ترین رشد را بین زبان‌های برنامه‌نویسی دارد

    مدتی قبل بود که من در رابطه با شاخص‌های در حال رشد زبان‌های برنامه‌نویسی در کانال‌های شخصی نظری داده بودم که با توجه به وضعیت شاخص، زبان‌ برنامه‌نویسی ++C سریع‌ترین رشد را بعد از مدت‌ها به خود اختصاص داده است. این تغییرات و بیداری زبان طبق انتظاری که داشتم بعد از ظاهر شدن زبان برنامه‌نویسی Rust در بین ۲۰ زبان برنامه‌نویسی برتر و همچنین نهایی شدن استاندارد‌های 2a و پیشرفت‌های اخیر به خصوص رضایت‌بخشی کاربران از استاندارد 17 زبان ++C رخ داده است که دور از انتظار هم نبود. طبق شاخص محبوبیت طی چند سال گذشته، ++C با توجه به شاخص TIOBE در سپتامبر، سریع‌ترین زبان در حال رشد در بسته برنامه‌نویسی است. این زبان در سال‌های گذشته، محبوبیت سهم خود را در فراز و نشیب‌ها داشته است. اما با مقیاسه با سال‌های گذشته در حال حاضر رسماً سریع‌ترین رشد را در بین تمامی زبان‌های تحت پوشش اتوماسیون QA در شرکت Tobie را دارد. با این حال مدیرعامل Tobie جناب Paul Jansen گفته است، من فکر می‌کنم که استاندارد جدید سی++ یکی از دلایل این رشد اصلی باشد. به خصوص ویژگی‌های جدید module که قرار است جایگزین مکانیزم وحشتاک قبلی شود. با این روند سی++ بیشترین رشد‌ها که متعلق به #C با ۱.۱۸+ و R با ۱.۳۳+ را شکست می‌دهد.
  5. کامبیز اسدزاده

    قرارداد شیوه‌های نام‌گذاری

    قراداد شیوه‌های نام‌گذاری در برنامه‌نویسی یا (Variable Naming Conventions)، یکی از مهم‌ترین مواردی است که در خوانا بودن کد موثر است. نام‌گذاری متغیر‌ها از یک ایدهٔ ساده پیروی می‌کند؛ برای مثال، ایجاد متغیر‌ها عملکرد آن‌ها را توصیف می‌کند و از یک موضوع ثابت در کد شما پیروی می‌کند. نام‌گذاری محدود شده به چند کلمه در این قرارداد به جدا سازی کلمات در یک نام متغیر بدون استفاده از فضای خالی (فضای سفید) است. فضای سفید معمولاً در تفسیر برای زبان‌های برنامه‌نویسی دشوار است. به همین دلیل متغیر‌ها باید به نوعی محدود شوند تا با چنین مشکلاتی مواجه نشویم. مثال‌ها در این قرارداد به صورت زیر هستند: قرارداد Snakecase: در این قرارداد کلمات با زیر خطی از هم جدا می‌شوند. variable_one variable_two مثال در تعریف متغیر از نوع string_view به شیوهٔ Snakecas // // Created by Kambiz Asadzadeh on 9/1/20. // Copyright © 2020 Kambiz Asadzadeh. All rights reserved. // #include <iostream> #include <string_view> int main() { //!creates a string_view object std::string_view string_input = { "I'm C++ 17\n" }; std::cout << string_input; return 0; } قرارداد Pascalcase: در این قرارداد کلمات با حروف بزرگ از هم جدا می‌شوند: VariableOne VariableTwo مثال در تعریف متغیر از نوع string_view به شیوهٔ Pascalcase // // Created by Kambiz Asadzadeh on 9/1/20. // Copyright © 2020 Kambiz Asadzadeh. All rights reserved. // #include <iostream> #include <string_view> int main() { //!creates a StringView object std::string_view StringInput = { "I'm C++ 17\n" }; std::cout << StringInput; return 0; } قرارداد Camelcase: در این قرارداد کلمات به جز کلمهٔ اول با حروف بزرگ از هم جدا می‌شوند: variableOne variableTwo مثال در تعریف متغیر از نوع string_view به شیوهٔ Camelcase // // Created by Kambiz Asadzadeh on 9/1/20. // Copyright © 2020 Kambiz Asadzadeh. All rights reserved. // #include <iostream> #include <string_view> int main() { //!creates a stringView object std::string_view stringInput = { "I'm C++ 17\n" }; std::cout << stringInput; return 0; } توصیه، سعی کنید همیشه از یک قرارداد نام‌گذاری تبعیت کنید. این قرارداد‌ها در بین برنامه‌نویسان رایج بوده و در خوانایی کد شما توسط خود و دیگران بسیار موثر است.
  6. کامبیز اسدزاده

    معرفی مناسب‌ترین فونت‌ها و اصول استفاده در طراحی UI

    به نظر شما قلم یا هما فونت در طراحی رابط کاربری چقدر اهمیت دارد؟ ممکن است با خود بگویید طراحی و حل مشکلات نرم‌افزاری و در نهایت اجرای درست کد‌های نوشته شده اولویت بسیار بیشتری دارد و از این نظر برای مشتری کافی است! من تأکید می‌کنم این تفکر کاملاً اشتباه و بر خلاف قوانین UX خواهد بود. چرا که اولین واکنشی که کاربر شما با محصول خواهد داشت بازخورد‌های مربوط به ظاهر، مکان‌ها، چیدمان، قلم و در کل رابط کاربری آن خواهد بود. اگر شما به این فکر کنید که تنها با یک ظاهر عادی و کد‌های بک‌اندی بسیار عالی یک محصول را به بالا‌ترین درجهٔ فروش خود برسانید، سخت در اشتباه هستید. تمامی محصولاتی که کاربران آن‌ها وفادار هستند و ترجیح می‌دهند آن‌ها را برای دیگران هم پیشنهاد بدهند، از قوانین UX و UI به درستی تبعیت کرده‌اند. حتی در محیط‌های توسعه که کاملاً تخصصی هستند، یک رابط کاربری در‌دسترس، قابل درک و راحت بسیار پرطرفدار‌تر از یک محیط سخت و خُشک خواهد بود. قبل از هر چیز این نکته را یادآوری می‌کنم، فونت (قلم) در ظاهر برنامه یک اصل اساسی است و می‌تواند به اندازهٔ بسیار چشم‌گیری در زیبا بودن و برعکس بی‌ریخت بودن ظاهر برنامهٔ شما موثر باشد. اینکه شما با یک قلم پیشفرض مانند Tahoma یا Arial محصول خود را نهایی کنید نشان‌دهندهٔ آن است که هیچ اطلاعی در مورد طراحی رابط کاربری ندارید و صرفاً با معلومات فنی و کد‌نویسی خود سعی در توسعهٔ محصول و انتشار آن داشته‌اید! از نظر من این یکی از ناشیانه‌ترین رفتار‌هایی است که باعث می‌شود محصولات و یا همان نمونه‌کار‌های شما بیشتر از آنچه که باید دیده نشوند. بنابراین، پیشنهاد می‌کنم قبل از انتشار محصول نهایی حتماً به ظاهر آن توجه کنید که در این مقاله صرفاً به یکی از گزینه‌های بسیار مهم در طراحی رابط کاربری اشاره می‌کنم. فونت‌هایی که پیشنهاد می‌کنم به دو دستهٔ تجاری و آزاد خواهند بود که بر اساس شرایط توسعهٔ خودتون می‌توانید از آن‌ها استفاده کنید. فونت‌های آزاد (طراحی و توسعه توسط دوستمون صابر راستی‌کردار) وزیر صمیم شبنم تنها گندم پرستو ساحل ناهید جهت مقایسهٔ این فونت‌ها به این لینک مراجعه کنید. فونت‌های تجاری (طراحی و توسعه توسط دوستمون مسلم ابراهیمی) ایران یکان ایران سنس دانا فرهنگ انجمن دماوند پیدا کتیبه مانلی و ... جهت بررسی و مقایسه‌ به این لینک مراجعه کنید. درضمن، در رابطه با فونت‌های لاتین تمامی این فونت‌ها شامل نوع لاتین مثل Roboto می‌باشند که در زمان استفاده خودتون باید انتخاب کنید اعداد و نشانه‌گذاری‌ها به سبک لاتین باشند یا فارسی و عربی. در انتخاب فونت نسبت به هدف پروژه دقت کنید، برای مثال در اپلیکیشن‌های کسب‌و‌کار نباید از فونتی مثل تحریر، تاهوما، مانلی یا چنین سبک‌ها استفاده کنید. این کار بسیار اشتباهیه! وزن‌ها تنوع وزن‌ها به طراح این امکان را می‌دهد تا نزدیکترین ضخامت به ایدآل خود را انتخاب کند. در نظر داشته باشید انتخاب وزن‌های مناسب در جای مناسب خود بسیار مهم است. برای مثال، انتخاب یک وزن سبک برای عنوان مناسب نیست! همچنین انتخاب یک وزن Bold, Ex Bold, Black و ضخیم‌تر هم برای توضیحات و متن‌های طولانی مناسب نمی‌باشد. انتخاب صحیح برای عنوان نوع Bold یا Black و انتخاب صحیح برای متن‌های طولانی، توضیحات و غیره نوع Light و یا Regular است. بنابراین، در انتخاب نوع قلم با وزن مناسب باید دقت کرد تا بخش‌های پر اهمیت با بخش‌های کم اهمیت بر اساس اولویت در خوانده شدن متمایز شوند. هایرآرکی (سلسله مراتب) در تایپوگرافی چیست؟ هایرآرکی (Hierarchy) در تایپوگرافی یعنی اینکه نوشته‌ها را طوری کنار هم قرار دهیم که مهم‌ترین جمله اول خونده شود و به ترتیب، نوشته‌های کم اهمیت‌تر به ترتیب اهمیت خوانده شوند. این یک قانون است که وقتی همه چیز را مهم کنیم در واقع هیچ چیز مهم نیست! وقتی به همهٔ دانشجویان کلاس نمرهٔ ۲۰ بدهید یعنی هیچ‌کدام از آن‌ها بهترین نیستند. در طراحی اگر چند گزینه را بر روی صفحه قرار دهید لازم است جذاب‌ترین قسمت را برجسته‌تر از بقیه نشان بدهید. با این کار ما یک دروازهٔ زیبا برای ورود ساخته‌ایم. کاربر با دیدن این جملهٔ جذاب که شما طوری آن را طراحی کرده‌اید که زودتر از بقیه دیده و وارد ماجرا شود. اما اگر فکر کرده‌اید کار تمام است اشتباه کرده‌اید. باز هم به همین ترتیب باید ادامه بدهید. یعنی با ترفند‌های تایپوگرافیک کاری کنید که دومین جمله مورد نظرتان واقعاً در اولویت دوم دیده شود. از طرفی ممکن است ترتیب ارائه اطلاعات مهم باشد، عنوان اصلی، زیر عنوان، تیتر‌ها، متن اصلی و توضیحات پاورقی و … این مثال تصویری به خوبی موضوع سلسه مراتب در تایپوگرافی را نشان می‌دهد: در تایپوگرافی چندتا سلسله مرتبه داشته باشیم؟ عنوان اصلی (تیتر) عنوان فرعی (زیر تیتر) متن (بدنه مطلب) اطلاعات جزئی (توضیح عکس، ارجاع به منابع) چطور طراحی متن از نوع سلسله مراتبی ایجاد کنیم؟ شاید این راه‌ حل در ذهن شماست که هرچه مهم‌تر و مقدم‌تر است را بزرگتر می‌نویسیم. اما باید بگوییم که اینطور نیست. برای برجسته کردن یک متن از دیگری باید تضاد ایجاد کنیم و تضاد فقط با تغییر اندازه ایجاد نمی‌شود. مواردی از قبیل: تغییر نوع فونت، وزن فونت، رنگ فونت، ایتالیک یا ایرانیک بودن، کشیدگی حروف و فضا همه مواردی هستند که به کمک آنها می‌توان تضاد ایجاد کرد. همینطور که در مثال بالا می‌بینید اولین جمله کوچکتر و نازک از جمله دوم است اما در مرتبه اول قرار دارد. در اینجا نوع رنگ و فضا باعث برجستگی جمله اول است. در طراحی وب عمومی‌ترین روش برای انجام طراحی سلسله‌مراتبی در تایپوگرافی استفاده از برچسب های هدینگ در HTML است. از H1 تا H6 مهمترین عنوان‌ها تا کم اهمیت‌ترین نوشته‌ها را طبقه بندی کنید. قواعد سلسله‌مراتبی به جز تایپوگرافی در هر نوع طراحی دیگر نیز وجود دارد و می‌توان با رعایت آن قدرت تاثیر‌گذاری بخش‌های مختلف را کنترل و نظم دهی کرد. اگر آیتم‌های طراحی شما خیلی زیاد هست درست نیست که تعداد تقسیم بندی و سلسله مراتب را زیاد کنید. این کار باعث آشفتگی خواهد شد. در برخی از محصولات که مذهبی هستند فونت‌ها می‌توانند اختصاصی باشند مثل فونت کتیبه، رهروان. اینکه فونت‌های آزاد نیازی به هزینه ندارند و برعکس فونت‌های تجاری اغلب در اوج راه‌اندازی کسب‌و‌کار‌ها نیاز به مجوز‌های گران قیمتی هستند شکی نیست! پیشنهاد من این است ابتدا از نسخه‌های رایگان مثل فونت صمیم استفاده کنید این خیلی بهتر از فونت پیشفرضی مثل Tahoma یا Arial خواهد بود، در طراحی نرم‌افزار این مسائل بسیار مهم هستند. چه موقع باید از فونت‌های تجاری استفاده کرد؟ پیشنهاد من این است زمانی که کسب‌و‌کار شما با جدیت وارد بازار کار شد می‌توانید از مجموعهٔ فونت‌ایران درخواست فونت‌های تجاری کنید، معمولاً به آدرس هر وب‌سایت و برای هر پروژه یک مجوز ارائه می‌کند. بعد از راه‌اندازی کسب‌و‌کارتان، فونت را در قالب مجوز‌های غیر‌تجاری و یا کسب‌و‌کار‌های کوچک سفارش بدهید تا بتوانید با هزینه‌های بسیار پایین‌تر و تا زمانی که پروژهٔ شما درآمد میلیونی نداشته باشد از آن مجوز‌ها استفاده کنید.
  7. کامبیز اسدزاده

    سریع‌ترین فریم‌ورک‌های وب!

    در این مقاله من قصد دارم به معرفی ده فریم‌ورک برتر جهان در بازهٔ سال‌های ۲۰۱۹ و ۲۰۲۰ اشاره کنم که در حوزهٔ صنعت وب کاربرد دارند. معمولاً در سایت‌ها، وبلاگ‌ها و گروه‌های تلگرامی حرف از فریم‌ورک‌های شناخته شده‌ای مانند Asp.net core و یا Laravel به گوش می‌رسد. اما واقعیت این است که فریم‌ورک‌هایی که در مورد آن‌ها بحث می‌شود جایگاه خاصی در بین فریم‌ورک‌های قدرتمند و به عنوانی ناشناخته مانند Drogon، h2o، ulib و غیره ندارند! جالب است بدانید فریم‌ورک‌هایی که در ادامه نام‌هایشان را می‌شنوید به قدری سریع و قدرتمند هستند که مو بر تنِ شما سیخ خواهد کرد! برای مثال در این مقایسه جایگاه فریم‌ورک‌های دات‌نت به بالاتر از ۵۰ و لاراول به بیشتر از ۲۰۰ رتبه می‌رسد! این در حالی است که بر خلاف انتظارِ عام، فریم‌ورک‌های تحت سی/سی++ و راست به عنوان سریع‌ترین فریم‌ورک‌ها شناخته می‌شوند. در واقع مقایسه بر اساس نتایج گرفته شده از مرجع Techempower می‌باشد که هر ساله یک مقایسه در رابطه با کارآیی و کیفیت فریم‌ورک‌های وب می‌پردازد. سنجشِ فوق بر اساس وظایفی مانند سریال‌سازی جی‌سان، دسترسی به پایگاه داده و عملیات سمت سرور، پردازش و غیره می‌باشد. در این آزمایش‌ها عملکرد فریم‌ورک بر روی سیستم‌عامل، به صورت فول‌اِستک و میکرو اندازه‌گیری شده است که هر کدام را در رتبهٔ خاصی از وضعیت آن سوق می‌دهد. بهترین فریم‌ورک‌ها از نظر بنچ‌مارک (کارآیی) در سال ۲۰۱۹ در دورِ ۱۸ بین ۲۲۰ فریم‌ورک متعلق به h2o و ulib بوده است. کتابخانهٔ h2o یکی از قوی‌ترین مواردی است که می‌توان به آن اشاره کرد. در سال ۲۰۲۰ این رتبه‌بندی به نفعِ فریم‌ورک جدید‌تری به نام دراگون (Drogon) و مجدداً ulib جمع بندی شده است که نشان می‌دهد فریم‌ورک ulib به عنوان یکی از برترین فریم‌ورک‌های نوشته شده تحت سی و سی++ و همچنین دراگون تحت استاندارد‌های ۱۴ و ۱۷ زبان برنامه‌نویسی سی‌پلاس‌پلاس معرفی شده است. بنابرین بهتر است در مورد دراگون بیشتر بدانیم: این فریم‌ورک تحت زبان برنامه‌نویسی ++C در استاندارد ۱۴ و ۱۷ توسعه یافته و بر روی سکو‌های لینوکس، مک و ویندوز قابل اجراست. دراگون تحت ویژگی non-blocking I/O کار می‌کند و سرعت را همراه با دقت بسیار بالایی به خصوص بر روی پلتفرم‌های FreeBSD تضمین می‌کند. لینک مخزن توسعه و کد‌های دراگون. مثال از کد اولیه: #include <drogon/drogon.h> using namespace drogon; int main() { app().setLogPath("./") .setLogLevel(trantor::Logger::kWarn) .addListener("0.0.0.0", 80) .setThreadNum(16) .enableRunAsDaemon() .run(); } با توجه به مقایسه‌های صورت گرفته در آزمایش‌های مختلف زیر رتبه‌بندی فریم‌ورک‌ها مشخص می‌شود. آزمایش‌های فوق بر روی پردازندهٔ Dell R440 Xeon Gold صورت گرفته است که در این لینک آمده است. JSON serialization Single query Multiple queries Fortunes Data updates Plaintext آزمایش‌های مربوطه تنها به ۱۰ مورد اول اشاره کرده است، بنابراین برای مشاهدهٔ لیست بیشتر و جزئیات آن‌ها به مرجع آن مراجعه کنید.
  8. با سلام و درود، نسخهٔ ۵.۱۵.۰ به عنوان یک نسخهٔ نهایی از سری کیوت ۵ همراه با ویژگی‌های بسیاری ارائه شد. این نسخه با هدف پشتیبانی کامل از ویژگیِ backward-compatible (پشتیبانی از عقب‌گرد) در نسخه‌های سری ۵ منتشر شده است. اما طبق شرایطی که اخیراً شرکت کیوت اعلام کرده است، این نسخه به دو روش پشتیبانی بلند‌مدت و عادی ارائه می‌شود. نکته‌ای که باید به آن توجه داشته باشید این است که نسخهٔ LTS صرفاً برای کاربران تجاری مورد استفاده قرار خواهد گرفت. بنابراین توسعه‌دهندگان جامعهٔ متن‌باز یا در واقع نسخهٔ رایگان از کیوت می‌بایست آن را به صورت نصب آنلاین دریافت کنند. و یا می‌توانید کُد‌منبع آن را دریافت کرده و خود آن را کامپایل نمایید. این نسخه شامل ویژگی‌ها و اصلاحیه‌های زیر می‌باشد: پشتیبانی از ویژگی‌های نسخه‌های قبلی تا قبل از نسخهٔ سری ۶. پشتیبانی از رابط‌های بک‌اندی ۳ بعدی و رندرینگ که می‌توان یکی از تغییرات بسیار مهم سری کیوت ۵ باشد که در ادامه به آن اشاره شده است. ماژول کیوت کوئیک ۳ بعدی (Qt Quick 3D) محیط Qt Design Studio ۱.۵ بهبود‌ها و تغییرات در ماژول Qt QML بهبود‌ها و تغییرات در ماژول Qt Quick و دیگر تغییرات و بهبود‌ها... پشتیبانی از ویژگی‌های نسخه‌های قبلی تا قبل از نسخهٔ سری ۶ کیوت ۵.۱۵ به عنوان یک پله به سمت کیوت ۶ می‌باشد. این در صورتی است که کیوت ۶ در حال تغییر و تحولات بسیاری خواهد بود که در این نسخه از کیوت ۵.۱۵ سعی بر آن شده است که آن را به آسانی ممکن سازد. بسیاری از عملکرد‌هایی مستهلک که نشانه‌گذاری شده‌اند در کیوت ۶ حذف خواهند شد. با توجه به این موارد، کیوت ۵.۱۵ هم به عنوان یک نسخهٔ کامل از سری ۵ و هم یک پیش شروعی از نسخهٔ سری ۶ محسوب خواهد شد. پشتیبانی از رابط‌های بک‌اندی ۳ بعدی و رندرینگ احتمالاً مهمترین تغییر در سمت گرافیک و موتور رندرینگ کیوت اتفاق افتاده است. تغییرات بسیاری در لایه‌های زیرین اتفاق می‌افتد که بلافاصله برای کاربران قابل مشاهده نیست. در سال گذشته کار بر روی پشتهٔ گرافیکی صورت گرفت که این به‌روز رسانی در کیوت سری ۶ متمرکز خواهد شد که در حال حاضر نیز در کیوت ۵.۱۵ به عنوان گزینه‌ای در دسترس است. تیم توسعهٔ کیوت پشته‌های گرافیکی را در کیوت ۵ به خوبی توسعه داده بود تا به صورت چند-سکویی از این رابط‌های گرافیکی سه بعدی استفاده شود. اما طی دو سال اخیر، تغییرات قابل توجهی در صنعت باعث شده است که توسعه و استقرار برنامه‌هایی که از گرافیک‌های سه بعدی استفاده می‌کنند پیچیده‌تر شود. از طرفی اول شروع به کار روی Metal کرد و مدتی پیش پشتیبانی از OpenGL را در macOS و iOS کاهش و منسوخ کرد. گروه Khronos تلاش کرده است تا OpenGL را با Vulkan جایگزین کند که راهی برای اندروید و لینوکس می‌سازد. از طرف دیگر رابط‌های Direct3D 12 مایکروسافت کاملاً بازنویسی شده‌ است و به هیچ وجه با نسخه‌های قدیمی آن سازگار نیست. البته این به این معنی نیست که OpenGL در آینده از بین می‌رود. با توجه به شعار و قول کیوت با عنوان «چند-سکویی» توسعه‌دهندگان کیوت به دنبال راه حلی هستند که این راه حل در همه جا کار کند. بنابراین برای رسیدن به این هدف، کمی بیشتر از یک سال پیش شروع به کار بر روی یک لایهٔ انتزاعی برای همهٔ آن‌ها تحت Api‌های مختلف کرده‌اند. این رابط سخت‌افزاری Qt Rendering Hardware Interface یا RHI نام دارد و می‌تواند برای اجرای برنامه‌های تحت فناوری کیوت کوئیک (Qt Quick) در بالای Metal، Direct3D و Vulkan و همچنین OpenGL استفاده شود. به عنوان یک پیش‌نمایش فناوری در کیوت ۵.۱۵ پشتیبانی می‌شود، در واقع می‌توانید با فعال‌سازی آن از طریق یک متغیر محیطی، از Qt RHI استفاده کنید. در نهایت در کیوت ۶ این لایه بخش بسیار مهمی از معماری کیوت را تشکیل خواهد داد. ماژول کیوت کوئیک ۳ بعدی (Qt Quick 3D) یکی دیگر از ویژگی‌های قابل توجه و جدید در کیوت ۵.۱۵ نیز مربوط به گرافیک است. در زمان آغاز کیوت سری ۵ فناوری Qt Quick را سنگ بنای معماری کیوت در نظر گرفته و معرفی شده است. تمرکز آن بر ساده‌سازی ایجاد رابط‌های کاربری ۲ بعدیِ مبتنی بر لمس بود. امروزه کیوت ۵.۱۵ با یک فناوری جدید‌تر به عنوان Qt Quick 3D نیز معرفی می‌شود، فلسفهٔ آن کاربری آسان و ادغام محتوای ۳ بعدی در برنامه‌های مبتنی بر فناوری Qt Quick می‌باشد. در واقع با استفاده از Qt Quick 3D می‌توانید به راحتی صحنه‌های سه بعدی را در QML تعریف کنید. می‌توانید نور، چراغ، مِش و مواد مورد نظر خود را در آن تعریف کرده و همه چیز را به راحتی با رابط‌های ۲ بعدی خود ترکیب کنید. در جاهایی که نیاز است رابط‌های ۲ بعدی و ۳ بعدی را به صورت جداگانه تعریف کنید، با توجه به این راه حل دیگر مشکلی در این رابطه وجود نخواهد داشت. محیط Qt Design Studio ۱.۵ فناوری کیوت کوئیک ۳ بعدی تعداد زیادی از گزینه‌ها را برای ایجاد یک برنامهٔ جدید و جالب شامل عناصر ۲ بعدی و ۳ بعدی را فراهم می‌کند. بنابراین تلاش‌های بسیاری در توسعهٔ محیط Qt Design Studio شده است، تمام این قابلیت‌ها در اختیار و دسترس طراحان قرار می‌گیرد. به همین دلیل این یک نکتهٔ قوت است که بگوییم پشتیبانی از فناوری کیوت کوئیک ۳ در این نسخه از محیط استودیو طراحی کیوت ارائه می‌شود. بهبود‌ها و تغییرات در ماژول Qt QML در این بخش کیوت توانسته است گزینهٔ required را برای کامپوننت نویسی ارائه کند. این‌ها گزینه‌هایی هستند که به صورت پیش‌فرض می‌تواند توسط کاربر برای اجزاء اعمال شوند. بنابراین کامپوننت‌ها از این پس می‌توانند به صورت درون خطی در یک سند QML معین شوند. در کنار این یک روش جدید برای اعلان و ثبت انواع در QML ارائه شده است. بهبودی در ابزار qmllint رخ داده است و به مراتب راجع به مشکلات احتمالی در پایهٔ کد‌های QML نتیجهٔ بهتری را خواهد داشت. بهبود‌ها و تغییرات در ماژول Qt Quick چند ویژگی جدید نیز در Qt Quick ظاهر شده است. پشتیبانی از فضاهای رنگی در عنصر Image اضافه شده‌است. عنصر جدیدی به نام PathText به Qt Quick Shapes اضافه شده است. کنترل اشاره‌گر‌ها در گزینهٔ cursorShape برای مدیریت شکل مکان‌نما در سیستم‌های دسکتاپی و یک آیتم HeaderView برای افزودن آسان هدر‌های افقی یا عمدی در TableView اضافه شده است. دیگر بهبود‌ها کاربران کیوت خوشحال خواهند شد که بدانند، اکنون می‌توانند پشتیبانی بسیار بهتری را در رابطه با ظاهر (دکوراسیون) پنجره‌های سفارشی داشته باشند که به شما این امکان را می‌دهد تا تزئینات پنجرهٔ خود را تعریف کرده و محتوای سفارشی را در فضای نوار عنوان پنجره‌ها اعمال کنید. ماژول Qt Lottie، ماژولی که به عنوان یک پیش‌نمایش در نسخهٔ ۵.۱۴ معرفی شده بود، اکنون به صورت کامل پشتیبانی می‌شود. این ماژول به شما امکان می‌دهد تا از انیمیشن‌های After Effect در برنامه‌نویسی مبتنی بر کیوت استفاده کنید. ماژول Qt WebEgine از کرومیوم نسخهٔ ۷۷ در ۵.۱۴ به کرومیوم ۸۰ به‌روز شده است و با تمامی ویژگی‌های جدید از به‌روز‌رسانی‌های کرومیوم همراه است. ماژول Qt 3D پشتیبانی از اشکال‌زدائی و چند ویژگی جدید و کوچکتر را به همراه دارد. ماژول Qt Multimedia، اکنون از چند سطح رندرینگ پشتیبانی می‌کند. در Qt GUI مقیاس‌بندی تصویر و روال تبدیل اکنون برای بسیاری از موارد چند رشته‌ای قابل استفاده است. ماژول Qt Network اکنون از نسخهٔ TLS 1.3 پشتیبانی می‌کند. در ماژول Qt Core، QRunnable و QThreadPool اکنون می‌توانند با std::function کار کنند و همچنین یک روش QFile::moveToTrash() برای انتقال فایل‌ها به داحل سطل زباله به صورت چند-سکویی فراهم شده است. در نهایت نیز پشتیبانی از دیالوگ (پنجره‌های گفتگو) بومی در اندروید اضافه شده است و نیازی نیست کد‌های اضافی در این بخش اعمال کنید.
  9. کامبیز اسدزاده

    قبلاً در این تاپیک توضیح داده شده.
  10. کامبیز اسدزاده

    سلام، در رابطه با آموزش‌های ویدیوئی، ان‌شاءال... در فرصت مناسبی همراه با پلتفرم فانوکس ارائه خواهند شد.
  11. امروز نسخهٔ جدید ۴.۱۲.۰ از کیوت‌کریتور منتشر شد که دارای ویژگی‌های مهم‌تری نسبت به نسخه‌های قبلی دارد. یکی از مهمترین مواردی که واقعاً مشکلات اساسی را در این نسخه پوشش می‌دهد حل مسائل مربوطِ به توسعه‌دهندگان کیت اندروید است. در این ویرایش محیط توسعهٔ اندروید به صورت خودکار برای توسعه‌دهنده پیکربندی می‌شود. فقط کافی است مسیر دقیق فایل‌ها را ارائه کنید. Qt Creator 4.12 =============== Qt Creator version 4.12 contains bug fixes and new features. The most important changes are listed in this document. For a complete list of changes, see the Git log for the Qt Creator sources that you can check out from the public Git repository. For example: git clone git://code.qt.io/qt-creator/qt-creator.git git log --cherry-pick --pretty=oneline origin/4.11..v4.12.0 General ------- * Added `Restart Now` option when changing settings that require restart * Added option for linking Qt Creator to a Qt installation, sharing auto-detected Qt versions and kits * Added guard against crashing plugins at startup, providing the option to temporarily disable the offending plugin * Added locator filter for searching in Qt Project bug tracker * Added option to create custom URL template locator filters * Added browser for Marketplace items to Welcome mode (QTCREATORBUG-23452) * Fixed various theming issues Help ---- * Added tool button for changing target for context help (QTCREATORBUG-17667) * Added option to register documentation only for highest Qt version, and made that default (QTCREATORBUG-21482, QTCREATORBUG-22799, QTCREATORBUG-10004) Editing ------- * Added `Go to Last Edit` * Added option for default line terminator style (QTCREATORBUG-3590) * Improved behavior when splitting would hide text cursor * Fixed that wizards ignored default file encoding * Fixed that only restricted number of sizes were allowed for font size (QTCREATORBUG-22536) * Fixed completion after undo (QTCREATORBUG-15038) ### C++ * Fixed issue with Clang and precompiled headers (QTCREATORBUG-22897) ### Language Client * Added support for Markdown in tooltips * Added support for auto-formatting * Added outline dropdown (QTCREATORBUG-21916) * Improved protocol error reporting * Fixed `Ctrl-click` for `Follow Symbol Under Cursor` (QTCREATORBUG-21848) ### QML * Updated to Qt 5.15 parser (QTCREATORBUG-23591) * Improved support for multiple imports into same namespace (QTCREATORBUG-15684) * Added scanning of `app.qmltypes` and `lib.qmltypes` for type information * Fixed highlighting for new keywords in Qt 5.15 * Fixed reading of `qmltypes` from Qt 5.15 (QTCREATORBUG-23855) ### Python * Added wizards for Qt Quick Application and Qt Widgets Application with `.ui` file (QTCREATORBUG-21824) ### Diff Viewer * Added support for staging only selected lines (QTCREATORBUG-19071) Projects -------- * Added option to hide "disabled" files in Projects tree (QTCREATORBUG-22821) * Added option to filter output panes for lines that do not match expression (QTCREATORBUG-19596) * Added option for default build configuration settings (debug information, QML debugging, Qt Quick Compiler) (QTCREATORBUG-16458) * Added option to only build target for active run configuration (qmake & Qbs) * Added option to only stop the target of active run configuration on build (QTCREATORBUG-16470) * Added option for project specific environment (QTCREATORBUG-21862) * Added option to remove items from `Recent Projects` list in Welcome mode * Added option to start run configurations directly from target selector (QTCREATORBUG-21799) * Added option to build project for all configured kits (QTCREATORBUG-16815) * Added `-ensure-kit-for-binary` command line option that creates a kit for a binary's architecture if needed (QTCREATORBUG-8216) * Added GitHub build workflow to `Qt Creator Plugin` wizard template * Improved UI responsiveness while parsing projects (QTCREATORBUG-18533) * Fixed build directory after cloning target (QTCREATORBUG-23462) * Fixed copying of filtered text from output pane (QTCREATORBUG-23425) ### QMake * Improved renaming of files (QTCREATORBUG-19257) * Fixed handling of `object_parallel_to_source` (QTCREATORBUG-18136) * Fixed crash with circular includes (QTCREATORBUG-23567) * Fixed issue with renaming files (QTCREATORBUG-23720) ### CMake * Improved handling of `source_group` (QTCREATORBUG-23372) * Added support for `Add build library search path to LD_LIBRARY_PATH` (QTCREATORBUG-23464) * Added automatic registration of CMake documentation, if available (QTCREATORBUG-21338) * Fixed that `.cmake` directory was created in project source directory (QTCREATORBUG-23816) * Fixed issues with `snap` on Ubuntu Linux (QTCREATORBUG-23376) * Fixed handling of `Enable QML` in debugger settings (QTCREATORBUG-23541) * Fixed unneeded reparsing of files * Fixed code model issues with precompiled headers (QTCREATORBUG-22888) ### Qbs * Updated included Qbs version to 1.16.0 * Changed to use separate Qbs executable instead of direcly linking to Qbs (QTCREATORBUG-20622) * Added option for default install root (QTCREATORBUG-12983) ### Python * Added option to disable buffered output (QTCREATORBUG-23539) * Added support for PySide 5.15 to wizards (QTCREATORBUG-23824) ### Generic * Improved performance for large file trees (QTCREATORBUG-20652) * Fixed that only first line of `.cflags` and `.cxxflags` was considered ### Compilation Database * Fixed that project was reparsed if compilation database contents did not change (QTCREATORBUG-22574) ### Nim * Added support for Nimble build system * Added support for `Follow Symbol Under Cursor` Debugging --------- * Added option to hide columns from views (QTCREATORBUG-23342) * Added option for `init` and `reset` GDB commands when attaching to remote server * Fixed pretty printer for `std::optional` (QTCREATORBUG-22436) Analyzer -------- ### Clang * Improved filtering * Added `Analyze Current File` to `Tools` menu and editor context menu * Added context menu item that opens help on diagnostics ### CppCheck * Added option to trigger Cppcheck manually ### Chrome Traces * Added more details for counter items * Added option to restrict view to selected threads * Added information about percentage of total time for events ### Heob * Added support for settings profiles (QTCREATORBUG-23209) Qt Quick Designer ----------------- * Added locking and pinning of animation curves (QDS-550, QDS-551) * Added support for annotations (QDS-39) * Fixed dragging of keyframes in curve editor (QDS-1405) * Fixed crash when selecting icon (QTCREATORBUG-23773) * Fixed missing import options (QDS-1592) Version Control Systems ----------------------- ### Git * Added option to create branch when trying to push to a non-existing branch (QTCREATORBUG-21154) * Added option to start interactive rebase from log view (QTCREATORBUG-11200) * Added information about upstream status to `Git Branches` view * Added option to `grep` and `pickaxe` git log (QTCREATORBUG-22512) * Made references in VCS output view clickable and added context menu (QTCREATORBUG-16477) Test Integration ---------------- * Added support for colored test output (QTCREATORBUG-22297) ### Google Test * Added support for internal logging (QTCREATORBUG-23354) * Added support for `GTEST_SKIP` (QTCREATORBUG-23736) Platforms --------- ### Windows * Improved behavior with regard to MSVC tool chain matching and compatibility of MSVC 2017 and MSVC 2019 (QTCREATORBUG-23653) ### macOS * Fixed parsing of Apple Clang specific linker message (QTCREATORBUG-19766) * Fixed `Run in Terminal` and `Open Terminal` when user has different shell configured (QTCREATORBUG-21712) ### Android * Discontinued support for Ministro * Added auto-detection of Java JDK (QTCREATORBUG-23407) * Added option to automatically download and install required Android tools (QTCREATORBUG-23285) * Added option to register multiple NDKs (QTCREATORBUG-23286) * Added automatic selection of correct NDK for Qt version (QTCREATORBUG-23583) * Added option to download and use [OpenSSL for Android](https://github.com/KDAB/android_openssl) (QTBUG-80625) * Added support for Android 11 with API level 30 * Improved examples browser to only show items tagged with `android` (QTBUG-80716) * Improved manifest editor (QTCREATORBUG-23283) * Fixed issues with latest SDK r29 (QTCREATORBUG-23726) * Fixed several issues with AVD manager (QTCREATORBUG-23284, QTCREATORBUG-23448) * Fixed that some essential packages were not installed (QTCREATORBUG-23829) * Fixed that ABI selection in build configuration did not persist (QTCREATORBUG-23756) ### iOS * Improved examples browser to only show items tagged with `ios` ### Remote Linux * Added option to use custom command for install step (QTCREATORBUG-23320) * Added option to override deployment data (QTCREATORBUG-21854) ### Bare Metal * Added support for RL78 architecture * Added support for J-Link and EBlink GDB servers * Added support for KEIL uVision v5.x debugger ### MCU * Added auto-registration of documentation and examples (UL-1685, UL-1218) * Switched to MCUXpresso IDE instead of SEGGER JLink for NXP kits (QTCREATORBUG-23821) * Fixed issues with desktop kit (QTCREATORBUG-23820) * Fixed issues with RH850 (QTCREATORBUG-23822)
  12. با توجه به عنوان مقاله، شباهت‌های بسیاری بین std::string_view و std::span وجود دارد، در واقع، string_view و span اشیاء‌ای هستند که به یک ترتیبِ به هم پیوسته از عناصری اشاره دارند که نقطهٔ آغازین آن‌ها از موقعیت صفر است؛ و همچنین عملیات استاندارد نگه‌دارنده‌ها (ظرف) را ارائه می‌کنند. هر دو نوع شیء از نوع easy-to-copy (کپی آسان) هستند که دارای یک اشاره‌گر و یک عنصر اندازه هستند. از نظر مفهومی، آن‌ها دیدگاه‌های غیر صاحب یک آرایه (یا دنبالهٔ پیوسته) هستند که رابط استاندارد غنی‌ای را ارائه می‌کنند. در مورد تفاوت‌ها (اختلافات) بین این دو، <std::span<T یک الگوی نمایش آرایه‌ای با هدف کلی است، در حالی که std::string_view یک نمایش تخصصی‌تر در یک دنباله‌کاراکتر یا رشته است. در زیر شرح مختصری از این تفاوت‌ها آورده شده است: شیء span یک قالب (Template) است، اما string_view خیر! شیء span، الگویی است که با هر نوعِ تعریف شده توسط کاربر کار می‌کند، در حالی که string_view به طور خاص نمای یک آرایهٔ مشخص پیوسته است. از نظر سطحی یک string_view معادل <span <char است. char buff[] = "Hello World"; auto sp = std::span<char>(&buff[0], 5); auto sv = std::string_view(&buff[6], 5); for(auto c : sp) std::cout << c; //Hello std::cout << " "; for(auto c : sv) std::cout << c; //World اما، ویژگی‌های string_view بیشتر از این مورد می‌تواند باشد. شیء string_view یک نوع فقط خواندنی برای نمایش است. یکی از ویژگی‌های برجستهٔ string_view این است که این شیء فقط یک نمایش فقط خواندنی است. بنابراین، ما نمی‌توانیم یک آرایهٔ زیرین را از طریق یک string_view تغییر دهیم، در حالی که این امکان از طریق span ممکن است: char str[] = "hello"; //Change str to uppercase through span auto sp = std::span<char>(str,strlen(str)); std::transform(sp.begin(), sp.end(), sp.begin(), [](char c) { return std::toupper(c); }); //str is now HELLO //Back to lowercase via string_view is not possible. auto sv = std::string_view(str); std::transform(sv.begin(), sv.end(), sv.begin(), [](char c) { return std::tolower(c); }); //ERROR! اگر string_view فقط خواندنی باشد، طول آن به اندازهٔ کافی انعطاف‌پذیر است که از طریق <span <const T به یک نمایش فقط خواندنی تبدیل می‌شود. بنابراین یک string_view به یک <span <const char نزدیک‌تر است. البته یک ویژگی وجود دارد که string_view را تضمین می‌کند. شیء string_view از عملیات std::string-like پشتیبانی می‌کند. شیء span دارای چندین عملیات متوالی پیوسته است، به عنوان مثال: front, back, begin و operator[]. با این حال، string_view چندین روش دیگر مانند std::string دارد، به عنوان مثال: substr, find, compare سربارگذاری اپراتور‌ها (مانند == و < یا >). بنابراین، string_view می‌تواند نیازِ به std::string را در مواردی که فضای زیرین آن مهم نیست را از بین ببرد.
  13. با سلام و درود، نسخهٔ ۵.۱۴.۰ به عنوان یک نسخهٔ ما قبل نهایی از ۵.۱۵ همراه با ویژگی‌های بسیاری ارائه شده است که در این میان ویرایش ۵.۱۴.۲ بعد از ۵.۱۴.۱ با برخی از بهبود‌ها و حل مشکلات گزارش شده منتشر شد. برخی از ویژگی‌های بسیار کاربردی که به کمک دوستان عزیز، @سروش ربیعی و @hamed_masafi به کتابخانهٔ QCalendar افزوده شده است. و از این نسخه به بعد امکان استفاده از تاریخ شمسی در کیوت فراهم می‌شود. شما می‌توانید این نسخه از کتابخانه را در این بخش دریافت کنید. یک مثال ساده: #include <QCoreApplication> #include <QCalendar> #include <QDate> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QCalendar cal(QLatin1String("jalali")); qDebug() << "availableCalendars=" << QCalendar::availableCalendars(); QString todayJalali = QDate::currentDate().toString("yyyy-MM-dd", cal); qDebug() << "Today in jalali calendar=" << todayJalali; QDate d(1398, 10, 15, cal); qDebug() << "Date 1398/10/15 in julian calendar=" << d.toString(); return a.exec(); } ویژگی‌های جدید به صورت زیر می‌باشند: ماژول Qt3d Threading architecture overhaul (removal of aspect thread) Frontend/Backend node sync overhaul QTransform now has access to the world matrix Introduction of Scene3DView Scene3D is now in sync with QtQuick Scene3D can now render as an underlay without FBO ماژول Qt Bluetooth [QTBUG-40698] Optional win32 backend to support Windows 7 and 8. Backend is not built by default and not part of the prebuild packages though. QLowEnergyController: Introduce AuthorizationError [QTBUG-76615] Ability to have multiple manufacturer data per manufacturer ID ماژول QtCore QCalendar adds support for Calendars other than Gregorian, by implementation of suitable back-ends. Back-ends to implement the Gregorian, Jalali (Persian), Islamic Civil, Milankovic, and Julian calendars. We look forward to other contributions. [QTBUG-14150] Qt is now relocatable, i.e. it's possible to move the Qt installation without breaking functionality or loading of plugins. ماژول Qt GUI QColorConstants provide constexpr QColor instances that don't cost any runtime overhead Updated High-DPI support. Applications can now opt-in to use non-integer scale factors, for example Windows at 150%. Use QGuiApplication::highDpiScaleFactorRoundingPolicy or QT_SCALE_FACTOR_ROUNDING_POLICY to set the rounding policy. Added the QT_ENABLE_HIGHDPI_SCALING environment variable which enables high-dpi scaling based on display DPI. Replaces QT_AUTO_SCREEN_SCALE_FACTOR (now deprecated), and corresponds to the Qt::AA_EnableHighDpiScaling application attribute. The QT_FONT_DPI environment variable is now supported cross-platform, for the purpose of developing and testing with specific DPI values. Color-space support for images. Reading and writing color-spaces from JPEG, PNG, WebP and TIFF images, and performing color-space transformation on images. QTextDocument/QTextTable now support per-edge border styling via QTextTableCellFormat border-collapse mode HTML table style import (partial) and export QTextDocument supports reading and writing Markdown format, as an alternative to HTML. If you read HTML and write Markdown, or vice-versa, the formatting should be preserved to the extent that the CommonMark and GitHub specs allow (including headings, tables, bullet lists, block quotes and code blocks); but we don't guarantee all cases yet, because it's thinly tested so far. ماژول Qt Multimedia Added QVideoFrame::Format_YUV422P. Introduced support of GStreamer OpenGL plugin. ماژول Qt Network HTTP/2 configuration API Network connectivity monitoring [QTBUG-1538] Support Kerberos Proxy Authentication ماژول Qt QML Added qmlRegisterSingletonInstance function. This allows to expose a QObject as a singleton to QML, without having to create a factory function as required by qmlRegisterSingletonType. It is meant as a type safe replacement of setContextProperty in common usages. Added qmlRegisterAnonymousType as a replacement for qmlRegisterType. It allows to specify the URI and major version, which enables better tooling support. qmllint gained an experimental -U option. If run with it, it warns about accesses to unqualified identifiers ماژول Qt Quick Added the first preview of the graphics API independent scenegraph renderer as an opt-in feature. This allows running qualifying Qt Quick applications on top of Vulkan, Metal, or Direct3D 11 instead of OpenGL. The supported platforms are currently Windows 10, Linux with X11 (xcb), macOS with MoltenVK, or Android 7.0+ for Vulkan, macOS for Metal, Windows 10 for D3D. Text and TextEdit now support Markdown format (CommonMark and GitHub dialects) as an alternative to HTML. Includes the GitHub checklist extension, such that you can click to toggle checkboxes in a TextEdit. TextEdit uses an I-beam cursor by default, and a pointing-hand cursor when hovering a checkbox or a link. You can still override the default cursor, though. Added WheelHandler, an Event Handler for the mouse wheel, and optionally for emulated mouse wheel events coming from a trackpad. Added BoundaryRule in Qt.labs.animation: a PropertyValueInterceptor that restricts the range of values a numeric property can have, applies "resistance" when the value is overshooting, and provides the ability to animate it back within range. It's particularly useful in combination with WheelHandler, to provide similar physics as Flickable has. Event Handler base classes such as QQuickSinglePointHandler and QQuickMultiPointHandler have private implementation, while the classes themselves are suitable for subclassing, and are exported. They do not have supported public C++ API yet, but we encourage you to experiment with subclassing them anyway using the private API. They are intended to become public at some point in Qt 6 (and we can continue to iterate the API until then, especially to keep up with upcoming changes to the QEvent classes in Qt 6). Image and BorderImage now have the same currentFrame and frameCount properties that AnimatedImage has; this allows choosing an individual ic ماژول Qt SerialBus [QTBUG-72979] Added operators to compare QCanBusDevice::Filter for equality or inequality. [QTBUG-70449] Added the QCanBusDevice::OperationError and QCanBusDevice::TimeoutError codes to signal wrong operation respectively timeout errors. [QTBUG-70766] Added the function QCanBusDevice::busStatus() to query the CAN bus status from the CAN bus device. [QTBUG-54943] Added the function QCanBusDevice::resetController() to reset a CAN controller from bus off state. [QTBUG-75204] SocketCAN: Added the configuration parameter QCanBusDevice::ProtocolKey to use another protocol inside the protocol family PF_CAN. [QTBUG-54296] SocketCAN: If libsocketcan is available, the CAN bus bitrate can be get and set at runtime. PeakCAN: Added support for PCAN-USB devices on macOS by using the MacCAN library. [QTBUG-75405][QTBUG-76232] Expose the underling QIODevice used for Modbus communication, e.g. for setting the serial port hardware flow control (RTS/CTS). ماژول Qt WebEngine Updated to be based on Chromium 77 [QTBUG-74166] New API for control of QWebEnginePage life-cycle [QTBUG-56978] Methods and properties for download item to get suggested name, and change the download directory and file name [QTBUG-50420] New findTextFinished signal and corresponding QWebEngineFindTextResult and FindTextResult types to get extra information about the result of a text search [QTBUG-55110][QTBUG-51176] Added methods to QWebEngineCertificateError to asynchronously handle an error, and get a chain of digital certificates ماژول Qt Widgets QTextEdit and QTextBrowser now support Markdown format (CommonMark and GitHub dialects) as an alternative to HTML. Includes the GitHub checklist extension, such that you can click to toggle checkboxes if the widget is editable. QTextBrowser::setSource() detects Markdown based on the file extension. تغییرات در پلتفرم اندروید Android needs NDKr20+ Added multi ABI build in one go. By default it will build for all android supported abis (arm64-v8a, armeabi-v7a, x86_64, x86). The user can control which ABIs he wants to use via ANDROID_ABIS qmake variable. Added support for the new AAB package format, which allows deploying a single application bundle to Google Play which contains binaries for all supported ABIs. ماژول جدید Qt Quick Timeline کیوت برای اتوماسیون Qt KNX Extended support for KNXnet/IP Core V2 (discovery, tunneling, routing, security) Qt MQTT Added support for using QSslConfiguration when connecting encrypted Added autoKeepAlive property to enable manual connectivity checks Qt OPC UA Added tech preview for GDS client support Updated 3rdparty open62541 to version 1.0 Qt CoAP The module leaves the Tech Preview status behind and an API commitment is given.
  14. کامبیز اسدزاده

    این یک Log است.
  15. کامبیز اسدزاده

    مشکل به خاطر عدم به‌روز‌رسانی مخازن است. لطفاً با v-p-n وارد شوید و سعی کنید مخازن را به‌روز‌رسانی کنید. سپس در حین qmake و کامپایل gardle توسط خود کیوت کریتور دریافت و ادغام خواهد شد.
×
×
  • جدید...