5.Visual Studio 2017 15.9 منتشر شد
These are the customer-reported issues addressed in 15.9.5:
- VSX1000: No enough information has been provided to MSBuild in order to establish a connection to a Remote Server.
- Visual C++ 2017 Redistributable for ARM64 is not available via visualstudio.com.
- VC Runtime Redistributable Update for VS 15.9 deletes Registry Key. This fix may have an increased chance of requiring a reboot of the machine in order to install an updated VC++ Redistributable package.
- Incorrect codegen in managed c++ with List to List assignment.
- Can't connect to mac build host after Visual Studio 15.9.4 update.
- Resource directories missed in incremental builds with
AndroidAarLibrary
items. - Lots of external assembly references - JNI ERROR (app bug): local reference table overflow (max=512).
- The Unity Editor has been updated to 2018.3. For more information, please visit the Unity website.
- SSDT: We enabled SQL projects to build schemas that have non-clustered columnstore indexes on an indexed views.
- SSDT: We fixed a significant performance issue in the schema compare tool when generating a script.
- SSDT: We fixed the schema drift detection logic in the schema compare tool which forced a new comparison to reenable scripting and publishing actions.
Security Advisory Notices
دوره بررسی ASP.NET CORE Identity
ASP.NET CORE Identity Under the Hood | Authentication & Authorization | .NET 8
00:00:00 Introduction
00:04:31 1. Security Overview
00:10:34 2. Authentication and Authorization Flow
00:17:18 3. ASP.NET Core Basics
00:23:31 4. Security Context in ASP.NET Core
00:27:23 5. Anonymous Identity
00:33:26 6. Create a Login Page with Razor Pages
00:46:02 7. Generate Cookie with Cookie Authentication Handler
01:06:01 8. Authenticaiton Middle and Authentication Scheme
01:15:16 9. Authorization Architecture Flow
01:23:58 10. Simple Policy based Authorization
01:43:50 11. Login & Logout Partial View
01:52:56 12. Custom Policy based Authorization
02:05:11 13. Cookie Lifespan & Browser Session
به شخصه اعتقادی ندارم که جهت مدیریت کار رایگانی که انجام میشود از امکانات غیر رایگان استفاده کرد. تابحال برای ذخیره سازی کدهای منتشر شده در این وبلاگ از persiangig تا googlepages مرحوم تا رپیدشیر تا ... استفاده کردهام. نه امکان لیست کردن سریع آنها موجود است و نه مشخص است که چه تعدادی از آنها هنوز وجود خارجی داشته و از سرورهای یاد شده پاک نشدهاند. اخیرا تعدادی وبلاگ برنامه نویسی را یافتهام که از سایت CodePlex به عنوان مخزنی برای ذخیره سازی کدها و مثالهای منتشر شده در وبلاگ خود استفاده میکنند. این کار چند مزیت دارد:
- رایگان است (فضا، پهنای باند، اسکریپت و غیره)
- به صورت تضمینی تا 10 سال دیگر هم پابرجا است.
- درب آن به روی کاربران ایرانی باز است (برخلاف مثلا سایت googlecodes یا رفتار اخیر سورس فورج و غیره، سایت CodePlex در این چندسال رویه ثابتی داشته است)
- امکان مشاهدهی لیست تمامی کدهای منتشر شده موجود است.
- امکان ثبت توضیحات کنار هر کد منتشر شده نیز وجود دارد.
- امکان دریافت یکجای آنها با توجه به استفاده از ابزارهای سورس کنترل مهیا است.
- امکان دریافت بهینهی موارد جدید هم برای کاربران وجود دارد. کاربری که یکبار با استفاده از ابزارهای سورس کنترل، کدهای موجود را دریافت کرده، در بار بعدی دریافت اطلاعات، تنها موارد تغییر کرده یا جدید را دریافت خواهد کرد و نه تمام اطلاعات کل مخزن را از ابتدا تا به امروز.
- امکان مشاهدهی آمار دریافتها، مراجعات، سایتهایی که به شما لینک دادهاند و غیره فراهم است.
- امکان دعوت کردن از افراد دیگر نیز جهت به روز رسانی مخزن کد تدارک دیده شده است.
- کلیه اعضای CodePlex بدون نیاز به عضویت در گروه مخزن کد شما، میتوانند جهت تکمیل یا اصلاح کار شما patch یا وصله ارسال کنند.
و ...
اما برای استفاده از این امکانات نیاز است حداقل اطلاعاتی را در مورد کار با ابزارهای سورس کنترل داشت، که خلاصهی مختصر و مفید آنرا در ادامه ملاحظه خواهید نمود:
0 - دریافت و نصب برنامهی TortoiseSVN
1- ثبت نام در سایت CodePlex
رایگان است.
2- ایجاد یک پروژهی جدید
که به همراه وارد کردن مشخصات اولیه آن است:
تنها نکتهی مهم آن انتخاب سورس کنترل Team foundation server و سپس Subversion است چون میخواهیم با استفاده از TortoiseSVN کار به روز رسانی اطلاعات را انجام دهیم.
3- انتخاب مجوز برای پروژه در برگهی License پروژه ایجاد شده
تا مجوزی را برای پروژه انتخاب نکنید، مجوز ارائهی عمومی آنرا نخواهید یافت. در مورد مقایسهی مجوزهای سورس باز لطفا به این مطلب مراجعه کنید.
4- checkout کردن سورس کنترل
ابتدا به برگهی source code پروژه مراجعه کرده و بر روی لینک subversion در کنار صفحه کلیک کنید.
در صفحهی باز شده مشخصات اتصال به مخزن کد را جهت به روز رسانی آن مشاهده خواهید نمود.
اکنون جهت استفاده از آن یک پوشهی مشخص را در سیستم خود برای قرار دادن فایلها و ارسال آن به مخزن کد ایجاد کنید. مثلا به نام SiteRepository . سپس جایی داخل این پوشه، کلیک راست کرده و گزینهی SVN Checkout را انتخاب کنید:
در صفحهی باز شده آدرس svn مربوط به پروژه خود را وارد نموده و بر روی Ok کلیک کنید:
در صفحهی بعدی باید نام کاربری و کلمهی عبور مرتبط با حساب کاربری سایت کدپلکس خود را وارد نمائید. همچنین بهتر است گزینهی به خاطر سپاری آنرا نیز برای سهولت کار در دفعات بعدی انتخاب کنید:
به این صورت یک پوشهی مخفی svn در اینجا تشکیل خواهد شد که اطلاعات مخزن کد را در خود نگهداری میکند و نباید آنرا حذف کرد، تغییر داد، یا جابجا کرد.
5- اضافه کردن فایلهای دلخواه به مخزن کد
برای اضافه کردن کدهای مورد نظر خود، آنها را به پوشهی SiteRepository فوق کپی کرده و سپس بر روی آنها کلیک راست نموده و گزینهی Add مربوط به TortoiseSVN را انتخاب کنید:
به این صورت تنها فایلهای مورد نظر جهت اضافه شدن به مخزن کد علامتگذاری خواهند شد (ایجاد پوشه و قرار دادن فایلها درون آنها نیز به همین ترتیب است):
اکنون برای تکمیل فرایند، جایی درون پوشه کلیک راست کرده و گزینهی SVN Commit را انتخاب کنید:
در صفحهی باز شده توضیحاتی را در مورد فایلهای ارسالی وارد کرده و سپس بر روی دکمهی OK کلیک نمائید:
پس از مدتی کار هماهنگ سازی اطلاعات با مخزن کد صورت خواهد گرفت:
همچنین آیکون فایلهای مورد نظر نیز بر روی کامپیوتر شما به صورت زیر تغییر خواهند کرد:
6- ارائه نهایی پروژه
فراموش نکنید که پس از ایجاد یک پروژهی جدید، انتخاب مجوز و ارسال فایلهای مورد نظر، باید بر روی دکمهی publish this project در بالای صفحه کلیک کرد. در غیراینصورت پروژهی شما در روز بعد به صورت خودکار از سایت CodePlex حذف میگردد:
برای نمونه مخزن جدید کدهای وبلاگ جاری را در آدرس زیر میتوانید مشاهده کنید:
در دفعات آتی، تنها تکرار مرحله 5 یعنی کپی کردن فایلهای مورد نظر به پوشهی SiteRepository، سپس Add و در نهایت Commit آنها کفایت میکند و نیازی به تکرار سایر مراحل نیست. عملیات هماهنگ سازی با مخزن کد هم بسیار بهینه است و تنها فایلهایی که اخیرا اضافه شده و هنوز ارسال نشدهاند، Commit خواهند شد.
کاربران نهایی هم یا از طریق اینترفیس تحت وب سایت میتوانند از فایلهای شما استفاده کنند و یا روش دیگری هم برای این منظور وجود دارد (همان Checkout کردن یاد شده و سپس هر بار انتخاب گزینهی SVN update بجای Commit جهت دریافت فایلهای جدید و نه کل مخزن کد به صورت یکجا).
OpenCVSharp #14
BLOB یا Binary Large OBject به معنای گروهی از نقاط به هم پیوستهی در یک تصویر باینری هستند. Large در اینجا به این معنا است که اشیایی با اندازههایی مشخص، مدنظر هستند و اشیاء کوچک، به عنوان نویز درنظر گرفته خواهند شد و پردازش نمیشوند.
برای نمونه در تصویر ذیل، تصویر سمت چپ، تصویر اصلی است و تصویر سمت راست، نمونهی باینری سیاه و سفید آن. سپس عملیات تشخیص Blobs بر روی تصویر اصلی انجام شده و نتیجهی نهایی که مشخص کنندهی اشیاء تشخیص داده شدهاست، با دوایری قرمز در تصویر سمت راست، مشخص هستند.
معرفی کلاس SimpleBlobDetector
در کدهای ذیل، نحوهی کار با کلاس SimpleBlobDetector را مشاهده میکنید. این کلاس کار تشخیص Blobs را در تصویر اصلی انجام میدهد:
var srcImage = new Mat(@"..\..\Images\cvlbl.png"); Cv2.ImShow("Source", srcImage); Cv2.WaitKey(1); // do events var binaryImage = new Mat(srcImage.Size(), MatType.CV_8UC1); Cv2.CvtColor(srcImage, binaryImage, ColorConversion.BgrToGray); Cv2.Threshold(binaryImage, binaryImage, thresh: 100, maxval: 255, type: ThresholdType.Binary); var detectorParams = new SimpleBlobDetector.Params { //MinDistBetweenBlobs = 10, // 10 pixels between blobs //MinRepeatability = 1, //MinThreshold = 100, //MaxThreshold = 255, //ThresholdStep = 5, FilterByArea = false, //FilterByArea = true, //MinArea = 0.001f, // 10 pixels squared //MaxArea = 500, FilterByCircularity = false, //FilterByCircularity = true, //MinCircularity = 0.001f, FilterByConvexity = false, //FilterByConvexity = true, //MinConvexity = 0.001f, //MaxConvexity = 10, FilterByInertia = false, //FilterByInertia = true, //MinInertiaRatio = 0.001f, FilterByColor = false //FilterByColor = true, //BlobColor = 255 // to extract light blobs }; var simpleBlobDetector = new SimpleBlobDetector(detectorParams); var keyPoints = simpleBlobDetector.Detect(binaryImage); Console.WriteLine("keyPoints: {0}", keyPoints.Length); foreach (var keyPoint in keyPoints) { Console.WriteLine("X: {0}, Y: {1}", keyPoint.Pt.X, keyPoint.Pt.Y); } var imageWithKeyPoints = new Mat(); Cv2.DrawKeypoints( image: binaryImage, keypoints: keyPoints, outImage: imageWithKeyPoints, color: Scalar.FromRgb(255, 0, 0), flags: DrawMatchesFlags.DrawRichKeypoints); Cv2.ImShow("Key Points", imageWithKeyPoints); Cv2.WaitKey(1); // do events Cv2.WaitKey(0); Cv2.DestroyAllWindows(); srcImage.Dispose(); imageWithKeyPoints.Dispose();
در اینجا ابتدا تصویر منبع به صورتی متداول باگذاری شدهاست. سپس توسط متد CvtColor به نمونهای سیاه و سفید و به کمک متد Threshold به یک تصویر باینری تبدیل شدهاست.
اگر به تصویر ابتدای بحث دقت کنید، اشیاء موجود در منبع مفروض، رنگهای متفاوتی دارند؛ اما در تصویر نهایی تولید شده، تمام آنها تبدیل به اشیایی سفید رنگ شدهاند. این کار را متد Cv2.Threshold انجام دادهاست، تا کلاس SimpleBlobDetector قابلیت تشخیص بهتری را پیدا کند. تشخیص اشیایی یک دست، بسیار سادهتر هستند از تشخیص اشیایی با رنگها و شدت نور متفاوت.
اگر بخواهیم الگوریتم Threshold را بیان کنیم به pseudo code زیر خواهیم رسید:
if src(x,y) > thresh dst(x,y) = maxValue else dst(x,y) = 0
سپس پارامتر اصلی سازندهی کلاس SimpleBlobDetector مقدار دهی شدهاست. این تنظیمات در تشخیص اشیاء موجود در تصویر بسیار مهم هستند. برای درک بهتر واژههایی مانند Circularity، Convexity، Inertia و امثال آن، به تصویر ذیل دقت کنید:
در اینجا میتوان حداقل و حداکثر تقعر و تحدب اشیاء و یا حتی حداقل و حداکثر اندازهی اشیاء مدنظر را مشخص کرد.
اگر سازندهی کلاس SimpleBlobDetector به نال تنظیم شود، از مقادیر پیش فرض آن استفاده خواهند شد که در اینجا به معنای تشخیص اشیاء کدر دایرهای شکل هستند. به همین جهت در تنظیمات فوق FilterByColor به false تنظیم شدهاست تا اشکال سفید رنگ تصویر اصلی را بتوان تشخیص داد.
در ادامه متد simpleBlobDetector.Detect بر روی تصویر باینری بهبود داده شده، فراخوانی گشتهاست. خروجی آن نقاط کلیدی اشیاء یافت شدهاست. این نقاط را میتوان توسط متد DrawKeypoints ترسیم کرد که حاصل آن دوایر قرمز رنگ موجود در مرکز اشیاء یافت شدهی در تصویر سمت راست هستند.
کدهای کامل این مثال را از اینجا میتوانید دریافت کنید.
1. شاید یکی از آزاردهندهترین مشکلات، برخورد با پیغامهای خطا، هنگام عملیات migration باشد. یکی از دهها نوع خطا، زمانی رخ میدهد که متد seed در حال اجراست. در این حالت هیچ نوع break-point ایی به کمک ما نخواهد آمد.
سوال ایجاست که آیا میتوان این بخش را دیباگ نمود؟ بهترین راه حل، اجرای آپدیت از طریق متدها(یا اکشن ها) است.
فراخوانی migration بسیار ساده است. باید یک نمونه از کلاس Configuration را ساخته و در جایی از پروژه قرار دهیم و صد
البته مطمئن باشیم که migration فعال است.
var configuration = new Configuration(); var migrator = new DbMigrator(configuration); migrator.Update();
اگر بخواهید این تغییرات بر روی دیتابیسی با اسم و رسم انجام شود، از کد زیر بهره بگیرید:
var configuration = new Configuration(); configuration.TargetDatabase = new DbConnectionInfo( "Server=MyServer;Database=MyDatabase;Trusted_Connection=True;", "System.Data.SqlClient"); var migrator = new DbMigrator(configuration); migrator.Update();
2. خطای :
Duplicate type name within an assembly.
معمولا بخاطر وجود break-point این مشکل رخ میدهد. یا break-pointهای درون seed را حذف کنید یا جای آنها را تغییر دهید. [اینجا]
3. خطای :
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
این مشکل میتواند دلایل مختلفی داشته
باشد. کد درون متد seed را داخلtry/catch قرا ر دهید و علت آن را بررسی کنید:
try { var user = new ApplicationUser { UserName = "Admin", Phone = "09120000000", Email = "m@gmail.com" }; usermanager.Create(user, "09120000000"); usermanager.AddToRole(user.Id, "admin"); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } }
فراموش نکنید، seed را به کمک حالتی که در شماره 1 گفته شد اجرا کنید تا بتوانید از BreakPoint استفاده کنید.
4.خطای :
More than one context type was found in the assembly 'Ex1_CodeFirst'
این خطا وقتی ظاهر میشود که چندین Context برای
پروژه جاری داشته باشیم و ویژوال استودیو نتواند Context مورد نظر ما را تشخیص
دهد. بهتر است هنگام اجرای migration نام context مورد نظر را بنویسیم (مثلا MyConfiguration نام کانتکست شماست) :
Update-Database -ConfigurationTypeName MyConfiguration
There is already an object named 'UserProfile' in the database.
یعنی مدل شما پس از اینکه جدولی با همین نام (در این جا به عنوان مثال UserProfile) از پیش موجود بوده، تغییر کرده است؛ پس migration آپدیت شدنی نیست. ابتدا این دستور را مینویسیم (پیش از آنکه تغییراتمان را روی کلاس مربوط به جدول UserProfile اعمال کنیم):
Add-Migration Initial –IgnoreChanges
update-database –verbose
گاهی این مشکل زمانی پیش میآید که واقعا تغییری در جدول نامبرده انجام ندادهایم. در این حالت روش پلهای زیر را به کار میبریم:
- پاک کردن یا ریست کردن migration (در شماره 9 همین مقاله این کار در چند مرحله توضیح داده شده است. در مرحله سوم حتما از Add-Migration Initial –IgnoreChanges استفاده کنید)
- بعد از آپدیت دیتابیس باید فایل زیر دارای محتویات باشد
محتویات این فایل دقیقا شرایط فعلی جدول شماست.
- اگر این فایل ایجاد نشده است مراحل را تکرار کنید تا محتویات درون آن را ببینید.
- حالا تغییری را در یکی از مدلهای خود انجام دهید. احتمالا با مشکل آپدیت شدن مواجه میشوید و پیغام زیر را دوباره خواهید دید:
There is already an object named 'UserProfile' in the database
- جدولی را که پیغام خطا به آن اشاره کرده، در فایل فوق بیابید و محدوده create آن را کامنت کنید تا ساخته نشود.
- دیتابیس را آپدیت کنید، احتمالا پیغام خطای فوق برای جدول دیگری نمایش داده میشود. آن را هم کامنت کنید و دیتابیس را آپدیت کنید و اگر باز هم خطا بود مکانیزم بالا را تا جایی تکرار کنید که خطایی نبینید .
- حالا جدولی را که تغییراتی در آن داده بودید، در دیتابیس چک کنید که تغییرات اعمال شده باشد.
- هر آنچه را در فایل initial کامنت کرده بودید، از کامنت خارج کنید و دیتابیس را آپدیت کنید .
- برای آزمایش، یک آیتم به یکی از مدلها اضافه کنید و ببینید که migration درست کار میکند یا خیر.
Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. You can use the Add-Migration command to write the pending model changes to a code-based migration.
7.خطای :
Automatic migration was not applied because it would result in data loss.
AutomaticMigrationDataLossAllowed = true;
Introducing FOREIGN KEY constraint 'FK_dbo.ProductProductGroups_dbo.ProductGroups_ProductGroupId' on table 'ProductProductGroups' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint or index. See previous errors.
9. راه حل برای خطاهای عجیبی که شاید نیاز به صرف زمان بیشتر برای کشف و برطرف کردن داشته باشند :
بهتر نیست مایگریشن خود را از نو بسازید؟
روش به روز رسانی و بازسازی migration [اینجا ]:
- پاک کردن فولدر Migrations در پروژه
- پاک کردن جدولی به نام MigrationHistory_ در دیتابیس (ممکن است زیر مجموعه جدولهای system باشد)
- اجرای دستور زیر کنسول پکیچ منیجر ویژوال استودیو :
Enable-Migrations -EnableAutomaticMigrations -Force
- اجرای دستور زیر :
Add-Migration Initial
انواع روشهای خلاقانه تولید رشتههای تصادفی
- برای اینکار بهتر است از Guid استفاده کنید:
//This code generates numbers between 1 - 100 and then takes 10 of them. var result = Enumerable.Range(1,101).OrderBy(g => Guid.NewGuid()).Take(10).ToArray();
01. Introduction 02. Installing Karma 03. Karma with Webstorm 04. Testing Controllers 05. Testing Simple Services 06. Testing Services with Dependencies 07. Testing AJAX Services 08. Testing Filters 09. Testing Directives - Overview 10. Setting up Karma for Testing Directives 11. Testing Directives 12. End to End Testing - Overview 13. Setting up Karma for End to End Testing 14. End to End Testing - Part 1 15. End to End Testing - Part 2 16. Troubleshooting End to End Tests 17. Summary