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

پرچمداران

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

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

    بنیـــان گذار


    • امتیاز

      74

    • تعداد ارسال ها

      203


  2. فرهاد شیری

    فرهاد شیری

    مدیران مرجع


    • امتیاز

      38

    • تعداد ارسال ها

      52


  3. بهنام صباغی

    بهنام صباغی

    مدیران مرجع


    • امتیاز

      19

    • تعداد ارسال ها

      53


  4. الهه انصاری

    • امتیاز

      12

    • تعداد ارسال ها

      9



مطالب محبوب

در حال نمایش مطالب دارای بیشترین امتیاز از زمان چهارشنبه, 23 آبان 1397 در همه بخش ها

  1. 7 امتیاز

    نگارش 5.12.0

    42 دریافت

    کیوت (به انگلیسی: Qt) مجموعه‌ای از کتابخانه‌ها و سرآیندهای نوشته‌شده به زبان سی++ است که به برنامه‌نویس امکان توسعه آسان نرم‌افزارهای کاربردی را می‌دهد. کیوت شامل چندین کلاس برای کار با واسط گرافیکی، چندرسانه، ابزارهای پایگاه‌داده، شبکه و … است. نرم‌افزارهای نوشته شده با ابزار کیوت قادرند تا با استفاده از یک کامپایلر زبان سی‌پلاس‌پلاس برای طیف وسیعی از سیستم‌عامل‌ها از جمله گنو/لینوکس (نسخه‌های رومیزی و وسیله‌های قابل حمل)، ویندوز، ویندوز CE، مک‌اواس و … همگردانی شوند. بدین ترتیب حمل نرم‌افزار نوشته شده بدون تغییر در متن کد نوشته شده امکان‌پذیر است. از کیوت در زبان‌های برنامه‌نویسی متعددی مانند سی++ و جاوا و پایتون می‌توان استفاده‌کرد. جهت مشاهده‌ی مباحث مرتبط با این کتابخانه به این بخش مراجعه کنید.

    رایگان

  2. 7 امتیاز
    آیا این واقعاً امکان‌پذیر است؟ پاسخ : بله! من می‌دانم که ممکن است این مبحث تحت سی++ بسیار پیچیده و یک کار بیهوده‌ای باشد! اما واقعیت این است که تکنیک‌های پنهان بسیاری وجود دارد که ممکن است همه از آن باخبر نباشند! من قبلاً در مورد اینکه تحت ++C وب‌سایت میشه طراحی کرد یا خیر تحقیقاتی انجام داده بودم، از لحاظ امکان بودنش جواب مثبت بود اما اینکه به راحتی طراحی تحت Php یا دیگر زبان‌های برنامه‌نویسی باشه خیر! خُب طبیعیه چون شما بسیار راحت یه اسکریپت رو می‌نویسی و روی سرور اجراش می‌کنی و سایت شما به خوبی و خوشی بالا میاد! ممکن است در همین قسمت از موضوع شما به این نتیجه رسیده باشید که خُب نیازی به ادامه‌ی بحث نداریم! وقتی کار سختیه پس منطقی نیست و شما احتمالاً دیوانه‌ای!!! واقعیت جریان این است بر خلاف آن چیزی که تصور کرده‌ایم طراحی وب‌سایت با سی‌پلاس‌پلاس نه تنها بسیار راحت است بلکه بسیار هم جذاب خواهد بود! اما در نگاه اول ممکن است یک سری محدودیت‌هارا داشته باشد که همه‌ی این موارد با کمی تعمل و بررسی قابل حل هستند به قدری که وقتی درگیر این جریان باشید شیفته‌ی آن خواهید شد. مزایای یک وب‌سایت تحت سی‌پلاس‌پلاس نسبت به دیگر زبان‌های رایج سرعت خارق‌العاده و غیر قابل مقایسه با زبان‌های رایج امنیت بهتر کد‌های شما مدیریت ساده‌تر و انعطاف‌پذیری بالا مصرف بسیار بهینه‌ و غیر قابل تصور از منابع سرور دسترسی نامحدود به کتابخانه‌ها عدم محدودیت در دسترسی به برنامه‌نویسی سطح پایین عدم محدودیت در استفاده از توابع سیستم‌عامل عدم محدودیت در مدیریت سیستم و هر ویژگی‌ دیگری که در زبان‌های اسکریپتی اگر به آن نیاز داشته باشید مجبور هستید تا به صورت اکستنشن آن را تحت سی‌پلاس‌پلاس باز نویسی کنید. سیستم راه‌انداز وب‌سرور چگونه است؟ در هر سروری CGI به شما امکان این را می‌دهد که بتوانید تحت پروتکل‌های استاندارد برنامه‌های تحت وب را اجرا کنید. شما می‌توانید تحت آن و یا موارد دیگری مانند FatCGI و WSGI و دیگر موارد بهینه شده‌ی آن برنامه‌ی تحت وب را بر روی سرور خود اجرا کنید. طراحی قالب هماهنگی با HTML, JavaScript, Css در سی‌پلاس‌پلاس چگونه خواهد بود؟ همه‌ی گزینه‌های مربوط به وب را شما بدون هیچ محدودیتی در اختیار خواهید داشت. شما هیچ محدودیتی در استفاده از ویژگی‌های HTML5 یا CSS3 و یا JavaScript و دیگر فریمورک‌ها و کتابخانه‌های کارآمدی چون Angular.JS را نخواهید داشت. بنابراین از نظر طراحی رابط یک وب‌سایت همانند دیگر زبان‌های رایج می‌توانید روی آن حساب کنید. طراحی هسته و بک‌اِند وب‌سایت چگونه خواهد بود؟ همانند زبان‌ها و فریمورک‌های رایج تحت وب شما در سی‌پلاس‌پلاس می‌توانید هسته‌ی وب‌سایت یا سیستم وب‌سایت خود را تحت استاندارد سی‌پلاس‌پلاس و هر کتابخانه‌ای که می‌پسندید و یا به آن تسلط دارید پیاده سازی کنید! به شرطی که قابلیت‌های آن کتابخانه پاسخگوی نیاز‌های شما باشد. با این حساب شما می‌توانید حتی سیستم مدیریت محتوای (CMS) خود را طراحی کنید! بله سیستم مدیریت محتوا تحت سی‌پلاس‌پلاس! کاملاً جدی هستیم قبل از هر چیز یک مزیت بسیار بزرگ در کنار مزیت‌های دیگر این است که یک CMS تحت سی‌پلاس‌پلاس می‌تواند داشته باشد مصرف بهینه از منابع سرور خواهد بود. برای مثال در یک مقایسه‌ی‌ ساده و آزمایشی نتیجه‌ی بسیار جالبی ارائه شده است. همانطور که می‌دانید Wordpress به عنوان یک سیستم مدیریت محتوای (بلاگ) شناخته شده و تحت Php توسعه‌ یافته است. نسخه‌ی سریعتر و بهینه‌تر آن با نام Ghost تحت Node.JS توسعه یافته است که ما نسخه‌ی توسعه‌ یافته‌ی آن را با یک عمل مشابه در C++1z مورد بررسی قرار داده ایم که نتایج آن بسیار جالب است! مصرف حافظه‌ سیستم مدیریت محتوای Jaguar ۳۵۰۰ درخواست در هر ثانیه 3.6 مگابایت سیستم مدیریت محتوای Ghost 100 درخواست در ثانیه 120 مگابایت پشتیبانی از پایگاه‌های داده به لطف کتابخانه‌های عظیم سی‌پلاس‌پلاس امکان مدیریت یک وب‌سایت تحت پایگاه‌های داده مختلفی ممکن است. برای مثال تحت Qt شما می‌توانید به رایجترین درایور‌های بانک‌اطلاعاتی دسترسی داشته و سیستم خود را به آن‌ها مجهز کنید. نکته: احتمالاً در برنامه‌نویسی با نود جی‌اس و پی‌اچ‌پی شناختی با کتابخانه‌های OpenSSL, Libcurl و موارد این چنینی داشته اید! کتابخانه‌های فوق عضو لیست کتابخانه‌های C و ++C هستند. بنابراین شما علاوه بر دسترسی مستقیم بر آن‌ها به هزاران و شاید میلیون‌ها کتابخانه در دنیا سی‌پلاس‌پلاس خواهید داشت. نمونه‌ی اولیه اما شوق‌آور برای اثبات امکان طراحی وب‌سایت تحت سی‌پلاس‌پلاس چندی پیش من تصمیم گرفتم تا سیستم وب‌سایتی را تحت Php7 برای یکی از استارت‌آپ‌ها طراحی و پیاده سازی کنم که در این پست به آن اشاره شده است. از آن‌جایی که به لطف کتابخانه‌ی Qt برنامه‌های سمت کاربر را توسط سی‌پلاس‌پلاس پیاده سازی کرده بودم به این فکر افتادم چرا سمت سرور و بخش وب‌سایت هم با آن هماهنگ نشود!؟ اینگونه هماهنگی بین برنامه‌ها و پرفرمنس همه‌ی آن‌ها بسیار افزایش خواهد یافت در اولین نگاه این تفکر بسیار ناشیانه و بسیار ناممکن بود! تنها روشی که به کار گرفته بودم ارسال اطلاعات از طرف کاربر به سمت سرور و مدیریت آن‌ها تحت معماری Restful Api بود که در قالب JSon آن‌ها را تجزیه و مدیریت می‌کردم. با کمی تحقیق در مورد ویژگی‌های سمت وب تحت Fast-CGI, uWSGI, DJango, ClearSilver و موارد مرتبط با آن‌ها سعی کردم تا صفحه‌ی بسیار ساده‌ای از HTML را توسط سی‌پلاس‌پلاس هندل کنم. این کار نتایج بسیار موفقیت آمیزی را در بر داشت تا نتیجه‌ی آن تبدیل به یک پروژه‌ی سیستم مدیریت محتوا تحت ++C شد. من پروژه‌ای با نام مفهومی Jaguar که نام پروژه‌ی قبلی تحت Php بود را در محیط Qt Creator با C++17 و کتابخانه‌ی Qt باز سازی کرده و هسته‌ی اولیه‌ی آن را برای اجرای چند صفحه از یک وب‌سایت، احراز حویت، بازخوانی و نمایش لیستی از خبر‌ها و مدیریت متا تگ‌ها و آدرس صفحات مربوط به هر صفحه را ایجاد کردم. سعی کرده ام در کمترین زمان ممکن برای آزمایش یک سری ویژگی‌های اولیه از یک وب‌سایت آن‌ها را مورد بررسی قرار بدم که عبارتند از هماهنگی با فریم‌ورک‌های طراحی مانند BootStrap و یا Angular.JS که خوشبختانه همه‌چیز بسیار خوب در کنار همدیگه کار می‌کنند. هسته‌ی سیستم به صورت جدا و معماری طراحی آن بر پایه‌ی MVC مورد آزمایش قرار گرفته است. در زیر تصاویری از صفحات تولید شده تحت سیستم‌ مدیریت محتوای ساخته شده با سی‌پلاس‌پلاس را مشاهده می‌کنید. همه چیز در قدم‌های اول قرار دارد و با توجه به سادگی تولید وب سایت بر خلاف تصوری که داشتیم بسیار توسعه و جای پیشرفت خواهد داشت. بخشی از نمونه کد‌های این سیستم به صورت زیر آورده شده است تا ذهنیتی برای توسعه‌دهندگان ارائه شود: تکه کُد زیر عمل ارسال اطلاعات و تمامی لینک‌های مربوط به بوت استرپ را برای سمت HTML ارائه می‌کند که در قالب استاندارد جدید C++17 آورده شده است: auto bootstrapCss = bootStrapLib.find("css"); if(bootstrapCss != bootStrapLib.end()) { c->setStash("BootstrapCss", bootstrapCss->second.c_str()); std::cout << "Found " << bootstrapCss->first << " " << bootstrapCss->second << '\n'; } کد مربوط به سمت قالب به صورت زیر خواهد بود: <!-- Bootstrap core css --> <link href="{{BootstrapCss}}" rel="stylesheet"> نتیجه‌ی فوق در صورتی که CDN بر روی لوکال تنظیم شده باشد از روی کد‌های کامپایل شده و یا استاتیک فراخوانی خواهد شد. در غیر اینصورت از روی یکی از سرور‌های CDN فراخوانی می‌شوند. نحوه‌ی ارسال متغیر از سمت سی‌پلاس‌پلاس به قالب بسیار ساده است! بسیار ساده از Php و یا Node.JS می‌باشد. با در نظر گرفتن ارسال اطلاعات از سمت سی‌پلاس‌پلاس به سمت رابط کاربری کافی است نام متغیر‌ها را در قالب خود اعمال کنید. {% for post in news %} <div class="blog-post"> <h2 class="blog-post-title"><a href="news/{{post.uri}}">{{post.title}}</a></h2> <p class="blog-post-meta">{{post.date}} by <a href="#">{{post.author}}</a></p> <p>{{post.announcement|safe}}</p> </div><!-- /.blog-post --> {% endfor %}</div> این ساختار بر پایه‌ی ساختار Angular.JS و DJango پیاده سازی شده است که به طور کامل پشتیبانی می‌شود. فعال سازی فناوری Angular.JS بر روی این سیستم جهت طراحی قالب تنها با دو دستور ساده اعمال می‌شود: <!-- Link to AngularJS --> <script src= "{{AngularJs}}"></script> <!-- Enable AngularJS Engine --> {{AngularJsSync|safe}} این دستورات در هسته‌ی سیستم مدیریت محتوا در کلاسی با نام Template پردازش و در نهایت به سمت HTML هندل می‌شوند. بخشی از دستورات سمت هسته در سی‌پلاس‌پلاس ۱۷ برای مثال ارسال عنوان صفحه به صورت زیر است: std::optional<std::string> LoadListTemplate::getTitle() const { if (isset(title)) { return title; } else { return std::nullopt; } } سمت HTML کافی است دستور فوق را در نظر بگیریم: <title>{{title}}</title> این‌ها مثال‌هایی از مراحل توسعه‌ی این سیستم است که می‌دانم آنچنان گسترده نیست، اما برای ثابت کردن طراحی و توسعه‌ی وب‌سایت تحت سی‌پلاس‌پلاس مثال‌های روشنی هستند. موفق و سربلند باشید! اطلاعیه‌های مربوط به این پروژه احتمالاً در کانال‌ها و گروه‌ تلگرامی و همین مرجع بازگو و در اختیار شما قرار بگیره.
  3. 4 امتیاز
    مقدمه نقد و بررسی‌ و ارسال نظرات کارشناسی سایت مرجع‌آی‌او استریم با هدف شناساندن هرچه بیشتر و بهتر زبان‌ها و فناوری‌های برنامه‌نویسی به مخاطب و همچنین کمک به تصمیم‌گیری در رابطه با نحوه‌‌ی تجزیه و تحلیل برنامه نویسی و کسب تجربه می‌باشد که در کنار آن علاوه بر آن، هدفِ این مرجع شناساندن متخصصین به جامعه و به کار گیری تجربیات صحیح و مطلوب به جامعه‌ی استارتاپی کشور است. توضیحات کلی در نقد و بررسی‌هایِ آی او استریم، پیش از خواندن متن سوالات و پاسخ‌ها می‌توانید به طور کاملا خلاصه با نکات مثبت و منفی موضوعات مطرح شده و همچنین نظر کلی اساتید و مراجع را در مورد آن‌ها بررسی کنید. لازم بذکر است دلیل امتیاز دهی تنها نباید مبنا بر اساس حل مشکل باشد! بنابراین امتیاز‌ها باید در زمانی ارسال شوند که از صحت پاسخ و همچنین نتیجه‌ی درست و مستند شده‌ی آن اطمینان شود. نحوه‌ی کار با سیستم امتیاز‌دهی تصویر زیر مربوط به ابزار امتیاز‌دهی است، در صورتی که پاسخ داده شده به سوال شما بر اساس مستندات، منطق و علوم مربوطه صحت داشته و دیگر اساتید آن را تایید می‌کنند می‌توانید در این صورت از ابزار مربوطه برای اعلام نظر خود استفاده کنید. در صورتی که بر اساس مستندات از قبل ثابت شده نظر بر پاسخ منفی باشد از دکمه‌ی فلِش به پایین استفاده کنید. در صورتی که پاسخ مثبت و علمی باشد از دکمه‌ی فلش رو به بالا برای امتیاز مثبت به پاسخ استفاده کنید. بدون هیچ امتیازی دارای امتیاز منفی دارای امتیاز مثبت مطالبی که دارای بیش از ۵ امتیاز می‌باشد به صورت برجسته نمایان خواهد شد. امتیاز به موضوعات، عناوین و فایل‌ها بخش امتیاز به فایل‌ها، تاپیک‌ها و موضوعات بر اساس سیستم امتیاز دهی ستاره‌ای مشخص می‌شود. این امتیاز موجب می‌گردد تا فایل یا موضوع مربوطه بر اساس درجاتی که کسب کرده است بین موضوعات مختلف در سطحی که نیاز است نمایان شوند. بدون امتیاز به موضوع دارای امتیاز به موضوع اعتبار‌ها امتیاز کل کاربر همراه با مرحله‌ای که در آن قرار دارد، نمایش می‌یابد. میانگین اعتبار از کمترین امتیاز ممکن (۲۰-) آغاز شده و به بهترین امتیاز ممکن (۲۰+) ختم می‌شود که توسط واکنش کاربران نسبت به هر یک از فعالیت‌های شما بر روی مرجع خواهد بود. برای مثال در صورتی که شما هرگونه به‌روز رسانی بر روی پست‌های خود، وضعیت خود و دیگر فعالیت‌های خود بر روی مرجع دارید، کاربران دیگر می‌توانند آن را بر اساس برداشت و حِسی که نسبت به آن عمل دارند، یکی از پنج حالت را اعمال کنند که شامل می‌باشد. واکنش به شکلک ناراحت (خنثی) هیچ امتیازی اعمال نمی‌کند. واکنش به شکلک خندان (۱+) یک امتیاز به موضوع یا مطلب شما اعمال می‌کند. واکنش به شکلک سردرگم (خنثی) هیچ امتیازی اعمال نمی‌کند. واکنش به جام (۱+) یک امتیاز اعمال می‌کند. واکنش به ستاره‌ی دنباله‌دار (۱+) یک امتیاز مثبت اعمال می‌کند. واکنش به شکلک قلب (پسندیدن ۱+) یک امتیاز مثبت را اعمال می‌کند. واکنش به قلب شکسته (۱-) یک امتیاز منفی اعمال می‌کند و آن را از امتیاز کل شما کم می‌کند. محیط رقابتی شما می‌توانید به لیستی از بهترین پرچم‌داران، بهترین کاربران و سوابق آن‌ها در مرجع دسترسی داشته باشید و برای بهتر شدن و نشان داده شدن در این لیست با یک دیگر رقابت کنید. همچنین شما می‌توانید اقدام به دنبال کردن یکدیگر و مشاهده‌ی مطالب به صورت برجسته بر اساس طرفداران خود را در اختیار داشته باشید.
  4. 4 امتیاز
    دو هفته پیش، نشست ۲۰۱۸ سی‌پلاس‌پلاس آغاز شد. شرکت کننده‌ها مدال‌های خودشان را دریافت کردند چرا که همه‌ چیز با هماهنگی بسیار خوبی به پایان رسید. این رویداد به عنوان یکی از چندین رویداد مهمC++ بشمار می‌رود که هرساله توسط حامیان و علاقه‌مندانش برگزار می‌شود. سخنان کلیدی امسال در این رویداد سه یادداشت کلیدی وجود داشت، که با حضور Andrei Alexandrescu ،Lisa Lippincott و Nicolai Josuttis ارائه شد. اولین سخنران Andrei Alexandrescu بود، او این کنفرانس را با افکار و اندیشه‌های خودش برای شروع آغاز کرد عنوان موضوع آن به بَد بودنِ کپی constexpr از static if اشاره می‌کرد. او یک سخنران سرگرم کننده است، بنابراین سخنرانی او بسیار طبیعی در مورد یادداشت‌های خودش منعکس می‌شد. همچنین او به عنوان یک توسعه‌دهنده‌ی ++C به نقاط بسیاری اشاره کرد که کمیته‌ی استاندارد سازی زبان حرف‌های او را تایید می‌کرد. سخنران دوم Lisa Lippincott روز دوم را با یک سخنرانی آغاز کرد که دیدگاه‌های مختلفی در مورد محاسبات و منطق که در آن به کار می‌رود ارائه داد. زمانی که مُجری لیزا را دعوت کرد، می‌دانست که این موضوع به عنوان یک نکته مهم برای فکر کردن است، چیزی که همه نمی‌توانند به طور مستقیم آن را درک کنند و به آن دسترسی پیدا کنند. اما این تلنگری برای نحوه‌ی درک کُد از دیدگاه ریاضی و دیدگاه جدیدی بود. سخنران سوم و آخر Nicolai Josuttis بود که در مورد، او اولین سخنران در نشست Hartmut Kaiser در سال ۲۰۱۴ بود. در آن سخنرانی بسیار خوب درخشیده، بنابراین در قسمت سوم نقص‌هایی را با جزئیات در مورد نقاط خشن ++C نشان داد. این سخنرانی بسیار صادقانه بود! چرا که بسیاری از جزئیات خشن بودن سی‌پلاس‌پلاس را عنوان کرد که همگی با آن موافق بودند. مذاکرات، مسابقه و گفتگوها‌ی چند دقیقه‌ای جلسات و رویداد‌های مرتبط با ++C همیشه گفتگو‌های بسیار خوبی دارد، و با یک مسیر مشخص که هدفش آوردن سخنرانان جدید با دیدگاه‌های جدید است برگزار می‌شود. بازخورد سخنران‌ها در این رویداد خوب بود چرا که به برخی از نکات در مورد چگونگی بهبود‌ها اشاره کردند. تصویر بالا مربوط به Hana Dusíková است که می‌توان به آن بهترین نمره را داد. بهترین سخنرانی هم مربوط به Andrei Alexandrescu بود که دنبال شد. در اولین عصر این رویداد، امتحان (Quiz) برجسته‌ترین مورد رویداد در آن روز بود. سازماندهی آن توسط Diego و اسپانسری آن توسط Conan است که برای چند سال اخیر حمایت شده است. به نظر می‌رسید که سوالات امتحانی این سال سخت‌تر از سوالات رویداد قبلی در سال گذشته بوده است. اما بار دیگر این سرگرمی ترکیب بسیار خوبی با ترس از سی‌++ را داشت. هر یک از سوالات امتحانی یک خروجی از کُد را تولید می‌کردند، که هر گروه باید برای کسب امتیاز آن را می‌نوشتند. ده نوع کُد امتحانی وجود داشت که تهیه کننده‌ی گزارش برای به تصویر کشیدن آن‌ها زیاد خوب عمل نکرده است. بنابراین تصویر زیر مربوط به سوالات چالشی در مورد سی‌پلاس‌پلاس است: گفتگو‌های کوتاه در طی جلسات سی‌پلاس‌پلاس صورت می‌گیرد. اما در سال‌های گذشته روش به گونه‌ای تغییر یافته است که سوالات پرسیده شده باید با گفتگو‌ها و سوالات دیگر رقایبت می‌کردند. با این حال این یک قالب و روش جالبی بود که نتیجه‌ی موفقیت آمیزی را داشت. همه‌ی شرکت کننده‌ها می‌توانستند این سوالات رو ببینند و در مورد آن‌ها تفکر کرده و پاسخ دهند. نکته: شما می‌توانید تصاویر ویدیویی مربوط به این رویداد را از کانال رسمی آن در یوتیوب دریافت کنید.
  5. 3 امتیاز
    سلام بر حاج قاسم با تست اول به طور طبیعی روی لینوکس و لپتاپ خودم با کامپایلر g++-8 خروجی شد : 315 ثانیه معادل 5.25 دقیقه حالا تست دوم با تنظیم کردن دو تا فلگ برای بهینه سازی فلگ های -O3 و -ffast-math نتیجه شد : 26 ثانیه بدون دست بردن توی کد تونستم با ست کردن فلگ بهینه سازی زمان رو کاهش بدم.
  6. 3 امتیاز
    با توجه به اهمیت امنیت نرم افزار، شرکت های بزرگ دنیا به ارائه راهکارهایی چون طراحی زبان ها و محیط های برنامه نویسی و مفسر و مترجم هایی با قابلیت های کنترل امنیتی بر روی سیستم عامل و بسیاری از راهکارهای دیگر پرداخته اند اما با توجه به عدم توانایی راهکارها در کنترل تمامی موارد امنیتی، عدم امکان پیاده سازی راهکارهای امنیتی بر روی برخی ساختارها، ایجاد محدودیت برای دسترسی به برخی منابع و امکانات و مشکلات کوچک و بزرگ دیگر برنامه نویسی یک برنامه به صورت ایمن بهترین راهکار برای محافظت از یک برنامه است. یکی از زبان هایی که در کنار محبوبیت در میان برنامه نویسان، همیشه یکی از زبان های پر بحث در برنامه نویسی ایمن بوده است، خانواده زبان های C به خصوص ++C است. در این زبان ها عمده مدیریت منابع به برنامه نویس واگذار شده که در صورت عدم مدیریت درست آن ها، آسیب پذیری های مختلفی رخ می دهد. بهترین راهکار برای جلوگیری از بروز آسیب پذیری نرم افزارها، برنامه نویسی پدافندی و ایمن آن نرم افزار از ابتداست. دراین مستندات، باتوجه به جامعیت و کاربرد فراوان زبان ++C درکنار محبوبیت، مباحث ونکات اساسی در برنامه نویسی پدافندی و ایمن این زبان مطرح شده و انواع آسیب پذیری و شیوه جلوگیری از بروز آن ها و رفع آن ها در صورت بروز، توضیح داده می شود. همچنین سعی می شود تا راهکارهای ارائه شده تا حد امکان قابل پیاده سازی در زبان C نیز باشند. با توجه به گستردگی ابزارهای برنامه نویسی این زبان و وجود کامپایلرهای مختلف، زبان معیاری برای این مستند مدنظر قرار گرفته شده است و ساختار ارائه شده مربوط به ابزار یا کامپایلر خاصی نیست اما بنا بر نیاز مثال هایی در کنار زبان معیار از ابزارهایی خاص نیز ارائه می گردد. رفتار تعریف نشده ممکن است شامل مختل شدن عملکرد برنامه(Crash) خروجی نامربوط و غلط، بروز آسیب پذیری های نرم افزاری و موارد دیگر می باشد. وجود رفتار نامتعارف در یک برنامه نه تنها امنیت خود آن برنامه ، بلکه ممکن است امنیت سیستم عامل، شبکه را نیز به خظر بیندازد. جلوگیری از بروز رفتارهای تعریف نشده و مقابله با آن ها از مباحث مهم برنامه نویسی تدافعی و ایمن است. توابع بدون آرگومان برای تعریف یک تابع بدون آرگومان باید از کلمه کلیدی void در زمان تعریف تابع استفاده نمایید.با این کار تزریق کد توسط هکرها را مختل می کنید. int getValue(void) { return 1; } اعداد تصادفی در صورت نیاز به اعداد تصادفی از تابع ()rand استفاده نکنید به این علت که خروجی این تابع در تکرارهای بالا دچار تکرار می شود. بهتراست از تابع ()srand استفاده کنید می توانید برای آن seed تعریف کنید تا احتمال تکرار را به حداقل برسانید. در ویندوز هم می توانید از تابع ()CryptGenRandom استفاده کنید و در لینوکس هم تابع ()random و تابع ()srandom استفاده نمایید. #include <windows.h> #include <wincrypt.h> #include <iostream> int main(void) { HCRYPTPROV hcp; CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, 0); long int li = 0; CryptGenRandom(hcp, sizeof(li), (BYTE *)&li); printf("Random number is -> %ld\n", li); return 0; } عدم استفاده از تابع بازگشتی جهت مقدار دهی اولیه به آرایه ای با کلاس حافظه استاتیک در مثال زیر زمان ساخته شدن و مقدار دهی اولیه آرایه cache تابع fact مجددا فراخوانی شده واین عمل به دلیل ایستا بودن آرایه باعث بروز رفتار تعریف نشده و خطا خواهد شد. #include <stdexcept> int fact(int i) noexcept(false) { if (i < 0) { throw std::domain_error("i must be >=0"); } static const int cache[] = { fact (0), fact(1), fact(2), fact(3), fact(4), fact (5), fact (6), fact(7), fact(8), fact(9), fact(10), fact (11), fact (12), fact(13), fact(14), fact(15), fact(16) }; if (i < (sizeof(cache) / sizeof(int))) { return cache[i]; } return i > 0 ? i * fact (i - 1) : 1; } حال برای رفع این اشکال طبق نمونه کد زیر آرایه را بدون استفاده initializer list با استفاده از یک متغیر ثابت که تعداد عضو های آرایه را معین میکند تعریف شده است و ازآنجا که کامپایلر آرایه های از جنس کلاس حافظه استاتیک را خود با عدد 0 مقداردهی میکند دیگر یک آرایه از قبل پر شده نخواهیم داشت و در مرحله با استفاده از تکنیک lazy به هر یک از عضوهای آرایه مقدار مناسب را با استفاده از تابع بازگشتی مقدار دهی خواهیم کرد. #include <stdexcept> const int arraySize = 17 int fact(int i) noexcept(false) { if (i < 0) { throw std::domain_error("i must be >=0"); } static int cache[arraySize]; if (i < (sizeof(cache) / sizeof(int))) { if (0 == cache[i]) { cache[i] = i > 0 ? i * fact(i - 1) : 1; } return cache[i]; } return i > 0 ? i * fact(i - 1) : 1; } الحاق مضاعف هدر فایل ها الحاق مضاعف زمانی رخ می دهد که یک هدر دو ویا چند بار به برنامه اضافه شوند. در مثال زیر در کلاس c هدرهای a , b الحاق می شوند در حالی که در کلاس b هم هدر a الحاق شده است که الحاق مضاعف رخ داده است. //a.h struct a { int membe }; //b.h #include "a.h" //c.c #include "a.h" #include "b.h" برای جلوگیری از این الحاق های مضاعف می توانید از روش زیر استفاده نمایید //a.h #ifdef A_H #define A_H struct a { int member; }; #endif ویا می توانید از دستور pragma استفاده کنید البته این دستور جز دستورات استاندارد ++c / c نمی باشد ولی اکثر کامپایلرها این دستور را اجرا میکنند. //a.h #pragma once struct a { int member; }; رمزنگاری اصولی جهت رمزنگاری داده های حساس در برنامه های خود می توانید از کتابخانه ++Crypto وهمچنین کتابخانه libcrypto از OpenSSL نیز استفاده نمایید. رمز نگاری به چند دسته اصلی تقسیم می شود: 1- رمزنگاری درهم سازHash که میتوان به الگوریتم های MD6 , MD5 , SHA-1,SHA-0 اشاره کرد. 2- رمزنگاری با کلید متقارن که می توان به الگوریتم های RC4 , AES , DES , 3DES اشاره کرد. 3- رمزنگاری با کلید عمومی نا متقارن که می توان به الگوریتم های RSA , DSA , DSS اشاره کرد. 4- کد گذاری دودویی به متن که می توان به الگوریتم های Base32 , Base58 , Base64 ,Base85 اشاره کرد. مدیریت مقدار و نوع داده ها و مقدار دهی اولیه در مثال زیر متغیر هایی تعریف شده اند که مقدار اولیه ندارند (البته درست است که در برخی از کامپایلرها این متغیرها را مقدار دهی خواهند کرد، ولی توجه داشته باشید که تکنیک های برنامه نویسی تدافعی جدای از امکانات کامپایلر می باشد) int main (void) { int a; float b; char c; bool d; return 0; } اکنون مشاهده میکنید که بعد از اجرای برنامه چه مقدار هایی در متغیرها ذخیره شده است. پس بنابراین مقدار دهی اولیه متغیرها یا باید برحسب نیاز در همان ابتدا تعریف صورت گیرد یا در صورت عدم نیاز به وجود مقدار اولیه خاص، مقدار دهی با استفاده از تابع همان نوع داده انجام خواهد شد. int main (void) { int a = int(); float b = float(); char c = char(); bool d = bool(); return 0; } و بعد از اجرا به این صورت خواهد بود مقدار دهی اولیه به آرایه ها int main (void) { int a[5]; float b[5]; char c[5]; bool d[5]; return 0; } که بعد از اجرا بدین صورت خواهد بود... و برای رفع این اشکال باید همیشه آرایه ها را مقدار دهی اولیه نمایید. int main (void) { int a[5] = {}; float b[5] = {}; char c[5] = {}; bool d[5] = {}; return 0; } وبعد از مقدار دهی اولیه به آرایه ها خواهیم داشت ... ادامه خواهد داشت این مقاله...
  7. 3 امتیاز
    در اندروید هنگامی که بر روی ویجت هایی مانند button اشاره می شود انیمیشنی به صورت دایره هایی به حالت transparent بر روی ویجت مورد نظر ایجاد می شود، که به این انیمیشن Ripple می گویند. حالا اگر شما از ویجت های سفارشی خودتون بخواهید استفاده کنید، دیگه انمیشن Ripple نمایش داده نمیشه! حال برای نمایش این انیمیشن بر روی ویجت شخصی شده باید مراحل زیر را انجام دهید. متریال Ripple برای ویجت هایی که خاصیت Style رو دارن می توانید استفاده کنید و البته خاصیت Background هم باید داشته باشند چون به هر حال این انیمیشن در یک ویجت که از کلاس Shape ارث بری کرده است اجرا می شود. مرحله اول تعریف یک استایل جدید در فایل Style.xml پروژه. <style name="My.Colored.Button.Blue" parent="Base.Widget.AppCompat.Button.Colored"> <item name="android:background">@drawable/my_button_colored</item> <item name="android:textAppearance">@style/My.TextAppearance</item> </style> در مرحله بعد باید یک فایل به نام my_button_colored.xml که داخل آن یک layer list تعریف کنید. <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/my_btn_default_mtrl_shape" /> </layer-list> در این مرحله باید یک فایل به نام my_btn_default_mtrl_shape.xml تعریف کنید که یک inset layer تعریف شده باشد و در داخل inset layer یکی از المانها ripple می باشد که می توان به شکل زیر تعریف کرد. نکته 1 : برای نمایش انیمیشن Ripple به صورت دایره باید نوع آیتم shape حتما rectangle باشد. و در صورتی که برای کنترلهایی می خواهید نمایش دهید که حالت دایره مناسب نمایش نیست می توانید نوع shape را تغییر بدید. نکته2 : برای تنظیم رنگ دلخواه خودتون می تونید خاصیت android:color را تغییر بدید. <?xml version="1.0" encoding="utf-8"?> <inset xmlns:android="http://schemas.android.com/apk/res/android" > <ripple android:color="@color/black_btn_ripple_blue" > <item> <shape android:shape="rectangle"> <corners android:radius="@dimen/my_abc_control_corner_material" /> <solid android:color="@color/btn_shape_with_ripple_back_blue" /> </shape> </item> </ripple> </inset> و به روش زیر هم می تونید در زمان استفاده از کنترل خودتون تو لایه اصلی نمایش از این انیمیشن استفاده کنید. و کافی خاصیت style را مقدار دهی کنید فقط توجه داشته باشید که نباید از خاصیت android:style استفاده کنید. <Button android:id="@+id/btn_login" style="@style/My.Colored.Button.Blue" android:layout_width="0dp" android:layout_height="50dp" android:layout_gravity="center" android:layout_marginRight="15dp" android:layout_weight="1" android:text="@string/login_btn_desc" android:textColor="@color/white" android:textSize="15sp"/>
  8. 3 امتیاز
    برای استفاده از کتابخانه های اندروید در پلتفرم Qt باید در محیط Qt Creator تنظیمات راه اندازی اندروید وجاوا را طبق دستورالعمل های زیر انجام دهید. 1- بعد از نصب و راه اندازی Qt ، وارد منوی Tools -> Options شوید و از تب های سمت چپ بخش تنظیمات گزینه Devices را انتخاب نمایید. 2- از تب های بالای فرم Devices گزینه Android را انتخاب نمایید. 3- طبق مراحل در تصویر ابتدا باید مسیرهای خواسته شده را انتخاب نمایید. البته قبلا باید نسخه مناسب JDK , JRE را از سایت اوراکل دریافت نمایید.(توجه داشته باشید که اندروید گوگل تا نسخه SDK 24 از جاوای 8 پشتیبانی نمیکند) وهمچنین باید SDK های لازم برای اندروید و همچنین کتابخانه CMake اندروید و LLDB و ایملاتورهای مناسب برای اندروید را دانلود کرده باشید 4- در مرحله بعد از تب های سمت چپ گزینه Build & Run را انخاب نمایید(باید Kit اندروید و نوع کامپایلر را به درستی نمایش داده باشد! و خطایی نداشته باشد)(طبق تصویر) 5- در این مرحله از تب های منوی اصلی محیط توسعه کیوت گزینه CMake را انتخاب نمایید. 6- باید آخرین نسخه کتابخانه CMake مختص به اندروید را ازسایت گوگل بخش اندروید دریافت کنید. وبعد گزینه new را انتخاب نمایید و طبق تصویر یک نام و همچنین مسیر CMake را انتخاب نمایید. 7- در این مرحله باید یک پروژه جدید ایجاد نمایید. 8- بعد از ساختن پروژه از گزینه های سمت چپ در محیط توسعه کیوت گزینه Project را انتخاب نمایید. 9- از لیست Kit های فعال خود Android را انتخاب نمایید. 10- از قسمت Build Android APK گزینه SDK که می خواهید برنامه کامپایل شود انتخاب نمایید(Target SDK) 11- و در آخر هم گزینه Create Template را انتخاب نمایید تا فولدرهای اندرویدی و فایل های پیکر بندی اندروید به پروژه شما اضافه شود. 12- در این مرحله از تب های سمت راست در محیط توسعه کیوت گزینه Edit را انتخاب نمایید اگر همه مراحل درست بوده باشد می توانید برنامه را کامپایل و اجرا نمایید. نکته : برای بار اول حتما باید به اینترنت متصل باشید با سرعت مناسب به همراه وی پی ان چون باید گریدل به پروژه شما اضافه شود و بعد از آن مطمئنا برنامه شما اجرا خواهد شد . و اینکه طبق توضیح تصویر باید از گرینه های پایین سمت چپ در محیط توسعه کیوت گزینه خروجی دیباگ رو انتخاب کنید و بر روی اندروید قرار دهید. موفق باشید
  9. 2 امتیاز
    ساختار شکست کار (Work Breakdown Structure, WBS) یک پروژه‌ی کلیدی قابل ارائه است که کار گروه را به بخش‌های مدیریتی سازماندهی می‌کند. پیکره‌ی دانش مدیریت پژوه (Project Management Body of Knowledge، PMBoK) ساختار شکست کار را به عنوان «تجزیه‌ی سلسله مراتبی تحویل محتوای کار انجام شده توسط تیم پروژه» تعریف می‌کند. ساختار شکست کار به صورت بصری دامنه‌ی کار را به دسته‌های مدیریتی تقسیم می‌کند که یک تیم پروژه می‌تواند درک کند، به طوری که هر سطح از این ساختار تعریف و جزئیات بیشتری را برای ما فراهم می‌کند. شکل زیر یک ساختار تجزیه و تحلیل کار را با سه سطح تعریف می‌کند. ساختار شکست کار یک راه آسان برای درک نحوه‌ی عملکرد یک WBS به عنوان یک نقشه یا طرح خاص از پروژه است. در شروع کار WBS‌ پروژه را یک انتزاع سطح بالای قابل ارائه در نظر می‌گیرد و در ادامه با استفاده از سلسله مراتب کلی زیر به زیر مجموعه‌هایی تجزیه می‌شود. ساختار شکست کار قابل ارائه تیم پروژه، WBS‌ را با مشخص کردن عملکرد‌های قابل اجرای اصلی، تقسیم آن‌ها به سیستم‌های کوچک‌تر و زیر مجموعه‌ها ایجاد می‌کند. این فرآورده‌های فرعی تا زمانی که یک فرد بتواند به آن‌ها اختصاص یابد، بیشتر تجزیه می‌شوند. در این سطح، بسته‌های کاری (work packages) خاص مورد نیاز برای تولید زیر مجموعه‌های قابل اجرا، شناسایی و دسته بندی می‌گردند. بسته‌ی کاری نشان دهنده‌ی لیستی از وظایف برای تولید واحد خاصی از کار است. اگر یک زمان بندی دقیق از پروژه را مد نظر داشته باشید، می‌توانید وظایف مربوط به یک بسته‌ی کاری را به عنوان تکالیفی که افراد تیم باید در زمان خاص و با سطح تلاش مشخص به پایان برسانند، شناسایی کنید. از دیدگاه هزینه، این بسته‌های کاری معمولا گروه بندی شده و برای تولید نتیجه ی مورد نظر به بخش خاصی اختصاص داده شده می‌شوند. این بخش‌ها یا حساب‌های هزینه‌ای (cost accounts)، در یک ساختار شکست سازمانی تعریف می‌شوند و بودجه‌ای جهت تولید فرآورده‌های فرعی به آن‌ها اختصاص می‌یابد. با ادغام حساب‌های هزینه‌ای از ساختار شکست سازمانی و ساختار شکست پروژه، کل سازمان می‌تواند پیشرفت‌های مالی را علاوه‌ بر عملکرد پروژه دنبال کند. چرا از ساختار شکست کار (WBS) استفاده کنیم؟ ساختار شکست کار علاوه بر تعریف و سازماندهی پروژه، مزایای متعددی دارد. بودجه‌ی پروژه می‌تواند به سطوح بالای ساختار شکست کار اختصاص داده شود و بودجه‌های بخش‌ها می‌توانند به سرعت بر مبنای WBS هر پروژه محاسبه شوند. با تخصیص برآورد هزینه‌ی زمان و هزینه برای بخش‌های خاصی از WBS، برنامه و بودجه‌ی پروژه می‌تواند به سرعت توسعه یافته و پیش روی کند. به محض اجرای پروژه، بخش‌های مختلف این ساختار می‌توانند جهت شناسایی عملکرد هزینه‌های پروژه و مسائل و مشکلات حول سازمان‌ها ردیابی شوند. برای کسب اطلاعات بیشتر در مورد تخصیص زمان، قانون ۱۰۰٪ را ببینید. همچنین یک WBS میتواند برای شناسایی خطرات بالقوه در یک پروژه‌ مورد استفاده قرار گیرد. اگر ساختار WBS دارای شاخه‌ای است که به خوبی تعریف نشده، آن را یک ریسک تعریف دامنه در نظر می‌گیریم. این خطرات باید در گزارش پروژه ردیابی شده و به هنگام اجرای پروژه دنبال شوند. با ادغام WBS و ساختار شکست سازمانی، مدیر پروژه میتواند نقاط ارتباطی را شناسایی کرده و یک طرح ارتباطی را در سراسر سازمان پروژه بسازد. هنگامی که یک پروژه در حال سقوط است، ارجاع به WBS به سرعت نتایج عمده‌ای را که تحت تاثیر بسته‌ی کاری شکست خورده هستند و یا به تازگی تحویل داده شده اند، شناسایی می‌کند. WBS همچنین این امکان را برای ما فراهم می‌کند تا وضعیت زیر مجموعه‌های قابل ارائه را به صورت رنگی کد گذاری و مشخص کنیم. اختصاص دادن رنگ قرمز به «دیر شدن»، زرد به «در معرض خطر»، سبز برای «هدف» و آبی برای «نتایج تکمیل شده» می‌تواند یک راه موثر برای ایجاد نقشه‌ی حرارتی (heat-map) پیشرفت پروژه باشد و توجه مدیریت را به بخش‌های کلیدی ساختار شکست کار جلب کند. دستورالعملهای ساختار شکست کار دستورالعمل‌های زیر باید هنگام ایجاد یک WBS در نظر گرفته شوند: سطح بالا نشان دهنده‌ی محصول قابل ارائه‌ی نهایی یا همان پروژه است. زیر مجموعه‌های قابل ارائه (sub-deliverables) شامل بسته‌های کاری است که به بخش یا واحدی از سازمان اختصاص یافته است. نیاز نیست که تمام عناصر WBS نسبت به همان سطح تعریف شوند. یک بسته‌ی کاری، خود کار، مدت زمان و هزینه‌های مربوط به وظایف مورد نیاز برای تولید زیر مجموعه‌ها را تعریف می‌کند. مدت زمان انجام هر بسته‌ی کاری نباید بیش از 10 روز طول بکشد. بسته‌های کاری باید مستقل از بسته‌های کاری دیگر در ساختار شکست کار باشند. بسته‌های کاری منحصر به فرد هستند و نباید در طول WBS تکرار شوند. ابزار مورد نیاز برای ایجاد یک WBS ایجاد WBS، یک تلاش تیمی است که تصویری از ورودی‌ها و چشم اندازی چندگانه از پروژه‌ی هدف را برای گروه فراهم می‌کند. یک روش موثر این است که جلسه‌ی طوفان مغزی با سازمانهای مختلفی که با این پروژه درگیر هستند، ترتیب داد. تیم پروژه می‌تواند از ابزارهای ساده (low-technology tools) مانند یک تخته سفید، کارت‌های یادداشت چسبی برای شناسایی نتایج عمده، زیر مجموعه‌ها و بسته‌های کاری خاص استفاده کند. این کارت‌ها را می‌توان به دیوار چسباند و مجددا سازماندهی کرد زیرا تیم همواره در مورد نتایج اصلی و بسته‌های کاری درگیر در پروژه بحث می‌کند. رویکرد low-technology، بسیار آسان است اگرچه در تیم‌های توزیع شده عملکرد خیلی خوبی ندارد. چندین ابزار وجود دارد که از نقشه برداری ذهنی، طوفان مغزی و WBS‌پشتیبانی می‌کند. MatchWare MindView یک بسته‌ی نرم افزاری ساده برای استفاده از ذهن است که از ساختار WBS، طرح‌های پروژه، نمودارهای گانت پشتیبانی می‌کند و به راحتی با پروژه‌های مایکروسافت برای توصیف بیشتر ساز و کار پروژه سازگار است. شکل زیر یک مثال از WBS را به کمک ابزار MAtchWare MindView نشان می‌دهد. نمایش یک WBS با کمک MIndView مزیت کلیدی MatchWare MindView، تفسیر راحت WBS به زمان بندی و برنامه‌ی سطح بالای پروژه است. فرمت طبیعی ساختار شکست کار، برنامه‌ی زمانی پروژه است. مدیر پروژه به راحتی می‌تواند برآوردهای بودجه و مدت زمان تعیین شده را در یک ابزار نقشه برداری ذهنی به کار بندد. این برآورد بودجه و مدت زمان می‌تواند به راحتی به اکسل مایکروسافت و یا پروژه‌ی مایکروسافت برای برنامه ریزی و تجزیه و تحلیل اضافی منتقل شود. مدیران پروژه به دنبال ابزارهایی هستند که به کارشان سرعت بخشند و به کاهش میزان بار اجرایی که همراه با فرآیندهای مدیریتی پروژه است، کمک کنند.
  10. 2 امتیاز
    فرق بین کامپایل استاتیک و داینامیک قبل از اینکه فرق بین ایستا (استاتیک) - Static و پویا (داینامیک) - Dynamic را بدانیم لازم است در رابطه با چرخه زندگی نوشتن یک برنامه و اجرای آن آشنا شویم. هر برنامه برای اولین بار توسط یک محیط توسعه (Editor) یا IDE توسط برنامه نویسان انتخاب و به صورت فایل متنی قابل ویرایش می‌باشد. سپس فایل متنی که شامل کد های نوشته شده توسط برنامه نویس تحت زبان برنامه نویسی مانند C، C++ و غیره... می‌باشد توسط کامپایلر به کد شیء ای تبدیل می‌شود که ماشین بتواند آن را درک کرده و اجرا کند. برنامه ای که ما می‌نویسیم ممکن است به عنوان یک مورد توسط دیگر برنامه ها یا کتابخانه‌هایی از برنامه ها مورد استفاده قرار بگیرد برقراری ارتباط (پیوند کردن) یا همان لینک کردن پروسه‌ای است که برا اجرای موفقیت آمیز برنامه‌های نوشته شده ما بکار می‌رود برقراری ارتباط بین ایستا و پویا دو پروسه‌ای از جمع آوری و ترکیب فایل های شیء‌های مختلفی است که به منظور ایجاد یک فایل اجرایی می‌باشند. در این بخش ما تصمیم بر این داریم تا تفاوت بین آن ها را با جزئیات مورد بررسی قرار دهیم. عمل پیوند یا ترکیب در زمان کامپایل انجام شود، در واقع زمانی که کد منبع به زبان ماشین ترجمه می‌شود، در زمان بار گذاری، زمانی که برنامه در داخله حافظه بار گذاری می شود، و حتی زمان اجرای آن توسط برنامه صورت می گیرد این عمل زمان پیوند و یا ترکیب (اتصال) است. در نهایت این فرآیند توسط برنامه ای اجرا می شود که به آن لینکر - پیوند دهنده (ترکیب کننده) می‌گویند. اتصال دهنده ها به عنوان ویرایستار لینک نیز معرفی می‌شوند. لینک شدن (پیوند شدن) به آخرین مرحله از کامپایل می‌گویند. در زبان علمی اصطلاح لینکر یا Linker معروف است اما در زبان فارسی بهترین گزینه مربوطه را می‌توان با عنوان اتصال دهنده، پیوند دهنده، ترکیب کننده نام برد. همه آن ها نشانگر یک هدف به منظور ترکیب اشیاء با یکدیگر هستند که در مرحله کامپایل صورت می‌گیرد. پس از ایجاد پیوند در برنامه، برای اجرای آن برنامه باید داخل حافظه منتقل شود. در انجام این کار باید آدرس هایی برای اجرای داده ها و دستور العمل ها اختصاص یابد. به طور خلاصه روند زیر می‌تواند به عنوان چرخه زندگی یک برنامه خلاصه شود (نوشتن - لینک کردن - بارگذاری - اجرا) فرق بین کامپایل استاتیک و داینامیک در زیر تفاوت های عمده ارتباط بین استاتیک و داینامیک آورده شده است : استاتیک ارتباط به روش استاتیک فرآیندی است که تمامی ماژول ها و کتابخانه‌های برنامه در فایل اجرایی نهایی کپی می‌شوند. این روش توسط لینکر در مرحله آخر کامپایل انجام می‌شود. اتصال دهنده - لینکر طبق روال ترکیبی کتابخانه ها را با کد برنامه و همراه مراجع - منابع خارجی ترکیب کرده و برای تولید یک بارگذاری مناسب در حافظه آماده سازی می‌کند. زمانی که برنامه بار‌گذاری می‌شود، سیستم عامل محلی را در حافظه به صورت یک فایل اجرایی که شامل کد‌های اجرایی و داده ها می‌باشد مشخص می‌کند. ارتباط به شیوه‌ی استاتیک توسط برنامه‌ای با نام لینکر انجام می‌شود که در آخرین مرحله فرآیند کامپایل یک برنامه صورت می‌گیرد. لینکر‌ها نیز به عنوان ویرایشگر پیوند نیز عنوان می‌شوند. فایل های استاتیک به طور قابل توجهی دارای اندازه بسیار بزرگی هستند زیرا برنامه های خارجی و کتابخانه های لینک شده همه در یکجا و در فایل نهایی اجرایی جمع آوری شده‌اند. در اتصال استاتیک اگر هر یک از برنامه های خارجی تغییر کرده باشد باید آن ها دوباره کامپایل شوند و مجددا عمل اتصال صورت گیرد در غیر اینصورت هیچ تغییری در به روز رسانی های مرتبط با فایل اجرایی مشاهده نخواهد شد. برنامه‌های استاتیکی زمان بارگذاری ثابتی در هر بار اجرای برنامه در حافظه را در نظر می‌گیرند. و زمانی که برای بارگذاری طول می کشد ثابت است. برنامه‌هایی که از کتابخانه‌های استاتیکی استفاده می‌کنند معمولاً سریعتر از برنامه‌هایی هستند که کتابخانه‌‌ی آن‌ها به صورت پویا می‌باشد. در برنامه های استاتیکی، تمامی کد ها شامل یک فایل اجرایی می‌باشند. بنابراین، آن‌ها هرگز در برنامه هایی که دارای مشکلاتی هستند اجرا نخواهند شد. داینامیک در ارتباط پویا نام کتابخانه های خارجی (کتابخانه‌های به اشتراک گذاری شده) در فایل اجرایی نهایی قرار داده شده‌اند نه خود کتابخانه. در حالی که ارتباط واقعی در زمان اجرا در هر دو فایل در حافظه قرار می‌گیرند. اتصال پویا این اجازه را می‌دهند تا برنامه های متعددی به صورت یک ماژول کپی شده و قابل اجرا مورد استفاده قرار بگیرد. اتصال پویا بر خلاف اتصال استاتیک در زمان اجرا توسط سیستم عامل انجام می‌شود. در اتصال پویا فقط یک نسخه از کتابخانه به اشتراک گذاری شده در حافظه نگه‌داری می‌شود. این به طور قابل توجهی اندازه برنامه های اجرایی را کاهش می‌دهد، در نتیجه صرفحه جویی در حافظه و فضای دیسک صورت خواهد گرفت. در اتصال پویا بر خلاف اتصال استاتیک نیازی به کامپایل کامل پروژه نمی‌باشد در صورتی که لازم باشد تغییراتی در هر یک از فایل‌ها صورت بگیرد تنها کافی است آن را کامپایل و در کنار برنامه قرار دهید. این یکی از بزرگترین مزیت‌های کامپایل داینامیکی می‌باشد. در اتصال پویا زمان بارگذاری برنامه در حافظه ممکن است کاهش یابد. این در صورتی است که کتابخانه های مشترک در حافظه بارگذاری شده‌اند. برنامه‌هایی که از کتابخانه های مشترک استفاده می‌کنند معمولا کندتر از برنامه هایی هستند که از کتابخانه های استاتیکی استفاده می‌کنند. برنامه‌های پویا وابسته به داشتن کتابخانه‌های سازگار هستند. اگر کتابخانه تغییر یابد (برای مثال، یک کامپایلر جدید منتشر شود ممکن است کتابخانه را تغییر دهد)، در این صورت ممکن است برنامه مجدداً تحت کتابخانه جدید باز نویسی و به‌روز رسانی شوند. اگر کتابخانه از روی سیستم حذف شود، برنامه‌ای که وابسته آن کتابخانه می‌باشد دیگر کار نخواهد کرد. در ادامه شما می‌توانید در مورد مراحل کامپایل یک برنامه مراجعه کنید:
  11. 2 امتیاز
    در حال حاضر يادگيري الکترونيکي مفهومي مهم در آموزش عالي است و دانشگاه هاي متنوعي ايجاد شده که نياز جهاني به آموزش را نمايانگر می‌کند. با يادگيري الکترونيکي امكان «يادگيري بدون محدوديت زماني و مکانی و صرف هزينه» متناسب با نيازهاي بشر فراهم مي‌شود. در زیر به معرفی چند سایت ازشمند جهانی می‌پردازیم: سايت ايراني Motamem : محلي براي توسعه دانش و مهارت هاي فردي :‌ www.motamem.org سايت Lynda: وب سايتي که بيش از 4 ميليون نفر در آن مشغول گذارندن دوره هاي آموزشي هستند : www.lynda.com سايت Creative Live: با کلاس هاي رايگان آنلاين خلاقيت را در خود پرورش دهيد : www.creativelive.com سايت Mind Tools : محلي براي يادگيري مهارت هاي مديريتي : www.mindtools.com سايت Codecademy: در اين مدرسه آنلاين مي توانيد کار با java ، Python ، PHP و... را ياد بگيريد : www.codecademy.com سايت edX: وب سايتي شامل دوره هاي آنلاين برنامه نويسي : www.edx.org سايت Platzi: با آموزش هاي اين وب سايت در بازاريابي، کدنويسي،توسعه اپليکيشن و طراحي حرفه اي شويد : www.platzi.com سايت Guides.co: منبعي کامل از نکته ها و توصيه ها در مورد هر موضوعي که فکرش را بکنيد : www.guides.co سايت Udacity: در دوره هاي رايگان آنلاين و با تدريس سباستين تران، کدنويسي را بياموزيد : www.udacity.com سايت Zidbits: محلي براي دسترسي به مقالات جالب و اخبار و حقايق عجيب : www.zidbits.com سايت TED Ed:مجموعه اي از آموزش هاي ارزشمند در موضوعات متنوع : www.ed.ted.com سايت iTunes U: دانشگاه هاي برتري مانند هاروارد و يل پادکست هاي کلاس هاي خود را در اينجا به اشتراک ميگذارند : www.apple.com/education سايت MIT open courseware: براي يادگيري مقدمات کدنويسي با دانشگاه MIT همراه شويد : ocw.mit.edu سايت WonderHowTo: اين سايت هر روز ويديوهاي جديدي براي يادگيري نحوه انجام کارهاي مختلف منتشر ميکند : www.wonderhowto.com سايت One Month: در مدت يک ماه يک مهارت جديد بياموزيد : www.onemonth.com سايت Duolingo: سايت آموزش زبان کاملا رايگان : www.duolingo.com سايت Squareknot: خلاقيت هم قابل يادگيري است : www.squareknot.com سايت Spreeder: تندخواني را در اين سايت بياموزيد : www.spreeder.com سايت Memrise: دانش لغات خود را بيشتر کنيد : www.memrise.com سايت HTML5Rocks: حرفه اي هاي گوگل آخرين به روزرساني ها، راهنمايي منابع و ساير اطلاعات مربوط به HTML5 را با شما به اشتراک ميگذارند : www.html5rocks.com سايت Wikipedia'Daily Article List: مقالات ويکيپديا را روزانه در ايميل خود دريافت کنيد : lists.wikimedia.org سايت DataMokey: در اين سايت SQL و Excel را بياموزيد : www.datamonkey.org سايت Saylor Academy: با دوره هاي آنلاين اين سايت ارايه مطلب و سخنراني را بياموزيد : www.saylor.org سايت Learni.st: دوره هاي حرفه اي با محتواي ويژه از عکاسي تا وبلاگ نويسي : www.crunchbase.com/organization/learnist سايت Academic Earth: دوره هاي پيشرفته دانشگاهي از سال 2009 تا کنون در اين سايت در دسترس هستند : academicearth.org
  12. 2 امتیاز
    تکنولوژی REST (REpresentational State Transfer)، یک سبک معماری برای توسعه‌ی وب سرویس‌ها است. معماری REST به دلیل سادگی و استواری بر پایه سیستم‌های موجود و ویژگی‌های HTTP به منظور دستیابی به اهداف آن، بر خلاف ایجاد استانداردها، چارچوب‌ها و فناوری‌های جدید، محبوب است. مزایای معماری REST یکی از مزیت‌های اصلی استفاده از این معماری، هم از جنبه‌ی سرویس گیرنده و هم از جنبه‌ی سرور، تعاملات مبتنی بر REST است که برای هر فردی که با پروتکل HTTP آشنایی دارد، بسیار ساده است. برای مثال، تعاملات مبتنی بر REST وضعیت خود را با استفاده از کدهای وضعیت HTTP استاندارد اعلام می‌کنند. بنابراین، 404 به معنای «منبع درخواست شده یافت نشد»، کد 401 به معنای «درخواست مجاز نیست»، کد 200 به این معنی است که «همه چیز خوب است» و کد 500 بدان معنی است که «یک خطای نرم افزار غیر قابل برگشت در سرور وجود دارد». به طور مشابه اعمالی مانند رمزنگاری و یکپارچگی انتقال داده بدون اضافه کردن چارچوب یا تکنولوژی خاصی و صرفا با رمز نگاری SSL و TLS پیاده سازی می‌شوند. معماری REST همچنین یک معماری مستقل از زبان است. برنامه‌های مبتنی بر REST می‌توانند به کمک هر زبانی از جمله Java، Kotlin، AngularJS و یا JavaScript نوشته شوند. تا زمانی که یک زبان برنامه نویسی می‌تواند درخواست‌های مبتنی بر وب را با استفاده از HTTP انجام دهد، این زبان قادر خواهد بود که برای فراخوانی RESTful API یا وب سرویس استفاده شود. به طور مشابه، وب سرویس‌های RESTful می‌توانند با استفاده از هر زبانی نوشته شوند، بنابراین توسعه دهندگان با اجرای آن‌ها می‌توانند تکنولوژی‌هایی را انتخاب کنند که بهترین کارایی را در شرایط موجود داشته باشند. مزیت دیگر استفاده از این معماری، فراگیر بودن آن است. در سمت سرور، انواع چارچوب‌های مبتنی بر REST از جمله RESTlet و Apache CXF وجود دارد که به توسعه دهندگان برای ایجاد وب سرویس‌های RESTful کمک می‌کنند. در سمت سرویس گیرنده، تمام چارچوب‌های جدید جاوا اسکریپت، مانند JQuery، Node.js، Angular و EmberJS، همه‌ی کتابخانه‌های استاندارد در API های خود ساخته شده‌اند که وب سرویس‌های RESTful را فراخوانی کرده و از داده‌های XML یا JSON استفاده می‌کنند. معایب معماری REST مزایای استفاده از REST با استفاده از ساختارهای HTTP همچنین محدودیت‌هایی را ایجاد می‌کند. بسیاری از محدودیت‌های HTTP نیز به نقص سبک معماری REST تبدیل می‌شوند. به عنوان مثال، HTTP اطلاعات مبتنی بر وضعیت را بین چرخه‌های درخواست - پاسخ ذخیره نمی‌کند، که بدین معنی است که برنامه‌های مبتنی بر REST باید بی‌ثمر باشند و تمام وظایف مدیریت وضعیت باید توسط خود سرویس گیرنده انجام شوند. به طور مشابه، از آن جا که HTTP هیچ مکانیزمی برای ارسال اعلان‌ها از سرور به سرویس گیرنده ندارد، پیاده سازی هر نوع سرویسی که سرور، کلاینت را بدون رای‌ گیری از جانب آن (client-side polling) و یا انواع مختلف قلاب وب (web hook) به روز رسانی کند سخت است. از دیدگاه پیاده سازی، یک مشکل رایج با REST این واقعیت است که توسعه دهندگان با معنای دقیق REST-based مخالفت می‌کنند. برخی از توسعه دهندگان نرم افزار به اشتباه هر چیزی را که مبتنی بر SOAP نیست، RESTful در نظر می‌گیرند. چیزی که سبب این تصور غلط رایج می‌شود این واقعیت است که REST یک سبک معماری است، بنابراین هیچ پیاده سازی مرجع یا استاندارد قطعی وجود ندارد که تأیید کند آیا یک طراحی خاص، RESTful است یا خیر. در نتیجه، بر سر اینکه آیا یک API داده شده مطابق با اصول مبتنی بر REST است یا خیر بحث وجود دارد. جایگزین‌هایی برای REST فناوری‌های جایگزین برای ایجاد سیستم‌های مبتنی بر SOA (معماری مبتنی بر سرویس، Service-oriented architecture) و یا ایجاد API برای فراخوانی سرویس‌های میکرو از راه دور شامل XML روی HTTP (معروف به XML-RPC)، همچنین CORBA و پروتکل SOAP (پروتکل دسترسی ساده به object) است. هر تکنولوژی مجموعه‌ای از مزایا و معایب خود را دارد، اما ویژگی مهیج REST که آن را شاخص می‌کند، این است که به جای اینکه از یک توسعه دهنده بخواهد با مجموعه‌ای از پروتکل‌های سفارشی کار کند یا یک فرمت داده‌ی خاص برای تبادل پیام بین یک سرویس دهنده و یک سرور داشته باشد، REST باور دارد که بهترین راه برای پیاده سازی یک سرویس وب مبتنی بر شبکه این است که به راحتی از ساختار اصلی پروتکل شبکه‌ی خود استفاده کند که در مورد اینترنت، HTTP است. این یک نکته مهم است، زیرا REST فقط برای اعمال به اینترنت در نظر گرفته نشده است؛ بلکه هدف آن است که اصول آن به تمام پروتکل‌ها از جمله WEBDAV، FTP و غیره اعمال شود. REST در مقابل SOAP دو سبک رقیب برای اجرای خدمات وب REST و SOAP است. تفاوت اساسی بین این دو، رویکرد فلسفی است که باید به فراخوانی از راه دور بپردازند. REST یک رویکرد مبتنی بر منابع را برای تعاملات مبتنی بر وب اتخاذ می‌کند. با REST، شما یک منبع را بر روی سرور قرار می‌دهید و انتخاب می‌کنید که این منبع را به روزرسانی کنید، پاک کنید یا اطلاعاتی را در مورد آن دریافت کنید. در SOAP، کلاینت تصمیم نمی‌گیرد به طور مستقیم با یک منبع ارتباط برقرار کند، بلکه به جای آن یک سرویس را فراخوانی می‌کند و این سرویس دسترسی به اشیا و منابع مختلف پشت صحنه را کاهش میدهد. SOAP همچنین تعداد زیادی از چارچوبها و APIها را در بالای لایه‌ی پروتکل HTTP را ایجاد کرده است، از جمله زبان توصیف سرویس وب (Web Services Description Language, WSDL)، که ساختار داده‌هایی را که بین کلاینت و سرور رد و بدل می‌شوند، تعریف می‌کند. گاهی بهترین نتیجه با تعریف دقیق فرمت پیام حاصل می‌شود و یا میتوان از APIهای مرتبط با SOAP مانند WS-Eventing، WS-Notification و WS-Security بهره برد. در بعضی مواقع شرایطی پیش می‌آید که HTTP نمی‌تواند سطح کارایی را که یک برنامه ممکن است نیاز داشته باشد، فراهم کند. در این موارد، استفاده از SOAP ترجیح داده میشود. REST URIها و URLها اکثر مردم با شیوه‌ی عملکرد URLها (Uniform Resource Locator) و URIها (Uniform Resource Identifier) در وب آشنا هستند. رویکرد RESTful برای برنامههای کاربردی ادعا میکند که درخواست اطلاعات در مورد یک منبع باید به اندازه‌ی فراخوانی URL آن ساده باشد. به عنوان مثال، اگر یک کلاینت بخواهد یک سرویس وب را که تمام آزمونها را در TechTarget در دسترس قرار داده است، به URL مراجعه کند. URLای که به سرویس وب خواهد رسید بدین ترتیب است: www.techtarget.com/restfulapi/quizzes هنگام فراخوانی، سرویس وب ممکن است با رشته JSON زیر، لیست تمام آزمون‌های موجود را پاسخ دهد که یکی از آن‌ها درباره‌ی DevOps است: { "quizzes" : [ "Java", "DevOps", "IoT"] } برای دریافت آزمون DevOps، سرویس وب ممکن است با استفاده از URL زیر فراخوانی شود: www.techtarget.com/restfulapi/quizzes/DevOps با فراخوانی این URL یک رشته‌ی JSON که لیستی از سوالات در آزمون DevOps را فهرست کرده است، بازگردانده می‌شود. برای دریافت یک سوال مشخص از آزمون، شماره‌ی سوال به URL اضافه خواهد شد. بنابراین، برای دریافت سوال سوم در آزمون، URL RESTful زیر استفاده میشود: www.techtarget.com/restfulapi/quizzes/DevOps/3 فراخوانی این URL ممکن است یک رشته‌ی JSON مانند زیر را برگرداند: { "Question" : {"query":"What is your DevOps role?", "optionA":"Dev", "optionB":"Ops"} } همان طور که می‌بینید، URLهای REST در این مثال به گونهای منطقی و معنی دار هستند که منابع دقیق درخواست شده را مشخص میکنند. فرمتهای داده‌ی JSON و XML REST مثال بالا نشان میدهد JSON به عنوان فرمت تبادل اطلاعات برای تعامل RESTful استفاده می‌شود. رایج ترین فرمت تبادل دادهها JSON و XML هستند و بسیاری از خدمات وب RESTful میتوانند تا زمانی که کلاینت بتواند تعامل را در XML یا JSON انجام دهد، از هر دو فرمت به طور متناوب استفاده کنند. توجه داشته باشید با وجود اینکه JSON و XML فرمتهای رایج تبادل داده هستند، خود REST هیچگونه محدودیتی در مورد آنچه که فرمت باید باشد قرار نمیدهد. در واقع، برخی از خدمات وب RESTful به منظور بهره وری، دادههای باینری را مبادله می‌کنند. این یکی دیگر از مزایای کار با خدمات وب مبتنی بر REST است، زیرا معمار نرم افزار از نظر نحوه‌ی اجرای بهترین خدمات، از آزادی زیادی برخوردار است. REST و رویه‌های HTTP مثال بالا فقط دسترسی به داده‌ها را بررسی می‌کند. عملیات پیش فرض HTTP، رویه‌ی GET است که در هنگام دریافت داده‌ها از سرور مورد استفاده قرار می‌گیرد. با این حال، HTTP تعدادی از رویه‌های دیگر از جمله PUT، POST و DELETE را تعریف میکند.REST ادعا می‌کند که برای حذف داده‌ای در سرور، به سادگی از URL برای دسترسی به منبع استفاده کنید و روش DELETE از HTTP را اعمال کنید. برای ذخیره‌ی داده‌ها در سرور، یک URL و رویه‌ی PUT استفاده میشود. همچنین برای عملیاتی که فراتر از ذخیره سازی، خواندن و یا حذف اطلاعات هستند، می توان از روش POST استفاده کرد. تاریخچه‌ی REST REST برای اولین بار توسط دانشمند علم کامپیوتر Roy Fielding در طول انجام پایان‌ نامه‌ی تحصیلات دوره‌ی دکترای وی در دانشگاه کالیفرنیا با عنوان «سبک‌های معماری و طراحی معماری نرم افزار مبتنی بر شبکه» ابداع شد. فصل 5 پایان نامه ادعاهای Fielding در مورد چگونگی بهینه سازی معماری سیستمهای توزیعی hypermedia را توصیف می‌کند. وی تعدادی از شرایط مرزی را توصیف می‌کند که سیستم‌های مبتنی بر REST باید چگونه رفتار کنند. این شرایط به عنوان محدودیت‌های REST یاد می‌شوند. چهار مورد از محدودیت‌های کلیدی در زیر شرح داده شده اند: استفاده از رابط کاربری یکنواخت (Uniform Interface, UI): همانطور که قبلا ذکر شد، منابع در سیستم‌های مبتنی بر REST باید از طریق یک URL قابل شناسایی باشند و تنها با استفاده از روشهایی مانند DELETE، PUT و GET در HTTP با منبع در تعامل باشند. سیستم‌های مبتنی بر رابطه‌ی کلاینت، سروری: در سیستم‌های مبتنی بر REST، باید تعریف مشخصی از کلاینت و سرور داشته باشیم. UI و نگرانی‌های حاصل از درخواست‌ها، در حوزه‌ی کلاینت هستند. در همین حال، دسترسی به داده‌ها، مدیریت بار کاری و امنیت، در دامنه‌ی سرور است. این جداسازی‌ها اتصال بین کلاینت و سرور را برقرار می‌کند و هر کدام میتوانند مستقل از دیگری توسعه یابند. عملیات مجزا (Stateless operations): تمام عملیات بین کلاینت و سرور باید مجزا و مستقل از هم باشند و هر مدیریت حالتی (State) که مورد نیاز است نه بر روی سرور، بلکه باید بر روی کلاینت پیاده سازی شود. کَش کردن منابع RESTful: توانایی کَش کردن منابع بین فراخوانی‌های انجام شده توسط کلاینت نسبت به کاهش تاخیر و بهبود عملکرد اولویت بالاتری دارد. علاوه بر این تمامی منابع باید اجازه ی کَش کردن را داشته باشند، مگر اینکه یک نشانه‌ی صریح برای عدم امکان انجام این عمل یافت شود. توسعه‌ی APIهای REST‌ در جاوا در راستای محبوبیت رو به رشد سیستمهای مبتنی بر REST، تعدادی از چارچوبها برای کمک به توسعه دهندگان در ایجاد خدمات وب RESTful به وجود آمده اند. برخی از چارچوب‌های منبع باز محبوب برای ایجاد سرویسهای وب مبتنی بر جاوا عبارتند از Apache CXF، Jersey، Restlet، Apache Wink، Spring Data و JBoss' RESTeasy. رویکرد کلی هر یک از این چارچوبها این است که به توسعه دهندگان کمک کنند تا خدمات وب RESTful خود را با استفاده از الگوهای معنایی جاوا که با آن آشنا هستند، از جمله Java Platform (نسخه سازمانی)، Servlet API بسازند، در عین حال که کلاس‌های از پیش آماده و روش‌هایی به آن‌ها ارائه‌ می‌شوند تا با شروط اساسی REST بیشترین مطابقت را داشته باشند.
  13. 2 امتیاز
    اره منم تغییر نمیدادم ولی چند روزی هست درگیر بهینه سازی هستیم جالبه که فعال کردن این فلگ ها علاوه بر بالا بردن سرعت باعث میشه کد اسمبلی یکم پیچیده تر بشه و برای مهندسی معکوس سخت تر بشه کار اینطور که شنیدم ولی تست نکردم هنوز .
  14. 2 امتیاز
    معمولا خیلی بهتره که اینطور پردازش های سنگین را به صورت موازی انجام بدید مثلا از تکنیک Divide and Concur استفاده کنید. ولی با تغییراتی که دادم برای 20000 تا تقریبا 3 ثانیه طول کشید که سورت کنه! #include <iostream> #include <functional> #include <utility> #include <array> #include <random> #include <chrono> const unsigned int MAX_LENGTH = 20000; bool Compare(unsigned int* FirstVariable,unsigned int* SecondVariable){ if(FirstVariable < SecondVariable) return true; return false; } void swapData(unsigned int* ji,unsigned int* ci){ unsigned int* tmp=0; tmp = ci; ci = ji; ji = tmp; } void SortArray(std::array<unsigned int*,MAX_LENGTH> &MyArray,bool (*compare)(unsigned int*,unsigned int*)){ for(std::array<unsigned int*,MAX_LENGTH>::iterator ci=MyArray.begin(); ci !=MyArray.end(); ++ci){ for(std::array<unsigned int*,MAX_LENGTH>::iterator ji=ci; ji !=MyArray.end(); ++ji){ if(compare((*ji),(*ci))) swapData(*ji , *ci); } } } void PrintArrayElements(const std::array<unsigned int*,MAX_LENGTH> &MyArray){ for(const auto &item : MyArray) std::cout << item << std::endl; } void RandomizeArray(std::array<unsigned int*,MAX_LENGTH> &MyArray){ std::mt19937_64 Random(static_cast<int>(std::chrono::high_resolution_clock::now().time_since_epoch().count())); std::uniform_int_distribution<> RandomGenerator(0,1000); for(unsigned int index=0;index<MAX_LENGTH;++index) MyArray[index] = (unsigned int*)RandomGenerator(Random); } int main(){ std::array<unsigned int*,MAX_LENGTH> MyOrginalArray; RandomizeArray(MyOrginalArray); SortArray(MyOrginalArray,Compare); //PrintArrayElements(MyOrginalArray); return 0x0000; } البته وقتی از STL استفاده میکنید کمی از سرعت پردازش را دارید فدای کیفیت کد نویسی میکنید واین خیلی وقتها بیشتر اهمیت داره تا سرعت پردازش همانطور که گفتم برای رفع مشکلات مربوط به سرعت پردازش از تکنیکهای موازی استفاده می شود.
  15. 2 امتیاز
    معمولا برای نمایش درصد انجام شده پروسه با استفاده از Progress Bar باید قبل از شروع پروسه زمان اجرای پروسه Estimate Plan را محاسبه کنید. اگر پروسه ای که دارید، قابلیت تخمین زمان محاسبه رانداره! از نظر تکنیک های UI/UX دیگه نمی تونید از یک Progress Bar که درصد پیشرفت را نشان میدهد استفاده کنید، باید ازیک Spinner Progress Bar(پروسه در حال انجام بدون درصد پیشرفت...) استفاده کنید ویا یک پیغام مناسب نمایش بدید تا اتمام زمان پروسه . البته کلاس QProgressBar هم می تونید به صورت یک پروسس در حال انجام بدون درصد پیشرفت نمایش بدید.
  16. 2 امتیاز
    «بخش اول» CDN مخفف Content Delivery Network یک شبکه‌ی تحویل محتوا است که به گروه توزیع شده‌ی سرورها اشاره دارد که با یکدیگر همکاری می‌کنند تا محتوای اینترنت را به صورت سریعی ارائه دهند. CDN امکان انتقال سریع بسته‌های مورد نیاز برای بارگذاری محتوای اینترنتی از جمله صفحات HTML، فایلهای جاوا اسکریپت، شیوه نامهها، تصاویر و فیلمها را فراهم می‌کند. محبوبیت سرویس‌های CDN همچنان در حال رشد است و امروزه اکثر ترافیک وب سایتهای بزرگ چون Facebook، Netflix و Amazon از طریق CDN‌ها جا به جا می‌شوند. CDNهایی که به درستی پیکربندی شده‌ اند همچنین ممکن است به حفاظت از وب سایتها در برابر برخی از حملات مخرب رایج مانند حملات انکار سرویس توزیع شده (DDOS) کمک کنند. آیا CDN مشابه میزبان وب است؟ در حالی که یک CDN محتوا را میزبانی نمی‌کند و نمی‌تواند جایگزینی برای نیاز به میزبانی وب مناسب باشد، محتوای cache در لبه‌ی شبکه کمک می‌کند که عملکرد وب سایت را بهبود بخشد. بسیاری از وب سایت‌ها تلاش می‌کنند که نیازهای عملکرد آن‌ها توسط خدمات میزبانی سنتی برآورده شود، به همین دلیل آن‌ها CDNها را انتخاب می‌کنند. با استفاده از ذخیره سازی برای کاهش پهنای باند میزبانی و کمک به جلوگیری از وقفه در سرویس و بهبود امنیت، CDNها انتخاب محبوبی برای از بین بردن برخی از نقاط بحرانی میزبانی سنتی وب هستند. مزایای استفاده از CDN‌ چیست؟ اگرچه مزایای استفاده از CDN بسته به اندازه و نیازهای یک مالکیت اینترنتی متفاوت است، مزایای اولیه برای اکثر کاربران را میتوان به 4 بخش مختلف تقسیم کرد: بهبود زمان بارگذاری وب سایت: با توزیع محتوای نزدیک به بازدید کنندگان وب سایت با استفاده از سرور CDN نزدیک (در میان دیگر بهینه سازیها)، بازدید کنندگان بارگذاری سریع‌تر صفحه را تجربه می‌کنند. هنگامی که بازدید کنندگان بیش‌تر مایل به کلیک کردن در یک سایت با بارگیری کُند هستند، یک CDN میتواند سبب کاهش نرخ جست و جو و افزایش زمان سپری شده توسط افراد در سایت شود. به عبارت دیگر، یک وب سایت سریع‌تر به این معنی است که بازدید کنندگان بیش‌تر در آن جا ماندگار شوند. کاهش هزینه‌های پهنای باند: هزینه‌ی مصرف پهنای باند برای میزبانی وب سایت هزینه‌ی اصلی برای وب سایت‌ها است. از طریق ذخیره سازی و بهینه سازی‌های دیگر، CDNها قادر به کاهش میزان داده‌هایی هستند که یک سرور مبدا باید ارائه دهد. بنابراین هزینه‌های میزبانی وب برای صاحبان وب سایت‌ها کاهش می‌یابد. افزایش میزان دسترسی و افزونگی: مقدار زیاد ترافیک و یا خرابیهای سخت افزاری می‌تواند کارکرد وب سایت را مختل سازد. به لطف ساختار توزیع شده، یک CDN می‌تواند ترافیک بیشتری را اداره کند و از خرابی و شکست سخت افزاری بهتر از بسیاری از سرورهای مبدا جلوگیری کند. بهبود امنیت وب سایت: CDN می‌تواند امنیت را با تضمین کاهش DDoS، بهبود گواهی‌های امنیتی و سایر بهینه سازی‌ها بهبود بخشد. CDN چگونه کار می‌کند؟ هسته‌ی یک CDN شبکه‌ای از سرورها است که با هدف ارائه‌ی محتوا به صورت سریع، ارزان، قابل اعتماد و ایمن است. به منظور بهبود سرعت و قابلیت اتصال CDN، سرورها را در نقاط مبادله‌ی بین شبکه‌های مختلف قرار می‌دهد. این نقاط مبادله‌‌ی اینترنت (IXP, Internet Exchange Point) مکان‌های اصلی هستند که سرویس دهندگان مختلف اینترنت برای دسترسی به ترافیک ناشی از شبکه‌های مختلف خود به یکدیگر دسترسی دارند. با اتصال به این مکان‌های با سرعت و قدرت اتصال بالا، ارائه دهنده‌ی CDN می‌تواند هزینه‌ها و زمان حمل و نقل را در تحویل داده‌های با سرعت بالا کاهش دهد. علاوه بر قرار دادن سرورها در IXPها، یک CDN برخی از بهینه سازی‌ها را در انتقال داده‌های استاندارد بین سرویس گیرنده و سرور انجام می‌دهد. CDNها مراکز داده را در مکان‌های استراتژیک و با افزایش امنیت در سراسر جهان قرار داده و به گونه‌ای طراحی شده اند تا انواع مختلف خرابی‌ها و جابجایی ترافیک اینترنت را مدیریت کنند. تاخیر - CDN چگونه زمان بارگذاری وب سایت را بهبود می‌بخشد؟ هنگام بارگذاری محتوا، با کاهش سرعت وب سایت تعداد کاربران نیز کم‌تر می‌شود. سرویس‌های CDN می‌توانند با روش‌های زیر به کاهش زمان بارگذاری کمک کنند: ماهیت توزیع شده‌ی CDN به صورت جهانی به معنای کاهش فاصله‌ی بین کاربران و منابع وب سایت است. به جای اجبار برای اتصال مستیم به سرور مبدا وب سایت، CDN به کاربران اجازه می‌دهد تا به یک مرکز داده‌ی نزدیک‌تر از لحاظ جغرافیایی متصل شوند. زمان اتصال به سرور کم‌تر، به معنی خدمات سریع‌تر است. بهینه سازی سخت افزاری و نرم افزاری مانند متعادل سازی کارآمد بار و درایوهای سخت حالت جامد (Solid-state hard drives) می‌توانند به کاربران کمک کنند تا داده‌ها را سریع‌تر دریافت کنند. CDNها میتوانند میزان داده‌هایی را که با کاهش اندازه‌ی فایل‌ها با استفاده از تکنیک‌هایی مانند کمینه سازی و فشرده سازی فایل انتقال مییابند، کاهش دهند. اندازه‌ی فایلهای کوچک‌تر به معنی زمان بارگذاری سریع‌تر است. CDNها همچنین می‌توانند سایت‌هایی را که از گواهینامه‌های TLS/SSL استفاده می‌کنند با بهینه سازی استفاده‌ی مجدد اتصال‌ها و فعال سازی TLS false start (با کاهش زمان Handshaking به یک RTT)، سرعت بخشند. قابلیت اطمینان و افزونگی - آیا CDN وب سایت را همیشه آنلاین نگه می‌دارد؟ Uptime مولفه‌ی مهمی برای هر کسی است که دارای مالکیت اینترنتی دارد. خرابی‌های سخت افزاری و تکانهای ترافیکی، به عنوان یک نتیجه از حملات مخرب و یا فقط افزایش محبوبیت، پتانسیل پایین آوردن کارایی وب سرور و جلوگیری از دسترسی کاربران به سایت یا سرویس را دارند. CDN متعادل داراي چندين ويژگي است که باعث کمینه شدن مدت از کار افتادگی می‌شود: متعادل سازی بار با توزیع ترافیک شبکه به طور مساوی بین سرورهای مختلف انجام می‌شود و باعث می‌شود سرعت جابجایی ترافیک افزایش یابد. شکست هوشمند (Intelligent failover) خدمات بدون وقفه را فراهم می‌کند حتی اگر یک یا چند سرور CDN به دلیل خرابی سخت افزاری غیر فعال شوند؛ Failover می‌تواند مجددا ترافیک را به سرورهای عملیاتی دیگر توزیع کند. در صورتی که کل یک مرکز داده دارای مشکلات فنی باشد، مسیریابی Anycast (یک به چند) ترافیک را به یک مرکز داده‌ی دسترسی دیگر منتقل می‌کند و اطمینان حاصل می‌کند که هیچ یک از کاربران دسترسی به وب سایت را از دست نمی‌دهند. امنیت داده‌ها - چگونه CDN از داده‌ها محافظت می‌کند؟ امنیت اطلاعات بخشی جدایی ناپذیر از CDN است. CDN می‌تواند یک سایت را با گواهینامههای TLS/SSL به روز امن نگه دارد که استانداردهای بالا را برای احراز هویت، رمزنگاری و یکپارچگی تضمین می‌کند. برای اطلاعات بیشتر در این زمینه، نگرانی‌های امنیتی در مورد CDNها را بررسی کنید و تحقیق کنید چه کارهایی می‌تواند برای ارائه‌ی ایمن محتوا انجام شود. همچنین در مورد امنیت در SSL/TLS نیز اطلاعات بیشتری کسب کنید. هزینه‌ی پهنای باند - CDN چگونه هزینه‌های پهنای باند را کاهش می‌دهد؟ هر بار که سرور اصلی به درخواست پاسخ می‌دهد، پهنای باند مصرف می‌شود. خواهیم دید که چگونه یک CDN هزینه‌ی درخواست‌های مبدا را کاهش می‌دهد. (به زودی در ادامه با جزییات بیشتر توضیح خواهیم داد) مقاله‌ی بعدی در رابطه با کارایی CDNها خواهد بود، با ما همراه باشید.
  17. 2 امتیاز
    عه سلام فکر میکردم راهنمایی کردم الان دیدم نکردم . ببین باید ابجکت جیسانت رو درست کنی بعد یه تابع داره برای تبدیل به استرینگ : QJsonObject jsonObj; // assume this has been populated with Json data QJsonDocument doc(jsonObj); QString strJson(doc.toJson(QJsonDocument::Compact)); بعد میتونید استرینگ رو به روش دلخواه بفرستید به کیو ام ال و اونجا پارسش کنید.
  18. 2 امتیاز
    «بخش دوم» در پست ۷ گام برای تبدیل شدن به یک طراح موفق UI/UX به طور خلاصه به اصول طراحی رابطه‌ی کاربری اشاره کردیم. در این بخش قصد داریم در مورد اصل تعادل (Balance) صحبت کنیم. هر طرح با یک صفحه‌ی خالی یا فضای خالی آغاز میشود. هنگامی که یک عنصر اضافه میکنیم، قرار دادن آن میتواند تعیین کند که طراحی تا چه حد موفق خواهد بود. طراحی موثر ارتباطات و علاقه‌ی بیننده را بنا میکند؛ خواه این طراحی به صورت چاپ شده و یا به صورت صفحات وب باشد. در یک طرح وب معمولی، طراح باید لوگو، متن، عکس یا تصویر را جایگزین کند. با یک تلاش آگاهانه برای ایجاد ارتباط بین این عناصر می‌توان یک طراحی چشم نواز به وجود آورد. تعادل در طراحی بسیار شبیه به تعادل در زندگی است. نمونه ای که اغلب از تعادل در دنیای واقعی یاد می‌شود، الاکنگ است. وقتی فقط یک نفر روی آن نشسته است، تجربه‌ی بسیار سرگرم کننده‌ای نیست. تعادل زمانی حاصل میشود که دو نفر از افراد با وزن مشابه در هر طرف قرار گیرند. نمونه‌ای دیگر از تعادل را هنگامی می‌توان به دست آورد که یکی از افراد سنگین در یک طرف و دو نفر سبکتر در طرف دیگر نشسته اند. اگر یک فرد سنگینتر به مرکز الاکلنگ نزدیکتر شود تعادل میتواند حاصل شود، در حالی که یک فرد سبکتر در انتهای طرف دیگر نشسته است. ما به عنوان انسان از لحاظ جسمی یک دست و پای در هر طرف ستون فقرات و سر داریم و قادر به ایستادن و حرکت با وجود اندازه و وزنهای مختلف هستیم. در طراحی سعی میکنیم به توازنی میان عناصر دست یابیم، زیرا در چشم نواز است. اما تعادل همیشه از طریق تقارن بدست نمیآید. نگاهی به جعبههای زیر کنید. خط سفید در جعبه‌ی 1 و 2 به طور متقارن متعادل است در حالی که در جعبه‌ی 3 و 4 خط به طور نامتقارن متعادل است. تقارن تعادلِ متقارن تعادلِ تصویر آینه است. اگر یک خط را از طریق مرکز صفحه بکشید، عناصر در یک طرف خط در سمت دیگر نیز به صورت آینه دیده میشوند. ما میتوانیم آن را با قرار دادن عناصر به طور نسبتا مساوی در طراحی دست یابیم. تقارن در طبیعت یک مثال معمول که در وب اتفاق میافتد، جایی است که بلوک های متن در سطر یا ستون به صورت آینه نگاشته می‌شوند. همچنین میتواند با استفاده از رنگ و تایپوگرافی به دست آید. برای مثال در وب سایت Mobile Web Book تصویر تلفن همراه این صفحه به دو بخش تقسیم می‌شود که با بلوکهای متن در هر طرف به صورت متعادل در مقابل هم قرار گرفته اند. در پوستر فیلم «The Day I Became A Woman»، بلوک متن سفید بزرگ در گوشه‌ی سمت راست بالا در گوشه‌ی پایین سمت چپ هم از لحاظ رنگ و هم از نظر شکل متقارن هستند. سایت پر طرفدار Florida Flourish تقریبا میتواند به نصف مرکز برسد که یک حس بسیار قوی از تعادلِ متقارن دارد. پوستر Havco که در زیر آورده شده است، قسمت چپ و راست پوستر با استفاده از اشکال مشابه و قطعات بدن متعادل است . متن قرمز در بالا و پایین عنوان در رنگ و اندازه‌ی متعادل قرار دارد. عدم تقارن طرح بندیهای متعادلِ نامتقارن دارای عناصری هستند که در یک خط مرکزی به صورت آینه‌ای جدا نمی‌شوند. این طرح بندی‌ها میتوانند طراحی را دشوارتر کنند، اما سبب جذابیت برای بیننده می‌شوند. میتوانیم با ایجاد چندین آیتم کوچک در یک طرف و یک آیتم بزرگ در طرف دیگر یک طرح متضاد نامتقارن ایجاد کنیم. اگر یک آیتم تیره در یک طرف دارید، میتوانید چندین آیتم روشن رنگی را در طرف دیگر قرار دهید. یک طراحی متعادلِ نامتقارن میتواند تنش ایجاد کند و بیننده را جذب کند. وب سایت MattWeb یک گرافیک بزرگ دارد که سمت چپ صفحه‌ی اصلی را پر کرده است. حس توازن نامتقارن در اینجا با استفاده از رنگهای تطبیق و یک فونت بدون سرصفحه مطابق با مارپیچ‌ها به دست می‌آید. سایت Dann Whitaker دارای چندین عنصر است که به صورت متقارن نیستند، اما از نظر رنگ، بافت و محتوا یکدیگر را متعادل میکنند. عدم تعادل (Off-Balance) خوب، پس اگر تمام کارهای طراحی شما در تعادل باشند، خسته کننده میشود. اگر قوانین را میدانید، میتوانید آن‌ها را قطع کنید، و عدم تعادل میتواند جنبش و حرکت را به بیننده منتقل کند. البته این مسئله میتواند بیننده را به کمی ناراحت و آشفته کند. طراحی غیر متعادل میتواند مخاطب را به فکر کردن وادار کند. فقط اجازه ندهید که به طور تصادفی این اتفاق بیفتد. در مقاله‌ی آینده نگاهی به اصل مجاورت (Proximity) میکنیم. در عین حال توصیه می‌شود که در وب سایت‌های مختلف تعادل قوی، تقارن و عدم تقارن را بررسی کنید.
  19. 2 امتیاز
    سلام خب این یک مقدار نیاز به توضیح داره ولی در کل روندش از سی میک یکیش اینه که شما با find_package باید کتابخانه رو پیدا کنید و بعد باید کتابخونه و آدرس اینکلود رو به قسمت هایی از پروژه که نیاز هست اضافه کنید. این مثال کوچیک رو از اضافه کردن کتابخانه‌های boost ببینید : cmake_minimum_required(VERSION 2.8.12) project(UCCP_Server_Boost) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) include_directories(./src) #seting file pathes file(GLOB Headers ./src/*.h) file(GLOB Cpp ./src/*.cpp) #library add_library(Server ${Headers} ${Cpp} ) set (CMAKE_CXX_STANDARD 14) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++14 -D__STRICT_ANSI__") find_package (Threads) find_package(Boost 1.58 REQUIRED COMPONENTS date_time filesystem iostreams thread) if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) add_executable(${PROJECT_NAME} "posix_main.cpp" ) target_link_libraries(${PROJECT_NAME} Boost::date_time Boost::filesystem Boost::iostreams Boost::thread ${CMAKE_THREAD_LIBS_INIT} Server ) endif(Boost_FOUND) set(Boost_USE_STATIC_LIBS ON) # only find static libs set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) توی این مثال با find_package کتابخانه های مختلف رو پیدا کرده بعد چک کرده که اگر پیدا شده بود بیاد لینکشون کنه و با include_directories(${Boost_INCLUDE_DIRS}) فایل های اینکلود رو اضافه کرده . برای بقیه کتابخانه ها هم همینند فقط اگر کتابخانه ای با سی میک نوشته شده باشه احتمالا یک سری پارامتر اختصاصی هم داره که کلا متغیر رو میشه با set تنظیم کرد اون چند مورد پایین هم وقتی مثلا مقدارشون ON باشه احتمالا خود کتابخانه با توجه به تعریف شدن اینها یا مقدارشون کاری رو انجام میده . ولی نکته دیگه مرحله قبل از سی میک هست این که سی میک از کجا میفهمه کتابخانه کجاست این بر میگرده به نحوه معرفی سیستم‌عامل اگر توی ویندوز هستید میتونید با اضافه کردن آدرس کتابخانه به path مطمئن بشید که سی میک دنبالش میگرده و اگر تیو لینوکس هستید path environment رو سی میگ ملاک قرار میده پس باید یا ایمورت کنید path رو بهش یا توش تعریف شده باشه اما راه دیگه که خیلی هم اصولی نیست اینه که دستی توی فایل سی میک مسیر مورد نظر رو به پرفیکس اصافه کنید تا سی میک اونجا رو هم دنبال کتابخانه مورد نظر بگرده و مقادیری که نیاز هست رو مقدار دهی کنه . در کل سی میک تقریبا اندازه یک زبان کامل قابلیت داره باید یه وقت درست درمون بذارید برای یاد گیریش این هم لینک مثال اضاف کردن کتابخانه‌های کیوت در CMAKE میتونید از این مورد هم کمک بگیرید برای درک کلی قضیه. موفق باشید
  20. 2 امتیاز
    با سلام، در این پست من قصد دارم به چند ویژگی استاندارد 1z اشاره کنم که به شما اجازه میده تا کُد تمیزتر، ساده‌تر و خواناتری را ایجاد کنید. توسعه زبان‌های برنامه‌نویسی روز به روز بیشتر شده و سی++ به عنوان یک زبان پیچیده نیاز به این داره تا کاربران رو از لحاظ سادگی و مدرنیزه شدن سینتکس دلگرم کنه. در استاندارد جدید ۱۷ من برخی از ویژگی‌ها رو معرفی می‌کنم که در تمیز نوشتن و ساده نوشتن تاثیر بسیاری دارند. ویژگی ساختار‌های پیوندی این ویژگی یکی از ویژگی‌های جدید سی++ است که امکان پیوند شدن نام‌های مشخص و زیر اشیاء المنت‌های اولیه را می‌دهد. به عبارت ساده‌تر می‌توان گفت که، ساختار‌های پیوندی (Structured Bindings) این توانایی را برای ما می‌دهد تا متغیر‌های چند گانه از یک ساختار (struct) یا tuple را به هم دیگر متصل کنیم. *مهمترین هدف Structured Bindings در نسخه‌ی ۱۷ ساده سازی و راحتی درک کد می‌باشد. سینتکس این ویژگی به صورت زیر است: auto ref-operator(optional)[identifier-list] = expression; // Or auto ref-operator(optional)[identifier-list]{expression}; // Or auto ref-operator(optional)[identifier-list](expression); اجازه دهید تا ما با استفاده ازیک مثال مزایای استفاده از ساختار‌های پیوندی را با کمک tuple ببینیم: در نسخه‌ی ۹۸ سی‌پلاس‌پلاس: #include <iostream> using namespace std; // Creating a structure named Point struct Point { int x; int y; }; // Driver code int main() { Point p = {1, 2}; int x_coord = p.x; int y_coord = p.y; cout << "X Coordinate : " << x_coord << endl; cout << "Y Coordinate : " << y_coord << endl; return 0; } در نسخه‌ی ۱۱ و ۱۴ سی‌پلاس‌پلاس: #include <iostream> #include <tuple> using namespace std; // Creating a structure named Point struct Point { int x, y; // Default Constructor Point() : x(0), y(0) { } // Parameterized Constructor for Init List Point(int x, int y) : x(x), y(y) { } auto operator()() { // returns a tuple to make it work with std::tie return make_tuple(x, y); } }; // Driver code int main() { Point p = {1, 2}; int x_coord, y_coord; tie(x_coord, y_coord) = p(); cout << "X Coordinate : " << x_coord << endl; cout << "Y Coordinate : " << y_coord << endl; return 0; } در نسخه‌‌ی ۱۷ سی‌پلاس‌پلاس: #include <iostream> using namespace std; struct Point { int x; int y; }; // Driver code int main( ) { Point p = { 1,2 }; // Structure binding auto[ x_coord, y_coord ] = p; cout << "X Coordinate : " << x_coord << endl; cout << "Y Coordinate : " << y_coord << endl; return 0; } ویژگی عبارت شرطی و حلقه‌ی جدید نسخه‌های جدید از دستورات شرطی switch و if در سی‌پلاس‌پلاس به صورت زیر هستند: if (init; condition) و switch (init; condition) قبلاً شما باید به صورت زیر یک دستور شرطی را پیاده سازی می‌کردید: { auto val = GetValue(); if (condition(val)) // on success else // on false... } در این قالب مشخص است که val یک محدوده‌ی جداگانه و احتمال نشتی دارد. در نسخه‌ی جدید آن را می‌توان به صورت زیر ساده تر و خواناتر نوشت: if (auto val = GetValue(); condition(val)) // on success else // on false... در این نسخه val فقط در داخل حوزه‌ی if و else قابل مشاهده است، بنابراین در این صورت امکان نشتی نخواهد داشت. شرط ممکن است هر نوع شرط باشد و فقط وابسته به val مقدار true/false را بر نمی‌گرداند. خُب، چرا این نسخه مفید خواهد بود؟ فرض کنید قرار است در داخل یک رشته چند چیز را جستجو کنید: const std::string myString = "My Hello World Wow"; const auto it = myString.find("Hello"); if (it != std::string::npos) std::cout << it << " Hello\n" const auto it2 = myString.find("World"); if (it2 != std::string::npos) std::cout << it2 << " World\n" ما یا باید نام‌های مختلفی را برای it استفاده کنیم و یا باید آن‌ها را در داخل دامنه‌ی جداگانه قرار دهیم. مانند مثال زیر: { const auto it = myString.find("Hello"); if (it != std::string::npos) std::cout << it << " Hello\n" } { const auto it = myString.find("World"); if (it != std::string::npos) std::cout << it << " World\n" } عبارت شرطی جدید if یک دامنه اضافی را فقط در یک خط ایجاد می‌کند: if (const auto it = myString.find("Hello"); it != std::string::npos) std::cout << it << " Hello\n"; if (const auto it = myString.find("World"); it != std::string::npos) std::cout << it << " World\n"; همانطور که قبلاً ذکر شد متغیر تعریف شده در عبارت if نیز در بلوک else قابل مشاهده است. بنابراین شما می‌توانید آن را به صورت زیر نیز بنویسید: if (const auto it = myString.find("World"); it != std::string::npos) std::cout << it << " World\n"; else std::cout << it << " not found!!\n"; همچنین شما در استاندارد جدید می‌توانید از ويژگی پیوند ساختاری در عبارت شرطی نیز استفاده کنید که قالب آن به صورت زیر است: // better together: structured bindings + if initializer if (auto [iter, succeeded] = mymap.insert(value); succeeded) { use(iter); // ok // ... } // iter and succeeded are destroyed here ویژگی Variadic Templates در نسخه‌ی ۱۱ ما ویژگی‌ خوبی به نام قالب‌های متنوع یا همان (Variadic Templates) داریم که بسیار عالی است، مخصوصاً وقتی که می‌خواهید با تعداد نامحدود یا متغیر با توابع کار کنید. برای مثال در نسخه‌های قبل از ۱۱ ما مجبور بودیم تا چندین تابع را با ورودی‌های مختلف پیاده سازی کنیم تا بتوانیم به نتیجه‌ی مربوطه برسیم. در حال حاضر این ویژگی هنوز هم نیازمند افزودن کد‌های می‌باشد مخصوصاً اگر می‌خواهید تابعی از نوع بازگشتی پیاده سازی کنید. مانند مثال زیر: auto SumCpp11(){ return 0; } template<typename T1, typename... T> auto SumCpp11(T1 s, T... ts){ return s + SumCpp11(ts...); } در نسخه‌ی جدید سی++۱۷ ما می‌توانیم این را بسیار ساده تر بنویسیم: template<typename ...Args> auto sum(Args ...args) { return (args + ... + 0); } و یا حتی ساده تر... template<typename ...Args> auto sum2(Args ...args) { return (args + ...); } این تابع فوق‌العاده است! ورودی‌های متغیر با نوع بازگشتی یکی از پر کاربرد‌ترین توابعی است که در نسخه‌های قبل پیاده سازی آن پیچیده بود. ویژگی متغیر‌های درون خطی (Inline variables) در قبل از سی++۱۷ ما می‌توانستیم از کلمه‌ی کلیدی inline جهت بهینه‌سازی در زمان کامپال برای توابع استفاده کنیم. حال در نسخه‌ی ۱۷ قابلیت تعریف inline برای متغیر‌ها نیز فراهم شده. فرض کنید قرار است متغیری را تعریف کنیم که به صورت ایستا و عمومی مورد استفاده قرار بگیرد. در قبل از نسخه‌ی ۱۷ تعریف آن به این صورت که متغیر در فایل هدر و سورس اعلان و تعریف شوند: #ifndef MYCLASS_H #define MYCLASS_H class MyClass { public: MyClass(); static const int myVariable; }; #endif // MYCLASS_H فایل سورس #include "myclass.h" MyClass::MyClass() { } const int MyClass::myVariable = 17; و در نهایت تابع و فایل main: #include <iostream> #include "myclass.h" int main() { std::cout << "My global variable is : " << MyClass::myVariable << std::endl; return 0; } در استاندارد جدید تعریف تابع در همان زمان اعلان به صورت ایستا و عمومی امکان پذیر شده است. برای مثال: #ifndef MYCLASS_H #define MYCLASS_H class MyClass { public: MyClass(); inline static const int myVariable = 17; }; #endif // MYCLASS_H همین تعریف برای اعلان متغیر از نوع ایستا و عمومی کافی است. این کار باعث می‌شود نیازی برای تعریف مقدار متعیر در فایل سورس نباشد. مثال‌های دیگر : struct MyClass { static const int sValue; }; inline int const MyClass::sValue = 777; و یا ساده تر از آن به شکل زیر: struct MyClass { inline static const int sValue = 777; };
  21. 2 امتیاز
    مراحل ساخت برنامه‌ در زبان سی‌پلاس‌پلاس پیش نویس ۰.۶ قبل از هر چیز به اینفوگرافی زیر توجه کنید که مراحل ساخت برنامه در سی‌پلاس‌پلاس را نشان می‌دهد. مقدمه‌ای بر همگردانی (کامپایل) و اتصال (لینک کردن) این سند مرور مختصری در رابطه با مراحل را برای شما فراهم می‌کند تا به شما در درک دستورات مختلف برای تبدیل و اجرای برنامه‌ی خودتان کمک کند. تبدیل مجموعه‌ای از فایل‌های منبع و هدر در سی‌پلاس‌پلاس به یک فایل خروجی و اجرایی در چندین گام (به طور معمول در چهار گام) پیش‌پردازنده (Preprocessors)، کامپایل و گرد‌آوری (Compilation)، اسمبلر (Assmbler) و پیوند دهنده (Linker) تقسیم می‌شود. قبل از هر چیز اگر در محیط توسعه‌ی Qt Creator داخل فایل .pro مقدار زیر را وارد کنید، تا بتوانید فایل‌های ساخته شده‌ی موقت در زمان کامپایل را مشاهده کنید. QMAKE_CXXFLAGS += -save-temps تعریف پیش‌پردازنده پیش‌پردازنده‌ها (Preprocessors) درواقع دستوراتی هستند که اجازه می‌دهند تا کامپایلر قبل از آغاز کردن مراحل کامپایل دستوراتی را دریافت کند. پیش‌پردازنده‌ها توسط هشتگ (#) مشخص می‌شوند این نماد در سی‌++ مشخص میکند که دستور فوق از نوع پیش‌پردازنده می‌باشد که نتیجه‌ی آن در قالب ماکرو (Macro) در دسترس خواهد بود. برای مثال ماکروی __DATE__ توسط پیش‌پردازنده‌ها از قبل تعریف شده است که مقدار تاریخ و زمان را بازگشت می‌دهد. بنابراین هرکجا که از آن استفاده شود کامپایلر آن را جایگزین متن خواهد کرد. در شکل زیر مرحله‌ای که از پیش‌پردازنده‌ها استفاده می‌شود آمده است: پیش‌پردازنده، کامپایل (گردآوری کردن)، لینک (پیوند کردن) و ساخت برنامه اجرایی فرایند تبدیل مجموعه‌ای از فایل‌های متنی هِدر و سورس سی‌++ را «ساخت» یا همان Building می‌گویند. از آنجایی که ممکن است کُد پروژه در بسیاری از فایل‌ها هدر و سورس سی++ توسعه و گسترش یابدمراحل ساخت در چند گام کوچک صورت می‌گیرد. یکی از رایج‌ترین موارد در مراحل گردآوری (ترجمه‌ی یک کد سی‌پلاس‌پلاس به دستورالعمل‌های قابل فهم ماشین) است. اما گام‌های دیگری نیز وجود دارد، پیش‌پردازنده و لینک (پیوند‌ها) این بخش به طور خلاصه توضیح می‌دهد که چه اتفاقی در هر یک از مراحل رُخ می‌دهد. یک کامپایلر یک برنامه‌ی خاص است که پردازش اظهارات (دستورات) نوشته شده در یک زبان برنامه‌نویسی خاص را به یک زبان ماشین که قابل فهم برای پردازنده می‌باشد تبدیل کند. به طور معمول یک برنامه‌نویس با استفاده از یک ویرایشگر که به محیط توسعه‌ی یکپارچه‌ی نرم‌افزار (IDE) مشهور است توسط زبان برنامه‌نویسی مانند ++C دستورات (اظهارات) را می‌نویسد. فایل ایجاد شده با نام (filename.cpp در زبان برنامه‌نویسی سی‌پلاس‌پلاس) شامل محتوایی است که معمولاً به عنوان دستورات برنامه‌نویسی سطح بالا نامیده می‌شود. سپس برنامه‌نویس کامپایلرِ مناسب برای زبان برنامه‌نویسی مانند سی++ را اجرا می‌کند و نام فایل‌هایی که حاوی دستورات هستند را برای کامپایل مشخص می‌کند که این انتخاب و مشخص سازی توسط IDE به راحتی قابل مدیریت است. پس از آن، کار کامپایلر این است که فایل‌های منبع .cpp را جمع آوری کرده و پیش‌پردازنده‌ها را بررسی کند تا دستورات احتمالی را اجرا نماید که نتیجه‌ی این مرحله در فایلی با پسوند .ii ر قالب filename.ii تولید می‌شود که در این فرایند نیز خط به خط کُد‌های موجود در آن‌ها را بررسی می‌کند تا خطاهای احتمالی نحو (سینتکس - Syntax) بررسی می‌شود و آن‌ها را به طور ترتیبی به دستورالعمل‌های سطح ماشین تبدیل کند. توجه داشته باشید که هر نوع پردازنده‌ی کامپیوتر دارای مجموعه‌ای از دستورالعمل‌هایِ ماشین خودش است. بنابراین کامپایلر تنها برای سی++ نیست، بلکه برای اهداف و مقاصدخاص هر پلتفرم است. پس کد‌هایی که توسط پیش‌پردازنده سی‌پلاس‌پلاس به زبان اسمبلی برای معماری مورد نظر در پلتفرم مقصدترجمه شده‌اند نتایج آن در فایلی با پسوند .ss در قالب filename.ss قابل نمایش هستند که در حالت عادی قابل رویت نیست. توجه داشته باشید که باید در این مرحله باید مشخص شود برنامه قرار است توسط چه نوع پردازنده‌ای تحتِ چه نوع معماری مونتاژ (اسمبل) شود. برای مثال پردازنده‌ها با انواع معماری‌های مختلف وجود دارند که برخی از آن‌ها به صورت x86-x64، x64، ARMv7، aarch64 غیره ... می‌باشند. شکل یک (کامپایل یک فایل منبع ++C) مرحله‌ی سوم را در نظر داشته باشید که عمل کامپایل فایل سی‌پلاس‌پلاس در دو مرحله قبلی یک فایل اجرایی را تولید نمی‌کند. برنامه‌ای که توصیف شده است، احتمالاً توابعی را در رابط‌های برنامه‌نویسی (API) و یا توابع ریاضی یا توابع مرتبط با I/O را فراخوانی کند که ممکن است شامل فایل‌های هدر مانند iostream یا fstream و حتی ماژول‌های دیگری که در زبان‌ تعبیه شده‌اند را داشته باشد که فایل تولید شده توسط کامپایلر در این مرحله یک فایل شیء نامیده می‌شود که با پسوند .o به صورت filename.o تولید خواهد شد که علاوه بر دستورالعمل‌های تبدیل شده به کد ماشین، شامل توابع و دستورالعمل‌های خارجی نیز می‌باشد. هرچند در این مرحله دستورات تبدیل به دستورالعمل‌های قابل فهم توسط پردازنده شده‌اند اما فعلاً قابل اجرا نیستند چرا که باید این توابع خارجی افزوده شده را به آن لینک کرد که در مرحله‌ی بعد یعنی مرحله‌ی چهارم اتفاق می‌افتد. در نهایت مرحله‌ی چهارم فایل با پسوند .o که شامل کد‌های تولید شده توسط کامپایلر به زبان ماشین است که پردازنده‌ها می‌توانند این دستورات را درک کنند که همراه با کد‌های تولید شده‌ی هر کتابخانه‌ی دیگری که مورد نیاز است توسط لینکر (لینک شده) و در نهایت جهت تولید یک فایل اجرایی مورد استفاده قرار می‌گیرند که نوع آن فایل از نوع اجرایی یا در واقع Executable File خواهد بود. شرح کامل فرایند ساخت فایل اجرایی اکثر پروژه‌ها دارای مجموعه‌ای از فایل‌های هدر سی++ هستند، که امکان ماژولار شدن در آن را فراهم می‌کند و مجموعه‌ای از آن می‌تواند به عنوان بخش‌های کوچکی از برنامه محسوب شوند. برای ساخت چنین پروژه‌هایی هر فایل سی‌پلاس‌پلاس باید کامپایل شود و سپس فایل‌های ساخته شده در قالب شیء (آبجکت) باید همراه توابع و کتابخانه‌های دیگر لینک (پیوند) شوند. البته هر گام از مراحل کامپایل شامل یک مرحله پیش‌پردازنده است که دستورالعمل # عمل تغییرات و اصلاحیه‌ها را در فایل متن اعمال می‌کند. شکل زیر فرایند ساخت چند فایل به صورت همزمان را نشان می‌دهد:
  22. 2 امتیاز
    جزئیات در ++C ویرایش ۱۷: کد نویسی ساده با توجه به مشخصاتی که در سی‌پلاس‌پلاس ۱۷ که ارائه شده است، ویژگی‌های جدید برای این معرفی می‌شوند تا کد شما تمیز تر و بهتر اعمال شوند. این مقاله را برای مطلع شدن از جزئیات بیشتر بخوانید. با هر استاندارد سی‌‌‌پلاس‌‌پلاس که ارائه می‌شود، هدف از آن تولید کد ساده تر، واضح تر و رسا تر می‌باشد. سی‌پلاس‌پلاس ۱۷ چندین ویژگی بزرگ زبان را ارائه می‌دهد که باعث می‌شود کد ما زیباتر و بهتر شود. بنابراین بیایید باهم یک نگاهی به این ویژگی‌ها داشته باشیم. ممکن است شما بگویید که بیشترین ویژگی‌های جدید زبان (به جز پیشرفت های کتابخانه استاندارد - STL) برای نوشتن کد ساده تر و پاکتر می‌باشند. با توجه به مجموعه جزئیات سی‌پلاس‌پلاس ۱۷ که بسیاری از چیزهای بزرگ را مورد بررسی قرار داده است، ما امروز تنها برای بعضی از ویژگی ها که از داخل این مجموعه عظیم بیرون کشیده‌ایم اشاره خواهیم داشت که باعث می‌شود کد شما فشرده‌تر و بهینه تر شود. پیوند‌های ساخت یافته / اعلان‌های تجزیه عبارت Init-statement برای if/switch متغیرهای درون خطی (inline) شرط constexpr if و چند موارد دیگر پیوند‌های ساخت یافته، آیا اغلب با tuple ها کار کرده‌اید؟ اگر نه، پس احتمالاً باید به آن نگاهی کنید. tuple ها تنها برای بازگشت مقادیر چند گانه از یک تابع پیشنهاد نمی‌شوند، آنها پشتیبانی ویژگی‌ای از زبان را داشتند. به طوری که باعث می‌شود کد ساده تر و پاکتر شود. برای مثال (std::tie که از مرجع اصلی سی‌پلاس‌پلاس به دست آمده است) به صورت زیر است: std::set<S> mySet; S value{42, "Test", 3.14}; std::set<S>::iterator iter; bool inserted; // unpacks the return val of insert into iter and inserted std::tie(iter, inserted) = mySet.insert(value); if (inserted) std::cout << "Value was inserted\n"; توجه داشته باشید که باید iter و inserted را ابتدا وارد کرده باشید. سپس شما می‌‌توانید از std::tie استفاده کنید. با این حال این بخش کوچکی از کد نمونه است: std::set<S> mySet; S value{42, "Test", 3.14}; auto [iter, inserted] = mySet.insert(value); اینجا توجه داشته باشید که یک خط به جای سه خط جایگزین شده است! این کد ساده‌تر و خوانا‌تر و درعین حال ایمن‌ تر است، اینطور نیست؟ همچنین، شما هم اکنون می‌‌توانید از const استفاده کنید و آن را به صورت const auto [iter inserted] بنویسید که صحیح است. پیوند ساختاری تنها به tuple ها ختم نمی‌شود، چرا که ما سه مورد دیگر را داریم: اگر مقدار دهی اولیه یک آرایه باشد: // works with arrays: double myArray[3] = { 1.0, 2.0, 3.0 }; auto [a, b, c] = myArray; اگر مقدار دهی اولیه std::tuple_size<> را پشتیبانی کند و تابع get را فراهم کند که شایع ترین مورد است. auto [a, b] = myPair; // binds myPair.first/second به عبارت دیگر، شما می‌‌توانید کلاس‌های خود را پشتیبانی کنید، با فرض این که شما تابع get را در پیاده سازی رابط کلاس خود اضافه کرده باشید. اگر مقدار دهی اولیه فقط شامل اعضای عمومی شود در این صورت: struct S { int x1 : 2; volatile double y1; }; S f(); const auto [ x, y ] = f(); در حال حاضر این روش برای دریافت یک مرجع از یک عضو tuple آسان است. auto& [ refA, refB, refC, refD ] = myTuple; و یکی از جالب‌ترین استفاده‌‌ها (پشتیبانی از حلقه‌ها است): std::map myMap; for (const auto & [k,v] : myMap) { // k - key // v - value } پیوند ساختاری یا تقسیم بندی اعلان‌ها برای این ویژگی، ممکن است شما نام های دیگری را دیده باشید، "اعلان تجزیه". همانطور که می‌‌بینیم، این دو نام در نظر گرفته شده است، اما فعلاً استاندارد سازی در حالت پیش‌نویسه است و با نام "پیوند‌های ساختاری" می‌‌باشند. جزئیات بیشتر در رابطه با این مورد در اسناد P0217R3، P0144R0 و P0615R0 موجود هستند. همچنین این مورد با کامپایلر‌‌های GCC 7.0،MSVC2017 و Clang 4.0 سازگار است. عبارت Init-statement برای if/switch نسخه جدید عبارت شرطی if و switch در سی‌پلاس‌پلاس جدید به صورت زیر است: if (init; condition) , switch (init; condition) قبلاً باید به صورت زیر می‌نوشتیم: { auto val = GetValue(); if (condition(val)) // on success else // on false... } در اینجا val یک دامنه جدا کننده بدون دارد که باعث "نشت - فقدان" در خاتمه دهنده دامنه خواهد شد. در حالی که شما در نسخه جدید می‌‌‌توانید به صورت زیر بنویسید: if (auto val = GetValue(); condition(val)) // on success else // on false... متغیر val تنها در داخل عبارات if و else قابل رویت است، بنابراین آن یک "نَشت" نخواهد داشت. condition ممکن است چندین عبارت باشد نه تنها if بنابراین متغیر val یکی از دو مقدار true/false را خواهد داشت. چرا این ویژگی کاربرد دارد؟ اجازه دهید تا به شما بگوییم زمانی که می‌خواهید چندین چیز را در یک رشته را جستجو کنید به صورت زیر خواهید داشت: const std::string myString = "My Hello World Wow"; const auto it = myString.find("Hello"); if (it != std::string::npos) std::cout << it << " Hello\n" const auto it2 = myString.find("World"); if (it2 != std::string::npos) std::cout << it2 << " World\n" ما باید از نام‌‌های مختلفی برای it استفاده کنیم و یا اینکه آن را با دامنه خاتمه دهنده جدا سازیم. { const auto it = myString.find("Hello"); if (it != std::string::npos) std::cout << it << " Hello\n" } { const auto it = myString.find("World"); if (it != std::string::npos) std::cout << it << " World\n" } عبارت جدید شرطی if در نسخه جدید یک دامنه اضافه را در یک خط ایجاد می‌‌کند. if (const auto it = myString.find("Hello"); it != std::string::npos) std::cout << it << " Hello\n"; if (const auto it = myString.find("World"); it != std::string::npos) std::cout << it << " World\n"; همانطور که قبلاً اشاره شده است، متغیر تعریف شده در عبارت شرطی if در بلوک دیگری قابل مشاهده است. بنابراین شما می‌‌تواین به صورت زیر بنویسید: if (const auto it = myString.find("World"); it != std::string::npos) std::cout << it << " World\n"; else std::cout << it << " not found!!\n"; به علاوه، شما می‌‌توانید آن را با پیوند ساختاری بر اساس کد نمونه از جانب (Herb Sutter) استفاده کنید: // better together: structured bindings + if initializer if (auto [iter, succeeded] = mymap.insert(value); succeeded) { use(iter); // ok // ... } // iter and succeeded are destroyed here جزئیات بیشتر در اسناد زیر آمده است: سند P0305R1 ویدیو موجود در یوتیوب با عنوان (C++ Weekly - Ep 21 C++17’s if and switch Init Statements) این مورد با کامپایلر‌های GCC 7.0،MSVC-2017.3 و Clang 3.9 سازگار است. متغیرهای درون خطی (inline) با شروع مقدار دهی داده‌های غیر استاتیک، اکنون می‌‌توانیم یک متغیر عضو را دی یک مکان اعلام کنیم. با این حال، با متغیر‌های استاتیک یا const static، معمولاً باید آن را در برخی از فایل‌های cpp تعریف کنید. در سی‌پلاس‌پلاس ۱۱ و کلید واژه constexpr که مارا قادر می‌سازد تا در یک مکان اعلان و تعریف متغیر‌های استاتیک را انجام دهیم، اما این امکان تنها به constexpr محدود می‌‌شود. قبلاً فقط روشها/توابع می‌‌توانستند به عنوان inline تعریف شوند، حالا شما می‌‌توانید این کار را با متغیر ها در داخل فایل هدر انجام دهید. یک متغیر اعلام شده درون خطی معنای مشاهبی دارد بنابراین همانند یک تابع inline تعریف می‌‌شود. آن را می‌‌توان به واحد‌های ترجمه چند گانه نیز تعریف کرد. مثال‌‌های زیر را ببینید: struct MyClass { static const int sValue; }; inline int const MyClass::sValue = 777; و حتی struct MyClass { inline static const int sValue = 777; }; همچنین توجه داشته باشید که متغیر‌های constexpr به طور ضمنی inline هستند، بنابراین نیازی به استفاده به صورت constepr inline myVar = 10; نمی‌‌باشد. این ویژگی چرا کد را ساده تر می‌‌کند؟ برای مثال، تعداد زیادی از هدرها در کتابخانه تنها تعدادی از روش های (هک‌) را محدود می‌‌کنند (مانند استفاده توابع درون خطیinline و یا قالب ها) و در نهایت مزیت constexpr این است که مقدار دهی اولیه شما نباید constexpr باشد. جزئیات بیشتر در رابطه با این ویژگی در سند زیر موجود است: سند P0386R2 این مورد با کامپایلر‌های GCC 7.0 و Clang 3.9 سازگار است اما فعلاً با MSVC سازگاری ندارد. ویژگی مربوط به constexpr if ممکن است در بعضی جاها به قابلیت std::enable_if در سی‌پلاس‌پلاس ۱۴ نگاه کنید که آن به راحتی با constexpr if جایگزین می‌شود. بنابراین، در اکثر موارد، ما اکنون می‌‌توانیم تنها با نوشتن عبارت یک constexpr if این کار را بهتر و تمیز تر انجام دهیم. این ویژگی برای برنامه نویسی metaprogramming/template بسیار مهم است که احتمالاً طبیعت آن بسیار پیچیده خواهد بود. یک مثال ساده با تابع Fibonacci: template<int N> constexpr int fibonacci() { return fibonacci<N-1>() + fibonacci<N-2>(); } template<> constexpr int fibonacci<1>() { return 1; } template<> constexpr int fibonacci<0>() { return 0; } حال می‌‌توان آن را تقریباً در یک حالت نرمال (نسخه بدون کامپایل) نوشت: template<int N> constexpr int fibonacci() { if constexpr (N>=2) return fibonacci<N-1>() + fibonacci<N-2>(); else return N; } در رویداد ۱۸ هم جلسات هفتگی سی‌پلاس‌پلاس در جیسون ترنر نمونه‌‌ای را می‌‌توان یافت که در آن عبارت constexpr if هیچ منطق اتصال کوتاهی را در زمان کامپایل انجام نمی‌‌‌دهد، بنابراین این کد باید کامپایل شود: if constexpr (std::is_integral<T>::value && std::numeric_limits<T>::min() < 10) { } در کد فوق برای T شما در std::strin‌g خطایی کامپایل را دریافت خواهید کرد زیرا numeric_limits برای رشته ها تعریف نشده اند. در جلسات C++NOW 2017 آقای Bryce Leblbach با عنوان جلسه خود C++17 Features در ۱۶ دقیقه مثال بسیار زیبایی را در رابطه باconstexpr if زد که می‌‌تواند برای تابع get استفاده شود که آن برای پیوند ساختاری مورد استفاده قرار می‌‌گیرد. struct S { int n; std::string s; float d; }; template <std::size_t I> auto& get(S& s) { if constexpr (I == 0) return s.n; else if constexpr (I == 1) return s.s; else if constexpr (I == 2) return s.d; } قبلاً ما باید به صورت زیر می‌‌نوشتیم: template <> auto& get<0>(S &s) { return s.n; } template <> auto& get<1>(S &s) { return s.s; } template <> auto& get<2>(S &s) { return s.d; } همانطور که می‌‌بینید، مشکل سوال برانگیز اینجاست که کد در این جا ساده تر است. اگر چه در این مورد فقط از یک ساختار ساده استفاده شده است، با برخی از نمونه های واقعی دنیا، کد نهایی باید بسیار پیچیده تر از این باشد بنابراین باید constexpr if کد تمیز تری نسبت به این مورد باشد. این مورد با کامپایلر‌های GCC 7.0،MSVC-2017.3 و Clang 3.9 سازگار است. ویژگی‌های دیگر ما می‌‌توانیم در رابطه با بسیاری از ویژگی های جدید سی‌پلاس‌پلاس صحبت کنیم اما در این پست ما بیشتر در رابطه با قطعات بزرگتر تمرکز کرده‌‌ایم. با این حال، فقط برای یادآوری، ممکن است بخواهید ویژگی‌‌های زیر را در نظر بگیرید که آنها نیز کد ها را ساده تر می‌کنند: قالب‌ (template) عبارت Fold الگو برای کلاس ها بنابراین برای ذکر ویژگی‌‌های بیشتر در رابطه با نسخه جدید در پستهای آن ها را پوشش خواهیم داد. شک نکنید که، سی‌پلاس‌پلاس ۱۷ پیشرفت واقعی را در برابر کد های جمع و جور و آسان فراهم گرده است. یکی از بهترین چیزها constexpr است که آن به ما اجازه می‌دهد کد template/metaprogramming را به روش کد استاندارد شده بنویسیم. این یک مزیت بسیار بزرگی است. ویژگی دوم: پیوند ساخت یافته (که حتی برای حلقه ها کار می‌‌کند) مانند حسی را القا می‌‌کند که در زبان‌های پویایی مثل Python وجود دارد. همانطور که می‌‌بینید، تمام ویژگی‌های ذکر شده در حال حاضر در Clang، MSVC و GCC قابل اجرا هستند. اگر شما با نسخه های اخیر این کامپایلر ها کار می‌کنید می‌تواین بلافاصله با سی‌++ ۱۷ کار کرده و آن را تجربه کنید.
  23. 1 امتیاز
    اگر QByteArray شما بایت هایی از نوع int هست می تونید با استفاده از memcpy این تبدیل را انجام بدید. int array[100]; QByteArray numbers(100*sizeof(int),0); memcpy(array,numbers.data(),numbers.count()); ویا اگر بعد از تبدیل نمی خواهید که آرایه را ویرایش کنید یعنی می تونید با کست reinterpret_cast به یک آرایه تبدیل کنید(البته کار خطرناکی هست به این علت که reinterpret_cast یک بلاک از حافظه را بدون هیچ ملاحضه ای به یک نوع بلاک دیگه تبدیل میکنه به همین علت باید آرایه را const تعریف کنید.) const int* array=reinterpret_cast<const int*>(numbers.constData()); و البته می تونید از کلاس استریم هم استفاده کنید و مقادیر را به استریم دیتا تبدیل کنید وبعد هم می تونید به هر منبع دیگه ای که خواستید write کنید با استفاده از عملگر های (<< و >>) QByteArray line; QDataStream stream(&line, QIODevice::WriteOnly); stream << y; والبته اگر با C++11 به بعد کد می زنید و به کلاسهای الگوریتم آشنایی دارید می تونید از std::copy هم استفاده کنید #include <algorithm> #include <iostream> #include <vector> #include <iterator> #include <numeric> int main() { std::vector<int> from_vector(10); std::iota(from_vector.begin(), from_vector.end(), 0); std::vector<int> to_vector; std::copy(from_vector.begin(), from_vector.end(), std::back_inserter(to_vector)); std::copy(to_vector.begin(), to_vector.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << '\n'; }
  24. 1 امتیاز
    زمان همیشه به عنوان یک فاکتور اساسی و حساس در پروژه‌ها به حساب می‌آید. در این مقاله قصد داریم ببینیم که چگونه می‌توانیم 90 درصد از وقت خود را طی جریان پروژه صرفه جویی کنیم. یکی از ابزارهایی که برای این منظور وجود دارد، Figma است. با استفاده از این ابزار در طول فرآیند طراحی UI/UX می‌توانیم چندین ساعت در کارمان صرفه‌جویی داشته باشیم و جریان طراحی را عمیقا متحول کنیم. Figma علاوه بر بصری بودن، یک پکیج کامل است که قابلیت کار بر روی تمامی مراحل فرآیند طراحی را برای ما فراهم می‌سازد: رسم وایرفریم‌ها، طراحی، طراحی سیستم‌ها، نمونه‌سازی و طراحی مشارکتی. هدف از این مقاله آموزش نحوه‌ی استفاده از Figma نیست؛ بلکه می‌خواهیم به شما نشان دهیم که چگونه می‌توانید چندین ساعت زمان را در پروژه‌ی بعدی خود با یک ترفند ساده ذخیره کنید. این امر به خاطر وجود ویژگی‌ای از Figma به نام اجزا یا مولفه‌ها (Components) تحقق می پذیرد. components in Figma اجزا در Figma شباهت زیادی به نمادها (Symbols) در Sketch دارد. اما اجزای موجود در ابزار Figma بسیار انعطاف پذیر و استفاده از آن‌ها آسان‌تر است. اگر در مورد اجزا اطلاعات زیادی ندارید، توصیه می‌کنم این مقاله را با دقت مطالعه کنید. Figma‌ چگونه به ما در صرفه‌جویی زمان کمک می‌کند؟ حال ببینیم فرآیند طراحی سنتی در مقایسه با فرآیند طراحی در Figma چگونه به نظر می‌رسد. فرآیند فرآیند سنتی یا کلاسیک ساده‌ترین فرآیند کلاسیک، ساخت یک وایرفریم در برنامه‌ای مانند Balsamiq است. سپس می‌توان طرح را در یک برنامه‌ی دیگری مانند Sketch ساخت و در برنامه‌ای چون InVision نمونه‌‌ی اولیه را ایجاد کرد. این روند یک روند تعاملی نیست، زیرا علاوه‌ بر اتلاف وقت زیاد، باعث به وجود آمدن شکاف بزرگی بین وایرفریم و نمونه‌سازی می‌شود. فرآیند طراحی در Figma با استفاده از Figma، شما از 2 مرحله پرش کرده، وایرفریم‌های تعاملی خود را رسم و هم زمان یک کتابخانه‌ی رابط کاربری ایجاد می‌کنید. سپس اجزا رIبط کاربری را به‌روز می‌کنید که قبلا وقت ارزشمندتان را برای ایجاد یک نمونه اولیه هدر می‌کردید! در واقع شما وایرفریم‌های خود را با استفاده از اجزا از ابتدا می‌سازید. پس از تایید وایرفریم‌ها، تنها چیزی که نیاز دارید به‌روز کردن اجزا است. این کار اشکال سفید و سیاه پایه‌ای شما را به اجزای طراحی شده‌ی دقیق تبدیل می‌کند. به بیان دیگر وایرفریم‌های شما به یک نمونه‌ی اولیه با وضوح و جزییات بیشتر تبدیل می‌شوند. چگونه کار می‌کند؟ این کار در ۴ مرحله انجام می‌شود که در زیر آورده شده است. مرحله‌ی۱. وایرفریم‌های خود را بسازید. قبل از این مرحله، شما باید طرح خود را روی کاغذ کشیده باشید. حال زمان آن فرا رسیده که آن‌ها را ب‌‌‌ م‌های دیجیتال منتقل کنید. پیش از شروع طراحی، اولین کاری که باید انجام دهید ایجاد یک قالب کتابخانه‌ی رابط کاربری (UI library frame) است. تمام اجزای رابط کاربری قابل استفاده‌ی مجدد و دستورالعمل های شما در این قالب قرار می‌گیرند. اولین مولفه‌هایی (Components) که باید ایجاد کنید سبکهای متن شماست. برای هر سبک (H1، H2، H3، H4، P، کوچک، و غیره) یک جز ایجاد کنید. از فونت‌ها همان گونه که هستند استفاده کنید و فعلا در مورد طراحی فکر نکنید. هر سبک متن یک جز است حال، هر زمان که می‌خواهید متنی را به صفحه اضافه کنید، یک نمونه از مولفه‌ی متن در کتابخانه‌ی رابط کاربری را می‌گیرید. چرا؟ هنگامی که شما به مرحله‌ی طراحی ‌‌‌‌‌می‌روید و می‌خواهید سبک فونت را برای تمامی صفحه‌های خود تغییر دهید، آن را یک بار از همین جا تغییر می‌دهید و در همه جا به‌روز می‌شود. کمی بعد کاملا متوجه خواهید شد. این مفهوم به تمامی مولفه‌های دیگر شما قابل تعمیم است. یک نمونه کتابخانه‌ی رابط کاربری تمامی اشیا (Objects) از جمله Buttons، Inputs، Dropdowns، Navbars، Cards، Labels، Footers را هم دقیقا مانند اجزا ایجاد کنید. همچنین می‌توانید ابتدا شی را روی صفحه‌ی نمایش ایجاد کنید سپس آن را به کتابخانه‌ی خود بکشید و به یک جز تبدیل کنید و سپس دوباره در صفحه کپی کنید. نمونه‌ای از وایرفریم‌ها در پایان پروژه، تقریبا هر شی‌ای که در طرح‌ها‌ ایجاد می‌کنید، باید یک جز باشد. این کار نه تنها در صرفه‌جویی زمان به شما کمک می‌کند، بلکه هماهنگی را در محصول شما حفظ می‌کند که یک نکته‌ی کلیدی مهم در طراحی رابط کاربری و تجربه‌ی کاربری است. مرحله‌ی۲. وایرفریم‌های خود را تعاملی کنید. پس از رسم وایرفریم‌ها و ایجاد کتابخانه، زمان تعاملی کردن وایرفریم‌ها رسیده است. خوشبختانه، وجود Figma انجام این کار را بسیار ساده کرده است. تمام چیزی که نیاز دارید کشیدن هر شی به صفحه مرتبط با خود در حالت نمونه‌ی اولیه است. همان طور که در زیر می‌بینید، اتصال مولفه‌های اصلی همان لینک را به تمام نمونه های آن اعمال می‌کند. تعاملی ساختن وایرفریم‌ها گام بعدی این است که وایرفریم‌های تعاملی خود را با ذینفعان به اشتراک بگذارید و نظرات خود را با اضافه کردن در نمونه‌ی اولیه به طور مستقیم دریافت کنید. پس از چندین دوره‌ی تکرار، وایرفریم‌های شما باید تایید شوند. مرحله‌ی 3. سبک سیستم طراحی خود مشخص کنید. هنگامی که وایرفریم‌های تعاملی شما تایید شدند، اکنون می‌توانید سبک سیستم طراحی خود را تعیین کنید. در این مرحله، شما دستورالعمل طراحی برند، رنگ و جزییات طراحی را به اجزای ساخته شده در کتابخانه اضافه می‌کنید. این مرحله به طور کامل وایرفریم‌های شما را به یک نمونه‌ی اولیه‌ی طراحی با وضوح و جزییات بالا تبدیل می‌کند. تغییر سبک در یک جز در همه‌ی نمونه های آن اعمال میشود بهتر است ابتدا راهنمای سبک را به ذینفعان نشان دهیم تا بازخوردی در مورد حالت و سبک طراحی قبل از نمایش همه‌ی صفحات به دست آوریم. اضافه کردن تعدادی مولفه در حضور آن‌ها می‌تواند به درکشان از چگونگی طراحی هر مولفه کمک کند. یک کتابخانه‌ی رابط کاربری پایه‌ای مرحله‌ی 4. نمونه‌ی اولیه‌ی خود را نهایی کنید. هنگامی که راهنمای سبک تایید شد، تنها چیزی که باقی می‌ماند، بهتر کردن نمونه‌ی اولیه است. در این مرحله می‌توانید مطمئن شوید که همه چیز در جای خود قرار دارد. ممکن است اشیایی وجود داشته باشند که اجزایی نیستند که باید طراحی شوند یا اجزا مورد نیاز باشند. حتما نمونه‌ی اولیه را اجرا کرده و لینک‌ها را امتحان کنید تا مطمئن شوید که تمامی پیوندها به درستی کار می‌کنند. نمونه‌ی اولیه نمونه‌ی اولیه آماده است! اکنون می‌توانید یک لینک را با سهام‌دار برای گرفتن تایید نهایی به اشتراک بگذارید. سپس، این نمونه‌ی اولیه را به توسعه‌دهندگان ارسال کنید و به آن‌ها نشان دهید که چگونه می‌توانند تصاویر را در Figma بررسی و استخراج کنند. همچنین توسعه‌دهندگان می‌توانند هر گونه سوال مستقیمی که از نمونه‌ی اولیه دارند بپرسند. اضافه کردن نظر در نمونه‌‌ی اولیه شما همچنین می‌توانید یک لینک عمومی برای تست نمونه‌ی اولیه‌ی خود با دیگر کاربران به اشتراک بگذارید و یک بازخورد کلی به دست آورید. امیدوارم به کمک این ابزار بتوانید با سرعت بیشتری فرآیند طراحی را خود را پیش ببرید.
  25. 1 امتیاز
    من که هیچوقت ازش استفاده نکردم چون کلا با qmake و cmake خیلی راحتترم. برادر کامبیز! اصلا فلسفه وجودی این Qbs چی بود؟
این صفحه از پرچمداران بر اساس منطقه زمانی تهران/GMT+03:30 می باشد
×