Nearly three weeks after Florida-based software vendor Kaseya was hit by a widespread supply-chain ransomware attack, the company on Thursday said it obtained a universal decryptor to unlock systems and help customers recover their data.
مروری بر SQL سورس کنترل
آزمون A/B در ASP.NET MVC
Dart کتابخانه ای است که توسط شرکت گوگل ارائه شده است و گفته میشود، قرار است جایگزین جاوا اسکریپت گردد و از آدرس https://www.dartlang.org قابل دسترسی میباشد. این کتابخانه، دارای انعطاف پذیری فوق العاده بالایی است و کد نویسی Java Script را راحتتر میکند. در حال حاضر هیچ مرورگری به غیر از Chromium از این تکنولوژی پشتیبانی نمیکند و جهت تسهیل در کدنویسی، باید از ویرایشگر Dart Editor استفاده کنید. این ویرایشگر کدهای نوشته شده را به دو صورت Native و JavaScript Compiled در اختیار مرورگر قرار میدهد. در ادامه با نحوهی کار و راه اندازی Dart آشنا خواهید شد.
ابتدا Dart و ویرایشگر مربوط به آن را توسط لینکهای زیر دانلود کنید:
دانلود نسخه 64 بیتی دارت + ویرایشگر
دانلود نسخه 32 بیتی دارت + ویرایشگر
بعد از اینکه فایلهای فوق را از حالت فشرده خارج کردید، پوشه ای با نام dart ایجاد مینماید. وارد پوشه dart شده و DartEditor را اجرا کنید.
توجه: جهت اجرای dart به JDK 6.0 یا بالاتر نیاز دارید
در مرحله بعد نمونه کدهای Dart را از لینک زیر دانلود نمایید و از حالت فشرده خارج کنید. پوشه ای با نام one-hour-codelab ایجاد میگردد.
از منوی File > Open Existing Folder… پوشه one-hour-codelab را باز کنید .
توضیحات
- پوشه packages و همچنین فایلهای pubspec.yaml و pubspec.lock شامل پیش نیازها و Package هایی هستند که جهت اجرای برنامههای تحت Dart مورد نیاز هستند. Dart Editor این نیازمندیها را به صورت خودکار نصب و تنظیم میکند.
توجه: اگر پوشه Packages را مشاهده نکردید و یا در سمت چپ فایلها علامت X قرمز رنگ وجود داشت، بدین معنی است که package ها به درستی نصب نشده اند. برای این منظور بر روی pubspec.yaml کلیک راست نموده و گزینه Get Pub را انتخاب کنید. توجه داشته باید که بدلیل تحریم ایران توسط گوگل باید از ابزارهای عبور از تحریم استفاده کنید.
- 6 پوشه را نیز در تصویر فوق مشاهده میکنید که نمونه کد piratebadge را بصورت مرحله به مرحله انجام داده و به پایان میرساند.
- Dart SDK شامل سورس کد مربوط به تمامی توابع، متغیرها و کلاس هایی است که توسط کیت توسعه نرم افزاری Dart ارائه شده است.
- Installed Packages شامل سورس کد مربوط به تمامی توابع، متغیرها و کلاسهای کتابخانههای اضافهتری است که Application به آنها وابسته است.
گام اول: اجرای یک برنامه کوچک
در این مرحله سورس کدهای آماده را مشاهده میکنید و با ساختار کدهای Dart و HTML آشنا میشوید و برنامه کوچکی را اجرا مینمایید.
در Dart Editor پوشه 1-blankbadge را باز کنید و فایلهای piratebadge.html و piratebadge.dart را مشاهده نمایید.
کد موجود در فایل piratebadge.html
<html> <head> <meta charset="utf-8"> <title>Pirate badge</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="piratebadge.css"> </head> <body> <h1>Pirate badge</h1> <div> TO DO: Put the UI widgets here. </div> <div> <div> Arrr! Me name is </div> <div> <span id="badgeName"> </span> </div> </div> <script type="application/dart" src="piratebadge.dart"></script> <script src="packages/browser/dart.js"></script> </body> </html>
توضیحات
- در کد HTML ، اولین تگ <script> ، فایل piratebadge.dart را جهت پیاده سازی دستورات dart به صفحه ضمیمه مینماید
- Dart Virtual Machine (Dart VM) کدهای Dart را بصورت Native یا بومی ماشین اجرا میکند. Dart VM کدهای خود را در Dartium که یک ویرایش ویژه از مرورگر Chromium میباشد اجرا میکند که میتواند برنامههای تحت Dart را بصورت Native اجرا کند.
- فایل packages/browser/dart.js پشتیبانی مرورگر از کد Native دارت را بررسی میکند و در صورت پشتیبانی، Dart VM را راه اندازی میکند و در غیر این صورت JavaScript کامپایل شده را بارگزاری مینماید.
کد موجود در piratebadge.dart
void main() { // Your app starts here. }
- این فایل شامل تابع main میباشد که تنها نقطه ورود به application است. تگ <script> موجود در piratebadge.html برنامه را با فراخوانی این تابع راه اندازی میکند.
- تابع main() یک تابع سطح بالا یا top-level میباشد.
- متغیرها و توابع top-level عناصری هستند که خارج از ساختار تعریف کلاس ایجاد میشوند.
جهت اجرای برنامه در Dart Editor بر روی piratebadge.html کلیک راست نمایید و گزینه Run in Dartium را اجرا کنید. این فایل توسط Dartium اجرا میشود و تابع main() را فراخوانی میکند و صفحه ای همانند شکل زیر را نمایش میدهد.
گام دوم: افزودن فیلد input
توجه داشته باشید که در این مرحله یا میتوانید تغییرات مورد نظر خود را در طی آموزش بر روی پوشهی 1-blankbadge اعمال کنید و یا به پوشههای تهیه شده در نمونه کد موجود در همین پروژه مراجعه نمایید.
در این مرحله یک تگ <input> به تگ <div class=”widgets”> اضافه کنید.
... <div> <div> <input type="text" id="inputName" maxlength="15"> </div> </div> ...
سپس کتابخانه dart:html را به ابتدای فایل piratebadge.dart اضافه کنید.
import 'dart:html';
توضیحات
- دستور فوق کلاسها و Resource های موجود در کتابخانه dart:html را اضافه میکند.
- از حجیم شدن کدهای خود نگران نباشید، زیرا فرایند کامپایل کدهای اضافی را حذف خواهد کرد.
- کتابخانه dart:html شامل کلاسهایی جهت کار با عناصر DOM و توابعی جهت دسترسی به این عناصر میباشد.
- در مباحث بعدی یاد میگیرید که با استفاده از کلمه کلیدی show فقط کلاسهایی را import کنید که به آن نیاز دارید.
- اگر کتابخانه ای در هیچ بخش کد استفاده نشود، خود Dart Editor به صورت warning اخطار میدهد و میتوانید آن را حذف کنید.
دستور زیر را در تابع main بنویسید تا رویداد مربوط به ورود اطلاعات در فیلد input را مدیریت نمایید.
void main() { querySelector('#inputName').onInput.listen(updateBadge); }
توضیحات
- تابع querySelector() در کتابخانه dart:html تعریف شده است و یک المنت DOM را جستجو مینماید. پارامتر ورودی آن یک selector میباشد که در اینجا فیلد input را توسط #inputName جستجو نمودیم که یک ID Selector میباشد.
- نوع خروجی این متد یک شی از نوع DOM میباشد.
- تابع onInput.Listen() رویدادی را برای پاسخگویی به ورود اطلاعات در فیلد input تعریف میکند. زمانی که کاربر اطلاعاتی را وارد نماید، تابع updateBadge فراخوانی میگردد.
- رویداد input زمانی رخ میدهد که کاربر کلیدی را از صفحه کلید فشار دهد.
- رشتهها همانند جاوا اسکریپت میتوانند در " یا ' قرار بگیرند.
تابع زیر را به صورت top-level یعنی خارج از تابع main تعریف کنید.
... void updateBadge(Event e) { querySelector('#badgeName').text = e.target.value; }
توضیحات
- این تابع محتوای المنت badgeName را به محتوای وارد شده در فیلد input تغییر میدهد.
- پارامتر ورودی این تابع شی e از نوع Event میباشد و به همین دلیل میتوانیم این تابع را یک Event Handler بنامیم.
- e.target به شی ای اشاره میکند که موجب رخداد رویداد شده است و در اینجا همان فیلد input میباشد
- با نوشتن کد فوق یک warning را مشاهده میکنید که بیان میکند ممکن است خصوصیت value برای e.target وجود نداشته باشد. برای حل این مسئله کد را بصورت زیر تغییر دهید.
... void updateBadge(Event e) { querySelector('#badgeName').text = (e.target as InputElement).value; }
توضیحات
- کلمه کلیدی as به منظور تبدیل نوع استفاده میشود که e.target را به یک InputElement تبدیل میکند.
همانند گام اول برنامه را اجرا کنید و نتیجه را مشاهده نمایید. با تایپ کردن در فیلد input به صورت همزمان در کادر قرمز رنگ نیز نتیجه تایپ را مشاهده مینمایید.
بررسی DataTable
create table Employees ( Id int auto_increment primary key, FirstName text null, LastName text null, DateOfBirth timestamp not null );
public class Employee { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public DateTimeOffset DateOfBirth { get; set; } } public class MyDbContext : DbContext { public DbSet<Employee> Employees { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) { options.UseMySQL(_configuration.GetConnectionString("DataConnection")); } }
اما در مدل EAV، خواص داینامیک را به درون جدول دومی منتقل خواهیم کرد:
create table EmployeeEav ( Id int auto_increment primary key ); create table EmployeeAttributes ( Id int auto_increment primary key, EmployeeId int not null, AttributeName text null, AttributeValue text null, constraint FK_EmployeeAttributes_EmployeeEav_EmployeeId foreign key (EmployeeId) references EmployeeEav (Id) on delete cascade ); create index IX_EmployeeAttributes_EmployeeId on EmployeeAttributes (EmployeeId);
تعریف جداول فوق نیز در Entity Framework به اینصورت خواهند بود:
public class EmployeeEav { public int Id { get; set; } public virtual ICollection<EmployeeAttribute> Attributes { get; set; } } public class EmployeeAttribute { public int Id { get; set; } public virtual EmployeeEav Employee { get; set; } public int EmployeeId { get; set; } public string AttributeName { get; set; } public string AttributeValue { get; set; } } public class MyDbContext : DbContext { public DbSet<EmployeeEav> EmployeeEav { get; set; } public DbSet<EmployeeAttribute> EmployeeAttributes { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) { options.UseMySQL(_configuration.GetConnectionString("DataConnection")); } }
- کوئری گرفتن در این روش سخت است
SELECT `e`.`Id`, `e`.`DateOfBirth`, `e`.`FirstName`, `e`.`LastName` FROM `Employees` AS `e` WHERE `e`.`DateOfBirth` > @__endDate_0
var endDate = DateTimeOffset.Now.AddYears(Convert.ToInt32(-25)); var normalTypes = dbContext.Employees.Where(x => x.DateOfBirth > endDate).ToList();
SELECT MAX(CASE AttributeName WHEN 'FirstName' THEN AttributeValue END) AS FirstName, MAX(CASE AttributeName WHEN 'LastName' THEN AttributeValue END) AS LastName, MAX(CASE AttributeName WHEN 'DateOfBirth' THEN AttributeValue END) AS DateOfBirth FROM efcoresample.EmployeeAttributes WHERE EmployeeId IN (SELECT EmployeeId FROM efcoresample.EmployeeAttributes WHERE AttributeName = 'DateOfBirth' AND AttributeValue > DATE_SUB(CURRENT_DATE(), INTERVAL 25 YEAR)) AND AttributeName IN ('FirstName', 'LastName', 'DateOfBirth') GROUP BY EmployeeId;
string[] columnNames = {"FirstName", "LastName", "DateOfBirth"}; var employees = dbContext.EmployeeAttributes .Where(x => dbContext.EmployeeAttributes .Where(i => i.AttributeName == "DateOfBirth") .Select(eId => eId.EmployeeId).Contains(x.EmployeeId) && columnNames.Contains(x.AttributeName)) .GroupBy(x => x.EmployeeId) .Select(g => new { FirstName = g.Max(f => f.AttributeName == "FirstName" ? f.AttributeValue : ""), LastName = g.Max(f => f.AttributeName == "LastName"? f.AttributeValue : ""), DateOfBirth = g.Max(f => f.AttributeName == "DateOfBirth"? f.AttributeValue : ""), Id = g.Key }) .ToList() .Where(x => DateTime.ParseExact(x.DateOfBirth, "yyyy-MM-dd", CultureInfo.InvariantCulture) > DateTime.Now.AddYears(-25));
- امکان تعریف فیلدهای اجباری را نخواهیم داشت
- امکان تعیین نوع ستونها را نخواهیم داشت
- امکان تعریف کلیدهای خارجی را نخواهیم داشت
یکی از نیازهای طراحان این است که مرتبا نیاز به تبدیل نوعها را به یکدیگر دارند. CLR به شما اجازه میدهد که هر آبجکتی را به نوع مربوط به خودش یا والدینش تبدیل کنید. بسته به زبانی که انتخاب میکنید، این تبدیل شکل متفاوتی دارد و در سی شارپ نیاز به سینتکس خاصی نیست.
سی شارپ برای تبدیل یک شیء به نوعهای والدش، نیازی به ذکر نوع ندارد ولی اگر قرار است از سمت والد به سمت فرزند Cast شود نیاز است که صریحا نوع آن را اعلام کنید. در این روش اگر نوع تبدیلات با شیء ما سازگاری نداشته باشد، در زمان اجرا، با خطای
InvalidCastExceptio
internal class Employee { ... } public sealed class Program { public static void Main() { // بدون ذکر نام والد تبدیل صورت میگیرد Object o = new Employee(); // برای تبدیل والد به یکی از مشتقات آن نیاز است // نوع آن به طور صریح ذکر گردد // در بعضی زبانهای مثل ویژوال بیسیک نیازی به ذکر آن نیست Employee e = (Employee) o; } }
استفاده از کلمات as و is در تبدیلات
Object o = new Object(); Boolean b1 = (o is Object); // b1 is true. Boolean b2 = (o is Employee); // b2 is false.
پی نوشت :در این بررسی اگر شیء نال باشد، مقدار برگشتی همیشه false است. چون به هیچ نوعی قابل تبدیل نیست.نحوهی استفادهی از کلمه کلیدی is در این تبدیل به شکل زیر است:
if (o is Employee) { Employee e = (Employee) o; }
برای بهبود کد بالا، سی شارپ کلمهی کلیدی as را ارائه میکند. کلمه کلیدی as باعث میشود اگر شیء به آن نوع قابل تبدیل باشد، ارجاعی صورت بگیرد؛ در غیر این صورت مقدار نال بازگشت داده میشود. شاید شما بگویید که در خط بعدی ما نیز دوباره مجددا یک عبارت شرطی داریم و دوباره داریم عمل تاییدیه را انجام میدهیم. ولی باید گفت این if به مراتب هزینهی کمتری نسبت به بررسیهای تبدیل یا Cast به شیوهی بالاست.
Employee e = o as Employee; if (e != null) { ..... }
فضاهای نام و اسمبلی ها
همانطور که مطلع هستید، فضاهای نام به ما این اجازه را میدهند تا نوعها را به صورت منطقی گروه بندی کنیم تا دسترسی به آنان راحتتر باشد. برای مثال مطمئنا با نگاه به اسم فضای نام
System.Text
public sealed class Program { public static void Main() { System.IO.FileStream fs = new System.IO.FileStream(...); System.Text.StringBuilder sb = new System.Text.StringBuilder(); } }
using System.IO; // Try prepending "System.IO." using System.Text; // Try prepending "System.Text." public sealed class Program { public static void Main() { FileStream fs = new FileStream(...); StringBuilder sb = new StringBuilder(); } }
موقعیکه شما نوعی را در یک فضای نام استفاده میکنید، این نوع به ترتیب بررسی میکند که نوع، در کدام فضای نام و کدام اسمبلی مورد استفاده قرار گرفته است. این اسمبلیها شامل FCL و اسمبلیهای خارجی است که به آن لینک کردهاید. حال ممکن است این سؤال پیش بیاید که ممکن است نام دو نوع، در دو فضای نام متفاوت، یکی باشد و در یک جا مورد استفاده قرار گرفتهاند. چگونه میتوان تشخیص داد که کدام نوع، متعلق به دیگری است؟ نظر مایکروسافت این است که تا میتوانید سعی کنید از اسامی متفاوت استفاده کنید. ولی در بعضی شرایط این مورد ممکن نیست. به همین علت باید هر دو کلاس یا به طور کامل، به همراه فضای نام نوشته شوند؛ یا اینکه یکی از آنها بدین شکل باشد و فضای نام نوع دیگر، با using صدا زده شود.
using Microsoft; using Dotnettips ; public sealed class Program { public static void Main() { Widget w = new Widget();// An ambiguous reference } }
'Widget' is an ambiguous reference between 'Microsoft.Widget' and 'Dotnettips.Widget
using Microsoft; using Dotnettips; public sealed class Program { public static void Main() { Dotnettips.Widget w = new Dotnettips.Widget(); // Not ambiguous } }
using Microsoft; using Dotnettips; using DotnettipsWidget = Dotnettips.Widget; public sealed class Program { public static void Main() { DotnettipsWidget w = new DotnettipsWidget (); // No error now } }
var newArray=Array.flat([depth])
var arr1 = [1, 2, [3, 4]]; arr1.flat(); // [1, 2, 3, 4] var arr2 = [1, 2, [3, 4, [5, 6]]]; arr2.flat(); // [1, 2, 3, 4, [5, 6]] var arr3 = [1, 2, [3, 4, [5, 6]]]; arr3.flat(2); // [1, 2, 3, 4, 5, 6]
// Let's say we want to remove all the negative numbers and split the odd numbers into an even number and a 1 let a = [5, 4, -3, 20, 17, -33, -4, 18] // |\ \ x | | \ x x | // [4,1, 4, 20, 16, 1, 18] a.flatMap( (n) => (n < 0) ? [] : (n % 2 == 0) ? [n] : [n-1, 1] ) // expected output: [4, 1, 4, 20, 16, 1, 18]
const entries = new Map([ ['foo', 'bar'], ['baz', 42] ]); const obj = Object.fromEntries(entries); console.log(obj); // expected output: Object { foo: "bar", baz: 42 }
var greeting = ' Hello world! '; console.log(greeting); // expected output: " Hello world! "; console.log(greeting.trimStart()); // expected output: "Hello world! ";
var greeting = ' Hello world! '; console.log(greeting); // expected output: " Hello world! "; console.log(greeting.trimEnd()); // expected output: " Hello world!";
try { throw new Error('Error'); } catch (error) { // do stuff }
try { throw new Error('Error'); } catch { // removed parameter to catch block console.log('Got an error!'); }
const symbol = Symbol('My Symbol!'); console.log(symbol.toString()); // Symbol(My Symbol!) console.log(symbol.description); // My Symbol!
Function.prototype.toString() Revision : پیاده سازی جدیدی از تابع ()toString میباشد. در صورتیکه توسط یک تابع فراخوانی شود کد آن را برگشت میدهد:
// User-defined function object // This prints "function () { console.log('My Function!'); }" console.log(function () { console.log('My Function!'); }.toString()); // Build-in function object // This prints "function parseInt() { [native code] }" console.log(Number.parseInt.toString()); // Bound function object // This prints "function () { [native code] }" console.log(function () { }.bind(0).toString()); // Built-in callable function object // This prints "function Symbol() { [native code] }" console.log(Symbol.toString()); // Dynamically generated function object #1 // This prints "function anonymous() {}" (using V8 engine) console.log(Function().toString()); // Dynamically generated function object #2 // This prints the followng (using V8 engine): // function () { return __generator(this, function (_a) { // return [2 /*return*/]; // }); } console.log(function* () { }.toString()); // This throws a TypeError: "Function.prototype.toString requires that 'this' be a Function" Function.prototype.toString.call({});
var numbers = [4, 2, 5, 1, 3]; numbers.sort(function(a, b) { return a - b; }); console.log(numbers); // [1, 2, 3, 4, 5] ES2015یا در let numbers = [4, 2, 5, 1, 3]; numbers.sort((a, b) => a - b); console.log(numbers); // [1, 2, 3, 4, 5]
var months = ['March', 'Jan', 'Feb', 'Dec']; months.sort(); console.log(months); // expected output: Array ["Dec", "Feb", "Jan", "March"] var array1 = [1, 30, 4, 21, 100000]; array1.sort(); console.log(array1); // expected output: Array [1, 100000, 21, 30, 4]