الگوریتم کلمهای است که بسیار با آن مواجه میشویم. اما وقتی در مورد الگوریتمهای یوتیوب یا فیسبوک صحبت میکنیم، منظورمان دقیقاً چیست؟ الگوریتمها چه هستند و چرا افراد تا این حد از آنها در هراس هستند؟
ما در دنیایی زندگی میکنیم که گرچه رایانهها در لحظه لحظه زندگی ما نفوذ و رسوخ کردهاند، اما درک دقیقی از کارکرد آنها وجود ندارد. با این حال یک حوزه در علوم رایانه وجود دارد که هر فردی میتواند مبانی آن را درک کند. این زمینه از دانش رایانه به نام برنامهنویسی شناخته میشود.
برنامهنویسی صرفاً یک عنوان شغلی جذاب محسوب نمیشود؛ بلکه مبنای همه نرمافزارهای رایانهای از آفیس مایکروسافت تا نرمافزارهای سخنگوی تلفنی است. حتی اگر دانش شما از برنامهنویسی تنها منحصر به فیلمهای خیلی قدیمی و گزارشهای خبری زرد باشد، احتمالاً متوجه هستید که کار یک برنامهنویس چیست. برنامهنویس کدی را برای رایانه مینویسد و رایانه با استفاده از دستورالعملهای تعریف شده آن کد وظایفی را برای حل مسائل اجرا میکند.
اینک باید گفت که در دنیای دانش رایانه، الگوریتم در واقع عنوانی جذاب برای نامیدن کد است. هر مجموعه دستورالعمل که به یک رایانه اعلام کند مسائل را چگونه حل کند یک الگوریتم محسوب میشود؛ حتی اگر آن وظیفه بسیار آسان باشد. زمانی که رایانه خود را روشن میکنید، یک مجموعه از دستورالعملهای «شیوه روشن شدن» اجرا میشوند. زمانی که رایانه NASA از دادههای موج رادیویی خام برای رندر کردن یک عکس فضایی استفاده میکند، همچنان یک الگوریتم اجرا شده است.
کلمه الگوریتم میتواند برای توصیف هر مجموعه دستورالعملی حتی در خارج از دنیای برنامهنویسی نیز مورد استفاده قرار گیرد. برای نمونه روش شما برای مرتبسازی ظروف در یک کابینت نیز یک الگوریتم محسوب میشود. همچنین روش شما برای شستن دستها پس از دستشویی نیز یک الگوریتم است.

اما نکته اینجا است که امروزه کلمه الگوریتم صرفاً برای برخی گفتگوهای فناوری بسیار خاص مورد استفاده قرار میگیرد. معمولاً نمیشنویم که کسی از الگوریتمهای «ریاضیات مقدماتی» یا الگوریتمهای «ابزار گرافیتی در نرمافزار Paint» صحبت کند. اما در عوض بسیار میشنویم که کاربران در مورد الگوریتمهای پیشنهاد دوست اینستاگرام یا الگوریتمهای گردآوری داده فیسبوک از گروههای خصوصی اعتراض میکنند.
اگر الگوریتم یک اصطلاح با معانی مختلف برای دستورالعملهای محاسباتی باشد، در این صورت چرا باید از آن منحصراً برای توصیف جنبههای گیجکننده، جادویی و یا حتی شریرانه دنیای دیجیتال استفاده کنیم؟

در گذشته، برنامهنویسان و فرهنگ عامه اغلب دستورالعملهای محاسباتی را به صورت کد مینامیدند. این وضعیت امروزه نیز تا حدودی زیادی برقرار است. یادگیری ماشین زمینه وسیع و مبهمی از محاسبات است که در آن به جای کد از الگوریتم استفاده میشود. بدیهی است که این مسئله نیز بر سردرگمی پیچیدگی موجود پیرامون کلمه الگوریتم میافزاید.
یادگیری ماشین مدتهای زیادی است که وجود دارد، اما صرفاً در طی حدوداً 15 سال اخیر بوده است که به بخش بزرگی از دنیای دیجیتال تبدیل شده است. با این که یادگیری ماشین مانند یک ایده پیچیده به نظر میرسد، اما درک آن کاملاً آسان است. برنامه نویسان نمیتوانند کدهای خاص را برای هر موقعیت نوشته و تست کنند و از این رو کدی را مینویسند که بتواند خودش کدنویسی کند.
یادگیری ماشین را میتوان مانند یک شکل عملی از هوش مصنوعی تصور کرد. اگر شما تعداد کافی از ایمیلهای رئیس خود را به صورت اسپم علامتگذاری کنید، در این صورت کلاینت ایمیل به صورت خودکار همه ایمیلهای رئیس را به صورت اسپم نمایش میدهد. به طور مشابه، گوگل از یادگیری ماشین برای مطمئن شدن از این که نتایج جستجوی یوتیوب مرتبط بودهاند بهره میگیرند. آمازون نیز از یادگیری ماشین استفاده میکند تا محصولاتی که بهتر است بخرید را به شما پیشنهاد کند.
البته یادگیری ماشین این مقدار هم زیبا و سرراست نیست. عنوان «یادگیری ماشین» نیز آن قدر پیچیده هست که موجب آزردگی برخی افراد شود. برخی از کاربردهای رایج یادگیری ماشین نیز از نظر اخلاقی بحث برانگیز هستند. الگوریتمهایی که فیسبوک برای دادهکاوی کاربران در سطح وب استفاده میکند، مثالی از جنبههای ناخوشایند یادگیری ماشین محسوب میشوند.
در اخبار به صورت مکرر در خصوص الگوریتم گوگل برای رتبهبندی نتایج جستجو، الگوریتم یوتیوب برای پیشنهاد ویدئو و الگوریتم فیسبوک برای تصمیمگیری در مورد مطالبی که در تایملاین دیده میشود مطالبی را میخوانیم. اینها همگی مواردی مستعد نزاع و بحثانگیز هستند.
Long Division ازجمله الگوریتمهای آشنا برای تقسیم اعداد است. این الگوریتم چنان ساده است که به جای رایانهها مورد استفاده کودکان مدرسهای است. پردازندههای رایانه از الگوریتم کاملاً متفاوتی برای تقسیم کردن اعداد استفاده میکنند، اما در هر حال نتیجه کار یکسان است.
در تبدیل گفتار به متن از یادگیری ماشین استفاده میشود، اما هیچ کس از الگوریتم تبدیل گفتار به متن صحبت نمیکند، چون یک پاسخ دقیق عینی وجود دارد که هر انسانی میتواند بیدرنگ شناسایی کند. برای هیچ کس مهم نیست که رایانهها چگونه گفتهها را تشخیص میدهند و آیا از یادگیری ماشین استفاده شده است یا نه. تنها نکته مهم برای ما این است که آیا رایانه پاسخ صحیحی داده است یا نه.
اما دیگر کاربردهای یادگیری ماشین از این مزیت ارائه پاسخ صحیح برخوردار نیستند. به همین دلیل است که الگوریتمها به موضوع معمول گفتگوهای رسانهای در عصر حاضر تبدیل شدهاند.
یک الگوریتم برای مرتبسازی الفبایی فهرست تنها روشی برای اجرای وظیفه تعریف شده است. اما الگوریتمی مانند الگوریتم گوگل برای رتبهبندی بهترین وبسایتها برای جستجو یا الگوریتم یوتیوب برای پیشنهاد بهترین ویدئو ابهام بیشتری دارد و یک وظیفه تعریف شده را اجرا نمیکند. در این حالت مردم میتوانند بحث کنند که آیا الگوریتم نتایجی را که باید تولید کند، ارائه میدهد یا نه و بدیهی است که افراد مختلف میتوانند نظرهای متفاوتی در این خصوص داشته باشند. اما در مثال مرتبسازی الفبایی یک فهرست، همه کس توافق دارند که فهرست نهایی از نظر الفبایی مرتب شده است و هیچ جایی برای بحث وجود ندارد.
الگوریتمها مبانی همه نرمافزارها هستند. بدون وجود الگوریتم هیچ تلفن یا رایانهای وجود نمیداشت و احتمالاً همین مقاله را نیز روی کاغذ میخواندید و شاید هم اصلاً نمیتوانستید آن را بخوانید.
اما توده مردم از واژه الگوریتم به عنوان یک اصطلاح همهکاره برای کدهای رایانهای استفاده نمیکنند. در واقع اغلب مردم تصور میکنند که تفاوتی بین کد رایانه و الگوریتم وجود دارد؛ در حالی که واقعاً چنین نیست. از آنجا که واژه الگوریتم با یادگیری ماشین مرتبط است، معنی آن تا حدودی در هالهای از ابهام قرار گرفته است و کاربرد آن به موارد خاصی محدود شده است.

آیا ما باید از واژه الگوریتم برای توصیف اغلب کدهای رایانهای استفاده کنیم؟ شاید این کار مناسبی نباشد، چون اغلب افراد منظور گفتههای شما را درک نخواهند کرد. زبان همواره در حال تغییر است و برای هر تغییری نیز همواره دلیل خوبی وجود دارد. افراد برای توصیف دنیای سردرگمکننده، مبهم و در برخی موارد مشکوک یادگیری ماشین به یک واژه نیاز دارند و فعلاً واژه الگوریتم این نقش را بر عهده گرفته است.
بدین ترتیب بهتر است به خاطر داشته باشید که یک الگوریتم (و یادگیری ماشین) در معنای اصلی خود مقداری کد است که برای حل وظایف نوشته شده است. هیچ ترفند جادویی در مورد الگوریتم وجود ندارد و در واقع نسخه پیچیدهتری از نرمافزار است که همگی با آن آشنا هستیم.
منبع: فرادرس
اگر یک عدد صحیح غیر منفی n وجود داشته باشد، فاکتوریل آن عدد به صورت حاصلضرب همه اعداد صحیح مثبت کمتر یا برابر با آن تعریف میشود. در این مقاله به بررسی روشهای مختلف محاسبه فاکتوریل یک عدد مفروض در زبان برنامهنویسی جاوا میپردازیم.
در این بخش با روشهای متفاوتی اقدام به محاسبه فاکتوریل اعداد تا 20 میکنیم.
در ادامه یک الگوریتم ساده فاکتوریل را با استفاده از حلقه for مشاهده میکنید:
راهحل فوق برای اعداد تا 20 به خوبی کار میکند. اما اگر تلاش کنیم فاکتوریل اعداد بالاتر از 20 را محاسبه کنیم، ناموفق خواهد بود، زیرا نتایج آن قدر بزرگ خواهد شد که در یک متغیر از نوع long جای نمیگیرد و موجب خطای «سرریز» (overflow) میشود.
در ادامه با روشهای دیگر محاسبه فاکتوریل در جاوا آشنا میشویم و باید توجه داشته باشیم که این روشها تنها برای اعداد کوچک پاسخگو هستند.
امکان استفاده از API مربوط به Stream در جاوا 8 برای محاسبه فاکتوریل به روشی آسان وجود دارد:
در این برنامه ابتدا از LongStream برای تعریف حلقهای روی اعداد بین 1 تا n استفاده میکنیم. سپس از ()reduce استفاده میکنیم که از یک مقدار شناسایی و تابع تجمیع در مرحله کاهش استفاده میکند.
در این بخش مثالی از یک برنامه محاسبه فاکتوریل میبینیم که این بار از روشهای بازگشتی استفاده شده است:
Apache Commons Math یک کلاس به نام CombinatoricsUtils دارد که شامل یک متد فاکتوریل استاتیک است. ما میتوانیم از این متد نیز برای محاسبه فاکتوریل استفاده کنیم.
برای incude کردن Apache Commons Math باید وابستگی commons-math3 را به pom اضافه کنیم:
در ادامه مثالی از استفاده از کلاس CombinatoricsUtils را میبینید:
توجه داشته باشید که نوع بازگشتی مانند راهحلهای بومی جاوا long است.
این بدان معنی است که اگر مقدار محاسبه شده از Long.MAX_VALUE تجاوز کند، خطای MathArithmeticException صادر میشود. برای دریافت مقادیر بزرگتر باید از نوع بازگشتی متفاوتی استفاده کنیم.
در این بخش روشهایی را بررسی میکنیم که با آنها میتوان فاکتوریل اعداد بزرگتر از 20 را نیز محاسبه کرد.
چنان که پیشتر اشاره کردیم، نوع داده long برای محاسبه فاکتوریل عدد n به شرط کمتر از 20 بودن مناسب است. برای مقادیر n بزرگتر میتوانیم از کلاس BigInteger در پکیج java.math استفاده کنیم که میتواند مقادیری تا 2^Integer.MAX_VALUE را نگهداری کند.
کتابخانه Guava گوگل یک متد کاربردی برای محاسبه فاکتوریل اعداد بزرگ ارائه کرده است. برای include کردن این کتابخانه میتوانیم وابستگی guava را به pom اضافه کنیم:
اکنون میتوانیم از متد فاکتوریل استاتیک از کلاس BigIntegerMath برای محاسبه فاکتوریل عدد مفروض استفاده کنیم:
در این مقاله، با چند روش محاسبه فاکتوریل با استفاده از توابع هسته مرکزی جاوا و همچنین چند کتابخانه دیگر آشنا شدیم. ابتدا راهحلهایی را با استفاده از نوع داده long برای محاسبه فاکتوریل تا 20 محاسبه کردیم. سپس چند روش برای محاسبه فاکتوریل اعداد بزرگتر از 20 با استفاده از BigInteger را بررسی کردیم.
منبع: فرادرس
در این مقاله ابتدا به بررسی API-های سطح بالا میپردازیم و در ادامه با ماهیت، طرز کار، شیوه استفاده در کد و روش سازماندهیشان آشنا میشویم. همچنین نگاهی خواهیم داشت به کلاسهای اصلی متفاوت API-های وب و کاربردهای مختلفی که دارند.
API اختصاری برای عبارت «رابط برنامهنویسی اپلیکیشن» (Application Programming Interfaces) است و سازهای است که در اختیار زبانهای برنامهنویسی قرار میگیرد تا بتوانند کارکردهای پیچیده را به روش آسان ایجاد کنند. API-ها کدهای پیچیده را از شما انتزاع میکنند و در وهله نخست ساختار آسانی برای کار کردن در اختیار شما قرار میدهند.
نکته: برای مطالعه قسمت قبلی این مجموعه مطالب آموزشی میتوانید به این لینک رجوع کنید: انتخاب رویکرد مناسب در برنامه نویسی ناهمگام جاوا اسکریپت — راهنمای جامع
به عنوان یک مثال واقعی میتوانید جریان برق یک خانه، آپارتمان یا دیگر ساختمانها را تصور کنید. اگر بخواهید از لوازم خانه استفاده کنید، باید آنها را به پریز برق وصل کنید تا به کار بیفتند. شما تلاش نمیکنید که برق را به نقاط مختلف خانه سیمکشی کنید، چون این کار میتواند کاملاً ناکارآمد باشد و در صورتی که برقکار نباشید، تلاش خطرناک و دشواری نیز محسوب میشود.

به ترتیب مشابه اگر بخواهید برخی گرافیکهای 3 بعدی را برنامهنویسی کنید، استفاده از API-های نوشته شده در زبانهای سطح بالا مانند جاوا اسکریپت یا پایتون بسیار آسانتر از نوشتن کدهای سطح پایین (مانند C یا ++C) است که مستقیماً GPU رایانه را کنترل میکنند یا کارکردهای گرافیکی دیگری را ارائه میکنند.
جاوا اسکریپت سمت کلاینت به طور خاص API-های زیادی در اختیار ما قرار داده است که بخشی از خود زبان جاوا اسکریپت نیستند، بلکه بر مبنای زبان اصلی جاوا اسکریپت ساخته شدهاند و امکانات فوقالعادهی اضافی برای استفاده در کدهای جاوا اسکریپت ارائه میکنند. این API-ها عموماً در دو دسته جای میگیرند که در ادامه به این دو دسته خواهیم پرداخت.
این API-ها بر مبنای مرورگر ساخته میشوند و امکان افشای دادهها را از مرورگر و محیط پیرامونی رایانه فراهم میسازند و کارهای مفید پیچیدهای انجام میدهند. برای نمونه، Web Audio API سازههای جاوا اسکریپت را برای دستکاری صدا در مرورگر ارائه میکنند. بدین ترتیب میتوان یک قطعه صوتی را ضبط کرد، صدا را کاهش یا افزایش داد، جلوههایی روی آن اعمال کرد و مواردی از این دست. مرورگر در پسزمینه عملاً از کدهای پیچیده سطح پایینی (مانند ++C یا Rust) برای پردازش واقعی صداها استفاده میکند، اما در این مورد نیز پیچیدگی از طریق API انتزاع شده است.
این دسته از API-ها به صورت پیشفرض در مرورگر موجود نیستند و کدهای آنها را عموماً باید از جای دیگری در وب استخراج کنیم. برای نمونه، Twitter API امکان اجرای کارهایی مانند نمایش دادن آخرین توییت ها روی وبسایت فراهم میسازد. بدین ترتیب مجموعه خاصی از سازهها در دسترس ما قرار میگیرد که میتوان به سرویس توییتر کوئری زد و اطلاعات خاصی را به دست آورد.

در بخش قبل در مورد این که API-های سمت کلاینت جاوا اسکریپت چه هستند و چه ارتباطی با زبان جاوا اسکریپت دارند صحبت کردیم. در این بخش مباحث مطرح شده را جمعبندی میکنیم تا همه چیز روشنتر شود و نقش ابزارهای دیگر جاوا اسکریپت نیز مشخص شود.
جاوا اسکریپت: یک زبان اسکریپتنویسی سطح بالا است که بر مبنای مرورگرها ساخته شده است و امکان پیادهسازی کارکردهای روی صفحهها و اپلیکیشنهای وب را به دست میدهد. توجه کنید که جاوا اسکریپت در محیطهای برنامهنویسی دیگر مانند Node نیز عرضه شده است.
API-های مرورگر: سازههایی هستند که بر مبنای مرورگر ساخته شدهاند و روی زبان جاوا اسکریپت کار میکنند و امکان پیاده سای آسانتر کارکردها را فراهم میسازند.
API-های شخص ثالث: سازههایی هستند که در پلتفرمهای شخص ثالث (مانند توییتر، فیسبوک و غیره) ساخته شدهاند و میتوان آنها را به صفحه وب الحاق کرد تا برخی از امکانات آن پلتفرمها در صفحههای وب شخصی ارائه شوند. برای نمونه میتوان آخرین توییتها را در صفحه وب شخصی نمایش داد.
کتابخانههای شخص ثالث: معمولاً یک یا چند فایل جاوا اسکریپت هستند که شامل تابعهای سفارشی هستند و به صفحه وب الحاق میشوند تا نوشتن کارکردهای رایج را تسریع یا فعالسازی کنند. نمونههایی از آن شامل jQuery، Mootools و React است.
فریمورکهای جاوا اسکریپت: فریمورکها بر مبنای کتابخانهها ساخته میشوند، فریمورکهای جاوا اسکریپت مانند انگولار و Ember در واقع پکیجهای HTML ،CSS و جاوا اسکریپت و دیگر فناوریهایی که نصب میشوند هستند و سپس برای نوشتن وباپلیکیشنها از صفر مورد استفاده قرار میگیرند. تفاوت کلیدی بین کتابخانه و فریمورک در «معکوس شدن کنترل» است. زمانی که یک متد از یک کتابخانه فراخوانی میشود، توسعهدهنده مسئول کنترل آن است. در یک فریمورک کنترل معکوس میشود، یعنی فریمورک، کد توسعهدهنده را فراخوانی میکند.

تعداد بسیار زیادی از API-ها در مرورگرهای مدرن وجود دارند که امکان انجام طیف گستردهای از کارها را در کد فراهم میسازند. با ملاحظه صفحه اندیس API-های MDN (+) این مسئله واضحتر دیده میشود.
API-های مشترک مرورگر: به طور خاص، دستهبندیهای رایجتر API-های مرورگر که مورد استفاده قرار میگیرند به شرح زیر هستند:
API-ها برای دستکاری اسناد: این API-ها در مرورگر بارگذاری میشوند. بدیهیترین مثال API مربوط به DOM است که امکان دستکاری HTML و CSS را میدهد. به وسیله این API میتوان کدهای HTML را به صورت دینامیک ایجاد، یا حذف کرده و یا تغییر داد و استایلهای جدیدی روی صفحه اعمال کرد. هر بار که در هنگام مرور وب یک پنجره پاپآپ میبینید یا نوعی محتوای جدید روی صفحه ظاهر میشود DOM عمل کرده است.
API-هایی که دادهها را از سرور واکشی میکنند: این API-ها بخشهای کوچکی از صفحه وب را که کاربرد بیشتری دارند، بهروزرسانی میکنند. این جزییات به ظاهر کوچک تأثیر زیادی روی عملکرد و رفتار سایتها دارند. اگر صرفاً لازم باشد که یک فهرست انبار یا فهرستی از موجودی جدید بهروزرسانی شود، انجام این کار به صورت مستقیم بدون نیاز به بارگذاری مجدد کل صفحه از سرور موجب میشود که سایت یا اپلیکیشن واکنشگرایی بیشتری به نمایش بگذارد و کارآمد به نظر برسد. API-هایی که این امر را ممکن میسازند، شامل XMLHttpRequest و Fetch API هستند. همچنین ممکن است با Ajax مواجه شده باشید که این تکنیک را توضیح میدهد.
API-هایی برای رسم و دستکاری گرافیکها: این API-ها اینک به صورت گسترده از سوی مرورگرها پشتیبانی میشوند. رایجترین انواع این API-ها شامل Canvas و WebGL هستند که امکان بهروزرسانی برنامهنویسی شده دادههای پیکسلی موجود در عنصر <canvas> در HTML را به صورت صحنههای 2 و 3 بعدی فراهم میسازند. برای نمونه میتوان شکلهایی از قبیل مستطیل یا دایره را روی صفحه رسم کرد، یک تصویر را در یک بوم ایمپورت کرد و یک فیلتر مانند «حالت قهوهای» (Sepia) یا «سیاه و سفید» (grayscale) را با استفاده از Canvas API روی آن اعمال کرد. همچنین میتوان یک صحنه 3 بعدی پیچیده را به همراه نوردهی و بافتها با کمک WebGL روی صفحه ایجاد کرد. چنین API-هایی غالباً با API-های مربوط به ایجاد حلقههای انیمیشن مانند ()window.requestAnimationFrame و همچنین API-های دیگر برای بهروزرسانی مداوم صحنههایی مانند کارتون یا گیم ترکیب میشوند.
API-های صوتی و ویدئویی: این API-ها از قبیل HTMLMediaElement ،the Web Audio API و WebRTC امکان اجرای کارهای واقعاً جذابی را با فایلهای چندرسانهای فراهم میسازند. از جمله کارهایی که این API-ها انجام میدهند شامل ایجاد کنترلهای UI سفارشی برای پخش صوت و ویدئو، نمایش مسیرهای متنی مانند عنوان و زیرنویس همراه فیلم، دریافت ویدئو از دوربین وب و دستکاری آن از طریق یک بوم یا نمایش روی نمایشگر یک فرد دیگر برای اجرای ویدئوکنفرانس و یا افزودن جلوههایی به قطعههای صوتی است.
API-های دستگاه: این API-ها اساساً برای دستکاری و بازیابی دادهها از سختافزار دستگاههای مدرن به ترتیبی که برای وباپلیکیشنها مفید باشند، مورد استفاده قرار میگیرند. نمونههایی از آن چنین است که از طریق بخش نوتیفیکیشنهای سیستم به کاربر اعلام کنیم که یک بهروزرسانی مفید برای وب اپلیکیشن موجود است یا از سختافزار ویبره دستگاه استفاده کنیم.
API-های ذخیرهسازی سمت کلاینت: این API-ها به تدریج در مرورگرهای وب بسیار گسترش مییابند، چون امکان ذخیرهسازی دادهها در سمت کلاینت در صورتی که بخواهید یک اپلیکیشن بسازید که «حالت» (State) را بین بارگذاری صفحههای مختلف حفظ کند و احتمالاً حتی وقتی دستگاه آفلاین است، کار کند، بسیار مفید خواهد بود. چند گزینه مانند ذخیرهسازی ساده نام/مقدار با و ذخیرهسازی جدولی پیچیدهتر دادهها با استفاده از IndexedDB API به این منظور وجود دارند.
API-های مشترک شخص ثالث: API-های شخص ثالث در طیف گستردهای عرضه شدهاند. برخی از انواع رایجتر شامل آنهایی میشوند که هر توسعهدهندهای دیر یا زود باید مورد استفاده قرار دهد.
API-های مختلف جاوا اسکریپت به روشهای نسبتاً متفاوتی عمل میکنند، اما طرز کار آنها عموماً دارای ویژگیها و طرحبندیهای مشابهی است.
کد شما با استفاده از یک یا چند شیء جاوا اسکریپت با API-ها تعامل مییابد که به عنوان کانتینرهایی برای دادههایی که API استفاده میکند (در مشخصههای شیء) و کارکردی که API مهیا میکند (در متدهای شیء)، عمل میکنند.
اگر به مثال API وب صوتی بازگردیم میبینیم که این یک API نسبتاً پیچیده است که شامل تعدادی شیء است. بدیهیترین آنها شامل موارد زیر هستند:
اینک سؤال این است که این اشیا چگونه تعامل مییابند؟ در قطعه کد زیر مثالی از یک پخشکننده صدا ارائه شده است:
در نخستین بخش این کد با HTML زیر مواجه میشویم:
قبل از هر چیز عنصر <audio> را include میکنیم و با آن یک فایل MP3 را در صفحه جاسازی میکنیم. ما هیچ کنترل پیشفرض مرورگر را نگنجاندهایم. سپس یک عنصر <button> قرار دادهایم که از آن برای پخش و قطع صدا استفاده میکنیم. همچنین یک عنصر <input> از نوع range قرار دادهایم که برای تنظیم شدت صدای در حال پخش استفاده میشود.
سپس به کد جاوا اسکریپت این مثال نگاه میکنیم. کار خود را با ایجاد یک وهله از AudioContext آغاز میکنیم که درون آن به دستکاری قطعه صوتی میپردازیم:
سپس ثابتهایی میسازیم که ارجاعها به عناصر <audio> ،<button> و <input> را نگهداری میکنیم. از متد ()AudioContext.createMediaElementSource برای ایجاد یک MediaElementAudioSourceNode استفاده میکنیم که نماینده منبع صدای ما است. عنصر <audio> که صدا از آن پخش میشود به صورت زیر است:
در ادامه یک جفت دستگیره رویداد میگنجانیم تا زمانی که دکمه کلیک شود بین حالتهای پخش و توقف تغییر پیدا میکنند. همچنین زمانی که پخش قطعه صوتی به انتها برسد، آن را به ابتدای قطعه ریست میکنند:
نکته: ممکن است متوجه شده باشید که متدهای ()play و ()pause که برای پخش و مکث قطعه صوتی استفاده میشوند بخشی از API صوتی وب نیستند. در واقع آنها بخشی از API به نام HTMLMediaElement هستند که گرچه متفاوت است اما ارتباط نزدیکی دارد.
سپس یک شیء GainNode با استفاده از متد ()AudioContext.createGain میسازیم که از آن میتوان برای تنظیم شدت صدا استفاده کرد و یک دستگیره رویداد دیگر میسازیم که هر زمان مقدار اسلایدر تغییر یابد، مقدار شدت صدا را تغییر میدهد.
آخرین کاری که برای عملیاتی کردن این پخشکننده صوتی لازم است، اتصال گرههای مختلف به گراف صوتی است که با استفاده از متد ()AudioNode.connect روی هر نوع از گره صورت میگیرد:
صدا در منبع آغاز میشود که در ادامه به گره gain متصل شده است تا بتوان شدت صدا را تنظیم کرد. گره gain به گره مقصد وصل شده است تا بتوان صدا را روی رایانه پخش کرد.
زمانی که از API استفاده میکنید باید مطمئن شوید که میدانید نقطه ورود API کجاست. در API صوتی وب این نقطه ورود کاملاً مشخص و شیء AudioContext است که باید برای انجام هر نوع دستکاری صوتی استفاده شود.
API مربوط به مدل شیء سند یا DOM نیز نقطه ورود سادهای دارد. قابلیتهای آن را میتوان در شیء Document یا یک وهله از عنصر HTML یافت که به نحوی میخواهید عملیاتی کنید. برای نمونه:
Canvas API نیز روی دریافت یک شیء context برای استفاده جهت دستکاری موارد مختلف استوار است، گرچه در این مورد به جای یک context صوتی یک context گرافیکی وجود دارد. شیء context آن از طریق دریافت یک ارجاع به عنصر <canvas> که قرار است روی آن ترسیم کنیم ایجاد میشود و سپس متد ()HTMLCanvasElement.getContext آن فراخوانی میشود:
هر کاری که بخواهیم روی بوم انجام دهیم از طریق فراخوانی متدها و مشخصههای یک شیء context ممکن خواهد بود که وهلهای از CanvasRenderingContext2D است. برای نمونه:
برخی API-های وب شامل هیچ رویدادی نیستند، اما اغلب آنها دستکم چند رویداد دارند. مشخصههای دستگیره به ما امکان میدهند که تابعها را زمانی که رویدادها اتفاق میافتند اجرا کنیم.
ما در مثال فوق برخی از دستگیرههای رویداد را که در API صوتی وب استفاده میشوند مشاهده کردیم. برای ارائه مثالی دیگر باید بگوییم که وهلههای شیء XMLHttpRequest هر یک نماینده یک درخواست HTTP به سرور هستند که نوعی منابع جدید را بازیابی میکنند و هر یک چندین رویداد دارند. برای نمونه رویداد load زمانی وقوع مییابد که یک پاسخ با موفقیت بازگشت یابد و شامل منبع درخواستی ناموجودی باشد.
کد زیر نمونه سادهای از شیوه استفاده از این رویداد را نشان میدهد:
چند خط نخست، موقعیت منبعی را که میخواهیم واکشی کنیم نشان میدهد، یک وهله جدید از شیء درخواست را با استفاده از سازنده ()XMLHttpRequest ایجاد میکند، یک درخواست HTTP به صورت GET باز میکند تا منبع موردنظر را بازیابی کند، پاسخی که باید ارسال شود را در قالب JSON تعیین میکند و سپس درخواست را ارسال میکند.
در ادامه تابع دستگیره onload، کاری را که با پاسخ انجام میدهیم توصیف میکند. میدانیم که پاسخ با موفقیت و پس از الزام رویداد load بازگشت خواهد یافت، مگر این که خطایی رخ دهد. از این رو پاسخ را که شامل JSON بازگشتی است در متغیر superHeroes ذخیره میکنیم و سپس آن را به دو تابع مختلف برای پردازش بیشتر ارسال میکنیم.
قابلیتهای WebAPI همچون جاوا اسکریپت و دیگر فناوریهای وب در معرض ملاحظات امنیتی هستند، اما برخی اوقات سازوکارهای امنیتی اضافی تعریف میشوند. برای نمونه برخی از WebAPI-های مدرن تنها روی صفحههایی کار میکنند که روی HTTPS عرضه شده باشند، چون دادههای بالقوه حساسی را انتقال میدهند.
به علاوه برخی WebAPI-ها درخواست مجوز فعال شدن را در زمان فراخوانی در کد از کاربر میکنند. به عنوان نمونه Notifications API از طریق یک کادر محاورهای بازشونده از کاربر اجازه میخواهد:

API-های Web Audio و HTMLMediaElement در معرض سازوکارهای امنیتی به نام autoplay policy هستند. معنی این وضعیت آن است که در زمان بارگذاری صفحه نمیتوان به صورت خودکار به پخش صدا پرداخت و باید از طریق یک کنترل مانند دکمه از کاربر اجازه پخش صدا را گرفت. دلیل انجام این کار آن است که پخش خودکار صدا معمولاً بسیار آزاردهنده است و کاربران عموماً دوست ندارند چنین وضعیتی را تجربه کنند.
نکته: بسته به این که یک مرورگر تا چه حد سختگیرانه عمل میکند، این سازوکارهای امنیتی ممکن است یک نمونه کد را از کارکرد محلی نیز بازدارند، یعنی زمانی که یک فایل مثال محلی را به جای وبسرور در یک مرورگر روی سیستم خود باز میکنید، کار نکند. در زمان نوشتن این مقاله، مثال Web Audio API این نوشته روی مرورگر گوگل کروم کار نمیکرد و باید آن را روی گیتهاب آپلود میکردیم.
در پایان مطالعه این مقاله شما باید ایده خوبی از مفهوم API-ها، طرز کار آنها، و کاربردهایی که در کد جاوا اسکریپت دارند، به دست آورده باشید. احتمالاً هیجانزده هستید که شروع به استفاده جالبی از API-های خاص بکنید. در بخش بعدی اقدم به دستکاری سندها با استفاده از API مدل شیء سند یعنی DOM خواهیم کرد.
برای مطالعه قسمت بعدی این مجموعه مطلب آموزشی به لینک زیر رجوع کنید:
فریمورک وب لاراول از مزیت کتابخانه محبوب SwiftMailer برخوردار است که استفاده از آن آسان است و طیف متنوعی از درایورهای ایمیل ارائه کرده است. در همین راستا، در این مقاله قصد داریم به بررسی API ارسال ایمیل در لاراول بپردازیم.
لاراول یک کتابخانه پوششی بر روی کتابخانه SwiftMailer بنا میکند که مدیریت ایمیل را همزمان به کاری بسیار آسان و قابل پیکربندی تبدیل میکند. تنظیمات پیشفرض ایمیل را میتوانید در فایل config/mail.php مشاهده کنید:
هنگامی که از ارسال ایمیل صحبت میکنیم، لاراول از درایورهای مختلفی پشتیبانی میکند. چنان که میبینید MAIL_DRIVER پیشفرض به صورت stmp تنظیم شده است. اگر قصد دارید از درایور stmp برای ارسال ایمیل استفاده کنید، در این صورت به مجموع تنظیمات دیگری مانند MAIL_HOST ،MAIL_PORT ،MAIL_ENCRYPTION ،MAIL_USERNAME و MAIL_PASSWORD هم نیاز خواهید داشت.
از سوی دیگر اگر قصد دارید از درایور sendmail استفاده کنید، در این صورت باید مطمئن شوید که مسیر سیستم sendmail در فایل config/mail.php به مقدار صحیحی تنظیم شده است.
همچنین میتوانید آدرس from را که در زمان ارسال ایمیلها با کلید from استفاده میشوند، تنظیم کنید. در نهایت اگر میخواهید از رندرینگ ایمیل مبتنی بر Markdown استفاده کنید، میتوانید این تنظیمات را زیر کلید markdown تنظیم کنید.
نکته جالب دیگر این است که میتوانید از ارائهدهندگان سرویسهای ایمیل شخص ثالث مانند Mailgun ،Mandrill ،SES و SparkPost نیز استفاده کنید. اگر از یکی از این سرویسها استفاده میکنید، باید اطمینان حاصل کنید که تنظیمات مربوطه را در فایل config/services.php تعیین کردهاید.
بدین ترتیب یک مقدمه کوتاه در مورد تنظیمات مرتبط با API ایمیل در لاراول داشتیم. از این بخش به بعد قصد داریم یک مثال سفارشی را بررسی کنیم که روش ارسال ایمیلها را نمایش میدهد.
در این بخش، کلاس Mailable را میسازیم که برای ارسال ایمیل استفاده میشوند. کلاس Mailable مسئول ارسال ایمیلها با استفاده از mailer است که آن نیز در فایل config/mail.php پیکربندی شده است. در واقع لاراول از قبل یک دستور آرتیزان به صورت زیر دارد که امکان ایجاد یک قالب پایه را به ما میدهد:
این دستور یک قالب ایمیل خالی در آدرس app/Mail/DemoEmail.php ایجاد میکند که در قطعه کد زیر میتوانید آن را ببینید:
محتوای این فایل را با کدهای زیر جایگزین کنید:
دو متد مهم در کلاس mailable به نامهای construct__ و build وجود دارند که به صورت سراسری پیادهسازی میشوند. متد construct__ برای مقداردهی اشیایی استفاده میشود که در قالب ایمیل قرار است استفاده شوند. از سوی دیگر متد build برای مقداردهی مقادیر خاص ایمیل مانند from، قالب view، پیوست ایمیل و نظایر آن استفاده میشود.
در این مورد، شیء demo$ را به صورت یک آرگومان سازنده ارسال میکنیم و آن را به مشخصه عمومی demo انتساب میدهیم. در متد build یک پیکربندی بندی خاص ایمیل را مقداردهی میکنیم.
From برای تعیین آدرس ایمیلی استفاده میشود که در آدرس فرستنده ایمیل درج خواهد شد.
با استفاده از متد view میتوان قالب ایمیلی را تعیین کرد که در زمان ارسال کردن ایمیل با استفاده از کلاس mailable استفاده خواهد شد. در این مورد ما از mails.demo استفاده میکنیم و معنی آن این است که باید یک فایل قالب view در مسیر resources/views/mails/demo.blade.php بسازید.
سپس متد text برای راهاندازی نسخه متنی سادهای از یک قالب ایمیل استفاده خواهد شد.
چنان که قبلاً اشاره کردیم متد construct__ برای راهاندازی شیءهایی استفاده میشود که در قالب ایمیل استفاده میشوند. میتوان از متد with نیز استفاده کرد که امکان تنظیم دادههای view یک پیام را فراهم میسازند. سپس از متد attach برای الصاق یک تصویر به پیام استفاده میکنیم.
البته ما باید یک قالب ایمیل ایجاد کنیم که در زمان ارسال ایمیلها مورد استفاده قرار خواهد گرفت. در ادامه فایل resources/views/mails/demo.blade.php را با محتوای زیر ایجاد میکنیم:
همچنین یک نسخه متنی ساده از این فایل را در مسیر resources/views/mails/demo_plain.blade.php میسازیم:
بدین ترتیب کلاس mailable بنا به دلخواه ما تنظیم شده است، اما هنوز کار ما تمام نشده است، چون باید از یک facade به نام Mail برای ارسال عملی ایمیلها استفاده کنیم. در بخش بعدی در مورد شیوه استفاده از facade به نام Mail برای ارسال ایمیل با استفاده از DemoEmail در کلاس mailable که هم اینک ایجاد کردیم توضیح خواهیم داد.
در این بخش یک نمونه میسازیم که نشان میدهد چگونه میتوان از کلاس mailable ایجاد شده در مرحله قبلی استفاده کرد.
یک فایل کنترلر در مسیر app/Http/Controllers/MailController.php با محتوای زیر میسازیم:
لازم به اشاره است که ما Facede موجود در مسیر Illuminate\Support\Facades\Mail که برای ارسال ایمیل استفاده میشود را نیز در این فایل include کردهایم. در متد send گزاره زیر مسئول ارسال یک ایمیل با مقداردهی App\Mail\DemoEmail در کلاس Mailable است:
متد to در Facade به نام Illuminate\Support\Facades\Mail یک وهله از کلاس \Illuminate\Mail\PendingMail بازگشت میدهد که از قبل شامل یک mailer مناسب پیکربندی شده در فایل config/mail.php است.
در نهایت از متد send در کلاس Illuminate\Mail\PendingMail\ استفاده میکنیم که عملاً یک ایمیل را ارسال میکند.
برای تست کردن این پروژه نمونه، یک مسیر مرتبط را در فایل اضافه میکنیم:
در این مرحله میتوانید URL زیر را اجرا کنید تا ببینید که مطابق انتظار کار میکند:
از سوی دیگر اگر میخواهید قالبهای ایمیل خود را به سرعت و بدون ارسال واقعی ایمیل تست کنید، شرایطی در لاراول تدارک دیده شده است که امکان لاگ کردن همه ایمیلهای خروجی را میدهد.
برای استفاده از این امکان باید مقدار MAIL_DRIVER را در فایل config/mail.php به log تنظیم کنید. سپس میتوانید URL فوقالذکر را اجرا کرده و فایل لاگ را بررسی کنید و ببینید که آیا قالب ایمیل در آنجا لاگ شده است یا نه.
اگر همه چیز به درستی پیش برود، باید ببینید که یک ایمیل در فایل storage/logs/laravel.log لاگ شده است. این همه آن چیزی است که در مورد قابلیت ایمیل در لاراول میتوان گفت و بدین ترتیب به انتهای این مقاله میرسیم.
در این مطلب به معرفی API ایمیل پرداختیم که از قابلیتهای داخلی لاراول است و از گستره متنوعی از درایورهای ارسال ایمیل نیز پشتیبانی میکند. ما کار خود را با توضیح مفاهیم مقدماتی آغاز کردیم و کلاس mailable را پیادهسازی کردیم که یک جزء ضروری در API ایمیل در لاراول است. در انتها کلاس mailable را نیز با ایجاد یک کنترلر سفارشی تست کردیم تا طرز کار عملی آن را مشاهده کنیم.
اگر یک برنامهنویس هستید و میخواهید شروع به استفاده از گیت روی گیتهاب بکنید، بهترین مقاله را برای مطالعه انتخاب کردهاید. شما پس از مطالعه این مقاله و آشنایی با روش ساخت مخزن گیت هاب و همچنین شیوه استفاده از آن قادر خواهید بود یک پروژه گیتهاب را ایجاد کرده و روی آن کار کنید.
گیت یک نرمافزار اوپن سورس است که در سال 2005 از سوی لینوس تروالدز ایجاد شده است. این ابزار یک «سیستم کنترل نسخه» (Version Control System) است که در ابتدا برای هماهنگ کار چند توسعهدهنده روی کرنل لینوکس ساخته شده بود. سیستمهای کنترل نسخه زیادی مانند CVS ،SVN ،Mercurial و غیره وجود دارند، اما گیت امروزه به یک نرمافزار استاندارد برای کنترل نسخه تبدیل شده است.
اگر به تازگی وارد دنیای برنامهنویسی شدهاید، این واژهها معنای خاصی برای شما نخواهند داشت. با این حال، جای نگرانی نیست، چون با مطالعه این پاراگرف کوتاه خواهید دانست که سیستم کنترل نسخه یا به اختصار VCS دقیقاً به چه معنا است؟
کنترل نسخه یک سیستم مدیریتی است و تغییرهایی که روی فایلها یا مجموعهای از فایلها (برای نمونه یک پروژه کدنویسی) ایجاد میشوند را ردگیری میکند. توسعهدهندگان با کمک چنین سیستمی، میتوانند با یکدیگر همکاری کنند و به صورت مشترک یک پروژه را جلو ببرند.
یک سیستم انشعاب از سوی کنترل نسخه اجرا میشود که به توسعهدهندگان کمک میکند تا به صورت انفرادی روی یک وظیفه کار کنند. برای نمونه یک شاخه برای یک وظیفه یا یک شاخه برای یک توسعهدهنده. در ادامه همه تغییرهای ایجاد شده از سوی تیم در شاخه اصلی ترکیب میشوند.
همه تغییرهای ایجاد شده از سوی توسعهدهندگان ردگیری و در «سابقه» (history) ذخیره میشوند. ردگیری این تغییرهای ایجاد شده از سوی هر یک از اعضای تیم میتواند سودمند باشد.

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

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

این تنها کار لازم است و شما اینک رسماً یکی از اعضای گیتهاب هستید.
اکنون باید ابزارهای گیت را روی رایانه خود نصب کنیم. نرمافزارهای گیت مختلفی وجود دارند؛ اما بهتر است کار خود را ابزارهای مقدماتی شروع کنیم. ما از خط فرمان برای ارتباط با گیتهاب استفاده میکنیم. زمانی که با خط فرمان احساس راحتی بیشتری کردید، میتوانید نرمافزار گیت را به همراه یک اینترفیس کاربری دانلود کنید.
ابتدا پکیجهای خود را بهروزرسانی کنید:
sudo apt update
سپس گیت را با دستور apt-get نصب کنید:
sudo apt-get install git
در نهایت بررسی کنید که گیت به درستی نصب شده است یا نه:
git –version
ابتدا آخرین نسخه گیت را برای مک (+) دانلود کنید. سپس دستورالعملهایی را که روی صفحه نمایش مییابد پیگیری کنید. در نهایت یک ترمینال باز کنید و تأیید کنید که گیت به طرز صحیحی نصب شده است:
git –version
ابتدا نسخه نصبی گیت را از این لینک (+) برای ویندوز دانلود کنید. سپس با پیگیری دستورالعملهای نمایش یافته روی صفحه آن را نصب کنید. در نهایت یک ترمینال برای مثال پاورشل یا git bash را باز کرده و بررسی کنید که گیت به درستی نصب شده باشد:
git –version
آخرین گامی که برای نصب صحیح لازم است این است که ترمینال را با دستورهای زیر اجرا و اطلاعات خود را وارد کنید تا یک نام کاربری و ایمیل پیشفرض در زمان ذخیرهسازی کارهای خود داشته باشید:
git config --global user.name "Gaël Thomas" $ git config --global user.email example@mail.com
اکنون که آماده هستید، میتوانید به صفحه اصلی گیتهاب بازگردید و روی آیکون بعلاوه (+) در نوار منو کلیک کنید. زمانی که روی این دکمه کلیک کنید، یک منوی جدید با مدخل «New repository» ظاهر میشود. روی آن کلیک کنید.

در این مرحله صفحه ایجاد ریپازیتوری ظاهر خواهد شد. یک نام مناسب برای نخستین ریپازیتوری خود انتخاب کنید و پیش از کلیک کردن روی دکمه Create repository یک توضیح کوتاه برای آن وارد کنید.
نکته: بر اساس این چارچوب این راهنما فعلاً نیازی به ساخت فایل Read Me نداریم و آن را در ادامه ایجاد خواهیم کرد. بنابراین در حال حاضر میتوانید گزینه Initialize this repository with a README را انتخاب نشده باقی بگذارید.

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

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

زمانی که آدرس ریپازیتوری را به دست آوردید، باید از ترمینال (از طریق دستورهای shell) برای جابجایی به مکانی که میخواهید کپی دایرکتوری را قرار دهید استفاده کنید. برای مثال میتوانید آن را به پوشه Documents انتقال دهید. زمانی که آماده بودید، دستور زیر را وارد کنید:
git clone [HTTPS ADDRESS]
این دستور یک کپی محلی از ریپازیتوری موجود در آدرس فوق ایجاد میکند.

اکنون این ریپازیتوری روی سیستم شما قرار دارد و باید با دستور زیر به مکان آن جابجا شوید:
cd [NAME OF REPOSITORY]
نکته: زمانی که یک ریپازیتوری را کلون میکنید، گیت یک ریپازیتوری روی رایانه شما ایجاد میکند. اگر دوست داشته باشید، میتوانید با رابط کاربری رایانه نیز به پروژه خود دسترسی داشته باشید.
اکنون میتوانید از طریق ترمینال یا رابط کاربری رایانه خود فایلی به نام «README.md» در پوشه پروژه ایجاد کنید. ما قصد نداریم در خصوص جزییات این مرحله به شما توضیح دهیم، چون موضوع خاصی وجود ندارد. کافی است پوشه را باز کنید و چنان که به طور معمول عمل میکنید، یک فایل در آن ایجاد کنید.
اگر میخواهید این کار را به روشی جالب انجام دهید، قالب ارائه شده در ادامه را در فایل README.md کپی کنید و اطلاعات را جایگزین نمایید تا یک خروجی شخصیسازیشده داشته باشید.
اینک که پروژه را اصلاحکردهاید باید آن را ذخیره کنید. این فرایند «کامیت» (Commit) کردن نام دارد. به این منظور باید به ترمینال بازگردید. اگر ترمینال را بستهاید باید به نشانی پوشه مراجعه کنید.
زمانی که میخواهید کارهای خود را ذخیره کنید، به چهار مرحله نیاز دارید. این مراحل به ترتیب status ،add ،commit و push نامیده میشوند. ما یک رویه استاندارد برای شما آماده کردهایم تا هر بار که میخواهید کارهایتان را ذخیره کنید مورد استفاده قرار دهید.
نکته: همه مراحل زیر باید درون پروژه اجرا شوند.
نخستین کاری که در زمان ذخیرهسازی کارهای خود باید انجام دهید، بررسی فایلهایی است که تغییر دادهاید. به این منظور میتوانید دستور زیر را وارد کید تا فهرستی از تغییرها ظاهر شود:
git status

به کمک فهرست تغییرها میتوانید همه فایلهایی را که میخواهید با دستور زیر آپلود کنید:
git add [FILENAME] [FILENAME] [...]
در این مورد قصد داریم فایل README.md را اضافه کنیم، زیرا مقصود ما ذخیرهسازی این فایل است.
git add README.md
نکته: اگر در این مرحله دوباره دستور git status را اجرا کنید، میبینید که این بار فایل RADME.md به رنگ سبز ظاهر میشود. این بدان معنی است که ما فایل را به درستی اضافه کردهایم.
اکنون که فایلهای منتخب خود را اضافه کردهایم، باید یک پیام بنویسیم و در آن کاری که انجام یافته را توضیح دهیم. این پیام بعدها در صورتی که بخواهیم سابقه تغییرها را بررسی کنیم مفید خواهد بود. مثالی از پیامی که میتوان نوشت به صورت زیر است:
git commit -m "Added README.md with good description in it."
بدین ترتیب به مرحله پایانی رسیدهایم، اینک میتوانیم کار خود را به صورت آنلاین منتشر کنیم. اگر دستور زیر را وارد کنید، همه تغییرهایی که اجرا کردهاید آنلاین میشوند و مستقیماً روی صفحه ریپازیتوری قابل مشاهده خواهند بود:
git push origin master
بدین ترتیب کار به پایان رسیده است. اگر به صفحه ریپازیتوری روی وبسایت گیتهاب بروید میتوانید فایل README.md را با پیشنمایش زیبایی مشاهده کنید.

شما به عنوان یک مبتدی در زمینه گیت باید با برخی دستورهای ضروری دیگر آن آشنا شوید. در ادامه فهرستی از دستورهایی را که در زمان کار روی پروژه مفید خواهند بود مشاهده میکنید.
نمایش سابقه کامیتها: با استفاده از دستور زیر میتوانید همه تغییرهایی را که روی پروژه اجرا شده است ملاحظه کنید:
git log
بازگردانی تغییرها: با استفاده از دستور زیر میتوانید تغییرهایی را که از زمان آخرین کامیت انجام یافتهاند، به حالت قبل بازگردانید.
git checkout.
بازگردانی تغییرات یک فایل: اگر میخواهید همه تغییرات یک فایل خاص را از زمان آخرین کامیت بازگردانید، میتوانید از دستور زیر استفاده کنید:
git checkout [FILENAME]
نمایش تغییرات فایل: برای نمایش تغییرهای یک فایل خاص از زمان آخرین کامیت از دستور زیر میتوان بهره گرفت:
git diff [FILENAME]
حذف فایلهای ناخواسته: برای حذف فایلهای ناخواسته (یعنی فایلهایی که کامیت نشدهاند) از پروژه میتوان از دستور زیر استفاده کرد:
git clean –dfx
افزودن همه فایلها: برای اضافه کردن همه فایلها و کامیت کردن آنها به صورت یکباره دستور زیر را اجرا کنید:
git commit -am [MESSAGE]
ب
منبع: فرادرس