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

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

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

  1. امروز
  2. دیروز
  3. هفته گذشته
  4. الهه انصاری

    ۱۵ اصول راهبردی برای محققان UX

    ما متوجه شده‌ایم که بسیاری از محققان حوزه‌ی تجربه کاربری برای اولین بار هنگام شروع کار با طراحی تجربه کاربری سوالات و نگرانی‌های مشابهی دارند. بنابراین، فکر کردیم که برای جمع آوری تعدادی از اصول مهم مورد نیاز محققان این حوزه، برخی از متداول‌ترین سوالات را مطرح کنیم. البته این مطلب راهنمای کاملی برای تحقیقات تجربه کاربری نیست (تعدادی منابع نسبتاً سنگین و حجیم خارج از این مطلب وجود دارد) اما این مقاله یک نقطه‌ی شروع خوب برای پاسخگویی به برخی از سوالات به ظاهر آزار دهنده‌ی تجربه کاربری است. ترکیب کنید بهترین پژوهشگران از یک ابزار خاص برای انجام تحقیقات خود استفاده نمی‌کنند. آن‌ها روش‌ها و ابزارهای مختلفی را به کار می‌گیرند و سپس آن‌ها را با هم ترکیب می‌کنند. این کار به شما شانس بیشتری برای پیدا کردن مسائل واقعی می‌دهد و سپس می‌توانید برای بهبود آن‌ها اقدام کنید. فهمیدن این که اشتباه کرده‌اید آسان‌تر است وقتی دچار خطا شدیم، تحقیقات می‌توانند به سرعت به ما کمک کنند. اگر یک ویژگی جدیدی اضافه کنید و پنج شرکت کننده‌ی اول تحقیق شما آن را نپسندند، احتمالاً مشکلی در این میان پیش آمده است. با این حال، صد نفر می‌توانند بدون اظهار نظر از چیزی استفاده کنند که ممکن است کارایی نداشته باشد. شما نمی‌توانید اندازه‌ی کلیه‌ی تحقیقات خود را استاندارد کنید متأسفیم، اما اندازه‌ی نمونه‌ها باید براساس میزان خطراتی که در هر تحقیق تخمین زده‌اید معین و براساس نوع تحقیقاتی که انجام می‌دهید محاسبه شود. برای تمام تحقیقات خود سعی نکنید از یک اندازه‌ی واحد استفاده کنید زیرا این عمل یک رویکرد ناقص و نا کارآمد است. انجام آزمایش و تست فقط با یک کاربر همیشه بی معنی نیست تصور کنید که شما یک بسته‌‌ی جدید پردازش کلمه را ایجاد می‌کنید و با اولین کاربر خود سعی می‌کنید یک سند را ذخیره کنید و می‌بینید که روند خراب است. به چند کاربر دیگر برای آزمایش این مورد نیاز دارید؟ هیچ کاربر دیگری، درست است؟ برخی از مشکلات عام هستند و فقط یک کاربر مورد نیاز است تا آن‌ها را کشف کند. اندازه‌های نمونه را برای دقت بیشتر افزایش دهید هرچه اندازه‌ی نمونه‌ی شما بزرگ‌تر باشد، احتمال دقیق‌تر بودن اطلاعات شما بیش‌تر است. یک قانون کلی وجود دارد که می‌گوید دقت را دو برابر کنید تا اندازه‌ی نمونه را با ضریب چهار افزایش دهید! تصادفی سازی می تواند بر نقایص طراحی تحقیق غلبه کند اگر می‌توانید ترتیب سوالات، پاسخ‌ها، جریان فرآیند و غیره را تغییر دهید، آن را انجام دهید. مسیری که شما طی می‌کنید تصادفی‌تر است - به احتمال زیاد می خواهید ثبات پیدا کنید و نقص طراحی آزمایشی را به حداقل برسانید. نتایج تحقیقات متعلق به هیچ کس نیست تمام داده‌هایی که جمع می‌کنید، متعلق به شما یا تیم شما نیست بلکه متعلق به شرکت است. هرچه بیش‌تر تجربه کاربری خود را در مورد شرکت به انجام برسانید احتمال بیش‌تری وجود دارد که شرکت شما شروع به تمرکز بر نیازهای کاربر به عنوان یک اولویت خواهد کرد. یک سیلوی تجربه کاربری را در کسب ‌و کار خود ایجاد نکنید؛ اجازه دهید جریان داده جاری شود. درجه‌بندی مقیاس در سوالات مهم نیست مطمئناً بحث‌های زیادی در مورد این که آیا مقیاس x دقیق‌تر از مقیاس y است یا نه وجود دارد و این که آیا شما باید یک رتبه بی‌طرف داشته باشید یا خیر. هیچ یک از آن‌ها به اندازه‌ی کافی مهم نیستند که بیش از ۵ دقیقه را صرف نگرانی کنید. یک مقیاس را انتخاب کرده و شروع به انجام تحقیق کنید. شرکت کنندگان نیاز به بازتاب پرسوناها دارند همه‌ی افراد، کاربر یا حتی کاربر احتمالی محصول شما نیستند. هر کاربر متناسب با بازار هدف شما نیست. شخصیت‌های کاربر خود را استخراج کنید و به عضویت شخصیت بپردازید؛ به این ترتیب بیش‌ترین شانس دریافت نتیجه را دارید که در واقع برای کاربران هدف شما کار می‌کند. شما نمی‌توانید همیشه به همه‌ی مردم لطف کنید و متخصصان تجربه کاربری حتی نباید سعی در انجام این کار داشته باشند. آنچه می‌گویند در مقابل آنچه انجام می‌دهند غالباً گفته می‌شود که آن چه مردم انجام می‌دهند مهم است و نه آن چه که می‌گویند. ما موافق نیستیم شما باید هم آنچه را که افراد می‌گویند و هم آنچه انجام می‌دهند را بسنجید. سپس می‌توانید دلایل قطع ارتباط بین دو موقعیت را کشف کنید. بعضی اوقات مردم واقعاً آن چه را که می‌گویند می‌خواهند و بعضی وقت‌ها این کار را نمی کنند. دانستن زمان واقعی بودن این موارد برای تجربه کاربر است. جعبه‌ی ابزار خود را توسعه دهید قرار است به کمک توانایی‌ها و موارد تخصص خود، ایده‌ها و روش‌های جدیدی برای طولانی مدت تولید کنید. بدون امتحان کردن ابزاری آن را رد نکنید. حتی اگر آن‌ها به کار شما نیایند، به جای فرض کردن این ناکارآمدی را کاملا تجربه خواهید کرد. در بسیاری موارد حتی بدترین ابزارها اگر به درستی تطبیق داده شوند، می‌توانند بینش معقولی ارائه دهند. قابلیت استفاده - یک تخیل معقول؟ اندازه گیری قابلیت استفاده غیرممکن است. معیاری که می‌توانیم اندازه گیری کنیم مربوط به غیرقابل استفاده بودن آن است. این اقدامات انعطاف پذیر هستند؛ آن‌ها از یک محصول به محصول دیگر، از یک کاربر به کاربر دیگر و از یک محقق تجربه کاربری به محقق دیگر تغییر می‌کنند. بسیار خب، یافتن مشکلات بخشی از تحقیقات است. ما از قبل می‌دانیم که نشان دادن این که مشکلی نیست، خیلی سخت‌تر از یافتن مشکل است. گزارش ها را کوتاه تهیه کنید مطمئناً این روش شگفت انگیز و مبتکرانه بوده و نتایج باورنکردنی دارد اما شما نیازی به نوشتن کتاب برای دستیابی به این مسئله ندارید. اگر می‌خواهید تحقیقات شما دارای ارزش گسترده‌ای در سازمان باشد، طول گزارش‌های خود را به حداقل برسانید. با این حال، اجازه ندهید که این موضوع شما را از ایجاد کار دقیق‌تر به عنوان ابزاری یادگیری در محیط شخصی خود یا نوشتن کتابی در این حوزه در صورتی که قصد انتشار آن را دارید باز دارد. آگاه باشید که ناظران به طور متفاوتی بررسی می‌کنند دلیلی وجود دارد که پلیس با شهادت شاهد عینی با یک بدبینی سازنده برخورد می‌کند. افراد آن چه را که قصد دیدنش را دارند، می‌بینند و به ندرت شاهدان آن چیزها را خواهند دید. این مشکل بزرگی نیست؛ در حقیقت، اضافه کردن ناظران ممکن است موفقیت کلی تحقیقات را افزایش دهد. اگر شما همه‌ی مشکلات مختلف را شناسایی کنید، برای کاربران بهتر است (تا زمانی که شما قصد اصلاح همه‌ی آن مشکلات را دارید) و فراموش نکنید که عمل مشاهده نیز ممکن است نتایج به دست آمده را تغییر دهد. کیش شخصیت (Cult of Personality) به کارتان نخواهد آمد هزاران پیشگام حوزه‌ی تجربه کاربری وجود دارد. امروزه دانش بعضی از افراد بسیار مد روز است ولی فردا نادیده گرفته خواهند شد یا برعکس. هیچ «راه صحیحی» برای پژوهشگر تجربه کاربری بودن، وجود ندارد. نام‌هایی که به ایده‌های تجربه کاربری داده شده‌اند را نادیده بگیرید و به جای آن روی ایده‌ی اصلی تمرکز کنید و با همه چیز با مقدار سازنده‌ی تردید و علاقه برخورد کنید. پی‌نوشت: منبع اصلی
  5. قاسم رمضانی منش

    با StyleSheet زیاد امتحان کرده‌ام آن خروجی‌ای که مدنظرم هست (و توی عکس‌بالا هم ارسال کرده‌ام) به دست نیومد.
  6. کامبیز اسدزاده

    از مشخصه‌ی setStyleSheet تحت CSS کار کن، مثال زیر رو ببین: QSlider::groove:horizontal { border: 1px solid #bbb; background: white; height: 10px; border-radius: 4px; } QSlider::sub-page:horizontal { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #66e, stop: 1 #bbf); background: qlineargradient(x1: 0, y1: 0.2, x2: 1, y2: 1, stop: 0 #bbf, stop: 1 #55f); border: 1px solid #777; height: 10px; border-radius: 4px; } QSlider::add-page:horizontal { background: #fff; border: 1px solid #777; height: 10px; border-radius: 4px; } QSlider::handle:horizontal { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #eee, stop:1 #ccc); border: 1px solid #777; width: 13px; margin-top: -2px; margin-bottom: -2px; border-radius: 4px; } QSlider::handle:horizontal:hover { background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #fff, stop:1 #ddd); border: 1px solid #444; border-radius: 4px; } QSlider::sub-page:horizontal:disabled { background: #bbb; border-color: #999; } QSlider::add-page:horizontal:disabled { background: #eee; border-color: #999; } QSlider::handle:horizontal:disabled { background: #eee; border: 1px solid #aaa; border-radius: 4px; } البته ساختن چنین مواردی رو من در QML پیشنهاد می‌کنم.
  7. قاسم رمضانی منش

    در حالت عادی، ویجت QSlider به این‌صورت نمایش داده می‌شود : برای رنگ بندی نوار QSlider، چه پیشنهادی دارید ؟ مثلاً به این‌صورت :
  8. بهنام صباغی

    در واقع شامل همه موارد هست یعنی اگر بیرونی تریم شی یه Item باشه خب شما یه کامپوننت از آیتم داری که توش یه rectangle هست و میتونی هر پراپرتیش رو که بخوای تعریف کنی توی بالاترین کامپوننت و بدی بیرون که استفاده بشه
  9. قاسم رمضانی منش

    خواهش می‌کنم؛ خب آره همینی هست که گفته‌‌ام، نمی‌دونم بیرونی‌ترین شئ منظورت چیه ؟ ساختار QML درختی هست یعنی اینکه یک Root داره و میاد همینطوری پایین و شما کلاً یک Root هم بیشتر ندارید. شما اگه بیاید اون Rectangle رو داخل یک Item دیگه بزارید درواقع یک کامپوننتی دارید که قابلیّت‌های Rectangle رو هم داره اینطوری : AnotherRectangle.qml import QtQuick 2.0 import QtQuick.Controls 2.0 Item { property alias rectangleId : recId; Rectangle { id: recId } } main.qml import QtQuick 2.13 import QtQuick.Window 2.13 Window { visible: true width: 640 height: 480 AnotherRectangle { anchors.centerIn: parent width: parent.width / 2 height: parent.height / 2 rectangleId.color: "Red" rectangleId.width: 100 rectangleId.height: 200 } }
  10. نیما غراب

    @قاسم رمضانی منش خیلی ممنونم ازتون. همون اول توضیحات هر کلاس که مینویسه مثلا Rectangle از Item ارث میبره منظورم بود. قبلش من در این مورد جست و جو کردم ولی چیزی پیدا نکردم. آقا قاسم این کلاس AnotherRec از بیرونی‌ترین شی تعریف شده در فایل AnotherRec.qml فقط ارث میبره؟ یعنی اگر فرضا همین Rectangle رو در داخل یک Item بزاریم دیگه از Rectangle چیزی ارث نمیبره؟ سپاس فراوان.
  11. قاسم رمضانی منش

    سلام؛ فکر کنم منظورتون این باشه : AnotherRec.qml import QtQuick 2.0 Rectangle { } main.qml import QtQuick 2.13 import QtQuick.Window 2.13 Window { visible: true width: 640 height: 480 AnotherRec { anchors.centerIn: parent; width: parent.width / 2; height: parent.height / 2; color: "gray"; } } که اینجا ما یک کامپوننت جدیدی درست کردیم که از Rectangle به ارث برده، بد نیست اون مستنداتی هم که خوندید رو ارسال کنید شاید بحث کلاً یه چیز دیگه‌ای بوده باشه.
  12. سلام بر دوستان و اساتید گرامی. من در مستندات QML زیاد دیدم که نوشته فلان جز از جزئی دیگر ارث برده. حالا سوالم اینجاست که این وراثت با خود QML پیاده سازی میشه یا در سمت C++ این کار رو انجام میدن؟ اگر وراثت با خود QML قابل پیاده‌سازی هست میشه در مثالی ساده توضیح بدین؟ سپاس گزارم.
  13. جدیدا
  14. سید عمید قائم مقامی

    Windows Access Control List (ACL) قسمت دوم (مفاهیم) مباحث مورد بررسی در این مقاله: Access Rights for Access-Token Objects Security Descriptors Securable Objects Access Rights for Access-Token Objects: برنامه نمی تواند لیست کنترل دسترسی یک شئ را تغییر دهد مگر اینکه برنامه حق انجام آن کار را داشته باشد. این حقوق توسط یک security descriptor در access token شئ کنترل می شود. برای گرفتن یا تنظیم کردن security descriptor برای یک access token، می توانید تابع GetKernelObjectSecurity() و تابع SetKernelObjectSecurity() را فراخوانی کنید. زمانی که تابع OpenProcessToken() یا OpenThreadToken() را برای گرفتن یک هندل access token فراخوانی می کنید، سیستم دسترسی درخواستی را در برابر DACL در security descriptor توکن بررسی می کند. موارد زیر حقوق دسترسی معتبر برای اشیاء دارای access token می باشند: DELETE، RED_CONTROL، WRITE_DAC و WRITE_OWNER دسترسی استاندارد می باشند. Access token از SYNCHRONIZE به عنوان دسترسی استاندارد پشتیبانی نمی کنند. ACCESS_SYSTEM_SECURITY برای دریافت یا تنظیم SACL در security descriptor شئ. در قسمت زیر دسترسی خاص برای access token ها ذکر شده اند: TOKEN_ADJUST_DEFAULT: مورد نیاز برای تغییر owner، primary group یا DACL یک access token. TOKEN_ADJUST_GROUPS: مورد نیاز برای تنظیم ویژگی های (attributes) یک گروه در یک access token. TOKEN_ADJUST_PRIVILEGES: مورد نیاز برای فعال یا غیر فعال کردن یک privileges در یک access token. TOKEN_ADJUST_SESSIONID: مورد نیاز برای تنظیم session ID یک access token. امتیاز(privilege) SE_TCB_NAME مورد نیاز می باشد. TOKEN_ASSIGN_PRIMARY: مورد نیاز برای متصل شدن به یک primary token یک فرایند. برای انجام این کار امتیاز SE_ASSIGNPRIMARYTOKEN_NAME مورد نیاز است. TOKEN_DUPLICATE: مورد نیاز برای کپی کردن یک access token. TOKEN_EXECUTE: STANDARD_RIGHTS_EXECUTE و TOKEN_IMPERSONATE را ترکیب می کند. TOKEN_IMPERSONATE: مورد نیاز برای متصل شدن به یک impersonation access token یک فرایند. TOKEN_QUERY: مورد نیاز برای پرس و جو درباره یک access token. TOKEN_QUERY_SOURCE: مورد نیاز برای پرسو جو در باره منبع (source) یک access token. TOKEN_READ: ترکیبی از STANDARD_RIGHTS_READ و TOKEN_QUERY می باشد. TOKEN_WRITE: ترکیبی از STANDARD_RIGHTS_WRITE، TOKEN_ADJUST_PRIVILEGES، TOKEN_ADJUST_GROUPS و TOKEN_ADJUST_DEFAULT می باشد. TOKEN_ALL_ACCESS: ترکیبی از تمام دسترسی های ممکن مرتبط با token. Security Descriptors: یک security descriptor از اطلاعات امنیتی تشکیل شده است که با یک securable object مرتبط است. یک security descriptor از یک ساختار SECURITY_DESCRIPTOR که با security information مرتبط است تشکیل شده. یک security descriptor می تواند شامل security information زیر باشد: SID های owner و primary group یک شئ. یک DACL که حقوق دسترسی، که تعیین کننده مجاز بودن یا رد شدن دسترسی یک کاربر یا گروه خاصی را مشخص می کند. یک SACL که انواع تلاش های دسترسی که سوابق حسابرسی را برای شئ ایجاد شده مشخص می کند. مجموعه ای از بیت های کنترلی که به معنای یک security descriptor یا اعضای جداگانه آن است. ویندوز تابع هایی (API) را برای تنظیم یا بازیابی کردن security information موجود در security descriptor اشیاء ارائه کرده است. بعلاوه، تابع هایی نیز برای ساخت و مقدار دهی (اولیه) کردن یک security descriptor برای یک شئ وجود دارد. برنامه هایی که با security descriptor ها در اشیاء Active Directory کار می کنند می توانند از توابع امنیتی ویندوز یا رابط های امنیتی ارائه شده توسط Active Directory Service Interfaces (ADSI) استفاده کنند. Securable Objects: یک Securable Objects یک شئ است که می تواند یک security descriptor داشته باشد. هر نوع از Securable Object مجموعه ای از دسترسی های خاص و دسترسی های عمومی را تعریف می کند. در قسمت پایین می توانید تابع هایی را مشاهده کنید که برای دستکاری اطلاعات امنیتی برخی از Securable Objects مشترک نشان می دهد. Files or directories on an NTFS file system: GetNamedSecurityInfo()، SetNamedSecurityInfo()، GetSecurityInfo()، SetSecurityInfo() Named pipes, Anonymous pipes: GetSecurityInfo()، SetSecurityInfo() Processes, Threads: GetSecurityInfo()، SetSecurityInfo() File-mapping objects: GetNamedSecurityInfo()، SetNamedSecurityInfo()، GetSecurityInfo()، SetSecurityInfo() Access tokens: SetKernelObjectSecurity()، GetKernelObjectSecurity() Window-management objects (window stations and desktops): GetSecurityInfo()، SetSecurityInfo() Registry keys: GetNamedSecurityInfo()، SetNamedSecurityInfo()، GetSecurityInfo()، SetSecurityInfo() Windows services: GetNamedSecurityInfo()، SetNamedSecurityInfo()، GetSecurityInfo()، SetSecurityInfo() Local or remote printers: GetNamedSecurityInfo()، SetNamedSecurityInfo()، GetSecurityInfo()، SetSecurityInfo() Network shares: GetNamedSecurityInfo()، SetNamedSecurityInfo()، GetSecurityInfo()، SetSecurityInfo() Interprocess synchronization objects (events, mutexes, semaphores, and waitable timers): GetNamedSecurityInfo()، SetNamedSecurityInfo()، GetSecurityInfo()، SetSecurityInfo() Job objects: GetNamedSecurityInfo()، SetNamedSecurityInfo()، GetSecurityInfo()، SetSecurityInfo() Directory service objects: این اشیاء توسط Active Directory Objects اداره شده. تصویر زیر یک مثال از رابطه بین securable object (a folder) و security descriptor را نمایش می دهد. پایان قسمت دوم
  15. قاسم رمضانی منش

    باید متغیر را به‌صورت unsubstituted به List ارسال کنیم تا مقدار درست را برایمان برگرداند.
  16. قاسم رمضانی منش

    نیاز دارم که برقرار بودن ارتباط به اینترنت در Build System پروژه بررسی کنم، از این رو با استفاده از تابع file یک آزمایشی می‌کنم: file( DOWNLOAD www.google.com ${CMAKE_SOURCE_DIR}/Test STATUS ERROR_CODE ) و خروجی در متغیر ERROR_CODE به حاوی شمارهٔ کد و متن خطا به‌صورت یک لیست ذخیره می‌شود : امّا نمی‌توانم با استفاده از تابع list و ورودی GET اقدام به دریافت یک مقدار بر اساس اندیس آن می‌کنم: list(GET ${ERROR_CODE} 0 MESSAGE_OUT) message(${MESSAGE_OUT}) امّا خروجی NOTFOUND می‌دهد، به این‌صورت نیز بررسی کرده‌ام: set(WITHOUT_ERROR "No error") foreach(VAR ${ERROR_CODE}) if(${VAR} EQUAL ${WITHOUT_ERROR}) message("Ghasem is here without error.") endif() endforeach() امّا باز خروجی‌ای حاصل نشد. به چه صورت می‌توان این مشکل را حل کرد ؟
  17. سلام وقت همگی به خیر برنامه ای میخوام بنویسم در qt که تصاویر و فیلم دوربین تحت شبکه را بگیرم و ذخیره کنم مثالهایی که تو سایت گیت هاب بود را امتحان کردم ولی اکثرا به کتابخانه هایی وابسته هستند که زیاد معروف نیستند و اجرای آنها هم اکثرا با خطاهای تو در تو مواجه می شود که عمدتا به خاطر کتابخانه هاشون هست با خود opencv تصویر دوربین را با کارت کپچر گرفتم ولی تحت شبکه را هنوز نتوانستم راه بیندازم مثال و یا کدی ندارید که بتونه بهم کمک کنه؟ ممنون
  18. سید عمید قائم مقامی

    Windows Access Control List (ACL) قسمت اول (مفاهیم) مباحث مورد بررسی در این مقاله: Access Control Access Control Model Access Control Components مقدمه: در این مقاله ما تلاش میکنیم که چگونگی اجرای امنیت در سیستم عامل های ویندوز را یادبگیریم. Access Control یکی از مهمترین و اساسی ترین مباحث در Windows SDK Platform از دسته امنیتی می باشد. ما با Access Control که در ویندوز استفاده میشود شروع می کنیم و سپس در هر بخش ، به جزئیات بیشتری می پردازیم. در این مسیر ما توابع موجود برای دستکاری و تعامل با شیئ های متنوع ویندوز در بحث امنیت را نیز بررسی می کنیم. برنامه کاربردی در بخش های بعدی ارائه خواهد شد. برنامه نمونه، برنامه سطح پایین به زبان C ، بدون هیچ رابط کاربری گرافیکی (GUI) برای یادگیری بهتر می باشد. Access Control: در سند های ماکروسافت (MSDN) ذکر شده است که در آغاز، سیستم عامل های ویندوز از استاندارد منسوخ کلاس C2 پیروی می کردند. Access Control به این موضوع اشاره میکند که چه کسی به چه منابعی از سیستم عامل میتواند دسترسی داشته باشد. برنامه ها توابع کنترل سطح دسترسی را فراخوانی می کنند تا تنظیم کنند که چه کسی میتواند به منابع خاصی دسترسی داشته باشد، یا اینکه دسترسی به منابع فراهم شده توسط برنامه ها را کنترل کند. Access Control Model: Access Control Model شما را قادر می سازد توانایی یک فرایند را برای دسترسی به securable object ها یا انجام کارهای مختلف مدیریت سیستم، کنترل کنید. یک فرایند، یک security context است که یک برنامه در آن اجرا می شود. معمولا security context با کاربر مرتبط است، بنابر این تمام برنامه ها تحت token فرایند، با permissions و privilegesصاحب کاربر اجرا می شوند. Access Control Components: دو مولفه اساسی در مدل کنترل دسترسی وجود دارد: Access tokens: که شامل اطلاعاتی در مورد کاربر داخل شده می باشد. Security descriptors: که حاوی اطلاعات امنیتی است که از یک securable object محافظت می کند. زمانی که یک کاربر وارد سیستم می شود، سیستم نام و رمز عبور کاربر را تایید می کند. اگر ورود به سیستم موفقیت آمیز بود، سیستم یک access token تولید می کند. هر فرایندی که به نمایندگی از این کاربر اجرا می شود یک نسخه از این access token را خواهد داشت. access token از شناسه های امنیتی (SID) تشکیل شده که حساب کاربری (user account) و هر حساب گروهی (group accounts) را که کاربر به آن تعلق دارد را شناسایی می کند. این شناسه حاوی لیستی از privileges است که توسط کاربر یا گروه کاربرها نگهداری می شوند. سیستم زمانی که یه فرایند سعی می کند تا به یک securable object دسترسی پیدا کند یا درخواست گرفتن امتیاز administration را می دهد، از این نشانه برای شناسایی کاربر استفاده میکند. وقتی یک securable object ایجاد می شود، سیستم به آن security descriptor اختصاصی می دهد که حاوی اطلاعات امنیتی است که توسط سازنده آن مشخص شده است، یا اگر توسط سازنده مشخص نشده باشد اطلاعات امنیتی پیش فرض را به آن اختصاص می دهد. برنامه ها می توانند از توابع برای بازیابی و تنظیم اطلاعات امنیتی برای یک شئ موجود استفاده کنند. security descriptor مالک شئ را مشخص می کند و میتواند شامل access control lists (ACLs) زیر باشد: Discretionary access control list (DACL): کاربرها و گروه هایی را که اجازه دسترسی به شئ را دارند یا ندارند مشخص می کنند. System access control list (SACL): که نحوه کنترل حسابرسی سیستم را برای دسترسی به شئ کنترل می کند. یک ACL از لیستی از access control entries (ACEs) تشکیل شده. هر ACE یک مجموعه حقوق دسترسی را مشخص می کند که شامل یک SID می شود که یک سرپرست برای کسی که حق اجازه دادن، رد کردن یا حسابرسی را می دهد، مشخص میکند. یک حساب کاربری (user account)، گروه کاربری (group account)، جلسه ورود (logon session) میتواند یک سرپرست باشد. یک جلسه ورود زمانی آغاز می شود که کاربر وارد کامپیتر شود. تمام فرایندها در یک logon session دارای primary access token شبیه به یکدیگر می باشند. access token شامل اطلاعات درباره security context جلسه ورود ، شامل SID کاربر، شناسه ورود به سیستم و logon SID می باشد. تصویر زیر نشان می دهد که وقتی یک کاربر وارد سیستم می شود چه اتفاقی می افتد. به خاطر داشته باشید که کاربر نکته مهمی نیست، بلکه نام کاربری و رمزعبور وی در سیستم ایجاد شده است. کاربر تنها به عنوان یک شئ در ویندوز اعتبار دارد. یک access token یک شئ است که security context یک فرایند یا ریسمان را توصیف می کند. اطلاعات داخل token شامل هویت و امتیازات یک حساب کاربر مرتبط با فرایند یا ریسمان می باشد. زمانی که یک کاربر وارد سیستم می شود، سیستم رمز ورود کاربر را با اطلاعات ذخیره شده در پایگاه داده امنیتی خود مقایسه کرده، و آن را تایید یا رد میکند. اگر رمز ورود تایید گردد، سیستم یکaccess token تولید میکند. هر فرایندی از طرف این کاربر اجرا گردد یک کپی از این access token را دارد. سیستم از این access token برای شناسایی کاربر، زمانی که یک ریسمان با یک شئ قابل اطمینان در تعامل است یا تلاش می کند که یک کار سیستمی را انجام دهد که به امتیاز (خاصی) نیاز دارد استفاده میکند. access token ها از اطلاعات زیر تشکیل شدند: SID صاحب حساب. SID های گروه هایی که کاربر عضو آن هستند. SID ورود به سیستم نشان دهنده logon session اخیر می باشد. لیستی از privilege هایی که توسط کاربر یا گروه های کاربر در اختیار دارد. صاحب SID. SID برای primary group. DACL پیشفرض، که سیستم از آن استفاده می کند، زمانی استفاده می شود که کاربر یک securable object، بدون مشخص کردن یک security descriptor می سازد. منبع access token. اینکه آیا token یک token اصلی است یا جعل هویت است (primary or impersonation). لیست اختیاری محدود کننده SID ها(optional list of restricting SIDs). سطح جعل هویت جاری. سایر آمار. هر primary token یک access token است که معمولا فقط به وسیله هسته ویندوز ساخته می شود. ممکن است آن به یک فرآیند اختصاص داده شود تا اطلاعات امنیتی پیش فرض برای آن فرآیند را نشان دهد. impersonation token یک access token است که برای گرفتن اطلاعات امنیتی یک فرآیند کلاینت ایجاد شده است و به سرور اجازه می دهد تا فرایند کلاینت را در عملیات امنیتی جعل هویت کند. هر فرایند یک primary token دارد که security context حساب کاربر که با فرایند مرتبط است را توصیف میکند. به صورت پیشفرض، سیستم از primary token زمانی استفاده می کند که یک ریسمان یک فرایند با یک securable object در تعامل باشد. علاوه بر این، یک ریسمان می تواند یک حساب کاربر را جعل هویت کند. جعل هویت به ریسمان اجازه می دهد با استفاده از security context با securable object ها در تعامل باشد. ریسمانی که کلاینت را جعل هویت می کند هر دو خاصیت primary token و impersonation token را دارد. شما می توانید با فراخوانی تابع OpenProcessToken() هندل primary token فرایند را بازیابی کنید. AdjustTokenGroups(): اطلاعات گروه را در access token تغییر می دهد. AdjustTokenPrivileges(): یک (یا چند) privilege را در access token فعال یا غیر فعال می کند. CheckTokenMembership(): مشخص میکند که یک SID مشخص شده در یک access token فعال است یا خیر. CreateRestrictedToken(): یک access token جدید می سازد که یک نسخه محدود شده از access token موجود می باشد. restricted token های شده می توانند SID های غیر فعال، privilege های پاک شده، و یک لیست از SID های محدود شده داشته باشند. DuplicateToken(): یک access token جدید از روی access token موجود می سازد. DuplicateTokenEx(): یک primary token یا impersonation token می سازد که یک نسخه از یک access token موجود را کپی می کند. GetTokenInformation(): اطلاعات یک access token را بازیابی می کند. IsTokenRestricted(): مشخص میکند که آیا یک token یک لیست از SID های محدود کننده دارد یا نه. OpenProcessToken(): هندل یک primary access token که مربوط به به یک فرایند است را بازیابی می کند. OpenThreadToken(): هندل یک impersonation access token که مربوط به به یک نخ است را بازیابی می کند. SetThreadToken():به یک نخ یک impersonation token را حذف یا اختصاص می دهد . SetTokenInformation(): صاحب token، primary group یا DACL پیشفرض را تغییر می دهد. تابع های access token از ساختار های زیر برای توصیف کامپوننت های access token استفاده می کنند. TOKEN_CONTROL: اطلاعاتی که یک access token را مشخص می کند. TOKEN_DEFAULT_DACL: عضو DACL پیش فرض سیستم که از آن در security descriptors اشیائ جدیدی که توسط نخ ها ساخته می شود استفاده می کند. TOKEN_GROUPS: یک (یا چند) SID و ویژگی های group SID ها در access token را مشخص می کند. TOKEN_OWNER: مالک پیش فرض SID برای توصیف کننده اشیائ جدید. TOKEN_PRIMARY_GROUP: یک primary group SID پیش فرض برای توصیف کننده امنیت شئ جدید. TOKEN_PRIVILEGES: یک privilege مرتبط با یک access token. همچنین مشخص می کند که آیا privilege ها فعال شده اند یا خیر. TOKEN_SOURCE: منبع access token. TOKEN_STATISTICS: آمار مرتبط با یک access token. TOKEN_USER: SID کاربر مرتبط با access token. تابع های access token از enumeration type های زیر استفاده می کنند. TOKEN_INFORMATION_CLASS: نوع اطلاعاتی که قرار است ازaccess token گرفته شود یا تنظیم شود را مشخص می کند. TOKEN_TYPE: نوع access tokenرا مشخص میکند که قرار است از نوع primary یا impersonation باشد. تصاویر دیگر از ساختار token: مثال: Privilege: حق سیستم برای انجام کارهای مختلف مربوط به سیستم مانند خاموش کردن سیستم، بارگیری دیوایس درایور یا تغییر زمان سیستم. access token کاربر، شامل یک لیست از privilege ها که به وسیله کاربر یا گروه کاربر ها نگه داری می شود. securable object: یک شئ است که می تواند یک security descriptor داشته باشد. هر چیزی در ویندوز که Windows objects نام گرفته باشد securable است. برخی اشیاء بی نام، مانند اشیاء process و thread، هم نیز می توانند security descriptors داشته باشند. برای اکثر securable object میتوانید یک security descriptor در هنگام فراخوانی تابع سازنده شئ مشخص کنید. برای مثال می توانید security descriptor را در توابع CreatFile و CreatProcess مشخص کنید. به علاوه، تابع های امنیتی ویندوز شما را قادر می سازند تا اطلاعات امنیتی securable objects سیستم عامل های دیگر را گرفته یا تنظیم کنید. security context: ویژگی های امنیتی یا قانون هایی که در حال حاضر قابل اجرا هستند. برای مثال، کاربر فعلی که وارد سیستم شده است یا شماره شناسایی شخصی که با یک کارت هوشمند وارد شده. security descriptor: ساختار و داده های همراه که شامل اطلاعات امنیتی برای یکsecurable object است. security descriptor صاحب شئ و primary group را مشخص می کند. همچنین میتواند حاوی یک DACL (که دسترسی به یک شئ را کنترل می کند)، و یک SACL (برای کنترل دستیابی به شئ) است. پایان قسمت اول
  19. کامبیز اسدزاده

    خب فونت کل متن تغییر خواهد کرد! و این روش درستی هست. اما اگر می‌خواهید در بحث درون‌خط متنی که نوشتی یعنی «سلام بر World در زبان ++C» متن فارسی جدا و انگلیسی جدا تغییر کنند باید به فکر فونت فارسی باشی که داخلش از لاتین‌های سفارشی استفاده می‌کنه. مثل صمیم، ساحل و یا فونت‌های تجاری دیگر. در این صورت هم نیاز نیست دو تا فونت معرفی کنی، همون یک مدل کافی هست، به شرطی که از فونت لاتین استفاده کند.
  20. نیما غراب

    @کامبیز اسدزاده دستتون درد نکنه خیلی ممنونم. این کدی که گفتین نتیجه عکسی میشه که پیوست کردم؟ مستطیل سبز یک Field هست که همزمان از دو نوع فونت برای نمایش متن استفاده شده فارسی بی نازنین هست و انگلیسیش تایمز نیو رومن. من مشابه این کدی که گفتین رو نوشتم ولی فونت کل متن باهم تغییر میکنه!
  21. کامبیز اسدزاده

    سادست، کافیه یک دستور شرطی ساده براش در نظر بگیری، مثل نمونه‌ی زیر: property bool isLatin : false .. ... .... Text { font.family: isLatin ? fontSystem.getEnglishFont.name : fontSystem.getPersianFont.name .. .... }
  22. نیما غراب

    @کامبیز اسدزاده آقا کامبیز اگر بخوایم همزمان دو یا هر چند نوع فونتی که بخوایم رو در یک TextFieldیا TextInputیا... داشته باشیم باید چه کنیم؟ تغییر خاصیت font.family باعث میشه فونت کل متن باهم عوض شه در حالی که چیزی که مد نظر منه این هست که هرچی کارکتر فارسی هست فونتشون مثلا بی نازنین باشه و هرچی انگلیسی هست تایمز نیو رومن منتهی در یک TextFieldیا TextInputیا... الان با localeمیشه تشخیص داد کارکتر وارد شده انگلیسی هست یا فارسی ولی نمیدونم چه طوری باید همزمان روی یک متن دو یا چند نوع فونت رو اعمال کرد! سپاس گزارم.
  23. کامبیز اسدزاده

    پاسخ به این سوأل صرفاً از نظر نوع زبان کافی نیست و شاید منطقی نباشد. و چون ساختار و قوانین تحت چهارچوب مشخصی برای این موضوع نداریم، از نظر من دلایل بسیاری وجود دارد که بر روی قیمت‌گذاری می‌تواند تأثیرگذار باشد که به آن‌ها اشاره می‌کنم: تجربه و کیفیت خدماتِ قابل ارائه‌ی فرد یا شرکت توسعه‌دهنده جهت انجام آن اینکه شخص یا شرکت مربوطه بتواند تضمین کند یا آسودگی خاطر را به مشتری بدهد که پروژه‌ی آن در زمان مشخص با نتیجه‌ی قابل قبول ارائه خواهد شد بسیار مهم است، قطعاً اطمینان خاطر و جلوگیری از احتمالات دوباره‌کاری و نا رضایتی خودش ارزشمند خواهد بود که ممکن است در هزینه‌ی نهایی پروژه موثر باشد. تضامین و خدمات پس از فروش «پشتیبانی، به‌روز‌رسانی و غیره» هرچند پشتیبانی و به‌روزرسانی محصولات نرم‌افزاری یکی از مراحل توسعه و چرخه‌ی نرم‌افزار است، اما در دسترس بودن و تضمین پشتیبانی از سمت توسعه‌دهنده قطعاً در هزینه‌های آن نسبت به دیگر موارد متفاوت خواهد بود. نوع قرارداد و مذاکراتی که ممکن است طرفین در قبال تعهد به آن‌ها هزینه‌هایی را اضافه کند معمولاً در قرارداد‌های طرفین به نکاتی اشاره می‌شود، مانند: در دسترس بودن منبع‌کد «سورس‌کد» و یا مستند سازی غیر معمول و اختصاصی که حتماً در قیمت نهایی یک محصول و پروژه موثر خواهد بود. محدودیت‌ها و دلایل قانع کننده برای انتخاب یک ابزار و نیاز به دانش و مهارت‌های تخصصی ممکن است پروژه‌ای که به شما پیشنهاد می‌شود، با یک سری محدودیت‌های فنی بر اساس نوع زبان، مهارت و بستر‌های پیاده‌سازی مواجه باشد که با توجه به ارائه‌ی راه‌کار‌های مناسب توسط متخصص «توسعه‌دهنده» که واقعاً نیاز به تجربه و دانش در حل آن است وابسته خواهد بود. در چنین حالت‌های ارزش حل مسائل می‌تواند در خود پروژه تأثیر‌ بگذارد. در نهایت بعد از بررسی موارد این چنینی که من تنها به برخی از آن‌ها اشاره کردم، می‌توانید به خروجی‌ها و نتایج حاصل از خود ابزار که در اینجا «++C» است اشاره کرده و مشتری را نسبت به آن قانع کنید. برای مثال، ویژگیِ چند-سکویی خود به تنهایی یک مزیت بسیار بزرگ است که می‌تواند در حذف هزینه‌های احتمالی مانند بازنویسی در زمان توسعه و به‌روز رسانی در قالب سکو‌های مختلف موثر باشد. نوع مذاکره در ساخت و توسعه در قالب زمان مشخص برای ساده‌سازی مسئله و حل باید‌ها و نباید‌ها نیز مشخص سازی یک نرخ یا رنج قیمت برای کار بر روی پروژه می‌تواند موثر باشد. برای مثال، بر اساس تعداد ساعت و زمان مشخص در روز می‌توانید یک محاسبه‌ی مشخصی برای مشتری خود انتقال دهید تا هم زمان تحویل و هم مدت زمات مورد نیاز برای توسعه را بداند. درباره‌ی همین موضوع چند-سکویی که تنها یک ویژگی از مزایای سی‌پلاس‌پلاس است مثالی بزنم: فرض کنید قرار است مشتری یک نرم‌افزار تحت موبایل از شما درخواست کند، در این صورت اگر قرار باشد منطقی مذاکره کنید، بهتر است مشتری را متوجه این سازید که برای ساخت یک اپلیکیشن در سکو‌های مختلف مانند iOS، Android و غیره نیاز به تخصص، زمان و هزینه‌های جدا از هم است. اما اگر شما به عنوانی توسعه‌‌دهنده‌ی تمام عیار فول‌اِستک هستید، می‌توانید مشتری را قانع کنید که صرفاً با یکپارچه‌سازی کد‌های توسعه و ساختار بهینه‌ی برنامه‌های نوشته شده‌ی تحت سی++ از صرف هزینه‌های احتمالی جهت توسعه‌ جلوگیری می‌کنید و حتی در آینده نیازی نیست هزینه‌های اضافه بر مشتری تحمیل کنید. در این رابطه باید به یک هزینه‌ی قابل قبول همراه با حفظ ارزش‌های وارده را مطرح کنید. برای مثال، اگر قرار است یک اپلیکیشن برای دو پلتفرم مختلف توسعه یابد، اگر قیمتی بابت یک نرم‌افزار در دو سکوی مختلف استعلام و یا تخمین زده شده باشد، بهتر است شما با در نظر گرفتن نصف و یا حد‌اکثر دو سوم آن همان کارها را با حفظ ارزش‌های فنی و کاربری مشتری انجام دهید. بر اساس چنین مواردی نیازی به افزایش یا کاهش هزینه‌ها در یک پلتفرم وجود ندارد چرا که تنها کاری که انجام خواهید داد هم‌گردانی «کامپایل» کد‌ها بر روی پلتفرم دیگر خواهد بود.
  24. سلام بر دوستان و اساتید گرامی. پایه و اساس قیمت گذاری یک برنامه C++ چگونه هست؟ با سپاس فراوان.
  25. مهمان

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

    چگونه با مشتریِ خود صحبت کنیم

    با سلام و درود، همه‌ی ما می‌دانیم که امروزه کسب‌و‌کار‌های اینترنتی و وابسته به فناوری‌های مبتنی بر نرم‌افزار، یکی از حوزه‌هایی به شمار می‌رود که در چهارچوب خود می‌توانند پیشرفت بسیار چشم‌گیری داشته باشند. بنابراین، هر فردی که ایده‌ای در ذهن خود برای خلق یک کسب‌و‌کار دارد می‌تواند وارد این حوزه‌ی «کسب‌و‌کار‌های» اینترنتی شود. در این مقاله من به عناوین زیر اشاره خواهم کرد: گفتگوی صمیمانه و آزاد «مشاوره و ارزیابی مسائل» واقعیت‌هایی که مشتریان از آن‌ها آگاه نیستند مشتری را برای مقایسه و دیدن نمونه‌های واقعی تشویق کنید معرفی و توصیف ابزار‌هایی که از آن‌ها برای تولید و توسعه استفاده می‌کنید صداقت شما و تضمین وفاداری مشتری قرارداد، ارزیابی هزینه‌ها و زمان توسعه مشاوره‌ی رایگان یا پولی چگونه از دیگر برنامه‌نویسان و توسعه‌دهندگان متمایز و به یک برنامه‌نویس واقعی و حرفه‌ای تبدیل شویم؟ به‌روز باشید و از رفتار‌های تعصبی بپرهیزید محصولات با کیفیت در سطح جهانی تولید کنید خدمات پشتیبانی، تضمین پاسخگو بودن طبیعی است که راه‌اندازی چنین مواردی نیاز به دانش و مهارت‌های تخصصی در حوزه‌ی مهندسی کامپیوتر، نرم‌افزار و شاخه‌های دیگر آن خواهد داشت. برای مثال: راه‌اندازی یک وب‌سایت برای معرفی کسب‌و‌کار مشتری نیازمند یک فرآیند ارزیابی، استعلام، ثبت، تخصیص فضای میزبانی، طراحی، برنامه‌نویسی، توسعه و پشتیبانی است. در این حالت مشتری می‌بایست با مراجعه به یکی از شرکت‌ها و یا متخصص‌های این حوزه خواسته‌ی خود را به آن ارائه کند تا مطابق با آن کسب‌و‌کار ارزیابی و توسعه یابد. اگر شما به دنبال این هستید که سریعاً مشتری خود را قانع و پروژه‌ای را برای انجام بپذیرید، شک نکنید که احتمال شکست و نارضایتی در هر دو طرف بسیار بالا خواهد بود. ممکن است شما رزومه‌ی بسیار قوی‌ با نمونه‌کار‌های بسیار جذاب در اختیار داشته باشید که مشتری در لحظه‌ی اول به توانایی‌های شما مطمئن شود. اما این به تنهایی کافی نیست! گفتگوی صمیمانه و آزاد «مشاوره و ارزیابی مسائل» در این مقاله من به برخی از مشکلات مهمی که مشتریان در ابتدای کار با آن مواجه هستند می‌پردازم که عبارتند از: عدم شناخت کافی به ابزار‌ها، روش‌ها، الگو‌ها و حتی افراد و شرکت‌های انجام دهنده‌ی این خدمات. جالب است بدانید که مشتری بر اساس دانسته‌ها، شنیده‌ها و همچنین دیده‌های خود از الگو‌های نه چندان ارزیابی شده تصویری را از کسب‌و‌کار خود ترسیم می‌کند که کاملاً خام است که اگر توسط متخصصین مورد بررسی قرار نگیرد ممکن است به مسیر نادرست و نا آگاهانه‌ای هدایت شوند که نتیجه‌ی آن به جز ناامیدی و نا رضایت مشتری نخواهد بود. بنابراین اگرچه دنیای طراحی و توسعه‌ی نرم‌افزار می‌تواند همه‌گیر باشد، اما واقعیت آن است که «باید کار را به کاردان سپرد» کاردان‌هایی که می‌توانند با مورد ارزیابی قرار دادن ایده‌های ذهنی مشتری آن را درک، هدایت و بهبود بخشد. من در بسیاری از جلسات کاری خودم برای شنیدن خواسته‌های مشتری نسبت به طرحی که در ذهن خود داشته این مشکلات را به خوبی دیده و درک می‌کنم. به عنوان مثال: مشتری در ابتدای کار مایل به بیان سریع تصویری از ایده یا راه‌کار خود برای توسعه‌ی کسب‌و‌کاری است که شامل استراتژی کامل و نهایی شده‌ای نیست. البته من اطمینان می‌دهم این اشتباهات طبیعی بوده و یکی از وظایف برنامه‌نویسان حرفه‌ای این است که با متکی بودن به علم روان‌شناسی و هم‌دلی در شنیدن خواسته‌های مشتری سعی در تأیید همراه با اصلاح و هدایت آن به بهترین سمت ممکن باشد. در نظر داشته باشید که احتمال بسیار زیادی وجود دارد که ابتدای کار در همان دقایق اولیه جلسه مطالبی را از مشتری خود بشنوید که واقعاً در کسب‌و‌کار او نیاز نیست و یا حتی فراتر و متفاوت‌تر از آن چیزی است که در عمل باید به آن متکی بود. حتی در همان دقایق اول احتمال بسیار زیادی دارد که از مشتری چنین سوألاتی را بشنوید «شما بابت این کار چقدر هزینه می‌گیرید؟» البته این نوع سوألات حتی در پشت تلفن نیز پرسیده می‌شود، اما برای اینکه ارزش کار خودتان را حفظ کنید توصیه می‌شود هیچ‌گاه بدون ارزیابی و اصول حرفه‌ای در شنیدن خواسته‌ی مشتری خود نه قیمت و نه زمانی برای انجام درخواست ارائه ندهید. این روشی ناشیانه است که معمولاً افراد غیر متخصص به کار می‌گیرند. بنابراین توصیه می‌شود صحبت‌ها و ایده‌های مشتری خود را با دقت گوش کنید. تأکید می‌کنم به هیچ عنوان ایده‌ی مشتری خود را سریعاً نکوبید و آن را رد نکنید «این امر موجب می‌شود مشتری نظرش در مورد شما تغییر کند» این روش در شأن متخصص حرفه‌ای نیست. چرا که یکی از وظایف مهم شما ارائه‌ی یک راهکار و مشاوره‌ی مفید قبل از اخذ قرارداد و انجام آن است. سعی کنید سوأل‌هایی را بپرسید که مشتری خود به آن‌ها فکر نکرده است و با شنیدن آن حتماً نظرش جلب و از بُعد دیگری به کسب‌و‌کار خود و توسعه‌ی آن نگاه خواهد کرد. شما به عنوان مشاور فنی باید بتوانید مشتری را قانع کنید که چه موردی ارزشمند و کدام بخش از خواسته‌های آن ارزش آن‌چنانی ندارد! چرا که مشتری نیاز دارد به مشکلات و ارزش‌هایی که در طرح ذهنی خود وجود دارد آگاه باشد تا به راحتی بتواند یک تصمیم صحیح بگیرد. واقعیت‌هایی که مشتریان از آن‌ها آگاه نیستند قطعاً واقعیت‌هایی وجود دارد که مشتریان از آن‌ها آگاه نیستند، چرا که آن‌ها متخصص و افراد فنی نیستند. بنابراین احتمال بسیار زیاد دارد که مشتری ابتدا نمونه‌ای از خواسته‌های خود را برای شما معرفی کند. به عنوان مثال: معرفی یک نمونه وب‌سایت یا نرم‌افزار (اپلیکیشن) که در نظر او بسیار جذاب و قابل قبول است. تمامی این مسائل وجود خواهد داشت، شما باید در نظر داشته باشید که تفاوت یک نمونه با خواسته‌ی مشتری را شفاف سازی کنید. اگر قرار است بر اساس سلیقه‌ی مشتری با او همکاری کنید بهتر است بدانید شما متخصص نیستید و نتیجه‌ی پروژه‌ای که بر روی آن کار خواهید کرد مطابق میل شما در بُعد تخصصی نخواهد بود. نمونه وب‌سایت مثال زده شده توسط مشتری را در مقابل خود مشتری ارزیابی کنید، اگر شما یک حرفه‌ای باشید قطعاً می‌توانید الگو‌های پیاده سازی شده، روش‌های برنامه‌نویسی، سیستم‌ نرم‌افزاری، بستر‌ها، تجربه‌‌کاربری و رابط‌کاربری آن را بررسی و نظر خود را برای مشتری ارائه دهید. در نظر داشته باشید زمانی که مشتری برای شما نمونه مثالی را ارائه می‌کند که شاید تا حدی با ایده‌ی ذهنی آن یکسان است، شما باید در نظر داشته باشید که اصول اساسی تولید محصولی که در نظر دارد را به او توضیح دهید. مشتری باید بداند که رفتار کاربر‌ها، تجربه‌کاربری، برندینگ و اصول چیده‌مان و همه‌ی موارد دیگر در عین حال سادگی در کاربرد آن چقدر مهم است. تجربه‌کاربری هرچند برای خود یک تخصص کامل است، اما مشتری نیاز دارد تا شما در مورد این نکته‌ها به او یادآوری کنید. اگر شما فقط یک برنامه‌نویس هستید بهتر است مراجعی را برای مشتری و حتی خودتان در نظر بگیرید تا در بهتر شدن محصول مشارکت کند. مشتری را برای مقایسه و دیدن نمونه‌های واقعی تشویق کنید همه‌ی مشتریان شما مانند هم رفتار نمی‌کنند، بعضی از آن‌ها قبل از شما با افراد دیگری صحبت کرده‌اند و بعضی از آن‌ها با شما به عنوان اولین نفر در رابطه با کسب‌و‌کارشان و خواسته‌ی خود در ایجاد آن صحبت می‌کنند. بنابراین سعی کنید مشتری را به دیدن رقبا و نمونه‌هایی که مشابه کسب‌و‌کار آن است تشویق کنید تا بتواند آن‌ها را در واقعیت نیز ببیند. پیشنهاد می‌کنم دو نمونه‌ی مشابه را در مقابل هم مقایسه کنید و برای مشتری توضیح دهید که چه تفاوتی بین ضعف‌ها و قدرت‌ها وجود دارد. معرفی و توصیف ابزار‌ها و فناوری‌هایی که از آن‌ها برای تولید و توسعه استفاده می‌کنید طبیعتاً همه‌ی مشتریان شما با ابزار‌ها، زبان‌های برنامه‌نویسی و دیگر موارد آشنایی ندارند. اما برای جذب اعتماد و افزایش آگاهی مشتری لازم است به توصیف ابزار‌هایی که از آن‌ها استفاده می‌کنید بپردازید. قرار نیست همه‌ی موارد را به صورت فنی توضیح دهید، اما تا جایی که ممکن است به نکته مزیت‌ها و مقایسه‌ی تکنیک‌ها و ابزار‌هایی که قرار است محصول مشتری را با آن توسعه دهید بپردازید تا اون نیز در جریان ذاتِ اصلی محصول خود قرار بگیرد. صداقت شما و تضمین وفاداری مشتری اگر به دنبال جذب مشتری با وفا و مشارکت طولانی مدت هستید، سعی کنید از همان دقایق ابتدائی نظرات خود را بی‌طرف و با صداقت کامل در قالب مشاوره‌‌ی قانع کننده ارائه کنید. قرار نیست در همان جلسه‌ی اول قرارداد اخذ کنید و یا هزینه‌ای بابت کارتان دریافت کنید! اگر احساس می‌کنید مشتری شما به مهارت‌ها و حضور شما ارزش قائل نشده است و به نظرات شما توجهی نمی‌کند خیلی محترمانه سعی کنید وارد این همکاری نشوید. چرا که حرف شنوی از یک متخصص یک ارزش اولیه برای ادامه‌ی همکاری است. ناگفته نماند در مقابل ارزش‌هایی که مشتری به شما می‌دهد، مانند: شنیدن مشتاقانه‌ی نظرات شما، به معنای آن است که این رابطه‌ی کلامی در حل بسیاری از مسائل برای مشتری بسیار مهم بوده و شما از نتیجه‌ی وقتی که بابتِ این مشاوره صرف می‌کنید مطمئن شوید. قرارداد، ارزیابی هزینه‌ها و زمان توسعه قبل از اینکه مشتری به شما بگوید شرایط قرادادی چگونه است، شما نمونه قراردادی را با توجه به نتایج ارزیابی شده از نیاز مشتری آماده کنید. بند‌ها و ماده‌های قرارداد را عادلانه مشخص کنید. تعهدات شما باید به گونه‌ای باشد که مشتری شما از کار مطمئن شود. این قرارداد است که مشخص می‌کند شما چقدر به توانایی‌های خودتان مطمئن هستید. متأسفانه بعضی از توسعه‌دهندگان به گونه‌ای تعهدات را یک‌طرفه و به نفع خود تنظیم می‌کنند که گویی مشتری هیچ حقی در پروژه ندارد! حتی بند‌هایی دیده می‌شود که گاهاً توسعه‌دهنده اعلام کرده است منبع‌کد - سورس‌کد برنامه را با هزینه‌ی بسیار زیاد و جدا از پروژه به مشتری تحویل خواهد داد! به نظر من این یک بی انصافی به تمام معناست! چرا که مشتری پول می‌دهد تا محصول خریداری کند! منطقی‌ترین پیشنهاد از نظر من این است که بر اساس زمان و زحماتی که در ساخت و توسعه‌ی پروژه صرف خواهد شد یک هزینه و زمانِ شفاف برای مشتری ارائه دهید. برای مثال: فاز‌بندی‌های ساخت پروژه در یک جدول استاندارد مانند WBS یا همان «ساختار شکست کار» استفاده کنید. مشاوره‌ی رایگان یا پولی ممکن است با خود فکر کنید که من چرا باید دقیقه‌ها و یا ساعت‌ها وقت صرف مشاوره‌ی کسانی صرف کنم که مشخص نیست مشتری من هستند یا خیر! برای تشخیص این موضوع که آیا مشاوره‌‌های شما در نهایت منجر به همکاری دو طرفه می‌شود یا خیر، کافی است به چند نکته توجه کنید. اول اینکه مشتری یا نماینده‌ای از مشتری به دفتر کسب‌و‌کار شما آمده است یا برعکس شما به دفتر کاری یا یک دیدار دوستانه رفته‌اید! قطعاً زمانی که شما یک دفتر یا شرکت منظمی دارید طبیعی‌ است که زمان خود را باید ارزشمند نگه‌دارید. بنابراین قبل از ورود به مشاوره‌ی اصلی، اشکالی ندارد که بگویید برای ورود به آن هزینه‌ای را دریافت خواهید کرد. به این نکته توجه داشته باشید که، پیش‌مشاوره با مشاوره‌ی اصلی بسیار متفاوت است. در پیش‌مشاوره شما اولین دیدار را با مشتری خود خواهید داشت که در آن قرار است صحبت‌های طرف مقابل را شنیده و از آن برای تجزیه تحلیل آن برای پاسخ در یک زمان مناسب نکته‌برداری کنید. در این نوع صحبت که معمولاً در دیدار اول و مقدماتی شکل می‌گیرد بهتر است هیچ صحبتی از هزینه‌هایی که در ذهن دارید به مشتری انتقال ندهید چرا که در این مرحله «واقعاً نیاز نیست» و شما صرفاً باید یک شنونده‌ی خوب باشید. در نهایت بعد از شنیدن صحبت‌های مشتری، لازم است از او بخواهید تا یک فرصت برای تجزیه تحلیل شنیده‌های او بدهید. همانطور که در ابتدای مقاله توضیح دادم، احتمال اینکه مشتری در همان ابتدای صحبت‌های خود درخواست میزانه هزینه و زمان برای انجام پروژه کند بسیار زیاد است. بنابراین اگر قبل از تجزیه تحلیل مسئله زمان و هزینه‌ای برای آن مشخص کنید، دیگر نخواهید توانست در صحبت‌ها و جلسات بعدی هزینه‌ها و زمان‌بندی مشخصی که بعد از تجزیه تحلیل واقعیت به دست آورده‌اید را به مشتری پیشنهاد و او را قانع کنید و هر چیزی که در سر داشته‌اید را از دست خواهید داد. نکته‌ی کلیدی در این مرحله برای حرفه‌ای برخورد کردن، این است که مشتری را متوجه این کنید که قرار است به او مشاوره و آموزش‌های قبل از ورود به مرحله‌ی ساخت و توسعه‌ی ایده‌ی ذهنی او را بدهید. در واقع قرار است یک ارزش‌آفرینی از این صحبت‌ها برای مشتری ایجاد کنید تا به دانسته‌های خود اضافه کند «این کار برای مشتری شما ارزشمند و قابل قبول است» در این زمان است که شما می‌توانید وارد مذاکره‌ی جدی و حرفه‌ای شوید که شامل آموزش‌ها و توضیحات کامل برای قانع‌سازی مشتری است که قطعاً دارای هزینه و ارزش به خصوصی خواهد بود. بنابراین یک جلسه‌ی دیگر برای مشاوره‌ی جدی با مشتری خود هماهنگ کنید تا نکات کلیدی و اساسی را برای هدایت هر چه بهتر او به مسیر درست و موفقیت را ترسیم کنید. چگونه از دیگر برنامه‌نویسان و توسعه‌دهندگان متمایز و به یک برنامه‌نویس واقعی و حرفه‌ای تبدیل شویم؟ به احتمال بسیار زیاد هر یک از برنامه‌نویسان و طراحان در حوزه‌ی کسب‌و‌کار‌های اینترنتی که در زمینه‌های طراحی، توسعه و تولید محصولات نرم‌افزاری فعالیت می‌کنند، نظر بر این دارند که چون مهارت کار با زبان‌های برنامه‌نویسی را در اختیار دارند و یا رزومه یا نمونه‌کار‌های خوبی را دارند، پس بهترین هستند! متأسفانه من بارها شاهد غرور نابه‌‌جای بسیاری از برنامه‌نویسان بوده‌ام که به شدت این رفتار را در شأن حرفه‌ای ها نمی‌دانم. توصیه می‌کنم به دانسته‌های خود مغرور نباشید و از آنچه که در اختیار دارید به نحو عالی استفاده کنید تا از شما یک حرفه‌ای واقعی بسازد. شرایطی که یک برنامه‌نویس حرفه‌ای می‌تواند داشته باشد به صورت زیر است: تجربه‌ی کافی و پُخته در زمینه‌های تخصصی تحصیلات مرتبط و مطالعات بسیار در حوزه‌ی تخصصی و مرتبط با آن آشنا به اصول مشتری مداری برندینگ، معرفی فردی و تخصصی آشنا به اصول تجربه‌کاربری و سیستم روان‌شناسی مناسب با آن رزومه‌ی خوب و واقعی نمونه کار‌های واقعی و اصولی عدم وابستگی به ابزار‌های محدود در توسعه مدارک و مجوز‌های لازم در حوزه‌ی فعالیتی چهارچوب مشخص و کاتالوگ معرفی خدمات و ارزش‌ها توجه کنید که داشتن مجوز و گواهی‌های فعالیتی در این حوزه بسیار مهم است. اگر شما به عنوان یک متخصص در این رشته فعالیت می‌کنید باید بدانید داشتن مدارک و گواهی‌هایی ملی و بین‌المللی در این حوزه اعتبار خوبی در اختیار شما قرار می‌دهد که مشتری را بیشتر قانع خواهد کرد. پیشنهاد می‌کنم بهتر است خودتان را با یک رزومه‌ی خوب و مجوز‌های لازم از سمت «سازمان نظام صنفی رایانه‌ای کشور» و «مرکز فناوری اطلاعات و رسانه‌های دیجیتال» معرفی کنید. اخذ این گواهی‌ها در صورتی که شما واقعاً یک متخصص هستید در قالب شرکتی یا خصوصی، می‌تواند یک اعتبار لازم در قبال دانسته‌های شما و شرکت شما را در اختیار سازمان‌ها و ارگان‌های دولتی، خصوصی و نیمه‌خصوصی بدهد که اولویت انتخاب در زمان مزایده‌ها نیز با کسانی است که اعتبار لازم را دارند. واقعیت آن است، دریافت پروژه‌های بزرگ نه تنها نیاز به دانش و رزومه‌ی بسیار خوب دارد، بلکه گواهی‌هایی که ثابت می‌کند شما یک متخصص هستید مهم است. این تنها گزینه‌ای است که شما را با افرادی که غیر متخصص هستند متمایز می‌کند. به‌روز باشید و از رفتار‌های تعصبی پرهیز کنید همه‌ی ما این واقعیت را می‌دانیم که در حوزه‌ی صنعت علوم کامپیوتری، فناوری با سرعت بسیار چشم‌گیری در حال تغییر و تحولات بسیار زیادی است. این دلیل موجب می‌شود که در صورت عدم به‌روز‌رسانی اطلاعات و دانش تکنیکی شرکت یا شخص برنامه‌نویس، از دیگر رقبا فاصله بگیرد. متأسفانه در کشور ما شرکت‌ها و برنامه‌نویسان بسیاری هستند که به سبک‌ها و اصولی که در نمونه‌های جهانی از آن‌ها به خوبی یاد نمی‌شوند وابستگی نشان می‌دهند و بر بهترین بودن آن تأکید متعصبانه‌ای دارند. شاید این تأکید‌ها در دید اولیه از جانب مشتری قابل درک باشد، اما واقعیت آن است که نباید خود را محدود به ابزار‌ها و فناوری‌هایی کنید که از آینده‌ی آن بی خیر هستید! به عنوان مثال بررسی آینده‌ای از یک فناوری مانند IoT می‌تواند بسیاری از مسائل را برای شما یادآوری کند که چه ابزار و چهارچوبی می‌تواند برای پیشرفت روز افزون با حداقل محدودیت‌ها مناسب است. در بسیاری از جوامع، وب‌سایت‌ها، گروه‌ها وکانال‌های اینترنتی دیده می‌شود که افراد به ابزار و دانشی که فقط به آن محدود و مسلط هستند شدیداً تعصبی برخورد کرده و آن را بهترین انتخاب می‌دانند. لازم است یادآوری کنیم تعصب بر دانسته‌ها تنها تأیید بر کم دانستن دارد و نه بیشتر! اگر منطقی باشیم یادگیری استاندارد‌های تضمین شده و پایدار، فناوری‌ها، ابزار‌ها و زبان‌های برنامه‌نویسی قدرتمند و آینده‌دار همیشه در پایداری و توسعه‌ی سریع کسب‌و‌کار‌ها موثر هستند. چرا که فناوری در زمان تغییر محیط را نیز تغییر می‌دهد. بنابراین توصیه من در این بخش آن است که در یادگیری ابزار‌ها و زبان‌های برنامه‌نویسی، تکنیک‌ها و آشنایی با استاندارد‌های روز جهانی مصمم باشید و به هیچ عنوان به ابزار‌های محدود به دانسته‌های خود تأکید شدید نکنید مگر با دلیل منطقی و علمی که تضمین کند انتخاب شما دقیقاً هم سو با پیشرفت است. محصولات با کیفیت در سطح جهانی تولید کنید با توجه به توضیحاتی که داده شد، شرکت‌ها و توسعه‌دهندگانی که در حوزه‌ی تولید نرم‌افزار فعالیت می‌کنند، معمولاً محصولاتی را توسعه می‌دهند که در مدیریت کسب‌و‌کار‌های خود و دیگران موثر است. محصولات نرم‌افزاری هرچقدر هم قدرتمند باشند و هرچقدر شما کد‌های منظم و قدرتمندی در تولید آن‌ها نوشته باشید، کد‌های شما از نظر مشتری یا کاربرانی که از آن‌ها استفاده می‌کنند مخفی است. لازم به ذکر است که، یکی از رایج‌ترین اشتباهاتی که نا خواسته در اکثر محصولات ایرانی دیده می‌شود عدم به کار گیری مباحث تجربه‌کاربری و رابط‌کاربری و استاندارد‌های توسعه‌ی مناسب است. حقیقت این است که نمونه محصولات خارجیِ موفق فاقد این ایرادات هستند و در این صورت است که در نظر کاربر بسیار محبوب می‌شوند. هرچند بحث تجاری و تبلیغات رسانه‌ای و جهانی در محبوبیت آن‌ها بسیار مهم است، اما در نهایت این کاربر است که تصمیم می‌گیرد آن را بپذیرد یا خیر. منظور از کاربری صرفاً در زیبایی محیط نرم‌افزاری نیست، بلکه در دسترس بودن امکانات و ویژگی‌هایی که می‌تواند در برقراری ارتباط و وفاداری مشتری شما مفید باشد هم اشاره دارد. بنابراین، اگر شما دید کاربری نداشته باشید و صرفاً با توجه به سلیقه‌های خودتان محصولی را تولید کنید که فاقد اصول کاربری باشد در این صورت است که محصول شما تنها برای خودتان مهم و با ارزش خواهد بود. نکته: اصول استاندارد نسخه‌نگاری نرم‌افزار (محصول) را رعایت کنید و سعی کنید مشتری را در جریان تغییر تحولات و ویژگی‌های اعمال شده در محصول قرار دهید. برای این کار می‌توانید از استاندارد‌هایی مانند نسخه‌نگاری معنایی استفاده کنید. خدمات پشتیبانی، تضمین پاسخگو بودن با توجه به نکاتی که اشاره شد، پشتیبانی و پاسخگو بودن در مراحل بعد از عقد قرارداد، طراحی و تولید محصول، یکی از مهمترین مواردی که در طولانی مدت وفاداری کاربران (مشتریان) شما را تضمین می‌کند، پاسخگو بودن و پشتیبانی است. حتی این موضوع می‌تواند به صورت یک قرارداد جداگانه با شرایط مخصوص خودش برای مشتری بیان شود تا در جریان شرایط و نحوه‌ی پشتیبانی قرار بگیرد. علاوه بر قواعد و قوانین مشتری مداری و توسعه‌ی کسب‌و‌کار، در چرخه‌ی تولید نرم‌افزار نیز مهم است که بازخورد‌های کاربری دریافت و مشکلات احتمالی محصول (نرم‌افزار) را بررسی و حل نمایید. این خود نوعی پشتیبانی و پاسخگویی و ارزش قائل شدن به مشتریان است که در عمل حتی به روش‌های بسیار هوشمندانه می‌توان آن را انجام داد. مشتریان شما در هر زمان که با مشکلی مواجه شوند حق دارند مشکلی که با آن مواجه شده‌اند را به توسعه‌دهنده‌ی محصول انتقال دهند. توسعه‌دهنده با بررسی بازخورد ارائه شده موظف است مشکل مربوطه را بررسی و آن را حل کند. این نکته در جمله‌های مشابه می‌تواند در بخشی از بند‌های قراردادِ بین مشتری و توسعه‌دهنده یادآوری شود. شاید با خود فکر کنید که با چه روش‌هایی می‌توان ارتباط بین مشتری و توسعه‌دهنده را برای حل مشکلی در محصول بررسی و مدیریت کرد، حتی بدون آنکه نیاز باشد به صورت حضوری وقت صرف آن کرد. در این باره پیشنهاد می‌کنم به توضیحات قبلی من در رابطه با ساختن محصول با کیفیت عمیقاً توجه کنید. منظور از توسعه‌ی محصولات با کیفیت آن است که مشتری باید بتواند حتی در بازه‌ی ۲۴ ساعته نظر خود را نسبت به مشکل، انتقاد یا پیشنهادی در رابطه با محصول ارائه کند تا در فرصت مناسب توسعه‌دهنده آن را بررسی کند. معمولاً این فرآیند به صورت سنتی با تلفن و مراجعه‌ی حضوری صورت می‌گیرد، اما توصیه‌ی من برای حفظ زمان و کارآیی بهتر این است که نرم‌افزار (محصول) خود را مجهز به خدمات پشتیبانی آنلاین در قالب سیستم هوشمند مجهز کنید. علاوه بر آن، استاندارد‌های سیاهه‌ی تغییرات (change log) و مشکلات گزارش شده را در محیط نرم‌افزار شفاف سازی کنید تا مشتری هم متوجه اعمال نظرات و انجام آن شود.
  27. سلام. من در بخش برچسب و تگ ها دیدم که اسمی از زبان پایتون برده اند. بهرحال سوال باید شفاف و دقیق تر مطرح می شد. گمان کنم سوال ایشان در مورد محیط های زبان پایتون بوده است. با اینحال موضوع محیط ها با پردازش علمی می تواند متفاوت باشد. با تشکر Max Base / مکس بیس
  28. MehdiSoheili

    مهندس جان بزرگواری کردید با تشکر
  29. سید محمد عباسی

    آموزش زبان برنامه‌نویسی سوئیفت - جلسه پنجم مواردی که در این جلسه یاد خواهید گرفت: متغییر آپشِنال (‌Optionals Variable ) ، رشته‌ها و کارکتر‌ها (‌String & Character‌ ) متغییر آپشِنال ( Optionals Variable‌ ) چیستند؟‌ این نوع متغییر‌ها برای مدیریت داده‌ی شما استفاده میشن. همین‌طور هم که از اسمش مشخصه، به معنی اختیاریه! یعنی یک متغییر یا مقدار داره یا نداره. توی سوئیفت، شما باید بعد از تعریف یک متغییر‌ مقدار اون را هم تعیین کنید و نمی‌تونید اون رو بدون مقدار به حال خودش رها کنید! به عنوان مثال کُد زیر رو ببینید: var website_name print(website_name) // Error compiler در صورتی که این کد را اجرا کنید، با خطای کامپایلر مواجه میشید. دلیلش هم اینه که در زبان برنامه‌نویسی سوئیفت،‌ باید مقدار هر متغییر رو بعد از تعریف اون بدید بهش و حالت پیش‌فرض نداریم! با نوع هم تعریف کنید باز هم به خطا می‌خورید: var website_name : String print(website_name) // Error compiler اما اگه بهش مقدار خالی ( "" ) بدید، خروجی رو براتون نمایش میده، ولی خالی!: var website_name : String = "" print(website_name) // Print empty این برای همه‌ی نوع‌های داده‌ی دیگه هم صدق می‌کنه. اما هر دفعه توی کدهای خودتون برای بررسی کردن اون‌ها هِی باید شرط بذارید ( if,else,ifelse و .. ) که ببینید کدوم متغییر مقدار داره یا نداره. تازه اینکه با این کار کد‌های تمیزی هم ندارید. پس این‌جا باید از آپشنال‌ها استفاده کنیم. به این قطعه کد دقت کنید: var website_name : String? // website_name is automatically set to nil if name == nil{ print("website_name has nil value") } در مثال بالا، شما تعریف متغییر آپشنال ( Optional ) را می‌بینید که با علامت سوال ( ? ) همراهه. اول شما باید، کلمه‌ی کلیدی var رو همراه با یک اسم، میارید و بعد با دو نقطه ( : )، به همراه نوع داده و در نهایت علامت ? رو قرار میدید. متغییر شما الان مقدار nil رو دارید که به صورت اتوماتیک، به متغییر شما داده شده که خود شما هم می‌تونید این مقدار رو برای تمای متغییرهای آپشنالتون قرار بدید. nil به معنای هیچ یا هیچ‌چیز است. یعنی الان هیچ داده‌ی ندارید. حالا شما می‌تونید هر موقع که دوست داشتید، به متغییرتون مقدار بدید یا ندید نکته متغییر شما الان به اصطلاح ( Wrapper )‌ به معنی بسته‌بندی، روپوش شده! یعنی این‌که داده‌های متغییر شما بسته‌بندی شده! و در هنگامی که نیاز به اطلاعات اون داشتید باید با استفاده از علامت تعجب (‌ ! ) اون رو ( Unwrapper ) کنید و یا از حالت بسته‌بندی شده خارج و اطلاعات خودتون رو دریافت کنید! به عبارتی دیگه، اطلاعاتی که شما در متغییر خودتون ذخیره کردید در حالت آپشنال، بین دو پرانتز قرار گرفتند و به همین خاطر میگن Wrapper شده!. به این مثال دقت کنید: var website_name : String? = "www.iostream.ir" if name == nil{ print("website_name has nil value") } else{ print(website_name!) // Print www.iostream.ir } همین‌طور که در مثال بالا می‌بینید، اگه متغییر ما مقداری نداشت ( nil )، شرط اولی اجرا میشه و در غیر اینصورت، www.iostream.ir نمایش داده میشه. شما می‌تونید در هر زمانی که نیاز داشتید، متغییر خودتون رو برابر با nil کنید: var website_name : String? = "www.iostream.ir" website_name = nil if name == nil{ print("website_name has nil value") } else{ print(website_name!) // Print www.iostream.ir } خروجی برابر با؛ website_name has nil value است. یادتون باشه که به هیج وجه نمی‌تونید به متغییر‌های عادی nil رو بدید! این فقط برای متغییر‌های آپشناله. رِشته‌ها و کارِکتر‌ِها (‌String & Character‌ ) رشته‌ها مجموعه‌ای از کارکترها هستند که یک حرف یا یک متن کامل رو درون خودش ذخیره می‌کنن ( همون متن/نوشته‌ خودمونه:). مثل "www.iostream.ir" و یا "Apple". و کارکترهایی که نهایتا تا دو حرف رو می‌تونن توی خودشون ذخیره کنن،‌ مثل؛ "AP" و یا "IO". بذارید چند تا مثال براتون بزنم که منظورم رو شفاف‌تر متوجه بشید: let website_name : String = "www.iostream.ir" print(website_name) تعریف رشته شما با تعریف یک متغییر یا ثابت، اسم آن و در نهایت نوع و مقدار، می‌تونید یک رشته یا همون دنباله‌ای از کارکتر‌هایی داشته باشید. و یا از سازنده (‌در محبث کلاس‌ها کامل دربارش توضیح میدم ) خود نوع String استفاده کنید که در زیر می‌بینید: let website_name : String = String("www.iostream.ir") print(website_name) یا این‌که به صورت کوتاه شده،‌ بدون تعریف صَریح نوع، اون رو به این شکل بنویسید: let website_name = "www.iostream.ir" let platform_name = String("www.fanoox.com") print("Website name : \(website_name) and Platfrom name : \(platform_name)") خالی قرار دادن رشته ما می‌تونیم به دو صورت به متغییرها رشته‌ایمون مقدار خالی بدیم! یا با استفاده از دو دابِل کُوتِیشِن ( "" )‌ یا با استفاده از یک نمونه از نوع رشته ( ()String ). به مثال‌های زیر دقت کنید: let website_name = "" let platform_name = String() print(website_name,platform_name) // Empty بررسی خالی بودن یا نبون رِشته شما می‌تونید با استفاده از ویژگی isEmpty از کلاس String، بررسی کنید که آیا متغییر شما خالی هست یا نه؟ به مثال زیر دقت کنید: let website_name = "" if website_name.isEmpty { // True print("website_name is empty!") } متصل کردن دو رشته با استفاده از آپِریِتر + شما می‌تونید دو یا چند رشته رو به هم وصل کنید. مثال زیرببینید: let website_name : String = "www.iostream.ir" let platform_name : String = "www.fanoox.com" let addition : String = website_name + " and " + platform_name print(addition) // www.iostream.ir and www.fanoox.com یا این‌که از حالت کوتاه‌ شده‌ی اون استفاده کنید: let website_name : String = "www.iostream.ir" let platform_name : String = "www.fanoox.com" website_name += " and " + platform_name print(addition) // www.iostream.ir and www.fanoox.com ترکیب اطلاعات با یک رشته شما می‌تونید یک رشته‌ی حاوی اطلاعات داشته باشید! چطوری؟ به قطعه کد زیر دقت کنید: let website_name : String = "www.iostream.ir" let platform_name : String = "www.fanoox.com" let addition = "Website name : \(website_name) and Platfrom name \(platform_name)" print(addition) // Website name www.iostream.ir and Platform name www.fanoox.com با استفاده از این الگو ()\ شما می‎تونید تا بی‌نهایت اطلاعت داخل یک رشته قرار بدید! فقط کافی متغییرها، ویژگی‌های یک کلاس ( مبحث کلاس‌ها در جلسات بعد به طور کامل توضیح داده میشه )‌،‌ توابعی که مقدار برگشتی دارن ( درمورد توابع در جلسات بعد کامل صحبت می‌کنیم ) و هر چیزی که حاوی داده یا همون اطلاعات باشه، قرار بدید. اول یک اِسلش رو به عقب (‌ Backward Slash ) و بعد هر اطلاعاتی که می‌خواید توی رشته باشن رو داخل دو پرانتز () قرار بدید. بدست آوردن طول یک رشته برای به دست آوردن طول یک رشته از ویژگی count‌ از کلاس String استفاده می‌کنیم. مثال زیر رو ببینید: let website_name : Stirng = "www.iostream.ir" print(website_naem.count) // website_name length is 15 اگر تک‎تک کارکترهای www.iostream.ir رو بشمارید، می‌بینید که مقدار 15 به دست میاد. پس توی خروجی هم 15 رو داریم. مقایسه دو رِشته اگه بخواید یک رشته رو با یک رشته‌ی دیگه مقایسه کنید، بطور مستقیم یا با استفاده از شرطها این کار را می‌کنیم: let website_name : String = "www.iostream.ir" let platform_name : String = "www.fanoox.com" print(website_name == platform_name) // False if website_name == platfrom_name { // False print("Equal") } else { print("Not Equal") // Not Equal } با آپِریِتر == در شرط if بررسی می‌کنیم که آیا website_name و platform_name با هم مساوی هستند یا نه، که Not Equal یعنی برابر نیستند رو در خروجی داریم. بررسی شروع یا پایان یک رشته با دو مِتُد ( در جلسات آینده با اُون‌ها کامل آشنا میشید ) hasPrefix و hasSuffix‌ می‌تونیم بررسی کنیم که آیا رشته‌ی ما با ورودی که میدیم، مطابقت داره یا نه. به عنوان مثال رشته‌ی www.iostrea.ir رو می‌خوایم بررسی کنیم که با www شروع شده یا نه. برای این کار از متد hasSuffix استفاده می‌کنیم: let website_name : String = "www.iostream.ir" print(website_name.hasSuffix("wwww")) // False // Or if website_name.hasSuffix("www") { // True print(website_name) // www.iostream.ir } خروجی اول False هستش! چون که ورودی ما (‌ wwww ) هستش و با اول رشته‌ی www.iostream.ir مطابقت نداره ولی در شرطی که گذاشتم، مقدار True هست. چون ورودی ما ( www ) با اول www.iostream.ir مطابقت داره. حالا اَگه بخوایم که آخر رشتمون رو بررسی کنیم که آیا اون چیزی که می‌خوایم، آخر رشتمون هست یا نه، از hasPrefix استفاده می‌کنیم: let website_name : String = "www.iostream.ir" print(website_name.hasPrefix(".com")) // False // Or if website_name.hasPrefix(".ir") { // True print(website_name) // www.iostream.ir } خروجی False و www.iostream.ir هستش. آخر دامنه وب‌سایت www.iostream.ir با ( ir. ) تموم میشه ولی ما com. قرار دادیم که نتیجه False‌ میشه. اما در شرط این موضوع درسته! چرا که دامنه‌ی وب‌سایت با ir. تموم میشه و این متد هم همینو می‌خواد! پس نتیجه True و مقدار متغییر website_name نمایش داده میشه. امیدوارم این جلسه مورد رضایتتون باشه. منتظر جلسه‌ی ششم باشید.
  1. نمایش فعالیت های بیشتر
×
×
  • جدید...