انتشار Unity 2018.1
The Visual Studio team is excited about the Unity 2018.1 release: It’s the start of a new release cycle packed with great new features like the Scriptable Render Pipeline and the C# Job System. You can read the full blog post by Unity for all the details on what’s new in the 2018.1 release.
ASP.NET MVC #13
در پروژه اصلی مشکلی نیست ولی وقتی در DomainClasses کلاس CustomValidator را اضافه میکنم خطای زیر و میگیرم
The type name 'ModelClientValidationRule' could not be found. This type has been forwarded to assembly 'System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. Consider adding a reference to that assembly.
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> </assemblyBinding> </runtime>
حدود یک سال قبل کامپیوتری را که داشتم (اینتل پنتیوم 4) به یک AMD دوهستهای ارتقاء دادم و هفتهی اول پس از ارتقاء، روزگار من سیاه شد! روزهای اول 2 بار کرش ویندوز و مشاهده صفحه آبی و روزهای بعد تا 7 بار این اتفاق تکرار میشد. حتی تا تعویض مادربرد جدید هم پیش رفتم ولی تاثیری نداشت. تست رم و غیره هم انجام شد، مشکلی نبود. خلاصه اینجا بود که از سر ناچاری به این فکر افتادم که آیا این پیغامهای صفحهی آبی ویندوز را میشود تفسیر کرد؟ مشکل دقیقا از کجاست؟ چون در این موارد به هر کسی که مراجعه کنید بر اساس تجربه قبلی یک نسخه برای شما خواهد پیچید. رمت خرابه! بایوست رو ارتقاء بده! (این مورد تاثیر داشت! ولی تعداد کرشها صفر نشد) مادربردت مشکل داره و ...
تمام اینها بر اساس تجربیات قبلی این افراد است و ارزشمند. ولی آیا این جوابها قانع کننده هستند؟ چرا باید رم را عوض کرد؟ از کجا فهمیدید مادربرد مشکل داره؟
شرکتهایی مثل apple برای اینکه با این نوع مشکلات مواجه نشوند، به صورت انحصاری با تولید کنندگان سخت افزار قرار داد میبندند و در نتیجه سیستم عاملی هم که تولید میکنند بسیار پایدار خواهد بود چون بر اساس سخت افزاری کاملا مشخص، طراحی و تست شده است. اما در مورد ویندوز اینطور نیست.
ضمنا هیچ الزامی هم ندارد که این صفحه آبی ویندوز بدلیل مشکلات سخت افزاری حاصل شود (وجود سخت افزار معیوب). ضعف برنامه نویسی و خصوصا درایورهای مشکل دار هم میتوانند سبب ایجاد این نوع صفحات آبی شوند که مشکل من هم دقیقا همین مورد بود که در ادامه نحوه بررسی آنرا توضیح خواهم داد. (البته سطح این مطلب را مقدماتی در نظر بگیرید)
در ویندوز این امکان وجود دارد که پس از هر بار کرش سیستم عامل و مشاهده صفحه آبی یک دامپ کرنل نیز به صورت خودکار حاصل شود. این فایل دامپ را میتوان پس از راه اندازی مجدد سیستم با یک سری ابزار آنالیز کرد و علت دقیق کرش ویندوز را بدست آورد.
برای اینکه این فایلهای دامپ تولید شوند باید مراحل زیر مطابق تصویر طی شوند:
اکنون بعد از هر کرش و صفحه آبی ویندوز یک فایل دامپ در دایرکتوری C:\WINDOWS\Minidump تشکیل میشود. برای آنالیز این فایلها به صورت زیر میشود عمل کرد:
ابتدا برنامه زیر را دانلود کنید:
Debugging Tools for Windows
پس از نصب، Debugging Tools for Windows را خواهید داشت که جهت دیباگ کردن سیستم و آنالیز فایلهای دامپ و غیره کاربرد دارد.
سپس مطالعه مقاله زیر در مورد نحوه استفاده از این ابزار بسیار مفید است:
http://support.microsoft.com/kb/315263
به صورت خلاصه :
یک فایل bat درست کنید با محتویات زیر و دقیقا به همین شکل:
c:\windbg\kd -y srv*c:\symbols*http://msdl.microsoft.com/download/symbols -i c:\windows\i386 -z %1
در این دستور سه مورد قابل ملاحظه است:
الف) مسیر فایل kd.exe که توسط پکیج Debugging Tools for Windows نصب میشود. (مطابق سیستم خودتان آنرا اصلاح کنید)
ب) مسیر c:\windows\i386 بدین معنا است که دایرکتوری i386 سی دی ویندوز را در این مسیر کپی کردهاید یا خواهید کرد (نیاز به یک ویندوز تر و تازه و نصب نشده خواهد بود).
ج) مسیر c:\symbols خودبخود ایجاد خواهد شد و فایلهای مربوطه از سایت مایکروسافت توسط برنامه kd.exe دانلود میشود (بنابراین باید دسترسی به اینترنت نیز داشت).
فرض کنید نام این فایل را test.bat گذاشتهاید.
برای آنالیز فایل Mini102607-07.dmp در دایرکتوری مینی دامپ ویندوز (07 در اینجا یعنی هفتمین کرش روز مربوطه!) دستور زیر را در خط فرمان صادر کنید:
test.bat C:\WINDOWS\Minidump\Mini102607-07.dmp
نتیجه یک نمونه از این آنالیزهای سیستم من به صورت زیر بود:
BAD_POOL_CALLER (c2)
The current thread is making a bad pool request. Typically this is at a bad IRQL level or double freeing the same allocation, etc.
Arguments:
Arg1: 00000007, Attempt to free pool which was already freed
Arg2: 00000cd4, (reserved)
Arg3: 02060008, Memory contents of the pool block
Arg4: 88b4a118, Address of the block of pool being deallocated
Debugging Details:
------------------
POOL_ADDRESS: 88b4a118
FREED_POOL_TAG: TCPc
BUGCHECK_STR: 0xc2_7_TCPc
CUSTOMER_CRASH_COUNT: 4
DEFAULT_BUCKET_ID: COMMON_SYSTEM_FAULT
PROCESS_NAME: System
LAST_CONTROL_TRANSFER: from 8054a583 to 804f9deb
STACK_TEXT:
ba4f3874 8054a583 000000c2 00000007 00000cd4 nt!KeBugCheckEx+0x1b
ba4f38c4 b043d3ff 88b4a118 00000000 ba4f390c nt!ExFreePoolWithTag+0x2a3
ba4f38d4 b043cca3 883ae760 883ae7f4 883ae7f4 tcpip!TCPClose+0x16
ba4f390c b02f3161 8a74fe20 883ae760 b02f2a6d tcpip!TCPDispatch+0x101
WARNING: Stack unwind information not available. Following frames may be wrong.
ba4f3984 b03e2046 00000001 00000000 ba4f39d8 vsdatant+0x45161
ba4f39d8 b03e921c 00000008 ba4f3aac 00000000 ipnat!NatpRedirectQueryHandler+0x250
ba4f3a70 00000000 8837d8e8 0000000d 000005ee ipnat!NatpDirectPacket+0xd2
STACK_COMMAND: kb
FOLLOWUP_IP:
vsdatant+45161
b02f3161 ?? ???
SYMBOL_STACK_INDEX: 4
SYMBOL_NAME: vsdatant+45161
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: vsdatant
IMAGE_NAME: vsdatant.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 46e0766a
FAILURE_BUCKET_ID: 0xc2_7_TCPc_vsdatant+45161
BUCKET_ID: 0xc2_7_TCPc_vsdatant+45161
Followup: MachineOwner
به لاگ حاصل از دو دیدگاه میتوان پرداخت: الف) اگر من برنامه نویس مربوطه باشم، با trace موجود در لاگ فایل، مشخص میشود که کجای کار مشکل داشته است ، ب) یا اینکه خیر. بنده توسعه دهنده درایور نیستم. حداقل اسم دقیق درایور یا پروسه مشکلزا را میتوان از این لاگ بدست آورد.
خوب! تا اینجا مشخص شد که دلیل کرش، درایور vsdatant.sys است. با جستجو در اینترنت مشخص شد که این درایور مربوط به فایروال زون آلارم است! (همین عبارت بالا یا نام درایور ذکر شده را مستقیما در گوگل جستجو کنید)
پس از آن زون آلارم را با outpost firewall جایگزین کردم و تا الان کرشی حاصل نشده است (حتی یکبار از سال قبل تا به امروز). جدا زندگی من مختل شده بود. تصور کنید سیستم شما روزی 7 بار کرش کند!! و چه تصورات نامربوطی را نسبت به فروشنده سخت افزار در ذهن خود مرور کرده باشید!
خلاصهی کلام:
صفحات آبی ویندوز قابل تفسیر هستند. پدید آمدن آنها الزاما بدلیل وجود سخت افزار معیوب نیست و به صرف اینکه شخصی به شما گفته "رمت خرابه!" اکتفا نکنید.
پ.ن.
لاگ فوق مربوط به یک سال قبل است و احتمالا شاید زون آلارمهای جدید این مشکل را نداشته باشند.
کمک به مرورگر، در جهت تمایز بین صفحات ورود و ثبت نام
مرورگرهای جدید قادرند برای صفحهی لاگین، پر کردن خودکار فیلدهای نام کاربری و کلمهی عبور و برای صفحهی ثبت نام، تولید خودکار کلمات عبور قوی، به همراه بهخاطر سپاری آنرا ارائه دهند. برای فعال سازی یک چنین قابلیتهای ویژهای، نیاز است تا یک سری ویژگی را به فیلدهای ورود کلمات عبور اضافه کرد:
الف) نیاز است autocomplete را به نحو صحیحی مقدار دهی کرد:
- اگر مقدار آن مساوی new-password درنظر گرفته شود، یعنی صفحهی جاری، صفحهی ثبت نام است و نیاز است تا تولید کنندهی خودکار کلمات عبور مرورگر و بخاطر سپاری آن فعال شوند.
- اگر مقدار آن مساوی current-password درنظر گرفته شود، یعنی صفحهی جاری، صفحهی لاگین است و کاربر نیاز دارد تا کلمهی عبوری را که پیشتر در حین ثبت نام و یا حتی لاگین موفق قبلی وارد کردهاست، بتواند به سادگی از طریق password manager مرورگر دریافت کند.
ب) بنابراین تا اینجا روش تمایز بین فیلدهای پسورد صفحات لاگین و ثبت نام مشخص شد. اما در مورد نام کاربری چطور؟
برای این حالت فقط کافی است مقدار autocomplete را به username تنظیم کرد تا مرورگر بداند که چگونه باید اطلاعات password manager خودش را به صورت خودکار تامین کند. البته "autocomplete="username در اصل برای معرفی ایمیلها طراحی شدهاست، اما در استفادههای برنامههای کاربردی ما، جهت معرفی مقدار نام کاربری که کاربر قرار است توسط آن به برنامه وارد شود، کفایت میکند.
سفارشی سازی تولید کنندهی خودکار کلمات عبور مرورگر
عنوان شد که اگر مقدار autocomplete در صفحات ثبت نام، به مقدار new-password تنظیم شود، یک چنین فیلد ورودی به صورت خودکار به همراه قابلیت ویژهی «تولید کنندهی خودکار کلمات عبور مرورگر» نیز خواهد بود. میتوان این ابزار توکار مرورگرها را نیز سفارشی سازی کرد و بر روی نحوهی تولید کلمات عبور آن تاثیر گذاشت:
<input type="password" autocomplete="new-password" passwordrules="required: upper; required: lower; required: digit; minlength: 25; allowed: [-().&@?'#,/"+]; max-consecutive: 2">
- کلمهی عبور تولیدی توسط مرورگر باید حداقل به همراه یک عدد، یک حرف بزرگ و یک حرف کوچک باشد.
- حداقل 25 حرف باشد.
- استفادهی از حروف ویژهی -().&@?'#,/"+ در آن مجاز است.
- حداکثر تعداد حروف مشابه متوالی آن باید 2 حرف باشد.
نیاز به خاموش کردن تصحیحهای هوشمند مرورگرها
مرورگرها میتوانند برای مثال حروف ابتدای عبارت وارد شده را به صورت خودکار تبدیل به کلمات بزرگ کنند و یا حتی با استفاده از واژه نامهها، اطلاعات ورودی را تصحیح کنند. یک چنین قابلیتی نباید برای فلیدهای کلمات عبور فعال باشد. به همین جهت ضروری است این فلیدها با ویژگیهای "autocapitalize="off و "autocorrect="off مزین شوند.
کمک به مرورگرها در جهت تعویض کلمات عبور ضعیف و فاش شده!
برای نمونه مرورگر کروم به همراه قسمتی است که بر اساس password manager توکار خودش و اطلاعات فاش شدهی بر روی اینترنت، عنوان میکند که کدامیک از کلمات عبور شما دیگر امن نیستند و بهتر است آنها را عوض کنید. این صفحه را میتوانید در آدرس ویژهی chrome://settings/passwords مرورگر کروم مشاهده کنید.
نکتهی مهم اینجا است که این مرورگر، دکمهی Change password و لینکی را نیز به سایت و برنامهی مدنظر، برای تعویض کلمهی عبور ارائه میدهد و این لینک، قالب ثابت و ویژهای دارد: https://example.com/.well-known/change-password
یعنی هموار کاربر را به آدرس ثابت well-known/change-password. در سایت شما هدایت میکند و در این حالت بهتر است یک route ویژهی خاص آنرا تعریف کرده و کاربر را به صورت خودکار به صفحهی اصلی تعویض کلمهی عبور، برای مثال به آدرس فرضی https://example.com/settings/change-password به صورت خودکار هدایت کنید.
یک نمونه مثال این هدایت خودکار در یک برنامهی ASP.NET Core به صورت زیر است:
app.UseEndpoints(endpoints => { // TODO: Add it to your app! // Improves chrome://settings/passwords page by managing `Change password` button next to a password. endpoints.MapGet("/.well-known/change-password", context => { // `/.well-known/change-password` address will be called by the `Change password` button of the Chrome. // Now our Web-API app redirects the user to the `/change-password` address of the App. context.Response.Redirect("/change-password", true); return Task.CompletedTask; }); endpoints.MapRazorPages(); // ... });
داخل یک Image چیست؟
در قسمت قبل دریافتیم که یک Image، از کل User Space مورد نیاز جهت اجرای یک برنامه تشکیل میشود. در ادامه میخواهیم بررسی کنیم، این ادعا تا چه حد صحت دارد و یک Image، واقعا از چه اجزائی تشکیل میشود.
با استفاده از دستور docker images میتوان لیست imageهای دریافت شده را به همراه tagهای مرتبط با هر کدام، مشاهده کرد. سپس با استفاده از دستور docker save میتوان image ای خاص را export کرد؛ برای مثال:
docker save microsoft/iis:nanoserver -o iis.tar
البته ویندوز در حالت استاندارد آن، قابلیت کار با فایلهای tar را ندارد. هرچند میتوان از نرم افزارهای ثالثی مانند win-rar و یا 7zip برای انجام اینکار استفاده کرد، اما تمام Linux Containers، به همراه ابزار کمکی tar، برای استخراج محتوای این نوع فایلها نیز هستند. بنابراین نیاز است از حالت Windows Containers به Linux Containers سوئیچ کرد. برای اینکار فقط کافی بر روی آیکن Docker در قسمت Tray Icons ویندوز کلیک راست نمود و گزینهی Switch to Linux Containers را انتخاب کرد. اکنون اگر دستور docker images را صادر کنیم، تنها لیست imageهای لینوکسی از پیش دریافت شده را میتوان مشاهده کرد.
در ادامه، image یکی از سبکترین توزیعهای لینوکسی را به نام alpine، دریافت میکنیم که فقط 5 مگابایت حجم دارد؛ چون آنچنان فایلی در user space آن وجود ندارد. به همین جهت برای دریافت آن، دستور docker pull alpine را صادر میکنیم. اکنون اگر دستور docker images را صادر کنیم، این image جدید در لیست خروجی آن قابل مشاهدهاست.
سپس چون میخواهیم یک shell را در داخل این container اجرا کنیم (مانند اجرای کنسول PowerShell قسمت قبل)، نیاز است دستور docker run آنرا با سوئیچ it اجرا کنیم:
docker run -it alpine sh
اکنون میخواهیم به فایل iis.tar ای که export کردیم از اینجا دسترسی پیدا کنیم. این فایل نیز بر روی فایل سیستم ویندوز 10 تولید شدهاست. به همین جهت نیاز است بتوان به این فایل خارج از container جاری دسترسی پیدا کرد.
روش به اشتراک گذاری فایل سیستم میزبان با کانتینرها
برای اینکه از داخل یک container به فایلی در خارج از آن دسترسی پیدا کنیم، باید درایو آن فایل خارجی را اصطلاحا mount کرد؛ دقیقا مانند اتصال یک USB Stick به سیستم و اضافه شدن آن به صورت یک درایو جدید. در Docker، اینکار توسط مفهومی به نام Volumes انجام میشود. برای این منظور بر روی آیکن Docker در قسمت Tray Icons ویندوز کلیک راست کرده و گزینهی Settings را انتخاب کنید. البته این تصویر را در حالت کار با Linux Containers مشاهده میکنید:
در اینجا درایو C را انتخاب و Apply کنید و سپس نام کاربری و کلمهی عبور ویندوز خود را وارد نمائید، تا مجوز دسترسی به این درایو، به این Container داده شود.
سپس دستور زیر را اجرا کنید:
docker run --rm -v c:/Users:/data alpine ls /data
- عبارت c:/Users:/data به این معنا است که پوشهی C:\users ویندوز را به مسیر data/ داخل container لینوکسی نگاشت کن. به همین جهت بین این دو قسمت یک : وجود دارد و مسیرهای لینوکسی فاقد نام درایو خاصی هستند.
در این دستور میتوان پوشهای خاص مانند c:/Users/Vahid:/data و یا فایلی خاص را مانند c:/Users/Vahid/iis.tar:/data نیز نگاشت کرد. مزیت آن کاهش سطح دسترسی Container به فایلهای سیستم میزبان است.
- این دستور با اجرای دستور ls، محتوای پوشهی C:\users را لیست میکند.
کار با فایلهای سیستم میزبان از داخل یک Container
در ادامه دستور فوق را به صورت زیر اجرا میکنیم که در آن فایل iis.tar میزبان، در داخل container در مسیر data/ آن قابل دسترسی شدهاست و همچنین بجای ls، دستور sh صادر شدهاست تا به shell آن دسترسی پیدا کنیم. به همین جهت نیاز به سوئیچ it نیز وجود دارد:
docker run --rm -it -v c:/Users/vahid/iis.tar:/data alpine sh
tar -tf /data/iis.tar
در اینجا حداقل هفت پوشه را مشاهده میکنید که داخل هر کدام فایلی به نام layer.tar قرار دارد؛ لایههایی که این image را ایجاد میکنند.
پس از این، اگر دستور استخراج این فایلها را صادر کنیم (t برای نمایش لیست محتویات است و x برای استخراج آنها):
mkdir /data/extract tar -xf /data/iis.tar -C /data/extract
انتقال فایلها از Container به سیستم میزبان
البته نکتهی مهم اینجا است که این پوشهی /data/extract/ صرفا داخل دیسک مجازی این container ایجاد شدهاست و در سمت ویندوز قابل دسترسی و مشاهده نیست.
برای رفع این مشکل، اینبار دستور tar -xf را به صورت زیر اجرا میکنیم:
docker run --rm -it -v c:/Users/vahid/:/data alpine tar -xf /data/iis.tar -C /data/iis
در اینجا اگر دستور tar را بر روی این لایهها اجرا کنیم، در نهایت به یک چنین خروجیهایی خواهیم رسید:
که بسیار شبیه به درایو C یک سیستم ویندوزی است. بنابراین این لایه، همان OS Apps & Libs را به همراه دارد که در قسمت قبل با آن آشنا شدیم.
یک مثال دیگر: اجرای ffmpeg توسط docker
اگر خاطرتان باشد بحث docker را در قسمت اول با معرفی ffmpeg و سخت بودن اجرای آن آغاز کردیم. در ادامه میخواهیم image آنرا دریافت و سپس با تبدیل آن به یک container، کار تبدیل فرمتهای ویدیویی را انجام دهیم:
docker run --rm --volume ${pwd}:/output jrottenberg/ffmpeg -i http://site.com/file.mp4 /output/file.gif
- سوئیچ rm کار حذف container ایجاد شده را پس از اتمام کار آن انجام میدهد.
- سپس مسیرجاری (پوشهی جاری در سیستم میزبان که دستور فوق را اجرا میکند) به مسیر output/ کانتینر نگاشت شدهاست.
- در ادامه مخزن dockerhub ای که ffmpeg قرار است از آن دریافت و اجرا شود، مشخص شدهاست.
- در آخر پارامترهای کار با ffmpeg برای دریافت یک فایل mp4 آنلاین و تبدیل آن به یک فایل animated gif محلی، ذکر شدهاند. این فایل در مسیر output کانتینر ایجاد میشود که در نهایت با میزبان، به اشتراک گذاشته خواهد شد.
- خروجی نهایی تولید شده را در سیستم میزبان در همان پوشهای که دستور فوق را صادر کردهاید، مشاهده خواهید کرد.
Samsung has released the fourth preview of Visual Studio Tools for Tizen. Tizen is a Linux-based open source OS running on over 50 million Samsung devices including TVs, wearables, and mobile phones. Since announcing its collaboration with Microsoft on .NET Core and Xamarin.Forms projects last November, Samsung has steadily released preview versions of.NET support for Tizen with enriched features, such as supporting TV application development and various Visual Studio tools for Tizen.