معرفی WebRTC

ارتباط بلادرنگ بدون نیاز به نصب پلاگین

دنیایی را تصور کنید که موبایل ،تلویزیون و کامپیوتر شما در یک پلتفرورم مشترک می توانند با هم ارتباط برقرار کنند.متصور شوید که به راحتی می توانید یک چت ویدیویی برقرار کنید و همچنین به اشتراک گذاری داده هایتان به صورت peer-to-peer بپردازید.این چشم انداز WebRTC است.

آیا تمایلی به امتحان WebRTC دارید؟WebRTC هم اکنون روی مرورگرهای کروم ، اوپرا و فایرفاکس پشتیبانی می شود.

برای تست این تکنولوژی جدید می توانید به آدرس apprtc.appspot.com سری بزنید:

  1. سایت apprtc.appspot.com: را در مرورگر خودتان باز کنید.
  2. روی دکمه Allow کلیک کنید تا به مرورگرتان اجازه دسترسی به وب کم شما داده شود.
  3. آدرسی که در نوار آدرس می بینید برای دوست خود بفرستید.به همین سادگی.

تاریخچه ای کوتاه از WebRTC

یکی از چالشهای بزرگ برای وب،فراهم کردن راهی برای ارتباط انسان ها به وسیله صوت و تصویر بوده است.همواره ارتباط بلادرنگ کاری پیچیده و هزینه بر بوده.در سال ۲۰۰۸ چت ویدوئی گوگل مطرح شد علاوه برا آن در سال ۲۰۱۱ گوگل سرویس Hangouts خود را معرفی کرد.سپس شرکت GIPS را خرید.این شرکت در حال توسعه کامپننت هایی بود که لازمه ارتباط بلادرنگ است.مثل انواع کدک ها و تکنیک های از بین بردن اکو(Echo suppression and cancellation).

گوگل این تکنولوژی ها را سورس باز کرد و به منظور اجماع در آن ها مشغول آماده سازی استانداردها برای IETF و W3C شد.در ماه می ۲۰۱۱ اریکسون اولین پیاده سازی خودش را از این تکنولوژی(WebRTC) ارائه داد.

WebRTC هم اکنون یک پیاده سازی استاندارد برای ارتباط بلادرنگ بدون نیاز به هیچ پلاگینی جهت انتقال داده،صدا و تصویر است.

  • هم اکنون خیلی از برنامه ها امکاناتی که در بالا ذکر شد به ما می دهند ولی نیاز مند نصب پلاگین بروی سسیتم ها هستند.
  • دانلود کردن پلاگین هم کار سختی است و هم مستعد خطا.
  • دیپلوی کردن پلاگین سخت است.دیباگ کردن و تست آن نیز کار آسانی نیست.

از اصول WebRTC این است که همیشه سورس باز،آزاد و استاندارد شده باشد علاوه بر آن به صورت توکار در مرورگرها پشتیبانی شود.

برنامه های WebRTC نیازمند انجام یک سری کارها هستند

  • گرفتن جریان داده،صدا و یا تصویر
  • گرفتن اطلاعات شبکه ای مثل آی پی،پورت و انتقال آن ها روی شبکه به طرف دیگر برای برقراری ارتباط حتی اگر NAT یا firewallی سر راه باشد.
  • هماهنگی برای signaling communication برای گزارش خطاها ،آغاز و پایان sessions.
  • انتقال اطلاعات درباره رسانه و قابلیت کلاینت مثل رزولویشن و کدکاهای نصب شده.
  • برقراری ارتباط ویدئو ،صدا یا داده.

WebRTC  برای برقراری جریان داده APIهای زیر را پیاده سازی کرده:

MediaStream:دسترسی برای جریان داده مثل میکروفون و دوربین کاربر.شامل جریانی از محتوای رسانه ای می باشد.هر MediaStream یک ورودی و یک خروجی دارد که باید

RTCPeerConnection:تماس صوتی و تصویری با این امکاناتی مثل رمزنگاری و مدیریت پهنای باند.

RTCDataChannel:ارتباط داده ای نظیر به نظیر(peer-to-peer)

نمونه هایی از MediaStream

 

انواع تست نرم افزار

تست نرم افزار چیست؟

تست نرم افزار به فرایند ارزیابی یک نرم افزار به منظور تشخیص تفاوت بین ورودی و خروجی مورد انتظار گفته می شود.علاوه بر آن تست نرم افزار ارزیابی امکانات و ویژگی های یک نرم افزار را نیز شامل می شود.به عبارت دیگر تست نرم افزار یک فرایندی است که به وسیله آن می توانیم اطلاعاتی در رابطه با کیفیت نرم افزار بدست آوریم که شامل تایید و اعتبار سنجی است.

تایید(Verification)

در این مرحله اطمینان حاصل می شود که آیا نرم افزار مورد نظر،با توجه به انتظار ما رفتار می کند یا خیر.

اعتبار سنج(Validation)

این مرحله مشخص کننده این موضوع است که آیا نرم افزار نیازمندی هارا پاسخ گو هست یا خیر.

انواع رویکرد تست

ما دو رویکرد برای تست داریم : blackbox testing و whitebox testing.این دونوع مشخص کننده نحوه طراحی تست های ما هستند.

Blackbox Testing

در این رویکرد ، تست تمامی مکانیسم های داخلی یک سیستم نادیده گرفته می شود و روی خروجی تولید شده تمرکز می شود.به این رویکرد تست functional نیز می گویند.

Whitebox Testing

در این رویکرد ،تست ما با مکانیستم داخلی یک سیستم سرو کار داریم .به این نوع تست structural تست نیز گفته می شود.

انواع تست :

انواع مختلفی از تست وجود دارند که در زیر لیست آن ها را مشاهده می کنید:

  • Unit Testing
  • Integration Testing
  • Functional Testing
  • System Testing
  • Stress Testing
  • Performance Testing
  • Usability Testing
  • Acceptance Testing
  • Regression Testing
  • Beta Testing

Unit Testing

در این نوع تست ما یک واحد و یا یک گروه از واحد های مرتبط با هم را تست می کنیم.این نوع تست زیر مجموعه Whitebox Testing است.

Integration Testing

این نوع تست به ما این امکان را می دهد که چند نوع کامپننت مختلف را کنار یکدیگر تست کنیم.در این صورت حتی ما می توانیم وابستگی های میان سخت افزار و نرم افزار را نیز بیازماییم.این دسته از تست ها زیر مجموعه تستهای black box هستند.

Functional Testing

در این تست اطمینان حاصل می شود که عملکرد برنامه به درستی است.توجه شود که در این نوع تست برخلاف آزمون واحد ما می توانیم عملکرد یک سیستم را تست کنیم و نه فقط یک واحد را.این تست زیر مجموعه black box تست ها هستند.

System Testing

این نوع تست به ما اجازه می دهد که از عملکرد برنامه در محیطهای مختلف اطمینان حاصل کنیم(مثل سیستم عامل های مختلف).این تست زیر مجموعه black box تست ها است.

Stress Testing

این نوع تست عملکرد برنامه را در شرایط نا مطلوب مورد بررسی قرار می دهد.این تست زیر مجموعه black box تست ها است.

Performance Testing

تست عملکرد و کارایی که در مجموعه black box تست ها جای میگیرد به ما  این اطمینان را می دهد که برنامه مان عملکرد و کارایی لازم را در یک مدت زمان مشخص داراست.

Usability Testing

این تست از دیدگاه مشتری انجام می شود و در واقع مشخص کننده فاکتورهای زیر است:

  • آیا برنامه کاربر پسند است؟
  • آیا برنامه ساده و قابل یادگیری است؟
  • آیا برنامه جذاب طراحی شده است؟
  • و …

این نوع تست زیر مجموعه black box تست ها است.

Acceptance Testing

این نوع تست معمولا از طرف مشتری انجام می شود.هدف آن،مشخص کردن این است که آیا برنامه نیازهای مشتری را پاسخ می دهد و آیا برنامه همان چیزی که مشتری می خواهد هست یا خیر.

Regression Testing

این نوع تست به منظور صحت عملکرد سیستم بعد از تغییرات استفاده می شود و زیر مجموعه black box تست ها است.

Beta Testing

تستی است که توسط کاربر نهایی یا یک تیم خارج از تیم توسعه انجام می شود.هدف تست بتا پوشش دادن خطاهای غیر منتظره است.این تست زیر مجموعه black box تست ها است.

 

شروع کار با ASP.NET 5 MVC 6 Web API و Entity Framework 7

یکی از مهمترین قابلیت ها و ویژگی هایی که در ASP.NET 5 وجود دارد  می تواند بوجود آمدن یک مدل واحد برنامه نویسی باشد.این مدل واحد یعنی MVC, Web API, و Web Pages با یکدیگر ترکیب شده اند و یک فریمورک واحد را به نام MVC 6 تشکیل داده اند.در ورژن قبلی خیلی از ویژگی های web api و همچنین mvc با یکدیگر همپوشانی داشتند.ولی در ورژن جدید پیاده سازی بهتری از آن ها ارائه شده و با ترکیب آن ها ما به راحتی خواهیم توانست web applications/HTTP services را راحت تر توسعه داده و از کدها استفاده مجدد کنیم.

در این پست قصد دارم که با ایجاد یک برنامه ساده وب به وسیله ASP.NET 5 – MVC 6 WebAPI  امکانات آن را تست کنم.

برای شروع نیاز به  VS 2015 preview edition داریم.

مرحله اول:ساخت یک پروژه جدید و خالی:

برای این کار کافیست که در  VS 2015 گزینه New Web Project را انتخاب کنید و قبل ساخت پروژه باید NET Framework to 4.5.1 را انتخاب کنید.

NewProject

بعد از انتخاب اسم شما باید در فرم بعدی تمپلیت مورد نظر خود را انتخاب کنید که ما در اینجا از ASP.NET 5 Empty استفاده خواهیم کرد:

ProjectTemplateمرحله دوم:افزودن وابستگی های مورد نیاز:

بعد از ساخت پروژه به احتمال زیاد توجه شما به project.json جلب خواهد شد.در واقع در فایل project.json تمامی تنظیمات مربوط به پروژه و همچنین وابستگی ها به سایر frameworks/components مدیریت می شود.

ما در این جا از نوگت برای مدیریت پکیج ها استفاده می کنیم.یکی از قابلیت های این فایل پشتیبانی بسیار خوب از IntelliSense  است که شما به راحتی فقط با تایپ چند حرف اول پکیج مورد نظر خود را خواهید یافت.

IntelliSense پکیج های مورد نیاز ما برای ساخت این برنامه در زیر قابل مشاهده هستند:

    "dependencies": {
             "Microsoft.AspNet.Server.IIS": "1.0.0-beta1",
        "EntityFramework": "7.0.0-beta1",
        "EntityFramework.SqlServer": "7.0.0-beta1",
        "EntityFramework.Commands": "7.0.0-beta1",
        "Microsoft.AspNet.Mvc": "6.0.0-beta1",
        "Microsoft.AspNet.Diagnostics": "1.0.0-beta1",
        "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta1"

    },
  • Microsoft.AspNet.Server.IIS:برای هاست کردن برنامه روی IIS نیاز به این پکیج است و در صورتی که نیازی ندارید برنامه شما روی IIS هاست شود می توانید از این پکیج استفاده نکنید.
  • EntityFramework و  EntityFramework.SqlServer:در این برنامه ما از sql server برای ذخیره دادهایمان استفاده میکنیم و برای همین از EntityFramework و EntityFramework.SqlServer استفاده خواهیم کرد.همچنین در نسخه جدید EntityFramework به جز دیتابیس های relational از SQLite, AzureTableStorage, و InMemory نیز پشتیبانی می شود.
  • EntityFramework.Commands:این پکیج به منظور DB migrations به وسیله فرمان در پروژه ما با استفاده از KVM است.
  • Microsoft.AspNet.Mvc: پکیج اصلی برای  Web API و MVC  در پروژه ما است.
  • Microsoft.AspNet.Diagnostics: شما می توانید در صورتی که نیاز ندارید این پکیج ها را نصب نکنید ولی در کل این پگیج باعث می شود در صورتی که در خواستی به URI در مرورگر داده شود به جای خطای ۴۰۳ یک صفحه کاربر پسندتر نشان داده شود.

Startup

  • Microsoft.Framework.ConfigurationModel.Json: این پکیج مسئولیت لود و خواندن فایل “config.json” را دارد.ما در مراحل بعدی این فایل را به پروژه اضافه خواهیم کرد.در واقع فایل “config.json” مسئولیت ستاپ کردن شی IConfiguration را دارد.برای درک بهتر این فایل بهتر است به این آدرس سری بزنید.

در آخر ما نیاز داریم یک بخش جدید در project.json به نام commands اضافه کنیم:

"commands": {
        "ef": "EntityFramework.Commands"
}

این بخش  امکان اجرای دستورات EF در KVM را خواهد داد.

مرحله سوم :افزودن فایلconfig.json:

حال با راست کلیک روی پروژه و انتخاب add new item یک تایپ جدید را به پروژه با تایپ ASP.NET Configuration File انتخاب و با نام config.json در پروژه ذخیره میکنیم.شما می توانید این فایل را جایگزین Web.config بدانید.

ما در این فایل فقط یک connection string را ست کرده ایم:

{
    "Data": {
        "DefaultConnection": {
            "Connectionstring": "Data Source=.\\sqlexpress;Initial Catalog=RegistrationDB;Integrated Security=True;"
        }
    }
}

مرحله چهارم:کانفیگ کردن ASP.NET 5 pipeline برای Web API:

کلاس Startup مسئولیت افزودن کامپننت های مورد نیاز ما را در pipeline به عهده دارد.با توجه به قالب انتخابی ما که در ابتدای ساخت پروژه انتخاب کردیم این کلاس خالی است که هم اکنون مقداری کد به آن اضافه خواهم کرد و در قسمت بعد توضیح خواهم داد:


using System;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Hosting;
using Microsoft.Framework.ConfigurationModel;
using Microsoft.Framework.DependencyInjection;
using Registration_MVC6WebApi.Models;
 
namespace Registration_MVC6WebApi
{
    public class Startup
    {
        public static IConfiguration Configuration { get; set; }
 
        public Startup(IHostingEnvironment env)
        {
            // Setup configuration sources.
            Configuration = new Configuration().AddJsonFile("config.json").AddEnvironmentVariables();
        }
        public void ConfigureServices(IServiceCollection services)
        {
            // Add EF services to the services container.
            services.AddEntityFramework().AddSqlServer().AddDbContext<RegistrationDbContext>();
 
            services.AddMvc();
 
            //Resolve dependency injection
            services.AddScoped<IRegistrationRepo, RegistrationRepo>();
            services.AddScoped<RegistrationDbContext, RegistrationDbContext>();
        }
        public void Configure(IApplicationBuilder app)
        {
            // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
            app.UseMvc();
 
            app.UseWelcomePage();
 
        }
    }
}

  •  در سازنده این کلاس من کدی را نوشته ام که مسئول خواندن فایلconfig.json است که ما در مرحله قبل اضافه کردیم.
  • متد ConfigureServices در ورودی خود پارامتری از جنس IServiceCollection را قبول می کند.این متد زمانی که پروژه در حال شروع شدن است به طور اتوماتیک صدا زده خواهدشد.
    • من EntityFramework را با پروایدر SqlServer و همچنین با کانتکسی به نام RegistrationDbContext اضافه کرده ام.
    • در خط بعدی MVC را به pipeline اضافه کرده ایم.
    • در آخر یکی از زیباترین امکانات ASP.NET 5 را مشاهده می کنید که Dependency Injection است بدون استفاده از  IoC containerهای خارجی.این خط باعث می شود که ما به ازای هر request فقط یک وهله از RegistrationRepo را داشته باشیم.برای اطلاعات بیشتر در رابطه با Dependency Injection در ورژن جدید  ASP.NET 5 به این مطلب زیبا سری بزنید.
  • متد Configure یک پارامتر از IApplicationBuilder دریافت می کند و در این جا من برای نشان دادن صفحه welcome page از آن استفاده کرده ام.

مرحله پنجم:افزودن Models, Database Context, وRepository:

در اینجا ما دو کلاس Course و CourseStatusModel را به برنامه اضافه میکنیم.که در واقع مدلهای ما را شامل میشود.:

using System;
using System.ComponentModel.DataAnnotations;

namespace Registration_MVC6WebApi.Models
{
    public class Course
    {
        public int Id { get; set; }
        [Required]
        [StringLength(100, MinimumLength = 5)]
        public string Name { get; set; }
        public int Credits { get; set; }
    }

    public class CourseStatusModel
    {
        public int Id { get; set; }
        public string Description { get; set; }
    }
}

در قسمت بعدی نیاز است که ما RegistrationDbContext  را که در کلاس Startup به عنوان Context به برنامه معرفی کردیم را بسازیم:

using Microsoft.Data.Entity;
using System;
using Microsoft.Data.Entity.Metadata;

namespace Registration_MVC6WebApi.Models
{
    public class RegistrationDbContext :DbContext
    {
        public DbSet<Course> Courses { get; set; }

        protected override void OnConfiguring(DbContextOptions options)
        {
            options.UseSqlServer(Startup.Configuration.Get("Data:DefaultConnection:ConnectionString"));
        }
    }
}

این کد به احتمال زیاد برای همه آشناست به غیر ازمتد OnConfiguration که در آن تنظیمات مربوط به رشته اتصال به دیتابیس را از فایل config.json به وسیله مشخص کردن کلید مورد نظر خوانده ایم.

در آخر نیاز است که IRegistrationRepo را به برنامه اضافه کنیم که در واقع یک Repository ما است.


using System;
using System.Collections;
using System.Collections.Generic;

namespace Registration_MVC6WebApi.Models
{
    public interface IRegistrationRepo
    {
        IEnumerable<Course> GetCourses();
        Course GetCourse(int courseId);
        Course AddCourse(Course course);
        bool DeleteCourse(int courseId);
    }
}


using System;
using System.Collections.Generic;
using System.Linq;


namespace Registration_MVC6WebApi.Models
{
    public class RegistrationRepo : IRegistrationRepo
    {
        private readonly RegistrationDbContext _db;

        public RegistrationRepo(RegistrationDbContext db)
        {
            _db = db;
        }
        public Course AddCourse(Course course)
        {
            _db.Courses.Add(course);

            if (_db.SaveChanges() > 0)
            {
                return course;
            }
            return null;

        }

        public bool DeleteCourse(int courseId)
        {
            var course = _db.Courses.FirstOrDefault(c => c.Id == courseId);
            if (course != null)
            {
                _db.Courses.Remove(course);
                return _db.SaveChanges() > 0;
            }
            return false;
        }

        public Course GetCourse(int courseId)
        {
            return _db.Courses.FirstOrDefault(c => c.Id == courseId);
        }

        public IEnumerable<Course> GetCourses()
        {
            return _db.Courses.AsEnumerable();
        }
    }
}

مرحله ششم: نصب KVM (K Version Manager)

What is KVM (K Version Manager)?  KVM is a Powershell script used to get the runtime and manage multiple versions of it being on the machine at the same time, you can read more about it here.

برای نصب KVM مراحل زیر را می بایست طی کنید:

  1. command prompt را در مد Run as administrator باز کنید.
  2. دستور زیر را اجرا کنید:
    @powershell -NoProfile -ExecutionPolicy unrestricted -Command “iex ((new-object net.webclient).DownloadString(‘https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.ps1’))”
  3. اسکریپ KVM برای کاربرحاری نصب خواهد شد.
  4. command prompt را دوباره  در مد Run as administrator باز کنید و دستور آپگرید را روی آن اجرا کنید:
    KVM upgrade

مرحله هفتم:ایجاد migrations برای دیتابس:

بعد از نصب kvm به راحتی می توانیم دستوراتی که با k شروع می شوند را در command prompt اجرا کنیم.مسیر پروژه را که حاوی فایل project.json است را کپی و مانند شکل زیر اجرا می کنیم:
EF7Migrationsدر واقع برای انجام این کار نیاز به دو دستور زیر است:

k ef migration add initial
k ef migration apply

حال اگر به ساختار پروژه نگاهی بیاندازیم متوجه افزوده شدن فایل ۲۰۱۴۱۱۱۷۲۳۰۳۱۵۴_initial می شویم:

EF7Migrations2

 

نکته:دستور ef در واقع همان دستوری است که ما در project.json در قسمت commands تعریف کرده ایم.

مرحله هشتم:افزودن متد GET برای کنترلر Courses

کنترلر وظیفه هندل کردن یک درخواست HTTP را دارد.در ASP.NET 5 برای ساخت یک کنترلر جدید فقط کافیست کلاس ما از Controller به ارث ببرد.بنابراین کنترلر جدید ما به شکل زیر خواهد بود:

using Microsoft.AspNet.Mvc;
using Registration_MVC6WebApi.Models;
using System;
using System.Collections.Generic;

namespace Registration_MVC6WebApi.Controllers
{
    [Route("api/[controller]")]
    public class CoursesController : Controller
    {
        private IRegistrationRepo _registrationRepo;

        public CoursesController(IRegistrationRepo registrationRepo)
        {
            _registrationRepo = registrationRepo;
        }

        [HttpGet]
        public IEnumerable<Course> GetAllCourses()
        {
            return _registrationRepo.GetCourses();
        }

        [HttpGet("{courseId:int}", Name = "GetCourseById")]
        public IActionResult GetCourseById(int courseId)
        {
            var course = _registrationRepo.GetCourse(courseId);
            if (course == null)
            {
                return HttpNotFound();
            }

            return new ObjectResult(course);
        }

    }
}

 

  • در بالا ما از Route attribute استفاده کرده ایم و هر درخواستی که شامل api/[controller]  یاشد به کنترلر مورد نظر هدایت خواهد شد.
  • خروجی متد GetAllCourses به صورت پیش فرض JSON است.
  • در متد بعدی”GetCourseById” ما یک محدودیت برای پارمتر ورودی در نظر گرفته ایم که حتما باید از جنس int  باشد.علاوه بر آن ما از خروجی IActionResult استفاده کرده ایم که به ما امکان بازگردانی تایپ های مختلف را می دهد.در سناریوی ما اگر کورس مورد نظر پیدا نشد ما HttpNotFound  برمی گردانیم.
  • اگر دقت کرده باشید ما از Constructor Injection  برای IRegistrationRepo استفاده کرده ایم.

مرحله نهم:افزودن متدهای POST و DELETE در CoursesController:


[HttpPost]
public IActionResult AddCourse([FromBody] Course course)
{
	if (!ModelState.IsValid)
	{
		Context.Response.StatusCode = 400;
		return new ObjectResult(new CourseStatusModel { Id = 1 , Description= "Course model is invalid" });
	}
	else
	{
	   var addedCourse =  _registrationRepo.AddCourse(course);

		if (addedCourse != null)
		{
			string url = Url.RouteUrl("GetCourseById", new { courseId = course.Id }, Request.Scheme, Request.Host.ToUriComponent());

			Context.Response.StatusCode = 201;
			Context.Response.Headers["Location"] = url;
			return new ObjectResult(addedCourse);
		}
		else
		{
			Context.Response.StatusCode = 400;
			return new ObjectResult(new CourseStatusModel { Id = 2, Description = "Failed to save course" });
		}
	   
	}
}

  •  اکثر کدهای بالا قابل فهم هستند ولی در قسمتی که ما به درستی یک کورس را اضافه کردیم در این حالت یک جواب با ست کردن Location برمی گردانیم که در واقع کاریر به صفحه مورد نظر ما هدایت خواهد شد.

نتیجه:

با توجه به اینکه در حال حاضر نسخه اصلی ASP.NET 5 عرضه نشده و همچنین ویژوال استودیو نیز به نسخه نهایی نرسیده امکان تغییر خیلی از موضوعات که در بالا اشاره شد می رود.

درحالت کلی کار کردن با ASP.NET 5 بسیار ساده تر شده.به عنوان مثال به پشتیبانی توکار از تزریق وابستگی می توانم اشاره کنم.

 

منابع:

 

Getting started with ASP.NET 5 MVC 6 Web API & Entity Framework 7