نظرات اشتراک‌ها
نظرات یک استفاده کننده از TFS پس از سه سال تجربه کار با آن
من از نسخه 2005 که در حقیقت Source Safe بود به صورت مداوم با این محصول کار کردم. نقاط ضعف بسیاری داشت که به مرور در نسخه‌های 2008 و 2010 برطرف شدند. به نظرم TFS 2010 به تکامل خوبی رسیده و نیاز‌مندی‌های ما رو تاکنون پوشش داده است.
اما اخیرا در نسخه ویژوال استودیو 2012 احساس کردم کار با TFS در گنگ‌تر شده است. (منظورم Team Explorer آن هست) نسخه نهایی TFS 2012 را دریافت کرده‌ام اما هنوز برنامه‌ای برای مهاجرت به آن از نسخه 2010 نداریم. بسیاری از مواردی که در این لینک به شکل انتقادی بیان شده‌اند قرار است در نسخه جدید رفع شده و یا بهبود یابند.
به هر حال نظرات متفاوت‌اند و هر نظری محترم. هر کسی از دید نیاز‌های خود می‌سنجد و از این لحاظ اینجانب TFS رو محصولی قوی و کارساز می‌دونم.
اشتراک‌ها
Visual Studio 2019 version 16.4.4 منتشر شد
نظرات مطالب
استفاده از popBox برای کوچک کردن خودکار تصاویر بزرگ
سلام
استفاده از update panel برای اینکار مقرون به صرفه نیست. شما از یک طرف از سرعت پائین خط شکایت می‌کنید و از طرف دیگر می‌خواهید از حجم بالای اسکریپت‌های اجکس هم استفاده کنید که فقط به کاربر نشان دهید این تصویر در حال load شدن است؛ کمی صبر کنید الان نمایش داده می‌شود. مثلا چیزی شبیه به این:
http://www.codeproject.com/KB/ajax/DelayedContentLoading.aspx

- راه حل‌های زیادی برای حل این سربار هست. برای مثال در یک CMS که خودم نوشتم، تصاویری را که یوزر آپلود می‌کند، به صورت خودکار تبدیل به thumbnail می‌کنم (System.Drawing.Image.GetThumbnailImage). یعنی دو نسخه نگهداری می‌شود. یکی کوچک و یکی در اندازه اصلی. نسخه کوچک در صفحه اصلی گالری تصاویر نمایش داده می‌شود. پس از کلیک کاربر، با همین پاپ باکس یا یک نمونه دیگر که استفاده کردم به نام light box ، تصویر در اندازه اصلی نمایش داده می‌شود. به این صورت دیگر من نگران نحوه نمایش اولیه نخواهم بود و نمایش اولیه اسکریپتی نیست.
سایت لایت باکس است:
http://www.huddletogether.com/projects/lightbox2/
استفاده از آن هم در ASP.Net ساده است. اسکریپت‌های آن به هدر اضافه می‌شوند. سپس به تگ‌های یک کنترل ایمیج یا هایپرلینک که مثلا در یک DataList قرارگرفته‌اند خواص آن اضافه می‌شود. به این صورت می‌شود یک گالری پویا را ایجاد کرد که با دیتابیس هم کار کند.

- راه دیگر (اگر نمی‌خواهید thumbnail درست کنید) این است که از ابتدا اندازه تصویری را که قرار است نمایش داده شود مشخص کنید (طول و عرض کوچک). البته اگر تصویر شما همانطور که در این مقاله ذکر شد از نوع قرار گرفته شده داخل متن نیست و کاملا کنترل شده مثلا توسط یک دیتالیست رندر می‌شود، به این صورت اندازه ابتدایی کوچک خواهد بود و پس از لود شدن پاپ باکس، با کلیک کاربر روی عکس، اندازه اصلی را خواهید دید. (اسکریپتی که برای پاپ باکس نوشتم اینکار را به صورت خودکار انجام می‌دهد ولی خوب اسکریپت باید لود شده باشد که به طور قطع قبل از لود شدن تصویر اینکار تمام شده)

- اگر تصویر شما مخلوط داخل متن است و کنترلی روی آن ندارید باید با regular expressions آنها را پیدا کنید و سپس خواص مورد نظر خودتان را به تگ‌های تصویر اضافه کنید. (روش سمت سرور قبل از نمایش تصاویر)
اشتراک‌ها
انتشار رسمی ماشین‌های مجازی مخصوص Windows 10 version 2004

When a VM is loaded, it contains

  • Windows 10, version 2004 (10.0.19041.0)
  • Windows 10 SDK, version 2004 (10.0.19041.0)
  • Visual Studio 2019 (latest as of 6/15/20) with the UWP, .NET desktop, and Azure workflows enabled and also includes the Windows Template Studio extension
  • Visual Studio Code (latest as of 6/15/20)
  • Windows Subsystem for Linux enabled with Ubuntu installed
  • Developer mode enabled 
انتشار رسمی ماشین‌های مجازی مخصوص Windows 10 version 2004
پاسخ به بازخورد‌های پروژه‌ها
خطای data binding
AxAcroPdf توسط VS.NET ساخته می‌شود و مهم نیست. یکبار که ارجاع به active-x یاد شده مطابق مقالات فوق اضافه شود، فایل AxAcroPdf به صورت خودکار تولید خواهد شد.
مطالب
استفاده از Re-Captcha
در اینجا استفاده از re-CAPTCHA برای ASP.Net و در اینجا برای ASP.Net MVC با استفاده از سرویس گوگل نسخه 1 آن آشنا شدید. در این مقاله می‌خواهیم توضیحاتی را در مورد دلیل استفاده و نحوه‌ی ثبت re-CAPTCHA نسخه 2 برای تکنولوژی‌های ASP.Net و ASP.Net MVC ارائه کنیم.

  reCAPTCHA چیست؟

استفاده آسان و امنیت بالا، جمله‌ای می‌باشد که گوگل در سرتیتر تعریف آن جای داده که البته عنوان «من روبات نیستم» در سرویس استفاده شده‌است. reCAPTCHA یک سرویس رایگان برای وب سایت‌های شما در جهت حفظ آن در برابر روبات‌های مخرب است و از موتور تجزیه و تحلیل پیشرفته‌ی تشخیص انسان در برابر روبات‌ها استفاده می‌نماید. reCAPTCHA را میتوان به صورت ماژول در بلاگ و یا فرم‌های ثبت نام و ... جای داد که فقط با یک کلیک هویت سنجی انجام خواهد شد. گاها ممکن است بجای کلیک از شما سوالی پرسیده شود که در این صورت می‌بایستی تصاویر مرتبط با آن سوال را تیک زده باشید.



دلیل استفاده از reCAPTCHA:

  1. گزارش روزانه از وضعیت موفقیت آمیز بودن هویت سنجی
  2. سهولت استفاده برای کاربران
  3. سهولت استفاده جهت برنامه نویسان
  4. دسترسی پذیری مناسب بدلیل وجود سؤالات تصویری و تلفظ و پخش عبارت بصورت صوتی
  5. امنیت بالا 

آیا می‌توان قالب reCAPTCHA را تغییر داد؟

جواب این سوال بله می‌باشد. این سرویس در دو قالب سفید و مشکی ارائه شده‌است که به صورت پیش فرض قالب سفید آن انتخاب می‌شود. در تصویر زیر قالب‌های این سرویس را مشاهده خواهید کرد.



زبان‌های پشتیبانی شده در این سرویس:


اضافه نمودن reCAPTCHA به سایت:

اگر قبلا در گوگل ثبت نام نموده‌اید کافیست وارد این سایت شوید و بر روی Get reCAPTCHA کلیک نمائید؛ در غیر اینصورت می‌بایستی یک حساب کاربری ایجاد نماید. بعد از ورود، به کنترل پنل هدایت خواهید شد. در نمای اول به تصویر زیر برخورد خواهید کرد که از شما ثبت سایت جدید را خواستار است:



نام، دامنه سایت و مالک را وارد و ثبت نام نماید.

پس از آنکه بر روی دکمه‌ی ثبت نام کلیک نمودید، برای شما دو کلید جدید را ثبت می‌نماید که منحصر به سایت شماست. Site Key رشته ای را داراست که در کد‌های HTML قرار خواهد گرفت و کلید بعدی Secret Key می‌باشد. ارتباط سایت شما با گوگل می‌بایستی به صورت محرمانه محفوظ بماند.


گام‌های لازم جهت نمایش سرویس در سایت:

  1. دستورات سمت کاربر
  2. دستورات سمت سرور 

دستورات سمت کاربر:

کد زیر را در قبل از بسته شدن تک <head/> قرار دهید:

<script src='https://www.google.com/recaptcha/api.js'></script>
کد زیر را در داخل تگ فرمی که می‌خواهید کپچا نمایش داده شود قرار دهید:
<div data-sitekey="6LdHGgwTAAAAAClKFhGthRrjBXh5AUGd4eWNCQq7"></div>

نکته: مقدار data-sitekey برابر است با رشته Site Key که گوگل برای شما ثبت نمود.



دستورات سمت سرور:

وقتی کاربر فرم حاوی کپچا را که به صورت صحیح هویت سنجی آن انجام شده باشد به سمت سرور ارسال کند، به عنوان بخشی از داده‌ی ارسال شده، یک رشته با نام g-recaptcha-response  با دستور Request دریافت خواهید کرد که به منظور بررسی اینکه آیا گوگل تایید کرده است که کاربر، یک درخواست POST ارسال نمود‌است. با این پارامترها یک مقدار json برگشت داده خواهد شد که می‌بایستی کلاسی متناظر با آن جهت خواندن ساخته شود.

با استفاده از کد زیر مقدار برگشتی Json را در کلاس مپ می‌نمائیم:
using System.Collections.Generic;
using Newtonsoft.Json;

namespace BaseConfig.Security.Captcha
{
    public class RepaptchaResponse
    {
        [JsonProperty("success")]
        public bool Success { get; set; }

        [JsonProperty("error-codes")]
        public List<string> ErrorCodes { get; set; }
    }
}

با استفاده از کلاس زیر درخواستی به گوگل ارسال شده و در صورتیکه با خطا مواجه شود با استفاده از دستور switch به آن دسترسی خواهیم یافت.
using System.Configuration;
using System.Net;
using Newtonsoft.Json;

namespace BaseConfig.Security.Captcha
{
    public class ReCaptcha
    {
        public static string _secret;

        static ReCaptcha()
        {
            _secret = ConfigurationManager.AppSettings["ReCaptchaGoogleSecretKey"];
        }

        public static bool IsValid(string response)
        {
            //secret that was generated in key value pair
            var client = new WebClient();
            var reply = client.DownloadString($"https://www.google.com/recaptcha/api/siteverify?secret={_secret}&response={response}");

            var captchaResponse = JsonConvert.DeserializeObject<RepaptchaResponse>(reply);

            // when response is false check for the error message
            if (!captchaResponse.Success)
            {
                //if (captchaResponse.ErrorCodes.Count <= 0) return View();

                //var error = captchaResponse.ErrorCodes[0].ToLower();
                //switch (error)
                //{
                //    case ("missing-input-secret"):
                //        ViewBag.Message = "The secret parameter is missing.";
                //        break;
                //    case ("invalid-input-secret"):
                //        ViewBag.Message = "The secret parameter is invalid or malformed.";
                //        break;

                //    case ("missing-input-response"):
                //        ViewBag.Message = "The response parameter is missing.";
                //        break;
                //    case ("invalid-input-response"):
                //        ViewBag.Message = "The response parameter is invalid or malformed.";
                //        break;

                //    default:
                //        ViewBag.Message = "Error occured. Please try again";
                //        break;
                //}
                return false;
            }
            // Captcha is valid
            return true;
        }
    }
}

تابع IsValid از نوع برگشتی Boolean بوده و خطایی برگشت داده نخواهد شد و از این جهت به صورت کامنت برای شما گذاشته شده که می‌توان متناظر با کد نویسی آن را تغییر دهید.
در اکشن زیر مقدار response برسی می‌شود تا خالی نباشد و همچنین مقدار آن را می‌توان با استفاده از تابع IsValid در کلاس ReCaptcha به سمت گوگل فرستاد.
        //
        // POST: /Account/Login
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public virtual async Task<ActionResult> Login(LoginPageModel model, string returnUrl)
        {
            var response = Request["g-recaptcha-response"];
            if (response != null && ReCaptcha.IsValid(response))
            {
                // 
            }
         }

گاها اتفاق می‌افتد که از دستورات Ajax برای ارسال اطلاعات به سمت سرور استفاده می‌شود که در این صورت لازم است بعد از پایان عملیات، کپچا ریفرش گردد. برای این کار می‌توان از دستور جاوا اسکریپتی زیر استفاده نمود. در صورتیکه صفحه Postback شود، کپچا مجددا ریفرش خواهد شد.

/**
 * 
 * @param {} data 
 * @returns {} 
 */
function Success(data) {
    grecaptcha.reset();
}

تا اینجا موفق شدیم تا فرم ارسالی همراه کپچا را به سمت سرور ارسال کنیم. اما ممکن است در یک صفحه از چند کپچا استفاده شود که در این صورت می‌بایستی دستورات سمت کاربر تغییر نمایند.

برای این کار دستور
<div data-sitekey="6LdHGgwTAAAAAClKFhGthRrjBXh5AUGd4eWNCQq7"></div>  
که در بالا تعریف شد، به شکل زیر تغییر خواهد کرد:

    <script>
        var recaptcha1;
        var recaptcha2;
        var myCallBack = function () {
            //Render the recaptcha1 on the element with ID "recaptcha1"
            recaptcha1 = grecaptcha.render('recaptcha1', {
                'sitekey': '6Lf9FQwTAAAAAE6XlDqrey24K4xJOPM5nNVBmNO9',
                'theme': 'light'
            });

            //Render the recaptcha2 on the element with ID "recaptcha2"
            recaptcha2 = grecaptcha.render('recaptcha2', {
                'sitekey': '6Lf9FQwTAAAAAE6XlDqrey24K4xJOPM5nNVBmNO9',
                'theme': 'light'
            });

            //Render the recaptcha3 on the element with ID "recaptcha3"
            recaptcha2 = grecaptcha.render('recaptcha3', {
                'sitekey': '6Lf9FQwTAAAAAE6XlDqrey24K4xJOPM5nNVBmNO9',
                'theme': 'light'
            });
        };
    </script>

برای نمایش کپچا، تگ‌های div با id متناظر با recaptcha1, recaptcha2, recaptcha3 ( در این مثال از سه کپچا در صفحه استفاده شده است ) در صفحه قرار خواهند گرفت.

<div id="recaptcha1"></div>
<div id="recaptcha2"></div>
<div id="recaptcha3"></div>

کار ما تمام شد. حال اگر پروژه را اجرا نمائید، در صفحه سه کپچا مشاهده خواهید کرد.


چند زبانه کردن کپچا:

برای چند زبانه کردن کافیست با مراجعه به این لینک و یا استفاده از تصویر بالا ( زبان‌های پشتیبانی ) مقدار آن زبان را برابر با پراپرتی hl که به صورت کوئری استرینگ برای گوگل ارسال می‌گردد، استفاده نمود. کد زیر نمونه‌ی استفاده شده برای زبان‌های انگلیسی و فارسی می‌باشد که با ریسورس مقدار دهی می‌شود.
<script src='https://www.google.com/recaptcha/api.js?hl=@(App_GlobalResources.CP.CurrentAbbrivation)'></script>

در صورتی که از فایل ریسوس استفاده نمی‌کنید می‌توان به صورت مستقیم مقدار دهی نمائید:
<script src='https://www.google.com/recaptcha/api.js?hl=fa'></script>



برای دوستانی که با تکنولوژی ASP.Net کار می‌کنند، این روال هم برای آنها هم صادق می‌باشد.

برای دریافت پروژه اینجا کلیک نمائید.
مطالب
لینک‌های هفته‌ی اول بهمن

وبلاگ‌ها ، سایت‌ها و مقالات ایرانی (داخل و خارج از ایران)

Visual Studio


ASP. Net


طراحی و توسعه وب


اس‌کیوال سرور


سی شارپ


عمومی دات نت


ویندوز


مسایل اجتماعی و انسانی برنامه نویسی


متفرقه

مطالب
بلاگ‌ها و مطالب مطالعه شده در هفته قبل (هفته اول آبان)


وبلاگ‌های ایرانی


Visual Studio

  • ویژوال استودیو 2010 و دات نت فریم ورک 4، نگارش CTP برای دریافت!

امنیت اطلاعات

ASP. Net

طراحی وب


اس‌کیوال سرور


به روز رسانی‌ها


ابزارها

سی‌شارپ
  • ویژگی‌های جدید C# 4.0 ، قسمت دوم، پارامترهای پیش فرض (یا آرگومانهای اختیاری). (چیزی شبیه به VB !! بدون نیاز به overloading برای پیاده سازی آن)

دلفی
  • ویدیویی از Delphi Prism . (نگارشی از دلفی که به شکل افزونه‌ای کاملا یکپارچه در VS.Net قابل دسترسی است)

SharePoint

ویندوز

متفرقه