شرلوک که از کار زیاد خسته شده میخواهد یک روز در هفته را برای استراحت کنار بگذارد. او که همواره میخواهد به حل پروندههای بیشتری کمک کند، تصمیم میگیرد با بررسی نرخ جرم و جنایت در ماه گذشته، روزی در هفته که به طور میانگین کمترین میزان جرم و جنایت در آن اتفاق افتاده را برای استراحت انتخاب کند.
با دریافت تقویم ماه گذشته، روز هفته اول ماه و میزان جرمهای گزارش شده در هر روز، به شرلوک کمک کنید که یک روز را برای استراحت انتخاب کند.
در خط اول ورودی روزی که ماه با آن شروع شده از یکی از روزهای زیر داده میشود:
سپس در ۳۰ خط بعدی میزان جنایات گزارش شده در هر روز داده میشود. تضمین میشود که تعداد روزهای ماه ۳۰ روز خواهد بود.
در خروجی، روزی در هفته که به طور میانگین، کمترین میزان جنایتهای گزارش شده را داشته به همراه مقدار جز صحیح این میانگین چاپ کنید.
مقدار میانگین اصلی ۳۹.۴ است که جز صحیح آن یعنی ۳۹ در خروجی چاپ میشود.
بازرس لستراد که از تعداد پروندههای زیاد اسکاتلند یارد خسته شده برای حل برخی از آنها با شرلوک تماس میگیرد. شرلوک از بازرس لستراد میخواهد که پروندهها را در ساختار مشخصی برای او ارسال کند اما به دلیل بینظمیهای اسکاتلند یارد و نامشخص بودن ساختار پروندههای آنها، بازرس لستراد توانایی انجام این کار را ندارد. با نوشتن یک اسکریپت شل به بازرس لستراد کمک کنید که با گرفتن فایل CSV پروندهها، آنها را در فولدرهای مختلف مرتب کرده و برای شرلوک ارسال کند.
در حال حاضر پروندههای اسکاتلند یارد در یک فایل CSV بزرگ با ساختار زیر قرار گرفتهاند:
شرلوک از بازرس لستراد خواسته که تمامی پروندهها در پوشه Cases
قرار بگیرند. به این صورت که در این پوشه برای هر نوع پرونده یک پوشه خاص ایجاد شده و سپس برای هر پرونده، یک فایل در پوشه نوع آن پرونده با نام فرد مرتبط با پرونده ایجاد شده و توضیحات پرونده در این فایل قرار بگیرند.
از آنجا که امنیت پروندههای اسکاتلند یارد نیز از اهمیت بالایی برخوردار است، باید دسترسی افراد به هر پرونده با توجه به وضعیت آن تغییر پیدا کند.
برای پروندههای با وضعیت Solved
همه افراد باید توانایی خواندن پرونده را داشته باشند اما فقط صاحب پرونده امکان نوشتن بر روی آن را داشته باشد.
برای پروندههای با وضعیت In Progress
صاحب پرونده و گروه آن باید توانایی خواندن پرونده را داشته باشند اما فقط صاحب پرونده امکان نوشتن بر روی آن را داشته باشد.
برای پروندههای با وضعیت Not Started
فقط صاحب پرونده توانایی خواندن آن را داشته باشد.
دقت کنید که در هیچ حالتی، هیچکس نباید بتواند فایل پرونده را اجرا کند.
دقت داشته باشید که ممکن است در نام افراد کاراکتر اسپیس وجود داشته باشد. در اینصورت باید اسپیسهای موجود در نام را با کاراکتر _
جایگزین کنید.
با دریافت و پردازش این فایل باید پوشهبندی پروندهها به شکل زیر ایجاد شود:
محتوای هر فایل نیز باید با ستون Description
مربوط به آن پرونده پر شده باشد. برای مثال محتوای درون فایل Lisa_Eaton
باید متن زیر باشد:
ساختار فایلی پروژه اولیه به شکل زیر است:
و شما باید راهحل خود را درون فایل solution.sh
پیادهسازی کنید.
برای ارسال جواب، دستورات خواسته شده را در فایلی با نام solution.sh
بنویسید و سپس آن را انتخاب و ارسال کنید.
در حل این سوال بجز پیادهسازی صحیح، تمیزی، خوانایی و ساختار صحیح کد شما نیز در ارزیابی و دعوت شما به مصاحبه تاثیرگذار خواهد بود.
شرلوک که وقتش پس از حل پروندههای اسکاتلند یارد آزاد شده، تصمیم میگیرد به اینترپل کمک کرده و پرونده دیگر سازمانهای جهان را قبول کرده و به آنها نیز کمک کند. او برای سادهتر کردن دریافت پروندهها تصمیم میگیرد به API این سازمانها متصل شده و پروندهها را از این راه دریافت کند. اما با توجه به اینکه قرار است به چندین سازمان مختلف متصل شود، در این راه با پیچیدگیهای مختلفی مواجه میشود. به او کمک کنید این پیچیدگیها را حل کرده و به این سازمانها کمک کند.
برنامه شما در ابتدا باید با دریافت یک فایل YAML با ساختار زیر که با نام config.yaml
در پوشه روت سیستمعاملی که کد شما در آن اجرا میشود قرار گرفته (یعنی باید فایل را در آدرس \config.yaml
بخوانید)، آدرس سازمانهایی که شرلوک میخواهد به آنها متصل شود را دریافت کند:
در این زیر برنامه، برنامه شما باید با گوش کردن روی آدرس 0.0.0.0:80
با دریافت درخواستهای GET
بر روی اندپوینت /
درخواستها را به صورت مساوی و برابر بین سازمانهای مختلف پخش کرده (به آدرس مشخص شده در فایل YAML درخواست GET
ارسال کند) و به شرلوک بازگردانی کند.
شرلوک پس از استفاده از برنامه اول متوجه میشود که بررسی پروندهها بدون دسته بندی سخت و پیچیده است. به همین علت تصمیم میگیرد با اضافه کردن یک پارامتر کوئری به درخواستها، دستهبندی آنها را برای دریافت مشخص کند.
برنامه شما باید با گوش کردن روی پورت 0.0.0.0:80
با دریافت درخواستهای GET
بر روی اندپوینت /
بر اساس کوئری پارامتر type
مشخص شده درخواستها را به صورت مساوی بین آدرسهای نوع پرونده پخش کنید.
برای مثال با دریافت درخواست /?type=vice
باید درخواستها بین سازمانهای ۱ و ۲ به صورت مساوی پخش شود. و اگر تایپ درخواست در بین تایپهای موجود در فایل config.yaml
نبود، یک پیام با کد HTTP 400
و بدنه The Specified Type is Not Correct
برگرداند.
در صورتی که درخواستی بدون تایپ به API ارسال شد، شما باید مانند مرحله قبل درخواستها را به صورت مساوی بین همه سازمانها پخش کنید.
پس از بررسیهای بیشتر، شرلوک متوجه میشود که بعضی از سازمانها بیشتر از بقیه نیاز به کمک دارند. برای همین تصمیم میگیرد که توجه بیشتری را معطوف به این سازمانها کند. در این زیر برنامه باید زیر برنامه قبلی را طوری تغییر دهید که درخواستها را به جای پخش مساوی، به صورت وزندار و با وزنهای مشخص شده بین سازمانها پخش کند.
تضمین میشود که وزن سازمانها عددی صحیح و مجموع آنها در هر نوع برابر ۱۰۰ باشد.
برای مشخص کردن اینکه آیا نیاز است درخواستها به طور وزن دار یا بدون وزن تقسیم شوند، یک کوئری پارامتر دیگر با نام weighted
اضافه میشود که مقدار آن برابر true
است.
برای مثال با دریافت درخواست /?type=homicide&weighted=true
باید درخواستها با وزن ۶۵ و ۳۵ بین سازمانهای ۱ و ۲ پخش شود. برای پخش درخواستها شما باید کوچکترین چرخهای که میتواند درخواستها را با این وزن پخش کند را انتخاب و از آن استفاده کنید. یعنی برای این مثال باید در هر ۲۰ درخواستی که به سمت برنامه ارسال میشود، ۱۳ درخواست به سازمان ۱ و ۷ درخواست به سازمان ۲ ارسال شود.
در این مرحله در صورتی که درخواستی بدون تایپ به API ارسال شد، شما باید مانند مرحله قبل درخواستها را به صورت مساوی بین همه سازمانها پخش کنید.
توجه کنید که در صورتی که کوئری پارامتر weighted
وجود نداشت یا هر مقدار دیگری بجز true
داشت، برنامه شما باید رفتار قبلی خود را داشته باشد.
شرلوک که از تقسیم بار ورندار خوشش آمده، حالا دیگر نمیخواهد نوع درخواستها را مشخص کند. در این مرحله شما باید زیربرنامه سوم را طوری تغییر دهید که در صورتی که درخواستی بدون تایپ و با کوئری پارامتر weighted
و مقدار true
ارسال شد، درخواستها را در بین تمامی سازمانها بدون توجه به نوع آنها به صورت وزندار پخش کند. در این مرحله نیز شما باید کوچکترین چرخهای که میتواند درخواستها را با این وزن پخش کند را انتخاب و از آن استفاده کنید.
برای اجرای کد شما از داکر استفاده میشود. برای آشنایی با این ابزار از این لینک کمک بگیرید.
شما باید با انتخاب یکی از ایمیجهای استاندارد کوئرا به عنوان Base Image خود، داکرفایلی بنویسید که پروژه شما را بیلد کند.
سیستم داوری کوئرا پس از بیلد کردن پروژه شما، فایل تنظیمات را در آن قرار داده و آن را اجرا کرده و تست میکند.
برای ارسال پروژه، شما باید پوشهای به شکل زیر ساخته و به صورت فایل ZIP
به طوری که پوشه solution
درون فایل قرار داشته باشد ارسال نمایید.
کد شما و هر چیز دیگری که برای اجرای کد به آن نیاز دارید، باید در پوشه src
قرار بگیرد.
شرلوک که حالا به استفاده از APIهای مختلف برای اتصال به سازمانها عادت کرده، در هنگام اتصال به APIهای اسکاتلند یارد دچار مشکل میشود. او که فرصت کمی برای بررسی مشکل دارد، از واتسون میخواهد با بررسی لاگهای سرویسهای اسکاتلند یارد سرویسهای دچار مشکل را پیدا کرده و مشکل آنها را گزارش کند.
معماری داخلی سرویسهای اسکاتلند یارد میکروسرویس است، در این معماری سرویسهای متعددی وجود دارند که هر یک وظیفه مشخصی دارند و ممکن است برای پاسخ به درخواست کاربر، گروهی از آنها با یکدیگر ارتباط برقرار کرده تا پاسخ درخواست را آماده کنند.
در این معماری برای عیب یابی و دنبال کردن مسیر درخواست کاربرها در سرویسها، به هر درخواست یک آیدی منحصر به فرد اختصاص داده شده و با استفاده از این آیدی، اعمالی که هر سرویس در مسیر شروع تا پاسخگویی به درخواست انجام داده ثبت میشود.
اگر دقت کنیم، متوجه میشویم که میتوان هر یک از این اعمال (ارتباط با یک سرویس دیگر) را به شکل یک درخواست و پاسخ مستقل نگاه کرد. با توجه به این مسئله هر یک از این اعمال را به عنوان یک واحد مستقل به نام Span میشناسیم.
با این تعریف هر Span میتواند شامل Span های متفاوتی شود.
برای مثال اگر معماری زیر را داشته باشیم:
مسیر یک درخواست میتواند به شکل زیر باشد (خطوط افقی همان Span ها هستند):
همچنین ممکن است که یک درخواست دچار مشکل شود. در اینصورت، Span آن و تمامی Span های والد آن نیز دچار مشکل میشوند. برای مثال میتوانید مسیر درخواستی که با خطا مواجه شده را در تصویر زیر مشاهده کنید:
اسکاتلند یارد، دادههای درخواستهای خود را به صورت فایلهای JSON در اختیار دارد اما ابزاری برای تحلیل آنها ندارد.
به واتسون کمک کنید ابزاری توسعه دهد که با استفاده از این اطلاعات مشکل را پیدا کرده و در صورتی که درخواست با خطا مواجه شده، اطلاعات آن خطا و سرویسی که باعث آن خطا بوده را پیدا کرده و چاپ کند و در غیر اینصورت، بگوید که مشکلی در درخواست وجود نداشته.
در قدم اول برای آشنایی شما با روند حل این مسئله، میتوانید با دریافت فایل لاگ نمونه و مشاهده ورودی و خروجی مورد انتظار، رابطه بین آنها را کشف کنید. سپس از شما انتظار میرود که برنامهای بنویسید که لاگها را از
stdin
دریافت و به صورت اتوماتیک با توجه به ورودی، خروجی مورد انتظار را پیدا کرده و چاپ کند.
برای درخواست اول باید برنامه شما عبارت Provided request has no errors
را چاپ و برای درخواست دوم اطلاعات زیر را به همین شکل چاپ کند:
واتسون که پس از حل مشکلات میکروسرویسهای اسکاتلندیارد به دوآپس علاقهمند شده، تصمیم میگیرد در کنار پزشکی شروع به یادگیری کوبرنیتیز کند. زمانی که بازرس لستراد متوجه این خبر میشود، با خوشحالی از واتسون میخواهد که با بررسی هلم چارت یکی از سرورهای اسکاتلند یارد که برای کار با شرلوک مستقر شده، مشکلات آن را رفع کند.
او به واتسون میگوید که این هلم چارت قبلا کار میکرده; اما زمانی که یکی از اعضای تیم فنی اسکاتلند یارد تلاش کرده مقدارهای متغیرهای محیطی درون فایل values.yaml
را به دیپلویمنت سرور اضافه کند، آن را خراب کرده و چون این هلم چارت در گیت نبوده، حالا نمیتوانند آن را بازگردانی کنند.
واتسون که هنوز حتی کوبرنیتیز را نیز بلد نیست، نمیداند چطور مشکلات هلم را حل کند. به او کمک کنید که ابتدا مشکل چارت را حل کرده و سپس متغیرهای محیطی درون فایل values.yaml
را به فایل deployment.yaml
اضافه کند.
شما میتوانید پروژه اولیه را از این لینک دانلود کرده و با استفاده از دستور helm
مشکل آن را پیدا کرده و حل کنید. پس از حل مشکل نیز باید فایل deployment.yaml
را طوری تغییر دهید که تمامی متغیرهای محیطی موجود در فایل values.yaml
و کلید env
را به صورت داینامیک در قسمت صحیح دیپلویمنت قرار دهید.
در نهایت و پس از حل مشکلات و اضافه کردن نیازمندیها، فایل deployment.yaml
را بارگذاری نمایید.