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

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

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

  1. هفته گذشته
  2. جدیدا
  3. alihaydari

    سلام من از پلتفرم code blocks برای نوشتن برنامه های ++C استفاده میکنم. بعد از پیکربندی پلتفرم برای C++17 (ویندوز 32 بیت)با مشکل عدم شناسایی thread در ++C مواجه شدم. در حالیکه پلتفرم با c++14 به خوبی نخ ها رو اجرا میکنه اما c++17 با خطای thread is not a member of std و خطای 'thread' was not declared this scope در بخش بیلدینگ مواجه میشود. در حالیکه سرایند thread شناخته میشود؟ توجه: در cmd ورژن gcc نه هست و در کدها ورژن C++ را چک کردم 17 بود. ویژگی های غیر thread مرتبط با استاندارد 17 اجرا میشود اما thread ها اجرا نمیشوند. من این meganz / mingw-std-threads (در اینجا هم تاکید شده که کلاسهای thread در نسخه جدیدmingw از دست رفته اند.(Implementation of standard C++11 threading classes, which are currently still missing on MinGW GCC.)) را برای حل موضوع پیدا کردم.
  4. alihaydari

    سلام با عرض پوزش آدرس "جزئیات ویژگی‌ها و تغییرات در این نسخه" مربوط به نسخه 8 کامپایلر است. آدرس برای تغییرات نسخه 10 در اینجا هست.
  5. اگرچه که زبان برنامه‌نویسی سی‌پلاس‌پلاس به عنوان یک زبان بسیار قدرتمند و قدیمی شناخته شده است، اما کتابخانهٔ استاندارد و پیشفرض آن برخی از موارد واقعاً مهم را به تازگی تعبیه کرده است. ویژگی‌هایی که در زبان‌هایی مثل جاوا و یا سی‌شارپ دات‌نت سال‌هاست وجود دارند. به هر حال این ویژگی‌ها در سی++ ۱۷ موجود شده‌اند و این یک بهبود و پیشرفت بسیار خوب است. برای مثال ما الآن فایل‌سیستم استانداردی را در اختیار داریم. این ویژگی به عنوان یک کتابخانه، امکان برای انجام عملیات بر روی سیستم‌فایل‌ها و اجزای آن‌ها مانند، مسیر‌ها، فایل‌ها و پوشه‌ها را فراهم می‌کند. کتابخانهٔ فایل‌سیستم در فایل سرآیند <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 استفاده می‌شود. این مقاله ادامه دارد...
  6. جزئیات در ۱۱ ++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 این مقاله ادامه دارد...
  7. الهه انصاری

    اصول طراحی: ثبات و سازگاری

    ثبات یک اصل اساسی در زندگی و طراحی است. بدون آن نمی‌توانیم ادامه دهیم. اگر از عهده‌ی اعمال آن برآیید، حتی سخت‌ترین مشکلات نیز از بین خواهند رفت! ثبات یکی از اصول طراحی است که دوست داریم به طور مرتب آن را نقض کنیم. من نیز در انجام این کار مقصر هستم و به آن افتخار نمیکنم. پیش بردن کامل کارها به صورت خلاقانه می‌تواند به راحتی این اصل طراحی را زیر پا بگذارد. موضوع مورد مطالعه پیرامون اصل ثبات در طراحی بسیار زیاد است. من تمام تلاش خود را برای بیان مهم‌ترین نکات آن خواهم کرد. در ادامه می‌توانیم یاد بگیریم که چگونه از ثبات استفاده کنیم و چگونه آن را در طرح‌های خود حفظ کنیم بدون اینکه این اصل را نقض کنیم. اصل ثبات در طراحی چیست؟ ثبات یکی از مولکول‌های دی ان ای طراحی است. طراحی سازگار، طراحی بصری است. بسیار مفید است و جهان را به مکانی بهتر تبدیل میکند. به طور خلاصه، هنگامی که عناصر مشابه ظاهر و عملکرد یکسانی داشته باشند، قابلیت استفاده و یادگیری بهبود می‌یابد. وقتی سازگاری و ثبات در طراحی شما وجود داشته باشد، افراد می‌توانند دانش را به زمینه‌های جدید منتقل کنند و موضوعات جدید را به سرعت و بدون دردسر بیاموزند. به این ترتیب آن‌ها می‌توانند بر اجرای کار تمرکز کنند و نیازی به تمرکز بر یادگیری این که چگونه هر بار رابط کاربری محصول تغییر زمینه می‌دهد ندارند. ما انسان‌ها به طور پیش فرض ثبات را دوست داریم! بدن‌های جسمانی ما به طور دائم در تلاش برای کسب تعادلی مداوم هستند؛ بنابراین می‌توانیم سالم باشیم. ما باید احساس کنیم که شرایط برای احساس امنیت و ایمنی سازگار است. مزایای ثبات و یکپارچگی کاربران، نحوهٔ استفاده از طرح شما را سریع‌تر یاد می‌گیرند. فرض کنید که عناصر سازگار در طراحی شما همان حروف الفبا هستند. وقتی کاربر الفبای شما را یاد گرفت، می‌تواند به هر قسمتی از محصول برود و بتواند بدون هیچ مشکلی با رابط ارتباط برقرار کند. داشتن رابط متناقض همانند تلاش برای برقراری ارتباط با کاربر به چندین زبان است. در این حالت فقط کاربران پیشرفته و حرفه‌ای قادر به انجام کارهای خود خواهند بود؛ بنابراین باید رابط ساده و سازگاری داشته باشید. ثبات و سازگاری، سردرگمی را از بین می‌برد! وقتی کاربر احساس سردرگمی کند، مرحلهٔ بعدی احساس ناامیدی است. ما نمی‌خواهیم کاربر عزیز ما این گونه احساس کند، نه؟ ثبات باعث صرفه جویی در هزینه و زمان می‌شود! طراحی سازگار اغلب توسط اجزای از پیش تعریف شده ساخته می‌شود. این امر به طراحان و ذینفعان اجازه می‌دهد تا بدون صرف وقت با ارزش برای استدلال، سریع تصمیم بگیرند. این مورد باعث صرفه جویی در وقت میشود که میتواند برای ساخت محصول و پیشرفتهای چشمگیر و افزایشی به کار گرفته شود. چهار نوع مختلف ثبات و سازگاری بیایید چهار نوع سازگاری را بررسی کنیم که مهم است که هنگام طراحی از آن آگاه باشید. سازگاری بصری عناصر مشابه که به همان شیوه درک می شوند ، قوام بصری را تشکیل می دهند. این باعث افزایش یادگیری محصول می شود. برای حفظ قوام بینایی ، قلم ها ، اندازه ها ، دکمه ها ، برچسب زدن و موارد مشابه باید در سراسر محصول باشند. سازگاری عملکردی کنترلهای مشابه که به همان روش کار میکنند ، قوام عملکردی را تشکیل میدهند. قابلیت پیش بینی محصول را افزایش میدهد. پیش بینی پذیری موجب میشود تا کاربران احساس امنیت و امنیت کنند. به عنوان مثال، راه برگشت به یک مرحله در جریان باید به همان روش در سراسر محصول کار کند. سازگاری داخلی این ترکیبی از هماهنگی بصری و عملکردی در طراحی محصول شما است. این قابلیت استفاده و یادگیری محصول را بهبود میبخشد. حتی هنگامی که ویژگی ها یا صفحات جدید را معرفی میکنید، کاربران تا زمانی که قوام داخلی را حفظ کنید، از آن‌ها آسان استفاده خواهند کرد. سازگاری خارجی این نوع سازگاری زمانی حاصل میشود که ثبات طراحی در چندین سیستم یا محصول وجود داشته باشد. به این ترتیب میتوان از دانش کاربر برای یک محصول در محصول دیگر استفاده مجدد کرد. بله، این به از بین بردن بسیاری از اصطکاکها کمک می کند و تجربه‌ٔ کاربری خوبی را ارائه میدهد. مثال خوب سازگاری خارجی رابط کاربری محصولات Adobe است. هنگامی که کار با فتوشاپ را میدانید استفاده‌ٔ‌ مجدد از همان دانش برای استفاده از Illustrator و غیره بسیار سادهتر است. دستیابی به این چهار نوع سازگاری به طراحی شما کمک میکند تا از قابلیت استفادهٔ بهتر و استفاده کنندگان خوشحالتری برخوردار شود. چگونه سازگاری را فراهم کنیم؟ ماهیت سازگاری این گونه است که بتوانید یک عمل یا عنصر مشابه را چندین بار تکرار کنید و همچنان با دستیابی به کار از کاربر پشتیبانی کنید. عوامل بصری تایپوگرافی، رنگ‌ها، فضا، شبکه (grid)، اندازه و موقعیت‌ها؛ این عناصر باید در یک مکان مرکزی تعریف شده و سپس در کل سیستمی که طراحی می‌کنید استفاده شوند. سلسله مراتب بصری قوی تعریف کنید؛ به طوری که مهم‌ترین موارد، بزرگ‌تر از موارد کم اهمیت‌تر باشند. از همان پالت رنگی در سراسر محصول استفاده کنید. حاشیه‌ٔ داخلی (padding) و حاشیه‌ٔ خارجی (margin) باید در تمام عناصر مشابه (دکمه‌ها، کارت‌ها و غیره) سازگار باشند. همه چیز را باید در یک شبکه به انتخاب خود مرتب کنید که امکان چیدمان همه‌ٔ اجزا را به روشی زیبا و ظریف فراهم کند. داشتن عوامل بصری سازگار به کاربر این امکان را می‌دهد تا سیستم را سریع یاد بگیرد و تجربه‌ای روان و دلنشین داشته باشد. وقتی از عوامل بصری سازگار استفاده می‌کنید، طراحی شما از فنگ شویی خوبی بهره خواهد برد. در این لینک نمونه‌های مناسبی با دستورالعمل‌هایی از این سبک آورده شده است. صدا و لحن زبان و لحنی که شما در کل جریان کاربر استفاده می‌کنید، بر نحوه‌ٔ درک کاربر از محصول تاثیر می‌گذارد. صدا و لحن را در حالت ثبات و سازگاری حفظ کنید تا ارتباط گیرا، مختصر و مفیدی با کاربر شکل بگیرد. ما نمی‌خواهیم ذهن کاربر خیلی درگیر و شلوغ شود، مگر نه؟ اگر می‌خواهید صدایی بامزه و دوستانه در طراحی محصول خود داشته باشید، این کار را تا دریافت پیام‌های خطا ادامه دهید. MailChimp نمونه‌ی خوبی از صدا و لحن سازگار است. از الگوهای آشنا استفاده کنید افرادی که از طرح‌های ما استفاده می‌کنند ،خواه دیجیتال باشد یا نباشد، از مدتی قبل با آ‌ن‌ها درگیر بوده‌اند. این بدان معنی است که آن‌ها طراحی‌های دیگری را تجربه کرده و یاد گرفته‌اند و کار با الگوهای به کار رفته در آن‌ها را به خوبی می‌دانند. http://www.mobile-patterns.com ما باید از این مورد استفاده کنیم و الگوهای آشنا را در طراحی‌های خود بگنجانیم. در این صورت سفر کاربر بسیار روان‌تر خواهد بود و افراد حتی فکر نمی‌کنند که «هوم، چگونه از این استفاده کنم؟»؛ آن‌ها مستقیما بدون درنگ از آن بهره می‌برند. در این دو منبع، موارد خوبی برای بررسی الگوهای مختلف وجود دارد: Mobile Patterns و Design Patterns. ثبات را به دست آورید، آن‌ها را بر هم نزنید ممکن است تصور کنید که سازگاری می‌تواند کاربر را خسته کند. اگر اجزا را همیشه در حالت ثبات نگه داریم تقریبا دیگر هیچ نوآوری وجود نخواهد داشت. قبل از این‌که بخواهیم از قوانین بهره‌ای ببریم ابتدا باید آن‌ها را یاد بگیریم. بله، سعی کنید آن‌ها را دور نزنید! سازگاری شکسته شده و زیر پا گذاشته شده برابر است با یک طراحی و تجربه‌ٔ کاربری خراب. این مسئله هم برای کاربر و هم برای سازمان یک درد است. روند طراحی کند می‌شود. کلی سرمایه‌ٔ اضافی صرف می‌شود تا افراد در اتاق جلسات بر سر این که بهترین رنگ برای آن دکمه چیست، بحث کنند. هر کسی زمان ارزشمند خود را از دست می‌دهد تا تصمیماتی بگیرد که پیش از این باید اتخاذ شده و اکنون دوباره مورد استفادهٔ مجدد قرار گیرد. طراحان باید تا حد امکان ثبات را حفظ و ایجاد کنند. ثابت نگه داشتن امور به معنای کند شدن تغییر است. ما هنوز هم نیاز داریم که محصولمان لذت بخش و جذاب باشد. ما به آن‌ها نیاز داریم تا به نسخه‌ی بهتری تبدیل شوند. بنابراین، چگونه باید ثابت قدم بمانیم و همچنان به موقعیتی که می‌خواهیم برسیم و تغییر کنیم؟ «راز» این کار در درک کاربران است. تمام تصمیمات طراحی شما باید از همین درک حاصل شود. فقط درصورتی که سیستم مورد نظر شما از نیاز کاربر مطلع شده باشد، تنظیمات را اعمال کنید. انجام این تغییرات کوچک، محصول را به نسخهٔ بهتری مبدل ساخته و ثبات آن را حفظ می‌کند. افکار نهایی طراحی خود را با انتظارات کاربران هماهنگ کنید. کاربران خود را بشناسید دقیقا همان طور که شریک زندگی خود را می‌شناسید. قادر باشید از زاویه‌ٔ دید آن‌ها نگاه کنید و از طریق قلب آن‌ها احساس کنید. با آن‌ها یکی شوید. آن را با درک کامل از اصول طراحی مانند سلسله مراتب بصری، تایپوگرافی، الگوهای کاربردی و غیره ترکیب کنید. به یاد داشته باشید که تغییرات اندک خوب است اما تغییر بیشتر لزوما بهتر نیست! ثبات را ایجاد کنید تا قابلیت استفاده را بهبود بخشید و با کاهش اجزای غیر منتظره، لذت وصف ناپذیری در تجربه‌ٔ کاربر ایجاد نمایید. منبع امیدوارم مطالب برای شما همراهان عزیز مفید واقع شوند. با نظرات ارزنده‌ٔ خود ما را در این مسیر یاری کنید
  8. بارها شده است که شما به این فکر کنید برنامه‌ای بنویسید که تحت کامپایلر‌ها و سیستم‌عامل‌های مختلف اجرا شود. بنابراین شما باید از ویژگی‌های خاص این روش مراقب باشید چرا که هر سیستم‌عامل نسبت به خود ساختار و عملکرد متفاوتی را دارد. برای مثال بین رابط‌های برنامه‌نویسی 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() این مقاله ادامه خواهد داشت...
  9. کامبیز اسدزاده

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

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

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

    قراداد شیوه‌های نام‌گذاری در برنامه‌نویسی یا (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; } توصیه، سعی کنید همیشه از یک قرارداد نام‌گذاری تبعیت کنید. این قرارداد‌ها در بین برنامه‌نویسان رایج بوده و در خوانایی کد شما توسط خود و دیگران بسیار موثر است.
  11. کامبیز اسدزاده

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

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

    متاسفانه کمی درگیر شده ام و خیلی از کارهام متوقف شده در اولین فرصت بررسی و در صورت نیاز با اجازه مزاحم شما خواهم شد. متشکرم
  13. Feey

    از reflection استفاده کنید
  14. بهنام صباغی

    متاسفانه مشکلاتی داره سه بعدی کیوت و دست رو خیلی میبنده من قبلا با یک سریشون برخورد کردم و تصمیم گرفتم برم سراغ VTK خوبم جواب داد دست ادمم باز میذاره توی کار من خیلی وقته سه بعدی کار نکردم و با خود سه بعدی کیوت هم اصلا نساختم همون اوایل محدودیت هایی داشت که فراریمون داد سمت VTK بهتره بقیه دوستان کمک کنند.
  15. Heydar Mahmoodi

    والا اول اومدم اینکارو کنم اما به درستی جوابگو نیست اول اینکه scene که یه پراپرتی داره به اسم activeCamera اونو فقط میشه با camera3d ست کرد که این camera3d یه سری پراپرتی خیلی کمتری خیلی خیلی کمتری از camera داره ولی خب متاسفانه activeCamera فقط camera3d رو قبول میکنه. وگرنه خود camera یه پراپرتی ماتریسی داره . فک کنم کارمو راه مینداخت که زیرش نره . اما خب کلا بهتره زیرش مشکی باشه تا اینکه زیرش نره. درضمن camera3d چیزی به اسم محدود کردن rotate‌حول تارگت نداره وقتی اینم نباشه یعنی زوم لول هیچ! (یه wrap داره که بولین دریافت میکنه و وقتی فعال کنید فقط با ۳۶۰ زوم حول عمودی برمیگرده سرجاش و ۱۸۰ درجه حول x برمیگرده سرجاش ) چون شما حول اون تارگت یه نیم دور بچرخی زوم کنی دوباره اونورش بری باز unzoom کنی مثه این میمونه میشه همه جاش رفت و زوم کرد و دید همه چیزو و همه جا رو ... یکم سخته ولی میشه. مثه این میمونه حتی zoomlevel‌ هم یه پراپرتی مزخرفه ...
  16. بهنام صباغی

    یک راه دیگه که من دیدم استفاده میکنند محدود کردن زاویه دوربین هست یعنی محدودش میکنی کلا نتونه بره زیر نمودار برای زوم هم زوم لول تعریف کن طوری که از یه حدی بیشتر نتونه زوم کنه این جواب کارتو میده ؟
  17. قاسم رمضانی منش

    سلام و درود؛ دیتابیس MySQL انتخاب شد، امّا برنامه‌نویس اون قسمت من نبودم.
  18. Heydar Mahmoodi

    سلام وقتتون بخیر میشه بگید آخرش چیو انتخاب کردید و چرا؟ کلا تجربه تون راجب اون پروژه درمورد دیتابیسش رو میشه عرض کنید؟
  19. Heydar Mahmoodi

    ایده ای وجود نداره عزیزان؟ یعنی برم سمت همون مولتی سری؟ اونطوری خیلی برا پرفرمنس بده فک کنم هلپ می
  20. Heydar Mahmoodi

    وقت همگی بخیر بنده میخواستم بدونم آیا راهی هست که زیر یک surface3d که فقط seri داره رو پر کنم درواقع میخوام زیرش رو طرف با زوم کردن نره زیر surface رو ببینه و مشکی باشه. اگر این نمودار بنده باشه(که البته نیست فقط برای نشون دادن مشکلم عرض میکنم. لینک تصویر میخوام که زیرش مشکی شه و فقط سطح دیده شه تنها راهی که در ذهنم دارم که اصلا جالب نیست اینه که خودم یه سری دیتا دیگه درست کنم و مقادیرش با دیتای اصلی یکی باشه جز کناره هاش که کمترین مقدار surface باشه تا کناره ها رو مشکی کنه که فک میکنم مشکلات زیر رو داره: ۱- هردفعه پردازش اضافی با اپدیت مقادیر میشه و دوباره یه سری دیگه ساخته میشه که سرعت رو میاره پایین ۲- یکم هم مشکل هست ساخت دیتای اضافی اینطوری راه حلی دارید دوستان؟
  21. کامبیز اسدزاده

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

    در این مقاله من قصد دارم به معرفی ده فریم‌ورک برتر جهان در بازهٔ سال‌های ۲۰۱۹ و ۲۰۲۰ اشاره کنم که در حوزهٔ صنعت وب کاربرد دارند. معمولاً در سایت‌ها، وبلاگ‌ها و گروه‌های تلگرامی حرف از فریم‌ورک‌های شناخته شده‌ای مانند 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 آزمایش‌های مربوطه تنها به ۱۰ مورد اول اشاره کرده است، بنابراین برای مشاهدهٔ لیست بیشتر و جزئیات آن‌ها به مرجع آن مراجعه کنید.
  22. mehdi314

    مطلب خوب و با ارزشی بود مباحث معماری را بصورت پراکنده هم که شده ادامه بدید خیلی با ارزشه. خصوصا اگر بشه مثل ddd مسیری رو برای حل چالش ها ارایه بدید. در هر صورت از اینکه می نویسید کار بسیار با ارزشیه. موفق باشید
  23. محبوبیت روزافزون تجربه‌ کاربری به عنوان یک حرفه لزوماً به معنای این نیست که همه چیز برای تیم‌های تجربه‌‌ کاربری در گروه‌های توسعه‌ٔ شرکتی امیدوارکننده است. هنوز هم تمایلی به فرض وجود دارد که «طراحی» تنها بخشی از نقش تجربه کاربری است که دارای اهمیت است. این فرض اغلب منجر به تشکیل تیم‌هایی می‌شود که نمی‌توانند وظایف خود را به طور مؤثر در قبال سازمان انجام دهند. برای ارائهٔ مزایای سازمانی (و در نتیجه بازگشت سرمایه، Return of Investment) تیم به مجموعه‌ای از مهارت‌های فراتر از طراحی ساده با تسلط بالا نیاز دارد. به طور خاص، ۸ مهارت کلیدی وجود دارد که تیم‌های تجربه‌ کاربری را در دنیای شرکتی و تجاری قادر به شکوفایی می کند: تحقیقات کاربر و نمایه‌ی کاربر تحقیقات کاربر به وضوح مورد مهمی است، بدون آن نمی‌توانید بفهمید که کاربران شما چه می‌خواهند. محیط کسب‌ و کار باید با درک قوی از روان‌شناسی کسب و کار و یا روان‌شناسی صنعتی پشتیبانی شود. شما می‌خواهید که بتوانید به طور قطع به ذهن کاربر خود راه یابید و انگیزه‌های آن‌ها را در عمیق‌ترین سطوح درک کنید. هرچه بیشتر بتوانید این کار را انجام دهید، پیشبرد پروژه‌هایی که نیازهای کاربر را برآورده می‌کنند برایتان راحت‌تر خواهد بود. توسعه‌ی این قابلیت، توانایی ارائه‌ٔ مشخصات دقیق کاربر به کسب وکار را فراهم می‌کند. هرچه یک شرکت بزرگ‌تر باشد، طرفداری متعصبانه تکیه‌گاه محکمی برای رساندن پیام شما به هدف نخواهد بود. پروفایل‌های کاربر را می‌توان در تمام مکان‌های مربوطه نمایش داد و اطمینان حاصل کرد که کل تیم با هم به خوبی کار می‌کنند. طراحی تعاملی طراحی تعاملی همان «طراحی» است، اما نه به گونه‌ای که بسیاری از متخصصان غیر حرفه‌ای تجربه کاربری تصور می‌کنند. نحوه‌ی تعامل کاربرانتان با محصول شما اغلب یک نقطه‌ٔ فروش مهم برای محصولات شما است. طراح تعاملی همچنین باید بتواند در ایجاد موارد کاربرد به تیم کمک کند و بتواند با بقیه‌ٔ اعضای تیم همکاری کند تا این موارد کاربرد را به ابزارهای ارزشمندی تبدیل کند که نکات مهمی از ساختار معماری اطلاعات و عناصر رابط کاربری را در اختیار ما قرار میدهد. خلاصه تجربه کاربری برای توسعه‌ٔ محصول ضرورت است، البته تنها زمانی که به طور کامل انجام شود. اگر می‌خواهید از یک سرمایه‌گذاری در یک تیم تجربه کابری بهترین بازده را کسب کنید، شما بیش از طراحی تجربه کاربری به عنوان تمرکز خود نیاز دارید. ۸ رشته‌ی فوق با طراحی تجربه کاربری ترکیب می‌شوند تا تجربیات بهتری را برای کاربر رقم بزنند. در آینده هر یک از این ۸ مورد را در پست‌های جداگانه‌ای بررسی خواهیم کرد.
  24. axarbani

    کدام میزبانی وب مناسب است؟

    همان طور که میدانیدسرعت لود سایت در سئو خیلی خیلی کمک میکند و باعث میشه سایت شما از نظر گوگل امتیاز بالاتری بگیرد شرکت هایی که درزمینه وب و وی پی اس و.. در ایران فعالیت میکنن با تبلیغات وسیع مثل( این خدمات ما ssdدارد و لود بالایی دارد )مارا گمراه کنند چون90درصد میزبان های وب اطلاعات درستی در مورد پینگ و سرعت لود سایت نمیدهند و شما مجبور هستید که یک تعرفه بخرید بعد از خرید تازه متوجه میشید که این هاست اصلا سرعت پینگ مناسبی ندارد من در این آموزش میخوام روشی رو بهتون یاد بدم که قبل از خرید تعرفه از ارائه دهندگان میزبانی وب اطمینان حاصل کنید که شرکت خدمات دهنده اطلاعاتی که درباره سرعت لود سایت ها در وب سایتشون با استفاده از تبلیغات ارائه میدهندآیا درست است یا خیر؟ نکته :دلیل این که ما از خودسایت خدمات دهندگان میزبانی وب, پینگ میگیریم این است که صددرصدخدمات دهنده, سایت خودش را در بهترین جای سرورش بارگزاری میکند پس باید بهترین پینگ وپایین ترین Time Outرا باید داشته باشد. اسم سایت+دامین سایت ارائه دهنده خدمات میزبان وب رو پیدا میکنید با استفاده از روش زیر ازآن پینگ میگیرید پینگ وTime outرا زیر نظر میگیرید. محیط CMDرا باز کنید . ping mizbanfa.net -t در آخر دکمه Enter را فشار میدهیدو بعد از یک الا دو دیقه کلید های ترکیبی Ctrl+Cفشار میدهید تا از حلقه خارج شود. Pinging mizbanfa.net [93.115.150.136] with 32 bytes of data: Reply from 93.115.150.136: bytes=32 time=34ms TTL=56 Reply from 93.115.150.136: bytes=32 time=33ms TTL=56 Reply from 93.115.150.136: bytes=32 time=33ms TTL=56 Reply from 93.115.150.136: bytes=32 time=33ms TTL=56 Reply from 93.115.150.136: bytes=32 time=33ms TTL=56 Request timed out. Reply from 93.115.150.136: bytes=32 time=32ms TTL=56 Request timed out. Reply from 93.115.150.136: bytes=32 time=32ms TTL=56 Request timed out. Reply from 93.115.150.136: bytes=32 time=32ms TTL=56 Request timed out. Reply from 93.115.150.136: bytes=32 time=32ms TTL=56 Request timed out. Reply from 93.115.150.136: bytes=32 time=32ms TTL=56 Reply from 93.115.150.136: bytes=32 time=33ms TTL=56 Reply from 93.115.150.136: bytes=32 time=33ms TTL=56 Reply from 93.115.150.136: bytes=32 time=32ms TTL=56 Reply from 93.115.150.136: bytes=32 time=32ms TTL=56 Request timed out. Reply from 93.115.150.136: bytes=32 time=32ms TTL=56 Request timed out. Reply from 93.115.150.136: bytes=32 time=34ms TTL=56 Reply from 93.115.150.136: bytes=32 time=33ms TTL=56 Ping statistics for 93.115.150.136: Packets: Sent = 30, Received = 30, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 32ms, Maximum = 34ms, Average = 32ms Control-C ^C همان طور که متوجه شدید این دستور شروع میکنه از وب سایت ارائه دهنده خدمات میزبانی وب پینگ میگیرد قدم اول :میانگین پینگ را حساب میکنید قدم دوم:تعداد دفعات Request timed out نشان دهنده این است که هاست یا سرور mizbanfa.net برای چند ثانیه از دست رسی خارج است. درمثال بالا اطلاعات مهمی راCMDدر اختیار ما قرار میدهد به شرح زیر است Minimum = 32ms, Maximum = 34ms, Average = 32ms نکته:معیار یک هاست و یا سرور خوب پایین ترین ping و پایین ترین دفعات Time outاست شما میتوانید تک به تگ وب سایت های ارائه دهنده خدمات هاست را با این روش زیر نظر بگیرید و آن خدمات دهنده ای را انتخاب کنید که کمترین Pingوپایین ترین دفعات Time outرا داشته باشد, گزینه ی مناسبی برای وب سایت شما است. موفق و پیروز باشید
  25. با سلام و درود، نسخهٔ ۵.۱۵.۰ به عنوان یک نسخهٔ نهایی از سری کیوت ۵ همراه با ویژگی‌های بسیاری ارائه شد. این نسخه با هدف پشتیبانی کامل از ویژگیِ 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() برای انتقال فایل‌ها به داحل سطل زباله به صورت چند-سکویی فراهم شده است. در نهایت نیز پشتیبانی از دیالوگ (پنجره‌های گفتگو) بومی در اندروید اضافه شده است و نیازی نیست کد‌های اضافی در این بخش اعمال کنید.
  26. axarbani

    @کامبیز اسدزاده سلام به دوستان عزیز به خصوص استاد آقای کامبیز اسدزاده من روشی رو پیدا کردم که میشه در تولید فایل نهایی (qt creator) خیلی کمک کنه من حدودا یک ماهه درگیر فایل نهایی Qtبودم این روش خیلی سادس فقط نیاز دارید آموزش (نصب و راه اندازی برنامه‌های تحت Qt) را حتما مطالعه کنید اگر مشکلتون حل نشد حتما آموزش من رو مطالعه کنید شروع ایجاد یک پروژه ساده برای تست فایل نهایی Qt من یک پروژه Qtرو ایجاد میکنم (new project+qt widgets application+mingw 64bit) در آخرfinishرا میزنم. همان طور که متوجه شدید من یک پروژه به عنوان مثال ساختم که روشم را تست کنم. حالا با حالت Release کمپایل میکنید . حالا با روشی که آقای کامبیز اسدزاده در آموزش (نصب و راه اندازی برنامه‌های تحت Qt) عنوان کردن فایل های DLLرو جمع آوری میکنیم. نکته: بعضی مواقع همه فایل های DLLجمع آوری نمیشوند شما مجبور هستیم با استفاده از روش دستی تک به تک DLLهایی که در پوشه فایل EXEپروژه قرار نگرفته را پیدا کنید. روش اول: خوب حالا تمام فایل های DLLجمع آوری شده را در پوشه در مسیر زیر کپی کنید C:\Windows\System32 کپی کنید اگر پیغام جایگزین امد جایگزین کنید. حالا شما نرم افزار خود را هر کجا از سیستم ببرید اجرا میشود. نکته: شما میتوانید برای فایل های DLLمورد نیاز نرم افزارتان یک installerبسازید و مسیرC:\Windows\System32vرا برای آن مشخص کنید تا نر افزارتان تمام و کمال خطایی نداشته باشن روش دوم : یک زمانی هست شما نمیخواین خودتون رو در گیر فایل DLLکنید و میخواهید هر نرم افزاری که مینویسید به سرعت بدون داشتن فایل DLLدر هر جایی از سیستم شما اجرا بشه از روش دوم استفاده میکنید. بنابه کمپایلرتونmingw یا msvc2017 پوشه شما تغییر میکند چون من از کمپایلر mingw73_64 استفاده میکنم وارد پوشه mingwمیشوم c:\QT_C\5.13.0\mingw73_64\bin با استفاده ازروش زیر کل DLLهارو انتخاب و کپی میکنیم در search bin عبارت زیر را تایپ میکنیم (*.dll) همه DLLها را انتخاب و سپس کپی میکنیم درC:\Windows\System32 کپی کنید اگر پیغام جایگزین امد جایگزین کنید. حالا شما هر بار که میخواهید با mingw کمپایل کنید نیازی به استخراج فایل DLL نداریدو هرموقع بخواهید نرم افزاری که نوشتید بدون DLLباز میشه. آقای اسدزاده عزیز خیلی خیلی ممنونم از این کهاین سایت فوق العاده رو تاسیس کردین لطفا اگر من اشتباهی دارم راهنمایی کنید
  27. axarbani

    سلام من آموزشتون رو مطالعه کردم ولی مشکلم رفع نشدمن تمام فایل های DLLرو با این روش در فایل نهاییم فراخوانی کردم ولی بازم ارور0xc00007b میداد روش جدیدی پیدا کردم که برای هر پروژه و روی هرنسخه ویندوز این DLLها جواب میده سر زمان مناسب حتما با شما استاد گرامی و برنامه نویسان سایت به اشتراک میزارم موفق و پیروز باشید
  1. نمایش فعالیت های بیشتر
×
×
  • جدید...