عنوان:

‫لینوکس برای توسعه‌دهندگان دات‌نت: از ویندوز تا کراس-پلتفرم؛ خودآزمایی


نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۴/۳۰ ۰۸:۱۰
آدرس: www.dntips.ir
این آزمون برای سنجش درک شما از مفاهیم کلیدی ارائه شده در دوره «لینوکس برای توسعه‌دهندگان دات‌نت» طراحی شده است. بهترین گزینه را برای هر پرسش انتخاب کنید.

پرسش‌ها

۱. کدی که فایل "Config.json" را می‌خواند، روی ویندوز به درستی کار می‌کند اما روی سرور لینوکس خطای FileNotFoundException می‌دهد. محتمل‌ترین دلیل چیست؟
الف) در لینوکس دسترسی به فایل‌ها به طور پیش‌فرض ممنوع است.
ب) نام واقعی فایل روی سرور config.json (با حروف کوچک) است.
ج) باید از اسلش (/) به جای بک‌اسلش (\) استفاده می‌کردید.
د) .NET Core روی لینوکس نمی‌تواند فایل‌های JSON را بخواند.

۲. کدامیک از گزینه‌های زیر، بهترین و امن‌ترین روش برای ساخت مسیر فایل "/var/log/myapp.log" در کد سی‌شارپ است؟
الف) "var" + "/" + "log" + "/" + "myapp.log"
ب) string.Format("{0}/{1}/{2}", "var", "log", "myapp.log")
ج) Path.Combine("/var", "log", "myapp.log")
د) "/var/log/myapp.log" به صورت رشته‌ی ثابت.

۳. پس از پابلیش کردن یک اپلیکیشن Self-Contained برای لینوکس، تلاش برای اجرای آن با دستور ./MyApp با خطای Permission Denied مواجه می‌شود. اولین قدم برای رفع مشکل چیست؟
الف) اجرای دستور sudo ./MyApp.
ب) اجرای دستور chown root:root ./MyApp.
ج) اجرای دستور dotnet restore.
د) اجرای دستور chmod +x ./MyApp.

۴. برای اطمینان از اینکه متن نوشته شده در یک فایل در هر دو سیستم‌عامل ویندوز و لینوکس به درستی خطوط جدید را نمایش می‌دهد، از کدام گزینه در کد #C باید استفاده کرد؟
الف) "\n"
ب) "\r\n"
ج) Environment.NewLine
د) System.IO.Path.AltDirectorySeparatorChar

۵. در مدل استقرار "وابسته به فریمورک" (Framework-Dependent)، پیش‌نیاز اصلی برای اجرای برنامه روی سرور لینوکس چیست؟
الف) نصب بودن .NET SDK روی سرور.
ب) نصب بودن .NET Runtime متناظر روی سرور.
ج) وجود داشتن داکر روی سرور.
د) داشتن دسترسی root برای اجرای برنامه.

۶. کدام متد به صورت مستقل از پلتفرم، مسیر پوشه‌ی خانگی کاربر (User's Home Directory) را برمی‌گرداند؟
الف) Directory.GetCurrentDirectory()
ب) Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
ج) Path.GetPathRoot(Environment.SystemDirectory)
د) /home/ به صورت رشته‌ی ثابت.

۷. برای اجرای یک قطعه کد مخصوصاً برای مدیریت رجیستری، فقط زمانی که برنامه روی ویندوز اجرا می‌شود، از کدام شرط باید استفاده کرد؟
الف) if (Environment.OSVersion.Platform == PlatformID.Win32NT)
ب) if (Path.DirectorySeparatorChar == '\\')
ج) if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
د) #if WINDOWS

۸. در یک برنامه ASP.NET Core، ترتیب اولویت بارگذاری تنظیمات چگونه است؟
الف) appsettings.json همیشه بر متغیرهای محیطی اولویت دارد.
ب) متغیرهای محیطی بر مقادیر موجود در appsettings.json اولویت دارند.
ج) فقط مقادیر موجود در appsettings.Production.json بارگذاری می‌شوند.
د) ترتیب آن‌ها تصادفی است.

۹. هدف اصلی استفاده از ساخت چندمرحله‌ای (Multi-stage builds) در یک Dockerfile برای اپلیکیشن دات‌نت چیست؟
الف) افزایش سرعت بیلد شدن ایمیج.
ب) کاهش حجم نهایی ایمیج داکر.
ج) امکان دیباگ کردن ساده‌تر درون کانتینر.
د) فعال‌سازی Hot Reload در کانتینر.

۱۰. برای اجرای یک برنامه به عنوان یک سرویس پایدار که پس از ریبوت شدن سرور به طور خودکار اجرا شود، از کدام ابزار در لینوکس مدرن استفاده می‌شود؟
الف) Docker Compose
ب) nohup
ج) systemd
د) Cron Job

۱۱. کدام دستور systemctl باعث می‌شود یک سرویس برای اجرای خودکار در هنگام بوت شدن سیستم، ثبت شود؟
الف) systemctl start myapp.service
ب) systemctl enable myapp.service
ج) systemctl reload myapp.service
د) systemctl status myapp.service

۱۲. برای اشکال‌زدایی زنده‌ی یک برنامه در حال اجرا روی سرور لینوکس از طریق ویژوال استودیو در ویندوز، از چه پروتکلی برای اتصال استفاده می‌شود؟
الف) FTP
ب) HTTP
ج) RDP
د) SSH

۱۳. برای مشاهده‌ی معیارهای عملکردی زنده مانند مصرف CPU و حافظه یک پروسه‌ی دات‌نت در خط فرمان لینوکس، کدام ابزار مناسب‌تر است؟
الف) dotnet-trace
ب) dotnet-dump
ج) dotnet-counters
د) top

۱۴. هنگام انتقال یک برنامه EF Core که روی ویندوز با SQL Server کار می‌کند به لینوکس با PostgreSQL، یک خطای رایج مربوط به پیدا نشدن جداول رخ می‌دهد. محتمل‌ترین دلیل چیست؟
الف) درایور PostgreSQL برای دات‌نت به درستی نصب نشده است.
ب) حساسیت به بزرگی و کوچکی حروف (Case-Sensitivity) در نام جداول و ستون‌ها.
ج) فایروال سرور لینوکس پورت PostgreSQL را مسدود کرده است.
د) رشته اتصال (Connection String) فرمت کاملاً متفاوتی دارد.

۱۵. برای نگاشت (map) پورت 8080 سیستم میزبان به پورت 80 کانتینر هنگام اجرای داکر، از کدام گزینه استفاده می‌شود؟
الف) docker run -p 80:8080 my-app
ب) docker run -p 8080:80 my-app
ج) docker run --port 8080-80 my-app
د) docker run -e PORT=8080:80 my-app

۱۶. ریشه‌ی فایل سیستم در لینوکس با کدام نماد مشخص می‌شود؟
الف) ~
ب) .
ج) C:\
د) /

۱۷. برای گرفتن یک تصویر کامل از حافظه (memory dump) یک برنامه دات‌نت که کرش کرده است جهت تحلیل آفلاین، کدام ابزار به کار می‌رود؟
الف) dotnet-watch
ب) dotnet-dump
ج) dotnet-counters
د) GDB

۱8. بهترین الگو برای مدیریت کدهای وابسته به پلتفرم (مثلاً سرویس نوتیفیکیشن در ویندوز و لینوکس) در یک پروژه بزرگ چیست؟
الف) استفاده از بلوک‌های #if/#endif در سراسر کد.
ب) نوشتن دو برنامه کاملاً مجزا.
ج) استفاده از یک اینترفیس مشترک و تزریق وابستگی پیاده‌سازی متناسب با پلتفرم.
د) قرار دادن تمام کدهای شرطی در کلاس Program.

۱۹. کدام گزینه در فایل systemd، دستوری را که باید برای اجرای سرویس فراخوانی شود، مشخص می‌کند؟
الف) WorkingDirectory
ب) ExecStart
ج) WantedBy
د) Description

۲۰. برای override کردن مقدار {"ConnectionStrings": {"DefaultConnection": "..."}} در appsettings.json با استفاده از متغیر محیطی، نام متغیر باید چه باشد؟
الف) ConnectionStrings:DefaultConnection
ب) ConnectionStrings.DefaultConnection
ج) ConnectionStrings__DefaultConnection
د) CONNECTION_STRING_DEFAULT


پاسخنامه تشریحی

۱. پاسخ صحیح: (ب) نام واقعی فایل روی سرور config.json (با حروف کوچک) است.
  • راهنمایی: سیستم‌عامل لینوکس به بزرگی و کوچکی حروف (Case-Sensitive) حساس است. بنابراین Config.json و config.json دو فایل کاملاً متفاوت هستند. ویندوز Case-Insensitive است و این تفاوت را نادیده می‌گیرد.

۲. پاسخ صحیح: (ج) Path.Combine("/var", "log", "myapp.log")
  • راهنمایی:Path.Combine به صورت هوشمند و بر اساس سیستم‌عامل، از کاراکتر جداساز مسیر صحیح (/ در لینوکس و \ در ویندوز) استفاده می‌کند و امن‌ترین راه برای ساخت مسیرهای پویا است.

۳. پاسخ صحیح: (د) اجرای دستور chmod +x ./MyApp
  • راهنمایی: در لینوکس، فایل‌ها به طور پیش‌فرض مجوز اجرا (Execute) ندارند. دستور chmod +x این مجوز را به فایل اضافه می‌کند تا بتوان آن را به عنوان یک برنامه اجرا کرد.

۴. پاسخ صحیح: (ج) Environment.NewLine
  • راهنمایی: این پراپرتی در زمان اجرا، کاراکتر صحیح پایان خط را بر اساس سیستم‌عامل میزبان برمی‌گرداند (\n برای لینوکس و \r\n برای ویندوز).

۵. پاسخ صحیح: (ب) نصب بودن .NET Runtime متناظر روی سرور.
  • راهنمایی: در این مدل، خود برنامه شامل فریمورک دات‌نت نیست و برای اجرا، به نسخه‌ی نصب شده‌ی Runtime روی سیستم‌عامل میزبان وابسته است.

۶. پاسخ صحیح: (ب) Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
  • راهنمایی: این متد روش استاندارد دات‌نت برای پیدا کردن پوشه‌های سیستمی خاص است و مسیر صحیح را در هر پلتفرمی (/home/user در لینوکس و C:\Users\user در ویندوز) برمی‌گرداند.

۷. پاسخ صحیح: (ج) if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
  • راهنمایی: این روش استاندارد و مدرن در دات‌نت برای تشخیص سیستم‌عامل در زمان اجراست و خوانایی و قابلیت اطمینان بالایی دارد.

۸. پاسخ صحیح: (ب) متغیرهای محیطی بر مقادیر موجود در appsettings.json اولویت دارند.
  • راهنمایی: این ویژگی به شما اجازه می‌دهد تنظیمات برنامه را در محیط‌های مختلف (توسعه، تست، پروداکشن) بدون تغییر فایل json و فقط با تنظیم متغیرهای محیطی تغییر دهید.

۹. پاسخ صحیح: (ب) کاهش حجم نهایی ایمیج داکر.
  • راهنمایی: در مرحله اول (build) از ایمیج بزرگ SDK برای کامپایل استفاده می‌شود و در مرحله نهایی، فقط خروجی پابلیش شده به ایمیج بسیار کوچک‌تر Runtime منتقل می‌شود.

۱۰. پاسخ صحیح: (ج) systemd
  • راهنمایی:systemd مدیر سرویس استاندارد در اکثر توزیع‌های مدرن لینوکس است و وظیفه مدیریت چرخه حیات سرویس‌ها را بر عهده دارد.

۱۱. پاسخ صحیح: (ب) systemctl enable myapp.service
  • راهنمایی: دستور enable یک لینک نمادین از سرویس شما در مسیری ایجاد می‌کند که systemd هنگام بوت شدن سیستم آن را می‌خواند و سرویس را اجرا می‌کند. start فقط سرویس را در همان لحظه اجرا می‌کند.

۱۲. پاسخ صحیح: (د) SSH
  • راهنمایی: ویژوال استودیو و ابزارهای مشابه از پروتکل امن SSH برای ایجاد یک تونل ارتباطی به سرور لینوکس، لیست کردن پروسه‌ها و اتصال دیباگر استفاده می‌کنند.

۱۳. پاسخ صحیح: (ج) dotnet-counters
  • راهنمایی:dotnet-counters یک ابزار سبک و سریع برای مانیتورینگ زنده‌ی معیارهای اصلی عملکرد است، در حالی که dotnet-trace و dotnet-dump برای تحلیل عمیق‌تر و آفلاین به کار می‌روند.

۱۴. پاسخ صحیح: (ب) حساسیت به بزرگی و کوچکی حروف (Case-Sensitivity) در نام جداول و ستون‌ها.
  • راهنمایی: این یکی از رایج‌ترین مشکلات هنگام مهاجرت است. نام جداول در کد EF Core باید دقیقاً با نام آن‌ها در پایگاه داده لینوکسی (که معمولاً case-sensitive است) مطابقت داشته باشد.

۱۵. پاسخ صحیح: (ب) docker run -p 8080:80 my-app
  • راهنمایی: فرمت صحیح پرچم -p یا --publish به صورت است. این دستور ترافیک ورودی به پورت 8080 میزبان را به پورت 80 داخل کانتینر هدایت می‌کند.

۱۶. پاسخ صحیح: (د) /
  • راهنمایی: در لینوکس، کل ساختار درختی فایل سیستم از یک ریشه واحد به نام / (forward slash) آغاز می‌شود.

۱۷. پاسخ صحیح: (ب) dotnet-dump
  • راهنمایی:dotnet-dump ابزار استاندارد برای گرفتن یک snapshot از حافظه یک پروسه است که می‌توان بعداً آن را برای یافتن علت کرش یا مشکلات حافظه تحلیل کرد.

۱8. پاسخ صحیح: (ج) استفاده از یک اینترفیس مشترک و تزریق وابستگی پیاده‌سازی متناسب با پلتفرم.
  • راهنمایی: این الگو (Strategy Pattern) باعث می‌شود کد اصلی برنامه تمیز و مستقل از پلتفرم باقی بماند و کدهای وابسته به پلتفرم در کلاس‌های جداگانه و ایزوله پیاده‌سازی شوند.

۱۹. پاسخ صحیح: (ب) ExecStart
  • راهنمایی:ExecStart در بخش [Service] یک فایل systemd، مسیر کامل فایل اجرایی و آرگومان‌های آن را برای شروع سرویس مشخص می‌کند.

۲۰. پاسخ صحیح: (ج) ConnectionStrings__DefaultConnection
  • راهنمایی: برای تبدیل ساختار تودرتوی JSON به یک متغیر محیطی مسطح، دات‌نت از دو خط زیر (__) به عنوان جداکننده استفاده می‌کند.

مطالب مشابه