روز سوم – چالش ۱۰۰ روز کد زدن

درود بر شما عزیزان،

خوشحالم که سومین روز هم به امید خدا با موفقیت و یادگیری مفاهیم جدید به پایان رسید. خبر خوش اینکه پروژه بازی tic tac toe تمام شد و حالا می تونین پروژه رو clone کنید و از بازی باهاش لذت ببرید. در ادامه با توجه به توصیه مستندات ری اکت، رفتم و صفحه آموزش گام به گامش رو که به عنوان مکمل این آموزش پروژه محور هست، شروع کردم. فعلا با سرفصل !Hello World معروف استارت زدم و تا پایان Rendering Elements پیش رفتم. به همه خواننده های عزیز پیشنهاد می کنم اگر می خوان این کتابخانه دوست داشتنی رو شروع کنن،‌ حتما از مستندات خودش استفاده کنن. خیلی کامل، ساده و روان هست.

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

نوشته روز سوم – چالش ۱۰۰ روز کد زدن اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

پیش پردازنده Sass چیست؟

واژه Sass مخفف کلمات Syntactically Awesome Stylesheets است. Sass را می توان به عنوان یک افزونه برای css در نظر گرفت که کار با استایل ها را برای ما بسیار ساده می کند. به خصوص زمانی که فایل های css شما بسیار بزرگ و پیچیده باشند. Sass مدیریت و نگهداری استایل های css را ساده‌تر می‌کند. به لطف وجود متغیرها، mixins ها، nesting ها و وراثت در این پیش پردازنده، کد های نوشته شده کاملاً سازماندهی می شود.

این کار باعث می شود کار خود را سریعتر پیش ببریم. به خاطر داشته باشید زمانی که در Sass کدهای خود را مینویسیم، مرورگر ها نمی توانند این کدها را درک کنند و دلیل این عدم درک هم این است که کدهای نوشته شده به زبان css نیستند.

 پس ما به یک کامپایلر نیاز داریم تا کد های نوشته شده در Sass را به css تبدیل کنیم. نرم افزار های زیادی برای این کار وجود دارند که بعضی از آنها عبارتند از :

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

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

 اگر شما در css مبتدی هستید پیشنهاد می کنم فعلا از رفتن به سراغ پیش پردازنده ها صرف نظر کنید.

چیزی که برای ورود به این دنیای جذاب نیاز دارید این است که درک کاملی از موارد پایه ای و کدهای css داشته باشید. Sass یکی از محبوب‌ترین پیش پردازنده های css است اما Sass تنها پیش پردازنده موجود نیست. موارد دیگری نیز مانند Less و Stylus وجود دارند.

چرا بهتر است از Sass استفاده کنیم؟

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

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

در واقع Sass مکمل زبان css است. با استفاده از Sass می توان متغیر ها را تعریف کرد و حتی از مفاهیمی همچون وراثت در css استفاده نمود. این ویژگی ها می توانند برای یک طراح فوق العاده باشند.

چگونه از Sass استفاده کنیم؟

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

  • SCSS : استفاده از فایلی که دارای فرمت scss. است و با css هم بسیار سازگار است.
  • SASS : استفاده از فایلی که دارای فرمت sass. است. این مورد نیز با css سازگار است و سریع‌تر نوشته می‌شود.

منبع : لرن سورس

https://learnsource.net/article/29/sass-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%D9%87-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%D9%87%D8%A7%DB%8C%DB%8C-%D8%AF%D8%A7%D8%B1%D8%AF

نوشته پیش پردازنده Sass چیست؟ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

ساخت یک افزونه برای Adobe XD

عکس از صفحه رسمی Adobe XD‌ در توئیتر

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

حالا ما تو این مقاله میخوایم یکم به API که شرکت Adobe برای نوشتن افزونه معرفی کرده کار کنیم و یک پلاگین خیلی کوچیک رو با هم بنویسیم و در آخر هم چندتا از افزونه هایی که خودم باهاشون کار میکنم و راضی هستم رو معرفی کنم بهتون تا شما هم ازشون استفاده کنید


مقدمات لازم برای شروع

برای اینکه بتونید یک افزونه برای Adobe XD بنویسید با دو تا مورد نیاز هست :

  • دانش اولیه در مورد برنامه نویسی وب خصوصا Js
  • یک ویرایشگر مثل Atome یا Sublime یا هر چیزی که خودتون باهاش راحت هستین

بعد از اون برای شروع کار لازمه تا به آدرس زیر I/O Console خودتون در وب سایت Adobe‌ برید و پلاگین خودتون رو ثبت کنید برای اینکار هم کافیه وارد اکانت خودتون بشید و در لینک بالا بر روی دکمه Create Plugin کلیک کنید و اسم افزونه خودتون رو وارد کنید.

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

C:Users%USERNAME%AppDataLocalPackagesAdobe.CC.XD_adky2gkssdxteLocalState 

ام اگه از سیستم Mac استفاده میکنید باید به مسیر زیر برید :

~/Library/Application Support/Adobe/Adobe XD/

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

نگاهی به ساختار اولیه

وقتی به پوشه افزونه خودتون دقت کنید در حالت اولیه ما یک فولدر Images‌ داریم که شامل آیکن های مرتبط به افزونه هستن که شما میتونید اون رو با تصویر دلخواه خودتون و در سایزهایی که موجود هستن جایگزین کنید اما علاوه بر این افزونه ما شامل یک فایل main.js و یک فایل manifest.json میشه که فایل اول در واقع فایل اصلی افزونه یا به عبارت دیگه منطق اصلی افزونه شماست و فایل دوم تنها شامل اطلاعات و تنظیمات اصلی خود افزونه میشه.

بررسی فایل Manifest.JSON

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

فایل Manifest.Json در یک نگاه

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


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

محیط برنامه‌نویسی Adobe XD

تقریبا همه برنامه‌نویسا موقع برنامه نویسی برای اینکه نتایج کار خودشون رو ببین از Print‌ استفاده میکنن حالا این مورد در زبون های مختلف دستورات متفاوتی داره اما در زبان جاوا اسکریپت معمولا از Console.log استفاده میکنن اما خب حتما براتون سوال پیش میاد که خب حالا به فرض ما ازش داخل افزونه خودمون استفاده کردیم کجا میتونیم خروجی رو ببینیم ؟

باید بهتون بگم که Adobe XD یه محیط تست و رفع باگ برای افزونه‌های خودش فراخم کرده که از طریق منو زیر خیلی راحت میتونید بهش دسترسی داشته باشید :

Plugins > Development > Developer Console

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


حرف آخر

تو این مقاله سعی کردم یه توضیح مختصر درباره شروع نوشت یک افزونه کوچیک برای Adobe XD آشناتون کنم در مقالات بعدی سعی میکنم تا بیشتر وارد بحث برنامه نویسی بشیم و API هایی که برای نوشت یک افزونه در اختیار داریم و باهم بررسی کنیم.


اما اگه خودتون علاقه مند هستید هر چه زودتر وارد بخش برنامه‌نویسی بشید و یا به نوشتن یک افزونه فکر میکنید اما نمیدونید از کجا میتونید بیشتر در موردش بخونید من چندتا منبع معرفی میکنم تا ازش استفاده کنید:

https://github.com/AdobeXD/plugin-samples
https://adobexdplatform.com/plugin-docs/reference/how-to-read.html
https://medium.com/adobetech/adobe-xd-plugin-apis-are-here-7d25e39c555b

نوشته ساخت یک افزونه برای Adobe XD اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

آموزش #F قسمت ۱۱

https://virgool.io/fsharp/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-f-%D9%82%D8%B3%D9%85%D8%AA-%DB%B1%DB%B0-pmc2g16wxysi

در همه زبانهای برنامه نویسی دستور switch رو داریم که توی زبانهای فانکشنال معمولا اسمش match‌ هست. pattern matching در زبان اف شارپ بسیار قوی هست به حدی که توی زبان سی شارپ ۸ اومدن شبیه اونو پیاده کردند. به کد زیر توجه کنید:

let printSeason month =
   match month with
   | "December" | "January" | "February" -> printfn "Winter"
   | "March" | "April" -> printfn "Spring"
   | "May" | "June" -> printfn "Summer"
   | "July" | "August" -> printfn "Rainy"
   | "September" | "October" | "November" -> printfn "Autumn"
   | _ -> printfn "Season depends on month!"

printSeason "February"
printSeason "April"
printSeason "November"
printSeason "July"

توضیح کد:

  1. یک تابع به نام printSeason‌ که یک ورودی به نام month‌ میگیره تعریف می کنیم.
  2. میگیم ورودی month‌ رو با شرایط پایین بسنج(match month with)
  3. اگر ورودی December, January, February‌ بود Winter رو چاپ کن( فارسیش این میشه اگر این ماهها بود زمستان رو چاپ کن)
  4. اگر ورودی March, April‌ بود Spring‌ رو چاپ کن.
  5. اگر ورودی May, June‌ بود Summer‌ رو چاپ کن.
  6. اگر ورودی July یا August‌ بود Rainy‌ رو چاپ کن.
  7. اگر ورودی September, October, November‌ بود Autumn‌ رو چاپ کن.
  8. اگر ورودی مطابقت نداشت Season depends on month! رو چاپ کن. درواقع یعنی خطا بده.

خطهای بعدی هم که تابع رو با یک ورودی وارد می کنیم تا کدمون رو تست کنیم. مثلا تابع برای February برامون Winter رو چاپ می کنه.

توضیحات تکمیلی:

  • Pattern matching با کلمات کلیدی match و with مشخص میشن.
  • برای هر شرط یا همون case‌ در دستورات از اپراتور | (پایپ Pipe) استفاده می کنیم. همونطور که تو کد بالا میبینید میتونیم چندین شرط رو باهم بنویسیم مثلا اگر یکی از این شرطها برقرار بود یک کار خاصی رو انجام بده.
  • در واقع علامت _| همون default‌ در دستور switch case بقیه زبانهاست. یعنی اگر شرایط بالا برقرار نبود این رو اجرا کن. و وجودش برای جلوگیری از خطا ضروریه هرچند اگر ننویسید هم کامپایلر ارور نمیده و کدتون اجرا خواهد شد.

نوشته آموزش #F قسمت ۱۱ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

آموزش #F قسمت ۱۰

https://virgool.io/fsharp/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-f-%D9%82%D8%B3%D9%85%D8%AA-%DB%B9-ldljgk281twe

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

خب حلقه while تو اف شارپ به صورت زیره که خیلی هم راحته

let mutable a = 10
while (a < 20) do
   printfn "value of a: %d" a
   a <- a + 1

توضیح : خط اول یک متغیر تغییر پذیر تعریف می کنیم. خط دوم میگیم تا اون متغیر کوچکر از ۲۰ باشه یه کاری باهاش کن

خط سوم میگیم اون کار اینه که متغیره رو چاپ کن و خط چهارم میگیم متغیر یکدونه اضافه کن بهش

نوشته آموزش #F قسمت ۱۰ اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

از نسخه ۵ تا نسخه ۷٫۱ اپلیکیشن بخشنامه

سلام به همه بلاگر های عزیز، تو این مطلب میخام در مورد روند ساخت نسخه ۶ و ۷ اپلیکیشن بخشنامه صحبت کنم و همینطور تجربیاتی رو در اختیارتون بزارم.

داستان از اینجا شروع میشه که نسخه ۵ اپلیکیشن بخشنامه بدلیل پیچیدگی تو ساختار کدهای جاواش و همینطور کدهای xml برای رابط کاربریش، کدهای پیچیده و درهم فشرده سازی و… گزارش های زیادی رو در appcenter دریافت می کردم. همین باعث شد تا توی این تعطیلات شروع کنم به بازنویسی اپلیکیشن!

استارت نسخه ۶ رو زدم و کار خیلی خوب پیش رفت، سرعت دریافت اطلاعات تا ۵۰ درصد بیشتر شد، از کدهای سی++ برای فشرده سازی استفاده کردم و همین باعث شد تا کلا برنامه افزایش سرعت چشمگیری داشته باشه و به انتشار عمومی رسیدم اما بعد از انتشار در کافه بازار نارضایتی کاربران شروع شد که اپلیکیشن یا اصلا اجرا نمیشه و یا اگرم اجرا بشه هیچ بخشنامه ای دریافت نمیشه!

قضیه خیلی عجیب بود و یک هفته من رو مشغول خودش کرد تا تونستم ریشه مشکل رو پیدا کنم و بدلیل خرابکاری که نسخه ۶ کرده بود مجبور شدم نسخه ۷ رو با اصلاحیه منتشر کنم. اما مشکل کجا بود؟

مشکل از اینجا نشات میگرفت که نسخه ۵ بخشنامه با نسخه ۲ اندروید استودیو نوشته شده بود. اما نسخه ۶ بخشنامه با اندروید استودیو ۳٫۴ همین کافی بود تا کلی مشکل ایجاد کنه برام! متاسفانه گوگل توی backward compatibility اصلا خوب کار نمیکنه.

بعد از کلی تست و آزمایش مشخص شد که اپلیکیشن روی اندروید ۴٫۴ به پایین کرش میکنه و روی اندروید ۸ و ۹ هم اصلا اطلاعاتی رو لود نمیکنه همینطور بعدا مشخص شد که روی اندروید ۱۰ (کیو) که به تازگی منتشر شده هم کرش میکنه (اینو بعد از فیکس کردن ۲ مشکل اول کشف کردم).

اما مشکل چطور رفع شد؟ مثل اینکه یکی از کتابخانه های شخص ثالث برنامه به کتابخانه Multidex نیاز داشته (این نیاز تو نسخه ۳٫۴ اندروید استودیو پدیدار شد) و من هم اضافه کرده بودم اما همین مولتی دکس روی اندروید ۴٫۴ به پایین شناسایی نمیشه و باید بصورت دستی معرفیش کرد و من هم اطلاعی از این نداشتم واسه همین برنامه کرش میکرده پس به این صورت مشکل حل شد:

public class app extends MultiDexApplication {
    @Override
 public void onCreate() {
 super.onCreate();
 MultiDex.install(this);
    }
}

البته کلاس بالا باید تو مانیفست برنامه هم معرفی بشه!

اما مشکل دوم عدم لود کردن اطلاعات! این مشکل هم علتش این بود که چون برنامه از شبکه اینترنت برای دریافت اطلاعات استفاده میکنه توی نسخه ۸ اندروید بخش امنیتی جدیدی اضافه شده. تا قبل از نسخه ۸ اندروید CleartextTraffic بصورت پیشفرض روی True بوده ولی از نسخه ۸ به بعد False شده! همین باعث شده تا برنامه روی اندروید ۸ به بعد با خطا مواجه بشه!

راه حل هم این بود که CleartextTraffic رو بصورت پیشفرض True کنیم. با نوشتن کد زیر داخل مانیفست مشکل حل شد.

android:usesCleartextTraffic="true"

تا اینجا ۲ تا مشکل رو تونستم فیکسشون کنم اما مشکل جدیدی پیدا شد برنامه روی اندروید کیو ۱۰ کرش میکرد!

خوشبختانه بعد از کلی بررسی مشخص شد که تنظیمات فونت اندروید ۱۰ تغییر یافته و چون برنامه از کتابخانه Calligraphy برای تغییر فونت کل برنامه استفاده میکنه همین باعث ایجاد خطا میشه! (بازم دست گوگل درد نکنه بابت پشتیبانی از کدها و تنظیمات قبلی)

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

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

نتیجه شد تصویر زیر:

خوشبختانه نسخه ۷ تو بازار منتشر شد و مشکلات کاربران هم حل شد. اینو هم یادم رفت بگم که اپلیکیشن رو به نسخه جدید گوگل یعنی androidx تبدیل کردم که میگن یکپارچه هستش و بهینه تر از قبله و از نسخه ۱۰ به بعد بصورت اجباری باید از androidx به جای support library استفاده بشه.

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

نوشته از نسخه ۵ تا نسخه ۷٫۱ اپلیکیشن بخشنامه اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

خروجی گرفتن برنامه‌های NET Core 3. بدون وابستگی به فریم‌ورک

دیشب نسخه ۶ پیش‌نمایش دات نت کور ۳، منتشر شد و ویژگی‌های بسیار خوبی را ارائه کرد و بهانه‌ای شد تا با برخی از ویژگی‌ها مخصوص خروجی گرفتن از برنامه در دات نت کور ۳ آشنا بشویم.
PublishSingleFile

توسط این دستور میتوانید برنامه خودتان را همراه با تمام اسمبلی‌ها و فایل‌ها، در یک فایل Exe قرار دهید و اجرا کنید. برای بار اول اجرا ممکن است چند ثانیه طول بکشد ولی از دفعات بعد، تاخیری در اجرا نخواهیم داشت. در واقع این روش تمام فایل‌ها را فشرده کرده و با اجرا، در مسیر مشخصی آنپک می‌کند.روش استفاده از آن به این صورت هست که پنجره CMD را در کنار فایل پروژه باز کنید و دستور زیر را اجرا کنید: 

dotnet publish -r win10-x64 /p:PublishSingleFile=true

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

نوشته خروجی گرفتن برنامه‌های NET Core 3. بدون وابستگی به فریم‌ورک اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

روز دوم – چالش ۱۰۰ روز کد زدن

درود بر شما عزیزان،

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

کار با کامپوننت های ری اکت واقعا لذتبخش هست و این لذت زمانی دو برابر شد که ری اکت از نسخه ۱۶.۸ به بعد برنامه نویسی فانکشنال و قابلیت جدیدی به نام Hook رو اضافه کرد. این یعنی از نسخه مذکور به بعد می تونیم به جای استفاده از کلاس برای ایجاد کامپوننت، از توابع استفاده کنیم و در نتیجه به گفته توسعه دهنده های فیسبوک در این ویدیو ۹۰٪ کد تمیزتر و سبک تری داشته باشیم.

https://youtu.be/dpw9EHDh2bM

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

نوشته روز دوم – چالش ۱۰۰ روز کد زدن اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

روز اول – چالش ۱۰۰ روز کد زدن

درود بر شما عزیزان،

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

از اونجایی که یکی از علایق بنده طراحی وب سایت هست، امروز رو با یادگیری کتابخانه قدرتمند React JS شروع کردم. بر خلاف گذشته که همیشه سراغ منابع فارسی برای یادگیری می رفتم، اینبار تصمیم گرفتم تا از مستندات آموزشی خود وبسایت ری اکت استفاده کنم. پس با جدیت هر چه تمام و البته حضور یک لیوان قهوه اونم از نوع فرانسه شروع به مطالعه کردم. به وسیله این مستند آموزشی قرار هست بازی Tic Tac Toe رو با تکنیک گام به گام بنویسیم. در ابتدا خواسته شد اگر جاوا اسکریپت بلد نیستیم از طریق این لینک که توسط بنیاد موزیلا (بزرگترین پایگاه داده JavaScript) فراهم شده بود، نگاهی سریع و اجمالی به جاوا اسکریپت داشته باشیم. بعد از مطالعه کامل، برگشتم و مستندات ری اکت رو ادامه دادم. سپس یک پروژه جدید ایجاد کردم و اون رو بارگذاری کردم روی گیت هاب به این آدرس تا شما عزیزان هم بتونید پروژه رو مشاهده کنید.

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

نوشته روز اول – چالش ۱۰۰ روز کد زدن اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی

آموزش پایتون – فصل سوم(توابع)

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

فراخوانی تابع :

قبلا نمونه ای از فراخوانی تابع رو باهم دیدیم :

>>> type(42)

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

در واقع میتونیم بگیم که یک تابع ، آرگومان رو میگیره و نتیجه رو به ما برمیگردونه ؛ به نتیجه ی تابع ، مقدار برگشتی هم گفته میشه .

پایتون توابعی رو برای تبدیل انواع داده ای در اختیار ما قرار داده . برای مثال تابع int مقداری رو به عنوان آرگومان میگیره و اگر بتونه اون رو به عدد صحیح تبدیل میکنه ؛ اگر هم نتونه به ما اخطار میده :

>>> int('32')
۳۲
>>> int('Hello')
ValueError: invalid literal for int(): Hello

تابع int میتونه مقادیر اعشاری رو به مقادیر صحیح تبدیل کنه ولی نکته ای که وجود داره اینه که بجای گرد کردن مقادیر اعشاری ، فقط قسمت اعشاری اونها رو حذف میکنه :

>>> int(3.99999)
۳
>>> int(-2.3)
-۲

تابع float هم مقادیر صحیح و رشته ای رو به عدد اعشاری تبدیل میکنه :

>>> float(32)
۳۲٫۰
>>> float('3.14159')
۳٫۱۴۱۵۹

و در نهایت تابع str آرگومانی که بهش پاس دادیم رو به مقدار رشته ای تبدیل میکنه :

>>> str(32)
'۳۲'

>>> str(3.14159)
'۳٫۱۴۱۵۹'


توابع ریاضی :

در پایتون ماژولی بنام math وجود داره که اکثر توابع معروف ریاضی رو در اختیار ما قرار میده . ماژول به فایلی گفته میشه که شامل مجموعه ای از توابع مرتبط هست.

قبل از اینکه بتونیم از توابع داخل یک ماژول استفاده کنیم ، باید ماژول مورد نظر رو با دستور import به پروژه خودمون اضافه کنیم :

import math

این دستور باعث ایجاد یک شیِ ماژول به نام math میشه . شیِ ماژول شامل توابع و متغیر های تعریف شده در داخل یک ماژول هست . برای دسترسی به هر یک از این توابع ، باید نام ماژول به همراه نام تابع که با یک نقطه از هم جدا شده اند رو وارد کنیم ؛ به این روش dot notation گفته میشه :

>>> ratio = signal_power / noise_power
>>> decibels = 10 * math.log10(ratio)
>>> radians = 0.7
>>> height = math.sin(radians)

در مثال اول از math.log10 برای محاسبه ی نسبت سیگنال به نویز در واحد دسیبل استفاده میکنیم (فرض کنید متغیرهای signal_power و noise_power از قبل تعریف شدن). علاوه بر این ، ماژول math تابع log رو برای محاسبه ی لگاریتم در مبنای e در اختیار ما قرار داده.

مثال دوم مقدار سینوس متغیر radians رو برای ما محاسبه میکنه . نکته ای که اینجا باید بهش اشاره کنم اینه که تابع سینوس و دیگر توابع مثلثاتی مانند کسینوس ، تانژانت و …. آرگومان رو بجای درجه بصورت رادیان دریافت میکنند.

برای تبدیل درجه به رادیان ، درجه رو بر ۱۸۰ تقسیم کرده و در pi ضرب میکنیم :

>>> degrees = 45
>>> radians = degrees / 180.0 * math.pi
>>> math.sin(radians)
۰٫۷۰۷۱۰۶۷۸۱۱۸۷

عبارت math.pi از داخل ماژول math ، مقدار تقریبی عدد پی که تا ۱۵ رقم اعشار محاسبه شده رو در اختیا ما قرار میده .


ترکیب بندی (composition):

تا اینجای کار با المان های سازنده ی برنامه ها مانند متغیرها ، عبارات و دستورات کار کردیم ولی همه ی این مفاهیم رو بصورت مجزا استفاده کردیم بدون اینکه در مورد ترکیب این المان ها حرفی زده باشیم. یکی از ویژگی های زبان های برنامه نویسی ، توانایی ایجاد بلوک های کوچک کد و ترکیب اونها هست. برای مثال آرگومان یک تابع میتونه شامل هر نوع عبارتی باشه مثلا عملگرهای محاسباتی :

x = math.sin(degrees / 360.0 * 2 * math.pi)

و یا شامل فراخوانی یک تابع باشه :

x = math.exp(math.log(x+1))

نکته : شما تقریبا در هر جایی میتونید مقدار و یا عبارت دلخواهی رو قرار بدید و در این مورد فقط یک استثنا وجود داره ؛ در سمت چپِ هر عبارتِ انتساب باید نام یک متغیر قرار بگیره و قرار دادن هر نوع عبارت دیگه ای باعث ایجاد خطای نحوی میشه :

>>> minutes = hours * 60        # right
>>> hours * 60 = minutes        # wrong
SuntaxError : can't assign to operator


افزودن توابع جدید :

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

def print_lyrics():
     print("I'm  Milad, and I'm okay.")
     print("I sleep all night and I work all day.")

کلمه ی def نشون میده که این عبارت مربوط به تعریف یک تابع هست و همچنین عبارت print_lyrics به عنوان نام تابع در نظر گرفته میشه .

نکته : قوانین نامگذاری توابع دقیقا مانند قوانین نامگذاری متغیر ها در پایتون هست. ما نمیتونیم از کلید واژه های پایتون برای نامگذاری توابعمون استفاده کنیم ؛ در ضمن از انتخاب یک نام مشترک برای یک تابع و یک متغیر باید خودداری کنیم.

پرانتز باز و بسته نشون دهنده ی این هست که این تابع هیچ آرگومانی رو دریافت نمیکنه . به اولین خط تعریف تابع ، هِدِر گفته میشه و مابقی به عنوان بدنه ی تابع شناخته میشن . در آخرِ هدر تابع باید دونقطه (:) قرار داده بشه و بدنه ی تابع نیز بصورت پیشفرض به اندازه ی ۴ عدد space تورفتگی خواهد داشت تا ساختار تابع به درستی شکل بگیره .

در صورتی که مستقیما با مفسر پایتون کار میکنید ، هنگام تعریف یک تابع ، مفسر نقطه هایی رو بری شما نمایش خواهد داد تا بهتون اطلاع بده که فرایند تعریف تابع هنوز کامل نشده :

>>> def print_lyrics():
...         print("I'm Milad, and I'm okay.")
...         print("I sleep all night and I work all day.")
...

برای پایان دادن به بدنه ی تابع ، بعد از سه نقطه نباید دستوری وارد کنیم .

هنگام تعریف یک تابع ، یک شئِ تابع ساخته میشه که از نوع تابع هست :

>>> print(print_lyrics)
>>> type(print_lyrics)

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

>>> print_lyrics()
I'm  Milad, and I'm okay.
I sleep all night and I work all day.

بعد از تعریف یک تابع ، میتونیم اون رو داخل توابع دیگه فراخوانی کنیم . برای مثال تابعی به نام repeat_lyrics میسازیم و تابع قبلی رو داخل اون دوبار فراخوانی میکنیم :

def repeat_lyrics():
      print_lyrics()
      print_lyrics()

و بعد تابع repeat_lyrics رو فراخوانی میکنیم :

>>> repeat_lyrics()
I'm  Milad, and I'm okay.
I sleep all night and I work all day.
I'm  Milad, and I'm okay.
I sleep all night and I work all day.


تعاریف و کاربردها :

در این بخش میخوایم که توابعی که ساخته بودیم رو داخل یک برنامه و کنار هم بنویسیم و تغییراتی رو روی اونها انجام بدیم :

def print_lyrics():
      print("I'm Milad, and I'm okay.")
      print("I sleep all night and I work all day.")
def repeat_lyrics():
      print_lyrics()
      print_lyrics()
repeat_lyrics()

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

نکته مهم : برای فراخوانی یک تابع باید اون تابع قبلا تعریف شده باشه .

به عنوان مثال و برای اینکه بیشتر متوجه بشید ، در برنامه ی بالا ، جای آخرین خط برنامه (فراخوانی تابع) رو عوض کنید و اون رو به اول برنامه انتقال بدید . ببینید که بعد از اجرای برنامه با چه خطایی مواجه میشید.

حالا برنامه رو به حالت اول برگردونید و این بار تابع print_lyrics رو بعد از تابع repeat_lyrics تعریف کنید . بررسی کنید که بعد از اجرای این کار چه اتفاقی خواهد افتاد.


روند اجرا :

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

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

نکته ای که باید به یاد داشته باشید اینه که یک تابع میتونه تابع دیگری رو فراخوانی بکنه . مثلا در میانه ی بدنه ی یک تابع ، برنامه مجبور میشه که دستورات موجود در یک تابع دیگری رو اجرا بکنه و همینطور مادامی که در حال اجرای دستورات تابع جدید هست ، مجبور باشه که دستورات یک تابع دیگری رو هم اجرا بکنه.

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


پارامترها و آرگومان ها :

بعضی از توابعی که قبلا باهم دیدم آرگومان هایی رو نیاز داشتند . برای مثال وقتی تابع math.sin رو فراخوانی میکنیم ، عددی رو به عنوان آرگومان به اون پاس میدیم. بعضی از توابع بیش از یک آرگومان میگیرن مانند تابع math.pow که دو آرگومان رو میگیره ؛ اولی به عنوان پایه و دومی به عنوان توان .

در داخل توابع ،مقدار آرگومان ها به متغیر هایی بنام پارامتر ها انتقال پیدا میکنن . برای مثال در اینجا تابعی رو تعریف کردیم که یک آرگومان رو دریافت میکنه :

def print_twice(name):
     print(name)
     print(name)

این تابع مقدار آرگومان دریافتی رو به پارامتری بنام name انتقال میده و هنگام فراخوانی تابع ، مقدار پارامتر (هرچیزی که باشه) دوبار چاپ خواهد شد.

این تابع با هر مقداری که قابل چاپ شدن باشه ، میتونه کار کنه :

>>> print_twice('Spam')
Spam
Spam
>>> print_twice(42)
۴۲
۴۲
>>> print_twice(math.pi)
۳٫۱۴۱۵۹۲۶۵۳۵۹
۳٫۱۴۱۵۹۲۶۵۳۵۹

مشابه قوانین ترکیب بندی برای توابع درون-ساخت(Built-in) زبان پایتون ، این قوانین ، توابع ساخته شده توسط کاربر رو هم شامل میشه و میتونید از هر نوع عبارتی به عنوان آرگومان برای تابع print_twice استفاده کنید :

>>> print_twice('Spam '*4)
Spam Spam Spam Spam
Spam Spam Spam Spam
>>> print_twice(math.cos(math.pi))
-۱٫۰
-۱٫۰

همچنین ما میتونیم از یک متغیر به عنوان آرگومان تابع استفاده کنیم :

>>> var1 = "Python Is Amazing"
>>> print_twice(var1)
Python Is Amazing
Python Is Amazing


متغیرها و پارامترهای محلی :

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

def cat_twice(part1, part2):
     cat = part1 + part2
     print_twice(cat)

این تابع دو آرگومان رو از ما دریافت میکنه ، اونها رو بهم میچسبونه و نتیجه رو دوبار برای ما چاپ میکنه. از تابع بالا بصورت زیر میتونیم استفاده کنیم :

>>> line1 = ' this is the first string '
>>> line2 = ' and that is the second string'
>>> cat_twice(line1, line2)
'this is the first string and that is the second string'
'this is the first string and that is the second string'

بعد از اینکه تابع cat_twice خاتمه پیدا کرد ، متغیر cat از بین میره و اگر بخوایم که مقدار اون رو چاپ کنیم با خطای زیر مواجه میشیم :

>>> print(cat)
NameError: name 'cat' is not defined

پارامترها هم مانند متغیرهای داخل توابع ، محلی هستند . برای مثال خارج از تابع print_twice ، هیچ چیزی بنام name وجود نداره .


توابع دارای مقدار برگشتی و توابع خالی(fruitful functions and void functions) :

بعضی از توابعی که قبلا استفاده کردیم مانند توابع ریاضی ، نتایجی رو برای ما برگشت میدادن . به این نوع توابع در اینجا اصطلاحا fruitful functions خواهیم گفت. در مقابل ، توابعی مانند print_twice عملی رو برای ما انجام میدادن بدون اینکه مقداری رو برای ما برگشت بدن . به این نوع توابع ، void functions میگیم.

وقتی ما یک تابعِ fruitful رو فراخوانی میکنیم ، قصد داریم که از مقدار برگشتی اون برای انجان یک کاری استفاده کنیم. برای مثال میخوایم که مقدار برگشتی رو داخل یک متغیری بریزیم و یا اینکه مقدار برگشتی به عنوان بخشی از یک عبارت مورد استفاده قرار بگیره :

x = math.cos(radians)

golden = (math.sqrt(5) + 1) / 2

وقتی که ما تابعی رو داخل مفسر پایتون فراخوانی میکنیم ، مقدار برگشتی برای ما نمایش داده میشه :

>>> math.sqrt(5)
۲٫۲۳۶۰۶۷۹۷۷۴۹۹۷۸۹۸

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

math.sqrt(5)

اسکریپت بالا ریشه ی دوم عدد ۵ رو محاسبه میکنه ولی چون نه مقدار برگشتی رو داخل متغیری میریزه و نه مقدار رو برای ما نمایش میده ، زیاد به درد بخور نیست 🙂

توابع Void میتونن مقداری رو برای ما نمایش بدن و یا تاثیرات دیگه ای داخل برنامه داشته باشن ولی هیچ مقداری رو برای برنمیگردونن ؛ اگر با توابع void مانند توابع fruitful رفتار کنیم (یعنی مقدار برگشتی رو داخل متغیری بریزیم) با نوع خاصی از مقدار بنام None مواجه خواهیم شد :

>>> result = print_twice('Bing')
Bing
Bing
>>> print(result)
None

مقدار None مشابه مقدار رشته ای “None” نیست و نوع مخصوص خودش رو در زبان پایتون داره :

>>> print(type(None))


چرا از توابع استفاده میکنیم ؟

  1. ایجاد توابع به ما این امکان رو میده که دستورات برنامه رو بصورت گروهی نام گذاری کنیم که این کار خوانایی و خطایابی برنامه رو راحت تر میکنه.
  2. استفاده از توابع باعث حذف کدهای تکراری و کاهش حجم کدهای برنامه میشه ؛ که این کار سبب میشه تغییرات رو راحت تر بتونیم اعمال بکنیم.
  3. تقسیم یک برنامه به توابع این امکان رو به ما میده که بخش های مختلف برنامه رو بصورت جداگانه خطایابی کنیم.
  4. توابعی که به خوبی طراحی و پیاده سازی شدن ، میتونن در بسیاری از برنامه ها و پروژه های دیگه دوباره استفاده بشن.


تمرین ها :

  1. تابع average رو طوری تعریف کنید که دو عدد رو به عنوان پارامتر دریافت کنه و میانگین اونها رو برای ما نمایش بده.
  2. تابع right_justify رو طوری تعریف کنید که پارامتری بنام s از نوع رشته رو بگیره و با رعایت فاصله ی کافی از سمت چپ ، رشته ی مورد نظر رو طوری چاپ بکنه که حرف آخر رشته در ستون ۷۰ ام صفحه نمایش قرار گرفته باشه. (راهنمایی : با استفاده از تلفیق و تکرار رشته ها و تابع len میتونید این تمرین رو حل کنید)

خب اینم از فصل سوم ، امیدوارم مفید واقع بشه.

موفق باشید 🙂

نوشته آموزش پایتون – فصل سوم(توابع) اولین بار در ویرگول پدیدار شد.

گردآوری توسط ایده طلایی