اخیراً مشخص شده آنتی ویروس Windows Defender مایکروسافت به مدت نزدیک به 12 سال دارای یک رخنه امنیتی بوده است که به هکرها امکان بازنویسی فایلها و اجرای کدهای مخرب را میداده است. با این حال هنوز روشن نیست آیا هکرها و مجرمین موفق به شناسایی و استفاده از این باگ شدهاند یا نه، هرچند که 12 سال مدت بسیار طولانی به نظر میرسد.
Microsoft و دنیای سورس باز
نوروز مبارک!
سال نو مبارک
ارتباطات بلادرنگ و SignalR
- من از جزئیات کار شما اطلاعی ندارم. نه خطایی را عنوان کردید و نه پروژهای برای دیباگ پیوست شده. ایشان عنوان کرده که اجرا میشود؛ یک فیلم هم پیوست کرده. ضمنا با jQuery Ajax کار کرده قسمتی را. یعنی یک سری پیشنیاز دیگر را هم باید به پروژه و صفحه اضافه کنید. در کل از راه دور و بدون دیدن کار شما نمیشود نظر داد (کل کار البته).
- در آن مقاله سایت ثالث، dependency_OnChange فقط زمانی رجیستر میشود که GetData یکبار فراخوانی شود. ضمنا این کد نشتی حافظه دارد. چون مدام دارد new OnChangeEventHandler را ایجاد میکند بدون اینکه فکری برای حذف موارد ثبت شده کند. همچنین JobInfoRepository را در سطح یک Web API Controller وهله سازی کرده. یعنی این وهله به ازای هر درخواست رسیده یکبار ایجاد میشود (ونه اینکه یکبار ایجاد شده و بارها استفاده شود) و به این ترتیب یکبار دیگر نیز OnChangeEventHandler رجیستر خواهد شد. خلاصه اینکه روش مناسبی نبوده و توصیه نمیشود.
مطلبت حذف شد. تکرار کنی خودت هم حذف میشی. شک نداشته باش.
[1, 2, .., 10]
int[] arr1 = { 1, 2, 10 }; int[] arr2 = { 1, 2, 5, 10 }; int[] arr3 = { 1, 2, 5, 6, 7, 8, 9, 10 };
بررسی چند مثال جهت آشنایی با مفهوم List Patterns
ابتدا مجموعهی زیر را در نظر بگیرید:
int[] collection = { 1, 2, 3, 4 };
الف) روش انطباق با یک توالی مشخص
Console.WriteLine(collection is [1, 2, 3, 4]); // True Console.WriteLine(collection is [1, 2, 4]); // False
ب) امکان استفاده از discard و همچنین لیستی از عناصر
Console.WriteLine(collection is [_, 2, _, 4]); // True Console.WriteLine(collection is [.., 3, _]); // True
- الگوی دوم به معنای تعریف یک توالی نامشخص، اما خاتمه یافتهای با عنصر 3 است و سپس صرفنظر کردن از آخرین عنصر آرایه.
در مثال زیر، الگوی انطباق با مجموعهای که حداقل دو عضو دلخواهی را دارد، مشاهده میکنید:
if (new[] { 6, 7, 8 } is [_, _, ..]) { Console.WriteLine($"collection with at least two items"); }
if (new[] { 0, 42, 42, 0 } is [0, .., 0]) { Console.WriteLine($"collection with first and last element equal to 0"); }
ج) امکان تعریف اعمال منطقی
Console.WriteLine(collection is [_, >= 2, _, _]); // True
در مثال زیر، الگوی انطباق با مجموعهای را که اولین عضو آن یک عدد مثبت است، مشاهده میکنید:
if (new[] { 9, -1, -2 } is [> 0, ..]) { Console.WriteLine($"collection with positive first element"); }
if (new[] { 1, 42, 0 } is [_, 42 or -42, ..]) { Console.WriteLine($"collection with second element equal to 42 or -42"); }
یک مثال دیگر: بررسی نحوهی عملکرد List Patterns
namespace CS11Tests; public static class ListPatternsMatching { public static void Test() { Console.WriteLine(CheckSwitch(new[] { 1, 2, 10 })); // prints 1 Console.WriteLine(CheckSwitch(new[] { 1, 2, 7, 3, 3, 10 })); // prints 1 Console.WriteLine(CheckSwitch(new[] { 1, 2 })); // prints 2 Console.WriteLine(CheckSwitch(new[] { 1, 3 })); // prints 3 Console.WriteLine(CheckSwitch(new[] { 1, 3, 5 })); // prints 4 Console.WriteLine(CheckSwitch(new[] { 2, 5, 6, 7 })); // prints 50 } public static int CheckSwitch(int[] values) => values switch { [1, 2, .., 10] => 1, [1, 2] => 2, [1, _] => 3, [1, ..] => 4, [..] => 50 }; }
- اولین الگوی تعریف شدهی در متد CheckSwitch، به معنای انطباق با هر توالی است که با 1 و 2 شروع میشود و سپس میتواند شامل هر نوع توالی دلخواهی باشد (صرفنظر از مقدار و یا ترتیب این مقادیر) و در نهایت با عدد 10 خاتمه پیدا میکند.
- دومین الگوی تعریف شده، تنها یک آرایهی دو عضوی با مقادیر مشخص 1 و 2 را میپذیرد.
- توالی قابل انطباق با سومین الگوی تعریف شده، از دو عضو تشکیل میشود. اولین عضو آن حتما باید 1 باشد و مقدار دومین عضو آن مهم نیست.
- توالی قابل انطباق با چهارمین الگوی تعریف شده، از یک یا چند عضو دلخواه تشکیل میشود که اولین عضو آن حتما باید عدد 1 باشد.
- هر توالی تعریف شدهای با پنجمین الگوی تعریف شده، انطباق پیدا میکند.
امکان ترکیب list pattern matching و object pattern matching
در مثالهای زیر، نمونهای از ترکیب list pattern matching و object pattern matching را جهت ساخت شرطهای پیچیدهای، مشاهده میکنید:
if (new[] { 1, 2, 3 } is [var first, _, _]) { Console.WriteLine($"three item collection with first item {first}"); } if (new[] { 4, 5, 6 } is [_, var second, _]) { Console.WriteLine($"three item collection with second item {second}"); }
نمونه مثالی از این قابلیت جهت جدا سازی اجزای یک URL:
var uri = new Uri("http://www.mysite.com/categories/category-a/sub-categories/sub-category-a.html"); var result = uri.Segments switch { ["/"] => "Root", [_, var single] => single, [_, .. string[] entries, _] => string.Join(" > ", entries) };
سایر نوعهایی که توسط List patterns قابل بررسی هستند
List patterns تنها با آرایهها و لیستها کار نمیکنند. بلکه میتوان از آنها با هر نوعی که به همراه تعریف indexerها و یا خواص Length و Count است نیز استفاده کرد. اگر نیاز به استفاده از Slice patterns بود، این الگو با نوعهایی کار میکند که دارای indexer هایی با آرگومانهایی از نوع Range است و یا به همراه متد Slice دارای دو آرگومان Int است. برای مثال رشتهها نیز در اینجا قابل بررسی هستند.
دریافت اوبونتو
برای دریافت اوبونتو به آدرس ذیل مراجعه نمائید.
نسخه سرور آن GUI ندارد (هرچند بعدا در طی یک بسته 450 مگابایتی قابل نصب است). نسخه دسکتاپ آن به همراه GUI نیز هست. البته برای نصب دات نت بر روی آن این مساله تفاوتی نمیکند. برای نصب آزمایشی و مجازی آن هم میتوانید برای مثال از VMWare workstation استفاده کنید؛ بدون اینکه نیاز داشته باشید این توزیع خاص لینوکس را واقعا بر روی کامپیوتر خود نصب کنید.
در تمام قسمتهای ذیل فرض بر این است که ترمینال خط فرمان لینوکس را گشودهاید و همچنین سیستم به اینترنت وصل است.
دریافت Git و Curl
ابتدا دستور زیر را در خط فرمان لینوکس اجرا کنید تا سیستم بستههای لینوکس به روز شده و همچنین یک سری پیشنیاز مانند git ، curl و امثال آن نصب شوند (کتابخانه curl جهت استفاده در محیطهای برنامه نویسی کاربرد دارد و همچنین برنامه پیشرفتهای است برای کار با وب و دریافت فایلها):
sudo apt-get update && sudo apt-get -y install git-core curl python-software-properties sudo apt-get install build-essential automake checkinstall intltool git
نصب آخرین نگارش Mono و وابستگیهای آن
در ادامه نوبت به نصب آخرین نگارش مونو است. از روش متداول ذیل برای نصب مونو استفاده نکنید :
sudo apt-get install mono-complete
sudo apt-get purge mono-runtime
و یا اگر آدرس فوق برقرار نبود از اینجا: install_mono-3.0-sh
برای نمونه جهت نصب mono نگارش 3 از اسکریپت install_mono-3.0.sh به نحو ذیل استفاده خواهیم کرد (این دستورات را به ترتیب در ترمینال لینوکس اجرا کنید):
mkdir mono-3.0 cd mono-3.0 wget --no-check-certificate https://github.com/nathanb/iws-snippets/raw/master/mono-install-scripts/ubuntu/install_mono-3.0.sh chmod 755 install_mono-3.0.sh ./install_mono-3.0.sh
بعد از اجرای فرمان فوق به خطای ذیل خواهید رسید:
config.status: error: cannot find input file: `po/mcs/Makefile.in.in'
برای رفع آن ابتدا به مسیر ذیل وارد شوید (پوشه build/mono-3.0.10/po)، فایل mcs را حذف (این مورد در اصل یک پوشه است و نه یک فایل) و سپس بسته اصلی mono را از github دریافت کنید. آنرا unzip کرده و کل پوشه mcs داخل آنرا به درون پوشه po جاری کپی کنید. سپس فایل zip دریافت شده را حذف کنید:
cd mono-3.0/build/mono-3.0.10/po rm mcs wget https://github.com/mono/mono/archive/master.zip unzip master.zip mv mcs/ mono-3.0/build/mono-3.0.10/po rm -rf mono-master master.zip
پس از باز سازی پوشه مفقود mcs، باید مرحله «building mono packages» موجود در فایل install_mono-3.0.sh اجرا شود. برای این منظور، فایل final-build-mono-3.0.sh را از آدرس ذیل دریافت و در کنار فایل install_mono-3.0.sh موجود کپی کنید.
سپس در خواص این فایل، مجوز execute را نیز فعال نمائید. اکنون آنرا اجرا کنید:
./final-build-mono-3.0.sh
اکنون مدتی صبر کنید تا کار کامپایل نهایی تمام بستههای دریافت شده پس از اجرای اسکریپت final-build-mono-3.0.sh انجام شود.
آزمایش Mono نصب شده
برای اینکه مطمئن شویم، Mono درست نصب شده است، دستور زیر را در خط فرمان صادر کنید:
/opt/mono-3.0/bin/mono -V
برای اینکه این مسیر را به Path لینوکس اضافه کنیم تا قادر شویم فرمان mono را در هر مسیری اجرا کنیم، ابتدا دستور ذیل را اجرا کرده
sudo nano /etc/environment
:/opt/mono-3.0/bin
بعد ctrl+x را زده، به پیام ذخیره سازی تغییرات پاسخ مثبت دهید. سپس نیاز است یکبار logoff و login کنید تا این تغییرات اعمال شوند.
یک نکته تکمیلی:
اگر به صفحه نگارشهای رسمی Mono 3.x مراجعه کنید، نگارشهای جدیدتری را نیز میتوانید ملاحظه کنید. فایلهای قابل نصب آنها نیر در آدرسهای ذیل قرار دارند:
برای استفاده از اسکریپت install_mono-3.0.sh با این نگارشهای جدیدتر فقط کافی است تعاریف ذیل را بر اساس شماره نگارش بستههای جدید اصلاح کنید:
PACKAGES=("mono-3.0.10" "libgdiplus-2.10.9" "gtk-sharp-2.12.11" "xsp-2.10.2" "mod_mono-2.10") URLS=("http://download.mono-project.com/sources/mono/mono-3.0.10.tar.bz2" "http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.9.tar.bz2" "http://download.mono-project.com/sources/gtk-sharp212/gtk-sharp-2.12.11.tar.bz2" "http://download.mono-project.com/sources/xsp/xsp-2.10.2.tar.bz2" "http://download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2")
متدهای async تقلبی
مبانی Async در C# 5
مرورگرها در آینده مجهز به AI میشن اصلیترین دلیلش هم بحث privacy است؛ حین کار با LLMها مسئله امنیت دادهها موضوع به شدت مهمی است؛ روشهای برای anonymise کردن ورودیهای این LLMها قابلانجام است اما مسئله این است که اگر کانتکست کافی وجود نداشته باشد خروجی به آن اندازهایی که انتظار داریم شاید مفید نباشد. مدتی است گوگل به صورت آزمایشی در حال اضافه کردن امکان استفاده از LLMها (در حال حاضر Gemini Nano) به مرورگر Chrome است. یکی دیگه از مزایای قراردادن LLMها درون مرورگر پاسخگویی سریع به درخواستها میباشد در اینحالت دیگر نیاز به ارسال درخواست به یک Remote LLM کمتر خواهد شد؛ با پائین آمدن latency، کاربران تجربه نزدیکتر به real-time را احساس خواهند کرد. لازم به ذکر است این قابلیت به صورت آزمایشی و فعلاً در حد یک proposal میباشد و فقط در نسخههای Canary و Dev قابل استفاده میباشد.