پرچمداران
-
در همه بخش ها
- همه بخش ها
- فایل
- دیدگاه فایل
- نقد و بررسی فایل
- مقالات
- مقاله دیدگاه
- مقاله نقد و بررسی
- صفحات استاتیک
- صفحه دیدگاه
- صفحه نقد و بررسی
- کتابخانهها
- کتابخانه دیدگاه
- کتابخانه نقد و بررسی
- رویداد
- دیدگاه های رویداد
- بازبینی رویدادها
- تصاویر
- دیدگاه های تصویر
- نقد های تصویر
- آلبوم ها
- نظر های آلبوم
- نقد های آلبوم
- پست ها
- نوشتههای وبلاگ
- دیدگاه های وبلاگ
- بروزرسانی وضعیت
- پاسخ های دیدگاه ها
-
تاریخ سفارشی
-
همه زمان ها
4 خرداد 1397 - 30 فروردین 1403
-
سال
29 فروردین 1402 - 30 فروردین 1403
-
ماه
28 اسفند 1402 - 30 فروردین 1403
-
هفته
23 فروردین 1403 - 30 فروردین 1403
-
امروز
30 فروردین 1403
-
تاریخ سفارشی
دوشنبه, 22 بهمن 1397 - دوشنبه, 22 بهمن 1397
-
همه زمان ها
مطالب محبوب
در حال نمایش مطالب دارای بیشترین امتیاز در دوشنبه, 22 بهمن 1397 در همه بخش ها
-
1 امتیازپردازندهها چگونه طی ۴۰ سال گذشته تغییر کردهاند؟ پردازندهها از پیدایش تابهحال، درحالپیشرفت بودهاند و روزبهروز درکنار قدرتمندترشدن، مصرف انرژی آنها هم بهینهسازی شده است. اما این پیشرفتها چقدر بوده و در آینده چگونه خواهد بود؟ وقتی از طرحهای پیشرفت تکنولوژی، بهویژه قانون مور، صحبت بهمیان میآید، طرح «۳۵ سال از دادههای ریزپردازندهها» که آن را ام. هورویتز، اف. لابونت، اُ. شچم، کی. الوکتن، ال. هموند و سی. بَتِن جمعآوری کردهاند، میتواند یکی از طرحهای مهم باشد. بعدها، سی. مور هم اطلاعاتی به این پروژه اضافه کرد. این طرح را چه با خطوط پیشرفت و چه بدون آنها میتوان در جاهای مختلفی از اینترنت پیدا کرد؛ هرچند این طرح فقط تا سال ۲۰۱۰ کامل شده و در چند سال اخیر، کامل نشده است. برای بهروزکردن دادههای این طرح که هرچند درستبودن آن تا سال ۲۰۱۰ مشخص نیست، دادههایی از g3data و دادههای دیگری هم از پردازندههای AMD Opteron، پردازندههای Intel Xeon، پردازندههای Power7+ و Power8 مانند Xeon Phi به این طرح اضافه شدند. جزئیات این دادههای جدید را بهصورت خام میتوانید درون این فایل زیپ ببینید. نتیجهی این طرح عکس زیر است: درادامه، طرح بهروزشده را با طرح اصلی میتوانید مقایسه کنید. نکتهای جالبی که وجود دارد، این است که باتوجهبه اینکه عملکرد پردازش تکهستهای ازنظر کمّیّت مهم است، این مقدار پیوسته درحالپیشرفت بوده است. این افزایش نتیجهی مدیریت انرژی هوشمندانه و تنظیم دینامیک فرکانس کلاک (توربو) بوده است. در آینده، چه تغییراتی به وجود خواهد آمد؟ احتمالا فرکانس و انرژی مصرفی دستخوش تغییرات زیادی قرار نخواهند گرفت. بهبود بیشتر در ساختار کلاک ممکن است باعث افزایش تدریجی عملکرد تکهستهای پردازندهها شود که البته نمیتوان انتظار تغییر بزرگی داشت. دو نمونه از کمّیّتهای مهم، تعداد ترازیستورها و تعداد هستهها هستند. تا چه زمانی قانون مور ادامه خواهد داشت؟ این احتمال وجود دارد که در آیندهای نزدیک، افزایشی در تعداد هستهها را شاهد خواهیم بود؛ اما شاید تعداد ترانزیستورها تغییری اساسی نکنند. درحالحاضر، Haswell Xeon در صدر فهرست پردازندهها هستند که ۱۸ هستهی پردازشی دارند. بههرحال با وجود این پردازندهها، قانون امدال ما را به دنبالکردن همین الگوریتم ملزم خواهد کرد. پردازندهی Knight Landing Xeon Phis که بهزودی رونمایی خواهد شد، ۷۲ هسته دارد که بیش از ۶۱ هسته بیشتر از نسل کنونیاش خواهد داشت. از دیدگاه الگوریتمها، واقعا مهم نیست پردارنده با ۶۱ یا ۷۲ هسته کار میکند یا خیر؛ بلکه در هر دو مورد، الگوریتمهایی موازی موردنیاز هستند. در این مرحله، باید خوشحال باشیم که درحالحاضر، توانستهایم با یادگیری برنامهریزی GPUها این الگوریتمها را طراحی و اجرا کنیم. بهروزرسانی ۲۰۱۸ دو سال دادهی بیشتر بهنظر مهم نیست، هرچند بهنظر میرسد قانون مور درحال کمرنگشدن است. یکی از موضوعاتی که باید به آن اشاره کرد، این است که اینتل دیگر تعداد ترانزیستورهای پردازندههای خود را اعلام نمیکند. همچنین، تعدادی از پردازندههای این شرکت زمان زیادی بعد از موعد مقرر معرفی شدند. مدل Tick-Tock هم اصلاح شده است. با دادههایی از تعداد ترانزیستورها که از AMD Epyc و IBM Power 9 بهدستآمده طرح را بهصورت زیر بهروزرسانی کردهاند: واضح است تعداد ترانزیستورها بهصورت نموداری نمایی روبهپیشرفت بوده است. تابهامروز، پردازندهی AMD Epyc با ۱۹،۰۰۰،۰۰۰،۰۰۰ ترانزیستور که بهصورت عمومی اعلام شده، بیشترین تعداد ترانزیستور را در میان پردازندهها دارد. برای مقایسه باید گفت تراشهی پاسکال Nvidia GP100 درحدود ۱۵،۰۰۰،۰۰۰،۰۰۰ ترانزیستور دارد. با درنظرگرفتن این تعداد، این ارقام باهم سازگار هستند و جای شکی در تعداد ترانزیستورها وجود ندارد.بهزودی، با معرفی نودهای پردازشی ۱۰ نانومتری منطقی است که احتمال دهیم تا چند سال آینده، منحنی نمایی و روبهرشد تعداد ترانزیستورها پیشرفت خود را حفظ کند. تعداد ترانزیستور بیشتر موجب افزایش تعداد هستهها میشود. این درحالی است که پیشرفتی که در SpecINT برای محاسبه عملکرد تکهستهای قابل مشاهدهاست، مستقیما نتیجهی استفاده از کامپایلرهای Auto-Vectorization و Auto-Parallelization است.
-
1 امتیازدر این آموزش با کمک کتابخانهی chilkat که در اینجا معرفی شده است، وارد حساب کاربری خود در iostream میشویم!. فرم را میتوانید به سلیقهی خود طراحی کنید . که فرم ورود به این صورت است. کد: import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 import QtQuick.Dialogs 1.2 import QtQuick.Controls.Material 2.3 ApplicationWindow{ id:window width: 300 height: 350 title: "فرم ورود" visible: true flags: Qt.FramelessWindowHint | Qt.Window x: Screen.width / 2 - width / 2 y: Screen.height / 2 - height / 2 header: Label{ id: header color: "#fff" text: "iostream" font.family: "Times New Roman" font.pointSize: 40 topPadding: -5 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter background: Rectangle{ color: "#23ab85" } } Button { id: close x: 0 y: -6 width: 34 height: 45 icon.name: "close-icon" icon.source: "qrc:/cancel.png" icon.color: "red" highlighted: true Material.accent: Material.shade("#fff",Material.Shade100) onClicked: window.close() } Item { MessageDialog{ id:message title: "خطا" visible: false } anchors.fill: parent TextField { id: email x: 60 y: 30 width: 180 font.pointSize: 15 font.family: "Times New Roman" placeholderText: "نام کاربری یا ایمیل" Material.accent: Material.Green } TextField { id: password x: 60 y: 80 width: 180 font.pointSize: 15 font.family: "Times New Roman" placeholderText: "گذر واژه" Material.accent: Material.Green echoMode: TextField.Password } Button { id: _login x: 55 y: 140 width: 186 height: 50 text: "ورود " highlighted: true font.pointSize: 15 font.family: "Times New Roman" topPadding: 3 Material.accent: Material.shade("#3e4148",Material.Shade500) onClicked: { if(Login.login(email.text,password.text)){ userpanle._url=Login.panle() userpanle.visible=true } else{ message.text="ورود ناموفق بود!" message.visible=true } } } } footer: Label{ text: "جامعهی برنامهنویسان مٌدرن ایران" color: "#fff" height: 50 topPadding: -6 verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter font.pointSize: 18 font.family: "Times New Roman" background: Rectangle{ color: "#23ab85" } } UserPanle{id: userpanle; visible: false;} } اکنون یک کلاس ایجاد کنید که بتوانیم درخواستهای خود را ارسال کنیم!. در اینجا کلاس Login و دارای دو متد login و userPanel است. #ifndef LOGIN_H #define LOGIN_H #include <QObject> #include <QDesktopServices> #include <QUrl> #include <CkHttp.h> #include <CkHttpRequest.h> #include <CkHttpResponse.h> class Login : public QObject { Q_OBJECT public: explicit Login(QObject *parent = nullptr); Q_INVOKABLE bool login(const QString & email_username,const QString & password); Q_INVOKABLE QString userPanel(); signals: public slots: private: QString m_finalRedirectUrl; CkHttp m_http; }; #endif // LOGIN_H متد login دو آرگومان ورودی دریافت میکند: ۱.نام کاربری یا ایمیل 2. گذرواژه این درمورد بعضی از وبسایتها صدق نمیکند!.یعنی علاوه پُر کردن فیلدهای خواسته شده، فیلدهای دیگری را هم باید پُر کنید تا به شما اجازه ورود بدهند!. متد دوم مربوط به صحفهای است که ما درخواست کردهایم و نتیجه برگشت داده میشود!. در ادامه بیشتر توضیح خواهم داد. تابع login را به این صورت تکمیل میکنیم!. #include "login.h" #include <QDebug> Login::Login(QObject *parent) : QObject(parent) { if(m_http.UnlockComponent("30-day trial")!=true) qDebug()<<m_http.lastErrorText(); } bool Login::login(const QString &emailـusername, const QString &password) { m_request.AddParam("auth",emailـusername.toUtf8()); m_request.AddParam("password",password.toUtf8()); m_request.put_Path("/login"); CkHttpResponse* m_response; m_response= m_http.SynchronousRequest("www.iostream.ir",443,true,m_request); if(m_response->get_LastMethodSuccess()!=true) { qDebug()<<m_response->lastErrorText(); return false; } m_finalRedirectUrl= m_response->finalRedirectUrl(); userPanel(); delete m_response; return true; } QString Login::userPanel() { QDesktopServices::openUrl(QUrl(m_finalRedirectUrl)); // return m_finalRedirectUrl; } کلاس CkHttpRequest باید هر بار درخواستی را آماده، و سپس با متد SynchronousRequest از کلاس CkHttp ارسال کند. با استفاده از متد AddParam پارامتر های لازم را اضافه میکنیم، مرورگر خود را باز کنید وارد صحفهی ورود به حساب کاربری شوید، بر روی فیلد اول(نام کاربری یا ایمیل) کلیک راست کرده و گزینه Inspect را انتخاب کنید. تگ مربوط به این فیلد نمایش داده میشود. <input type="text" placeholder="نام کاربری یا ایمیل" name="auth" id="auth" value="*************"> و فیلد دوم(گذرواژه) هم به همین صورت. <input type="password" placeholder=" گذرواژه" name="password" id="password" value="********"> فرض بر این گرفته می شود شما با HTML آشنایی دارید!. متد AddParam دو ارگومان ورودی دریافت میکند: 1.نام فیلد 2.مقدار فیلد به ویژگی نام(name) دقت کنید، با این ویژگی و نامی که برای آن انتخاب میکنیم میتوانیم به مقدار(value) آن دسترسی داشته باشیم! پس ورودی اول متد AddParam برابر با نام فیلد میشود(auth) و ورودی دوم هم مقدار فیلد است، که در اینجا مقادیر از پارامترهای تابع login دریافت میشوند. با متد put_Path مسیر صحفهی مورد نظر را مشخص میکنیم، که صحفهی مورد نظر ما login/ است. از کلاس CkHttpResponse برای دریافت پاسخ استفاده میکنیم، هنگامی که ما درخواستی را ارسال میکنیم، یک پاسخ در قالب یک شئ از کلاس CkHttpResponse برگشت داده میشود. پاسخ میتواند موفقیت آمیز باشد یا نباشد! که این مورد میتواند با متد get_LastMethodSuccess بررسی شود. در نهایت درخواست خود را ارسال میکنیم! متد SynchronousRequest چهار آرگومان ورودی دریافت میکند: 1.نام میزبان 2.پورت ورودی 3.تایید کردن یا نکردن گواهینامهی ssl 4.درخواستی را که از قبل اماده کردهایم نام میزبان در این مثال www.iostream.ir است. پورت ورودی 443 است که پروتکل HTTPS از ان استفاده میکند. میتوانید تایید کنید که اطلاعات شما بصورت رمزنگاری شده فرستاده شوند یا نه. درخواستی را که از قبل اماده کردیم m_request. با استفاده از متد finalRedirectUrl اخرین صحفهای که کاربر منتقل شده است برگشت داده میشود، که در متغییر m_finalRedirectUrl ذخیره خواهد شد. اکنون می توانیم با استفاده از متد openUrl از کلاس QDesktopServices ادرس صحفهی ذخیره شده را در مرورگر باز کنیم!. یا میتوانید از WebEngineView در qml برای نمایش استفاده کنید. به این صورت: import QtWebEngine 1.7 import QtQuick.Window 2.3 Window{ width: 1000 height: 600 title: "userPanel" visible: true property string _url: "" WebEngineView{ anchors.fill: parent url: _url } }