<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد حسین موثقی نیا</title>
        <link>https://virgool.io/feed/@movasaghi</link>
        <description>دانشجوی مهندسی کامپیوتر ;)</description>
        <language>fa</language>
        <pubDate>2026-06-10 14:19:47</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/142601/avatar/oYFK6s.png?height=120&amp;width=120</url>
            <title>محمد حسین موثقی نیا</title>
            <link>https://virgool.io/@movasaghi</link>
        </image>

                    <item>
                <title>تزریق وابستگی | Dependency Injection</title>
                <link>https://virgool.io/@movasaghi/dependencyinjection-imuvvd1anqcv</link>
                <description>Dependency Injection | تزریق وابستگیدر اصل شاید سرفصل بحث ما رو بشه گفت &quot;وابستگی وارون | Dependency Inversion&quot; که این مبحث یکی از موارد مهم در بحث مهندسی نرم افزار هستش که همون D توی SOLID هستش.همین اول بحث بگم که این موضوع یکی از مفاهیمی هست توی مهندسی نرم افزار که ماشالله تعداد کلماتی کلیدی ای که توش مطرح می شه، که برای هر کدوم از این کلمات کلیدی می شه صد ها مقاله نوشت، خیلی زیاده! من تلاش کردم هر کدومشون رو خیلی کوتاه توضیح بدم، ولی طبیعتا نمی شد به صورت مفصل بحث کرد راجع بهشون.نرم افزار های شرکتی | Enterprise Softwareیکی از چالش های مهم در توسعه نرم افزار های شرکتی بحث پیچیدگی نرم افزار و همین طور سادگی توسعه اون هستش یعنی ما دوست داریم نرم افزار های خیلی پیچیده رو به آسونی بتونیم توسعه بدیم و علاوه بر این قابل گسترش هم باشن.یک نکته مهمی که این جا باید متذکر بشم این هستش که بحث پیچیدگی نرم افزار با لود بالای سیستم خیلی فرق داره. اگه بخوایم یک اشاره کوتاه بهش بکنیم، مثلا توسعه نرم افزار مدیریت ورود و خروج کارمندان یک شرکت تقریبا لود پایینی داره، یعنی در هر لحظه تعداد درخواست هایی که به سمت سرور یا سرورها ارسال می شه به نسبت پایین هستش. اما شاید پیچیدگی زیادی داشته باشه، مثلا باید این نرم افزار به چندین نرم افزار دیگه متصل باشه که حقوق کارمندان رو بر اساس زمان ورود و خروجشون محاسبه بکنه، نمودار های مختلف بکشه و تحلیل های متفاوتی بر اساس اون ها بکنه که این ها و موارد متعدد دیگر باعث پیچیده شدن سیستم می شه ولی لود اون سیستم رو لزوما بالا نمی بره.قابلیت گسترش نرم افزار به پارامتر های متفاوتی وابسته است که در این مقاله می خوایم راجع به وابستگی های برنامه صحبت بکنیم.سوال: به نظر شما تفاوت عمده بین فریم وورک (Framework) و کتابخانه (Library) در چیست؟جواب: حتما شما به تفاوت های متعددی اشاره کردین و شاید مهم ترین چیزی که به ذهنتون رسیده باشه این باشه که فریم وورک ها مجموعه ای از کتابخانه ها هستند. قطعا همین طور هستش و همه مواردی که بهش فکر کردین جزو تفاوت ها و ویژگی های هر کدوم از ایناست. اما یک تفاوت مهم که این جا می خوایم بهش اشاره بکنیم که شاید پایه ای ترین تفاوت این دو مورد باشه، بحث نوع کنترل هستش. به صورت عادی ماها توی برنامه نویسی وقتی از کتابخونه ها یا هر تابعی استفاده می کنیم، ما اون رو صدا می زنیم و ورودی هامون رو بهش می دیم و اونم خروجی ها رو بهمون می ده. این روش متداول ترین روش کنترل است، که کنترل مستقیم شاید بشه اسمش رو گذاشت. اما نکته ای که هست اینه که وقتی ما از یک فریم وورک استفاده می کنیم، این جا اون فریم وورک هست که کد های ما رو تحت کنترل خودش داره؛ یعنی چی؟ همون جوری که توی شکل 2 می بینید، به زبان ساده بخوایم صحبت کنیم فریم وورک ها یک سری موارد رو تعیین می کنند که ما باید با کد خودمون اون جا ها رو پر کنیم تا کارایی مورد نیاز خودمون رو از فریم وورک بگیریم، اگه بخوایم یکم تخصصیش کنیم یعنی فریم وورک ها به صورت ابسترکت (Abstract) مواردی که بهشون نیاز دارند رو تعیین می کنند و ما اون ها رو مطابق با میل خودمون و کارایی که می خوایم فریم وورک برای ما داشته باشه تعیین می کنیم. به این حالت که فریم وورک داره کد ما رو کنترل می کنه، کنترل معکوس (Inversion Of Control) می گیم.شکل 2 - تفاوت فریم وورک و کتابخانهاز یک زاویه دیگه اگه بهش نگاه بکنیم، یک فریم وورک به صورت کلی یک کارایی ثابت داره، مثلا فریم وورک های بک اند، کارشون این هست که یک درخواستی رو از کلاینت بگیرند و یک سری وظایف رو انجام بدن و بعدش یک جوابی رو به کلاینت بفرستن. اما کتابخانه ها ممکنه هرجایی کاربرد داشته باشند، مثلا یک کتابخونه ای که با الگوریتم های مختلف سورت انجام می ده، ما می تونیم هرجایی برای هر کاری استفاده بکنیم ازش و یک کاربری خاص منظوره دیگه نداره.امیدوارم تفاوت عمده این دو مورد رو متوجه شده باشین ?. اگه بازم جاییش ابهام داشت خوشحال می شم توی کامنت ها با من در میون بگذارید.وابستگی وارون | Dependency Inversionوابستگی وارون، می شه همون بحثی که توی فریم وورک کردیم با هم دیگه. اما یک تعریف خوب بخوایم ازش بکنیم یعنی ماژول های نرم افزاری یک سیستم نرم افزاری را به گونه ای از هم جداسازی کنیم و ارتباطاتشون رو شکل بدیم که وابستگی اونا به هم دیگه به شکلی باشه که اجزای بزرگ وابسته به نحوه پیاده سازی اجزای کوچک تر نباشند.البته این تعریف شاید یک مقداری گنگ باشه، جزء بزرگ و کوچک یک چیز کاملا نسبی هستش، شاید یک جزء از نظر شما کوچک باشه ولی از نظر طراح سیستم بزرگ باشه. مهم اینه که سیستمی که طراحی می شه کم ترین وابستگی رو به نحوه پیاده سازی ماژول های خودش داشته باشه. یعنی اگه یک ماژول رو برداشتیم و یک ماژول دیگه جایگزین اون کردیم که پیاده سازیش کلا با قبلی فرق داشت، سیستم بدون هیچ اشکالی همون عملکرد قبلی رو داشته باشه.برای ملموس تر شدن موضوع یک مثال می زنیم: فرض کنید می خوایم توی یک سیستم به دیتابیس متصل بشیم، خب برای این که کدمون از قواعد مهندسی نرم افزار تبعیت کنه، یک کلاس مجزا برای ارتباط با دیتابیس طراحی می کنیم که رابط ما با دیتابیس MSSQL باشه. حالا اگر در جایی مجبور بشیم به جای این دیتابیس از دیتابیس مثلا MySQL استفاده بکنیم، دچار مشکل می شیم چرا که این کلاس خاص منظوره برای دیتابیس MSSQL طراحی شده و لازمه تغییرات اساسی ای توی کلاس ایجاد کنیم. چالشی که باهاش رو به رو می شیم این هست که لازمه یک کلاس دیگه ایجاد کنیم برای این کار و در نتیجه لازمه یک بار دیگه کل سیستم کامپایل بشه، که جفت این موارد بسیار زمان بر و هزینه بر خواهد بود.برای حل این مشکل همانگونه که در شکل 3 مشاهده می کنید، یک اینترفیس به صورت ابسترکت موارد مورد نیاز را پیاده سازی می کنیم و سپس هر یک از کلاس های مورد نیاز با پیاده سازی این اینترفیس قابلیت اتصال به برنامه را پیدا می کنند، که نحوه اتصال به شکل تزریق وابستگی می باشد که در ادامه توضیح می دهیم.شکل 3 - ارتباط معکوس با کلاس دیتابیستزریق وابستگی | Dependency Injectionهمانگونه که در بحث وابستگی وارون مطرح کردیم، یک اینترفیس به صورت ابسترکت به پیاده سازی می‌پردازیم که هماهنگونه که در شکل 4 مشاهده می کنید با نام سرویس مشخص شده است که در صورتی که مطابق با قواعد آن پیاده سازی صورت گیرد قابل تزریق است.درخواست یک سرویس از سمت کلاینت اعلام می شود و مطابق با تنظیمات صورت گرفته در سیستم نرم‌افزاری تزریق کننده جواب این درخواست را به کلاینت ارسال می کند. یعنی به نوعی سرویس تزریق شده از آن به بعد به عنوان یک شیء برای کلاینت شناخته می شود و عملیات های لازم صورت می گیرد.شکل 4 - روند تزریق وابستگیبرای ساده سازی مطلب یکی از ساده ترین روش های این کار، ایجاد یک دیکشنری به صورت کلید-مقداری که زمانی که درخواست یک سرویس ارسال شد، در این آرایه جست و جو انجام شود و سرویس متصل یافت شود و به کلاینت ارسال شود.البته که این بحث به شکل های مختلفی امکان پذیر است، که شاید از جمله معرف ترین روش های این کار عبارت است از:+ به ازای درخواست: یعنی به ازای هر درخواست ارسال شده یک ترد (thread) مجزا ایجاد شود و از سرویس شیء مجزایی ساخته شود.+ بر اساس کاربر: یعنی به ازای هر کاربر براساس شناسایی کاربران، یک ترد (thread) مجزا ایجاد شود و از سرویس شیء مجزایی ساخته شود.+ تنها یک ترد: یعنی تنها یک ترد و یک شیء از سرویس ایجاد شود و به نوعی به صورت استاتیک از این کلاس استفاده شود.البته که روش های دیگری نیز می تواند در نظر گرفت برای تزریق وابستگی.نکته مهمی که قبل از این هم اشاره کردیم، بحث زمان بر بودن کامپایل دوباره (Re-Compiling) یکی از مهم ترین بحث هایی است که در کتاب های توسعه نرم افزار های شرکتی نیز به آن اشاره شده است و حتی برای آن ها پیشنهاداتی داده شده است که توسعه دهنده ها می بایست در این زمان چه کار هایی انجام دهند، چرا که در سیستم های بزرگ کامپایل دوباره بسیار زمان بر خواهد بود و تا جای ممکن لازم است از کامپایل دوباره سیستم دوری کرد.همانگونه که قبل از این اشاره شد تغییر در کد ها و اضافه کردن کلاس های پیاده سازی اینترفیس ها طبیعتا لازم است تا کامپایل دوباره صورت گیرد. برای جلوگیری از این کار لازم است تا فایلی را برای این کار اختصاص داد که ارتباط میان کلاس ها و اینترفیس ها را ایجاد کند. این فایل به نوعی همان تنظیمات تزریق های وابستگی هستند. که اصطلاحا به آن IOC Container که مخفف Inversion Of Control Container می باشد، می گویند. به عنوان مثال در فریم وورک های همچون Spring و ASP.net این فایل تحت عنوان json فایل در کنار برنامه قرار دارد مطابق با شماتیک شکل 5 ارتباطات این ماژول ها و موارد دیگر را تعین می کند.شکل 5 - شماتیک فایل تنظیمات IOCاین فایل این امکان را فراهم می کند که بعد از کامپایل شدن سیستم بتوان اتصالات ماژول ها به یک دیگر را تغییر داد و دیگر نیازی به کامپایل مجدد نباشد.امیدوارم مفید بوده باشه براتون ?حتما نظراتتون رو با من در میون بزاریدمنابع•      Dr. R.Khosravi. “Internet Engineering Course – Tehran University” 2018 - https://maktabkhooneh.org/course/%D9%85%D9%87%D9%86%D8%AF%D8%B3%DB%8C-%D8%A7%DB%8C%D9%86%D8%AA%D8%B1%D9%86%D8%AA-mk208•     Kirk Larkin, Steve Smith, Scott Addie, Brandon Dahler. “Dependency injection in ASP.NET Core – Microsoft Documentation” 2020 - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1</description>
                <category>محمد حسین موثقی نیا</category>
                <author>محمد حسین موثقی نیا</author>
                <pubDate>Sun, 22 Nov 2020 20:35:50 +0330</pubDate>
            </item>
                    <item>
                <title>محیط اجرا | Runtime Environment</title>
                <link>https://virgool.io/@movasaghi/%D9%85%D8%AD%DB%8C%D8%B7-%D8%A7%D8%AC%D8%B1%D8%A7-runtime-environment-poi2pnzof0v7</link>
                <description>1. چکیدهدر این گزارش به بررسی مفهوم محیط اجرا در برنامه های می پردازیم که یکی از موارد مهم در زمان اجرای برنامه هاست. برنامه ها به صورت کلی در زمان اجرا از سه جزء بزرگ تحت عنوان کد برنامه، رویه ها و متغیرها تشکیل می شوند که این موارد می تواند جزئی از برنامه و یا مواردی باشد که در زمان اجرا نیاز می شود و می بایست توسط سیستم عامل تامین شود. به صورت کلی مفهوم محیط اجرا در برنامه ها ارتباط زیادی با بحث مدیریت حافظه و پردازه ها در سیستم عامل ها دارد که در این گزارش به بررسی آن می پردازیم.2. مقدمهبه صورت کلی در بحث کامپایلر ها با زبان هایی رو به رو هستیم که برای راحتی برنامه نویس ها نزدیک به زبان انگلیسی طراحی شده اند و به آن ها زبان های سطح بالا(High-Level Language) گفته می شود، برنامه های نوشته شده به این زبان ها می بایست به زبان میانی ترجمه شده و سپس به زبان ماشین مخصوصی که قرار است بر روی آن اجرا شوند ترجمه شوند که به این لایه از زبان ها اصطلاحا زبان های سطح میانی(Middle-Level Language) گفته می شود که بین زبان های سطح بالا و زبان ماشین یعنی صفر و یک قرار دارند.شکل 1 - نمایی از مراحل و سطوح زبان ها و عملیات کامپایل.همه موارد گفته شده در مراحل کامپایل کاملا منطقی و دقیق است اما نکته ای حائز اهمیت می شود آن هم این است در که در بسیاری از موارد ممکن است نیاز باشد تا از کتابخانه های مخصوص ماشین های متفاوت استفاده شود تا بر روی آن ماشین قابلیت اجرای برنامه فراهم شود و یا از متغیر هایی که مخصوص سیستم عامل ها هستند استفاده شود تا مواردی مثل امکان استفاده از چند هسته و یا حافظه و از این قبیل موارد مشخص شود، چرا که در زمان برنامه نویسی نمی توان این موارد را مد نظر قرار داد و دلیل آن نیز کاملا شفاف است، چون که ممکن است این برنامه در ماشین های متعدد و متفاوتی از نظر ساختار سخت افزاری اجرا شود و به صورت کلی برنامه تا جای امکان نباید نیاز به تغییر ساختاری داشته باشد. مشکلات دیگر نیز از این قبیل وجود دارد به عنوان مثال اگر برنامه از آدرس های دقیق حافظه فیزیکی در کد استفاده کرده باشد، قابلیت اجرا در ماشین های متفاوت را نداشته و حتی قابلیت اجرای مجدد بر روی همان ماشین را نیز ممکن است نداشته باشد چرا که سیستم عامل وظیفه تخصیص حافظه را به عهده دارد و بر اساس برنامه هایی که در حال اجرا هستند و یا منتظر اجرا هستند این حافظه را مدیریت می کند، بنابراین امکان این که برنامه ما به صورت کاملا دقیق در همان خانه های از پیش تعیین شده قرار بگیرد تقریبا صفر درصد خواهد بود. به عنوان مثال ساده ترین روشی که برای حل این مسئله به کار برده می شود که زیرمجموعه بحث ما خواهد بود، این است که یک عدد ثابت توسط سیستم عامل با خانه های نوشته شده در کد برنامه جمع یا تفریق می شود که لازمه این قضیه این است که برنامه نوشته شده از قبل این قابلیت را در خود قرار داده باشد که این قابلیت توسط کامپایلر ها در کد قرار داده می شود.شکل 2 - تبدیل آدرس منطقی به آدرس حقیقی در زمان اجرا.3. تخصیص حافظهمهم ترین موردی که در زمان اجرا می بایست مدیریت شود، حافظه اصلی می باشد. هر برنامه شامل سه بخش کلی می باشد که عبارت است از کد برنامه، رویه ها(Procedures)، متغیرها. هر یک از این موارد می بایست به شکل خاصی در حافظه اصلی نگه داری شوند که برنامه ای که در حال اجراست بتواند وظایف خود را به صورت صحیحی انجام دهد.روش های تخصیص حافظه به صورت کلی به دو دسته تقسیم می شوند: تخصیص حافظه ایستا(static)، تخصیص حافظه پویا(Dynamic) که تخصیص پویا به منظور استفاده در ذخیره سازی پشته(Stack) و هرم(Heap) استفاده می شود.نکته ای که باید به آن توجه شود این است که ذخیره سازی پویا به این معنی نیست که حافظه مصرفی برنامه بیشتر از مقدار مشخص شده توسط سیستم عامل خواهد بود، بلکه به این معنی است که در ابتدا تعداد خانه های اندکی از حافظه تخصیص داده می شوند و در زمان اجرای برنامه خانه های بیشتر و کم تر می شوند.شکل 3 - تخصیص حافظه (ایستا و پویا).3-1. تخصیص حافظه ایستاذخیره سازی ایستا به این معنی است که در زمانی که سیستم عامل حافظه مخصوص برنامه را به آن تخصیص می دهد مقداری از این حافظه به صورت ثابت به برخی از موارد تخصیص داده می شود و تا زمان اتمام اجرای برنامه هیچ تغییری در محل ذخیره سازی این موارد صورت نگرفته و حتی کم و زیاد نیز نمی شود. این نوع ذخیره سازی برای متن کد برنامه و همین طور داده های ایستای دیگری که ممکن است در برنامه وجود داشته باشند قابل استفاده است.3-2. تخصیص حافظه پشتهذخیره سازی پشته ها در فضای پویای حافظه تخصیص داده شده توسط سیستم عامل قرار می گیرد و دلیل این قضیه پویا بودن ماهیت پشته می باشد که دائما عملیات ذخیره سازی و خواند از پشته صورت می گیرد و از آن جایی که به صورت آخر-ورود-اول-خروج (LIFO: Last-In-First-Out) می باشد، می بایست قابلیت اضافه شدن خانه های آن موجود باشد چرا که همانند آرایه ها ثابت نبوده و قابلیت کم و زیاد شدن دارند.شاید این سوال مطرح شود که چرا در ابتدا فضای زیادی برای پشته به آن ها تخصیص ندهیم؟ جواب این است که به دلیل این که حافظه تخصیص داده شده توسط سیستم عامل محدود می باشد و طبیعتا در ماشین مورد استفاده برنامه های دیگری نیز درحال اجرا هستند نمی توان هر مقدار حافظه ای را هرچند بدون استفاده به موارد مختلف تخصیص داد، چرا که پشته ها ممکن است در زمان اجرا صرفا یک خانه را اشغال کنند و در زمان های خاصی فضای زیادی اشغال کنند.3-3. تخصیص حافظه هرمذخیره سازی هرم ها نیز از آن جایی که ماهیت پویا ای دارند می بایست به صورت پویا باشد، روش مناسبی که برای این ذخیره سازی استفاده می شود از آن جایی که فضای ذخیره سازی برای برنامه محدود است، از انتهای فضایی که تخصیص داده شده است شروع به پر کردن داده ها می کند، به این شکل با توجه به این پشته نیز از ابتدای فضای حافظه شروع به پر کردن کرده است، به شکل بهینه ای می توان از حافظه تخصیص داده شده استفاده نمود.دلیل اصلی ای که علاوه بر پشته ها نیاز به ذخیره سازی هرم ها نیز وجود دارد، بحث پیاده سازی اولویت می باشد، چرا که به وسیله پشته پیاده سازی اولویت تقریبا نشدنی است و حتی اگر روشی نیز پیشنهاد شود احتمال خیلی زیاد پیچیدگی زیادی دارد و نیاز به مصرف حافظه و پردازش زیاد در پردازنده مرکزی خواهد بود که هزینه بیشتری نسبت به حافظه مورد استفاده برای هرم خواهد داشت.4. جمع کننده زبالهجمع کننده زباله(Garbage Collector) که یکی از موارد مهم در مدیریت حافظه می باشد که وظیفه اصلی آن به عهده سیستم عامل می باشد. به این نحو عمل می کند که حافظه هایی که به برنامه تخصیص داده شده اند در زمانی که دیگر مورد نیاز نباشد به حافظه های خالی حافظه اصلی باز می گرداند. این پردازش بسیار پر هزینه می باشد. به صورت کلی نیز نحوه عملکرد بسیار پیچیده ای دارد و شاید ساده ترین عملیاتی که انجام می دهد این است که زمانی که اسکوپ(Scope) استفاده متغییری به اتمام می رسد حافظه آن را پس گرفته و به حافظه های خالی بر می گرداند.شکل 7 - نمایی از عملیات جمع کننده زباله ها.در زبان هایی همانند C# و Java که برای برنامه نویسی نرم افزار های بزرگ استفاده می شود این قابلیت به صورت خودکار وجود دارد تا دغدغه مدیریت حافظه را از برنامه نویس گرفته و به صورت خودکار آن را مدیریت کند. اما در زبان هایی مانند زبان C این قابلیت وجود نداشته و مدیریت حافظه را به عهده برنامه نویس گذاشته است که این قضیه به عنوان یک نقطه ضعف به حساب نمی آید بلکه یکی از ویژگی های این زبان می باشد چرا که رسالت خود را ایجاد دسترسی حداکثری برای برنامه نویس می داند. دلیل اصلی این قضیه نیز استفاده از این زبان برای توسعه نرم افزار های سیستمی می باشد چرا که حتی سیستم عامل ها نیز با این زبان توسعه داده می شوند و در صورتی که مدیریت حافظه را به صورت خودکار انجام دهد، سیستم عامل بهینه بودن خود را از دست داده و بسیار کند خواهد شد و می بایست مدیریت حافظه به صورت کامل توسط برنامه نویس سیستم عامل توسعه داده شود.5. رویه هارویه ها(Procedures) مفهومی در زمان اجرای برنامه هاست که ارتباط زیادی با بحث توابع دارد. به صورت کلی اگر رویه ها را بخواهیم تعریف کنیم می توانیم بگوییم، رویه ها مجموعه ای از اطلاعات هستند که برای صدا زدن توابع و اجرای آن ها و بازگشت به محل صدا زدن توابع مورد نیاز است.البته نکته مهمی که وجود دارد این است که در زمان اجرا، کد برنامه به صورت زبان ماشین درآمده است و این پرش ها بسیار اندک خواهد بود و برای مواردی که به عنوان مثال استفاده از کتابخانه های ماشین مورد نظر و یا مواردی که قسمتی که به آن پرش می شود قابلیت گسترش در محیط اجرا را دارد و یا قابلیت تغییر در اجرا های متوالی را خواهد داشت استفاده می شود، چرا که این عملیات بسیار هزینه بر می باشد زیرا متغییر های بسیاری را برای هر پرش می بایست ذخیره کند و همین طور لازم است چندین بار بین حافظه اصلی و پردازنده اطلاعات رد و بدل شود تا این عملیات انجام شود.شکل 8 - نمونه شماتیک اجرای رویه ها.به عنوان مثال در شکل 8 نمونه ای از رویه ای ساده بیان شده است، فرضا تابع show_data یک رویه است و با صدا زدن آن به محل ذخیره سازی آن پرش می شود و خط به خط آن اجرا شده و سپس به محل اولیه باز می گردد. به همین شکل در داخل تابع show_data نیز تابع دیگری صدا زده شده است که این عمل در بین عمل قبل اتفاق می افتد.جدول 1 - متغیرها و مواردی که برای اجرای هر رویه ذخیره می شود.همانگونه که در جدول 1 مشاهده می کنید اطلاعاتی که برای هر رویه ذخیره سازی می شود بسیار زیاد است و این یکی از علل پرهزینه بودن اجرای رویه ها می باشد.6 . درختهای فعال سازی | Activation Treesبا توجه به اینکه هر برنامه‌ای در کامپیوتر توالی و ترتیبی از دستورالعمل‌ها است میتوان تعریف دیگری نیز برای رویه در نظر گرفت و آن عبارت است از «دستورالعمل‌های کنار یکدیگری که کار مستقل و مشخصی انجام می‌دهند» که به آن درخت‌های فعال سازی می‌گویند.با این تعریف هر رویه یک بدنه دارد که در هنگام اجرای برنامه شروع به اجرا می‌کند. در مباحث مربوط به کامپایلر، به اجرای یک رویه «فعال‌سازی» گفته می‌شود. اما برای اجرای هر رویه، همانطور که در مطالب قبلی اشاره شد، نیاز به یکسری پارامتر و متغیر داریم که در جدول 1 آورده شده است و آن‌ها را تحت عنوان «رکورد فعال‌سازی» می‌شناسیم و به طور خلاصه اطلاعات لازم جهت اجرای یک رویه است.حال با داشتن چندین رویه در یک برنامه و برای اجرای آن‌ها نیاز به یکسری از رکورد‌های فعال‌سازی نیز داریم که اطلاعات اجرای رویه‌ها را ذخیره نمایند. برای پیاده‌سازی این ساختار و ذخیره این رکورد‌ها از پشته‌ای به نام «پشته کنترل» استفاده میشود. در این صورت وقتی یک رویه، رویه‌ی دیگری را فراخوانی کند، اجرای فراخوانی کننده تا زمانی که رویه‌ی فراخوانی شده به اجرای خود پایان بخشد، به تعویق می‌افتد. در این زمان رکورد فعال‌سازیِ روال فراخوانی شده روی پشته ذخیره می‌شود.با این فرض که گردش کنترل برنامه به روش ترتیبی است و زمانی که یک رویه فراخوانی می‌شود، کنترل آن به رویه‌ی فراخوانی شده انتقال می‌یابد، وقتی یک روال فراخوانی شده اجرا شد، کنترل برنامه دوباره به فراخوانی کننده باز می‌گردد. این نوع گردش کنترل باعث می‌شود که نمایش رکورد‌های فعال‌سازی به شکل درخت آسان‌تر شود. این سری‌ها به نام «درخت فعال‌سازی» نامیده می‌شوند. در شکل 9 نمونه ای از این درخت فعال سازی معادل یک قطعه کد آورده شده است.شکل 9 - نمونه ای از درخت فعال سازی معادل قطعه کد.7. ارسال پارامترهمانطور که گفته شد یک برنامه از رویه‌های گوناگون و مستقلی تشکیل شده است. اما جهت تشکیل یک برنامه این رویه‌ها نیاز است تا با یکدیگر ارتباط برقرار کنند. به این ترتیب مفهومی ‌به نام پارامتر شکل می‌گیرد که واسطه و وسیله‌ی ارتباطی میان رویه‌ها است.اما قبل از آن که با نحوه‌ی برقراری ارتباط میان رویه‌ها توسط پارامترها بپردازیم، لازم است تقسیم‌بندی‌های مختلفی که از پارامترها انجام شده است را مرور کنیم.7-1. پارامترهای R-Value و L-Value- پارامترهای R-Value: مقدار یک عبارت که قابل ریختن در یک متغیر است و همیشه در سمت راست عملگر انتساب قرار میگیرد را پارامتر R-Valueمی‌نامند.- پارامترهای L-Value: همچنین موقعیت حافظه و یا به عبارتی دیگر متغیری که در آن یک مقدار ریخته می‌شود و همیشه در سمت چپ عمیگر انتساب قرار دارد را نیز پارامتر L-Value می‌نامیم.7-2. پارامترهای رسمی‌و واقعی· پارامترهای رسمی (Formal Parameter): متغیرهایی که اطلاعات ارسال شده از سوی رویه‌ی فراخوانی کننده را دریافت می‌کنند به نام پارامترهای رسمی‌نامیده می‌شوند. این متغیرها در تعریف تابع فراخوانی شده نوشته می‌شوند.· پارامترهای واقعی(Actual Parameter): متغیرهایی که مقدار یا آدرس‌هایشان به رویه‌ی فراخوانی شده ارسال می‌شوند، به نام پارامترهای واقعی نامیده می‌شوند. این متغیرها در تابع فراخوانی به صورت آرگومان نامیده می‌شوند.پس از اطلاع از موارد بالا به روش‌های گوناگونی که جهت ارسال پارامترها استفاده می‌شود، می‌پردازیم:7-3. ارسال با مقدار | Pass by Valueدر مکانیسم ارسال با مقدار، رویه‌ی فراخوانی کننده، پارامترهای واقعی و R-Value را ارسال می‌کند و کامپایلر آن را در رکورد فعال‌سازی رویه‌ی فراخوانی شده قرار می‌دهد. پارامترهای رسمی‌مقادیر ارسالی نیز از سوی رویه‌ی فراخوانی کننده را نگهداری می‌شوند و اگر مقادیر نگهداری شده از سوی پارامترهای رسمی‌تغییر یابند، تأثیری بر روی پارامترهای واقعی نخواهد داشت.7-4. ارسال با ارجاع | Pass by Referenceدر مکانیسم ارسال با ارجاع، پارامتر واقعی و L-Value در رکورد فعال‌سازی رویه‌ی فراخوانی شده کپی می‌شود. بدین ترتیب رویه‌ی فراخوانی شده در واقع آدرس (موقعیت حافظه) پارامتر واقعی را می‌گیرد و پارامتر رسمی‌نیز به همان آدرس حافظه اشاره می‌کند. بنابراین اگر مقدار مورد اشاره از سوی پارامتر رسمی‌تغییر یابد، بر روی پارامتر واقعی نیز تأثیر می‌گذارد، چون هر دو به یک موقعیت حافظه اشاره دارند.7-5. ارسال با کپی-بازیابی | Pass by Copy-Restoreاین مکانیسم ارسال با کپی-بازیابی ارسال پارامتر مشابه روش ارسال با ارجاع است؛ با این تفاوت که تغییرات روی پارامترهای واقعی زمانی انجام می‌یابد که رویه‌ی فراخوانی شده، پایان گیرد. به محض فراخوانی تابع، مقادیر پارامترهای واقعی در رکورد فعال‌سازیِ رویه‌ی فراخوانی شده کپی می‌شوند. به این صورت تغییر پارامترهای رسمی‌ به طور همزمان روی پارامترهای واقعی تأثیر نمی‌گذارد؛ اما وقتی که رویه‌ی فراخوانی شده پایان یافت، L-Value‌های پارامترهای رسمی ‌به L-Value‌های پارامترهای واقعی کپی می‌شوند. برای مثال کد شکل10 یک ارسال با کپی-بازیابی را نشان می‌دهد.شکل 10 - نمونه ای از ارسال به صورت کپی-بازیابی.7-6. ارسال با نام | Pass by Nameزبان‌هایی مانند Algol روش جدیدی برای ارسال پارامتر دارند که مانند پیش پردازنده‌ها در زبان C عمل می‌کنند. در روش ارسال با نام[1]، نام رویه‌ی فراخوانی شده با بدنه واقعی آن جایگزین می‌شود. به این ترتیب متن عبارت‌های آرگومان را در فراخوانی رویه با پارامترهای متناظر در بدنه‌ی رویه تعویض می‌کند، بنابراین نمی‌تواند بر روی پارامترهای واقعی عمل کند و شبیه مکانیسم ارسال با ارجاع است.منابع1. Jeffrey D. Ullman, Ravi Sethi, Monica S. Lam, Alfred V. Aho; “Compilers principles, techniques, and tools”, Pearson, 20062. Tutorials point . “Compiler Design - Run-Time Environment” – 2020, https://www.tutorialspoint.com/compiler_design/compiler_design_runtime_environment.htm#:~:text=By%20runtime%2C%20we%20mean%20a,processes%20running%20in%20the%20system.3. Geeks for Geeks . “Runtime Environments in Compiler Design” – 2020, https://www.geeksforgeeks.org/runtime-environments-in-compiler-design</description>
                <category>محمد حسین موثقی نیا</category>
                <author>محمد حسین موثقی نیا</author>
                <pubDate>Sun, 22 Nov 2020 10:56:29 +0330</pubDate>
            </item>
                    <item>
                <title>Virtualization | مجازی سازی</title>
                <link>https://virgool.io/CE-SHAHED-publication/virtualization-qpll4tiacj42</link>
                <description>چکیدهیکی از مفاهیمی که در دهه اخیر در علوم کامپیوتر مورد بحث و چالش قرار گرفته است، بحث مجازی سازی است که مهم ترین دلایل آن بحث صرفه جویی در هزینه ی خرید و نگهداری سخت افزار ها و مصرف کم تر انرژی و توان و همین طور در بعضی موارد افزایش سرعت می باشد. در این مقاله به بررسی اجمالی مفاهیم اولیه مجازی سازی و همین طور نمونه های مختلف آن می پردازیم و در انتها مزایای اصلی استفاده از این روش را بیان می کنیم. 1. آشنایی با مجازی سازیدر ابتدا لازم است تا با مفهوم «مجازی‌سازی» به صورت خاص آشنا شویم و سپس به کاربرد ها و انواع آن در صنایع مختلف بپردازیم. مجازی سازی به معنای ایجاد محیط های متعدد شبیه سازی شده (به صورت نرم افزاری) و یا منابع تخصیص داده شده از یک یا چند منبع سخت افزاری محدود است. همانطور که از تعریف این مفهوم برمی‌آید، مهمترین دغدغه‌ی مورد نظر در این حوزه بحث محدودیت های ایجاد شده ناشی از سخت افزار مانند هزینه، مصرف و … است که باعث شده است این مورد در دنیای تکنولوژی مورد استفاده‌ی بسیار قرار گیرد. طبق نکته‌ی بیان شده هم به صورت منطقی هرجا که این هزینه (ناشی از سخت افزار) بیشتر باشد کاربرد و پیاده سازی این تکنولوژی هم بیشتر صورت می‌گیرد؛ مانند شرکت های بزرگ که به دنبال بهره وری بالا از منابع محدود هستند.2. مفهوم Hypervisorمجازی سازی به وسیله Hypervisor ها امکان پذیر می شود. به صورت کلی مجموعه ای از نرم افزار ها هستند که بر روی سخت افزار ما اجرا شده و وظیفه کنترل منابع سخت افزاری و تخصیص آن ها را به ماشین های مجازی (در بخش 4 توضیح خواهیم داد) را دارند که به دو دسته کلی type1 و type2 تقسیم بندی می شوند.1.2. معرفی Type 1در این دسته که به Bare Metal نیز معروف هستند، hypervisor به صورت مستقیم روی سخت افزار نصب می شود. سپس تمامی ماشین های مجازی بر روی آن نصب می شوند و Hypervisor صرفا مسئولیت مدیریت منابع و تخصیص آن ها به ماشین های مجازی را دارد. این روش معمول ترین روش استفاده از مجازی سازی است و در بازار بیشتر مشاهده می شود. (عکس شماره 1 این نوع را نمایش می دهد.)عكس 1 - Hypervisor Type1این روش بسیار امن است و تاخیر کم تری نسبت به دسته دوم و همین طور به حالت فیزیکی دارد.از جمله معروف ترین Hypervisor های این دسته عبارت است از VMware [vSphere / ESXi]، Microsoft Hyper-V، Citrix XenServer، KVM.2.2. معرفی Type 2در این دسته که به Hosted نیز معروف هستند، Hypervisor به صورت غیرمستقیم روی سخت افزار نصب می شود، به این معنی که بین Hypervisor و سخت افزار یک سیستم عامل که به Host OS معروف است قرار می گیرد. این روش غیرمتداول است و بیشتر در بین End-User ها کاربرد دارد و با کامپیوتر های شخصی اجرا می شود. (در عکس شماره 2 مشاهده می کنید.)عكس 2 - Hypervisor Type 2در این روش Host OS برای کاربر به صورت مستقیم قابل استفاده است.این روش نیز همانند دسته اول امن می باشد، اما تاخیر بیشتری نسبت به دسته اول دارد ولی باز هم نسبت به حالت فیزیکی تاخیر کم تری دارد.از جمله معروف ترین Hypervisor های این دسته عبارت است از  VMware WorkStationو Oracle Virtual box که بر روی تمامی سیتم عامل ها قابل نصب هستند و Parallels که در سیستم عامل های مک قابل استفاده است.3. مفهوم ماشین مجازی (VM)ماشین مجازی یا همان Virtual Machine مجموعه ای از نرم افزار ها هستند که بر روی Hypervisor نصب می شوند.دقیقا مثل سیستم عامل هایی که روی یک سخت افزار نصب می شوند، از ماشین های مجازی به عنوان محیطی شبیه سازی شده همانند سخت افزار اصلی، برای نصب سیستم عامل ها استفاده می شود. نکته اساسی این است که تمامی ماشین های مجازی از یک دیگر مستقل هستند و طبیعتا به تبع این موضوع تمامی سیستم عامل های نصب شده روی ماشین های مجازی نیز از یک دیگر مستقل خواهند بود. به دلیل همین مستقل بودن، تمامی ماشین های مجازی قابلیت حمل دارند، یعنی می توان ماشین مجازی را همانند یک فایل از سیستمی کپی و به سیستم دیگر منتقل کرد.4. انواع استفاده از مجازی سازیمجازی سازی به عنوان یک تکنولوژی در انواع و سطوح مختفی از لایه های کامپیوتری استفاده و پیاده میشود که در زیر 4 نوع از آن‌ها توضیح داده شده است:1.4. مجازی‌سازی سرور (Server Virtualization)این نوع از مجازی سازی راهکاری است که با استفاده از افزودن یک لایه انتزاعی، منابع یک سرور از جمله سیستم عامل‌ها، پروسه‌ها و ... را اصطلاحاً مخفی سازی می‌کند. (از دید کاربر) به عبارت دیگر، با اختصاص منابع سرور که در واقعیت به صورت سخت افزار هستند به صورت نرم افزاری، به کاربران این طور القا می‌شود که این سرویس دارای همان منابعی هست که به صورت نرم افزاری اختصاص داده شده است.مجازی سازی سرور دارای انواع مختلفی است:1.1.4. مجازی سازی کاملاین نوع - که بیشتر از اشاره به مجازی سازی سرور همین نوع است - همانطور که از نام آن برمی‌آید به معنای پیاده سازی تکنیک شبیه سازی کامل سخت افزار به صورت نرم افزار است. به صورتی که کاربر تشخیص نمیدهد که منبع مورد استفاده‌اش نرم افزاری است. (مفهوم انزوا – Isolation)2.1.4. مجازی سازی جزئی (Para-Virtualization) تکنیکی که باعث شبیه سازی قسمتی از سخت افزار لایه زیرین به صورت نرم افزاری می‌شود. بنابراین تنها قسمتی از قابلیت‌های سخت افزار مانند آدرس دهی فضای حافظه به صورت مجازی پیاده سازی میشود که با وجود راحت‌تر کردن امکان پیاده‌سازی باعث محدودیت نیز می‌شود.3.1.4. مجازی سازی سیستم عاملهمانطو که از نام این نوع نیز میتوان حدس زد، مجازی سازی در بستر سیستم عاملِ پیاده شده بر روی سخت افزار به جای استفاده از Hypervisor صورت می‌گیرد.به این معنا که سیستم عامل نصب شده تمامی وظایف Hypervisor را بر عهده میگیرد و در عوض تمامی VMها محدود به اجرا در همین سیستم عامل هستند.2.4. مجازی سازی شبکه های کامپیوتری (Network Virtualization)مباحث شبکه های کامپیوتری به طور کلی متشکل از مفاهیمی است که بر روی سخت‌افزارهایی پیاده سازی شده است. در مجازی سازی شبکه، هدف این است که اتصال بین مفاهیم شبکه و سخت افزار قطع شده و در عوض آن مفاهیم به صورت نرم افزاری تعریف و پیاده سازی گردد.از جمله مصداق های این تکنیک ایجاد قطعاتی مجازی مانند vSwitch، vRouter، vNIC و … است که هر کدام نظیر مورد سخت افزاری خود می‌باشد. به عنوان مثال در تصویر شماره 3 تشکیل شبکه‌ای مجازی از همین قطعات را مشاهده می‌کنید.عكس 3 - شمای کلی مجازی سازی شبکه3.4. مجازی سازی حافظه (Storage Virtualization)نوع سوم مجازی سازی نیز مختص به ساختار های حافظه ای است. مانند تکنیک های گذشته در این قسمت هم هدف پیاده سازی سخت افزارهای مربوط به حافظه به صورت مجازی و نرم افزاری است که با توجه به لایه های مختلف حافظه در 4 سطح Block، Disk، Tape و File پیاده و تقسیم می‌شود.3.4. مجازی سازی نرم افزار (Application Virtualization)همانطور که گفته شد تکنولوژی مجازی سازی با اضافه کردن یک لایه انتزاعی به مجموعه لایه های سیستم جهت مخفی کردن لایه سخت افزار صورت میگیرد. همین مفهوم در مورد نرم افزار به این صورت است که نرم افزار مورد نظر از سمت سیستم عامل مخفی شده و این طور به نظر میرسد که به طور مستقیم در حال ارتباط با سخت افزار است. با این توضیح مجازی سازی نرم افزار با مجازی سازی دسکتاپ که آن هم با افزودن مفهوم انتزاع به محیط دسکتاپ صورت میگیرد پیوند عمیقی دارد و در واقع هم نوع هستند. (البته در برخی متون جدا در نظر گرفته شده‌اند) تکنیکی که به کار می‌رود سبب میشود تا نرم افزار مورد نظر به جای اجرا توسط اجزای مختلف سیستم عامل، به صورت مستقل اجرا شود و در نتیجه نرم افزارهای گوناگون که به صورت عادی امکان اجرای همزمان آن‌ها به دلیل محدودیت در سیستم عامل وجود نداشت، ممکن می‌شود.5. مزیت های استفاده از مجازی سازی1.5. بهره برداری کامل و بیشتر(Utilization)یکی از مهم ترین نکاتی که با استفاده از مجازی سازی می توان به آن دست یافت، افزایش بهره وری از سخت افزار سیستم می باشد؛ چرا که با استفاده از مجازی سازی، چندین سیستم عامل روی سخت افزار شروع به کار می کنند و هم از CPU و هم از Memory و دیگر منابع سخت افزاری به صورت بهتری استفاده می شود و ماکسیمم استفاده صورت می گیرد.به این موضوع از دو جهت می توان نگاه کرد؛ نگاه اول این که در داخل دیتاسنتر ها و سرور سنتر ها و... می توان با استفاده از مجازی سازی، از ماکسیمم توان سیستم ها استفاده نمود. نگاه دوم از سمت کاربر است که، کاربر به جای خرید یک سخت افزار بالاتر از سطح نیاز خودش، می تواند با استفاده از روش هایی که در قسمت 5 توضیح داده شد، به صورت بهتری از توان سرور های دیگر استفاده و نیاز های خود را برطرف کند.2.5. قابلیت جابه جایی آسان (Easy Portable)یکی دیگر از قابلیت های مهم دیگر که به دلیل مجازی بودن برای ما فراهم می شود، قابلیت جابه جایی آسان سیستم عامل های مجازی می باشد. یعنی به صورت یک فایل عادی می توان کل سیستم عامل را از یک سیستم کپی کرد و به سیستم دیگر منتقل کرد.3.5. ایزوله بودن هر ماشین مجازی (Isolated VMs)با توجه به ماهیت مجازی سازی، تمامی ماشین های مجازی از یک دیگر به صورت کامل مستقل و ایزوله هستند. این قابلیت را می توان یکی از مزایای مجازی سازی به حساب آورد؛ چرا که شرایط طبیعی ای را برای ما فراهم می کند و می تواند همانند محیط واقعی شرایط را برای ما شبیه سازی کند.یکی از مزایا این قابلیت این است که ابتداً امنیت ما را تامین می کند و در بسیاری از موارد فایل های خطرناک و مشکوک را می توان با استفاده از سیستم عامل های مجازی مورد بررسی قرار داد و یا عملیات ها و یا برنامه های مشکوک و یا آزمایش نشده را با استفاده از این سیستم عامل های مجازی اجرا کرد تا به منابع اصلی سیستم آسیبی وارد نکند. مزایای دیگری که برای این قابلیت می توان نام برد، بحث جداسازی کاربر ها و سیستم ها از هم می باشد و ایجاد این قابلیت که بتوان با استفاده از یک سیستم، چندین یوزر و چندین سیستم عامل کاملا مجزا (برای مواردی که در قسمت 5 به آن پرداختیم) پیاده سازی کرد؛ چرا که اگر این ایزوله بودن نبود، نمی توانسیتم چندین سیستم عامل بی ربط به یکدیگر را در کنار هم اجرا نمود.4.5. قابلیت اتکای بالا و امنیت و کاهش زمان خاموش بودن (High Reliability and Safety)با توجه به این که ماشین های مجازی همانند فایل هستند، در صورتی که یکی از ماشین ها دچار مشکل شود؛ به راحتی می توان ماشین دیگری را جایگزین آن ها کرد.هم به این شکل که یک ماشین مجازی up برای جایگزین کردن با ماشین دچار مشکل شده وجود داشته باشد، و حتی اگر up هم نباشد، می توان به راحتی فایل ماشین مجازی جایگزین را به سرعت اجرا کرد و جایگزین ماشین قبلی نمود.5.5. چالاکی و سرعت (Agility and Speed)یکی از موارد دیگر که مزیت مناسبی برای مجازی سازی می باشد، بحث سرعت و چالاکی این سیستم هاست، چرا که به دلیل این که ارتباط چند ماشین مجازی که روی یک سرور حضور دارند با یکدیگری به صورت مستقیم می تواند برقرار شود و از طریق ارتباطات CPU می توانند ارسال اطلاعات به یکدیگری داشته باشند؛ سرعت ارسال و دریافت اطلاعات بسیار بالاتر از شبکه های واقعی می باشد.6.5. صرفه جویی در توان و انرژی (Save Energy and Power )به دلیل این که سیستم های مجازی نسبت به سیستم های غیرمجازی از منابع کم تری استفاده می کنند و تعداد سرور ها و ماشین های کم تر فیزیکی ای وجود دارد، نمودار تفاوت میزان مصرف انرژی در حالت فیزیکی و حالت مجازی بسیار متفاوت است و میزان انرژی و توانی که در حالت مجازی مصرف می شود با توجه به بحث بهره وری مناسب از سیستم ها، بسیار کم تر از حالت فیزیکی می باشد.7.5. صرفه جویی در هزینه (Save Cost)با توجه به این که در حالت مجازی تعداد سرور ها و سیستم های خریداری شده به صورت نمایی کاهش می یابد و همین طور توان و انرژی مصرفی کاهش می یابد و مواردی از قبیل خنک کردن فضا، میزان مساحت فضای مورد نیاز و … کاهش می یابد، به تبع همین موضوع هزینه های دیتاسنتر ها و سرورسنتر ها نیز کاهش چشم گیری پیدا می کند.منابع1. VMware Co, https://www.vmware.com/solutions/virtualization.html2. Read Hat Co, https://www.redhat.com/en/topics/virtualization/what-is-virtualization3. Wikipedia contributors. (2020, May 25). Virtualization. In Wikipedia, The Free Encyclopedia. Retrieved 15:56, May 25, 2020, from https://en.wikipedia.org/w/index.php?title=Virtualization&amp;amp;amp;oldid=9586945934. IBM cloud team, https://www.youtube.com/watch?v=FZR0rG3HKIkمحمدحسین موثقی نیا و محمدحسین ولیخانیبهار 1399</description>
                <category>محمد حسین موثقی نیا</category>
                <author>محمد حسین موثقی نیا</author>
                <pubDate>Sat, 19 Sep 2020 10:04:31 +0430</pubDate>
            </item>
                    <item>
                <title>کلان داده یا همان Big Data چیست؟</title>
                <link>https://virgool.io/CE-SHAHED-publication/%DA%A9%D9%84%D8%A7%D9%86-%D8%AF%D8%A7%D8%AF%D9%87-%DB%8C%D8%A7-%D9%87%D9%85%D8%A7%D9%86-big-data-%DA%86%DB%8C%D8%B3%D8%AA-iqi2ryf3tw2r</link>
                <description>1. چکیدهدر این تحقیق تلاش شده است تا مفهوم Big Data مورد بحث قرار گرفته و بیان شود که ابتداً مفهوم داده چیست و سپس در چه مواقعی با داده های بزرگ سروکار خواهیم داشت و همین طور دسته بندی داده ها به چه شکلی است و از چه روش هایی برای ذخیره سازی و تحلیل این داده های بزرگ استفاده می شود. سپس نگاهی کلی به استفاده از مفاهیم هوش مصنوعی مثل یادگیری ماشین درباره داده های بزرگ می اندازیم.2. معنا شناسی کلمه ­­Dataمعنای لغت نامه: حقایق و آمار و ارقام ای که در کنار یکدیگر جمع شده اند به منظور رجوع یا آنالیز.معنای کاربردی: مقادیر، کاراکتر ها و سمبل ای که به وسیله عملیات های کامپیوتری تولید و به کار گرفته می شوند و می تواند ذخیره شده و یا به شکل سیگنال های الکتریکی ارسال شوند و در نوار های مغناطیسی یا نوری یا مکانیکی ذخیره شوند.کلمه Data حالت جمع کلمه Datum می باشد.3. انواع داده چیست ؟داده به چند دسته کلی تقسیم می شوند:متناعدادعکسصوتفیلماین دسته بندی یک دسته بندی کلی است، اما باید توجه داشت که برای مثال طول و عرض جغرافیایی پدیده های طبیعی زمین، اطلاعات آب و هوایی، اطلاعات رشد گیاهان و بررسی های آزمایشگاهی، اطلاعات سیستم های حمل و نقلی عمومی و خصوصی و بسیاری دیگر از داده هایی که به صورت روزمره با آن ها درارتباط هسیتم نیز زیرمجموعه این موارد قرار می گیرند و جدای از این ها نیستند.4. خصوصیات کلان دادهبه صورت غیرآکادمیک و در محیط تجاری برای کلان داده‌ها و نحوه‌ی کار با آن‌ها چندین ویژگی منحصر به فرد می‌شمارند که هر یک از آن‌ها به یک بعد از این موضوع اشاره دارد. این ویژگی‌ها که با نام «وی‌های بیگ دیتا» (Vs of big data) شناخته می شوند (دلیل آن شروع هر یک از این خصوصیات با حرف V انگلیسی است)، به تعداد مختلفی بیان شده‌اند که به جهت رعایت اختصار در زیر به 5 مورد از آن‌ها اشاره شده است:4.1 . حجم (Volume)با توجه به اینکه بیش از ۹۰ درصد تمام داده‌های امروز در چند سال گذشته به دلیل گسترش سکوهای ارتباط جمعی ایجاد شده‌است، حجم عظیم داده‌ی تولید شده موجب شگفتی نیست. مقدار فعلی اطلاعات می‌تواند واقعا سرسام‌آور باشد و همین ویژگی است که به صورت کاملاً مشخص حتی در نام این حوزه (Big Data) دیده می‌شود. در اینجا چند مثال آورده شده‌است:· در هر دقیقه ۳۰۰ ساعت ویدئو در یوتیوب آپلود می‌شود.· تخمین زده می‌شود که ۱.۱ تریلیون عکس در سال ۲۰۱۶ گرفته شده‌است و این تعداد در سال ۲۰۱۷ به میزان ۹ درصد افزایش خواهد یافت. از آنجا که از هر عکس معمولاً چندین نمونه در محیط های گوناگون - خدمات وب، سایت‌های ارتباط جمعی و ... – وجود دارد، انتظار می‌رود تعداد کل عکس‌ها نیز از ۳.۹ تریلیون در سال ۲۰۱۶ به ۴.۷ هزار میلیارد در سال ۲۰۱۷ رشد داشته باشد.در سال ۲۰۱۶ تخمین زده شد که ترافیک هوایی جهانی بالغ بر6.2 اگزابایت (6.2 میلیارد گیگابایت) در ماه است.4.2 . سرعت (Velocity)این ویژگی همانطور که از نام آن برمی‌آید مربوط به سرعت تولید داده است که با توجه به گسترش وسایل ارتباطات و نیز شرکت حجم عظیمی از مردم جهان در آن‌ها بعید به نظر نمی‌رسد. اما شاید رو‌به‌رو شدن با اعداد و ارقام واقعی آن ما را طور دیگری با این وجه از کلان داده آشنا کند. البته به این موضوع بخش شماره 5 پرداخته شده است.4.3 . تنوع (Variety)تنوع، یکی از جالب‌ترین تحولات در تکنولوژی است، همانطور که اطلاعات گوناگونی روز به روز تبدیل به داده‌های دیجیتال می‌شوند. داده‌هایی که از داده‌های سنتی (داده‌های ساختاریافته – Structured Data) مانند اطلاعات یک نامه‌ی بانکی (تاریخ و زمان و ...) تا داده های غیرساختاریافته (Unstructured Data) مانند فایل‌های صوتی، تصاویر MRI، صفحات وب و ... را دربر میگیرد که در بخش شماره 8 به آن پرداخته خواهد شد.4.4 . صحت (Veracity)به نظر می‌رسد صحت برای داده‌های کلان یک ویژگی دور از دسترس باشد. از آنجا که هر یک از ویژگی‌های بالا افزایش می‌یابد، صحت (اعتماد یا اطمینان در داده‌ها) افت می‌کند. این مشابه با، اما نه یکسان، اعتبار (Validity) داده است. صحت به منشأ یا منبع قابلیت اطمینان داده‌ها، بافت آن و میزان معنی‌دار بودن آن با توجه به تحلیل آن اشاره دارد.به عنوان مثال در مورد داده‌های مربوط به آنچه که مردم در طی پنج سال گذشته در رستوران‌ها و این موارد خرید کرده‌اند پاسخ به سؤالاتی از قبیل، چه کسی این منبع این داده‌ها بوده است؟ آن‌ها در جمع‌آوری داده‌ها چه روشی را دنبال کردند؟ سازندگان داده‌ها اطلاعات را خلاصه می‌کنند؟ آیا اطلاعات توسط شخص دیگری ویرایش شده یا اصلاح شده‌اند؟ و ... برای تعیین صحت این اطلاعات ضروری است.دانش صحت اطلاعات به نوبه‌ی خود به ما کمک می‌کند تا خطرات مرتبط با تحلیل و تصمیمات کسب‌وکار را براساس این مجموعه داده‌ی خاص بیابیم.4.5 . ارزش (Value)آخرین، اما مسلماً مهم‌ترین ویژگی، ارزش است. اگر شما ارزش کسب‌وکار را از داده‌ها کسب نکنید، ویژگی‌های دیگر داده‌های بزرگ بی‌معنی هستند.ارزش قابل‌توجهی را می توان در داده‌های بزرگ یافت؛ از جمله: درک بهتر مشتریان، هدف گذاری بهتر بر روی آن، بهینه‌سازی فرآیندها و بهبود عملکرد دستگاه و ... . که البته این موضوع نیز با توجه به اهمیت آن به صورت جداگانه در یکی از عناوین مقاله آورده شده است.5. سرعت تولید دادهسرعت تولید داده در عصر حاضر بسیار بالاست، درصورتی که به روند رشد تعداد کاربران اینترنت نگاهی بکنیم، متوجه خواهیم شد که این رشد کاربران بسیار مشهود می باشد.(شکل 1) شکل 1 - سرعت رشد کاربران اینترنت – منبع سایت Demoاین افزایش کاربران تاثیرات زیادی دارد و مشهود ترین آن ها تولید محتوای بسیار بالا در شبکه های اجتماعی و سایت ها و رسانه های دیجیتال می باشد. در سال 2019 سرعت تولید داده در بعضی از شبکه های اجتماعی و سایت ها در شکل زیر آمده است که خود نشان دهنده سرعت بالای رشد داده در جهان است.(شکل 1)1. ­­ارزش کلان داده (Big Data Value)در عصر حاضر که از آن با نام «عصر اطلاعات» (Information Era) نیز یاد می‌شود، ارزش اطلاعات به طور چشمگیری ملموس است. به طوری که علت ایجاد شرکت‌های امنیتی در حوزه سایبری را در بسیاری از کشورها میتوان در این مقوله دانست.شکل 2 - هرم دانشبا این تعریف داده‌هایی که در فضای سایبر تولید و در اینترنت به اشتراک گذاشته می‌شوند روز به روز و با پیشرفت تکنولوژی‌های جمع آوری داده (Data Mining) اهمیت بیشتری پیدا می‌کنند. اما اگر بخواهیم به لحاظ علمی و مختصر به آن بنگریم ارزش این اطلاعات در 2 رویکرد قابل بررسی است.رویکرد اول، که مربوط به نتایج مراحل فرآوری داده است، هرمی را نشان می‌دهد که موسوم به «هرم دانش» (Knowledge Pyramid / DI-KW pyramid) است. در این هرم با فرآوری داده‌های خام و انجام عملیات‌های متعدد یک داده‌ی خام که در ابتدا شاید از ارزش کمی برخوردار باشد تبدیل به تحلیل یا مقاله‌ای پر ارزش می‌شود که در سطوح مدیریتی بالا از آن استفاده می‌شود.رویکرد دوم نیز مربوط به همان مراحل است اما به طور خاص به فرآیند، و نه نتیجه و محصول، می‌پردازد. به صورتی که در طی این مراحل که داده‌ی خام ورودی آن است ارزش یک داده افزایش پیدا می‌کند. البته این رویکرد بیشتر در فضای تجاری کاربرد دارد.شکل 3 – چرخه دست یابی به ارزش داده1. کاربردهای کلان دادهدر حاضر که به دلیل گستردگی وسایل ارتباطات جمعی، مقیاس بزرکی از داده در ابعاد مختلفی از زندگی اجتماعی در بستر اینترنت تولید می‌شود باعث شده تا شرکت‌ها و نهادهای مختلف با توجه و اهداف گوناگون با به کارگیری الگوریتم‌ها و تکنیک‌های داده‌کاوی و نیز با جمع‌آوری و ذخیره‌ی داده از این علم در راستای اهداف خود بهره گیرند که کاربردهای این علم را در بسیاری از حوزه‌ها تشکیل می‌دهد. برخی از این داده ها که در زندگی روزمره با آن برخورد می‌کنیم به صورت زیر است:توییت‌های ذخیره‌شده در سرورهای توییتراطلاعاتی که گوگل از ردیابی خودروهای سواری به‌دست می‌آوردمجموعه‌ای کامل از نتایج انتخابات محلی و ملی کشور که ابتدایی‌ترین رکوردها را نیز در بردارداطلاعات شرکت‌های بیمه درمانی درباره‌ی افرادی که تحت درمان قرار می‌گیرند، نوع معالجات آن‌ها و بیمارستان مورد نظر دارنداطلاعات لیست خریدها و مکان‌های ثبت شده در کارت‌های اعتباریاطلاعات زمان، مکان و مدت زمان فیلم‌هایی که افراد در نت‌فلیکس تماشا می‌کنندحال جدای از تأثیر این موضوع بر اقتصاد و تعاملاتی که در حوزه ی خرید و فروش و معامله ی داده انجام می‌شود که نمونه ای از آن را در افشای اطلاعات مشترکان توسط فیسبوک در سال 2018 و فروش آن به شرکتی مشاوره‌ای مشاهده شد، می‌خواهیم به صورت مختصر کاربردهای کلان داده را بررسی کنیم:1.1 . خدمات بهداشتی، درمانی و سلامتشرکت‌های بیمه سلامت و نیز نهادهای دولتی و بیمارستانی با روی آوردن به ثبت پرونده و اطلاعات به صورت دیجیتالی و تحلیل این داده‌ها از آن در تصمیمات خود استفاده می‌کنند. برای مثال تحلیل اطلاعات بیماران در طول سال می‌تواند به شرکت‌های بیمه‌ای در سرمایه‌گذاری در زمینه‌های خاصی از بیماری‌ها کمک کند.1.2 . صنعت انرژیاز کلان داده برای صرفه جویی در انرژی نیز می‌توان استفاده کرد. شرکتی به نام Xcel Energy از فناوری Smart grid  در ساختمان‌ها استفاده می‌کند. با این فناوری می‌توان میزان مصرف انرژی را کنترل و بهینه‌سازی کرد. علاوه بر این این شرکت به سازمان‌ها و کمپانی‌های مختلف پیشنهاداتی را برای بهبود در ساختن ساختمان‌هایشان و استفاده انرژی به صورت درست بهینه در بخش‌های مختلف ساختمان ارائه می‌دهد. تمامی این کارها به کمک کلان داده امکان پذیر است.1.3 . ورزشباید گفت بیشتر تیم‌های محبوب و معروف از کلان داده برای بهبود تیم و ورزشکاران خود استفاده می‌کنند. برای مثال آنالیزهای ویدیویی یا نصب سنسور روی بدن بازیکنان و جمع‌آوری اطلاعات بدنی و حرکتی آنها در حین فعالیت و … از کارهایی است که برای استفاده از بیگ دیتا در زمینه‌ی ورزش انجام می‌شود.1.4 . شبکه‌های اجتماعییکی از مهمترین کاربردهای این موضوع تحلیل شبکه‌های اجتماعی است. شناسایی چهره، تطبیق پروفایل و … مثال‌هایی از این کاربرد هستند. باید گفت شبکه‌های اجتماعی در ارتباط با بدنه اصلی جامعه هستند و مرتباً به روز می‌شوند. منبع و کانالی که قبل از به وجود آمدن این شبکه‌ها وجود نداشت و حالا می‌تواند به رایگان در اختیار شرکت‌ها به شرط رعایت حریم خصوصی افراد قرار بگیرد و به خصوص در علوم اجتماعی بسیار مفید واقع شود.1.5 . امنیت و تشخیص کلاهبرداریبرخی از نهاد‌های مالی و نیز بانک‌ها با استفاده از این داده‌ها تشخیص بسیاری از کلاهبرداری‌هایی که به واسطه‌ی عدم توانایی تحلیل حجم بالای اطلاعات توان انجام نبود را میسر ساخته‌اند. یک نمونه‌ی آن تشخیص کارت‌های تقلبی و کلاهبرداری کارت‌های بانکی است. به این صورت که با تحلیل فاصله زمانی و مکانیِ زمان و مکان استفاده از کارت بانکی و تحلیل آن (از نظر امکان‌پذیری بودن) تشخیص می‌دهند که کاربر این کارت مرتکب جرم شده است یا خیر.2. دسته بندی داده بزرگ (Big Data)برای داده های بزرگ (Big Data) دسته بندی های متنوعی مطرح شده است که البته این دسته بندی ها برای داده های عادی نیز صدق می کند، ولی معروف ترین دسته بندی که موجود است به شکل زیر می باشد:داده ساختار یافته (Structured Data)داده بدون ساختار (Unstructured Data)داده شبه ساختار یافته (Semi-Structured Data)2.1 . داده ساختار یافته (Structured Data)داده ساختاریافته به داده هایی گفته می شود که به گونه ای هستند که قابلیت ذخیره سازی به صورت خودکار و مرتب در داخل پایگاه های داده و فایل ها را دارند و امکان آنالیز آن ها به راحتی فراهم می باشد. این داده ها حدود 20 درصد داده های امروزه جهان را تشکیل می دهند.منابع تولید این گونه داده ها به دو دسته کلی 1.انسان، 2.کامپیوتر(ماشین) تقسیم می شوند.داده هایی که به وسیله انسان تولید می شود، داده هایی هستند مثل تمامی اطلاعاتی که وسیله انسان در سایت ها و سامانه های مجازی وارد می شوند مثل اسم، شماره تلفن، ایمیل، سن و ... یا شامل تمامی کلیک هایی که بر روی لینک ها نقاط مختلف سایت ها، حرکت های بازیکن های یک بازی کامپیوتری و ... هستند.داده هایی که به واسطه ماشین تولید می شوند نیز شامل طیف گسترده ای هستند، داده های سنسورها، وبلاگ ها، سیستم های مالی و اقتصادی، دستگاه های دارویی و درمانی و حفظ سلامتی، دستگاه های GPS و بسیاری دیگر از داده هایی که با سرعت بالایی در حال تولید هستند به خصوص که در دنیای امروز یکی از حوزه های پر استفاده و مطرح جهان بحث اینترنت اشیاء و خانه ها و شهر های هوشمند هستند که در این صورت سرعت تولید داده به صورت سرسام آوری افزایش خواهد یافت.دنیای آینده دنیایی خواهد بود که اتومبیل های خودران و خانه های هوشمندی که لوازم خود را به صورت خودکار تامین می کنند شاید ساده ترین دستگاه های تولید داده در آن زمان خواهند بود.با این همه باید به این موضوع توجه داشت که این دسته از داده ها تنها 20 درصد کل داده هایی است که در جهان تولید می شوند!2.2 . داده بدون ساختار (Unstructured Data)این داده ها شامل داده هایی هستند که به دلیل عدم تطابق نوع آن ها با یکدیگر امکان ذخیره سازی خودکار آن ها نیست، و در اکثر موارد لازم است تا در روند ذخیره سازی آن ها انسان دخالت کند.البته ذخیره سازی آن ها مشکل نیست، مرتب سازی ذخیره ها کار دشواری است، در حالت ساختاریافته به دلیل این که تمامی ریکورد ها داده هایی از یک نوع و شبیه به هم هستند، امکان ذخیره سازی مرتب آن ها به راحتی فراهم است و سپس آنالیز آن ها بر همین اساس صورت می گیرد. اما در حالت بدون ساختار به دلیل این که داده ها از انواع بسیار مختلفی هستند، ذخیره سازی آن ها به گونه ای که قابل آنالیز باشند بسیار دشوار و در بسیاری از موارد تقریبا غیر ممکن است.این داده ها حدود 80 درصد داده های امروزه جهان را تشکیل می دهند.منابع تولید این گونه داده ها به دو دسته کلی 1.انسان، 2.کامپیوتر(ماشین) تقسیم می شوند.داده هایی که توسط انسان ها تولید می شوند، داده هایی هستند مثل داده های شبکه های اجتماعی، داده های ذخیره شده در موبایل (مثل لیست تماس ها، پیامک ها، اطلاعات ذخیره شده اپلیکیشن ها و ...)، داده های موجود در وبسایت ها و ... ؛ این داده ها به گونه ای هستند که امکان این که به صورت مرتب ذخیره شوند تا بتوان آنالیز دقیقی روی آن ها انجام داد نیست. برای توضیح این موضوع برای مثال عکسی که شما در فیسبوک یا اینستاگرام آپلود می کنید یا فیلمی که در یوتیوب یا آپارات تماشا می کنید یا حتی پیامک هایی که رد و بدل می کنید همه این موارد زیر مجموعه این دسته قرار می گیرند.تحلیل این داده ها کار بسیار دشواری است، برای مثال فرض کنید در یک شرکت به شما گفته شده باشد که فیلم آموزشی راجع به یک موضوع خاص از خودتان ضبط کنید و در اختیار شرکت قرار دهید و همین موضوع را به تعداد خیلی زیادی از کارمندان دیگر شرکت نیز گفته باشند و موضوعات آموزشی هم متفاوت باشد. از سمت دیگر مدیران این شرکت به جهت اطمینان از این که این ویدیو های آموزشی واقعا مرتبط هستند و اطلاعات خوبی را ارائه می دهند، نیاز دارند تا ویدیو ها چک شود. اما این جا با این مشکل رو به رو می شوند که تعداد ویدیو ها بسیار زیاد است و هیچ راهکار کامپیوتری برای چک کردن ویدیو ها به صورت خودکار وجود ندارد. این نمونه ای از نوع داده های بدون ساختار است که نمی توان بدون دخالت انسان به آنالیز آن ها پرداخت. به عنوان مثال می توان به هیت مپ هایی که در سایت های مختلف به منظور کنترل رفتار مشتریان استفاده می شود اشاره کرد.(شکل 4)شکل 4 - هیت مپ سایت فیلیمو نوع دیگر تولید این داده ها توسط ماشین هاست، که می توان به عنوان مثال از عکس های ماهواره ها، داده های آزمایشگاهی از آزمایش های متفاوت، داده های راداری که از تکنولوژی های متفاوتی استفاده می کنند و...، همه این موارد از نوع داده هایی هستند که تحلیل آن ها بدون دخالت انسان امکان پذیر نیست؛ به عنوان مثال عکس های ماهواره ای به صورت متوالی و تعداد بسیار بالا گرفته می شود؛ برای این که متوجه شویم کدام عکس، عکس بهتری است و کیفت آن بالاتر است و موضوعات بهتری از کهکشان ها را و یا حتی از زمین را برای ما مشخص می کند، نیاز است تا انسان در روند کار دخالت کرده و این تفکیک را انجام دهد.1.1 . داده شبه ساختار یافته (Semi-structured Data)این داده ها شباهت زیادی به داده های ساختار نیافته دارند، به گونه ای که خط مشخصی بین آن ها وجود ندارد، هرچه علم روز بیشتر پیشرفت می کند و فناوری های جدیدی ابداء می شود، بسیاری از داده های ساختار نیافته را می توان با روش هایی آنالیز کرد و مرتب کرد تا بتوان بدون دخالت انسان به آنالیز آن ها بپردازیم. به همین دلیل بسیاری از داده ها در این دسته قرار می گیرند یعنی با روش هایی می توان به تحلیل آن ها پرداخت.امکان ذخیره سازی این نوع داده ها در پایگاه داده های عادی مقدور نیست و برای ذخیره سازی آن ها از روش های دیگری استفاده می شود که پایگاه های داده بدون ارتباط (Non-relational Databases) نام دارند. که در بخش 5.2 به توضیح آن می پردازیم.2. روش های ذخیره سازیبه طور کلی می توان روش های ذخیره سازی را به دو دسته تقسیم کرد:استفاده از فایل سیستم هااستفاده از پایگاه های داده2.1 . استفاده از فایل سیستم هایکی از روش های سنتی ذخیره سازی استفاده از فایل سیستم است، با استفاده از فایل ها و دایرکتوری ها می توان یک سیستم جامع برای ذخیره سازی هایی یک نرم افزار استفاده کرد. فایل سیستم ها انواع مختلفی دارند که از جمله معروف ترین های آن ها FAT و NTFS هستند. البته فایل سیستم ها گستره بزرگی دارند و این جا نمی خواهیم وارد توضیحات دقیق این موضوع شویم.2.2 . استفاده از پایگاه های دادهروش ذخیره سازی در پایگاه های داده تفاوت ویژه ای که با فایل ها دارد این است که داده ها در داخل جداول، گراف ها و یا نوع داده های خاصی ذخیره می شوند تا کاربری مناسبی برای موضوعی خاص داشته باشند. بسیاری از کارهای پرتکرار به صورت خودکاری روی پایگاه های داده تعریف شده است، و در زبان هایی که برای درخواست داده به این پایگاه های داده طراحی شده اند گنجانده شده است. که یکی از معروف ترین آن ها SQL است که مخفف Standard Query Language می باشد.پایگاه های داده دسته بندی های بسیاری دارند، در این جا به بعضی از آن ها اشاره می شود:پایگاه های داده متمرکز (Centralized DBs)پایگاه های داده غیرمتمرکز (Decentralized DBs)پایگاه های داده توزیع شده (Distributed DBs)پایگاه های داده رابطه ای (Relational DBs)پایگاه های داده غیر رابطه ای (Non-relational DBs)پایگاه های داده سلسله مراتبی (Hierarchical DBs)1.1.1 پایگاه های داده متمرکز (Centralized DBs)پایگاه های داده ای که تمامی داده ها در یک دیتابیس و به صورت متمرکز ذخیره می شوند و برای دسترسی به داده لازم است تا با همین دیتابیس ارتباط گرفته شود و داده ها تنها در همین جا موجود هستند.شکل 5 - پایگاه داده متمرکز1.1.2 پایگاه های داده غیرمتمرکز (Decentralized DBs)این پایگاه های داده همانند پایگاه های داده متمرکز هستند با این تفاوت که داده ها در یک نقطه ذخیره نمی شوند و به صورت پخش در سرور ها و پایگاه های داده متفاوتی ذخیره می شوند ولی این سرور ها به یک دیگر متصل هستند و داده های آن ها با یک دیگر هماهنگ است.شکل 6 - پایگاه داده غیرمتمرکز1.1.3 پایگاه های داده توزیع شده (Distributed DBs)این پایگاه های داده به گونه ای هستند که بتوانند داده ها را به صورت غیر متمرکز و در مراکز مختلف نگهداری کنند و نکته مهم این است که در این پایگاه های داده هر داده ذخیره شده در یک نود با نود دیگر متفاوت است و داده ها یکسان نیست.شکل 7 - پایگاه داده توزیع شده (نوعی بلاک چین)1.1.4 پایگاه های داده رابطه ای (Relational Databases)این پایگاه های داده که به پایگاه های داده سنتی معروف هستند به نحوی هستند که جداول آن ها به یک دیگر مرتبط هستند از جمله این پایگاه های داده می توان به Microsoft SQL Management System، MySQL و SQLite اشاره کرد. اتصالات جداول این پایگاه های داده به شکل های مختلفی است که توضیح مختصری در این باره ارائه می کنیم. انواع اتصالات : 1. یک به یک، 2. یک به چند، 3. چند به چند1. اتصالات یک به یک(one to one relationship): این اتصالات به گونه ایست که یک خط ذخیره شده در یک جدول ( اصطلاحا ریکورد(Record)) تنها به یک خط از جدول دیگری متصل است.مثال: فرض کنید در یک نرم افزار هر کاربر نام و نام خانوادگی آن در یک جدول ذخیره می شود، این کاربر علاوه بر این اطلاعات، اطلاعات محل سکونت و شماره تلفن نیز دارد. برای ذخیره سازی این اطلاعات بهتر است یک جدول مجزا برای این امر ایجاد شود و به جدول کاربر متصل شود. این اتصال یک اتصال یک به یک است.شکل 8 - نمونه ارتباط یک به یک پایگاه داده 1. اتصالات یک به چند(one to many relationship): این اتصالات به گونه ایست که یک خط ذخیره شده در یک جدول به بیش از یک خط در جدول دیگر متصل است.مثال: فرض کنید یک جدول داشته باشیم که شهر ها در آن ذخیره شده باشند، و علاوه بر این یک جدول داشته باشیم که کاربران ذخیره شده باشند، هر کاربر ساکن یک شهر است. اما اگر برعکس نگاه کنیم خواهیم دید که هر شهر به چندین کاربر متصل می شود، برای جلوگیری از این که اسم شهر ها در جدول شهر ها تکرار شود یک اتصال یک به چند از شهر به جدول کاربر متصل می کنیم.شکل 9 - نمونه ارتباط یک به چند پایگاه داده 1. اتصالات چند به چند (many to many relationship): این اتصالات به گونه ایست که چند خط ذخیره شده در یک جدول به چند خط دیگر از جدول دیگر متصل هستند.مثال: یک کتاب ممکن است چند نویسنده داشته باشد و از طرفی هر نویسنده چندین کتاب نوشته است. این یک رابطه چند به چند است؛ برای این منظور لازم است از یک جدول واسط(pivot-table) استفاده کنیم تا بتوانیم ارتباط موجود را ایجاد کنیم.شکل 10 - نمونه ارتباط چند به چند پایگاه داده1.1.1 پایگاه های داده غیر رابطه ای (Non-relational Databases)این پایگاه های داده که به پایگاه های داده NoSQL معروف هستند به نحوی هستند که همانند پایگاه های داده سنتی دارای جدول و ارتباط نیستند؛ بلکه به شکل های متفاوتی هستند که به آن ها اشاره کوتاهی می کنیم:پایگاه Key-Value: این شکل ذخیره سازی بسیار ساده داده ها را ذخیره می کند، یعنی یک keyدارد که برای شناسایی داده است و متمایز کردن آن از دیگران و یک value که مقدار مورد نظر برای ذخیره سازی است. نمونه ای از این نوع ذخیره سازی در مرورگر های وب می باشد که داده های سایت ها را به این شکل ذخیره می کنند. به عنوان مثال در شکل 11 یک نمونه از این نوع ذخیره سازی آمده است.شکل 11 – پایگاه داده Key-Value پایگاه Document-Oriented: این شکل ذخیره سازی به گونه ای است که برای ذخیره سازی داده های همانند JSON عمل می کند، یعنی به جای ایجاد جداول متعدد، یک جدول ایجاد کرده و به صورت شیء گونه ارتباط بین موجودیت ها را برقرار می کند؛ به عنوان مثال در شکل بالا برای ذخیره سازی یک کاربر و محل زندگی او، محل زندگی را به عنوان یکی از JSON ها داخل JSON اطلاعات خود کاربر ذخیره می کند. به عنوان مثال در شکل 12 یک نمونه از این نوع ذخیره سازی آمده است. ( JSON: JavaScript Object Notation)شکل 12 – نمونه ای از JSON پایگاه داده Document-Orientedپایگاه Graph: این روش ذخیره سازی برای داده های بسیار گسترده به کار می رود که از تکنیک های گراف ها برای ذخیره سازی داده استفاده می کند که در این تکنیک ها هم یال ها و هم node ها داده حمل می کنند. در بیشتر شبکه های اجتماعی برای ذخیره سازی داده از این روش استفاده می شود. به عنوان مثال در شکل 13 یک نمونه از این نوع ذخیره سازی آمده است.شکل 13 – پایگاه داده Graphپایگاه Wide-Column: این روش شباهت زیادی به روش رابطه ای دارد، با این تفاوت که بجای ذخیره سازی داده به صورت ردیفی، داده ها در یک ردیف و در تعداد ستون های گسترده ذخیره می شوند. به عنوان مثال در شکل 14 یک نمونه از این نوع ذخیره سازی آمده است.شکل 14 – پایگاه داده Wide-Column1.1.1 پایگاه های داده سلسله مراتبی (Hierarchical DBs)این پایگاه های داده به نحوی عمل می کنند که داده ها را به شکل یک درخت و سلسله مراتبی ذخیره می کنند و به یک دیگر متصل هستند. یعنی به عنوان مثال داده های شخصی افراد مثل آدرس خانه و ... که مربوط به یک کاربر هستند در سطح دوم ذخیره می شوند و به همین ترتیب ادامه می دهد.توجه به این نکته ضروری است که این دسته بندی هایی که برای پایگاه های داده نام بردیم، لزوما مستقل از هم نیستند و ممکن است در بسیاری از موارد به صورت ترکیبی از چند دسته بندی اجرا شود.ذکر این نکته مهم است که در بسیار از موارد برای کار کردن با Big Data لازم است از file systems ها استفاده شود زیرا داده ها به نحوی هستند که حتی امکان ذخیره سازی آن ها به دلایل مختلف مثل زمانبر بودن، نیازمند بودن به دخالت انسان و ... در پایگاه های داده غیر رابطه ای هم فراهم نمی باشد.1. روش تحلیل MapReduceاین روش که در بعضی موارد به اشتباه با روش های ذخیره سازی مقایسه می شود، به نوعی می توان گفت روشی است برای به دست آوردن و کشف داده به صورت همزمان.این روش به گونه ای عمل می کند که تعدادی ورودی دریافت می کند و ابتدا ورودی ها را به دست هایی می شکند (split) سپس هر یک را به شاخه ای موازی ارائه می دهد تا تحیلی روی این داده ها صورت گیرد (map) سپس عملیات کاهش صورت می گیرد و دسته ها مرتب می شوند (reduce) و پس از این خروجی ها ارائه می شوند.(شکل 15) البته ممکن است مراحل بیشتری در این بین انجام شود اما این مراحل سه گانه، مراحل اصلی این روش هستند.شکل 15 – روش Map-reduceبرای این منظور فریم وورک های متفاوتی وجود دارد که از جمله محبوب ترین های آن ها می توان به Hadoop و Spark و Flink اشاره کرد.1. علم داده چیست؟با توجه حجم بالای داده های تولید شده در هر دقیقه این موضوع بسیار بدیهیست که برای تحلیل این داده ها نیاز به دانش های گسترده ای در حوزه های مختلف است که بتوان این داده ها را مرتب کرد و تحلیل نمود.شاید این مسئله مورد سوال قرار گیرد که تحلیل این داده ها چه سودی برای ما خواهد داشت؟ اما همان طور که در بخش های قبل اشاره کردیم این خود داده نیست که برای ما ارزشمند است؛ بلکه تحلیل داده است که به آن ارزش می بخشد وگرنه داشتن داده های متفاوت تا وقتی نتوان از آن ها استفاده مفیدی کرد سودی برای ما نخواهد داشت.امروز بسیاری از تجارت ها به تحلیل داده های مشتریان خود و مشتریان احتمالی خود و حتی افرادی که از آن ها خرید نمی کنند می پردازند تا بتوانند ابتداً مشتریان خود را حفظ، مشتریان احتمالی را راغب تر به خرید و مشکلی که افرادی غیر مشتری با این تجارت دارند را حل کنند تا حتی بتوانند آن ها را نیز جذب کنند. ازجمله این تلاش ها می توان به تحلیل هایی که اکثر سایت ها امروزه با استفاده از ابزار های تحلیل گر داده مثل Google Analytics , Mouse Flow , Optimizely و ... به تحلیل رفتار افرادی که سایت آن ها را مشاهده می کنند می پردازند. علاوه بر این بسیاری از شرکت ها مثل Facebook , Google , Netflix و ... نیز خود با استفاده از ابزار های خاص و تحلیل های مختص خودشان به تحلیل رفتار مشتریان خود می پردازند و حتی بسیاری از ابزار های مفید برای آنالیز را خود آن ها به بازار ارائه می دهند.برای تمامی این تحلیل ها نیازمند شناخت راجع به روند تولید داده، نحوه های مختلف آنالیز داده و تحلیل آن و همین طور نحوه های ویژوالایز کردن آن ها بسیار حائذ اهمیت می شود؛ و به همین دلیل بسیاری از شرکت ها نیرو های خاصی برای تحلیل داده و آنالیز آنها و ارائه پیشنهادات در این حوزه دارند.1. ارتباط ماشین لرنینگ با علم داده1.1 ماشین لرنینگ چیست؟تعریف ساده ای که از ماشین لرنینگ می توان ارائه کرد این است که؛ با ارائه مثال، ایجاد تجربه برای ماشین، ارائه ورودی های خاص به ماشین این توانایی را بدهیم که بدون دخالت انسان شروع به یادگیری کند و در آزمایش ها و تصمیم گیری های بعدی بتواند براساس مثال ها و ورودی های اولیه تصمیمات مناسب تری بگیرد.1.2 حوزه های علم دادهتقسم بندی شکل 16 یکی از معروف ترین تقسیم بندی های علم داده می باشد که طبق آن کل مباحث هوش مصنوعی و ماشین لرنینگ زیرمجموعه علم داده به حساب می آیند.شکل 16 – حوزه های علم داده1.3 ارتباط ماشین لرنینگ و علم دادهماشین لرنینگ و دیپ لرنینگ برای آنالیز داده مورد استفاده قرار می گیرد تا بتواند اطلاعات مفیدی از آن ها استخراج کند. سپس این اطلاعات استخراج شده را در اختیار شما می گذارد و می توان از آن برای رشد تجارت استفاده نمود. به عنوان مثال شرکت های فیلم سازی ای مثل NETFLIX می توانند با تحلیل رفتار مشتریان خود به موضوعات مختلفی پی ببرند به عنوان مثال علایق آن ها را تشخصی دهند و بر آن اساس فیلم های موثرتر و پربیننده تری بسازند و یا داده های علایق را به شرکت های ارائه دهنده خدمات مختلف بفروشند تا آن ها بر این اساس کالاهایی تولید کنند که کاربران علاقه مند باشند به آن ها و همین طور می تواند تبلیغات موثری در حوزه های مختلف داشته باشد و به صورت کلی می توان شرکت های فیلم سازی را یکی از موثر ترین شرکت ها در حوزه تجارت دانست که با علایق و احساسات مردم در ارتباط هستند؛ حال این نکته قابل توجه است که با توجه به گستردگی کاربران شرکت ها آیا می توان این عملیات شناخت مشتریان و رفتار آن ها را به وسیله انسان ها انجام داد؟ پاسخ بدیهیست؛ مشخص است که اگر انسان عهده دار این مسئولیت شود به دلیل خطا های انسانی و از آن مهم تر حجم انبوه داده یا ممکن است نتایج اشتباهی را به دست آورد و حتی اگر به احتمال کمی به تمامی نتایج درست دست پیدا کنیم انقدر زمان بر خواهد بود که اصطلاحا داده طراوت خود را از دست داده است و دیگر کاربرد چندانی ندارد. به همین دلایل و دلایل متعدد دیگر لازم است که روش های یادگیری ماشین و روش های سریعی را دخیل کنیم تا بتوان به سرعت بالایی برای تحلیل دست پیدا کنیم.به امید موفقیتمحمدحسین موثقی نیا، محمدحسین ولیخانی</description>
                <category>محمد حسین موثقی نیا</category>
                <author>محمد حسین موثقی نیا</author>
                <pubDate>Mon, 29 Jun 2020 22:54:37 +0430</pubDate>
            </item>
            </channel>
</rss>