سلام دوست عزیز😃👋

به مسابقه «بله‌کمپ ۷ - مرحله دوم (DevOps)» خوش آمدی!

نکات مفید برای شرکت در مسابقه:

  • هرگونه استفاده از ابزارهای تولید کد، مثل chatGPT و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکت‌کنندگان مسابقه حذف می‌شوید.
  • هر گونه ارتباط با سایر شرکت‌کنندگان ممنوع است.
  • می‌توانید سوال‌ها و مشکلات خود را از بخش «سوال بپرسید» با ما در میان بگذارید.
  • این مسابقه دارای سناریو یک‌ پارچه است، یعنی پروژه سوالات شبیه به هم و دنباله‌دار هستند و روی یک فضا پیش می‌روند.
  • در این مسابقه تلاش شده تا مهارت شما هم در سطح توسعه دهنده یا همان developer و هم در سطح operation سنجیده شود. برای همین شما در برخی سوالات مجبور به توسعه و پیاده‌سازی هستید. در این گونه سوالات تلاش شده تا شما را محدود به استفاده از زبان برنامه‌نویسی مخصوصی نکنیم و دست شما را باز بگذاریم. بنابراین می‌توانید با زبان دلخواه خود به حل سوالات بپردازید.

موفق باشید و بهتون خوش بگذره 😉✌

سلیب و باجِ بَله


سلیب پس از پیدا کردن سایت موردنظر در میان انبوهی از وب‌سایت‌های خروجی مسئله‌ی قبل، به جزیره رسید و نقشه‌ی گنج را پیدا کرد. پس از باز کردن نقشه، متوجه شد که نقشه به زبان عجیب و غریبی (احتمالاً عبری) نوشته شده و قادر به ترجمه‌ی آن نیست. او که می‌دانست محال است بتواند نقشه را خودش ترجمه کند، به دنبال فردی با دانش عبری گشت. سلیب پس از پرس‌و‌جوهای فراوان با علی روبه‌رو شد که قبول کرد نقشه را برای او ترجمه کند؛ اما در ازای این کار، از او خواست تا تسک iteration فعلی او را برایش انجام دهد. سلیب هم‌اکنون از شما درخواست انجام تسک پاک‌سازی و بهینه کردن ساختار ردیس شرکت علی را دارد.

جزئیات پروژه🔗

برای دانلود پروژه‌ی اولیه روی این لینک کلیک کنید.

برای انجام تسک شرکت علی نیاز به نوشتن یک اسکریپت به زبان bash دارید و اسکریپت شما باید ۴ سطح از پاک‌سازی که در ادامه‌ی مسئله با جزئیات بیشتری توضیحشان می‌دهیم را روی دیتای ردیس فعلی‌شان انجام دهد.

برای حل این تمرین نیاز به دانش کار با دستور redis-cli را دارید که داکیومنتیشن آن را در این لینک می‌توانید مطالعه کنید، همچنین جهت آشنایی با تمامی داده ساختار‌های موجود در ردیس هم از این لینک کمک بگیرید.

پاک‌سازی نوع اول

در این سطح، نیاز است تمامی کلید‌هایی از ردیس که شامل حداقل یک کاراکتر کوچک زبان انگلیسی است را به فرم بزرگ تغییر دهد. برای مثال اگر ردیس ما شامل کلید‌های زیر است:

extensionFromNameterminal
redis:6379> KEYS *
...
redis-key1
Redis-Key2
Redis-KEY3
...
Bash

پس از اجرای اسکریپت شما باید به شکل زیر تغییر کنند:

extensionFromNameterminal
redis:6379> KEYS *
...
REDIS-KEY1
REDIS-KEY2
REDIS-KEY3
...
Bash

اسکریپت شما پس از تغییر هر کلید باید عبارتی به فرم زیر به فایل output.txt اضافه کند.

extensionFromNameoutput.txt
Renamed key: OLD_KEY -> NEW_KEY
Plain text

برای مثال، پس از اجرای اسکریپت روی مثال بالا، محتوای فایل output.txt شامل محتوای زیر باشد:

extensionFromNameoutput.txt
...
Renamed key: redis-key1 -> REDIS-KEY1
Renamed key: Redis-Key2 -> REDIS-KEY2
Renamed key: Redis-KEY3 -> REDIS-KEY3
...
Plain text

توجه داشته باشید تحت این عملیات پاک‌سازی مقدار هیچ کلیدی از ردیس نباید تغییر کند، یعنی پاک‌سازی شما نباید به‌هیچ‌وجه باعث از دست رفتن دیتای موجود شود.

نکته پیرامون حفظ دیتا: ممکن است هنگامی‌که شما کلید را به‌صورت uppercase می‌نویسید، کلید جدید در ردیس وجود داشته باشد. در این صورت، تا زمانی که به کلیدی که در ردیس‌مان وجود نداشته باشد نرسیده‌ایم، عبارت DUPLICATE را به انتهای کلید جدید اضافه می‌کنیم. برای مثال اگر ردیس ما شامل کلید‌های زیر باشد:

extensionFromNameterminal
redis:6379> KEYS *
...
redis-key1
REDIS-KEY1DUPLICATE
...
Bash

اسکریپت شما باید کلید redis-key1 را به REDIS-KEY1DUPLICATEDUPLICATE تغییر دهد. یعنی پس از اجرای اسکریپت شما وضعیت کلید‌های ردیس مانند زیر خواهد بود:

extensionFromNameterminal
redis:6379> KEYS *
...
REDIS-KEY1DUPLICATE
REDIS-KEY1DUPLICATEDUPLICATE
...
Bash

و همچنین محتوای فایل output.txt شامل محتوای زیر باشد:

extensionFromNameoutput.txt
...
Renamed key: redis-key1 -> REDIS-KEY1DUPLICATEDUPLICATE
...
Plain text
پاک‌سازی نوع دوم

در این سطح، نیاز است تا تمامی مقادیری از ردیس که به‌صورت رشته هستند و با کاراکتر [ شروع و با کاراکتر ] تمام می‌شوند را به‌صورت لیست در ردیس ذخیره کند. همچنین پس از تغییر هر مقدار باید عبارتی به فرم زیر به فایل output.txt اضافه کند.

extensionFromNameoutput.txt
Parsed list for key: KEY
Plain text

برای مثال، اگر ردیس ما شامل مقداری مانند زیر است:

extensionFromNameterminal
redis:6379> GET TEST_KEY
"[a, b, c]"
Bash

پس از اجرای اسکریپت شما باید مقدار کلید مذکور به‌صورت داده‌ساختار لیست پیاده‌سازی‌شده در ردیس ذخیره شده باشد و بتوانیم مانند دستور زیر به محتوای آن دسترسی داشته باشیم:

extensionFromNameterminal
redis:6379> LRANGE TEST_KEY 0 -1
1) "a"
2) "b"
3) "c"
Bash

برای مثال پس از اجرای اسکریپت روی مثال بالا، محتوای فایل output.txt شامل محتوای زیر باشد:

extensionFromNameoutput.txt
...
Parsed list for key: TEST_KEY
...
Plain text

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

توجه داشته باشید که اگر درون مقدار کاراکتر گیومه (") وجود داشت، این کاراکتر باید از مقدار جدید حذف شود.

پاک‌سازی نوع سوم

در این سطح، نیاز است تا تمامی مقادیری از ردیس که به‌صورت رشته هستند و با کاراکتر ( شروع و با کاراکتر ) تمام می‌شوند را به‌صورت ست در ردیس ذخیره کند. همچنین پس از تغییر هر مقدار باید عبارتی به فرم زیر به فایل output.txt اضافه کند.

extensionFromNameoutput.txt
Parsed set for key: KEY
Plain text

برای مثال اگر ردیس ما شامل مقداری مانند زیر است:

extensionFromNameterminal
redis:6379> GET TEST_KEY
"(a, b, c)"
Bash

پس از اجرای اسکریپت شما باید مقدار کلید مذکور به‌صورت داده‌ساختار ست پیاده‌سازی‌شده در ردیس ذخیره شده باشد و بتوانیم مانند دستور زیر به محتوای آن دسترسی داشته باشیم:

extensionFromNameterminal
redis:6379> SMEMBERS TEST_KEY
1) "a"
2) "b"
3) "c"
Bash

برای مثال، پس از اجرای اسکریپت روی مثال بالا، محتوای فایل output.txt شامل محتوای زیر باشد:

extensionFromNameoutput.txt
...
Parsed set for key: TEST_KEY
...
Plain text

توجه داشته باشید که اگر درون مقدار کاراکتر گیومه (") وجود داشت، این کاراکتر باید از مقدار جدید حذف شود.

پاک‌سازی نوع چهارم

در این سطح، نیاز است تمامی مقادیری از ردیس که به‌صورت رشته هستند و با کاراکتر { شروع و با کاراکتر } تمام می‌شوند را به‌صورت هش در ردیس ذخیره کند. همچنین پس از تغییر هر مقدار باید عبارتی به فرم زیر به فایل output.txt اضافه کند.

extensionFromNameoutput.txt
Parsed map for key: KEY
Plain text

برای مثال اگر ردیس ما شامل مقداری مانند زیر است:

extensionFromNameterminal
redis:6379> GET TEST_KEY
"{a:b, c:d, e:f}"
Bash

پس از اجرای اسکریپت شما باید مقدار کلید مذکور به‌صورت داده‌ساختار لیست پیاده‌سازی‌شده در ردیس ذخیره شده باشد و بتوانیم مانند دستور زیر به محتوای آن دسترسی داشته باشیم:

extensionFromNameterminal
redis:6379> HGETALL TEST_KEY
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
redis:6379> HGET TEST_KEY a
"b"
Bash

برای مثال پس از اجرای اسکریپت روی مثال بالا، محتوای فایل output.txt شامل محتوای زیر باشد:

extensionFromNameoutput.txt
...
Parsed map for key: TEST_KEY
...
Plain text

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

توجه داشته باشید که اگر درون مقدار کاراکتر گیومه (") وجود داشت، این کاراکتر باید از مقدار جدید حذف شود.

نمونه خروجی

برای اجرای نمونه نیاز به نصب داکر در سیستم خود دارید. نیازی نیست تا شما درون محتوای فایل‌های داکر پروژه هیچ تغییری ایجاد کنید.

درون پروژه اولیه فایل‌هایی جهت تست اسکریپت شما تهیه شده که در ادامه نحوه کار با هرکدام را بررسی می‌کنیم. ابتدا اسکریپت خود را در فایل fixer.sh پیاده‌سازی کنید. سپس با استفاده از دستور زیر کانتینرهای پروژه اولیه را بالا بیاورید:

extensionFromNameTerminal
$ docker-compose up --build -d
Terminal

پس از اتمام اجرای دستور بالا، دستور زیر را اجرا کنید. این دستور محتوای موجود در فایل redis-data.txt را به درون ردیس در حال اجرا می‌ریزد.

extensionFromNameTerminal
$ pip install redis
$ python redis-filler.py
Terminal
نام کلید و مقدار هر کلید در ردیس نمونه

ساختار زیر به صورت "key":"value" است:

test1:1
test2:2
TEST1:TEST1
12345:12345
Test6:Test6
tEsT7:tEsT7
test8:[a,b,c]
test9:(a,b,c)
test10:{a:b,c:d}
Plain text

یعنی مقدار کلید test1 برابر با 1 است.

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

extensionFromNameTerminal
$ docker exec -it fixer ./fixer.sh
Terminal

حال باید اسکریپت شما اجرا شده باشد و در فایل output.txt محتوای زیر قابل مشاهده باشد:

extensionFromNameoutput.txt
Renamed key: test10 -> TEST10
Parsed map for key: TEST10
Renamed key: test8 -> TEST8
Parsed list for key: TEST8
Renamed key: test2 -> TEST2
Renamed key: test9 -> TEST9
Parsed set for key: TEST9
Renamed key: Test6 -> TEST6
Renamed key: tEsT7 -> TEST7
Renamed key: test1 -> TEST1DUPLICATE
Plain text

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

پس از اتمام اجرای تست، حتما دستور زیر را اجرا کنید تا تمامی کانتینرها متوقف شوند:

extensionFromNameTerminal
$ docker-compose down
Terminal

نکات تکمیلی🔗

  • فراموش نکنید که در تمامی تمرین‌ها نیاز است تا تمام کاراکتر‌های " از مقدار‌هایی که توسط اسکریپت شما تغییر می‌کنند، حذف شود.
  • اولویت اجرا از پاک‌سازی نوع اول به چهارم است، یعنی ممکن است که ابتدا کلید را به صورت uppercase تغییر بدهیم (پاک‌سازی نوع اول) و سپس بفهمیم که مقدار کلید جدیدی که به صورت uppercase ذخیره کرده‌ایم نیاز به ذخیره‌سازی به‌صورت لیست در ردیس را داشته باشد.
  • باقی کلید‌های موجود در ردیس نباید توسط اسکریپت شما تغییری کنند.
  • برای اتصال به ردیس در اسکریپت خود باید به هاست redis وصل شوید.

نکات مهم🔗

  • فراموش نکنید که اسکریپتی کامل را در پاسختان تحویل دهید.
  • فراموش نکنید که اسکریپت خود را درون فایلی با نام fixer.sh وارد نمایید.
  • برای ارسال پاسخ خود کافی‌ست فایل fixer.sh را آپلود کنید.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.