خلاصهای از Microsoft Build 2020
All recorded sessions from Build (including other general announcements from Microsoft) can be found on Channel9 and Microsoft's YouTube channel.
بهبودهای زمان و تاریخ در NET 6.
In this blog post, I’m going to cover the following topics:
- The new DateOnly and TimeOnly types
- Time Zone Conversion APIs
- Time Zone Display Names on Linux and macOS
- TimeZoneInfo.AdjustmentRule Improvements
For even more details, you can also refer to dotnet/runtime#45318 on GitHub.
بهبودهای WPF در NET 4.6.1.
With the 4.6.1 RC we have added support for WPF to recognize custom dictionaries registered globally. This capability is available in addition to the ability to register them per-control. Also, custom dictionaries in the previous versions of WPF had no affordance for Excluded Words and AutoCorrect lists. On Windows 8.1 and Windows 10, these scenarios are now enabled through the use of files that can be placed under %AppData%\Microsoft\Spelling\<language tag>.
- امکان عدم ذکر بعضی از پارامترهای Lambdas
- امکان تعریف متدهای static anonymous
امکان عدم ذکر بعضی از پارامترهای Lambdas در C# 9.0
مثال زیر را در نظر بگیرید:
Action<object, EventArgs> handler1 = (object obj, EventArgs args) => ShowDialog();
Action<object, EventArgs> handler2 = (object _, EventArgs _) => ShowDialog(); // OR Action<object, EventArgs> handler3 = (_, _) => ShowDialog();
نمونهی دیگر آن در حین تعریف رخدادگردانها است:
button1.Click += (s, e) => ShowDialog();
button1.Click += (_, _) => ShowDialog();
امکان تعریف Static anonymous functions در C# 9.0
برای کاهش میزان تخصیص حافظهی در حین کار با عبارات lambda ای که از متغیرهای محلی استفاده میکنند، اینبار در C# 9.0 میتوان این عبارات را static تعریف کرد. برای نمونه مثال زیر را درنظر بگیرید:
namespace CS9Features { public class LambdasTests { public void Test() { string text = "{0} is a good user !"; PrintItems(item => string.Format(text, item)); } private void PrintItems(Func<string, string> formatFunc) { foreach (var item in new[] { "User 1", "User 2" }) { Console.WriteLine(formatFunc(item)); } } } }
const string text = "{0} is a good user !"; PrintItems(static item => string.Format(text, item));
- این متد به عنوان static anonymous function شناخته میشود.
- دیگر نمیتواند دسترسی به حالت scope جاری را داشته باشد. بنابراین دیگر دسترسی به متغیرها، پارامترها و حتی شیء this را هم نخواهد داشت.
- میتواند با سایر اعضای استاتیک scope جاری کار کند.
- میتواند به تعاریف const مربوط به scope جاری، دسترسی داشته باشد.
در این مقاله مروری سریع و کاربردی خواهیم داشت بر تواناییهای مقدماتی LINQ to XML .
فایل Employee.XML را با محتویات زیر در نظر بگیرید:
<Employees>
<Employee>
<Name>Vahid</Name>
<Phone>11111111</Phone>
<Department>IT</Department>
<Age>52</Age>
</Employee>
<Employee>
<Name>Farid</Name>
<Phone>124578963</Phone>
<Department>Civil</Department>
<Age>35</Age>
</Employee>
<Employee>
<Name>Mehdi</Name>
<Phone>1245788754</Phone>
<Department>HR</Department>
<Age>30</Age>
</Employee>
</Employees>
1- چگونه یک فایل XML را جهت استفاده توسط LINQ بارگذاری کنیم؟
قبل از شروع، اسمبلی System.Xml.Linq باید به ارجاعات برنامه اضافه شود. سپس:
using System.Xml.Linq;
XDocument xDoc = XDocument.Load("Employee.xml");
2- اگر محتویات XML دریافتی به صورت رشته بود (مثلا از یک دیتابیس دریافت شد)، اکنون چگونه باید آنرا بارگذاری کرد؟
اینکار را با استفاده از یک StringReader به صورت زیر میتوان انجام داد:
// loading XML from string
StringReader sr = new StringReader(stringXML);
XDocument xDoc = XDocument.Load(sr);
3- چگونه یک کوئری ساده شامل تمامی رکوردهای Employee مجموعه Employees را تهیه کنیم؟
using System.Collections;
IEnumerable<XElement> empList = from e in xDoc.Root.Elements("Employee") select e;
اکنون که مجموعه کارکنان توسط متغیر empList در اختیار ما است، دسترسی به محتویات آن به سادگی زیر خواهد بود:
foreach (XElement employee in empList)
{
foreach (XElement e in employee.Elements())
{
Console.WriteLine(e.Name + " = " + e.Value);
}
}
4- کوئری بنویسید که اطلاعات تمامی کارکنان بخش HR را باز گرداند.
IEnumerable<XElement> hrList = from e in xDoc.Root.Elements("Employee")
where e.Element("Department").Value == "HR"
select e;
همانطور که ملاحظه میکنید همانند عبارات SQL ، در تمامی عناصر متعلق به کارکنان، عناصری که دپارتمان آنها مساوی HR است بازگشت داده میشود.
5- کوئری بنویسید که لیست تمامی کارکنان بالای 30 سال را ارائه دهد.
IEnumerable<XElement> tList = from e in xDoc.Root.Elements("Employee")
where int.Parse(e.Element("Age").Value) > 30
select e;
چون حاصل e.Element("Age").Value یک رشته است، برای اعمال فیلترهای عددی باید این رشتهها تبدیل به عدد شوند. به همین جهت از int.Parse استفاده شده است.
6- کوئری بنویسید که لیست تمامی کارکنان بالای 30 سال را مرتب شده بر اساس نام باز گرداند.
IEnumerable<XElement> tList = from e in xDoc.Root.Elements("Employee")
where int.Parse(e.Element("Age").Value) > 30
orderby e.Element("Name").Value
select e;
7- تبدیل نتیجهی یک کوئری LINQ به لیستی از اشیاء
مفهومی به سی شارپ 3 اضافه شده است به نام anonymous types . برای مثال:
توسط این قابلیت میتوان یک شیء را بدون نیاز به تعریف ابتدایی آن ایجاد کرد و حتی از intelliSense موجود در IDE نیز بهره مند شد. این نوعهای ناشناس توسط واژههای کلیدی new و var تولید میشوند. کامپایلر به صورت خودکار برای هر anonymous type یک کلاس ایجاد میکند.
دقیقا از همین توانایی در LINQ نیز میتوان استفاده نمود:
var empList = from e in xDoc.Root.Elements("Employee")
orderby e.Element("Name").Value
select new
{
Name = e.Element("Name").Value,
Phone = e.Element("Phone").Value,
Department = e.Element("Department").Value,
Age = int.Parse(e.Element("Age").Value)
};
foreach (var employee in empList)
{
Console.WriteLine("Name = " + employee.Name);
Console.WriteLine("Dep = " + employee.Department);
Console.WriteLine("Phone = " + employee.Phone);
Console.WriteLine("Age = " + employee.Age);
}
public class Employee
{
public string Name { get; set; }
public string Phone { get; set; }
public string Department { get; set; }
public int Age { get; set; }
}
برای مثال اگر بخواهیم لیست دریافتی را به صورت یک لیست جنریک بازگشت دهیم خواهیم داشت:
public class Employee
{
public string Name { get; set; }
public string Phone { get; set; }
public string Department { get; set; }
public int Age { get; set; }
}
List<Employee> Get()
{
XDocument xDoc = XDocument.Load("Employee.xml");
var items =
from e in xDoc.Root.Elements("Employee")
orderby e.Element("Name").Value
select new Employee
{
Name = e.Element("Name").Value,
Phone = e.Element("Phone").Value,
Department = e.Element("Department").Value,
Age = int.Parse(e.Element("Age").Value)
};
return items.ToList();
}
WinRT چیست؟
مایکروسافت جهت سهولت تولید برنامههای جدید Metro-style ، لمسی (touch-centric) و tablets ویندوز 8 ، اقدام به بازنویسی مجدد Windows-API کرده و نام آنرا WinRT گذاشته است. بنابراین همانند آنچه که در مورد API ویندوز از روز اول پیدایش آن مرسوم بوده، این API جدید، از نوع native (نوشته شده با CPP) میباشد و با کمک دات نت فریم ورک تهیه نشده است. این API جدید مبتنی بر فناوری قدیمی COM است، بنابراین مطابق معمول توسط هر نوع برنامه و سیستمی در ویندوز قابل دسترسی است. تفاوتی نمیکند که CPP یا دلفی باشد یا دات نت. به صورت خلاصه ویندوز 8 دو طراحی جدید (WinRT) و قدیم (Win32 API) را با هم پشتیبانی میکند. اگر آنرا صحیحتر بخواهیم معرفی کنیم، WinRT درحقیقت محصور کنندهی (Wrapper) همان Win32 API سابق است (در پشت صحنه همان dll های سابق ویندوز را بارگذاری و استفاده میکند) جهت تطابق با نیازهای دهه اخیر و سالهای پیش رو.
سازگاری دات نت فریم ورک با WinRT چگونه است؟
اینبار WinRT برخلاف Win32 API (که در زمان ارائه آن اصلا دات نتی در کار نبود)، جهت سازگاری با دات نت طراحی شده است. این طراحی جدید ILDasm metadata را در اختیار برنامه نویسهای دات نت قرار میدهد و به این ترتیب IntelliSense و قابلیتهای Debugging ویژوال استودیو همانند کدهای مدیریت شدهی دات نت جهت برنامه نویسی مبتنی بر WinRT در اختیار برنامه نویسها خواهد بود (فرمت ارائه شده، ECMA 335 metadata format میباشد). همچنین اشیاء COM متعلق به WinRT به خوبی توسط GC (آشغال جمع کن) دات نت جهت مدیریت بهتر حافظه، تحت نظر میباشند.
بنابراین از دیدگاه یک برنامه نویس دات نت، کل WinRT به صورت managed assemblies مشاهده میشود، اینترفیسهای آن همان اینترفیسهای دات نتی خواهند بود و کلاسهای آن نیز به همین ترتیب. این مشکلی بود/هست که با Win32 API در دات نت وجود دارد و دسترسی به آن به این سادگی و یکپارچگی میسر نیست (هر چند تا الان کل اینترفیس آن جهت استفاده در دات نت نیز ترجمه شده است). در اینجا شما ارجاعاتی را به فایلهایی با پسوند winmd یا windows metadata، به پروژهی دات نتی خود اضافه میکنید و سپس CLR قادر خواهد بود تا کلیه اطلاعات لازم جهت کار با WinRT را از آنها استخراج کند (این فایلها در پوشه C:\Program Files (x86)\Windows Kits\8.0\Windows Metadata و C:\Windows\system32\winmetadat ویندوز 8 قابل مشاهده و دسترسی هستند).
تفاوتهای مهم امکانات نمایشی WinRT با Win32 API کدامند؟
تفاوت مهم WinRT با Win32 API از دیدگاه برنامه نویسها، امکان دسترسی بیشتر به آن از طریق زبانهای مختلف میباشد. WinRT همانند Win32 API توسط CPP ، دات نت و سایر روشهای مرسوم دیگر قابل دسترسی و توسعه است. اما اینبار WinRT برخلاف Win32 API ، از طریق HTML و جاوا اسکریپت هم قابل توسعه است. در این حالت کدهای شما توسط Chakra JavaScript engine که از اینترنت اکسپلورر 9 به بعد ارائه شده، اجرا خواهد شد. بنابراین «برفراز» WinRT دو لایه نمایشی (presentation layer) قابل طراحی و دسترسی است. XAML و زبانهای متداول برنامه نویسی موجود مانند سی شارپ و وی بی دات نت و غیره. همچنین HTML/CSS هم مجال ابراز وجود یافته است. البته XAML تنها لایه نمایشی کلیه زبانهای قدیمی موجود مانند سی شارپ، وی بی دات نت، CPP و غیره خواهد بود. به همین جهت Expression Blend جدید نیز از HTML 5 پشتیبانی میکند.
همچنین در WinRT ، قسمتهای GDI و Message loop متداول Win32 API حذف شده است و از DirectX استفاده میکند. برای نمونه کدهای XAML شما توسط DirectX رندر میشود. البته این مطلب جدیدی نیست و از زمان ارائه WPF شاهد این مساله بودهایم.
وضعیت توسعه پذیری WinRT چگونه است؟
علاوه بر اینها، برخلاف Win32 API ، اینبار WinRT قابل توسعه است و Extensions SDK برای آن ارائه شده است.
آیا WinRT شاهد تغییرات امنیتی خاصی هم بوده است؟
نکتهی مهمی که در طراحی WinRT به آن توجه شده است، امنیت میباشد. برنامههای WinRT شبیه به برنامههای سیلورلایت در یک Sandbox اجرا میشوند. به این معنا که جهت ذخیره سازی اطلاعات خود از یک isolated storage استفاده میکنند. برای کار با file system نیاز به تائید کاربر دارند و خلاصه دیگر به سادگی نمیتوان از مرزهای این نوع برنامهها رد شد و سیستم عاملی را root کرد. برای نمونه برنامه نویسهای دات نت دسترسی به فضای نام System.IO.FileStream را دیگر نخواهند داشت و تنها قسمتی از دات نت «برفراز» WinRT و مدل امنیتی جدید آن معنا پیدا میکند. همچنین برفراز این API جدید، تولید مثلا Device drivers هم دیگر معنا پیدا نمیکند. این محدودیتهای امنیتی برای برنامه نویسهای native هم وجود دارد و تفاوتی نمیکند. کلا برنامههای جدید Metro-style در یک قرنطینهی کامل امنیتی اجرا میشوند. برای مثال اگر برنامهای نیاز به دسترسی به یک WebCam را داشته باشد، همانند برنامههای سیلورلایت ابتدا باید کاربر تائید کرده و سپس برنامه مجوز امنیتی کار با مثلا یک WebCam را خواهد یافت. همچنین تمام برنامههای جدید Metro-style باید جهت ارائه در فروشگاه جدید ویندوز 8، دارای امضای دیجیتال معتبر نیز باشند.
آیا جهت توسعهی برنامههای چندریسمانی و غیرهمزمان تمهیدات خاصی در WinRT پیشبینی شده است؟
در طراحی جدید WinRT به اعمال asynchronous به شدت توجه شده است. هر عملی که بیش از 50 میلی ثانیه طول بکشد به صورت خودکار تبدیل به یک عمل asynchronous خواهد شد تا برنامهها مرتبا در حین اجرای اعمال زمانبر هنگ نکرده و ترد اصلی برنامه را بلاک نکنند. علاوه بر اینها WinRT از طریق IAsyncOperation interface خود، امکان استفاده از واژههای جدید کلیدی async/await سی شارپ 5 را نیز مهیا میسازد.
آیا WinRT آمده است تا جایگزینی برای دات نت و سیلورلایت و امثال آن باشد؟
خیر. WinRT نگارش دوم Win32 API است با هدف توسعه پذیری، استفاده از دایرکت ایکس و فناوریهای جدید که عموما از شتاب دهندههای سخت افزاری هم بهرهمند هستند بجای GDI سابق، استفاده سادهتر در زبانهای دیگر به کمک فایلهای استاندارد Windows Meta data آن میباشد. همچنین این API جدید دسترسی به امکانات ویندوز را هم توسط HTML و جاوا اسکریپت، علاوه بر امکانات مهیای سابق میسر ساخته است. هم اکنون نگارش 4 و نیم دات نت در ویندوز 8 ارائه شده است و توسط هر دو سیستم سابق و جدید قابل استفاده میباشد. البته باید در نظر داشت که جهت استفاده از WinRT به دلایل محدودیتهای امنیتی اعمال شده به آن و همچنین استفاده از XAML به تنها عنوان لایه نمایشی سیستمهای متداول غیر HTML ایی، دات نت فریم ورک به امکانات و کلاسهای کمتری نسبت به حالت متداول کار با آن، دسترسی دارد (جهت درک بهتر این محدودیتها میتوان به طراحی سیلورلایت مراجعه کرد). این را هم باید اضافه کرد که ویندوز 8 توانایی اجرای هر دو نوع برنامههای سبک جدید مترو و متداول دسکتاپ قدیمی را دارا است.
جهت آشنایی بیشتر با WinRT میتوان به مجموعهای از ویدیوهای مرتبط آن مراجعه کرد:
http://channel9.msdn.com/Events/BUILD/BUILD2011?t=windows%2Bruntime
Note that FASTER is not directly comparable to Redis, as FASTER is not just a cache. FASTER can index and access data larger than memory, as well as take consistent checkpoints for recovery, more like a persistent hash key-value store + cache combination. FASTER is multi-threaded and latch-free as well, which gives it very high performance on a single machine.
Some recently completed and ongoing/future work items on our roadmap can be found at https://microsoft.github.io/FASTER/roadmap. For instance, in FASTER C#, we recently added log compaction, support for deletes, inline variable-sized allocations, and a read cache.
MySQL مدتی است که جزو یکی از محصولات شرکت اوراکل محسوب شده و توسعه دهندگان تجاری باید برای استفاده از آن هزینه کنند. این هزینه نیز اخیرا افزایش یافته و به حداقل 2000 دلار به ازای هر سرور رسیده است (+). این عدد واقعا رقم بالایی برای محصولی محسوب میشود که بسیاری از توسعه دهندهها تصور میکنند رایگان است. استفاده از این محصول با توجه به مدل تجاری جدید آن فقط در پروژههای سورس باز رایگان است (بله فقط در پروژههایی که با مجوز GPL منتشر شوند) و اگر شما یک سیستم تجاری کلاینت سرور را بر این اساس طراحی کنید حتما باید هزینههای مرتبط را نیز پرداخت نمائید (+).
توضیحی در مورد GPL و MySQL
The change from the LGPL to the GPL for the client libraries was made in 2001 during the development of MySQL 4.0 to help MySQL AB more easily differentiate between a proprietary user who should buy a commercial license and a free software user who should use the GPL license.
MySQL با توجه به مجوز GPL آن در شرایط زیر رایگان خواهد بود:
- قصد توزیع مجدد آنرا نداشته باشید.
- همچنین برنامهی شما نیز به صورت سورس باز تحت مجوز GPL ارائه گردد.
و تنها زمانی در مورد MySQL باید هزینه کنید که:
-قصد توزیع مجدد آنرا داشته باشید.
-برنامهی شما سورس باز نبوده و قصد ندارید آنرا تحت مجوز GPL ارائه دهید. (که عموما در مورد برنامههای تجاری به همین صورت است)
نکتهی دیگری را که باید به آن دقت داشت این است که برای واگذاری MySQL به شرکت اوراکل، اتحادیه اروپا نیز با توجه به وجود بیش از 50 هزار توسعه دهندهی اروپایی که از MySQL استفاده میکنند، شرکت اوراکل را موظف کرده است تا این dual licensing (تجاری و سورس باز) را تا سال 2015 حفظ کرده و ادامه دهد (+). به این معنا که شرکت اوراکل پس از سال 2015 هیچگونه تعهدی به ارائهی نگارش سورس باز این محصول به هیچ نهاد و یا سازمانی ندارد.
البته اینها به معنای پایان دنیا نیست. هم اکنون چهار fork سورس باز از این محصول وجود دارند (Drizzle ، MariaDB ، OurDelta و Percona Server) ولی تنها آینده است که میزان موفقیت، پایداری و تداوم آنها را مشخص خواهد کرد.