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

وبلاگ‌ها

نوشته‌های ویژه

  • الهه انصاری

    ۷ گام برای تبدیل شدن به یک طراح موفق UI/UX

    توسط الهه انصاری

    «بخش اول» در این مطلب از تجربیات طراح موفق خانم Nicole Saidy استفاده خواهیم‌ کرد. ایشان بخاطر سوالات زیادی که از جانب برنامه‌نویسان متعدد، مدیران بازاریابی و افراد مختلف دیگری مطرح شده بود این مقاله را براساس تجربیات شخصی خود تنظیم کردند. ادامه‌ی مطلب را از زبان خودشان می‌شنویم. «چگونه شروع کنم؟» این سوال من را به زمانی می‌برد که برای اولین بار کار خود را آغاز کردم. 7 سال پیش، من در اولین روز اولین کار طراحی‌ام بودم. در مقابل یک فایل فتوشاپ خالی در iMac نشسته ام (در آن زمان یک کاربر ویندوز بودم) و سعی می‌کنم آنچه که مدیرم توضیح داد درک کنم. هیچ نظری ندارم که چگونه شروع کنم. خالی! قبل از رسیدن به این شغل، تازه از دانشگاه با مدرک چندرسانه‌ای فارغ التحصیل شده بودم. پس چرا چیزی در مورد طراحی نفهمیدم؟ خب، در دانشگاهها به ما طراحی عملی یاد نمی‌دهند. اکثر دورههای دانشگاه فقط ما را بصورت تئوری آموزش می‌دهند و گاهی اوقات به ما یاد می‌دهند که چگونه از ابزارهای طراحی مانند Adobe Suite استفاده کنیم. اما این کافی نیست - حتی نزدیک هم نیست. تمرین، یادگیری و خودآموزی تنها چیزی است که می‌تواند شما را به یک طراح بهتر تبدیل کند. 7 سال بعد از خودآموزی، من اکنون یک معلم طراحی و سخنران کنفرانس بین المللی هستم. اولین چیزی که باید بدانید این است: لازم نیست که با این استعداد متولد شوید. ما موجودات خارق العاده‌ای مانند تک‌ شاخ‌ها نیستیم. ما فقط قصد داشتیم طراح باشیم و هنرمندانه به دنیا آمدیم. طراحی، در مورد حل مشکلات است. این یک روند دائمی یافتن مشکلات و ایجاد راه حل برای آنهاست. حوزه‌های مختلفی برای طراحی وجود دارد: رابط کاربری، تجربه‌ی کاربری، طراحان محصول، طراحان گرافیکی، طراحان تعاملی، معمار ساختار اطلاعات و غیره. برای شروع تحقیق کنید که کدام حوزه شما را بیشتر جذب می‌کند. برای حال، روی رایج‌‌ترین حوزه تمرکز می‌کنیم: ترکیبی از رابط و تجربه: طراح رابط کاربری و تجربه‌ی کاربری. 1. خودتان را با اصول رابط کاربری آشنا کنید. قبل از شروع تمرین طراحی، اولین چیزی که نیاز دارید یادگیری برخی اصول طراحی است. در این مرحله، شما به دنیای طراحی قدم خواهید گذاشت و شروع به تفکر «خلاقانه» می‌کنید و جنبه‌های روانشناسی طراحی را خواهید آموخت: چرا این طرح می‌تواند خوب بنظر بیاید و یا شکست بخورد؟ برخی از اصول پایه‌ای که باید بدانید: 1. رنگ (Color) واژگان رنگ‌ها، اصول و روانشناسی رنگ را شامل می‌شود. ۲. تعادل (Balance) اصل تعادل به تقارن و عدم تقارن در مبحث طراحی می‌پردازد. 3. تضاد (Contrast) هدف از بکارگیری تضاد سازماندهی اطلاعات، ایجاد سلسله مراتب و ایجاد تمرکز است. ۴. تایپوگرافی (Typography)  انتخاب فونت مناسب و ایجاد متن قابل خواندن در وب با رعایت این اصل ممکن خواهد بود. ۵. ثبات و انطباق (Consistency) مهمترین اصل، جهت ایجاد طرح های بصری و قابل استفاده از ثبات شروع میشود.   ۲. فرآیند خلاقانه‌ی تجربه‌ی کاربری را فرا بگیرید. مورد بعدی درک فرآیند خلاقانه است. طراحی UI/UX فرآیندی متشکل از فازهای خاصی است که هر فرد خلاق از آن عبور می‌کند. این فرآیند شامل ۴ فاز مختلف کشف (Discover)، تعریف (Define)، توسعه (Develop) و تحویل (Delivery) است. فرآیند خلاقانه فاز کشف فاز کشف همان فاز شروع پروژه است که طراحان به جستجو، الهام گرفتن و جمع‌آوری ایده‌ها می‌پردازند. فاز تعریف در این مرحله، طراحان ایده‌ی حاصل از فاز کشف را تعریف و مشخص می‌کنند. در‌واقع خلاصه‌ای واضح از کاری که قرار است انجام بگیرد مشخص می‌شود. فاز توسعه فاز توسعه مرحله‌ای است که راه‌ حل‌ها یا مفاهیم ایجاد شده، نمونه‌سازی، تست و تکرار می‌شوند. این فرآیند آزمایش و خطا به طراحان کمک می‌کند تا ایده‌های خود را بهبود داده و اصلاح کنند. فاز تحویل فاز آخر فاز تحویل است که در آن پروژه‌ی پایانی، تولید و راه اندازی می‌شود. ۳. چشمان خود را برای طراحی تقویت کنید. دانستن اصول طراحی عالی است، اما گاهی اوقات کافی نیست. شما همچنین باید چشمان خود را آموزش دهید تا طراحی خوب و طراحی بد را ببینید و نقاط قوت و ضعف آن‌ها را مشخص کنید. موثرترین روش جهت آموزش چشم برای طراحی از طریق الهام است. قبل از باز کردن یک بوم خالی و تماشای آن برای نیم ساعت ، بدانید که تنها راه خلاق بودن از طریق تحقیق است. گاهی اوقات ذهن نمی‌تواند ایده‌های خودش را بسازد. ابتدا باید به طرح‌های دیگر نگاه کنید تا طرح خودتان را ایجاد کنید؛ مخصوصا زمانی که فعلا مبتدی هستید. در وب‌سایت‌های نمونه‌کار‌ها قدم بزنید:) بنابراین به آنچه که طراحان دیگر در سایت Dribbble انجام می‌دهند نگاه کنید و هر زمان که طرح‌های زیبا یا چیزی مربوط به پروژه‌ی خود را می‌بینید، آن را در یادداشت‌های خود ذخیره کرده و اشاره کنید که چه چیزی از آن طرح را پسندیده‌اید. همچنین می‌توانید با گرفتن اسکرین‌شات ذخیره‌سازی را دقیق‌تر انجام دهید. به این ترتیب، شما مجموعه‌ای از طرح‌های الهام بخش دارید که می‌توانید برای شروع کار از آن‌ها بهره ببرید. چند مورد از سایت‌های مفید جهت الهام گرفتن در زیر آورده‌شده‌اند:  onepagelove.com awwwards.com dribbble.com pttrns.com uimovement.com ۴. مطالعه‌ی مقالات طراحی را در برنامه‌ی روزانه‌ی خود بگنجانید. برای اینکه خودمان را با طراحی آشنا کنیم، بهترین راه این است که هر روز چند مقاله در این رابطه مطالعه کنیم. خواندن اخبار و وبلاگ‌های طراحی را عادت روزمره کنید. میلیون‌ها مقاله‌ بصورت آنلاین در دسترس ما هستند تا روند‌های جدید دنیا، مورد‌های کاربری (Use Cases) و آموزش‌های مختلف را فرا بگیریم. تمام کاری که باید انجام دهیم، پیدا کردن آنهاست. هیچ چیز بهتر از یادگیری از تجربه‌های دیگران نیست. خواندن مقالات را عادت روزمره کنید بنابراین روز خود را با یک فنجان قهوه و چند مقاله‌ی الهام‌ بخش در مجلات آنلاین Medium یا Smashing شروع کنید. یادگیری چیزهای جدید در صبح، ذهنتان را گسترش داده و در طول روز فرصت خلاقیت را برایتان فراهم میکند. بنابراین، هر چند وقت یکبار در طول روز، چندین بار به خود استراحت بدهید تا بتوانید بیشتر مطالعه کنید. استراحت کردن برای خلاقیت خیلی مهم است، به ویژه هنگامی که ذهن شما گیر کرده و احساس می‌کنید که بازدهی مطلوب را ندارید. از جمله کارهای قابل انجام دیگر می‌توانید وب‌سایتی را که به عنوان صفحه‌ی اصلی مرورگر خود دوست دارید، نشانه‌گذاری کنید و یا از یک خبرنامه‌ی طراحی اشتراک بگیرید. برخی از وبلاگ‌ها و سایت‌های خبری محبوب در زمینه‌ی طراحی عبارتند از: blog.marvelapp.com medium.com/design smashingmagazine.com webdesignernews.com sitepoint.com/design-ux 5. پروژه‌های غیرواقعی طراحی کنید. کار نیکو کردن از پر کردن است و همه می‌دانیم که نمی‌توانیم بدون تجربه، مشتری یا شغلی را بدست آوریم. اما بدون یک کار یا پروژه هم نمی‌توانیم تمرین کنیم و تجربه کسب کنیم، درست است؟ بنابراین می‌توانیم این چرخه را با تمرین کردن و ایجاد پروژه‌های غیر واقعی برای سرگرمی بشکنیم! Dribbble پر از این نمونه کارها است. طراحی فیسبوک توسط Kevin McCarthy زمانی را صرف طراحی مجدد وب‌ سایت یا اپلیکیشنی که قبلا استفاده کرده‌اید کنید. این کار را برای هر چیزی که فکر می‌کنید می‌تواند بهتر شود، انجام دهید. همچنین می‌توانید ایده‌ی برنامه‌ی خود را طراحی کنید. درواقع با طراحی نمونه‌ کارها تمرین کرده و تجربه کسب می‌کنید.   ۶. کار با آخرین ابزار طراحی وب را بیاموزید. هزاران ابزار طراحی وجود دارد، اما شما نیاز ندارید که کار با همه‌ی آنها را یاد بگیرید. بهترین آن‌ها را بیابید، ابزارهای مورد علاقه‌ی خود را انتخاب کنید و با بکار گیری جدیدترین ویژگی‌ها و روندها به‌ روز باشید. جدیدترین ابزارهایی که در فرآیند طراحی خود استفاده می‌کنم در زیر آورده‌ شده‌اند: Sketch برای طراحی رابط کاربری Figma برای طراحی رابط مشترک Balsamiq برای رسم وایرفریم‌های با جزيیات کم و ابتدایی (low fidelity wireframing) Adobe XD برای طراحی رابط کاربری و نمونه‌سازی Marvel App برای ساخت مدل‌های تعاملی Invision App برای نمونه‌سازی و همکاری   7. از مربی (mentor) کمک بگیرید. یکی دیگر از روش‌های عالی برای یادگیری طراحی، یافتن یک مربی طراحی یا دوست طراح است که مایل به کمک است. آنها به شما کمک میکنند که روند یادگیری خود را سرعت بخشید. طراح کار شما را بررسی و نظرات خود را هر زمان که ممکن باشد می‌دهد. این کار مثل یک میانبر عمل می‌کند. آنها همچنین راهنمایی‌ها و ترفندهایی به شما می‌دهند که از تجربیات خود آموخته اند. بنابراین پیش بروید و به یک طراح ایمیل بفرستید، سوالات و نگرانی‌های خود را با وی مطرح کنید. هنگامی که شما آماده‌ی صحبت در مورد طراحی با دیگران هستید، می‌توانید کسی را در مورد طراحی راهنمایی کنید و یا آموزش دهید. همچنین یاد خواهید گرفت که آن را  دیدگاه‌های مختلف ببینید و بازخورد و پاسخ سوالاتی را دریافت کنید که ممکن است هرگز در مورد آن‌ها فکر نکرده باشید. هنگامی‌که در مورد طراحی با افراد دیگری صحبت می‌کنید، ذهن شما همواره در‌حالت "طوفان فکری" قرار می‌گیرد و بیشتر از قبل به طراحی علاقه‌مند خواهید شد. منتظر بخش‌های بعدی با جزییات بیشتر در مورد اصول رابط کاربری باشید.
    • 1 دیدگاه
    • 741 مشاهده
  • فرهاد شیری

    امنیت در نرم افزارهای تولید شده با زبان ++C

    توسط فرهاد شیری

    با توجه به اهمیت امنیت نرم افزار، شرکت های بزرگ دنیا به ارائه راهکارهایی چون طراحی زبان ها و محیط های برنامه نویسی و مفسر و مترجم هایی با قابلیت های کنترل امنیتی بر روی سیستم عامل و بسیاری از راهکارهای دیگر پرداخته اند اما با توجه به عدم توانایی راهکارها در کنترل تمامی موارد امنیتی، عدم امکان پیاده سازی راهکارهای امنیتی بر روی برخی ساختارها، ایجاد محدودیت برای دسترسی به برخی منابع و امکانات و مشکلات کوچک و بزرگ دیگر برنامه نویسی یک برنامه به صورت ایمن بهترین راهکار برای محافظت از یک برنامه است. یکی از زبان هایی که در کنار محبوبیت در میان برنامه نویسان، همیشه یکی از زبان های پر بحث در برنامه نویسی ایمن بوده است، خانواده زبان های 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; } وبعد از مقدار دهی اولیه به آرایه ها خواهیم داشت ... ادامه خواهد داشت این مقاله...  
    • 0 دیدگاه
    • 290 مشاهده
  • کامبیز اسدزاده

    فرق بین کامپایل استاتیک و داینامیک

    توسط کامبیز اسدزاده

    فرق بین کامپایل استاتیک و داینامیک قبل از اینکه فرق بین ایستا (استاتیک) - Static و پویا (داینامیک) - Dynamic را بدانیم لازم است در رابطه با چرخه‌ی زندگی نوشتن یک برنامه و اجرای آن آشنا شویم. هر برنامه برای اولین بار توسط یک محیط توسعه (Editor) یا IDE توسط برنامه‌نویسان انتخاب و به صورت فایل متنی قابل ویرایش می‌باشد. سپس فایل متنی که شامل کد‌های نوشته شده توسط برنامه‌نویس تحت زبان برنامه‌نویسی مانند C، C++ و غیره... می‌باشد توسط کامپایلر به کد شیء ای تبدیل می‌شود که ماشین بتواند آن را درک کرده و اجرا کند. برنامه ای که ما می‌نویسیم ممکن است به عنوان یک مورد توسط دیگر برنامه ها یا کتابخانه‌هایی از برنامه ها مورد استفاده قرار بگیرد برقراری ارتباط (پیوند‌کردن - لینکر) یا همان لینک کردن پروسه‌ای است که برای اجرای موفقیت آمیز برنامه‌های نوشته شده ما بکار می‌رود؛ برقراری ارتباط بین ایستا و پویا دو پروسه‌ای از جمع‌آوری و ترکیب فایل‌های شیء‌های مختلفی است که به منظور ایجاد یک فایل اجرایی می‌باشند. در این بخش ما تصمیم بر این داریم تا تفاوت بین آن ها را با جزئیات مورد بررسی قرار دهیم. عمل پیوند یا ترکیب در زمان کامپایل انجام شود، در واقع زمانی که کد منبع به زبان ماشین ترجمه می‌شود، در زمان بارگذاری، زمانی که برنامه در داخله حافظه بارگذاری می‌شود، و حتی زمان اجرای آن توسط برنامه صورت می‌گیرد این عمل زمان پیوند و یا ترکیب (اتصال) است. در نهایت این فرآیند توسط برنامه ای اجرا می شود که به آن لینکر - پیوند دهنده (ترکیب کننده) می‌گویند. اتصال دهنده ها به عنوان ویرایستار لینک نیز معرفی می‌شوند. لینک شدن (پیوند شدن) به آخرین مرحله از کامپایل می‌گویند. در زبان علمی اصطلاح لینکر یا Linker معروف است اما در زبان فارسی بهترین گزینه مربوطه را می‌توان با عنوان اتصال دهنده، پیوند دهنده، ترکیب کننده نام برد. همه آن ها نشانگر یک هدف به منظور ترکیب اشیاء با یکدیگر هستند که در مرحله کامپایل صورت می‌گیرد. پس از ایجاد پیوند در برنامه، برای اجرای آن برنامه باید داخل حافظه منتقل شود. در انجام این کار باید آدرس هایی برای اجرای داده ها و دستور العمل ها اختصاص یابد. به طور خلاصه روند زیر می‌تواند به عنوان چرخه زندگی یک برنامه خلاصه شود (نوشتن - لینک کردن - بارگذاری - اجرا) فرق بین کامپایل استاتیک و داینامیک در زیر تفاوت های عمده ارتباط بین استاتیک و داینامیک آورده شده است : استاتیک  ارتباط به روش استاتیک فرآیندی است که تمامی ماژول‌ها و کتابخانه‌های برنامه در فایل اجرایی نهایی کپی می‌شوند. این روش توسط لینکر در مرحله آخر کامپایل انجام می‌شود. اتصال دهنده - لینکر طبق روال ترکیبی کتابخانه ها را با کد برنامه و همراه مراجع - منابع خارجی ترکیب کرده و برای تولید یک بارگذاری مناسب در حافظه آماده سازی می‌کند. زمانی که برنامه بار‌گذاری می‌شود، سیستم عامل محلی را در حافظه به صورت یک فایل اجرایی که شامل کد‌های اجرایی و داده ها می‌باشد مشخص می‌کند. ارتباط به شیوه‌ی استاتیک توسط برنامه‌ای با نام لینکر انجام می‌شود که در آخرین مرحله فرآیند کامپایل یک برنامه صورت می‌گیرد. لینکر‌ها نیز به عنوان ویرایشگر پیوند نیز عنوان می‌شوند. فایل های استاتیک به طور قابل توجهی دارای اندازه بسیار بزرگی هستند زیرا برنامه های خارجی و کتابخانه های لینک شده همه در یکجا و در فایل نهایی اجرایی جمع آوری شده‌اند. در اتصال استاتیک اگر هر یک از برنامه های خارجی تغییر کرده باشد باید آن ها دوباره کامپایل شوند و مجددا عمل اتصال صورت گیرد در غیر اینصورت هیچ تغییری در به روز رسانی های مرتبط با فایل اجرایی مشاهده نخواهد شد. برنامه‌های استاتیکی زمان بارگذاری ثابتی در هر بار اجرای برنامه در حافظه را در نظر می‌گیرند. و زمانی که برای بارگذاری طول می کشد ثابت است. برنامه‌هایی که از کتابخانه‌های استاتیکی استفاده می‌کنند معمولاً سریعتر از برنامه‌هایی هستند که کتابخانه‌‌ی آن‌ها به صورت پویا می‌باشد. در برنامه های استاتیکی، تمامی کد ها شامل یک فایل اجرایی می‌باشند. بنابراین، آن‌ها هرگز در برنامه هایی که دارای مشکلاتی هستند اجرا نخواهند شد. داینامیک در ارتباط پویا نام کتابخانه های خارجی (کتابخانه‌های به اشتراک گذاری شده) در فایل اجرایی نهایی قرار داده شده‌اند نه خود کتابخانه. در حالی که ارتباط واقعی در زمان اجرا در هر دو فایل در حافظه قرار می‌گیرند. اتصال پویا این اجازه را می‌دهند تا برنامه های متعددی به صورت یک ماژول کپی شده و قابل اجرا مورد استفاده قرار بگیرد. اتصال پویا بر خلاف اتصال استاتیک در زمان اجرا توسط سیستم عامل انجام می‌شود. در اتصال پویا فقط یک نسخه از کتابخانه به اشتراک گذاری شده در حافظه نگه‌داری می‌شود. این به طور قابل توجهی اندازه برنامه های اجرایی را کاهش می‌دهد، در نتیجه صرفحه جویی در حافظه و فضای دیسک صورت خواهد گرفت. در اتصال پویا بر خلاف اتصال استاتیک نیازی به کامپایل کامل پروژه نمی‌باشد در صورتی که لازم باشد تغییراتی در هر یک از فایل‌ها صورت بگیرد تنها کافی است آن را کامپایل و در کنار برنامه قرار دهید. این یکی از بزرگترین مزیت‌های کامپایل داینامیکی می‌باشد. در اتصال پویا زمان بارگذاری برنامه در حافظه ممکن است کاهش یابد. این در صورتی است که کتابخانه های مشترک در حافظه بارگذاری شده‌اند. برنامه‌هایی که از کتابخانه های مشترک استفاده می‌کنند معمولا کندتر از برنامه هایی هستند که از کتابخانه های استاتیکی استفاده می‌کنند. برنامه‌های پویا وابسته به داشتن کتابخانه‌های سازگار هستند. اگر کتابخانه تغییر یابد (برای مثال، یک کامپایلر جدید منتشر شود ممکن است کتابخانه را تغییر دهد)، در این صورت ممکن است برنامه مجدداً تحت کتابخانه جدید باز نویسی و به‌روز رسانی شوند. اگر کتابخانه از روی سیستم حذف شود، برنامه‌ای که وابسته آن کتابخانه می‌باشد دیگر کار نخواهد کرد. در ادامه شما می‌توانید در مورد مراحل کامپایل یک برنامه مراجعه کنید:  
    • 0 دیدگاه
    • 805 مشاهده

وبلاگ‌های سایت ما

  1. با سلام وقت بخیر,

    در این مطلب میخواهیم در مورد روش کارکرد پیام رسان ها بیشتر بدانیم و با یکدیگر کد یک پیام رسان ساده را پیاده و بررسی کنیم. 

    1200px-Client-server-model.svg.png

    طرز کار کرد پیام رسان

    در نظر داشته باشید که هر پیام رسانی که بر ساختار ها پیاده شده باشد از دو قسمت تشکیل شده است.

    1. نرم افزار اصلی برای مدیریت درخواست ها (سرور)
    2. نرم افزار برای کاربران (کاربر)

    به نرم افزار اولی سمت SERVER خواهیم گفت و به بعدی سمت CLIENT خواهیم گفت.

    روم یا تالار گفتگو

    ما تنها یک اتاق برای گفتگو در نظر میگیریم و هر کاربری که به سرور متصل شود را در همان تالار اضافه خواهیم کرد.

    تالار های گفتگو صرفا برای تقکیک سازی ارسال و دریافت ها و محدود کردن بازه ی کاربران مورد نظر... (ممکن است یک کاربر در چند اتاق بطور همزمان باشد.)

    سیستم های پیام رسان پیشرفته تر مانند تلگرام و ... تالار های زیادی را شامل می شوند. (هر کاربر خودش در کانال و گروه های مختلفی عضو است که هر کدام از آنها یک کانال متفاوت محسوب می شوند.)

    * دقت شود که منظور از کانال صرفا یک اتاق یا تالار گفتگو است و منظور کانال ارتباطی و پروتکل نیست.

    نرم افزار اصلی

    نرم افزار اصلی وظیفه دارد تا تمام کاربرانی که وارد تالار شده اند را به یاد داشته باشد و هر لحظه اماده دریافت درخواست هایی از طرف کاربرانش باشد. و پیام هایی را که از کاربران دریافت می کند برای تمامی کاربران دیگر هم ارسال کند که بسته به خلاقیت و نیاز می تواند هر یک از این بخش ها متفاوت طراحی شود.

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

    در نظر داشته باشید که اگر در نرم افزار اصلی اختلالی پیش بیایید و متوقف بشوند. قطا برای تمام کاربران مشکل پیش می آید. مگر اینکه از پایگاه های داده ی داخلی استفاده کرده باشند. (با خلاقیت می توان به گونه های متفاوتی چنین ساختاری را پیاده کرد)

    نرم افزار کاربران

    این نرم افزار جذاب ترین بخش است چرا تمام قابلیت هایی را که در اختیار کاربر قرار می دهیم را مستقیما طراحی می کنیم.

    در نظر داشته باشید که هر چیزی که در این نرم افزار طراحی می شود باید در نرم افزار اصلی پشتیبانی شوند... بنابراین اگر این دو بخش توسط دو فرد یا دو گروه مجزا طراحی می شوند آنها باید توسط داکیومنت ها و جلساتی به نظرات مشابه ای رسیده باشند. (اگرچه اینها تخصص و وظیفه ی تحلیلگر سیستم است! نه بطور همزمان وظیفه توسعه دهنده و برنامه نویس نرم افزار)

    پیاده سازی یک نمونه

    اکنون در نظر داریم تا با استفاده از ساختار کتابخانه BoostAsio پروژه ای را با نام BoostAsioChat ایجاد کنیم که در آن می خواهیم یک پیام رسان با حداقل ترین امکانات پایه طراحی کنیم که بیشتر جنبه شخصی و تفریحی دارد. زیرا از ساختار های استاندارد و ایمن و کاربری کاملا بدور است! (می توانید خودتان توسعه دهید و آنرا جالب تر بسازید)

     

    ساختار نرم افزار اصلی و سرور را به این صورت تعریف می کنیم :

    typedef deque<message> messageQueue;
    
    class participant {
        public:
            virtual ~participant() {}
            virtual void deliver(const message& messageItem) = 0;
    };
    
    typedef shared_ptr<participant> participantPointer;
    
    class room {
        public:
            void join(participantPointer participant);
            void deliver(const message& messageItem);
            void leave(participantPointer participant);
        private:
            messageQueue messageRecents;
            enum { max = 200 };
            set<participantPointer> participants;
    };
    
    class session : public participant, public enable_shared_from_this<session> {
        public:
            session(tcp::socket socket, room& room) : socket(move(socket)), room_(room);
            void start();
            void deliver(const message& messageItem);
        private:
            void readHeader();
            void readBody();
            void write();
            tcp::socket socket;
            room& room_;
            message messageItem;
            messageQueue Messages;
    };
    
    class server {
        public:
            server(boost::asio::io_context& io_context, const tcp::endpoint& endpoint) : acceptor(io_context, endpoint);
        private:
            void do_accept();
            tcp::acceptor acceptor;
            room room_;
    };
    
    int main(int argc, char* argv[]);

    ساختار نرم افزار کاربر را هم به این صورت تعریف می کنیم :

    typedef deque<message> messageQueue;
    
    class client {
        public:
            client(boost::asio::io_context& context, const tcp::resolver::results_type& endpoints) : context(context), socket(context);
            void write(const message& messageItem);
            void close();
        private:
            void connect(const tcp::resolver::results_type& endpoints);
            void readHeader();
            void readBody();
            void write();
            boost::asio::io_context& context;
            tcp::socket socket;
            message readMessage;
            messageQueue writeMessage;
    };
    
    int main(int argc, char* argv[]);

     

    در نظر داریم تا در این پروژه از thread ها نیز استفاده کنیم... در مورد این مفهوم ها می توانید بصورت مجزا تحقیق کنید.

    بنابراین روش کامپایل این پروژه به این صورت خواهد بود :

     

    $ g++ client.cpp -lpthread -o client
    $ g++ Server.cpp -lpthread -o server

     

    آزمایش

    همانطور که گفته شد در ابتدا نرم افزار اصلی و سرور باید اجرا شود.

    در اینجا ما تمام ارتباطات شبکه را بر روی یک سیستم در شبکه داخلی برقرار خواهیم کرد... پس نگرانی در مورد ساختار های درونی شبکه و آی پی / دی ان اس / دامین نخواهیم داشت.

    بنابراین ای پی را می توانید ای پی داخلی یا  localhost  در نظر بگیرید.

    برای آزمایش پورت فرضی 4000 را در نظر میگیریم و نرم افزار اصلی را روی این پورت اجرا میکنیم :

     

    $ ./server 4000

    در این مرحله متوجه می شوید که نرم افزار اصلی با موفقیت اجرا شده است و همچنان اجرا مانده است. بله درست است... نرم افزار اصلی هر لحظه باید منتظر دستور کاربران باشد.

    اگر لحظه ای برای نرم افزار اصلی اختلالی پیش آید نخواهد توانست دستورات کاربران را انجام یا پاسخ دهد.

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

    این نرم افزار را می توانید به تعداد دلخواه وارد کنید. (همانطور که ممکن است 6 نفر همزمان به سرور متصل باشند / یا ممکن است هیچ فردی به سرور متصل نشوند)

     

    ابتدا یک کاربری را به سرور با پورت 4000 و شبکه داخلی وصل می کنیم :

     

    $ ./client localhost 4000
    first user: you can type message here...

    حال در محیط دیگری با کاربر جدیدی نیز وارد می شویم :

    $ ./client localhost 4000
    second user: you can type message here...
    

    در این پروژه نمونه از کاربران نام کاربری یا نام نمی پرسیم.. و صرفا وقتی وارد محیط گفتگو می شوند... یا زمانی که به سرور متصل می شوند منتظر هستیم تا انها پیامی را بنویسند...

    هر پیامی را که بنویسند به سرور ارسال می شود و سرور وظیفه دارد تا آنرا برای تمام کاربران بفرستد. و این روند درون یک حلقه بی نهایت تکرار می شوند.

    پس این ارتباط دو طرفه خواهد بود و هم کاربران برای سرور اطلاعات ارسال می کنند و هم سرور برای کاربران اطلاعات ارسال خواهد کرد.

    در نظر داشته باشید که کاربر اول می تواند پیامی را بنویسد و به کاربران دیگر ارسال شود. ممکن است کاربر سومی اصلا تصمیمی به نوشتن پیام نداشته باشد و صرفا تمایل به خواندن پیام دیگران داشته باشند. و این کاملا اختیاری است. و ما کاربران را اجباری نمیکنیم. اگرچه شما می توانید با خلاقیت خودتان اینها را با متغییر های کمکی و دستورات شرطی پیاده کنید.

    کد ها

    برای پیام ها یک ساختار در نظر میگیریم و بصورت مشترک در هر دو نرم افزار استفاده خواهیم کرد... بنابراین اینرا در هدر پیاده خواهیم کرد.

    هدر پیام : (message.hpp)

    
    #ifndef message_HPP
        #define message_HPP
    
        #include <cstdio>
        #include <cstdlib>
        #include <cstring>
        using namespace std;
        class message {
            public:
                enum { headerLength = 4 };
                enum { maxBodyLength = 512 };
                message() : bodyLength_(0) {
                }
                const char* data() const {
                    return data_;
                }
                char* data() {
                    return data_;
                }
                size_t length() const {
                    return headerLength + bodyLength_;
                }
                const char* body() const {
                    return data_ + headerLength;
                }
                char* body() {
                    return data_ + headerLength;
                }
                size_t bodyLength() const {
                    return bodyLength_;
                }
                void bodyLength(size_t new_length) {
                    bodyLength_ = new_length;
                    if(bodyLength_ > maxBodyLength)
                        bodyLength_ = maxBodyLength;
                }
                bool decodeHeader() {
                    char header[headerLength + 1] = "";
                    strncat(header, data_, headerLength);
                    bodyLength_ = atoi(header);
                    if(bodyLength_ > maxBodyLength) {
                        bodyLength_ = 0;
                        return false;
                    }
                    return true;
                }
                void encodeHeader() {
                    char header[headerLength + 1] = "";
                    sprintf(header, "%4d", static_cast<int>(bodyLength_));
                    memcpy(data_, header, headerLength);
                }
            private:
                char data_[headerLength + maxBodyLength];
                size_t bodyLength_;
        };
    
    #endif
    

    نرم افزار اصلی و سرور : (server.cpp)

    #include <iostream>
    #include <cstdlib>
    #include <deque>
    #include <memory>
    #include <list>
    #include <set>
    #include <utility>
    #include <boost/asio.hpp>
    #include "message.hpp"
    using boost::asio::ip::tcp;
    using namespace std;
    typedef deque<message> messageQueue;
    class participant {
        public:
            virtual ~participant() {}
            virtual void deliver(const message& messageItem) = 0;
    };
    typedef shared_ptr<participant> participantPointer;
    class room {
        public:
            void join(participantPointer participant) {
                participants.insert(participant);
                for(auto messageItem: messageRecents)
                    participant->deliver(messageItem);
            }
            void deliver(const message& messageItem) {
                messageRecents.push_back(messageItem);
                while(messageRecents.size() > max)
                    messageRecents.pop_front();
                for(auto participant: participants)
                    participant->deliver(messageItem);
            }
            void leave(participantPointer participant) {
                participants.erase(participant);
            }
        private:
            messageQueue messageRecents;
            enum { max = 200 };
            set<participantPointer> participants;
    };
    class session : public participant, public enable_shared_from_this<session> {
        public:
            session(tcp::socket socket, room& room) : socket(move(socket)), room_(room) {
            }
            void start() {
                room_.join(shared_from_this());
                readHeader();
            }
            void deliver(const message& messageItem) {
                bool write_in_progress = !Messages.empty();
                Messages.push_back(messageItem);
                if(!write_in_progress)
                {
                write();
                }
            }
        private:
            void readHeader() {
                auto self(shared_from_this());
                boost::asio::async_read(socket,
                boost::asio::buffer(messageItem.data(), message::headerLength), [this, self](boost::system::error_code ec, size_t) {
                    if(!ec && messageItem.decodeHeader()) {
                        readBody();
                    }
                    else {
                        room_.leave(shared_from_this());
                    }
                });
            }
            void readBody() {
                auto self(shared_from_this());
                boost::asio::async_read(socket, boost::asio::buffer(messageItem.body(), messageItem.bodyLength()), [this, self](boost::system::error_code ec, size_t) {
                    if(!ec) {
                        room_.deliver(messageItem);
                        readHeader();
                    }
                    else {
                        room_.leave(shared_from_this());
                    }
                });
            }
            void write() {
                auto self(shared_from_this());
                boost::asio::async_write(socket, boost::asio::buffer(Messages.front().data(), Messages.front().length()), [this, self](boost::system::error_code ec, size_t) {
                    if(!ec) {
                        Messages.pop_front();
                        if(!Messages.empty()) {
                            write();
                        }
                    }
                    else {
                        room_.leave(shared_from_this());
                    }
                });
            }
            tcp::socket socket;
            room& room_;
            message messageItem;
            messageQueue Messages;
    };
    class server {
        public:
            server(boost::asio::io_context& io_context, const tcp::endpoint& endpoint) : acceptor(io_context, endpoint) {
                do_accept();
            }
        private:
            void do_accept() {
                acceptor.async_accept([this](boost::system::error_code ec, tcp::socket socket) {
                    if(!ec) {
                        make_shared<session>(move(socket), room_)->start();
                    }
                    do_accept();
                });
            }
            tcp::acceptor acceptor;
            room room_;
    };
    int main(int argc, char* argv[]) {
        try {
            if(argc < 2) {
                cerr << "Usage: server <port> [<port> ...]\n";
                return 1;
            }
            boost::asio::io_context io_context;
            list<server> servers;
            for(int i = 1; i < argc; ++i) {
                tcp::endpoint endpoint(tcp::v4(), atoi(argv[i]));
                servers.emplace_back(io_context, endpoint);
            }
            io_context.run();
        }
        catch (exception& e) {
            cerr << "Exception: " << e.what() << "\n";
        }
        return 0;
    }

    نرم افزار دوم و سمت کاربر : (client.cpp)

    
    #include <iostream>
    #include <thread>
    #include <cstdlib>
    #include <deque>
    #include <boost/asio.hpp>
    #include "message.hpp"
    using boost::asio::ip::tcp;
    using namespace std;
    typedef deque<message> messageQueue;
    class client {
        public:
            client(boost::asio::io_context& context, const tcp::resolver::results_type& endpoints) : context(context), socket(context) {
                connect(endpoints);
            }
            void write(const message& messageItem) {
                boost::asio::post(context, [this, messageItem]() {
                    bool write_in_progress = !writeMessage.empty();
                    writeMessage.push_back(messageItem);
                    if(!write_in_progress) {
                        write();
                    }
                });
            }
            void close() {
                boost::asio::post(context, [this]() { socket.close(); });
            }
        private:
            void connect(const tcp::resolver::results_type& endpoints) {
                boost::asio::async_connect(socket, endpoints, [this](boost::system::error_code ec, tcp::endpoint) {
                    if(!ec) {
                        readHeader();
                    }
                });
            }
            void readHeader() {
                boost::asio::async_read(socket, boost::asio::buffer(readMessage.data(), message::headerLength), [this](boost::system::error_code ec, size_t) {
                    if(!ec && readMessage.decodeHeader()) {
                        readBody();
                    }
                    else {
                        socket.close();
                    }
                });
            }
            void readBody() {
                boost::asio::async_read(socket, boost::asio::buffer(readMessage.body(), readMessage.bodyLength()), [this](boost::system::error_code ec, size_t) {
                    if(!ec) {
                        cout.write(readMessage.body(), readMessage.bodyLength());
                        cout << "\n";
                        readHeader();
                    }
                    else {
                        socket.close();
                    }
                });
            }
            void write() {
                boost::asio::async_write(socket, boost::asio::buffer(writeMessage.front().data(), writeMessage.front().length()), [this](boost::system::error_code ec, size_t) {
                    if(!ec) {
                        writeMessage.pop_front();
                        if(!writeMessage.empty()) {
                            write();
                        }
                    }
                    else {
                        socket.close();
                    }
                });
            }
            boost::asio::io_context& context;
            tcp::socket socket;
            message readMessage;
            messageQueue writeMessage;
    };
    int main(int argc, char* argv[]) {
        try {
            if(argc != 3) {
                cerr << "Usage: client <host> <port>\n";
                return 1;
            }
            boost::asio::io_context context;
            tcp::resolver resolver(context);
            auto endpoints = resolver.resolve(argv[1], argv[2]);
            client c(context, endpoints);
            thread t([&context](){ context.run(); });
            char line[message::maxBodyLength + 1];
            while(cin.getline(line, message::maxBodyLength + 1)) {
                message messageItem;
                messageItem.bodyLength(strlen(line));
                memcpy(messageItem.body(), line, messageItem.bodyLength());
                messageItem.encodeHeader();
                c.write(messageItem);
            }
            c.close();
            t.join();
        }
        catch (exception& e) {
            cerr << "Exception: " << e.what() << "\n";
        }
        return 0;
    }

     

     این پروژه آزمایشی بصورت رایگان و اوپن سورس در اینترنت بخصوص اینجا وجود دارد و می توانید آنرا مستقیما بصورت کامل دانلود کنید. 

     

    با تشکر,

    سید علی محمدیه

  2. مایکروسافت قصد دارد با اعمال فناوری گرافیکی سایه‌زنی با نرخ متغیر در DirectX 12 ضمن افزایش نرخ فریم همگام با افزایش کیفیت بصری، از الزامات سخت‌افزاری اجرای بازی‌ها بکاهد.

    _directx.jpg

    مایکروسافت فناوری سایه‌زنی با نرخ متغیر (Variable Rate Shading) را به DirectX 12 وارد کرده است. بدین ترتیب توسعه‌دهندگان با اتکا بر این نوع سایه‌زنی قادر خواهند بود سطح عملکرد در محیط‌های گرافیکی نظیر بازی‌ها را بهبود ببخشند، کیفیت بصری بازی را افزایش داده و منابع مورد نیاز سیستم برای اجرای بازی را کاهش دهند.

    مایکروسافت از توسعه‌دهنده‌ی بازی‌های ویدئویی Firaxis خواسته است که این نوع سایه‌زنی را در یکی از بازی‌های خود پیاده‌سازی کند تا نشان دهد که کاربرد روش VRS تا چه اندازه ساده و تأثیر آن برعملکرد عناوین مختلف تا چه اندازه چشمگیر خواهد بود. در قسمت سمت چپ تصویر زیر، تأثیر VRS در عمل دیده می‌شود. گرچه دو سمت تصویر یکسان به نظر می‌رسد، بنا به گزارش Firaxis در نقشه‌ی زیر و در چنین سطحی از بزرگنمایی، با اعمال VRS شاهد ۱۴ درصد افزایش در خروجی فریم خواهیم بود.

    البته باید به سطح عملکرد گزارش شده توسط Firaxis با جانب احتیاط نگریست. ما از شرایط انجام آزمایش بی‌خبریم، قابلیت VRS را هنوز نیازموده‌ایم و حتی ممکن است تصاویر و آمار منتشرشده راهی برای تبلیغ فناوری گرافیکی جدید مایکروسافت باشد. بنابراین قضاوت در مورد میزان تأثیر سایه‌زنی با توان متغیر را باید به زمانی پس از آزمایش عمومی این قابلیت موکول کرد.

    در هر صورت، فناوری «سایه‌زنی با نرخ متغیر» مایکروسافت در دسترس توسعه‌دهندگان قرار دارد و بسیاری از شرکت‌های صاحب‌نام قصد استفاده از آن را در محصولات بعدی خود دارند. توسعه‌دهندگانی مانند 343 Industries، شرکت Playground Games و Massive Entertainment در کنار ناشرانی مثل Ubisoft و Activision و سازندگان موتورهای بازی نظیر Unity و Epic Games در فهرست شرکت‌هایی قرار دارند که بناست از این قابلیت در عناوین آینده‌ی خود استفاده کنند.

    طرز کار فناوری VRS

    همان‌طور که از نام «سایه‌زنی با نرخ متغیر» پیدا است، در این روش به‌جای تمرکز بر رندر شیدرها با رزولوشن و جزییات یکسان (که مفهومی متمایز از رزولوشن کلی است)، توان سایه‌زنی (قدرت پردازشی یا به عبارتی نرخ کلاک هسته‌های سایه‌زن) متغیری را در ترسیم بافت‌های گرافیکی بخش‌های مختلف هر فریم می‌توان به‌کار گرفت. این فناوری با تغییر تعداد پیکسل‌هایی کار می‌کند که در یک عملیات سایه‌زنی پیکسل واحد پردازش‌پذیر هستند.

    براساس اعلام مایکروسافت، توسعه‌دهندگان می‌توانند به‌صورت گزینشی توان سایه‌زنی را در مناطقی از فریم که تأثیر چندانی بر کیفیت بصری نداشته باشد، کاهش دهند و حداکثر قدرت واحدهای سایه‌زن را معطوف به مناطقی کنند که جزئیات تصویری بالاتری در آن‌ها موردنیاز است. بنابراین توسعه‌دهندگان خواهند توانست در مناطقی که در آن شیدرها اهمیت بیشتری دارند، توان سایه‌زنی را افزایش دهند تا کیفیت تصویر بهتری در خروجی بازی‌های خود دریافت کنند.

    در پایان سطح عملکرد بالاتر و کیفیت تصویری بهتری را می‌توان به دست آورد؛ درحالیکه منابع سخت‌افزاری مورد نیاز کمتری برای اجرای بهتر بازی‌ها نسبت به قبل لازم خواهد شد.API سایه‌زنی با نرخ متغیر به توسعه‌دهندگان اجازه خواهد داد توان سایه‌زنی را به سه روش تنظیم کنند: روش‌های per-draw، روش within-draw با استفاده از یک تصویر screenspace و روش within-draw به حالت per-primitive. همچنین دو رده‌ی پشتیبانی از VRS وجود دارد. در رده‌ی نخست از VRS در حالت per-draw و در رده‌ی دوم از VRS هم در حالت per-draw و هم در حالت within-draw پشتیبانی می‌شود. همچنین حالت ترکیبی سایه‌زنی با توان متغیر (VRS Combiners) پیش‌بینی شده است که امکان استفاده‌ی همزمان از VRS به روش per-draw و per-permitive را ممکن می‌سازد.

    براساس ادعای مایکروسافت، قابلیت سایه‌زنی با نرخ متغیر با سخت‌افزارهای موجود شرکت انویدیا برخوردار از معماری تورینگ و نیز سخت‌افزارهایی که در آینده توسط اینتل ارائه خواهد شد، پشتیبانی می‌شود. اینتل هم‌اکنون در حال آزمایش سایه‌زنی با نرخ متغیر روی تراشه‌های اولیه‌ی گرافیکی نسل ۱۱ خود است که برنامه‌ریزی برای عرضه‌ی آن‌ها در سال جاری وجود دارد. احتمالا پردازنده‌های گرافیکی مجزای اینتل (نسخه‌های دسکتاپ آینده) نیز از این فناوری گرافیکی پشتیبانی کند.

  3. پس از انتشار مقاله اختصاصی Intel در زمینه گرافیک مجتمع نسل جدید آن با نام Gen 11 و پس از آن جنجالی که با اولین بنچمارک در رزولوشن 1080p ادامه یافت، در تعطیلات نوروزی حسابی سر و صدایی به پا کرده است؛ این تراشه گرافیکی مجتمع در چند پلتفرم پردازشی CPU محور اینتل نصب خواهد شد و بد نیست بدانید که اولین نسل با نام Ice Lake شناخته خواهند شد.

    2018_ArchitectureDay_DavidBlythe_FINALpage.jpg

    اینتل به تازگی یک درایور جدید برای تراشه های گرافیکی خود در ویندوز 10 را منتشر کرده است که به همراه داشبورد و برنامه نرم افزاری جدیدی است که به تازگی اخبار آن را برای شما عزیزان پوشش داده بودیم؛ اما نکته ای که در این درایور به چشم می خورد، لو رفتن عمدی یا سهوی اسامی برخی از CPU و تراشه های گرافیکی داخلی است که اینتل به زودی معرفی خواهد کرد.

    در این لیست 13 نوع تراشه با معماری جدید گرافیکی Gen11 به چشم می خورند که از نسل Ice Lake خواهند بود. گرافیک مجتمع Iris Plus Graphics 950 قوی ترین پردازشگر این نسل است که دارای 64 واحد EU خواهد بود. این تراشه گرافیکی در پردازنده های Core i7 و Core i9 نیز نصب خواهد شد. گرافیک دوم با نام Iris Plus Graphics 940 شناخته می شود که در پردازنده های Core i5 نیز مورد استفاده قرار می گیرند. Iris Plus Graphics 940 ها با همین تعداد واحد EU دارای فرکانس پایین تری هستند.

    سپس Iris Plus 930 و Iris Plus 920 را شاهد هستیم که تعداد واحد های EU آنها نیز 48 و 32 عدد است. iGPUهای Gen11 همچنان در مدل های کلیدی GT1 و GT2 معرفی می شوند. برای اطلاعات بیشتر به زمان بیشتری نیاز داریم. شایان ذکر است که لیتوگرافی تولید در این نسل به 10 نانومتری کاهش یافته است.

  4. نرم‌افزار و اپلیکیشن‌های ایرانی روی آیفون (سیستم‌عامل iOS) از کار افتادند!

    مدت‌ها است که زمزمه‌هایی در مورد محدودسازی استفاده از «گواهی توسعه‌دهنده سازمانی» (Enterprise Developer Certificates) از سوی اپل به گوش می‌رسد. حالا ظاهراً این محدودیت گریبان کاربران ایرانی این سرویس را گرفته است.

    از دیشب گزارشات های متعددی مبنی از از کار افتادن نرم‌افزار و اپلیکیشن‌های ایرانی آیفون و آی‌پد یا به صورت کلی سیستم عامل iOS اپل به گوش می‌رسد. متاسفانه باید گفت که به صورت رسمی این یک مشکل همگانی بوده و از سوی اپل ایجاد شده است. نرم‌افزار و اپلیکیشن‌های ایرانی بر روی آیفون (سیستم عامل iOS) از کار افتاده‌اند و در ادامه با هم درباره آن صحبت خواهیم کرد، با جامعه‌ی برنامه‌نویسان مدرن ایران همراه باشید.

    IMG_539A1C952B05-1.jpeg

    همانطور که در تصویر فوق مشاهده می‌کنید، کاربران برای استفاده از نرم‌افزارهایی که توسعه‌دهندگان آن‌ها ایرانی می‌باشند با مشکل روبرو شده‌اند. در حقیقت از دیشب نرم‌افزارهای مشهور ایرانی مانند بانک ملت، اسنپ، همراه‌من، مای ایرانسل و … روی آیفون قطع شده‌اند و کاربران نمی‌توانند از آن ها استفاده کنند. خطای فوق هنگان اجری برنامه‌ها رخ می‌دهد.

    گواهی‌های توسعه‌دهندگان سازمانی به شرکت‌ها اجازه می‌دهد اپلیکیشن‌های خود را خارج از فضای اپ‌استور و به شکل مستقیم در اختیار مخاطب قرار دهند. اما چندی قبل مشخص شد که تعدادی از اپلیکیشن‌های مستهجن، قمار و نیز اپ‌های کرک شده از این روش به طور گسترده در اختیار کاربران قرار گرفته‌اند. اپل هم اعلام کرد که توسعه‌دهندگانی که از این گواهی‌ها سوء استفاده می‌کنند خلاف تعهدنامه این شرکت عمل کرده‌اند و مجوزشان باطل خواهد شد.

    بسیاری از شرکت‌های ایرانی نیز به دلیل تحریم‌های اعمال شده علیه کشور از همین روش استفاده می‌کنند تا محدودیت‌های اعمال شده را دور بزنند. اما همین روش مشکلاتی را برای اپلیکیشن‌های معروف ایرانی ایجاد کرده است.

    به نظر می‌رسد در روزهای آتی شاهد پیش آمدن مشکلات بیشتری از این دست برای اپلیکیشن‌هایی باشیم که از گواهی سازمانی اپل برای انتشار اپ‌ها استفاده می‌کنند. بررسی‌های جامعه‌ی برنامه‌نویسی ایران خبر از غیر قابل استفاده شدن اپ‌های دیگری از جمله همراه‌بانک‌ها، دیجی‌کالا، آسان پرداخت و ریحون دارد در حالی که برخی دیگر مانند دیوار همچنان قابل استفاده هستند.

    نکته: بر اساس توصیه‌ی شرکت‌های سازنده‌ی اپلیکیشن‌های ایرانی، فعلاً جهت استفاده از خدمات آن‌ها بهتر است در صورت وجود نسخه‌ی تحت وب از آن پلتفرم استفاده شود.

  5. الهه انصاری
    آخرین نوشته

    توسط الهه انصاری،

    تا کنون در مجموعه‌ی مقالات اصول طراحی، در مورد تعادل و رنگ صحبت کردیم. در این بخش این روند را با موضوع تضاد (Contrast) ادامه می‌دهیم. 

    تضاد هنگامی رخ می‌دهد که دو عنصر در یک صفحه متفاوت باشند. به عنوان مثال، تضاد می‌تواند خودش را در رنگ‌های متنوع بین متن و رنگ پس زمینه نشان دهد. یا یک عنوان بزرگ و درشت در کنار یک فونت sans-serif برای متن بدنه باشد. یا میتواند تفاوت بین یک گرافیک بزرگ و یک گرافیک کوچک باشد و یا ترکیب یک بافت خشن با بافت ظریف که یک تضاد قابل توجهی ایجاد می‌کند. چشمان ما علاقه‌مند به دیدن تضاد هستند. نکته‌ی حائز اهمیتی که در رابطه با تضاد وجود دارد این است که تضاد باید کاملا چشم‌گیر و غیر جزئی باشد.

    ۱. تضاد از نظر چشمان ما جذاب است.

    یکی از دلایل استفاده‌ی ما از تضاد، چه در چاپ و چه در وب، جلب کردن توجه مخاطب است. سایت Carsonified از تضاد جهت اثرگذاری استفاده می‌کند. این سایت از متن و عکس‌های درشت و بالعکس و ترکیب رنگ‌های متضاد بهره برده است.

    Carsonified.png.4026adb544c1645b6480df1317412d07.png

    همانطور که در زیر می‌بینیم جلد مجله‌ی Proximity، از عکس چندین قایق شناور کوچک در درون دریای آبی تیره استفاده کرده است که تضاد زیبایی را به تصویر کشیده است.

    michaelfreimuth23.jpg.0fae5ae70ddf4ee7f537c541fe0a9908.jpg

    ۲. تضاد به سازماندهی اطلاعات کمک می‌کند.

    استفاده از تضاد نه تنها سبب جذابیت هر چه بیشتر طراحی می‌شود بلکه به هدف و سازماندهی اسناد وضوح بهتری می‌بخشد. در مجله‌ی منتشرشده در زیر، Studio8 از قوانین تضاد، تعادل (Balance) و مجاورت (Proximity) برای ایجاد صفحاتی غیر معمول و چشم‌گیر استفاده کرده است. عناوین درشت مشکی تضاد جالبی با متن ظریف روشن ایجاد کرده‌اند.

    studio804.jpg.85eabb9594da430d084e41fbbc44a162.jpg

    در ادامه‌ی مجله، Studio8 صفحات را به دو قسمت تقسیم کرده است که از لحاظ ظاهری کاملا متضاد هم هستند. هر صفحه اطلاعاتی را در مورد محصول‌های جداگانه‌ای می‌دهد که به هم مرتبط هستند. مفهوم این ارتباط توسط علامت '&' ادا شده است. 

    Caviar.png.8a2789db02980a098277cdffd207b1a5.png

    ۳. تضاد سبب ایجاد تمرکز می‌شود.

    آگهی‌ها و تبلیغات مشهور  iPod از مفهوم تضاد به صورت کاملا حرفه‌ای برای متمرکز ساختن توجه بینندگان به پخش‌کننده‌ی موسیقی استفاده کرده است. در این تبلیغات یک شخصیت تیره رنگ بر روی زمینه‌ی رنگی قرار گرفته است. iPod و هدفون‌ به رنگ سفید هستند که در مقابل شخصیت تیره رنگ و زمینه‌ی رنگی خود را به خوبی نشان می‌دهند. 

    ipod.png.4cfea8266ff3ba3d72c8c337f6272063.png

    طراحی برای این بطری سفارشی بر پایه‌ی تضاد بین متن سفید  و رنگ قرمز تیره‌ی نوشیدنی است که به عنوان یک کادوی کریسمس، منحصر به فرد است.

    WineBottles.png.d84b055289a11e8647f363ef6e2dd100.png

    مواردی که هنگام افزودن تضاد به طرح‌های خود باید به آن‌ها فکر کنید:

    ۱. چگونه تضاد را ایجاد میکنید؟ از طریق بافت، تایپوگرافی، رنگ یا شکل؟

    ۲. اگر می‌خواهید از طریق تایپوگرافی تضاد ایجاد کنید، کدامیک از فونت‌ها را استفاده می‌کنید؟ آیا آن‌ها بسیار متفاوت هستند یا فقط کمی با هم تفاوت دارند؟ گزینههای فونت خود را با دقت بررسی کنید اما به خاطر داشته باشید که متن قابل خواندن باشد.

    ۳. آیا تضاد به کار رفته، ایده‌ی طراحی شما را تقویت می‌کند؟

    پی‌نوشت: مقالات و دوره‌های سایت Sitepoint پیشنهاد می‌شوند. با ایجاد حساب کاربری امکانات جذابی در اختیارتان قرار خواهد گرفت.

     

  6. 1_pempph-OAqpRKG5v1-yisg@2x.png

    استارتاپ چیست و چگونه راه اندازی می‌شود

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

    از آنجایی که هدف از راه‌اندازی یک استارتاپ پیدا کردن مدل کسب‌و‌کار است؛ عمر آن نمی‌تواند طولانی باشد و معمولا بعد از گذشت چند سال به موفقیت می‌رسد یا بودجه‌ی آن تمام می‌شود و شکست می‌خورد. استارتاپ‌ها برای شروع فعالیت خود لزوما نیازی به ثبت شدن شرکت ندارند و از هرجا و با هر تعداد بنیان‌گذار می‌توانند فعالیت خودشان را آغاز کنند. بودجه‌ی راه‌اندازی استارتاپ‌های معمولا کم است؛ اما اگر ایده‌ی خوبی داشته باشند خیلی زود می‌توانند مورد حمایت سرمایه‌گذاران قرار بگیرند.

    Depositphotos_86520874_l-2015.jpg

    اصطلاحات رایج در استارتاپ

    افرادی که با استارتاپ‌ها درگیر هستند معمولا از اصطلاحات خاصی برای بیان مقاصد خود استفاده می‌کنند. در ادامه به معرفی چند نمونه از این اصطلاحات می‌پردازیم.

    Lean Startup

    متودولوژی لین استارتاپ (Lean Startup) یا نوپای ناب به شما یاد می‌دهد که چگونه یک استارتاپ را هدایت کنید، چه موقع آن را تغییر دهید و از چه راه‌هایی برای رشد آن استفاده کنید. لین استارتاپ یک رویکرد علمی برای ساختن و مدیریت کردن استارتاپ‌ به شما می‌دهد و کمک می‌کند که محصول خودتان را سریع‌تر به دست مشتری برسانید. بسیاری از استارتاپ‌ها با ایده‌ی ساختن محصول مورد نیاز مردم راه‌اندازی می‌شوند. آن‌ها ماه‌ها و حتی سال‌ها زمان صرف می‌کنند که محصول خود را به بهترین نحو شکل دهند بدون اینکه آن را به مشتری نشان بدهند. همین موضوع باعث شکست خوردن بسیاری از آن‌ها می‌شود. زیرا آن‌ها با مشتری‌ها صحبت نمی‌کنند و در مورد محصولات خود از آن‌ها بازخورد نمی‌گیرند. زمانی که مشتری‌ها نتوانند با یک استارتاپ ارتباط برقرار کنند، به ایده‌ی آن اهمیتی نمی‌دهند و درنتیجه استارتاپ شکست می‌خورد.

    Unicorn Startup

    استارتاپ تک شاخ یا یونیکورن استارتاپ (Unicorn Startup) به استارتاپ‌هایی گفته می‌شود که رشد سریعی دارند و به ارزش بیش از ۱ میلیارد دلار می‌رسند. این لغت اولین بار در سال ۲۰۱۳ توسط سرمایه‌گذاری به نام آیلین لی ارائه شد و او از میان حیوانات افسانه‌ای، تک شاخ را به‌عنوان نماد این مدل استارتاپ‌ انتخاب کرد. ازجمله بزرگ‌ترین استارتاپ‌هایی که در این دسته جا می‌گیرند می‌توان به Uber ،Xiaomi ،Airbnb ،Dropbox و Pinterest اشاره کرد.

    بنیان‌گذار استارتاپ (Founder)

    به شخصی که استارتاپ را راه‌اندازی می‌کند بنیان‌گذار گفته می‌شود. این اشخاص معمولا علاقه‌ای به کار کردن برای دیگران ندارند و باور دارند که می‌توانند با تلاش‌های بی‌وقفه‌ی خود دنیا را تغییر دهند. این افراد می‌توانند با تعدادی از دوستان خود در این راه شریک شوند و وظایف سنگین را بین خودشان تقسیم کنند. راه‌اندازی یک استارتاپ به هیچ عنوان کار راحتی نیست و در طی آن، به بنیان‌گذاران آن فشار زیادی وارد خواهد شد. اما اگر فعالیته‌های آن‌ها موفقیت‌آمیز باشد، نتیجه‌ی آن هم از نظر احساسی و هم از نظر مالی بسیار خوب خواهد بود.

    Accelerator-selection-process.gif

    شتاب‌دهنده‌ی استارتاپ (Startup Accelerators)

    شتاب‌دهنده‌ها شرکت‌هایی هستند که روی استارتاپ‌هایی با ایده‌های جالب و البته کاربردی سرمایه‌گذاری می‌کنند. این شرکت‌ها درصدی از مالکیت استارتاپ را می‌گیرند؛ اما در عوض خدماتی مانند آموزش توسط مربی‌ها و آشنا کردن آن‌ها با سرمایه‌گذاران و متخصصان آن رشته را برایشان فراهم می‌کنند. درواقع این شرکت‌ها شانس موفقیت استارتاپ‌ها و پیدا کردن سرمایه‌ی بالقوه برای فعالیت‌هایشان را بالا می‌برند.

    new-SWEDU-logo-1.png

    استارتاپ ویکند (Startup Weekend)

    استارتاپ ویکند یک رویداد آموزشی-تجربی ۵۴ ساعته است که معمولا در آخر هفته برگزار می‌شود. در این رویداد افراد مختلفی مانند علاقه‌مندان به استارتاپ، توسعه‌دهندگان، برنامه‌نویسان، مدیران کسب‌و‌کارها، بازاریاب‌ها و طراحان گرافیک حضور دارند. ایده‌ها در این رویداد مطرح می‌شوند و افراد گروه تشکیل می‌دهند تا طرح اولیه یا دموی ایده‌ی خود را پیاده‌سازی کنند.

    استارتاپ گرایند (Startup Grind)

    استارتاپ گرایند یک برنامه‌ی جهانی است که در آن از کارآفرینان موفق دعوت می‌شود تا داستان موفقیت‌ و چالش‌های استارتاپ خود را با دیگران به اشتراک بگذارند. افراد می‌توانند در این برنامه با پروژه‌های یکدیگر آشنا شوند و از تجربیات هم استفاده کنند.

    تجارت B2B

    این اصطلاح کوتاه شده‌ی عبارت Business to Business است و به کسب‌و‌کاری گفته می‌شود که محصولات و خدمات خود را به یک کسب‌و‌کار دیگر ارائه می‌دهد. این نوع تجارت در مقابل تجارت بی تو سی (B2C) قرار دارد.

    تجارت B2C

    تجارت B2C مخفف عبارت Business to customers است و به کسب‌و‌کارهایی گفته می‌شود که محصولات و خدمات خود را به مشتری‌های عرضه می‌کنند.

    تجارت C2C

    نوعی از سرویس است که کاربران با استفاده از آن، خدمات و کالاهای خود را به دیگر کاربران عرضه می‌کنند. وب‌سایت‌ها و سرویس‌های خرید و فروش اجناس دست دوم، از نمونه‌های تجارت Customer to Customer هستند.

    سرمایه‌ی بذری (Seed Funding)

    همان‌طور که یک گیاه از یک بذر شروع به رشد می‌کند، یک استارتاپ نیز از یک سرمایه‌ی اولیه شروع می‌شود. به سرمایه‌ای که در مرحله‌ی اولیه راه‌اندازی استارتاپ در اختیارش قرار می‌گیرد، سرمایه‌ی بذری گفته می‌شود.

    واگذاری (Vesting)

    به نوعی تخصیص سهامی گفته می‌شود که طی آن بعد از گذشت مدت زمانی، مقدار سهم تعیین‌شده به کارمندان داده می‌شود. به‌عنوان مثال اگر به یک کارمند ۲۰۰ سهام طی ۱۰ سال داده شود، یعنی بعد از گذشت هر سال ۲۰ سهم به او اختصاص پیدا می‌کند. این کار به کارمندان انگیزه می‌دهد که عملکرد خوبی داشته باشند و برای مدت زمان زیادی در شرکت کار کنند.

    بنچمارک (Benchmark)

    به فرآیندی گفته می‌شود که یک استارتاپ برای اندازه‌گیری موفقیت فعلی خود از آن استفاده می‌کند. سرمایه‌گذاران میزان موفقت استارتاپ‌ها را بر اساس بنچمارک‌ها می‌سنجند. به‌عنوان مثال وقتی می‌گوییم شرکت A به بنچمارک درآمد X در طی ۲ سال رسیده است یعنی این استارتاپ توانسته است طی ۲ سال میزان فروش خود را به X برساند.

    بوت‌استرپ (Bootstrapped)

    زمانی که گفته می‌شود یک شرکت بوت‌استرپ است، یعنی بودجه‌ی آن توسط خود کارآفرین یا بودجه‌ی خود شرکت تأمین شده است.

    وام موقت (Bridge loan)

    این نوع وام به Swing loan نیز معروف است و به مساعده‌هایی گفته می‌شود که بر اساس میزان درآمد به یک شخص داده می‌شود و فاصله‌ی بین درآمدهای عمده‌ را پر می‌کند.

    فروش (Buyout)

    یک استراتژی معمول برای خروج است که طی آن سهام شرکت به فروش می‌رسد و به خریداران آن اجازه‌ی کنترل شرکت داده می‌شود.

    سرمایه (Capital)

    به دارایی‌های مالی گفته می‌شود که در حال حاضر برای استفاده در دسترس هستند. کارآفرینان از سرمایه برای آغاز استارتاپ استفاده می‌کنند و مقدار آن را افزایش می‌دهند تا به رشد استارتاپ کمک کنند.

    دو دلیجنس (Due diligence)

    به ارزیابی و تحلیل سرمایه‌گذاران از وضعیت و پتانسیل‌های سرمایه‌گذاری گفته می‌شود. این ارزیابی می‌تواند شامل بررسی سوابق مالی و اندازه‌گیری ROI باشد.

    بازده سرمایه‌گذاری یا بازگشت سرمایه (ROI)

    همان‌طور که از نامش پیدا است، برگشت سرمایه را مورد بررسی قرار می‌دهد. درواقع به پولی گفته می‌شود که به یک سرمایه‌گذار به‌عنوان درصدی از سرمایه‌‌گذاری خود در استارتاپ برگشت داده می‌شود. به‌عنوان مثال اگر یک سرمایه‌گذار مبلغ ۲ میلیون دلار برای خرید ۲۰ درصد سهام یک شرکت خرج کند و شرکت با مبلغ ۴۰ میلیون دلار به فروش برسد، این یعنی آن سرمایه‌گذار مبلغ ۸ میلیون دلار از فروش شرکت دریافت خواهد کرد.

    خروج (Exit)

    برخی بنیان‌گذاران و سرمایه‌گذاران استارتاپ این‌گونه پولدار می‌شوند؛ Exit به متدی گفته می‌شود که یک سرمایه‌گذار و یک کارآفرین سرمایه‌ی خودشان را از شرکت خارج می‌کنند. خروج معمولا در زمان IPO و M&A اتفاق می‌افتد.

    آی‌پی‌او (IPO)

    زمانی است که یک استارتاپ سهام خودش را در یک فراخوان بورس برای فروش به مردم پیشنهاد می‌دهد. در این حالت یک شرکت خصوصی تبدیل به سهامی عام می‌شود و دیگر یک استارتاپ نیست.

     مالکیت و ادغام (Merge & Acquisition)

    زمانی است که استارتاپ توسط یک شرکت بزرگ‌تر خریداری یا با آن ادغام می‌شود. این اتفاق به صورت دوستانه (همراه با توافقنامه) یا خصمانه (بدون توافقنامه) صورت می‌گیرد.

    توافقنامه عدم ‌افشاگری (NDA)

    NDA مخفف عبارت Non-disclosure agreement است و به توافقنامه‌ای گفته می‌شود که طی آن هر ۲ طرف از اطلاعات حساس و محرمانه مانند اسرار تجارت محافظت می‌کنند و آن را با شخص سوم به اشتراک نمی‌گذارند.

    پیوت (Pivot)

    زمانی است که استارتاپ جهت استراتژی‌های خودش را سریعا تغییر می‌دهد. معمولا این تغییرات به دلیل عدم بازدهی اتفاق می‌افتند و طی آن بر ویژگی‌های دیگر محصولات یا مشتری‌ها تمرکز می‌شود.

    مذاکره در آسانسور (Elevator Pitch)

    فرض کنید در یک آسانسور با یک سرمایه‌گذار هم مسیر شده‌اید و تنها ۳۰ تا ۱۲۰ ثانیه فرصت دارید او را متقاعد کنید که روی ایده‌ی شما سرمایه‌گذاری کند. به ‌عبارتی شما باید در این چند ثانیه مشکل، راه‌حل آن و بازار مشتری‌ها را برای سرمایه‌گذار توضیح بدهید و او را متقاعد کنید.

    نرم‌افزار به‌عنوان سرویس (SaaS)

    به یک محصول نرم‌افزاری گفته می‌شود که از راه دور به وسیله‌ی اینترنت یا سیستم رایانش ابری کنترل می‌شود.

    how-to-start-a-startup-as-told-by-PG-infographic.png

    چگونه یک استارتاپ راه‌اندازی کنیم

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

    ۱- ببینید دنیا چه چیزی کم دارد

    اگر دقت کنید متوجه می‌شوید که سیستم‌های تاکسیرانی قبل از پیدایش Uber بسیار کسالت‌آور بودند. یا اینکه قبل از پیدایش اسپیس‌ایکس مردم علاقه‌ی چندانی به فضا نداشتند. شما نیز باید فکر کنید و ببینید چه چیزی در دنیا کم است و سعی کنید ایده‌ی جدیدی برای آن ارائه دهید.

    ۲- آن را یادداشت کنید

    مهم نیست که چقدر باهوش هستید. مطمئنا بعد از گذشت مدتی برخی جزئیات ایده‌ی خود را فراموش خواهید کرد. افکار شما و مکالماتی که در این زمینه با دیگران انجام می‌دهید بسیار ارزشمند هستند پس تمام افکار و جزئیات مکالمات خود را یادداشت کنید.

    ۳- یک نمونه‌ی اولیه بسازید

    بسیاری از ایده‌های خلاقانه‌ی ما حتی بهترین‌ها، متأسفانه هیچ موقع به دنیای واقعی وارد نمی‌شوند و شما حتی اگر آن‌ها را یادداشت کنید، بازهم بعد از گذشت مدتی فراموششان خواهید کرد. تنها چیزی که می‌تواند مانع از فراموش شدن آن‌ها شود، تهیه‌ی یک نمونه‌ی اولیه است. آن‌ها را برنامه‌نویسی کنید یا به‌صورت فیزیکی طراحی کنید و بسازید. بسیاری از مردم در همین مرحله متوقف می‌شوند بنابراین اگر بتوانید از آن گذر کنید، یک قدم از دیگران جلوتر خواهید بود.

    ۴- نمونه‌ی اولیه را به ۱۰۰ نفر نشان دهید

    حالا شما باید از نقطه‌ی آسایش خود خارج شوید و نمونه‌ی اولیه خود را به دیگران نشان بدهید و نظر آن‌ها را جویا شوید. بهتر است این ۱۰۰ نفر از میان افراد کاملا ناشناس انتخاب شوند تا شناختن شما در بازخوردشان نسبت به محصول تأثیری نگذارد. چرا ۱۰۰ نفر؟ زیرا شما در این مرحله به چشم‌اندازی وسیع برای بازخوردها احتیاج خواهید داشت.

    ۵- تکرار کنید

    مردم کمی هستند که در اولین تلاش خود موفق می‌شوند و شانس اینکه شما جزو این دسته باشید بسیار کم است. بنابراین خودتان را برای طراحی کردن مجدد همه چیز کنید.

    ۶- یک هم‌بنیان‌گذار (Co-Founder) پیدا کنید

    زمانی که احساس کردید نمونه‌ی اولیه‌تان به نتیجه رسیده است، به دنبال یک شریک بگردید تا حاضر باشد سال‌های عمر خود را صرف عملی کردن این ایده کند.

    ۷- کسب‌و‌کار خود را ثبت کنید

    بعد از صحبت کردن با شریک یا شرکای خود و تعیین توافقات، بهتر است شرکت خودتان را ثبت کنید. می‌توانید مراحل ثبت شرکت را به‌طور کامل در این مقاله مطالعه کنید.

    ۸- به دنبال سرمایه‌گذار باشید و اولین نسخه را تولید کنید

    اگر بودجه‌ی کافی برای تولید کردن اولین نسخه از محصول خود ندارید، بهتر است یک سرمایه‌گذار پیدا کنید. بهتر است در حین پیدا کردن سرمایه‌گذار کار تولید را متوقف نکنید؛ زیرا هر استارتاپی نمی‌تواند بودجه‌ی مورد نظر خود را از سرمایه‌گذاران دریافت کند.

    linear-emblem-of-business-idea-startup-vector-20200069.jpg

    ۹- راه‌اندازی کنید

    هرچقدر نسخه‌ی اولیه‌تان ناقص بود، آن را راه‌اندازی کنید. ویژگی‌های اضافه، واسط کاربری بهتر، افزایش سرعت اجرا و دیگر موارد مربوط به بهینه‌سازی از جمله مواردی هستند که می‌توانند در آینده نیز به محصول اصلی اضافه شوند.

    ۱۰- با کاربران همراه باشید

    مشتری‌های خود را تحت نظر داشته باشید و ببینید آیا برمی‌گردند یا خیر. اگر برنگشتند، علت را پیدا کنید.

    ۱۱- دوباره راه‌اندازی کنید

    هر چقدر احتیاج بود، محصول خود را بعد از اعمال تغییرات دوباره راه‌اندازی کنید. حتی اگر مشاهده کردید که تعداد کمی از مردم دوباره به شما مراجعه کردند، باز هم به کارتان ادامه دهید؛ زیرا این یعنی در حال تولید یک محصول باارزش هستید.

    ۱۲- محصول را به ۱۰۰۰ نفر نشان دهید

    شاید رقم بالایی به نظر نرسد؛ اما اولین ۱۰۰۰ نفر نقاط ضعف محصول شما را شناسایی خواهند کرد. از آنجایی که شما هنوز ناشناخته هستید، شاید لازم باشد این افراد را به‌صورت دستی استخدام کنید. هیچ ایرادی ندارد حتی اگر شده لپ‌تاپ آن‌ها را قرض بگیرید و وب‌سایت‌ خود را به آن‌ها نشان بدهید و نظرشان را جویا شوید.

    ۱۳- رشد کنید

    پاول گراهام، دانشمند علوم کامپیوتر و سرمایه‌گذار، استارتاپ‌ها را تشویق می‌کند که در هفته ۵ درصد رشد داشته باشند. اگر ۴ سال به همین ترتیب ادامه دهید، در طی گذشت این مدت به تعداد ۲۵ میلیون کاربر خواهید رسید. به‌ عبارت‌ دیگر، تبدیل به یکی از بزرگ‌ترین استارتاپ‌ها خواهید شد.

    The Most Important Factors for Startup Success_Header Image.png

    ۱۴- به موفقیت برسید

    شما می‌توانید شرکت خودتان را به شخص دیگری بفروشید یا سرمایه‌گذاران را قانع کنید که با شما همکاری کنند. شما تا اینجا موفق شده‌اید استارتاپ خود را به نتیجه برسانید؛ بعد از این به خودتان بستگی دارد که بخواهید آن را ادامه دهید یا آن را به صاحبان جدیدش واگذار کنید. 

  7. اگر شما از آن دسته از کاربرانی هستید که هزینه‌ای برای گیت‌هاب پرداخت نمی‌کنید، این هفته‌ی خوبی است برای شما! 

    Octocat.png

    با توجه به تاریخ، گیت‌هاب همیشه حساب‌های رایگان ارائه داده است، اما با توجه به قوانین آن مخازنِ شما باید در قالب عمومی ایجاد می‌شدند. در صورتی که شما نیاز به داشتن مخزنی از نوع خصوصی داشتید در این صورت مجبور به پرداخت هزینه‌ای در قبال آن بودید. خبر خوش این است که، این محدودیت از امروز از بین رفته و شما می‌توانید مخازن خود را به صورت خصوصی و بدون پرداخت هزینه‌ای ایجاد کنید.

    نقل قول

    توجه داشته باشید که این ویژگی تنها تا حداکثر ۳ همکار (مشارکت کننده) قابل استفاده است. تعداد مشارکت کنندگان در اینجا تنها محدودیتی است که دیده می‌شود.

    Screen Shot 2019-01-08 at 00.44.16.png

  8. pia22486-main.jpg

    پس از فرود انسان روی کره ماه در قرن بیستم، سیاره مریخ همواره به عنوان مقصد بعدی در منظومه شمسی شناخته شده؛ اما یکی از فضانوردان سابق ناساانجام چنین کاری را احمقانه می داند.

    بیل اندرس فضانورد سابق ناسا که در مأموریت آپولو 8 سال 1968 نیز شرکت داشته، معتقد است سفر به سیاره مریخ در حال حاضر صرفاً یک نمایش تبلیغاتی از سوی ناسا بوده و هیچ نفعی برای جامعه علمی دنیا نخواهد داشت.

    به گفته اندرس، بودجه لازم برای سفر به مریخ می تواند صرف پروژه های مفیدتری مانند ارسال ربات های کاوشگر به سیارات مختلف شود و از این طریق، سطح آگاهی ما از جهان اطراف را افزایش دهد.

    MarsColonyNeverGoingToHappen_1024.jpg

    آقای اندرس معتقد است سازمان ناسا از مأموریت اصلی خود فاصله گرفته و بیشتر به دنبال برنامه های فضایی پر سر و صدا برای جذب سرمایه و بودجه بیشتر است که در نهایت، این پول ها هم خرج برنامه های تبلیغاتی و کم فایده بعدی خواهند شد.

    سفر انسان به مریخ در حال حاضر توجیه علمی ندارد

    به گفته فضانورد سابق ناسا، حضور انسان روی سیاره مریخ مسلماً یک موج رسانه ای عظیم و قدرتمند را به راه خواهد انداخت اما هیچ کمکی به گسترش مرزهای دانش بشری نخواهد کرد. جالب است بدانید که چنین دیدگاهی تنها مختص به بیل اندرس نبوده و بسیاری از مدیران ناسا، اسپیس اکس و بلو اوریجین (هر سه به دنبال فرود انسان روی مریخ هستند) نیز با نظر وی موافقند.

    البته نظر اندرس مخالفانی هم دارد؛ به عنوان مثال فرانک بورمن (یکی دیگر از سرنشینان آپولو 😎 معتقد است جست و جوی عمیق در منظومه شمسی یکی از مهم ترین مأموریت های ناسا بوده که حضور انسان بخش جدایی ناپذیر چنین پروژه هایی خواهد بود.

    گفتنی است آقای بورمن از سوی دیگر هیجان موجود در زمینه سفر به سیاره مریخ را هم تأیید نکرده و اظهار داشته: «ماسک و بزوس (صاحبان اسپیس اکس و بلو اوریجین) درباره تشکیل جوامع انسانی در مریخ صحبت می کنند؛ چنین چیزی مسخره است.»

    به هرحال باید منتظر بود و دید که آیا در سال های آتی ناسا و دیگر سازمان های فضایی بودجه خود را صرف امور علمی خواهند کرد یا بر شکستن محدودیت های حضور انسان در سایر سیارات تمرکز خواهند داشت.

  9. دو هفته پیش، نشست ۲۰۱۸ سی‌پلاس‌پلاس آغاز شد. شرکت کننده‌ها مدال‌های خودشان را دریافت کردند چرا که همه‌ چیز با هماهنگی بسیار خوبی به پایان رسید. این رویداد به عنوان یکی از چندین رویداد مهمC++ بشمار می‌رود که هرساله توسط حامیان و علاقه‌مندانش برگزار می‌شود.

     

    سخنان کلیدی

    امسال در این رویداد سه یادداشت کلیدی وجود داشت، که با حضور Andrei Alexandrescu ،Lisa Lippincott و Nicolai Josuttis ارائه شد.

    IMG_0399_600.JPG

    اولین سخنران Andrei Alexandrescu بود، او این کنفرانس را با افکار و اندیشه‌های خودش برای شروع آغاز کرد عنوان موضوع آن به بَد بودنِ کپی constexpr از static if اشاره می‌کرد. او یک سخنران سرگرم کننده است، بنابراین سخنرانی او بسیار طبیعی در مورد یادداشت‌های خودش منعکس می‌شد. همچنین او به عنوان یک توسعه‌دهنده‌ی ++C به نقاط بسیاری اشاره کرد که کمیته‌ی استاندارد سازی زبان حرف‌های او را تایید می‌کرد.

    IMG_0620_600.JPG

    سخنران دوم Lisa Lippincott روز دوم را با یک سخنرانی آغاز کرد که دیدگاه‌های مختلفی در مورد محاسبات و منطق که در آن به کار می‌رود ارائه داد. زمانی که مُجری لیزا را دعوت کرد، می‌دانست که این موضوع به عنوان یک نکته مهم برای فکر کردن است، چیزی که همه نمی‌توانند به طور مستقیم آن را درک کنند و به آن دسترسی پیدا کنند. اما این تلنگری برای نحوه‌ی درک کُد از دیدگاه ریاضی و دیدگاه جدیدی بود.

    IMG_1000_600.JPG

    سخنران سوم و آخر Nicolai Josuttis بود که در مورد، او اولین سخنران در نشست Hartmut Kaiser در سال ۲۰۱۴ بود. در آن سخنرانی بسیار خوب درخشیده، بنابراین در قسمت سوم نقص‌هایی را با جزئیات در مورد نقاط خشن ++C نشان داد. این سخنرانی بسیار صادقانه بود! چرا که بسیاری از جزئیات خشن بودن سی‌پلاس‌پلاس را عنوان کرد که همگی با آن موافق بودند.

     

    مذاکرات، مسابقه و گفتگوها‌ی چند دقیقه‌ای

    جلسات و رویداد‌های مرتبط با ++C همیشه گفتگو‌های بسیار خوبی دارد، و با یک مسیر مشخص که هدفش آوردن سخنرانان جدید با دیدگاه‌های جدید است برگزار می‌شود. بازخورد سخنران‌ها در این رویداد خوب بود چرا که به برخی از نکات در مورد چگونگی بهبود‌ها اشاره کردند.

    IMG_0728._600.JPG

    IMG_0871_600.JPG

    تصویر بالا مربوط به Hana Dusíková است که می‌توان به آن بهترین نمره را داد. بهترین سخنرانی هم مربوط به  Andrei Alexandrescu بود که دنبال شد. در اولین عصر این رویداد، امتحان (Quiz) برجسته‌ترین مورد رویداد در آن روز بود. سازماندهی آن توسط Diego  و اسپانسری آن توسط Conan است که برای چند سال اخیر حمایت شده است. به نظر می‌رسید که سوالات امتحانی این سال سخت‌تر از سوالات رویداد قبلی در سال گذشته بوده است. اما بار دیگر این سرگرمی ترکیب بسیار خوبی با ترس از سی‌++ را داشت.

    هر یک از سوالات امتحانی یک خروجی از کُد را تولید می‌کردند، که هر گروه باید برای کسب امتیاز آن را می‌نوشتند. ده نوع کُد امتحانی وجود داشت که تهیه کننده‌ی گزارش برای به تصویر کشیدن آن‌ها زیاد خوب عمل نکرده است. بنابراین تصویر زیر مربوط به سوالات چالشی در مورد سی‌پلاس‌پلاس است:

    IMG_0542_600.jpg

    گفتگو‌های کوتاه در طی جلسات سی‌پلاس‌پلاس صورت می‌گیرد. اما در سال‌های گذشته روش به گونه‌ای تغییر یافته است که سوالات پرسیده شده باید با گفتگو‌ها و سوالات دیگر رقایبت می‌کردند. با این حال این یک قالب و روش جالبی بود که نتیجه‌ی موفقیت آمیزی را داشت. همه‌ی شرکت کننده‌ها می‌توانستند این سوالات رو ببینند و در مورد آن‌ها تفکر کرده و پاسخ دهند.

    • نقل قول

      نتیجه : این رویداد بیشتر به عنوان یک دوره‌همی و گفتگو در مورد رفتار‌های خشن زبان سی‌پلاس‌پلاس و پاسخ‌های سرگرم کننده در مورد آن‌ها را فراهم کرده است و به ویژگی‌های جدید زبان در آن پرداخته نشده است.

    نکته: شما می‌توانید تصاویر ویدیویی مربوط به این رویداد را از کانال رسمی آن در یوتیوب دریافت کنید.

     

×