A set of simple round icon hover effects with CSS transitions and animations for your inspiration. Demo Download Source
A quicker way to open source code repositories
In VS Code, we've offered integrated support for Git from the very beginning, and we've been supporting many other source control management (SCM) providers through extensions. This has allowed developers to clone and work with repositories directly within VS Code
function isWasmSupported() { try { if (typeof WebAssembly === "object" && typeof WebAssembly.instantiate === "function") { const module = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00)); if (module instanceof WebAssembly.Module) return new WebAssembly.Instance(module) instanceof WebAssembly.Instance; } } catch (e) { } return false; } if(!isWasmSupported()) { alert("WebAssembly is not available in your browser. Please try using the latest version of Chrome, Firefox, Edge or Safari."); }
ماشین حساب ویندوز سورس باز شد!
Announcing the Open Sourcing of Windows Calculator
- یک اپلیکیشن جدید ASP.NET MVC با تنظیمات Individual User Accounts بسازید.
- احراز هویت فیسبوک را توسط کلید هایی که از Facebook دریافت کرده اید فعال کنید. برای اطلاعات بیشتر در این باره میتوانید به این لینک مراجعه کنید.
- برای درخواست اطلاعات بیشتر از فیسبوک، فایل Startup.Auth.cs را مطابق لیست زیر ویرایش کنید.
List<string> scope = newList<string>() { "email", "user_about_me", "user_hometown", "friends_about_me", "friends_photos" }; var x = newFacebookAuthenticationOptions(); x.Scope.Add("email"); x.Scope.Add("friends_about_me"); x.Scope.Add("friends_photos"); x.AppId = "636919159681109"; x.AppSecret = "f3c16511fe95e854cf5885c10f83f26f"; x.Provider = newFacebookAuthenticationProvider() { OnAuthenticated = async context => { //Get the access token from FB and store it in the database and //use FacebookC# SDK to get more information about the user context.Identity.AddClaim( new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken)); } }; x.SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie; app.UseFacebookAuthentication(x);
<li> @Html.ActionLink("FacebookInfo", "FacebookInfo","Account") </li>
// // GET: /Account/LinkLoginCallback publicasyncTask<ActionResult> LinkLoginCallback() { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId()); if (loginInfo == null) { return RedirectToAction("Manage", new { Message = ManageMessageId.Error }); } var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login); if (result.Succeeded) { var currentUser = await UserManager.FindByIdAsync(User.Identity.GetUserId()); //Add the Facebook Claim await StoreFacebookAuthToken(currentUser); return RedirectToAction("Manage"); } return RedirectToAction("Manage", new { Message = ManageMessageId.Error }); }
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl) { if (User.Identity.IsAuthenticated) { return RedirectToAction("Manage"); } if (ModelState.IsValid) { // Get the information about the user from the external login provider var info = await AuthenticationManager.GetExternalLoginInfoAsync(); if (info == null) { return View("ExternalLoginFailure"); } var user = newApplicationUser() { UserName = model.Email }; var result = await UserManager.CreateAsync(user); if (result.Succeeded) { result = await UserManager.AddLoginAsync(user.Id, info.Login); if (result.Succeeded) { await StoreFacebookAuthToken(user); await SignInAsync(user, isPersistent: false); return RedirectToLocal(returnUrl); } } AddErrors(result); } ViewBag.ReturnUrl = returnUrl; return View(model); }
// // GET: /Account/ExternalLoginCallback [AllowAnonymous] publicasyncTask<ActionResult> ExternalLoginCallback(string returnUrl) { var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) { return RedirectToAction("Login"); } // Sign in the user with this external login provider if the user already has a login var user = await UserManager.FindAsync(loginInfo.Login); if (user != null) { //Save the FacebookToken in the database if not already there await StoreFacebookAuthToken(user); await SignInAsync(user, isPersistent: false); return RedirectToLocal(returnUrl); } else { // If the user does not have an account, then prompt the user to create an account ViewBag.ReturnUrl = returnUrl; ViewBag.LoginProvider = loginInfo.Login.LoginProvider; return View("ExternalLoginConfirmation", newExternalLoginConfirmationViewModel { Email = loginInfo.Email }); } }
privateasyncTask StoreFacebookAuthToken(ApplicationUser user) { var claimsIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie); if (claimsIdentity != null) { // Retrieve the existing claims for the user and add the FacebookAccessTokenClaim var currentClaims = await UserManager.GetClaimsAsync(user.Id); var facebookAccessToken = claimsIdentity.FindAll("FacebookAccessToken").First(); if (currentClaims.Count() <=0 ) { await UserManager.AddClaimAsync(user.Id, facebookAccessToken); }
public class FacebookViewModel { [Required] [Display(Name = "Friend's name")] public string Name { get; set; } public string ImageURL { get; set; } }
//GET: Account/FacebookInfo [Authorize] publicasyncTask<ActionResult> FacebookInfo() { var claimsforUser = await UserManager.GetClaimsAsync(User.Identity.GetUserId()); var access_token = claimsforUser.FirstOrDefault(x => x.Type == "FacebookAccessToken").Value; var fb = newFacebookClient(access_token); dynamic myInfo = fb.Get("/me/friends"); var friendsList = newList<FacebookViewModel>(); foreach (dynamic friend in myInfo.data) { friendsList.Add(newFacebookViewModel() { Name = friend.name, ImageURL = @"https://graph.facebook.com/" + friend.id + "/picture?type=large" }); } return View(friendsList); }
@model IList<WebApplication96.Models.FacebookViewModel> @if (Model.Count > 0) { <h3>List of friends</h3> <div class="row"> @foreach (var friend in Model) { <div class="col-md-3"> <a href="#" class="thumbnail"> <img src=@friend.ImageURL alt=@friend.Name /> </a> </div> } </div> }
این یک مثال ساده از کار کردن با تامین کنندگان اجتماعی بود. همانطور که مشاهده میکنید، براحتی میتوانید دادههای بیشتری برای کاربر جاری درخواست کنید و تجربه کاربری و امکانات بسیار بهتری را در اپلیکیشن خود فراهم کنید.
My last post investigated ways to build a .NET Core desktop/console app with a web-rendered UI without bringing in the full weight of Electron. This seems to have interested a lot of people, so I decided to upgrade it to newer technologies and add cross-platform support.
The result is a little NuGet package called WebWindow that you can add to any .NET Core console app. It can open a native OS window (Windows/Mac/Linux) containing web-based UI, without your app having to bundle either Node or Chromium.
ساختار درختی
اصطلاحات درخت
در شکل بالا دایرههایی برای هر بخش از اطلاعت کشیده شده و ارتباط هر کدام از آنها از طریق یک خط برقرار شده است. اعداد داخل هر دایره تکراری نیست و همه منحصر به فرد هستند. پس وقتی از اعداد اسم ببریم متوجه میشویم که در مورد چه چیزی صحبت میکنیم.
در شکل بالا به هر یک از دایرهها یک گره Node میگویند و به هر خط ارتباط دهنده بین گرهها لبه Edge گفته میشود. گرههای 19 و 21 و 14 زیر گرههای گره 7 محسوب میشوند. گرههایی که به صورت مستقیم به زیر گرههای خودشان اشاره میکنند را گرههای والد Parent میگویند و زیرگرههای 7 را گرههای فرزند ChildNodes. پس با این حساب میتوانیم بگوییم گرههای 1 و 12 و 31 را هم فرزند گره 19 هستند و گره 19 والد آن هاست. همچنین گرههای یک والد را مثل 19 و 21 و 14 که والد مشترک دارند، گرههای خواهر و برادر یا حتی همنژاد Sibling میگوییم. همچنین ارتباط بین گره 7 و گرههای سطح دوم و الی آخر یعنی 1 و 12 و 31 و 23 و 6 را که والد بودن آن به صورت غیر مستقیم است را جد یا ancestor مینامیم و نوهها و نتیجههای آنها را نسل descendants.
ریشه Root: به گرهای میگوییم که هیچ والدی ندارد و خودش در واقع اولین والد محسوب میشود؛ مثل گره 7.
برگ Leaf: به گرههایی که هیچ فرزندی ندارند، برگ میگوییم. مثال گرههای 1 و12 و 31 و 23 و 6
گرههای داخلی Internal Nodes: گره هایی که نه برگ هستند و نه ریشه. یعنی حداقل یک فرزند دارند و خودشان یک گره فرزند محسوب میشوند؛ مثل گرههای 19 و 14.
مسیر Path: راه رسیدن از یک گره به گره دیگر را مسیر میگویند. مثلا گرههای 1 و 19 و 7 و 21 به ترتیب یک مسیر را تشکیل میدهند ولی گرههای 1 و 19 و 23 از آن جا که هیچ جور اتصالی بین آنها نیست، مسیری را تشکیل نمیدهند.
طول مسیر Length of Path: به تعداد لبههای یک مسیر، طول مسیر میگویند که میتوان از تعداد گرهها -1 نیز آن را به دست آورد. برای نمونه : مسیر 1 و19 و 7 و 21 طول مسیرشان 3 هست.
عمق Depth: طول مسیر یک گره از ریشه تا آن گره را عمق درخت میگویند. عمق یک ریشه همیشه صفر است و برای مثال در درخت بالا، گره 19 در عمق یک است و برای گره 23 عمق آن 2 خواهد بود.
تعریف خود درخت Tree: درخت یک ساختار داده برگشتی recursive است که شامل گرهها و لبهها، برای اتصال گرهها به یکدیگر است.
جملات زیر در مورد درخت صدق میکند:
- هر گره میتواند فرزند نداشته باشد یا به هر تعداد که میخواهد فرزند داشته باشد.
- هر گره یک والد دارد و تنها گرهای که والد ندارد، گره ریشه است (البته اگر درخت خالی باشد هیچ گره ای وجود ندارد).
- همه گرهها از ریشه قابل دسترسی هستند و برای دسترسی به گره مورد نظر باید از ریشه تا آن گره، مسیری را طی کرد.
برای پیاده سازی یک درخت، از دو کلاس یکی جهت ساخت گره که حاوی اطلاعات است <TreeNode<T و دیگری جهت ایجاد درخت اصلی به همراه کلیه متدها و خاصیت هایش <Tree<T کمک میگیریم.
public class TreeNode<T> { // شامل مقدار گره است private T value; // مشخص میکند که آیا گره والد دارد یا خیر private bool hasParent; // در صورت داشتن فرزند ، لیست فرزندان را شامل میشود private List<TreeNode<T>> children; /// <summary>سازنده کلاس </summary> /// <param name="value">مقدار گره</param> public TreeNode(T value) { if (value == null) { throw new ArgumentNullException( "Cannot insert null value!"); } this.value = value; this.children = new List<TreeNode<T>>(); } /// <summary>خاصیتی جهت مقداردهی گره</summary> public T Value { get { return this.value; } set { this.value = value; } } /// <summary>تعداد گرههای فرزند را بر میگرداند</summary> public int ChildrenCount { get { return this.children.Count; } } /// <summary>به گره یک فرزند اضافه میکند</summary> /// <param name="child">آرگومان این متد یک گره است که قرار است به فرزندی گره فعلی در آید</param> public void AddChild(TreeNode<T> child) { if (child == null) { throw new ArgumentNullException( "Cannot insert null value!"); } if (child.hasParent) { throw new ArgumentException( "The node already has a parent!"); } child.hasParent = true; this.children.Add(child); } /// <summary> /// گره ای که اندیس آن داده شده است بازگردانده میشود /// </summary> /// <param name="index">اندیس گره</param> /// <returns>گره بازگشتی</returns> public TreeNode<T> GetChild(int index) { return this.children[index]; } } /// <summary>این کلاس ساختار درخت را به کمک کلاس گرهها که در بالا تعریف کردیم میسازد</summary> /// <typeparam name="T">نوع مقادیری که قرار است داخل درخت ذخیره شوند</typeparam> public class Tree<T> { // گره ریشه private TreeNode<T> root; /// <summary>سازنده کلاس</summary> /// <param name="value">مقدار گره اول که همان ریشه میشود</param> public Tree(T value) { if (value == null) { throw new ArgumentNullException( "Cannot insert null value!"); } this.root = new TreeNode<T>(value); } /// <summary>سازنده دیگر برای کلاس درخت</summary> /// <param name="value">مقدار گره ریشه مثل سازنده اول</param> /// <param name="children">آرایه ای از گرهها که فرزند گره ریشه میشوند</param> public Tree(T value, params Tree<T>[] children) : this(value) { foreach (Tree<T> child in children) { this.root.AddChild(child.root); } } /// <summary> /// ریشه را بر میگرداند ، اگر ریشه ای نباشد نال بر میگرداند /// </summary> public TreeNode<T> Root { get { return this.root; } } /// <summary>پیمودن عرضی و نمایش درخت با الگوریتم دی اف اس </summary> /// <param name="root">ریشه (گره ابتدایی) درختی که قرار است پیمایش از آن شروع شود</param> /// <param name="spaces">یک کاراکتر جهت جداسازی مقادیر هر گره</param> private void PrintDFS(TreeNode<T> root, string spaces) { if (this.root == null) { return; } Console.WriteLine(spaces + root.Value); TreeNode<T> child = null; for (int i = 0; i < root.ChildrenCount; i++) { child = root.GetChild(i); PrintDFS(child, spaces + " "); } } /// <summary>متد پیمایش درخت به صورت عمومی که تابع خصوصی که در بالا توضیح دادیم را صدا میزند</summary> public void TraverseDFS() { this.PrintDFS(this.root, string.Empty); } } /// <summary> /// کد استفاده از ساختار درخت /// </summary> public static class TreeExample { static void Main() { // Create the tree from the sample Tree<int> tree = new Tree<int>(7, new Tree<int>(19, new Tree<int>(1), new Tree<int>(12), new Tree<int>(31)), new Tree<int>(21), new Tree<int>(14, new Tree<int>(23), new Tree<int>(6)) ); // پیمایش درخت با الگوریتم دی اف اس یا عمقی tree.TraverseDFS(); // خروجی // 7 // 19 // 1 // 12 // 31 // 21 // 14 // 23 // 6 } }
پیمایش درخت به روش عمقی (DFS (Depth First Search
هدف از پیمایش درخت ملاقات یا بازبینی (تهیه لیستی از همه گرههای یک درخت) تنها یکبار هر گره در درخت است. برای این کار الگوریتمهای زیادی وجود دارند که ما در این مقاله تنها دو روش DFS و BFS را بررسی میکنیم.
روش DFS: هر گرهای که به تابع بالا بدهید، آن گره برای پیمایش، گره ریشه حساب خواهد شد و پیمایش از آن آغاز میگردد. در الگوریتم DFS روش پیمایش بدین گونه است که ما از گره ریشه آغاز کرده و گره ریشه را ملاقات میکنیم. سپس گرههای فرزندش را به دست میآوریم و یکی از گرهها را انتخاب کرده و دوباره همین مورد را رویش انجام میدهیم تا نهایتا به یک برگ برسیم. وقتی که به برگی میرسیم یک مرحله به بالا برگشته و این کار را آنقدر تکرار میکنیم تا همهی گرههای آن ریشه یا درخت پیمایش شده باشند.
همین درخت را در نظر بگیرید:
پیمایش درخت را از گره 7 آغاز میکنیم و آن را به عنوان ریشه در نظر میگیریم. حتی میتوانیم پیمایش را از گره مثلا 19 آغاز کنیم و آن را برای پیمایش ریشه در نظر بگیریم ولی ما از همان 7 پیمایش را آغاز میکنیم:
ابتدا گره 7 ملاقات شده و آن را مینویسیم. سپس فرزندانش را بررسی میکنیم که سه فرزند دارد. یکی از فرزندان مثل گره 19 را انتخاب کرده و آن را ملاقات میکنیم (با هر بار ملاقات آن را چاپ میکنیم) سپس فرزندان آن را بررسی میکنیم و یکی از گرهها را انتخاب میکنیم و ملاقاتش میکنیم؛ برای مثال گره 1. از آن جا که گره یک، برگ است و فرزندی ندارد یک مرحله به سمت بالا برمیگردیم و برگهای 12 و 31 را هم ملاقات میکنیم. حالا همهی فرزندان گره 19 را بررسی کردیم، بر میگردیم یک مرحله به سمت بالا و گره 21 را ملاقات میکنیم و از آنجا که گره 21 برگ است و فرزندی ندارد به بالا باز میگردیم و بعد گره 14 و فرزندانش 23 و 6 هم بررسی میشوند. پس ترتیب چاپ ما اینگونه میشود:
7-19-1-12-31-21-14-23-6
پیمایش درخت به روش (BFS (Breadth First Search
در این روش (پیمایش سطحی) گره والد ملاقات شده و سپس همه گرههای فرزندش ملاقات میشوند. بعد از آن یک گره انتخاب شده و همین پیمایش مجددا روی آن انجام میشود تا آن سطح کاملا پیمایش شده باشد. سپس به همین مرحله برگشته و فرزند بعدی را پیمایش میکنیم و الی آخر. نمونهی این پیمایش روی درخت بالا به صورت زیر نمایش داده میشود:
7-19-21-14-1-12-31-23-6
اگر خوب دقت کنید میبینید که پیمایش سطحی است و هر سطح به ترتیب ملاقات میشود. به این الگوریتم، پیمایش موجی هم میگویند. دلیل آن هم این است که مثل سنگی میماند که شما برای ایجاد موج روی دریاچه پرتاب میکنید.
برای این پیمایش از صف کمک گرفته میشود که مراحل زیر روی صف صورت میگیرد:
- ریشه وارد صف Q میشود.
- دو مرحله زیر مرتبا تکرار میشوند:
- اولین گره صف به نام V را از Q در یافت میکنیم و آن را چاپ میکنیم.
- فرزندان گره V را به صف اضافه میکنیم.