<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیرحسین حسینعلی پور</title>
        <link>https://virgool.io/feed/@m_28240232</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-10 17:15:19</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>امیرحسین حسینعلی پور</title>
            <link>https://virgool.io/@m_28240232</link>
        </image>

                    <item>
                <title>زبان C</title>
                <link>https://virgool.io/@m_28240232/%D8%B2%D8%A8%D8%A7%D9%86-c-fo53yrrnl2bc</link>
                <description>با تشکر از استاد عزیزم مهندس یعقوبی تبار ،که در این پروژه بهم اطلاعات مکفی رو دادند(تغيير مسير از زبان برنامه‌نويسي C)پرش به: ناوبري, جستجوزبان برنامه‌نويسي C، زباني همه منظوره، ساخت يافته و روندگرا مي باشد که در سال ۱۹۷۲ توسط دنيس ريچي در آزمايشگاه بل ساخته شدتاريخچهبراي بررسي تاريخچه زبان C بايد به سال ۱۹۶۷ بازگرديم که مارتين ريچاردززبان BCPL را براي نوشتن نرم افزارهاي سيستم عامل و کامپايلر در دانشگاه کمبريج ابداع کرد. سپس در سال ۱۹۷۰ کن تامپسون زبان B را بر مبناي ويژگي‌هاي زبان BCPLنوشت و از آن براي ايجاد اولين نسخه هاي سيستم عامل يونيکس در آزمايشگاه‌هاي بلاستفاده کرد. زبان C در سال ۱۹۷۲ توسط دنيس ريچي از روي زبان Bو BCPL در آزمايشگاه بل ساخته شد و ويژگي‌هاي جديدي همچون نظارت بر نوع داده ها نيز به آن اضافه شد. ريچي از اين زبان براي ايجاد سيستم عامل يونيکس استفاده کرد اما بعدها اکثر سيستم عاملهاي ديگر نيز با همين زبان نوشته شدند. اين زبان با سرعت بسياري گسترش يافت و چاپ کتاب &quot;The C Programming Language&quot; در سال ۱۹۷۸ توسط کرنيگانو ريچي باعث رشد روزافزون اين زبان در جهان شد.متاسفانه استفاده گسترده اين زبان در انواع کامپيوترها و سخت افزارهاي مختلف باعث شد که نسخه‌هاي مختلفي از اين زبان بوجود آيد که با يکديگر ناسازگار بودند. در سال ۱۹۸۳ انستيتوي ملي استاندارد آمريکا (ANSI) کميته اي موسوم به X3J11 را را مأمور کرد تا يک تعريف فاقد ابهام و مستقل از ماشين را از اين زبان تدوين نمايد. در سال ۱۹۸۹ اين استاندارد تحت عنوان ANSI Cبه تصويب رسيد و سپس در سال ۱۹۹۰، سازمان استانداردهاي بين المللي (ISO) نيز اين استاندارد را پذيرفت و مستندات مشترک آنها تحت عنوان ANSI/ISO Cمنتشر گرديد.در سالهاي بعد و با ظهور روشهاي برنامه‌نويسي شئ‌گرا نسخه جديدي از زبان Cبنام C++ توسط بيارنه استراوستروپ در اوايل ۱۹۸۰ در آزمايشگاه بل توسعه يافت. در C++ علاوه بر امکانات جديدي که به زبان C اضافه شده است، خاصيت شئ‌گرايي را نيز به آن اضافه شده‌است.با گسترش شبکه و اينترنت، نياز به زباني احساس شد که برنامه‌هاي آن بتوانند برروي هر ماشين و هر سيستم عامل دلخواهي اجرا گردد. شرکت سان مايکروسيستمزدر سال ۱۹۹۵ ميلادي زبان جاوا را برمبناي Cو C++ ايجاد کرد که هم اکنون از آن در سطح وسيعي استفاده مي‌شود و برنامه هاي نوشته شده به آن برروي هر کامپيوتري که از چاوا پشتيباني کند (تقريباً تمام سيستم‌هاي شناخته شده) قابل اجرا مي‌باشد. شرکت مايکروسافت در رقابت با شرکت سان، در سال 2002 زبان جديدي بنام C# (سي شارپ) را ارائه داد که رقيبي براي Java بشمار مي‌رود.برنامه نويسي ساخت يافتهدر دهه ۱۹۶۰ ميلادي توسعه نرم‌افزار دچار مشکلات عديده‌اي شد. در آن زمان سبک خاصي براي برنامه نويسي وجود نداشت و برنامه‌ها بدون هيچگونه ساختار خاصي نوشته مي‌شدند. وجود دستور پرش(goto) نيز مشکلات بسياري را براي فهم و درک برنامه توسط افراد ديگر ايجاد مي‌کرد، چرا که جريان اجراي برنامه مرتبا دچار تغيير جهت شده و دنبال کردن آن دشوار مي‌گرديد. لذا نوشتن برنامه ها عملي بسيار زمان بر و پرهزينه شده بود و معمولاً اشکال زدايي، اعمال تغييرات و گسترش برنامه ها بسيار مشکل بود. فعاليتهاي پژوهشي در اين دهه باعث بوجود آمدن سبک جديدي از برنامه نويسي بنام روش ساخت‌يافتهگرديد؛ روش منظمي که باعث ايجاد برنامه‌هايي کاملاً واضح و خوانا گرديد که اشکال‌زدايي و خطايابيآنها نيز بسيار ساده‌تر بود.اصلي‌ترين نکته در اين روش عدم استفاده از دستور پرش (goto) است. تحقيقات بوهم و ژاکوپينينشان داد که مي‌توان هر برنامه اي را بدون دستور پرش و فقط با استفاده از ۳ ساختار کنترلي ترتيب، انتخابو تکرارنوشت.ساختار ترتيب، همان اجراي دستورات بصورت متوالي (يکي پس از ديگري) است که کليه زبانهاي برنامه نويسي در حالت عادي بهمان صورت عمل مي‌کنند.ساختار انتخاببه برنامه‌نويس اجازه مي‌دهد که براساس درستي يا نادرستي يک شرط، تصميم بگيرد کدام مجموعه از دستورات اجرا شود.ساختار تکرارنيز به برنامه نويسان اجازه مي‌دهد مجموعه خاصي از دستورات را تا زمانيکه شرط خاصي برقرار باشد، تکرار نمايد.هر برنامه ساخت‌يافته از تعدادي بلوک تشکيل مي‌شود که اين بلوکها به ترتيب اجرا مي‌شوند تا برنامه خاتمه يابد (ساختار ترتيب). هر بلوک مي‌تواند يک دستور ساده مانند خواندن، نوشتن يا تخصيص مقدار به يک متغير باشد و يا اينکه شامل دستوراتي باشد که يکي از ۳ ساختار فوق را پياده سازي کنند. نکته مهم اينجاست که درمورد دستورات داخل هر بلوک نيز همين قوانين برقرار است و اين دستورات مي‌توانند از تعدادي بلوک به شرح فوق ايجاد شوند و تشکيل ساختارهايي مانند حلقه‌هايتودرتو را دهند.نکته مهم اينجاست که طبق قوانين فوق يک حلقه تکرار يا بطور کامل داخل حلقه تکرار ديگر است و يا بطور کامل خارج آن قرار مي‌گيرد و هيچگاه حلقه هاي روي هم افتاده نخواهيم داشت.از جمله اولين تلاشها در زمينه ساخت زبانهاي برنامه نويسي ساخت‌يافته، زبان پاسکال بود که توسط پروفسور نيکلاس ويرثدر سال ۱۹۷۱ براي آموزش برنامه نويسي ساختيافته در محيطهاي آموزشي ساخته شد و بسرعت در دانشگاهها رواج يافت. اما بدليل نداشتن بسياري از ويژگيهاي مورد نياز مراکز صنعتي و تجاري در بيرون دانشگاهها موفقيتي نيافت.کمي‌بعد زبان C ارائه گرديد که علاوه بر دارا بودن ويژگيهاي برنامه نويسي ساختيافته بدليل سرعت و کارايي بالا مقبوليتي همه گير يافت و هم اکنون سالهاست که به‌عنوان بزرگ‌ترين زبان برنامه نويسي دنيا شناخته شده است.مراحل اجراي يک برنامه Cبراي اجراي يک برنامه C ابتدا بايد آن را نوشت. براي اينکار مي‌توان از هر ويرايشگر متنيموجود استفاده کرد و سپس فايل حاصل را با پسوند .Cذخيره نمود (فايلهاي C++ با پسوند.CPPذخيره مي‌گردند). به اين فايل، کد مبدأ(source code) گفته مي‌شود. مرحله بعدي تبديل کد مبدا به زبان ماشين است که به آن کد مقصد(object code) گفته مي‌شود. همانطورکه قبلا نيز گفته شد براي اينکار از يک برنامه مترجم بنام کامپايلر استفاده مي‌شود. کامپايلرهاي متعددي براي زبان C توسط شرکتهاي مختلف و براي سيستم عاملهاي مختلف نوشته شده است که مي‌توانيد برحسب نياز از هريک از آنها استفاده نماييد. اما هنوز برنامه براي اجرا آماده نيست. معمولاً برنامه نويسان از در برنامه هاي خود از يک سري از کدهاي از پيش آماده شده براي انجام عمليات متداول (مانند محاسبه جذر و يا سينوس) استفاده مي‌کنند که برنامه آنها قبلا نوشته و ترجمه شده است. اين برنامه ها يا در قالب کتابخانه‌هاي استاندارد توسط شرکتهاي ارائه کننده نرم افزار عرضه شده است و يا توسط ديگر همکاران برنامه نويس اصلي نوشته و در اختيار وي قرار داده شده است. در اين مرحله بايد کد مقصد برنامه اصلي با کدهاي مربوط به اين برنامه هاي کمکي پيوند زده‌شود. براي اينکار نياز به يک پيوند‌زننده(Linker) داريم و نتيجه اين عمل يک فايل قابل اجرا خواهد بود (در سيستم عامل ويندوز اين فايل پسوند .EXEخواهد داشت). مرحله بعدي اجراي برنامه و دادن وروديهاي لازم به آن و اخذ خروجيها مي‌باشد. در شکل زير اين مراحل نشان داده شده اند.?يک برنامه ساده با ورودي و خروجيمسلما طي مراحل بالا براي اجراي هر برنامه زمانبر مي‌باشد، بهمين دليل اکثر توليد کنندگان کامپايلرها، محيطهايي را براي برنامه نويسي ارائه کرده اند که کليه مراحل بالا را بطور اتوماتيک انجام مي‌دهند.به اين محيطها IDE (Integrated Development Environment) يا محيط مجتمع توسعه نرم‌افزار گفته مي‌شود. اين محيطها داراي يک ويرايشگر متن مي‌باشند که معمولاً داراي خواص جالبي همچون استفاده از رنگهاي مختلف براي نشان دادن اجزاي مختلف برنامه مانند کلمات کليديو قابليت تکميل اتوماتيک قسمت‌هاي مختلف برنامه مي‌باشد. پس از نوشتن برنامه و با انتخاب گزينه اي مانند Run کليه عمليات فوق بطور اتوماتيک انجام شده و برنامه اجرا مي‌گردد. علاوه براين، اين محيطها معمولاً داراي امكانات اشكالزدايي برنامه (Debug) نيز مي باشند كه شامل مواردي همچون اجراي خط به خط برنامه و يا ديدن محتويات متغيرها در زمان اجرا است. چند محيط معروف برنامه نويسي عبارت‌اند از :Borland C++ 3.1     براي محيط DOSBorland C++      از نسخه 4 به بالا براي WindowsMicrosoft Visual C++      براي محيط WindowsBorland C++ Builder     براي محيط Windowsخطاهاي برنامه نويسيبنظر مي‌رسد خطاها جزء جداناپذير برنامه ها هستند. بندرت مي‌توان برنامه اي نوشت که در همان بار اول بدرستي و بدون هيچگونه خطايي اجرا شود. اما خطاها از لحاظ تأثيري که بر اجراي برنامه ها مي‌گذارند، متفاوتند. گروهي ممکن است باعث شوند که از همان ابتدا برنامه اصلاً کامپايل نشود و گروه ديگر ممکن است پس از گذشت مدتها و در اثر دادن يک ورودي خاص به برنامه، باعث يک خروجي نامناسب و يا يک رفتار دور از انتظار (مانند قفل شدنبرنامه) شوند. بطور کلي خطاها به دو دسته تقسيم مي‌شوند:1. خطاهاي نحوي (خطاهاي زمان کامپايل): اين خطاها در اثر رعايت نکردن قواعد دستورات زبان Cو يا تايپ اشتباه يک دستور بوجود مي‌آيند و در همان ابتدا توسط کامپايلر به برنامه نويس اعلام مي‌گردد. برنامه نويس بايد اين خطا را رفع کرده و سپس برنامه را مجدداً کامپايل نمايد. لذا معمولاً اين قبيل خطاها خطر کمتري را در بردارند.2. خطاهاي منطقي (خطاهاي زمان اجرا): اين دسته خطاها در اثر اشتباه برنامه نويس در طراحي الگوريتم درست براي برنامه و يا گاهي در اثر درنظر نگرفتن بعضي شرايط خاص در برنامه ايجاد مي‌شوند. متأسفانه اين دسته خطاها در زمان کامپايل اعلام نمي‌شوند و در زمان اجراي برنامه خود را نشان مي‌دهند. بنابراين، اين خود برنامه‌نويس است که پس از نوشتن برنامه بايد آن را تست کرده و خطاهاي منطقي آن را پيدا کرده و رفع نمايد. متاسفانه ممکن است يک برنامه‌نويس خطاي منطقي برنامه خود را تشخيص ندهد و اين خطا پس از مدتها و تحت يک شرايط خاص توسط کاربر برنامه کشف شود. بهمين دليل اين دسته از خطاها خطرناکتر هستند. خود اين خطاها به دو دسته تقسيم مي‌گردند:1. خطاهاي مهلک: در اين دسته خطاها کامپيوتر بلافاصله اجراي برنامه را متوقف کرده و خطا را به کاربر گزارش مي‌کند. مثال معروف اين خطاها خطاي تقسيم بر صفر مي‌باشد.2. خطاهاي غيرمهلک: در اين دسته خطا،d. اجراي برنامه ادامه مي‌يابد ولي برنامه نتايج اشتباه توليد مي‌نمايد. به‌عنوان مثال ممکن است دراثر وجود يک خطاي منطقي در يک برنامه حقوق و دستمزد،e. حقوق کارمندان اشتباه محاسبه شود و تا مدتها نيز کسي متوجه اين خطا نشود!با توجه به آنچه گفته شد، در مي‌يابيم که رفع اشکال برنامه ها بخصوص خطاهاي منطقي از مهم‌ترين و مشکلترين وظايف يک برنامه نويس بوده و گاهي حتي سخت‌تر از خود برنامه‌نويسي است! بهمين دليل است که بسياري از شرکتها(همانند مايکروسافت) ابتدا نسخه‌ي اوليه نرم‌افزار خود را در اختيار کاربران قرار مي‌دهند تا اشکالات آن گزارش شده و رفع گردد. بسيار مهم است که در ابتدا سعي کنيد برنامه‌اي بنويسيد که حداقل خطاها را داشته باشد، در گام دوم با آزمايش دقيق برنامه خود هرگونه خطاي احتمالي را پيدا کنيد و در گام سوم بتوانيد دليل بروز خطا را پيدا کرده و آنرا رفع نماييد. هر سه عمل فوق کار سختي بوده و نياز به تجربه و مهارت دارد.آخرين نکته اينکه در اصطلاح برنامه نويسي به هرگونه خطا، bugو به رفع خطا debug گفته مي‌شود.يك برنامه نمونهدر اين قسمت براي آشنايي اوليه با زبان C يك برنامه نمونه آورده شده است كه بدون هيچ تغييري در محيط BorlandCPPقابل اجرا است.‎// This Program Computes the Area of a Circle#include &lt;stdio.h&gt;void main(void) {int radius;float area;printf( &quot;please enter radius : &quot; );scanf( &quot;%d&quot;, &amp;radius );area = 2 * 3.14 * radius;printf( &quot;Area is %f \n&quot;, area );return();}please enter radius : 10Area is 62.8درمورد برنامه فوق به نکات زير توجه کنيد:خط اول يک توضيح درمورد برنامه است. در زبان C براي توضيحات      يک خطي از علامت // استفاده مي‌گردد. اما چنانچه توضيحات بيش از يک خط بود،      آن را با علامت /* شروع کرده و با */ پايان دهيد. کامپايلر از اين توضيحات      صرفنظر خواهد کرد. اين توضيحات باعث مي‌شوند که برنامه شما خواناتر شده و ديگران      بهتر آن را درک کنند.هر دستوري که با علامت # شروع شود، يک دستور C نيست،      بلکه جزو دستورات      پيش پردازنده محسوب مي‌گردد. دستورات پيش پردازنده دستوراتي هستند      که توسط کامپايلر قبل از شروع به کامپايل انجام مي‌شوند. به‌عنوان مثال دستور      #include     باعث مي‌شود که تعاريف اوليه مربوط به توابعي (زيربرنامه هايي) که قصد      استفاده از آنها را داريم به برنامه اضافه شود. در مثال بالا براي استفاده از      توابع printf و scanf که در کتابخانه استاندارد C تعريف شده‌اند،      فايل سرآمد stdio.h را که اين توابع در آن تعريف شده‌اند را استفاده کرده‌ايم.هر برنامه C بايد داراي تابعي به نام main باشد که      اجراي برنامه از آن شروع مي‌شود و در حقيقت همان برنامه اصلي است. البته مي‌توان      هر تعداد ديگري تابع (زيربرنامه)      نيز تعريف کرد، اما وجود تابع main الزامي است. دقت کنيد که      گرچه اين تابع پارامتر ورودي ندارد،      اما از پرانتز باز و بسته تنها استفاده شده است.در اين برنامه چون تابع main داراي      ورودي و خروجي نمي باشد قبل از اين تابع و نيز در داخل پرانتز main از کلمه void استفاده مي      شود.در زبان C هر بلوک برنامه با علامت { آغاز شده و با } پايان مي‌يابد. اين      دو معادل دستورات begin و end در زبانهاي      ديگر ازجمله پاسکال مي‌باشند که براي      سادگي زبان انتخاب شده اند.دو خط بعدي به تعريف متغيرهاي radius و area مي‌پردازد.      در زبان C قبل از استفاده از هر متغيري بايد آن را اعلان نماييد. اعلان      متغير شامل نام و نوع متغير است. در مثال فوق، متغير radius از نوع عدد صحيح (integer) و      متغير area از نوع عدد اعشاري     (float)      تعريف شده‌اند.توابع printf و scanf جزو کتابخانه استاندارد C محسوب مي‌گردند      و به ترتيب براي چاپ اطلاعات در خروجي استاندارد (نمايشگر) و دريافت      اطلاعات از ورودي استاندارد (صفحه کليد) استفاده      مي‌شوند. براي چاپ رشته مورد نظر بايد آنها را در داخل علامت &quot; قرار      داد.دقت کنيد که در پايان هر دستورالعمل از علامت ; استفاده شده است. در      مجموع C يک زبان قالب آزاد است و شما مي‌توانيد      دستورات را به هر نحوي که دوست داريد قرار دهيد (مثلاً چند دستور در يک خط از      برنامه). تنها چيزي که نشان‌دهنده پايان يک دستور است، علامت ; است (و      نه انتهاي خط).از آنجا که C يک زبان قالب آزاد است، مي‌توان با استفاده از      مکان نوشتن دستورات شکل بهتري به برنامه داد. به‌عنوان مثال دقت کنيد که پس      از شروع تابع main، دستورات حدود ۳ کاراکتر جلوتر نوشته شده‌اند.      به اين نحوه نوشتن دستورات، دندانه‌گذاري     مي‌گويند. بطور کلي هربار که بلوک جديدي آغاز مي‌شود، بايد آن را کمي‌جلوتر      برد. اين مسئله باعث جدا شدن بلوکها از يکديگر و خوانايي بهتر برنامه مي‌شود.در پايان برنامه و در داخل مستطيل خاکستري، يک نمونه از اجراي برنامه که      شامل يک ورودي و خروجي نمونه است، آورده شده است.ب م م (و ک م م) بازگشتي#include #include int m(int,int);int main(){clrscr();int x,y,z;cin&gt;&gt;x&gt;&gt;y;z=m(x,y);cout&lt;&lt;&quot;BMM: &quot;&lt;&lt;Z&lt;&lt;ENDL&lt;&lt;&quot;KMM: z;حل 2 معادله 2 مجهول بروش ماتريس معکوسابتدا درايه هاي ماتريس اول (ضريب متغيرها) را وارد کنيد سپس اعداد بعد از مساوي #include #include int main(){clrscr();int m[2][2];float m2[2][2];int r[2];int i,j,p;cout&lt;&lt;&quot;enter 4 num &quot;;for(i=0;i&lt;2;i++)for(j=0;j&lt;2;j++){cin&gt;&gt;m[i][j];m2[i][j]=m[i][j];}cout&lt;&lt;&quot;enter 2 num &quot;;cin&gt;&gt;r[0]&gt;&gt;r[1];int t;t= ( m[0][0] * m[1][1] ) - ( m[0][1] * m[1][0] );p=m2[0][0];m2[0][0]=m2[1][1];m2[1][1]=p;m2[0][1]*=-1;m2[1][0]*=-1;for(i=0;i&lt;2;i++)for(j=0;j&lt;2;j++)m2[i][j]/=t;float x,y;x = ( m2[0][0] * r[0] ) + ( m2[0][1] * r[1] );y = ( m2[1][0] * r[0] ) + ( m2[1][1] * r[1] );cout&lt;&lt;&quot;x = &quot;&lt;&lt;X&lt;&lt;&quot; mailto:alireza2habibi@yahoo.com? y=&quot;&lt;&lt;Y;getch();return 0;}حل معادله نيوتن رافسون#include #include #includevoid main(void) {float h,x1,f,f1,g,a,b,x;  int i,conter;top: clrscr();      printf(&quot; \n******************************in file**************************&quot;);      printf(&quot;\ninput [a,b]&quot;);      printf(&quot;\ninput a=&quot;);      scanf(&quot;\n%f&quot;,&amp;a);      printf(&quot;input b=&quot;);      scanf(&quot;\n%f&quot;,&amp;b);      printf(&quot;\nbaseh f(x)=&gt;    [%f,%f]&quot;,a,b);      x=a;/****************   f(x)   ****************/      f=x*pow(2,x)-1;      g=x*x*2;/*******************************************/      printf(&quot;\nf(a)=%f&quot;,f);      x=b;/*****************   f(x)   ***************/      f1=x*pow(2,x)-1;/*******************************************/      printf(&quot;\nf(b)=%f&quot;,f1);      if ((f1*f)&lt;0)        printf(&quot;\nIF ONE TRUE&quot;);      else       {   printf(&quot;\n IF ONE FALSE --F(a)F(B)&lt;0--&quot;);   goto top;       }//****************************************************************      printf(&quot;\ninput x1:=&quot;);      scanf(&quot;%f&quot;,&amp;x1);      printf(&quot;\nnumber repeter :=&quot;);      scanf(&quot;%d&quot;,&amp;conter);      printf(&quot;\n************************out file****************************&quot;);for(i=1;i&lt;=conter;i++)    {        h=x1-(f/g);        printf(&quot;\n%f &quot;,h);        x1=h;    }getch();}ان مين اعداد اول====ان مين عدد اول ====#include&lt;iostream.h&gt;#include&lt;conio.h&gt;void main(){ int z=1,n,k,p,f,i,s=0,sum=0; textattr(0x1d); clrscr(); cout&lt;&lt;&quot;enter a number: &quot;; cin&gt;&gt;n; if(n==1){ gotoxy(3,4);  cout&lt;&lt;&quot; 1 adad avval nist ! \n&quot; ;}  p=2;  while (z&lt;=n)  {    s-=s;    for(i=1;i&lt;=(p/2);i++)     {      k=p%i;      if(k==0) s++;     }    if(s==1)     {    cout&lt;&lt;p&lt;&lt;&quot;\n&quot;;    z++;  }p++;} cout&lt;&lt;n&lt;&lt;&quot; min adad avval :&quot;&lt;&lt;p-1; getch();}</description>
                <category>امیرحسین حسینعلی پور</category>
                <author>امیرحسین حسینعلی پور</author>
                <pubDate>Fri, 11 Jun 2021 10:22:03 +0430</pubDate>
            </item>
                    <item>
                <title>کنترل زاویه استپر موتور با میکروکنترلر avr</title>
                <link>https://virgool.io/@m_28240232/%DA%A9%D9%86%D8%AA%D8%B1%D9%84-%D8%B2%D8%A7%D9%88%DB%8C%D9%87-%D8%A7%D8%B3%D8%AA%D9%BE%D8%B1-%D9%85%D9%88%D8%AA%D9%88%D8%B1-%D8%A8%D8%A7-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%DA%A9%D9%86%D8%AA%D8%B1%D9%84%D8%B1-avr-bdqqm3pgfdrf</link>
                <description>(کنترل زاویه استپر موتور با میکرو کنترلر(AVRدانشجو:امیرحسین حسینعلی پوراستاد محترم : جناب مهندس یعقوبی تبارخرداد 1400مقدمه:میکروکنترلرها تراشه های قابل برنامه ریزی هستند که به عنوان قلب تپنده و مدیر یک برد محسوب می شود به طوری که ما در برد الکترونیکی با برنامه نویسی به ان فرمان های مورد نیاز را منتقل می نماییم تا میکروپروسسور عملیات مورد نظر را پردازش و انجام دهد.برخی از توانایی های این محصول عبارتند از :کنترل کیبوردها حسگرهای مختلف صفحات نمایشی و مدیریت ونگهداری اطلاعات و..... میکروکنترلر AVR ساخته شده شرکت ATMEL می باشد که در دنیا بسیار مورد توجه قرار گرفته است. نسل های قبلی که به میکروکنترلر  های سری 80 معروفند امروزه جای خود را به این خانواده پرکاربرد در محصولات الکترونیکی داده اند . در طراحی های روز الکترونیک دیگر کمتر دیده می شود که در دل خود این قطعه کنترلی پر قدرت را جای نداده باشد.خانواده AVR به سه سری زیر تقسیم می شوند::AT90S سری.1این سری اعضای کلاسیک خانواده AVR را تشکیل می دهند و قابلیت های کمتری نسبت به دو سری دیگر دارند و کمتر استفاده می شوند.:ATtiny سری.2این میکروکنترها در ابعاد کوچک 8 و20 و28 پایه هستند و قابلیت خوبی نسبت به سری اول دارند و بیشتر در سیستم هایی که نیاز به پورت بالا نیست استفاده می شوند. یکی از اعضای 8 پایه این سری ATtiny85است که دارای امکانات خوبی از جمله مبدل ADC می باشد.:ATmega سری.3این سری از میکروکنترلرهای AVR امکانات بیشوتری نسبت به دو سری قبلی دارند و توجه مخاطبان را به خود جلب نموده اند.چکیده:در این پروژه ما به وسیله ی میکروکنترلر AVR(ATmega16A) , ماژول l298n , استپر موتور , lcd و push button سیستمی طراحی نموده ایم که میتوان با ان زاویه استپر موتور را تغییر داد.: ATmega16  معرفیATmega16میکروکنترلر Atmega16 یک میکروکنترلر پرکاربرد در بازار است و در پروژه های زیادی استفاده می شود. بیشترین استفاده این میکروکنترلر در پکیج PDIPاست که همانند Atmega32 دارای ۴۰ پین و ۳۲ پین ورودی و خروجی دارد .این میکروکنترلر AVR در پکیج ۴۴ پایه TQFP نیز برای مصارف SMD یافت می شود .میکرو کنترلر Atmega16A یکی از سری های Atmega16 می باشد. پسوند A دارای این معنی است که این میکرو بر خلاف Atmega16 که از ولتاژ ۴٫۵ تا ۵٫۵ ولت می تواند کار نماید همانند سری L می تواند با ولتاژ ۲٫۷۵ تا ۵٫۵ ولت کار کند اما بر خلاف سری L که دارای ماکزیمم فرکانس هارانتی شده ۸ مگاهرتز است  Atmega16Aهمانند   Atmega16می تواند دارای منبع کلاک تا سرعت ۱۶  MHzباشد.ویژگی های میکروکنترلر : Atmega16A• پایداری بالا• مصرف توان کم• میکروکنترلر ۸ بیتیAtmel• معماری RISC پیشرفته ۱۳۱ دستورالعمل قدرتمند اجرای اغلب دستورالعمل ها در یک کلاک ۳۲ رجیستر ۸ بیتی با کاربرد عمومی بیش از ۱۶ میلیون دستورالعمل بر ثانیه (MIPS)با کلاک ۱۶ مگاهرتز( MHz)• ۱۶ کیلوبایت حافظه فلش قابل برنامه ریزیEEPROMبایت ۵۱۲ • ۱ کیلوبایتSRAM• قابلیت برنامه ریزی حافظه فلش تا ۱۰٫۰۰۰ بار و حافظه ی EEPROM تا ۱۰۰٫۰۰۰ بار• ماندگاری برنامه تا ۲۰ سال در دمای ۸۵ درجه و ۱۰۰ سال در دمای ۲۵ درجه سانتی گراد• دارای قفل برنامه برای حفاظت از نرم افزار• رابط JTAG مطابق استاندارد1149.1IEEE• دارای ۲ تایمر ۸ بیتی• دارای یک تایمر ۱۶ بیتی• دارای RTC با اسیلاتور مجزا• ۴ کانالPWM• ۸ کانال ADC ده بیتیTWIیا TWO WIRE رابط سریال   USART Master/Slaveدر حالت SPI رابط سریال • دارای تایمر دیده بان با اسیلاتور مجزای داخلی• مقایسه هر انالوگ داخلی• دارای اسلاتور RC کالیبره شده داخلی• ۳۲ پورت ورودی و خروجی• ولتاژ تغذیه ۲٫۷۵ تا ۵٫۵ ولت• پشتبانی از فرکانس ۰ تا ۱۶ مگاهرتز• مصرف انرژی در فرکانس ۱ مگاهرتز ولتاژ ۳ ولت ودمای ۲۵ درجه : فعال : ۰٫۶ میلی امپر – حالت بیکاری: ۰٫۲ میلی امپر – حالت Power Down کمتر از ۱ میکرو امپرمعرفی استپر موتور:استپ موتورها   موتورهای DC هستند که در مراحل هسسته ای حرکت می کنند. آنها دارای چند سیم پیچ هستند که در هروه هایی به نام &quot;فاز &quot;سازماندهی می شوند. با انرژی هر فاز به ترتیب ، موتور چرخش می یابد ،یک قدم در یک زمان .با یک پله کنترل شده کامپیوتر می توانید موقعیت یابی دقیق و یا کنترل سرعت را بدست اورید. به همین دلیل ، موتورهای استپر موتور انتخاب بسیاری از پروژه های کنترل حرکات دقیق هستند .مدلسازی ساده از استپ موتورشکل بالا مدلسازی ساده استپ موتور میباشد.با کنترل کردن کویل ها و ترتیب فعال شدن هرکدام از انها میتوانیم زاویه شفت را تغییر دهیم.با توجه به مدل موتور ما در این پروژه هام شفت استپ موتور 45 درجه میباشد.در این پروژه پایه های c0,c1,c2,c3 به درایو متصل میشوند و فرمان فعال یا غیر فعال بودن هر کویل را از میکرو دریافت کرده و به موتور میرسانند.معرفی درایوl298n :ماژول راه اندازL298 ، جهت راه اندازی موتورهای DC ، با استفاده از میکروکنترلر می توانید سرعت و جهت حرکت موتور را کنترل کنید. این درایور توانایی کنترل همزمان 2 موتور DC را دارد.از این ماژول می توان جهت راه اندازی دو موتور DCیا یک موتور پله ای Stepper Motorاستفاده کرد.حداکثر ولتاژ قابل اعمال به موتور: 50 ولت حداکثر جریان مجاز خروجی ها: 2 امپر برای هر کانال دارای دو کانال خروجی برای دو موتور DCمعرفی درایو استفاده شده در پروتئوس:CURRENT SENSING A : 1 پیناز این پایه جهت کنترل جریان موتور A استفاده می هردد. همچنین می توان این پایه را به صورت مستقیم به خط منفی مدار GND اتصال داد که در این صورت کنترلی بر روی جریان وجود نداردOUTPUT 1 : 2 پیناین پایه به یکی از ترمینالهای موتور Aمتصل می هرددOUTPUT 2 : 3 پیناین پین به ترمینال دیگر موتور A متصل شدهSUPPLY VOLTAGE (VS( : 4 پینبه پایه باید ولتاژ مورد نظر خود جهت اعمال به موتورها را متصل نمایید. این ولتاژ با توجه به موتورهای مورد استفاده شما حداکثر تا 46 ولت می تواند افزایش یابد. برای ساخت رباتهای کوچک به طور معمول بین 6 تا 12 ولت استTTL Compatible Inputs 1 to drive Motor A INPUT 1 : 5 پیناین پایه باید به صفر یا پنج ولت متصل هردد که همراه با پین 7 می توانند جهت هردش موتور را مشخص نمایندTTL Compatible Enable Input for Motor A ENABLE A : 6 پیناین پایه جهت روشن و خاموش کردن موتور Aو در بیشتر مواقع جهت اعمال فرکانس PWMبه موتور استفاده می هردد. پنج ولت موتور را روشن و صفر موتور را خاموش می کندTTL Compatible Inputs 2 to drive Motor A INPUT 2 : 7 پیناین پایه باید به صفر یا پنج ولت متصل هردد که همراه با پین 5 می توانند جهت هردش موتور را مشخص نمایندGND : 8 پیناتصال به خط منفی مدار GNDLOGIC SUPPLY VOLTAGE (VSS( : 9 پیناتصال به 5 تا 7 ولتTTL Compatible Inputs 1 to drive Motor B INPUT 3 : 10 پیناین پایه باید به صفر یا پنج ولت متصل هردد که همراه با پین 12 می توانند جهت هردش موتور Bرا مشخص نمایندTTL Compatible Enable Input for Motor B ENABLE B : 11 پیناین پایه جهت روشن و خاموش کردن موتور Bو در بیشتر مواقع جهت اعمل فرکانس PWMبه موتور استفاده می هردد. پنج ولت موتور را روشن و صفر موتور را خاموش می کندTTL Compatible Inputs 2 to drive Motor B INPUT 4 : 12 پیناین پایه باید به صفر یا پنج ولت متصل هردد که همراه با پین 10 می توانند جهت هردش موتور Bرا مشخص نمایندOUTPUT 3 : 13 پیناین پایه به یکی از ترمینالهای موتور Bمتصل میگرددپین 14 : OUTPUT 4این پین به ترمینال دیگر موتور Bمتصل می گرددCURRENT SENSING B : 15 پیناز این پایه جهت کنترل جریان موتور B استفاده می هردد. همچنین می توان این پایه را به صورت مستقیم به خط منفی مدار GNDاتصال داد که در این صورت کنترلی بر روی جریان وجود ندارد.تنظیمات کدویرازد:در محیط کدویزارد PORTB را به LCD اختصاص میدهیم و LCD16*2 را انتخاب میکنیم.چهار بیت کم ارزش PORTA را خروجی میکنیم و PIN6 وPIN7 از پورت D را ورودی میکنیم و درحالت PULL UP قرار میدهیم.برنامه نویسی در محیط کدویژن:#include &lt;mega16a.h&gt;#include &lt;io.h&gt;#include &lt;stdlib.h&gt;#include &lt;delay.h&gt;#define STEPPER_PORT PORTA#define SET PIND.6#define OK PIND.7// Alphanumeric LCD functions#include &lt;alcd.h&gt;// Declare your global variables here const unsigned char StepCodes[]={0b0011, 0b0010, 0b0110 ,0b0100 ,0b1100 ,0b1000 ,0b1001 ,0b0001};unsigned char Step = 0;void main(void){ int i;char str[4];// Input/Output Ports initialization// Port A initialization// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=OutDDRA=(0&lt;&lt;DDA7) | (0&lt;&lt;DDA6) | (0&lt;&lt;DDA5) | (0&lt;&lt;DDA4) | (1&lt;&lt;DDA3) | (1&lt;&lt;DDA2) | (1&lt;&lt;DDA1) | (1&lt;&lt;DDA0);// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=0 Bit2=0 Bit1=0 Bit0=0PORTA=(0&lt;&lt;PORTA7) | (0&lt;&lt;PORTA6) | (0&lt;&lt;PORTA5) | (0&lt;&lt;PORTA4) |(0&lt;&lt;PORTA3) | (0&lt;&lt;PORTA2) | (0&lt;&lt;PORTA1) | (0&lt;&lt;PORTA0);// Port B initialization// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=InDDRB=(0&lt;&lt;DDB7) | (0&lt;&lt;DDB6) | (0&lt;&lt;DDB5) | (0&lt;&lt;DDB4) | (0&lt;&lt;DDB3) | (0&lt;&lt;DDB2) | (0&lt;&lt;DDB1) | (0&lt;&lt;DDB0);// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=TPORTB=(0&lt;&lt;PORTB7) | (0&lt;&lt;PORTB6) | (0&lt;&lt;PORTB5) | (0&lt;&lt;PORTB4) |(0&lt;&lt;PORTB3) | (0&lt;&lt;PORTB2) | (0&lt;&lt;PORTB1) | (0&lt;&lt;PORTB0);// Port C initialization// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=InDDRC=(0&lt;&lt;DDC7) | (0&lt;&lt;DDC6) | (0&lt;&lt;DDC5) | (0&lt;&lt;DDC4) | (0&lt;&lt;DDC3) |(0&lt;&lt;DDC2) | (0&lt;&lt;DDC1) | (0&lt;&lt;DDC0);// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=TPORTC=(0&lt;&lt;PORTC7) | (0&lt;&lt;PORTC6) | (0&lt;&lt;PORTC5) | (0&lt;&lt;PORTC4) |(0&lt;&lt;PORTC3) | (0&lt;&lt;PORTC2) | (0&lt;&lt;PORTC1) | (0&lt;&lt;PORTC0);// Port D initialization// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=InDDRD=(0&lt;&lt;DDD7) | (0&lt;&lt;DDD6) | (0&lt;&lt;DDD5) | (0&lt;&lt;DDD4) | (0&lt;&lt;DDD3) | (0&lt;&lt;DDD2) | (0&lt;&lt;DDD1) | (0&lt;&lt;DDD0);// State: Bit7=P Bit6=P Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=TPORTD=(1&lt;&lt;PORTD7) | (1&lt;&lt;PORTD6) | (0&lt;&lt;PORTD5) | (0&lt;&lt;PORTD4) |(0&lt;&lt;PORTD3) | (0&lt;&lt;PORTD2) | (0&lt;&lt;PORTD1) | (0&lt;&lt;PORTD0);// Timer/Counter 0 initialization// Clock source: System Clock// Clock value: Timer 0 Stopped// Mode: Normal top=0xFF// OC0 output: DisconnectedTCCR0=(0&lt;&lt;WGM00) | (0&lt;&lt;COM01) | (0&lt;&lt;COM00) | (0&lt;&lt;WGM01) | (0&lt;&lt;CS02) | (0&lt;&lt;CS01) | (0&lt;&lt;CS00);TCNT0=0x00;OCR0=0x00;// Timer/Counter 1 initialization// Clock source: System Clock// Clock value: Timer1 Stopped// Mode: Normal top=0xFFFF// OC1A output: Disconnected// OC1B output: Disconnected// Noise Canceler: Off// Input Capture on Falling Edge// Timer1 Overflow Interrupt: Off// Input Capture Interrupt: Off// Compare A Match Interrupt: Off// Compare B Match Interrupt: OffTCCR1A=(0&lt;&lt;COM1A1) | (0&lt;&lt;COM1A0) | (0&lt;&lt;COM1B1) | (0&lt;&lt;COM1B0) | (0&lt;&lt;WGM11) | (0&lt;&lt;WGM10);TCCR1B=(0&lt;&lt;ICNC1) | (0&lt;&lt;ICES1) | (0&lt;&lt;WGM13) | (0&lt;&lt;WGM12) | (0&lt;&lt;CS12) | (0&lt;&lt;CS11) | (0&lt;&lt;CS10);TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00;// Timer/Counter 2 initialization// Clock source: System Clock// Clock value: Timer2 Stopped// Mode: Normal top=0xFF// OC2 output: DisconnectedASSR=0&lt;&lt;AS2;TCCR2=(0&lt;&lt;PWM2) | (0&lt;&lt;COM21) | (0&lt;&lt;COM20) | (0&lt;&lt;CTC2) |(0&lt;&lt;CS22) | (0&lt;&lt;CS21) | (0&lt;&lt;CS20);TCNT2=0x00;OCR2=0x00;// Timer(s)/Counter(s) Interrupt(s) initializationTIMSK=(0&lt;&lt;OCIE2) | (0&lt;&lt;TOIE2) | (0&lt;&lt;TICIE1) | (0&lt;&lt;OCIE1A) |(0&lt;&lt;OCIE1B) | (0&lt;&lt;TOIE1) | (0&lt;&lt;OCIE0) | (0&lt;&lt;TOIE0);// External Interrupt(s) initialization// INT0: Off// INT1: Off// INT2: OffMCUCR=(0&lt;&lt;ISC11) | (0&lt;&lt;ISC10) | (0&lt;&lt;ISC01) | (0&lt;&lt;ISC00);MCUCSR=(0&lt;&lt;ISC2);// USART initialization// USART disabledUCSRB=(0&lt;&lt;RXCIE) | (0&lt;&lt;TXCIE) | (0&lt;&lt;UDRIE) | (0&lt;&lt;RXEN) |(0&lt;&lt;TXEN) | (0&lt;&lt;UCSZ2) | (0&lt;&lt;RXB8) | (0&lt;&lt;TXB8);// Analog Comparator initialization// Analog Comparator: Off// The Analog Comparator&#x27;s positive input is// connected to the AIN0 pin// The Analog Comparator&#x27;s negative input is// connected to the AIN1 pinACSR=(1&lt;&lt;ACD) | (0&lt;&lt;ACBG) | (0&lt;&lt;ACO) | (0&lt;&lt;ACI) | (0&lt;&lt;ACIE) |(0&lt;&lt;ACIC) | (0&lt;&lt;ACIS1) | (0&lt;&lt;ACIS0);SFIOR=(0&lt;&lt;ACME);// ADC initialization// ADC disabledADCSRA=(0&lt;&lt;ADEN) | (0&lt;&lt;ADSC) | (0&lt;&lt;ADATE) | (0&lt;&lt;ADIF) |(0&lt;&lt;ADIE) | (0&lt;&lt;ADPS2) | (0&lt;&lt;ADPS1) | (0&lt;&lt;ADPS0);// SPI initialization// SPI disabledSPCR=(0&lt;&lt;SPIE) | (0&lt;&lt;SPE) | (0&lt;&lt;DORD) | (0&lt;&lt;MSTR) | (0&lt;&lt;CPOL) | (0&lt;&lt;CPHA) | (0&lt;&lt;SPR1) | (0&lt;&lt;SPR0);// TWI initialization// TWI disabledTWCR=(0&lt;&lt;TWEA) | (0&lt;&lt;TWSTA) | (0&lt;&lt;TWSTO) | (0&lt;&lt;TWEN) | (0&lt;&lt;TWIE);// Alphanumeric LCD initialization// Connections are specified in the// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:// RS - PORTB Bit 0// RD - PORTB Bit 1// EN - PORTB Bit 2// D4 - PORTB Bit 4// D5 - PORTB Bit 5// D6 - PORTB Bit 6// D7 - PORTB Bit 7// Characters/line: 16 lcd_init(16);while (1){lcd_clear(); lcd_putsf(&quot;Angle : &quot;); itoa(Step * 45, str); lcd_gotoxy(7, 0); lcd_puts(str); lcd_gotoxy(1, 1); lcd_putsf(&quot;system digital&quot;);while(SET &amp;&amp; OK); if(!SET){Step = (++Step % 8); delay_ms(50); while(!SET); continue;}else if(!OK){delay_ms(50); while(!OK); for(i = 0; i &lt; Step; i++){STEPPER_PORT = StepCodes[i];  delay_ms(100);}}};}</description>
                <category>امیرحسین حسینعلی پور</category>
                <author>امیرحسین حسینعلی پور</author>
                <pubDate>Fri, 11 Jun 2021 10:12:08 +0430</pubDate>
            </item>
                    <item>
                <title>KUBERNETENS</title>
                <link>https://virgool.io/@m_28240232/kubernetens-vidembiezi0j</link>
                <description>کوبرنتیز (Kubernetes) در‌ واقع ساز و کار مدیریت کانتینر ها است که توسعه آن را شرکت معظم گوگل انجام داده است و در نتیجه سلاطین فناوری و توسعه‌دهندگان، علاقه زیادی به استفاده از کوبرنتیز نشان می‌‌دهند. کوبرنتیز (Kubernetes‎) نرم افزاری متن باز برای ارکستراسیون برنامه های کانتینربیس هست. به زبان go نوشته شده و ۶ ژوئن ۲۰۱۴؛ ۶ سال پیش با لایسنس آپاچی ۲ منتشر شده. وب سایتش kubernetes.io . معنیش هم به یونانی معنی سکاندار، خلبان، راننده و ... هست.ارکستراسیون یعنی چی ؟یعنی کانفیگ اتوماتیک، هماهنگی و مدیریت، نرم افزار ها. حالا ارکستراسیون توی کوبرنتیز چیه ؟ بخش کانفیگ اتوماتیک، هماهنگی و مدیریت کانتینر ها میشه همین اورکستراسیون. یعنی کوبرنتیز به شما توی کانفیگ و مدیریت و هماهنگی کانتینتر هاتون کمک میکنه.کوبرنتیز، کجا ها استفاده میشه ؟اکثر شرکت هایی که از معماری microservice استفاده میکنن، احتمالا از کوبرنتیز هم استفاده میکنن. بیشتر جا هایی که از کانتینر و داکر خبری هست، احتمالا k8sهم اون جا حضور دارهکانتینر ها و Vm ها چه هستند ؟کانتینر ها و Vm ها در هدفشون یکسان هستن : ایزوله کردن یک برنامه یا application و نیازمندی هاش درقالب یک واحد بسته بندی شده که بتونه هرجایی اجرا بشه.اگر بیشتر بخوایم بدونیم container ها و Vm ها نیاز ما به سخت افزار فیزیکی رو حذف میکنن ، اجازه میدن که استفاده کارآمد تری از منابع داشته باشیم و در واقع صرفه جویی در انرژی و هزینه رو تجربه کنیم تفاوت اصلی Container و Vm در رویکرد معماریشون هست.ماشین های مجازی چی هستند؟ماشین مجازی در واقع یک شبیهسازی از کامپیوتر واقعی هست که مثل یک کامپیوتر واقعی application هارواجرا میکنه.Vm ها روی یک کامپیوتر فیزیکی توسط Hypervisor ران میشن. Hypervisor یک مدل از مجازی سازی سخت افزاری یا ) hardware virtualization ( هست که به شما امکان اجرا از چندین سیستم عامل guest را در یک زمان روی یک سیستم host را فراهم میکنه. که در این حالت سیستم عامل های مجازی نصب شده همانند هر سیستم عامل واقعی امکان استفاده از منابع سخت افزاری موجود درسیستم مانند CPU و یاhardو ram رو داره. Hypervisor در حقیقت اشاره به تامین نیازمندی های سخت افزاری سیسم عامل های guest و مدیریت ارتباط بین اونا و میزان استفادشون از منابع سخت افزاری رو داره. از  Hypervisor با عنوان دیگری هم نام برده میشه Vmm نام داره و مخفف کلمات virtual machine manager میباشد و دراصل هر دو به یک موضوع اشاره دارند.در واقع هر guest machine دارای خود application فایل های مورد نیاز از قبیل سیستم عامل فایلای باینری و دیپندنسی هاش و در واقع شامل همه چیه ماشین مجازی دارای منابع کاملا اختصاصی خودش هست اینجا مشخص میشه که وقتی میگیم ماشین مجازی در واقع یک کامپیوتر واقعی هست یعنی چی VirtualBox VMware Workstation 8 مجازی ساز های معرفی هستن که احتمالا باهاشون کار کردین.همان‌‌گونه که شما بهتر از ما می‌دانید رایانش ابری نیازهای جدیدی را در دنیای سخت‌افزار و نرم‌افزار ایجاد کرد و شاهد نسل جدیدی از فناوری‌ها بودیم که تعامل با رایانش ابری را ساده‌تر می‌کردند. اپلیکیشن‌های بزرگ نیز به سمت ماژولار شدن پیش رفتند تا مدیریت و تعامل با آن‌ها از جانب توسعه‌دهندگان و کاربران ساده‌تر شوددر واقع میتوان گفتContainer ظرفی است کهImage ها را در آناجرا میکنند. Container ها از رویImage ها ایجاد میشوند و بهوظایف خود عمل میکنند. مثلا فرض کنید از یک Centos چندContainer میسازیم و در هر کدام تغییرات متفاوتی اعمال میکنیم.در همین راستا گوگل به عنوان یکی از بزرگترین غول‌های فناوری که حیات خود را مدیون رایانش ابری است به این فکر افتاد تا یکی از پروژه‌های بزرگ خود را که در داخل این مجموعه از آن استفاده می‌کرد به صورت متن باز منتشر کند. این پروژه از زیرساخت‌هایی بر اساس کانتینرها بهره می‌گرفت و در داخل گوگل با نام BROG شناخته می‌شد.کوبرنتیز نیز به‌سرعت راه خود را به جوامع فناوری باز کرد و به رقیب بزرگی برای ساز و کارهای دیگر کنترل کانتینرها مانند Apache Mesos و Docker Swarm تبدیل شد.اگر بخواهیم به‌زبان ساده کوبرنتیز را توضیح دهیم باید بگوییم کوبرنتیز اجرا و مدیریت کانتینرهای مختلف را در سرورهای متفاوت که در یک پایگاه داده یا چندین پایگاه قرار گرفته‌اند را بر عهده می‌گیرد. در کوبرنتیز کانتینرهای مختلفی که مشترکاً برنامه کاربردی خاصی را شامل می‌شوند در حالت جداگانه و مستقل تحت عنوان پاد(Pod)‌ دسته‌بندی خواهند شد. این کار فرآیند مدیریت و شناسایی آن‌ها را ساده‌تر می‌کند.کوبرنتیز کمک می‌کند تا کانتینرها در گروهی‌ از ماشین‌ها به صورت خودکار و اتوماتیک اجرا شوند، به این ترتیب به زبان ساده‌تر می‌توان گفت کوبرنتیز نقش سیستم‌عاملی را ایفا می‌کند که بر روی چندین سرور در حالت یکپارچه اجرا می‌شود. در نتیجه نیازی به نگرانی برای وضعیت ماشین‌های مختلف وجود ندارد و کاربران در حالی که هیچ تغییری در سرویس‌های اجرا شده مشاهده نمی‌کنند قابل تعامل با اپلیکیشن‌ها و سرویس‌های مورد نظر هستند.به لطف کوبرنتیز شرکت‌ها قادر هستند در فضای ابری برنامه‌های خود را به پیش بگیرند و کوبرنتیز را به عنوان یک سرویس عرضه نمایند. از طرف دیگر به لطف این قابلیت که کوبرنتیز بستر مناسبی برای راه‌اندازی و اجرای اپلیکیشن‌ها را فراهم می‌کند توسعه‌دهندگان به‌ سادگی می‌توانند اپلیکیشن خود را طراحی نموده و در پلتفرم‌های مختلف منتشر کنند. کاملاً مشخص است چنین ویژگی‌ چالاکی و سرعت توسعه‌دهندگان را افزایش می‌دهد و به تمرکز ‌‌تیم توسعه‌دهنده در حین توسعه اپلیکیشن کمک می‌کند.جالب است بدانید تعداد کانتینرهایی که کوبرنتیز پوشش می‌دهد گاهی اوقات از صدها هزار هم تجاوز می‌کند که تعامل با چنین حجمی از کانتینرها بدون راه‌کارهایی مانند کوبرنتیز عملاً دست‌نیافتنی است.کوبرنتیز قابلیت‌های فنی زیادی را در اختیار توسعه‌دهندگان قرار می‌دهند که در این بین می‌توان به امکان بررسی سلامت و تکثیر برنامه‌ها در مجموعه سرورهای یک مجموعه اشاره کرد. قابلیت تشخیص سرویس‌ها، تعادل حجم‌بار (Load Balancing) و مدیریت تنظیمات برای ایجاد سیستم‌هایی که از فناوری معماری Microservice Architecture بهره می‌برند اشاره کرد.هرکجا که صحبت از کوبرنتیس به میان می‌آید اشاره‌ای به داکر نیز می‌شود و این دو پلتفرم به‌عنوان رایج‌ترین ابزارها برای مدیریت کانتینرها شناخته می‌شوند، به این ترتیب کاملاً طبیعی است این سؤال برای توسعه‌دهندگان پیش بیاید که داکر بهتر است یا کوبرنتیز؟داکر یک سال زودتر از کوبرنتیز راهی بازار شده و طبیعتاً محبوبیت بیشتری دارد، از طرف دیگر داکر آن‌چنان که باید شاید نمی‌تواند نیاز توسعه‌دهندگان را در زمینه مدیریت کلاسترها پاسخگو باشد و انصافاً باید گفت کوبرنتیز قدرت بیشتری در این زمینه دارد. به این نکته نیز اشاره کنیم که در داکر شاهد ابزارهای حرفه‌ای و لازم برای مشاهده گزارش عمل‌کرد و مانیتور فضای کاری وجود ندارد.کوبرنتیز ابزارهای بسیار متنوعی برای پیاده‌سازی و مدیریت کانتینرها دارد و فریم‌ورک امن‌ داکر را یکی از نقاط مختلف آن می‌شناسند. جالب اینجاست که کوبرنتیز قادر است از موتور داکر به‌عنوان ابزاری برای افزایش امکانات مدیریتی خود بهره بگیرد.در مجموع می‌‌توان گفت داکر و کوبرنتیز به لحاظ امکانات تفاوت‌هایی با هم دارند اما این تفاوت‌ها بسته به نیاز یک مجموعه اهمیت پیدا می‌کند و به همین دلیل بسیاری از توسعه‌دهندگان کوبرنتیز را به دلیل قابلیت‌های ماژولار آن انتخاب می‌کنند.چرا به کوبرنتیز نیاز داریم و چه کاربردی برای ما به همراه دارد؟Container ها روشی مناسب برای دسته بندی اپلیکیشن ها و اجرای آن ها هستند. در یک production environment، شما باید container هایی که برنامه ها را اجرا می‌کنند، مانیتور نمایید تا از عدم وجود خرابی یا downtime در آن ها اطمینان حاصل کنید. به عنوان مثال، اگر یک کانتینر از کار بیفتد، به کانتینر دیگری نیاز خواهیم داشت تا اجرا شود. این درحالی است که، اگر ما بخواهیم این روند را توسط یک سیستم انجام دهیم به شکل ساده تر و آسان تری می‌توان را اجرا نماییم.کوبرنتیز تکنولوژی است که در چنین موقعیت هایی ما به آن نیاز خواهیم داشت تا بتواند چنین عملیاتی را انجام دهد. کوبرنتیز یک چارچوبی را برای اجرای سیستم های توزیع شده (distributed) به شکل منعطف در اختیار ما می‌گذارد. این تکنولوژی از scaling و failover اپلیکیشن مراقبت می کند و الگوهای استقرار (deployment patterns) را ارائه می‌دهد تا در کنار آن بتواند canary deployment را برای سیستم شما مدیریت کند.کوبرنتیز ارائه دهنده قابلیت های متنوعی است که عبارتند از:Service Discovery و Load Balancingبا کوبرنتیز می توانیم یک container را با استفاده از Name DNS یا IP address ، نمایش دهیم. اگر ترافیک به یک کانتینر زیاد باشد، کوبرنتیز قادر است Load Balancing را انجام دهد و ترافیک شبکه را توزیع کند تا استقرار پایدار و stable باشد.Storage Orchestrationکوبرنتیز به شما این امکان را می دهد تا به طور خودکار سیستم ذخیره سازی مورد نظر خود را مانند Local Storages، Public Cloud Providers و موارد دیگر را نصب نمایید.Automated Rollbacks and Rolloutsمی توان با استفاده از کوبرنتیز وضعیت مورد نظر برای container مستقر شده را توصیف نمود و وضعیت واقعی را به صورت دلخواه تغییر داد. همچنین می توانیم کوبرنتیز را طوری تنظیم نماییم تا container جدیدی را برای استقرار ایجاد کند، container های موجود را حذف نماید و منابع آن ها را به container جدید اختصاص دهد.Automated Bin Packingشما به کوبرنتیز یک کلاستری از نودها را می‌دهید تا بتواند از طریق آن، containerized tasks را انجام دهد. همچنین می‌توان به کوبرنتیز دستورات مختلفی را بدهید تا هر container چه مقدار CPU و حافظه (RAM) نیاز داشته باشد. این تکنولوژی نوین می‌تواند containerها را بر روی node ها قرار دهد تا از منابع به بهترین شکل استفاده شود.Self-Healingکوبرنتیز containerهای fail شده را مجدداً راه اندازی می کند، container ها را جایگزین می کند و container هایی را که به درستی کار نمی‌کنند را خاموش می‌نماید.Secret and Configuration Managementکوبرنتیز این امکان را می دهد تا اطلاعات مهمی مانند passwords، tokens OAuth و SSH keys ذخیره و مدیریت شوند. می توان کانفیگ های برنامه ها را که مهم و سری هستند، بدون بازسازی container images مستقر و update نمایید.· کوبرنتیز یک سیستم PaaS (Platform as a Service) سنتی و all-inclusive نیست. از آنجا که کوبرنتیز در سطح container کار می‌کند و نه در سطح سخت افزار، برخی از ویژگی های کلی را که همانند offering PaaS هستند ارائه می‌دهد مانند deployment، مقیاس پذیری، Load Balancing و ... و همچنین به کاربران این اجازه را می‌دهد تا راهکارهایlogging ، مانیتورینگ و alerting خود را یکپارچه کنند. با این حال، کوبرنتیز یکپارچه نیست و این راهکارها پیش فرض، optional و pluggable هستند.· کوبرنتیز building blocks را برای ساخت پلتفرم های توسعه دهندگان فراهم می‌کند، اما user choice و user flexibility را در جایی که مهم و حیاتی است حفظ می‌نماید.· اپلیکیشن هایی که ساپورت می‌‌شوند را محدود نمی‌کند و از انواع workloads، مانند stateless، stateful وdata-processing پشتیبانی می‌کند. می‌توان این نتیجه گیری را داشته باشیم که اگر یک اپلیکیشن بتواند در یک container اجرا شود، پس بر روی کوبرنتیز به خوبی اجرا خواهد شد.· کوبرنتیز Source code را deploy نمی کند. ادغام، تحویل و استقرار مداوم (Continuous Integration, Continuous Delivery, Continuous Deployment) workflows به عنوان الزامات فنی و فرهنگ های سازمانی است که باید رعایت شوند.· کوبرنتیز سرویس های application-level، مانند middleware (message buses)، data processing frameworks (Spark)، پایگاه های داده (MySQL)، caches و سیستم های cluster storage (Ceph) را ارائه نمی دهد. این کامپوننت ها می توانند روی کوبرنتیز اجرا شوند و یا از طریق مکانیسم های portable (مانند Open Service Broker)، به برنامه هایی که روی کوبرنتیز در حال اجرا هستند، دسترسی کاملی داشته باشید.· کوبرنتیز راهکارهای logging، monitoring و alerting را dictate نمی کند و برخی از integrationها را به عنوان proof of concept و مکانیسم هایی جهت جمع آوری و export، metrics فراهم می‌نماید.· کوبرنتیز نمی‌تواند زبان / سیستم configuration (Jsonnet) را ارائه‌ دهد. اما declarative API را ارائه می دهد که ممکن است به اشکال مختلفی از خصوصیات declarative، از آن استفاده شود.· هیچگونه machine configuration جامع، maintenance، مدیریت و یا سیستم های self-healing را ارائه نمی دهد و اتخاذ نمی‌‌کند. علاوه بر این، کوبرنتیز صرفا یک سیستم orchestration نیست. در حقیقت، این سیستم نیاز به orchestration را برطرف می کند. اگر بخواهیم تعریف فنی از orchestration داشته باشیم، اجرای یک گردش کار (workflow) خواهد بود: یعنی ابتدا تسک A، سپس B و در نهایت تسک C را انجام می‌دهد. در مقابل، کوبرنتیز شامل مجموعه ای از فرآیندهای کنترل مستقل و composable است که بطور مداوم وضعیت فعلی (current state) را به حالت مورد نظر (desired state) تغییر می‌دهد. فرقی ندارد که چگونه از A به C می‌خواهیم برویم یا حتی لزومی بر استفاده از کنترل متمرکز(centralized control) داشته باشیم، کوبرنتیز این کارها را برای ما انجام می‌دهد!Kubernetes در سطح پایه‎ی آن یک سیستم برای اجرا و هماهنگ‌سازی برنامه‎هایContainer در سراسر کلاستر است. این پلتفرم جهت مدیریت کامل چرخه‎ی حیات برنامه‎ها، سرویس‎ها و ارائه‎ی بستری برای گسترش‌پذیری و در دسترس‌بودن بسیار بالا طراحی شده است. شما به عنوان مدیر Kubernetes می‎توانید تعریف کنید که چگونه سرویس‎ها اجرا شوند و از چه طریقی با یکدیگر و دنیای بیرون ارتباط برقرار کنند.بررسی معماری KubernetesKubernetes ارتباط خود را با ماشین‎های مجازی یا ماشین‎های فیزیکی از یک شبکه‎ی اشتراکی مانند “Flannel ” که در هر ماشین وجود دارد برقرار می‌کند. در شبکه‎ی کلاستریKubernetes، تمامی اجزا، قابلیت‎ها و Workloadها پیکربندی می‎شوند. هر ماشین در اکو سیستم Kubernetes یک وظیفه و نقش را بر‌ عهده دارد.· Masterیک ماشین (سرور) در کلاستر به انتخاب ما باید به عنوانMaster در نظر گرفته شود. این سرور با ایجاد یک IP برای مدیر سیستم، راه ورود به کلاستر و مدیریت آن را باز می‎کند. علاوه بر این، تست سلامت و پایداری دیگر سرور‎ها، تعیین نقش و همچنین ارکستراسیون بین اجزای مختلفKubernetes را برعهده دارد.در واقع سرور Master نقطه اصلی ارتباط با کلاستر است و مدیریت و نظارت متمرکز در سراسر سیستم Kubernetes را فراهم می‎کند.· Nodeدیگر ماشین‎هایی که در کلاستر Kubernetes ایجاد می‎شوند سرور Node نام دارند. این سرورها وظیفه‎ی اجرا کردن بارِ کاری را با استفاده از منابع داخلی یا خارجی برعهده دارند. Node برای کمک به ایزوله سازی، مدیریت و انعطاف پذیری Kubernetes برای اجرای اپلیکیشن‎ها و سرویس‎ها از Container استفاده می‎کند، بدین ترتیب هر ماشینNode در کلاستر نیاز به دارا بودن به یک سیستم و نرم افزار کانتینری مانندDocker یا rkt Node است. در کلاستر دستور العمل‎ها را از سرور Master دریافت می‎کند و بر اساس تنظیمات، کانتینرها را ایجاد یا آن‎ها را حذف می‎کند و همچنین تنظیمات مناسب شبکه‎ی کلاستر و مسیریابی ترافیک را انجام می‌دهد.· Containerهمانطور که اشاره شد، اپلیکیشن‎ها و سرویس‎های ما در کلاسترKubernetes با کاینتر اجرا می‎شوند. کاربر جهت تعامل با کلاستر از IP سرور اصلی، کلاینت و یا کتابخانه استفاده می‎کند. برای اجرای اپلیکیشن‎ها یا سرویس‎ها، یک برنامه اعلامیه در فایل‎های JSON یا Yaml ارائه می‎شود که مشخص‌کننده این است که چه چیزی باید ایجاد شود و چگونه باید آن را مدیریت کرد. سرور Master، فایل برنامه را می‎گیرد (JSON یا Yaml) و چگونگی اجرای آن در زیرساخت را با بررسی شرایط و وضعیت فعلی سیستم مشخص می‎کند. این گروه از برنامه‎های تعریف شده توسط کاربر که بر اساس یک نقشه خاص اجرا می‎شوند، نتیجه‎ی نهایی Kubernetes را نشان می‎دهند.اجزای سرور Masterهمانطور که در بالا اشاره شد سرورMaster به عنوان کنترل‌کننده اولیه برای کلاستر است. این سرویس به عنوان راه ارتباطی اصلی جهت مدیریت توسط کاربر است، با این حال اجزای سرور Master برای دریافت و قبول درخواست کاربر با هم تعامل دارند و همچنین تعیین بهترین راه برای برنامه‌ریزی Container و احراز هویت کلاینت‎ها، تنظیم شبکه‎ی کلاستری و مدیریت و توسعه و پایداری کلاستر است. این اجزاء می‎توانند در یک ماشین یا در کلیه‎ی ماشین‎ها نصب شوند. ما در مورد هر جزء که در سرور Master وجود دارد به صورت جداگانه صحبت خواهیم کرد.جایگاه etcd در Kubernetesetdc یک جزء مهم Kubernetes  جهت ذخیره‌سازی و نگهداری فایل‎های پیکربندی کلاستر است. پروژه‎ی etcd توسط تیم Core Os توسعه داده شده است که بسیار سبک بوده و یک مکانی جهت نگهداری Key-Valueها است که می‎تواند در سراسر کلاستر وNodeها توزیع شود. Kubernetes از etcd برای نگهداری فایل‎ها و داده‎های پیکربندی کلاستر استفاده می‎کند که قابل دسترسی توسط هر Node در کلاستر است. این سرویس می‎تواند جهت جستجوی سرویس‎ها، پیکربندی یا پیکربندی مجدد خودشان جهت بروز نگه‌داشتن اطلاعات استفاده شود.Kube apiserver، مدیریت Kubernetesیکی دیگر از سرویس‎های مهم در سرور Api-server ،Master است. این نقطه‎ی اصلی مدیریت و ورود به Kubernetes است که به کاربر اجازه می‎دهد Kubernetes را پیکربندی کند. در واقع kube-apiserver پلی بین اجزای مختلف با هدف نگهداری و حفظ سلامت کلاستر و انتشار اطلاعات و اجرای دستور عمل‌ها است.api server یک رابط RESTfull ایجاد می‎کند که به این معنی است که بسیاری از ابزارها و کتابخانه‎ها به راحتی می‎توانند با آن ارتباط برقرار کنند.راه ارتباطی کاربر نیز از طریق ابزار Kubectl مهیا می‎شود که به صورت پیش فرض در سیستم وجود دارد.وظایف سرویس Kube Controller ManagerKube Control Manager سرویسی است که وظایف زیادی دارد از جمله:· کنترل کننده‎های وضعیت کلاستر· چرخه‎ی حیات کلاستر· و …به عنوان مثال یک Replication-Controller تضمین می‎کند که تعداد کپی‎ها (نسخه های یکسان) درست تعریف شده یا تعداد مورد نظر Podها در کلاستر یکی باشند و به درستی در کلاستر قرار بگیرند. جزئیات این عملیات در etcd نوشته می‎شود، جایی که Controller Manager برای تغییرات به آن نگاه می‎کند. زمانی که تغییرات در کلاستر ایجاد می‎شوند، Controller اطلاعات جدید را می‎خواند و دستوری را اجرا می‎کند.وظیفه فرایند Kube Scheduler چیست؟Kube-Scheduler فرایندی است که در واقع مسئولیت و وظیفه را به Nodeهای خاص در کلاستر اختصاص می‎دهد. این سرویس شرایط عملیاتی را می‎خواند. همچنین تجزیه و تحلیل محیط زیرساخت فعلی و جایگزین را انجام داده و وظایف را به Node قابل قبول واگذار می‌کند. Scheduler مسئول بررسی ظرفیت موجود در هر Node است تا مطمئن شود که حجم کاری اختصاص داده شده بیش از منابع موجود نباشد. Schedular باید ظرفیت کل و همچنین منابعی که قبلا در هر سرور اختصاص داده شده است را بشناسد.اجزای سرور Nodeدر Kubernetes سرورهایی که Container روی آن ها کار می کنند به عنوان Node شناخته می شوند. سرورهای Node دارای چندین الزام هستند که برای ارتباط با اجزای اصلی کلاستر و پیکربندی شبکه و اجرای Workload اختصاص یافته به آنها ضروری است.نقش Container در سرورهایNodeاولین جزء در هر Node باید یک Container همیشه در حال اجرا باشد. به طور معمول این نیاز با نصب و راه اندازی Docker برطرف می‎شو. همچنین گزینه‎های دیگری نظیر rkt و runc وجود دارند.Kubelet، راه ارتباطی میان Node وMasterنقطه تماس اصلی برای هر Node با کلاستر سرویس Kubelet است. این سرویس مسئول انتقال اطلاعات (دستور) به سرویس‎های کنترل کلاستر است و از طریق آن در ارتباط با etcd Data Base برای خواندن جزئیات پیکربندی یا نوشتن مقادیر جدید استفاده می‎کند. سرویس Kubelet در هر Node با اجزای اصلی کلاستر سرور Master ارتباط برقرار می‎کند تا در کلاستر احراز هویت شود و دستورات و وظایف را از سرور Master دریافت کند.فرایند Kubelet مسئول نگهداری و دریافت وظایف است. در این زمان Containerها توسط فرمان‎های رسیده از سرور Master ایجاد یا حذف می‎شوند.Kube proxy چه نقشی را ایفا می‎کند؟برای مدیریت شبکه و زیرشبکه (subnet) هر سرور در کلاستر و فعال‌سازی سرویس‎های دیگر، یک سرویس کوچک به نام Kube-Proxy در هر Node ایجاد می‎شود. این فرایند، درخواست ارتباطی را به Container مورد نظر داده و می‎تواند Load Balance اولیه را انجام داده و و مطمئن شود که شبکه‎ی کلاستر در دسترس و قابل پیش‌بینی و همچنین ایزوله است.</description>
                <category>امیرحسین حسینعلی پور</category>
                <author>امیرحسین حسینعلی پور</author>
                <pubDate>Sat, 26 Dec 2020 23:16:13 +0330</pubDate>
            </item>
            </channel>
</rss>