همینطور برای ایجاد یک View گزینه (DataWindow (WPF with Catel را انتخاب نمایید. ViewModelها در Catel از کلاس پایه ViewModelBase و Viewها نیز از کلاس DataWindow مشتق میشوند.
public class MainWindowViewModel : ViewModelBase { public MainWindowViewModel() : base() { ShowPleaseWait = new Command(OnShowPleaseWaitExecute); } public override string Title { get { return "View model title"; } } public Command ShowPleaseWait { get; private set; } private void OnShowPleaseWaitExecute() { var pleaseWaitService = GetService<IPleaseWaitService>(); pleaseWaitService.Show(() => { Thread.Sleep(3000); }); } }
<Button Margin="6" Command="{Binding ShowPleaseWait}" Content="Show PleaseWait!" />
var pleaseWaitService = GetService<IPleaseWaitService>(); pleaseWaitService.Show(() => { Thread.Sleep(3000); });
var uiService = GetService<IUIVisualizerService>(); var viewModel = new AnotherWindowViewModel(); uiService.Show(viewModel);
var openFileService = GetService<IOpenFileService>(); openFileService.Filter = "ZIP files (*.zip)|*.zip"; openFileService.IsMultiSelect = false; openFileService.Title = "Open file"; if (openFileService.DetermineFile()) { // ? }
var saveFileService = GetService<ISaveFileService>(); saveFileService.Filter = "ZIP files (*.zip)|*.zip"; saveFileService.FileName = "test"; saveFileService.Title = "Save file"; if (saveFileService.DetermineFile()) { // ? }
var processService = GetSetvice<IProcessService>(); processService.StartProcess(@"C:\Windows\System32\calc.exe");
var splashScreenService = GetService<ISplashScreenService>(); splashScreenService.Enqueue(new ActionTask("Creating the shell", OnCreateShell)); splashScreenService.Enqueue(new ActionTask("Initializing modules", OnInitializeModules)); splashScreenService.Enqueue(new ActionTask("Starting application", OnStartApplication));
var messageService = GetService<IMessageService>(); if (messageService.Show("Are you sure?", "?", MessageButton.YesNo, MessageImage.Warning) == MessageResult.Yes) { // ? }
Protocol Buffers فرمتی برای تبادل دیتا
سایت pluralsight ویدیوهای آموزشی بسیار با کیفیتی را در مورد مباحث مختلف دات نت تا بحال تهیه کرده و تقریبا هر موضوع جدیدی هم که اضافه میشود، بلافاصله یک سری جدید را تهیه میکنند. مدرسین انتخابی هم عموما افراد نامدار و باسوادی هستند.
پروژهای رو در سایت کدپلکس شروع کردم جهت تهیه زیرنویس فارسی برای این ویدیوها:
این کار نسبت به کار تهیه زیرنویسهای فارسی موجود برای فیلمهای انگلیسی کار سختتری است به چند دلیل:
- اسکریپت آمادهای وجود ندارد. کار شنیداری است.
- زمانبندی آمادهای وجود ندارد.
- مباحث تخصصی است.
- مدرس از ثانیه اول ویدیو تا ثانیه آخر آن حرف میزند!
برای مثال جهت تهیه زیرنویسهای فارسی فیلمهای انگلیسی عموما به سایتهایی مانند subscene.com مراجعه میشود. یک زیرنویس یا به قولی اسکریپت آماده یافت شده و شروع به ترجمه میشود. متن آماده است. زمانبندی آماده است و فقط کار ترجمه باقی میماند.
اما در مورد ویدیوهای آموزشی انگلیسی خیر. به همین جهت در این زمینه کار آنچنانی تابحال صورت نگرفته.
کار زمانبری است. فعلا رکورد من برای هر سه دقیقه ویدیوی آموزشی که مدرس از ثانیه اول تا آخر آن حرف میزند، 40 دقیقه کار تهیه زیر نویس فارسی زمانبندی شده است.
سری جدیدی رو که شروع کردم تحت عنوان «Building Windows 8 Metro Apps in C# and XAML» در سایت pluralsight ارائه شده.
فعلا قسمت اول آن زیرنویس دار شده و از اینجا قابل دریافت است. برای مشاهده آنها برنامه با کیفیت و رایگان KMPlayer توصیه میشود.
لیست ویدیوهای قسمت اول آن به شرح زیر است:
Building Windows 8 Metro Apps in C# and XAML
Overview 00:50:41
This modules provides an overview of how to develop Windows 8 Metro style applications in C# and XAML.
Introduction
XAML and Codebehind
Asynchronous APIs
Demo: Asynchronous APIs
Files and Networking
Demo: Requesting Capabilities
Integrating with Windows 8
WinRT and .NET
Summary
کلمه سی شارپ در این قسمت کمی غلط انداز است. بیشتر بحث و توضیح است تا کد نویسی. بنابراین برای عموم قابل استفاده است. خصوصا نگاهی دارد به تازههای ویندوز 8 از دیدگاه برنامه نویسها مانند سطوح دسترسی برنامههای مترو، معرفی Charms ، نحوه به اشتراک گذاری اطلاعات در بین برنامههای مترو نصب شده، برای مثال جایی که دیگر Clipboard سابق وجود ندارد و مواردی از این دست.
5 قسمت دیگر این مبحث باقیمانده که هر زمان تکمیل شد، خبرش رو خواهید شنید و تقریبا از این پس این سایت به همین ترتیب جلو خواهد رفت. فکر میکنم اینطوری مفیدتر باشد. هر از چندگاهی یک مبحث جدید زیرنویس دار شده را میتوانید مشاهده کنید.
اگر علاقمند بودید میتونید در این پروژه شرکت کنید و یک موضوع جدید و مستقل را برای تهیه زیرنویس شروع کنید. یا حداقل اگر پس از مشاهده این سری آماده شده، اصلاحی را انجام دادید، میتونید اون رو برای اعمال در اینجا ارسال کنید.
همانگونه که میدانید مقدار Identity پس از درج به آن تخصیص مییابد چنانچه بخواهید به این مقدار دسترسی پیدا کنید چندین روش به ازای اینکار وجود دارد که ما در این مقاله سه روش معمول را بررسی خواهیم نمود.
1- استفاده از متغییر سیستمی Identity@@
2- استفاده از تابع () Scope_Identity
3- استفاده از تابع Ident_Current
هر سه این توابع مقدار Identity ایجاد شده برای جداول را نمایش میدهند. اما تفاوت هایی باهم دارند که در ادامه مقاله این تفاوتها بررسی شده است.
1- متغییر سیستمی Identity@@ : این متغییر سیستمی حاوی آخرین Identity ایجاد شده به ازای Session جاری شما است. لازم به ذکر است اگر به واسته Insert شما، Identity دیگری در یک حوزه دیگر (مانند یک Trigger) ایجاد شود مقدار موجود در این متغییر حاوی آخرین Identity ایجاد شده است. (یعنی Identity ایجاد شده توسط آن تریگر و نه خود جدول). لازم به ذکر است این موضوع به طور کامل در ادامه مقاله شرح داده شده است.
2- استفاده از تابع()Scope_Identity : با استفاده از این تابع میتوانیم آخرین Identify ایجا دشده به ازای Session جاری را بدست آوریم. لازم به ذکر است مقادیر Identity ایجاد شده توسط سایر حوزهها تاثیر در مقدار بازگشتی توسط این تابع ندارد. در ادامه مقاله این موضوع به طور کامل بررسی شده است.
3- استفاده از تابع ident_Current : این تابع آخرین مقدار Identity موجود در یک جدول را نمایش میدهد. ذکر این نکته ضروری است که Identity ایجاد شده توسط سایر Sessionها هم روی خروجی این تابع تاثیرگذار است. چون این تابع آخرین Identity موجود در جدول را به شما نمایش میدهد و نه Identity ایجاد شده به ازای یکSession را.
برای بدست آوردن یک Identity کافی است که پس از درج رکورد در جدول مورد نظر متغییر سیستمی @@Identity و یا توابع Scope_Identity و یا Ident_Current را همانند مثال زیر Select کنید.
USE TEMPDB GO IF OBJECT_ID(N'Employees', N'U') IS NOT NULL DROP TABLE Employees1; GO CREATE TABLE Employees ( ID int IDENTITY, FirstName NVARCHAR(50), LastName NVARCHAR(50) ) GO INSERT INTO Employees (FirstName,LastName) VALUES (N'مسعود',N'طاهری') GO SELECT @@IDENTITY AS [@@IDENTITY] SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY()] SELECT IDENT_CURRENT('Employees1') AS [IDENT_CURRENT('Employees1')] GO
خروجی دستورات بالا پس از درج رکورد مورد نظر به صورت زیر است.
اما ممکن است از خودتان این سوال را بپرسید که آیا این توابع در سطح شبکه آخرین مقدار Identity درج شده توسط سایر Sessionها را نمایش میدهند و یا Session جاری را؟ (منظور Sessionی که درخواست مقدار موجود در identity را نموده است).
برای دریافت پاسخ این سوال مطابق مراحل اسکریپهای زیر را اجرا نمایید.
1-ایجاد جدول Employees1
USE TEMPDB GO IF OBJECT_ID(N'Employees1', N'U') IS NOT NULL DROP TABLE Employees1; GO CREATE TABLE Employees1 ( ID int IDENTITY(1,1), FirstName NVARCHAR(50), LastName NVARCHAR(50) ) GO
GO INSERT INTO Employees1(FirstName,LastName) VALUES (N'فرید',N'طاهری') GO SELECT @@IDENTITY AS [@@IDENTITY] SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY()] SELECT IDENT_CURRENT('Employees1') AS [IDENT_CURRENT('Employees1')] GO
همانگونه که ملاحضه میکنید @@Identity، Scope_Identity() و Ident_Current هر سه مقدار Identity (عدد 1) ایجاد شده بوسیله دستور Insert را به شما نمایش میدهند.
1- و در انتها در یک Session دیگر دستورات زیر را اجرا نمایید.(واکشی مقدار Identity)
USE tempdb GO SELECT @@IDENTITY AS [@@IDENTITY] SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY()] SELECT IDENT_CURRENT('Employees1') AS [IDENT_CURRENT('Employees1')] GO
همانطور که مشاهده میکنید در این Seesion ما از SQL خواستهایم آخرین مقدار Identity را به ما نشان داده شود. باید به این نکته توجه کنید با توجه به اینکه در این Session عملیات درجی هنوز انجام نگرفته است که ما Identity ایجاد شده را مشاهده نماییم. بنابراین صرفاً تابع Iden_Current مقدار Identity موجود در جدول را به ما نمایش میدهد.
پس میتوان به این نکته رسید که
@@Idnetity و Scope_Identity : Identity ایجاد به ازای Session جاری را نمایش داده و به مقادیر تولید شده توسط سایر Sessionهای دیگر دسترسی ندارد.
Ident_Current : آخرین Identity موجود در جدول را به شما نمایش میدهد. بنابراین باید این نکته را در نظر داشته باشید که Identityها ایجاد شده توسط سایر Sessionها روی مقدار بازگشتی این تابع تاثیرگدار است.
اما یکی دیگر از مباحث مهم درباره Identity تاثیر Scope بر مقدار Identity است (یعنی چه!) . برای اینکه با مفهوم این موضوع آشنا شوید اسکریپتهای مربوط به مثال زیر را بدقت اجرا کنید.
1- ایجاد جدول Employees1
USE TEMPDB GO IF OBJECT_ID(N'Employees1', N'U') IS NOT NULL DROP TABLE Employees1; GO CREATE TABLE Employees1 ( ID int IDENTITY(1,1), FirstName NVARCHAR(50), LastName NVARCHAR(50) ) GO
همانطور که مشاهده میکنید مقدار شروع برای Identity برابر 1 و گام افزایش هم برابر 1 در نظر گرفته شده است(Identity(1,1)) .
2- ایجاد جدول Employees2
USE TEMPDB GO IF OBJECT_ID(N'Employees2', N'U') IS NOT NULL DROP TABLE Employees2; GO CREATE TABLE Employees2 ( ID int IDENTITY(100,1), FirstName NVARCHAR(50), LastName NVARCHAR(50) ) GO
همانطور که مشاهده میکنید مقدار شروع برای Identity برابر 100 و گام افزایش هم برابر 1 در نظر گرفته شده است(Identity(100,1)).
3- ایجاد یک Trigger به ازای جدول Employees1
USE tempdb GO CREATE TRIGGER Employees1_Insert ON Employees1 FOR INSERT AS BEGIN INSERT Employees2(FirstName,LastName) SELECT FirstName,LastName FROM INSERTED END; GO
Trigger ایجاد شده به ازای جدول Employees1 به ازای عملیات Insert اجرا میشود. همچنین مقادیر درج شده در جدول Employees1 بوسیله جدول Inserted در دسترس است. لازم به ذکر است جدول Inserted یک جدول موقت بوده که توسط Trigger ایجاد شده و داخل خود آن معتبر است.
هدف ما از ایجاد این Trigger تهیه یک کپی از رکوردهایی که در جدول Employees1 درج میشوند است. این کپی قرار است با استفاده از دستور Insert…Select در جدول Employees2 ایجاد گردد.
4- درج یک رکورد در جدول Employees1 و واکشی مقدار Identity
USE tempdb GO INSERT INTO Employees1(FirstName,LastName) VALUES (N'مسعود',N'طاهری') GO SELECT @@IDENTITY AS [@@IDENTITY] SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY()] SELECT IDENT_CURRENT('Employees1') AS [IDENT_CURRENT('Employees1')] SELECT IDENT_CURRENT('Employees2') AS [IDENT_CURRENT('Employees2')] GO
مقادیر استخراج شده به ازای Identity به شرح زیر است
1- @@Identity : پس از درج رکورد در جدول Employees1 متغییر سیستمی @@Identity مقدار 100 را نمایش داده است دلیل این موضوع بر میگردد به Trigger موجود در جدول Employees1.
با توجه به اینکه جدول Employees1 دارای یک فیلد Identity بوده است هنگام درج رکورد در جدول مقدار @@Identity=1 است اما چون این جدول دارای Triggerی است که این Trigger خود با جدولی دیگری درگیر است که دارای Identity است مقدار متغییر @@identity=100 خواهد شد.
2- Scope_Identity() : مقدار نمایش داده شده توسط تابع Scope_Identity() برابر با مقدار Identity تخصیص (عدد 1) داده شده به ازای رکورد شما میباشد که این موضوع در اغلب موارد مد نظر برنامهنویسان میباشد.
3- Ident_Current(‘Employees1’) : مقدار نمایش شده توسط تابع Ident_Current آخرین مقدار Identity (عدد 1) موجود در جدول Employees1 است.
4- Ident_Current(‘Employees2’) : مقدار نمایش شده توسط تابع Ident_Current آخرین مقدار Identity (عدد 100) موجود در جدول Employees2 است.
چند نکته مهم
1- مقدار بازگردانده شده توسط تابع Ident_Current آخرین مقدار Identity موجود در جدول مورد نظر شما بوده است و عملیات درج سایر کاربران در این مقدار تاثیر گذار است.
2- برای بدست آوردن مقدار Identity درست بهتر است از تابع Scope_Identity() استفاده نماییم. معمولاً در بیشتر مواقع مقدار بازگردانده شده توسط این تابع مد نظر برنامه نویسان است.
3- EntityFramework و Nhibernate هم برای بدست آوردن Identity از تابع Scope_Identity استفاده میکند.
Protocol Buffers فرمتی برای تبادل دیتا
- محیط برنامه نویسی قدرتمند
- هسته اصلی کدهای همه اپلیکیشنها تولید شده شبیه به هم است
- نیازی به یادگیری زبانهای مربوط به هر پلتفرم را ندارید
- کم هزینه و زمان کمتر
- طراحی رابط گرافیکی سریع و منعطف به کمک HTML5 , CSS3
- برنامه نویسی آسان و سریع با javascript , Typescript
- قابلیت اجرا بر روی چندین پلتفرم مختلف(Android,iOS,Widnows Phone )
- قابلیت استفاده از فریمورکهای تحت وب مانند Bootstrap , Angular JS, ...
- قابلیت طراحی پلاگین برای ارتباط با سیستم عامل
- مناسب برای برای برنامههای چت و استفاد از وب سرویسها
- مناسب برای ساخت بازیهای آنلاین و آفلاین با تکنولوژیهای تحت وب
- راحتی کار با آن برای برنامه نویسان تحت وب
- نداشتن ابزار گزارش خطاهای مناسب؛ درنتیجه برطرف کردن خطاها خسته کننده خواهد بود .
- UI, UX اپلیکیشنها باید به نحوی باشد که کاربر حس کند با نرمافزارهای بومی گوشی کار میکند.
- کاهش سرعت اجرایی جزئی نسبت به سایر برنامهها (به دلیل استفاده از WebView)
- عدم دسترسی مستقیم به سیستم عامل و امکانات آن
- Node.js
- Git CLI
- Google Chrome
- Apache Ant
- Oracle Java JDK 7 (حتما نسخه x86 نصب شود)
- Android SDK
- SQLLite For Windows Runtime
- Apple iTunes
- node.js را از لینک مقابل دانلود کنید: اینجا (پیشنهاد میکنیم نسخهی x86 آن را نصب کنید)
- Google Chrome را نصب کنید
- Git Command Line Tools را نصب کنید و توجه کنید که در هنگام نصب، گزینه مربوط به افزودن Git را به مسیر Command Prompt شما، انتخاب کرده باشید.
- Apchage Ant را دانلود و در مسیری از سیستم خودتان قرار دهید.
- Java JDK 7 x86 را از لینک مشخص شده دانلود کنید و سپس عملیات نصب را انجام دهید.
- Android SDK را از آدرس مشحص شده دانلود کنید. پکیچهای مورد نیاز، به این SDK افزوده شده است. بعد از دانلود آن را در مسیری از سیستم خود قرار دهید.
- Apple iTunes و SQLite را دانلود و نصب کنید.
- اگر از ویندوز 7 استفاده میکنید ، WebSocket4Net را از لینک مقابل دانلود کنید ( اینجا ) و سپس فایل net45\Release\WebSocket4Net.dll در مسیر زیر کپی کنید:
%GIT_HOME%\cmd;C:\Program Files (x86)\nodejs\;%JAVA_HOME%\bin;%ANT_HOME%\bin; %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools; C:\ProgramData\Oracle\Java\javapath;
نکته تکمیلی
Accord.NET #1
چارچوب Accord.NET توسط آقای سزار سوزا بر پایه کتابخانهی مشهور و محبوب AForge.NET (که توسط آقای اندرو کریلو ایجاد شده بود) بنا شده و البته ابزارهای جدید زیادی به همراه یک محیط کامل برای محاسبات علمی (scientific computing) در NET. به آن اضافه شده است.
این چارچوب متشکل از چندین کتابخانه است که میتوان آن را از طریق NuGet دریافت و نصب کرد.
کتابخانههای Accord.NET را میتوان به سه دستهی کلی تقسیم کرد :
1. محاسبات علمی (scientific computing)
1.1. Accord.Math | جهت کار با ماتریسها عددی تجزیه ماتریسها (decomposition matrix) الگوریتمهای بهینه سازی عددی برای مسائل محدود و نامحدود توابع و ابزارهای خاص جهت استفاده در کاربردهای علمی |
1.2. Accord.Statistics | شامل توابعی جهت توزیعهای احتمال (probability distributions) آزمایش فرضیات (hypothesis testing) مدلهای آماری (statistical models) و توابعی شامل : رگرسیون خطی، مدل پنهان مارکوف (Hidden Markov Models)، آنالیز اجزای اساسی (Principal Component Analysis) و خیلی از تکنیکهای مرتبط دیگر. |
1.3. Accord.MachineLearning | شامل دسته بندهای معروف از جمله : ماشین برداری پشتیبان - Support Vector Machines درخت تصمیم - Decision Trees مدل نیو بیز - Naive Bayesian models K-means مدل ترکیبی گوسین - Gaussian Mixture models و الگوریتمهای متدوال دیگری مانند : Ransac, Cross-validation و Grid-Search |
1.4. Accord.Neuro | شامل الگوریتمهای معروف در حوزه شبکههای عصبی مصنوعی مانند: لونبرگ مارکوارت - Levenberg-Marquardt Parallel Resilient Back-propagation شبکه باور عمیق - Deep Belief Networks ماشین بولتزمن - Restrictured Boltzmann Machines و تعدادی از شبکههای عصبی دیگر |
2. پردازش تصویر و سیگنال
2.1. Accord.Imaging | شامل آشکارسازهای نقاط از جمله Harris, SURF, FAST و FREAK فیلترهایی برای تصاویر توابعی جهت انطباق (matching) و دوخت (stitching) تصاویر استخراج ویژگیهای خوبی مانند - ﻫﯿﺴﺘﻮﮔﺮام ﮔﺮادﯾﺎنﻫﺎی ﺷﯿﺐﮔﺮا و یا هاگ (Histograms of Oriented Gradients) و ویژگیهای توصیفی بافتی هارلیک (Haralick’s textural) |
2.2. Accord.Vision | تشخیص و ردیابی بیدرنگ چهره توابعی برای تشخیص، ردیابی و تبدیل اشیایی که در جریانی(streams) از تصاویر هستند |
2.3. Accord.Audio | شامل توابعی جهت پردازش صدا از جمله اسپکتروم آنالایزر |
3. سایر کتابخانههای پشتیبانی
3.1. Accord.Controls | شامل نمودار هیستوگرام، پلاتها و نمایشگرها و نمودارهایی برای دادههای جدولی جهت کاربردهای علمی. |
3.2. Accord.Controls.Imaging | شامل ابزاری برای نمایش سریع تصاویر برای برنامههای Windows Forms |
3.3. Accord.Controls.Audio | شامل کنترلهای Windows Forms برای نمایش شکل موج صوت و اطلاعات آن |
3.4. Accord.Controls.Vision | شامل اجزاء و کنترلهای Windows Forms برای ردیابی حرکات سر، صورت، دست و سایر کارهای مرتبط با بینایی ماشین |
اگر با مفاهیم یادگیری ماشین و هوش موصنوعی کمتر آشنا هستید و در این قسمت کمی کلمات تخصصی به کار رفته نگران نباشید؛ در مطالب آتی به صورت کاربردی به استفادهی از آنها خواهیم پرداخت.
آموزش PouchDB : معرفی
هدف این مقاله بر این است که شما را با دیتابیس PouchDB آشنا سازد .
در مطلب اول هدف فقط آشنایی و نحوه نصب PouchDB قرار خوهد داشت و در مطالب بعدی نحوه آشنایی با نحوه کدنویسی و استفاده به صورت آفلاین یا آنلاین بررسی خواهد شد .
فهرست مطالب :
- بخش اول : معرفی PouchDB
- شروع به کار با PouchDB
- نحوه استفاده از API ها
- سوالات متداول در مورد PouchDB
- خطاهای احتمالی
- پروژهها و پلاگین های PouchDB
- فایرفاکس 12 و بالاتر
- گوگل کروم 19 و بالاتر
- اپرا 12 و بالاتر
- سافاری 5 و بالاتر
- اینترنت اکسپلورر 10 و بالاتر
- NodeJs 0.10 و بالاتر
- و به صورت شگفت انگیزی در Apache Cordova
<script src="pouchdb-2.1.0.min.js"></script>
$ npm install pouchdb