<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های امیررضا حاجاتی</title><link>https://virgool.ir/feed/@itsamirrezah</link><description>یه چیزهایی رو یاد میگیرم و سعی می کنم به دیگران یاد بدم... / دانشجوی ارشد نرم افزار</description><language>fa</language><pubDate>2026-11-12 02:37:30</pubDate><image><url>https://files.virgool.ir/upload/users/38722/avatar/uABdMI.png</url><title>امیررضا حاجاتی</title><link>https://virgool.ir/@itsamirrezah</link></image><item><title>برنامه کووید ۱۹</title><link>https://virgool.ir/@itsamirrezah/برنامه-کووید-۱۹-zs8erg6rwqlp</link><description>covid-19 trackerدر این نوشته تجربم رو از نوشتن برنامه COVID-19 Tracker که اخیرا در گیت‌هاب منتشر کردم، به اشتراک می‌گذارم.این برنامه آمار مبتلاهای کووید ۱۹ در سراسر جهان رو ارائه می‌کنه. البته باید بگم هدفم از این پروژه ارائه یک اپلیکیشن الزاما کاربردی نبود. هدف صرفا تمرین با Google Map API، RxJava، کتابخانه‌های نمایش چارت، و کاتلین بود. سعی کردم تا حد ممکن، یوزر اینترفیس قابل قبولی هم داشته باشه.لینک ریپازیتوری: https://github.com/itsamirrezah/COVID-19 لینک دانلود APKاین دومین ریپازیتوری بود که با کاتلین نوشتم و مثل دفعه قبل کار باهاش لذت بخش بود. با وجود اینکه خیلی تلاش کردم تا به کاتلین مهاجرت نکنم الان بعد از دو تجربه کوچک، بعید بدونم به این زودی‌ها برای نوشتن برنامه اندرویدی به جاوا برگردم. ویژگی‌هایی مثل data classes, extension function, null safety, smart casting و کم شدن محسوس boilerplate code ها و خیلی چیزهای دیگه در کنار سادگی زبان کار هر برنامه‌ نویسی رو آسون می‌کنند.برای نمایش چارت‌ها از کتابخونه قدرتمند MPAndroidChart استفاده کردم. تقریبا هر چارتی با استفاده از این کتابخونه قابل پیاده‌سازیه. اگر مشکلی هم در حین پیاده‌سازی داشته باشید با مطالعه issue های مرتبط و یا پروژه Example کتابخونه به جوابتون می‌رسید.برای گرفتن دیتای مبتلاهای کرونا ویروس در روزای اول از اِی‌پی‌آی ExpDev07/coronavirus-tracker-api استفاده می‌کردم. اون موقع خیلی خوب کار می‌کرد ولی بعدا بخاطر مشکلاتی که پیدا کرد به Novel COVID API مهاجرت کردم. اگه بخوام مختصرا تجربم رو از کار با این دو API بگم، Novel COVID امکانات بیشتری رو در اختیارتون میذاره، کامیونیتی فعال‌تری داره ولی در کنار این امکانات از دو مشکل کوچک هم رنج می‌بره: ۱. آمار لحظه‌ای برخی از کشورها با آمار روز‌های قبل تطابق ندارد. (چیزی کمتر از ۲٪ کشورها) ۲. امکان دسترسی به تایم لاین روزانه مناطق خود مختار وجود ندارد. ( مثلا Isle Of Man). البته که این‌ها مشکلات بزرگی نیستند و میشه ازشون چشم پوشی کرد.در مورد coronavirus-tracker باید بگم در این API از ساختار مناسبی استفاده ‌میشه، عدم تطابق در دیتاها وجود ندارد، دسترسی به اطلاعات تایم لاین همه مناطق و کشورها ممکنه ولی متاسفانه اخیرا در ورژن ۲ API، دیتای مربوط به مبتلاهای بهبود یافته‌ها منتشر نمیشه. ورژن ۱ دیتای بهبود یافته‌ها رو نمایش میده ولی response time نسبتا بدی داره. ضمنا امکانات کمی هم در اختیارتون میذاره. به عنوان مثال برای نمایش تایم لاین روزانه در سراسر جهان باید با یک رکوئست، تایم لاین تمام کشورها رو دریافت می‌کردم (response time این رکوئست گاهی حتی به ۱۵ ثانیه هم می‌رسید)‌ و با پیمایش تایم لاین همه کشورها، تایم لاین جهانی ساخته می‌شد. این‌کارو در این کامیت انجام دادم هرچند بعد از سوئیچ به Novel API دیگه نیازی به این تکه کد نبود.مطمئنا ریپازیتوری نهایی به بهترین و بهینه ترین روش ممکن نوشته نشده، پس اگر ایرادی در پروژه مشاهده می‌کنید با مشارکت در پروژه و یا حتی با باز کردن Issue به بهبود اون کمک کنید. از هر کمک شما استقبال میشه (:اگه سوال، انتقاد یا پیشنهادی دارید می‌تونید یا زیر همین پست مطرح کنید یا از طریق توئیتر و تلگرام با من در تماس باشید.</description><category>امیررضا حاجاتی</category><author>امیررضا حاجاتی</author><pubDate>Tue, 28 Apr 2020 02:26:32 +0430</pubDate></item><item><title>رویکرد جدید؛ یک اکتیویتی برای هر اپلیکیشن کافیه! (۲)</title><link>https://virgool.ir/@itsamirrezah/رویکرد-جدید؛-یک-اکتیویتی-برای-هر-اپلیکیشن-کافیه-۲-k6g3pkrkmdsn</link><description>این نوشته دومین و آخرین بخش از آموزش ابزار Navigation Component در برنامه‌نویسی اندروید هست، اگر با این ابزار آشنایی ندارید پیشنهاد می‌کنم قبل از خواندن این متن، نوشته رویکرد جدید؛ یک اکتیویتی برای هر اپلیکیشین کافیه (1) رو مطالعه کنید.در بخش اول این آموزش در مورد اینکه ابزار Navigation چیه و چطوری کار می‌کنه حرف زدیم، در این نوشته به پیاده‌سازی دو مورد کاربردی دیگه در کار با Navigation می‌پردازیم:انتقال داده در هنگام جابجایی با استفاده از پلاگین Safe Argsپیاده‌سازی طرح‌‌های پیچیده‌تر با استفاده از کلاس کمکی NavigationUI (طرح‌هایی مثل BottomNavigationView، NavigationDrawer و غیره )لینک مثال‌های این نوشته در گیت‌هاب: انتقال داده با استفاده از پلاگین SafeArgs https://github.com/itsamirrezah/SimpleNavigationComponent/tree/Navigation-SafeArgs ۲. پیاده‌سازی BottomNavigationView با استفاده از Navigation https://github.com/itsamirrezah/SimpleNavigationComponent/tree/Navigation-BottomNavigationView انتقال داده بین Destination هایکی دیگه از ویژگی‌های Navigation، انتقال داده در زمان جابجایی بین Destination ها است. روش کار به این صورت که آرگومانی که می‌خواهیم از یک صفحه به صفحه بعدی ارسال بشه رو باید در فایل گراف مسیریابی معرفی کنیم. برای این‌کار از تگ &lt;argument&gt; استفاده می‌کنیم تا در فایل گراف مسیریابی نوع داده، مقدار پیشفرض و نام متغیرمون رو مشخص کنیم. &lt;argument&gt; باید درون تگ  Destination مقصد معرفی بشه.اضافه کردن argument به صفحه Destination مقصدتغییرات در محیط Designاضافه کردن argument به Destination مقصدتغییرات در محیط Text https://gist.github.com/itsamirrezah/d36579003f32945cfb9d439805d585c4 ویژگی‌های مهم argument:android:nameیک نام منحصر به فرد برای آرگومان انتخاب می‌کنیم تا بعدا با استفاده از این نام به مقدار اون دسترسی پیدا کنیم.app:argTypeنوع داده‌ای متغیرandroid:defaultValueمقدار پیشفرض متغیرلیستی از انواع تایپ‌های داده‌ای که Navigation اون‌ها رو پشتیبانی می‌کنه: لینکخب حالا می‌رسیم به قسمت اصلی کار، یعنی ارسال داده‌ها. تاحالا هیچ داده‌ای ارسال نکردیم فقط یک سری سیاست در گراف مسیریابی مشخص کردیم و گفتیم قراره از این صفحه به فلان صفحه، داده‌ هایی با این ویژگی‌ها ارسال بشه.برای ارسال و دریافت مقادیر بین صفحات باید از پلاگین Safe Args استفاده کنیم. این پلاگین برای دسترسی امن به آرگومان‌های گراف مسیریابی طراحی شده و روش کارش هم به این صورت که براساس آرگومان‌های ارسال شده، ‌Destination‌ های مبدا و مقصد یک مجموعه کلاس به صورت اتوماتیک تولید می‌کنه و کاربر با استفاده از این کلاس‌ها می‌تونه مقادیر رو برای ارسال در صفحه مبدا مشخص کنه یا در مقصد اون‌ها رو دریافت کنه.اضافه کردن Safe Args به پروژه:۱. تغییرات در فایل ریشه (top-level) build.gradle:  https://gist.github.com/itsamirrezah/c578d9039da0b3b8fda9b6462b33f593 ۲. فعال سازی پلاگین در فایلbuild.gradle(app): https://gist.github.com/itsamirrezah/195fe43d87937887d967ae2041cb535a گفتیم روش کار Safe Args به این صورت‌ که یه سری کلاس، متد و فیلد رو براساس سیاست‌های گراف مسیریابی تولید می‌کنه. حالا می‌خواهیم کمی بیشتر وارد جزئیات این کار بشیم. به طور کلی Safe Args براساس سه پارامتر مهم (در گراف مسیریابی)‌کلاس یا متد تولید می‌کنه. Destination مبدا، Destination مقصد و Action مرتبط.برای هر Destination مبدا یک کلاس تولید میشه که دقیقا با نام خود Destination شروع میشه و با کلمه «Directions» به اتمام می‌رسه. به عنوان مثال اگه نام Destination مبدا شما FragmentA باشه، Safe Args یک کلاس با نام FragmentADirectionsتولید می‌کنه.برای هر action ( اکشنی که Destination مبدا رو به مقصد متصل می‌کنه!) یک کلاس داخلی (Inner class) درون کلاس «…Directions» تولید میشه. اسم این کلاس هم تقریباً شبیه به آیدی تگ &lt;action&gt; در گراف مسیریابی است. مثلا اگه آیدی &lt;action&gt; استفاده شده:‌ navigate_to_fragb باشه کلاسی با نام NavigateToFragb تولید میشه. بعلاوه در کلاس «…Direction» هم یک متد هم‌نام کلاس action تولید میشه که وظیفه این متد اینه که از کلاس action یک نمونه (instance) ایجاد کنه.برای هر Destination مقصد یک کلاس جدید تولید میشه که با نام اصلی Destination مقصد شروع میشه و با کلمه «Args» به اتمام می‌رسه. به عنوان مثال اگر نام Destination مقصد شما FragmentB باشه یک کلاس با نام FragmentBArgs تولید میشه.مثال؛ انتقال داده از FragA به FragB:۱. ارسال مقدار آرگومان در Destination مبدا: https://gist.github.com/itsamirrezah/c58f333dd6b3a60674a26bbe8c7a999e با استفاده از دستور ()FragADirections.actionNavigateToFragmentB یک نمونه از کلاس ActionNavigateToFragmentB می‌سازیم و از این طریق به تگ &lt;action&gt; ای که در گراف مسیریابی ساختیم دسترسی پیدا می‌کنیم. در آخر هم از شی NavController استفاده‌ می‌کنیم تا عملیات انتقال رو نهایی کنیم.۲. دریافت مقدار ارسال‌ شده در Destination مقصد  https://gist.github.com/itsamirrezah/baa4c12d54b8bc16afa11c0344ef64ae دریافت داده از ارسال اون هم ساده تره، فقط باید از کلاس FragmentBArgs و یک Bundle استفاده کنید تا به مقدار ارسال شده دسترسی پیدا کنید.انتقال داده با استفاده از Navigation و پلاگین SafeArgsعلاوه بر مثال‌هایی که در این دو نوشته دیدیم Navigation قادر به پیاده‌سازی ویو‌های پیچیده‌تری هم هست. ویوهایی مثل BottomNavgationView، NavigationDrawer، CollapsingToolbarLayout و .. . Navigation برای پیاده‌سازی این‌ ویو‌ها از کلاس کمکی NavigationUI استفاده ‌می‌کنه. در بخش انتهایی این مقاله می‌خواهیم یک نمونه از پیاده‌سازی چنین طرح‌هایی رو با استفاده از NavigationUI ببینیم.پیاده سازی BottomNavigationView با استفاده از Navigationلیستی از مواردی که برای این پیاده‌سازی نیاز داریم:۱. یک  Activity که نقطه شروع برنامه است و در layout این اکتیویتی NavHost و BottomNavigationView رو قرار داده می‌شود. https://gist.github.com/itsamirrezah/570873f6aa9fd3aa3b2bd7b3293d46c7 ۲. معرفی چند فرگمنت به گراف مسیریابی به عنوان Destination ها۳. طراحی یک menu برای استفاده در BottomNavigationViewنکته مهم: توجه کنید‌ آیدی هر Item در این menu حتما با آیدی Destination مرتبط با خودش یکسان باشد! https://gist.github.com/itsamirrezah/3243bc1988599ada746bcf4efe38b7bc ۴. دسترسی به شی NavController در اکتویتی۵. و در‌نهایت برقراری اتصال بین BottomNavigationView و NavController ا۲.https://gist.github.com/itsamirrezah/cab0ce57cf0061f5661111d8a93580b4 همونطوری که در تکه‌ کد بالا مشخصه برای اتصال BottomNavigationView به NavController از کلاس جانبی NavigationUI استفاده می‌کنیم. NavigationUI کمک می‌کنه تا ویو‌هایی مثل NavigationDrawer، BottomNavigationView و .. رو به سادگی پیاده کنیم.با استفاده از متد setupWithNavController() امکان اتصال BottomNavigationView به NavController فراهم میشه. روش کارش هم به این صورتِ که بعد از اتصال، NavigationUI همیشه در حال گوش دادن به رویداد OnNavigationItemSelected() می‌مونه (این رویداد وقتی اجرا میشه که کاربر یکی از آیتم‌های BottomNavigationView رو انتخاب/لمس کنه)، هر زمانی که این رویداد اجرا شه NavigationUI آیدی MenuItem ای که کاربر روی اون لمس کرده رو دریافت می‌کنه و با استفاده از شی NavController صفحه مرتبط با آیتم انتخاب شده رو به کاربر نمایش میده. به همین خاطر که باید آیدی MenuItem ها با آیدی Destination ها یکسان باشند.پیاده‌سازی BottomNavigationView با استفاده از Navigationدر جمع بندی باید بگم Navigation ابزار بسیار ساده و در عین حال قدرتمندیه که اجازه دستیابی به رویکرد Single Activity Per Application رو به برنامه نویسان اندروید میده. پس اگر به این رویکرد علاقه‌مند هستید، پیشنهاد می‌کنم از این ابزارغافل نشید.امیدوارم این مجموعه آموزش‌ها برای شما مفید بوده باشه. اگه سوال، انتقاد یا پیشنهادی دارید می‌تونید یا زیر همین پست مطرح کنید یا از طریق توئیتر و تلگرام با من در تماس باشید. (:</description><category>امیررضا حاجاتی</category><author>امیررضا حاجاتی</author><pubDate>Thu, 26 Sep 2019 13:54:58 +0330</pubDate></item><item><title>آموزش؛ راه‌اندازی هادوپ به صورت مولتی‌نود</title><link>https://virgool.ir/@itsamirrezah/آموزش؛-راهاندازی-هادوپ-به-صورت-مولتینود-otxvytwjoeeu</link><description>ساز و کار برخورد با داده‌های حجیم (Big Data) در مقایسه با روش‌های سنتی که به طور معمول با اون‌ها سرو‌کار داریم متفاوته. در برخورد با داده‌های حجیم دو مشکل اساسی داریم. اولین مشکل ذخیره این داده‌ها است، شاید مساله ساده‌ای به نظر بیاد ولی وقتی با بیگ دیتا سروکار داریم دیگه نمی‌تونیم از روش‌های سنتی برای ذخیره‌سازی استفاده کنیم. دلیلش هم مشخصه، چون دستگاه‌های ما حافظه‌های محدودی دارند و در عین حال خود داده‌ها هم مرتبا با نرخ بالایی در حال افزایش هستند. دومین مشکل اساسی هم زمان و نحوه پردازش داده‌هاست. پس نیاز به سازوکاری داریم تا این مسائل رو به بهترین شکل حل و فصل کنه. هادوپ فریمورکیه که برای این مشکلات راه حلی بهینه و مقرون به صرفه ارائه میده.هدف اولیه من از نوشتن این مطلب این بود که هم راه‌اندازی هادوپ بر روی یک شبکه رو آموزش بدم و هم از این شبکه برای پردازش دیتاست‌های واقعی استفاده کنم ولی چون مطالب متن بیش از اندازه زیاد می‌شد تصمیم گرفتم این موضوع رو به 2 مطلب کوتاه‌تر تقسیم کنم. در این آموزش فقط نحوه راه‌اندازی هادوپ روی یک شبکه رو بررسی می‌کنیم. و در آموزش دوم از این شبکه هادوپ و برنامه‌نویسی MapReduce برای تحلیل و پردازش کلان‌داده استفاده می‌کنیم. اگر می‌خواهید در حوزه‌هایی مثل بیگ‌دیتا، آنالیز داده و یا مهندسی داده شروع به یادگیری کنید، این آموزش می‌تونه نقطه شروع مناسبی برای شما باشه.ضمنا اگه با آموزش‌های طولانی متن محور رابطه خوبی ندارید در کنار این نوشته، یک ویدئو هم از روال راه‌اندازی هادوپ تهیه کردم. لینک یوتیوب این ویدئو رو این زیر قرار میدم، امیدوارم مفید باشه.لینک ویدئو https://www.youtube.com/watch?v=RePHjb-V9K8 خلاصه‌ای از مطالب این نوشتهبررسی معماری هادوپشروع به کار؛ پیشنیازهای اولیهایجاد یک شبکه در لینوکس بین سه نودنصب نرم‌افزارهای ضروری برای کار با هادوپراه‌اندازی و اجرای هادوپبخش 1؛ معماری هادوپسعی من در این بخش اینه که خیلی مختصر اجزاء معماری هادوپ رو توضیح بدم. خوندن این بخش برای راه‌اندازی هادوپ ضروری نیست و صرفا یک مقدمه است برای اینکه بدونیم اجزاء اصلی هادوپ چیه و چطوری کار می‌کنه.در معماری هادوپ دو هسته اصلی وجود داره؛ HDFS و YARNوظیفه HDFS ذخیره داده‌های بزرگ با استفاده از یه روش توزیع‌ شده است. روش کارش به این شکله که یک داده بزرگ رو به قسمت‌های کوچک‌تر تقسیم می‌کنه و هر کدوم از این داده‌‌ها رو روی یک نود (ماشین) در شبکه ذخیره می‌کنه و از طریق یه ماشین مرکزی هم این داده‌های تقسیم شده رو مدیریت و کنترل می‌کنه. HDFS دارای دو سرویس اصلی است: Namenode و Datanodeدیتانود(Datanode) سرویسیه که روی ماشین‌های اسلیو اجرا میشه، وظیفش هم ذخیره داده‌هاست. داده‌های واقعی روی Datanode ها (در ماشین‌های اسلیو) ذخیره میشن. Datanode درخواست عملیات‌هایی مثل ذخیره، آپدیت و حذف رکورد‌ها رو از ماشین مستر می‌گیره و اجرا می‌کنه.نیم‌نود(Namenode) هم سرویسه که روی ماشین مستر اجرا میشه و وظیفش کنترل و مدیریت Datanode هاست. مثلا دونستن اینکه کدام داده بر روی کدام ماشین و کدام بلاک‌ها ذخیره شده، حجم فایل‌ها، سطح دسترسی‌ها و مسائلی از این دست وظیفه Namenode هست. هر تغییری که در داده‌های واقعی بوجود بیاد این تغییرات در Namenode هم رکورد میشه.در کنار یک واحد ذخیره‌سازی نیاز به یک واحد پردازشی هم داریم تا بتونه این داده‌ها را بخونه و پردازش کنه. واحد YARN مسئول انجام این وظیفه است. YARN هم مثل HDFS در درون خود از دو سرویس اصلی (یکی برای نودهای اسلیو و دیگری برای نود مستر) استفاده می‌کنه؛  NodeManager و ResourceManager.ریسورس‌منیجر (ResourceManager) سرویسیه که در ماشین مستر اجرا میشه و وظیفه مدیریت و کنترل منابع و پردازش‌ها در NodeManager ها را به عهده داره. NodeManager هم سرویس نود‌های اسلیو است و کارش اینه که دستورالعمل‌ها رو از ResourceManager بگیره و اجرا کنه.البته اجزاء معماری هادوپ همینجا تموم نمیشه و پیچیدگی‌های بیشتری داره ولی چون هدف این مطلب صرفا یه آشنایی اولیه هست به همین مقدار بسنده می‌کنیم.بخش 2؛ شروع به کاردر این آموزش برای راه‌اندازی هادوپ به صورت مولتی نود از VirtualBox و توزیع  Lubuntu نسخه 18.04 استفاده شده.لینک دانلود VirtualBoxلینک دانلود Lubuntuخب برای شروع سه ماشین مجازی می‌سازیم و بر روی هر سه Lubuntu نصب می‌کنیم. در شبکه هادوپی که قراره در بخش‌های بعدی بسازیم یکی از این ماشین‌ها به عنوان نود Master و دو ماشین دیگه به عنوان نود‌های Slave شناخته میشن.بخش 3؛ ایجاد یک شبکه بین ماشین‌های مجازیبرای اینکه ماشین‌های مجازی ما بتونن با همدیگه ارتباط داشته باشن، اون‌ها رو در یک شبکه قرار میدیم.مراحل ایجاد یک شبکه بین ماشین‌های مجازی:اضافه کردن یک نتورک آداپتر از نوع host-only برای استفاده همه ماشین‌هااختصاص IP استاتیک به همه ماشین‌های مجازیاستاتیک IP در Lubuntuمعرفی ماشین‌های موجود در شبکه به همدیگه با ویرایش فایل etc/hosts/ویرایش فایل etc/hosts/بخش 4؛ نصب Java و SSHهادوپ برای راه‌اندازی نیاز به کار با Java و SSH دارد.جاوا؛ چون هادوپ برپایه زبان جاوا نوشته شده، به همین خاطر نصب جاوا قبل از کانفیگ هادوپ ضروریه. جاوا استفاده شده در این آموزش نسخه 1.8 هست. sudo apt install openjdk-8-jdk&#34; /&gt;Command&gt;&gt; sudo apt install openjdk-8-jdk&#34; /&gt;&gt; sudo apt install openjdk-8-jdk&#34; /&gt;Command&gt;&gt; sudo apt install openjdk-8-jdkاس‌اس‌اچ(SSH)؛ یک پروتکل امن برای برقراری ارتباط بین ماشین‌ها در شبکه است و هادوپ هم برای ارتباط بین نودهای مستر اسلیو به این پروتکل نیاز داره. دستور نصب SSH: Command&gt;&gt; sudo apt install openssh-server openssh-clientحذف پسورد در ارتباط SSH:پروتکل SSH به طور پیشفرض در زمان برقراری ارتباط بین دو ماشین نیاز به وارد کردن پسورد (ماشین مقصد) داره ولی در یه سیستم هادوپ چون ماشین‌های مستر اسلیو به صورت مداوم با همدیگه ارتباط دارند، SSH باید طوری تنظیم بشه که این برقراری ارتباط نیازی به پسورد نداشته باشه. برای اینکار اول یک کلید تصادفی در ماشین مستر تولید و در مرحله بعد این کلید رو به ماشین‌های اسلیو معرفی می‌کنیم.دستورات حذف پسورد در ارتباط SSH: (تمامی این دستورات باید در نود مستر وارد شود)تولید یک کلید تصادفی در ماشین مسترCommand&gt;&gt; ssh-keygen -t rsa· کپی کلید ساخته‌ شده در ماشین مسترCommand&gt;&gt; cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys· معرفی کلید ساخته شده به ماشین‌های اسلیوCommand&gt;&gt; ssh-copy-id -i ~/.ssh/id_rsa.pub itsamirrezah@slave1&#xA;Command&gt;&gt; ssh-copy-id -i ~/.ssh/id_rsa.pub itsamirrezah@slave2کانفیگ SSHحالا با دستور ssh [username]@[hostname] بررسی می‌کنیم ببینیم آیا SSH به درستی کانفیگ شده یا نه.بخش 5؛ نصب و راه‌اندازی هادوپدر این آموزش از هادوپ نسخه 2.8.5 استفاده شده است. لینک دانلوداجرای هادوپ نیاز به نصب خاصی نداره، فقط فایل هادوپ رو از لینک بالا دانلود و اکسترکت کنید. برای کانفیگ هم فقط باید چند فایل مهم در پوشه هادوپ ویرایش بشه. در ادامه این بخش تمام کارهایی که برای کانفیگ هادوپ نیاز هست رو به صورت مرحله به مرحله بررسی می‌کنیم:قدم 1: ویرایش فایل‌های اصلی هادوپدر پوشه اصلی هادوپ در مسیر etc/hadoop فایل‌های زیر رو با توجه به توضیحات داده شده، با یک ادیتور (مثل nano یا gedit) ویرایش کنید.توضیح 1: کانفیگ فایل‌های hdfs-site.xml و slaves بین نودهای مستر و اسلیو متفاوته، ولی بقیه فایل‌ها بین همه ماشین‌ها کانفیگ یکسانی دارند.توضیح 2: در اکثر تنظیمات از یک آدرس آیپی (192.168.10.10) استفاده شده، این آدرس، IP ماشین مستر توی این آموزشه. اگه IP ماشین مستر شما غیر از اینه باید تمام این مقادیر رو به IP خودتون تغییر بدید.فایل core-site.xml https://gist.github.com/itsamirrezah/f21b454257db641173433a8f1602dd1d فایل mapred-site.xml https://gist.github.com/itsamirrezah/a51ab7fabc83fe69a03477a0c17f8f31 فایل yarn-site.xml https://gist.github.com/itsamirrezah/8858db008fb0a8a50ae119e53001557e فایل hdfs-site.xml تنظیماتاینفایلبینماشین‌هایمسترواسلیومتفاوته.درماشینمسترآدرسدایرکتوریNamenodeمشخصمیشهودرماشین‌هایاسلیوآدرسدایرکتوریDatanode.(یادآوری:اگهبخشمعماریهادوپاینمقالهروخوندهباشیدحتمامی‌دونیدکهNamenodeدرمستراجرامیشهوDatanodeهمدراسلیو‌ها) تنظیمات hdfs-site.xml در نود مستر: https://gist.github.com/itsamirrezah/409fa879811212739006757f67998a62 تنظیمات hdfs-site.xml در نودهای اسلیو: https://gist.github.com/itsamirrezah/f0621bd5174abd81d9a7d9f756e83545 توضیح: دایرکتوری‌هایی که در فایل hdfs-site.xml معرفی می‌کنید حتما باید در همون مسیر وجود داشته باشن، مثلا برای این آموزش من از قبل دایرکتوری‌های hadoop_store/hdfs/namenode (در مستر) و hadoop_store/hdfs/datanode (در اسیلوها) رو ایجاد کردم.ایجاد دایرکتوری‌های Namenode و Datanode:ایجاد پوشه namenode (نود مستر):Command&gt;&gt; mkdir -p /home/itsamirrezah/hadoop_store/hdfs/namenodeایجاد و تغییر سطح دسترسی پیشفرض دایرکتوری datanode (نودهای اسلیو):Command&gt;&gt; mkdir -p /home/itsamirrezah/hadoop_store/hdfs/datanodeCommand&gt;&gt; chmod 755 /home/itsamirrezah/hadoop_store/hdfs/datanodeفایل slavesهادوپ از طریق این فایل نودهای اسلیو رو میشناسه. برای ویرایش این فایل username و hostname ماشین‌های اسلیو رو مثل تصویر زیر وارد کنید: قالب معرفی اسلیوها: username@hostnameقدم 2: اضافه کردن مسیر جاوا به هادوپبرای معرفی جاوا به هادوپ کافیه در پوشه اصلی هادوپ فایل etc/hadoop/hadoop-env.sh رو با یک ادیتور مثل تصویر زیر ویرایش کنید. (احتمال داره محل نصب جاوا در ماشین‌های مجازی شما متفاوت باشه)معرفی مسیر جاوا به فایل hadoop-env.shقدم 3: اضافه کردن مسیر هادوپ به متغیرهای محلیتنظیمات هادوپ دیگه به آخرش رسیده، تنها کار باقی­مونده معرفی پوشه‌های bin و sbin هادوپ به متغیر PATH سیستم عامله. فایل etc/bash.bashrc/ رو با یک ادیتور باز کنید و دستورات زیر رو به انتهای فایل اضافه کنید:ویرایش فایل bash.bashrc https://gist.github.com/itsamirrezah/6ab568695b8e17571e49742421a560a1 قدم 4: فرمت HDFSدر اولین راه‌اندازی هادوپ حتما باید HDFS فرمت بشه. برای فرمت HDFS دستور زیر رو وارد کنید: (فقط در ماشین مستر)command&gt;&gt; hdfs namenode –formatاگر تمامی مراحل بالا رو به درستی انجام داده باشید namenode با موفقیت فرمت می‌شود و حالا می‌تونید هادوپ رو اجرا کنید.اجرای هادوپخب دیگه قسمت سخت ماجرا تموم شد و فقط اجرای سرویس‌های هادوپ باقی مونده. 2 دستور برای اجرای سرویس‌های هادوپ وجود داره:دستور اجرای سرویس‌های HDFS:command&gt;&gt; start-dfs.shو دستور اجرای سرویس‌های YARN:command&gt;&gt; start-yarn.shاجرای سرویس‌های هادوپاگه سوال، انتقاد یا پیشنهادی داشتید می‌تونید یا زیر همین پست مطرح کنید یا از طریق توئیتر و تلگرام با من در تماس باشید. خوشحال می‌شم (: </description><category>امیررضا حاجاتی</category><author>امیررضا حاجاتی</author><pubDate>Tue, 13 Aug 2019 03:20:23 +0430</pubDate></item><item><title>رویکرد جدید؛ یک اکتیویتی برای هر اپلیکیشن کافیه! (۱)</title><link>https://virgool.ir/@itsamirrezah/navigation-component-part1-jiqeatzoygur</link><description>مسیریابی با Navigation Componentمسیریابی بین فرگمنت و اکتیویتی ها در اندروید می تونه برای یک برنامه نویس تازه کار پیچیده به نظر برسه. مسائل زیادی وجود داره که باید فکری به حالش کرد. از انتقال داده گرفته تا اضافه کردن انیمیشن، کنترل بک اِستَک و بسیاری مسائل دیگه که باید مدیریت بشن.برای ساده شدن این فرآیند و رسیدن به یک رویکرد جدید، گوگل درکنفرانس I/O سال گذشته با معرفی ابزار Navigation Component، رویکرد Single Activity Per Application (یک اکتیویتی برای هر اپلیکیشن) رو به عنوان رویکرد مورد استاندارد خودش اعلام کرد. سعی می کنم در این مقاله ابزار Navigation رو به طور کامل معرفی و پیاده سازی کنم.هدف ابزار Navigation ساده شدن جابجایی بین صفحات مختلف یک برنامه است. اگه میخواهید بدونید چقدر ساده باید بگم به سادگی همین تصویر بالا...این عکس تصویری از اصلی ترین فایل کتابخانه Navigation هست که به صورت گرافیکی همه سیاست های مسیریابی یک اپلیکیشن در آن نشون داده میشه. مثلا اینکه چه فرگمنتی به کدام فرگمنت دیگه مسیر داره، چه انیمیشینی در زمان انتقال اجرا میشه، چه مقادیری در یک انتقال باید جابجا بشه و خیلی چیزهای دیگه.به این فایل Navigation Graph (گراف مسیریابی) میگیم که بعدا مفصل راجع بهش حرف می زنیم. فعلا همین قدر بدونید که روال کار به همین سادگیه. یه جا سیاست های انتقال نوشته می شه. بعد با یکی دو خط کد نویسی این سیاست ها را فراخوانی و اجرا می کنیم.نکته مهم: برای کار با کتابخانه Navigation حتما باید از اندروید استودیو نسخه 3.3 (یا بالاتر) و پروژه androidx استفاده کنید.لینک پروژه این مقاله: https://github.com/itsamirrezah/SimpleNavigationComponent اضافه شدن کتابخانه به پروژه:برای اضافه شدن کتابخانه Navigation، تکه کد زیر را به فایل build.gradle (در ماژول app) اضافه کنید: https://gist.github.com/itsamirrezah/cee551afc0cef913717884b0d2f70b9f مفاهیم اصلی برای کار با NavigationNavigation Graph:یک فایل ساده xml است که سیاست های نحوه جابجا شدن صفحات مختلف برنامه رو مشخص می کنه.Destination:هر صفحه از یه اپلیکیشن (فرگمنت یا اکتیویتی)، در فایل گراف مسیریابی به عنوان یک Destination معرفی میشن.Action:به فرآیند انتقال از یک Destination به Destination دیگه Action میگیم.NavHost:هر Destination برای اینکه بتونه به نمایش دربیاد نیاز به یک &#34;قاب&#34; و &#34;فریم&#34; داره. به این قاب NavHost میگیم.NavController:وظیفه تعویض تصاویر (یا همون Destination) روی قاب NavHost به عهده شی NavController هست.حالا می تونیم شروع به کار کنیم. به عنوان اولین تلاش یه پروژه ساده رو پیاده می کنیم که با کمک کتابخانه Navigation از یک فرگمنت به فرگمنت دیگه منتقل بشیم. برنامه ما یک اکتیویتی و دو فرگمنت با نام های FragA و FragB داره که وقتی برنامه اجرا میشه FragA به صورت پیشفرض نمایش داده میشه. با کلیک بر روی یک Button برنامه به FragB منتقل میشه. از اکتیویتی هم فقط به عنوان نقطه شروع برنامه استفاده می کنیم و بعد از اون دیگه باهاش کاری نداریم.به طور خلاصه لیستی از کارهایی که باید انجام بدیم:ایجاد فایل گراف مسیریابی (Navigation Graph)معرفی NavHost به گراف مسیریابیمعرفی Destination ها به گراف مسیریابیمعرفی یک action برای انتقال از فرگمنت A به فرگمنت Bاستفاده از شی NavController برای دسترسی به action ساخته شده و نهایی کردن انتقالایجاد فایل گراف مسیریابیبرای شروع باید فایل گراف مسیریابی یا همون Navigation Graph رو بسازیم. همانطور که گفتیم گراف مسیریابی چیزی جز یه فایل ساده xml نیست. برای ساختن این فایل بر روی فولدر res کلیک راست کنین و گزینه New&gt;Android Resource File رو انتخاب کنید.حالا در پنجره New Resource File، یک نام اختیاری برای گرافتون انتخاب کنید و Resource Type رو هم بر روی Navigation قرار بدید.ایجاد گراف مسیریابی حالا گراف مسیریابی ساخته شده و  از مسیر res&gt;navigation&gt;navigation_graph.xml قابل دسترسی است.شناسایی NavHost به گراف مسیریابیگراف مسیریابی دو تب داره که تب Design برای نمایش گرافیکی مسیریابی ها و تب Text برای نمایش کد های xml مسیریابی ها است. اگر از تب Design فایل رو باز کنید در قسمت Destination، دو بخش Host و Graph رو می بینین.در بخش Host، NavHost ها قرار میگیرن. (همون قاب تو خالی که به Destination ها اجازه نمایش میده.) و در بخش Graph، Destination های برنامه  قرار میگیرن.برای اینکه گراف مسیریابی NavHost شما رو بشناسه باید اون رو در فایل &#34;لایه&#34; Activity (مثلا فایل activity_main.xml) معرفی کنین. معمولا از تگ &lt;fragment&gt; به عنوان NavHost استفاده میشه.شبیه به تکه کد زیر: https://gist.github.com/itsamirrezah/1f81f36b7f5fae5a99e88a23320634ad  بررسی ویژگی های مهم: name:اگر این ویژگی با مقدار “android.navigation.fragment.NavHostFragment” مقدار دهی شود این تگ &lt;fragment&gt; به عنوان NavHost به گراف مسیریابی شناخته میشه.navGraph:با کمک این ویژگی NavHost متوجه میشه که باید از سیاست های کدام گراف مسیریابی پیروی کند.defaultNavHost:مقدار این ویژگی به عملکرد کلید Back مرتبطه. اگه مقدار آن False باشه هر موقعی که کاربر کلید Back را فشار بده از برنامه خارج می شود. ولی در صورت True بودن، با فشردن کلید Back برنامه به صفحه قبل از خودش برمیگرده. اینکار انقدر تکرار میشه تا زمانی که به صفحه ابتدایی برنامه برسه و در نهایت از برنامه خارج بشه. با اعمال این تغییرات به گراف مسیریابی برمیگردیم و میبینیم NavHost ما به طور خودکار شناخت شده.شناسایی NavHost به گراف مسیریابی معرفی Destination به گراف مسیریابیخب زمان معرفی Destination ها به گراف مسیریابی است. گفتیم صفحات برنامه (مثل فرگمنت یا اکتیویتی ها) را در گراف مسیریابی به عنوان Destination میشناسیم. برای اینکار فایل گراف مسیریابی و در حالت Design قرار میدیم و تغییرات لازم رو ایجاد می کنیم.برای معرفی یک Destination بر روی آیکون New Destination کلیک کنید. حالا لیستی از صفحات برنامه لود می شود. چند فرگمنت به دلخواه به گراف مسیریابی اضافه کنید.اضافه کردن Destination به گراف مسیریابی ویژگی های مهم Destination:id:برای انتقال بین Destination های مختلف از آیدی استفاده میشه. این آیدی فقط مربوط به جابجایی و عملیات انتقال هست و با آیدی لایه فرگمنت ارتباطی نداره.name:این ویژگی ارتباط بین Destination در گراف مسیریابی با فایل اصلی فرگمنت رو (که به زبان جاوا یا کاتلین نوشته شده) برقرار میکنه. مثلا اگه فایل فرگمنت با نام FragA در پکیج Ui وجود داشته باشه به شکل زیر name مقدار دهی میشه: نام_پکیج_پروژه.Ui.FragAخب Destination ها به گراف معرفی شدن و فقط باید مشخص بشه کدوم Destination به عنوان صفحه شروع برنامه انتخاب بشه. برای اینکار باید از ویژگی StartDestination در تگ ریشه &lt;navigation&gt; استفاده کنیم. آیدی یکی از Destination ها باید به عنوان مقدار این ویژگی تعیین شه. در این مثال FragA به عنوان صفحه شروع انتخاب شد. https://gist.github.com/itsamirrezah/cf3c9a68ac4666e99e0f7e2ce273c350  حالا با اجرای برنامه FragA نمایش داده میشه ولی هنوز خبری از FragB نیست، چون هنوز عمل انتقال از FragA به FragB رو انجام ندادیم. برای شروع یه Button در لایه FragA می سازیم تا بتونیم با کلیک روی اون به FragB منتقل شیم.معرفی actionبرای اینکه انتقال از یک فرگمنت به فرگمنت دیگه کامل شه نیاز به استفاده از تگ &lt;action&gt; داریم. تگ های action هم در گراف مسیریابی معرفی و نگهداری می شوند. و درون آنها اطلاعات انتقال قرار میگیره. منظور از اطلاعات انتقال چیزهایی مثل آدرس  Destination مقصد، انیمیشن و داده های ارسالی در هنگام انتقال و ... هست. تگ action باید درون تگ Destination مبدا قرار بگیره، به این صورت مبدا انتقال مشخص میشه. هر action ویژگی های زیر دارد:id:هر action باید یک آیدی منحصر به فرد داشته باشه تا در مرحله بعد با کمک شی NavController به آن دسترسی پیدا کنیم.destination: آدرس Destination مقصد را مشخص میکنه. مقدار این ویژگی آیدی یکی از Destination ها است که در گراف مسیریابی قبلا معرفی شد  https://gist.github.com/itsamirrezah/d0b86de860b7da8aaf1cda50383ef388 تکمیل انتقال با کمک شی NavController:خب کار ما با گراف مسیریابی تمام شد و حالا تنها کار باقی مونده دسترسی به action ساخته شده و اجرای عملیات انتقال است. برای اینکار از شی NavController استفاده می کنیم.  از NavController برای انتقال از یک Destination به یک Destination دیگه استفاده میشه.با استفاده از دستور ()Navigation.findNavController میشه به NavController دسترسی پیدا کرد. توجه کنید که متد findNavController نیاز به یک View به عنوان ورودی داره. این View باید به هر شکلی جزئی از Destination مبدا باشه. مثلا Viewی ریشه یک فرگمنت یا یکی از ویجت های استفاده شده در فرگمنت. دسترسی به NavController کامل شده حالا با استفاده از متد ()navigate عملیات جابجایی بین فرگمنت ها رو کامل می کنیم. این متد یک آیدی به عنوان ورودی میگیره و این آیدی یا باید آیدی Destination مقصد باشه یا آیدی یک action. هر دو روش کار میکنه ولی پیشنهاد می کنم همیشه از action استفاده کنید، چون قدرت کنترل اطلاعات بیشتری دارند.  (انتقال داده، تغییر انیمیشن و ..) https://gist.github.com/itsamirrezah/7c705e9fd0e3aff55631662d3232a4c5 حالا با کلیک روی button در FragmentA به صفحه FragmentB منتقل می شید.تغییر انیمیشن انتقالگفتیم که یکی از فایده های کار با action کنترل انیمیشن انتقال صفحه هست. کنترل انیمیشن با action خیلی خیلی آسونه. فقط کافیه از ویژگی های exitAnim و enterAnim استفاده کنید. https://gist.github.com/itsamirrezah/48a0a962fe0e66a82c381e142c7d68e1 exitAnim: انیمیشنی که در زمان خارج شدن از صفحه مبدا نمایش داده میشه.enterAnim:انیمیشنی که در زمان ورود به صفحه مقصد نمایش داده میشه.همین! مابقی کارها رو Navigation کنترل می کنه!</description><category>امیررضا حاجاتی</category><author>امیررضا حاجاتی</author><pubDate>Mon, 15 Jul 2019 03:16:27 +0430</pubDate></item></channel></rss>