baseName: "Project3.Core.MetadataCore.TagsService.en.resx" ,
baseName: "Project3.Core.MetadataCore.TagsService",
baseName: "Project3.Core.MetadataCore.TagsService.en.resx" ,
baseName: "Project3.Core.MetadataCore.TagsService",
const remote=require("electron").remote; const dialog=remote.dialog;
function OpenDialog() { dialog.showOpenDialog({ title:'باز کردن فایل متنی', properties: [ 'openFile']//[ 'openFile', 'openDirectory', 'multiSelections' ] ,filters:[ {name:'فایلهای نوشتاری' , extensions:['txt','text']}, {name:'جهت تست' , extensions:['doc','docx']} ] }, (filename)=>{ if(filename===undefined) return; var content= fs.readFileSync(String(filename),'utf8'); document.getElementById("TextFile").value=content; }); } function SaveDialog() { dialog.showSaveDialog({ title:'باز کردن فایل متنی', properties: [ 'openFile']//[ 'openFile', 'openDirectory', 'multiSelections' ] ,filters:[ {name:'فایلهای نوشتاری' , extensions:['txt','text']} ] }, (filename)=>{ if(filename===undefined) return; var content=document.getElementById("TextFile").value; fs.writeFileSync(String(filename),content,'utf8'); }); }
<button onclick="OpenDialog();" > Open File</button> <button onclick="SaveDialog();" > Save File</button>
remote.getCurrentWindow()
remote.getCurrentWebContents()
remote.getGlobal(name)
global.testData={year:1395};
alert(remote.getGlobal("testData").year);
remote.process
remote.getGlobal('process')
major.minor[.build[.reversion]]
major.minor[.maintenance[.build]]
به عنوان یک راه حل، مجموعهی سادهای از قوانین و الزامات که چگونگی طراحی شمارههای نسخه و افزایش آن را مشخص میکند، وجود دارد. برای کار کردن با این سیستم، شما ابتدا نیاز به اعلام API عمومی دارید. این خود ممکن است شامل مستندات و یا اجرای کد باشد.
علیرغم آن، مهم است که این API، روشن و دقیق باشد. هنگامیکه API عمومی خود را تعیین کردید، تغییرات برنامه شما بر روی نسخه API عمومی تاثیر خواهد داشت و آنرا افزایش خواهد داد. بر این اساس، این مدل نسخهبندی را در نظر بگیرید: X.Y.Z یعنی (Major.Minor.Patch).
رفع حفرههایی که بر روی API عمومی تاثیر نمیگذارند، مقدار Patch را افزایش میدهند، تغییرات جدیدی که سازگار با نسخه قبلی است، مقدار Minor را افزایش میدهند و تغییرات جدیدی که کاملا بدیع هستند و به نحوی با تغییرات قبلی سازگار نیستند مقدار Major را افزایش میدهند.
بخشهایی که فقط حاوی عدد هستند، بصورت عددی مقایسه میشوند و بخشهایی که حاری حروف و یا خط تیره هستند بصورت الفبایی مقایسه خواهند شد.
بخشهای عددی همواره اولویت پایینتری نسبت به بخشهای غیر عددی دارند. برای مثال:
1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0-rc.1+build.1 < 1.0.0 < 1.0.0+0.3.7 < 1.3.7+build < 1.3.7+build.2.b8f12d7 < 1.3.7+build.11.e0f985a
منبع نسخه بندی معنایی : semver.org
در این مقاله قصد داریم یک Api تحت وب را با استفاده از فریمورک ASP.NET Core توسعه دهیم تا عملیات CRUD را بر روی دیتابیس MongoDb که یکی از محبوبترین دیتابیسهای NoSql است، انجام دهد. قبل از شروع کار باید ویژوال استودیو نسخهی 2019 را نصب داشته باشید؛ بهطوریکه ورک لود ASP.NET and web development را هم حتما همراه آن نصب کرده باشید. علاوه بر آن باید .Net Core SDK 3.0+ و دیتابیس MongoDb را هم نصب کنید که میتوانید آنها را از آدرسهای زیر دانلود کنید. نگران نصب MongoDb هم نباشید چون نکته خاصی ندارد.
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/
https://dotnet.microsoft.com/download/dotnet-core
نسخهی جاری MongoDb، 4.4 است که پس از نصب، به صورت پیشفرض در آدرس C:\Program Files\MongoDB قرار میگیرد. در مسیر C:\Program Files\MongoDB\Server\4.4\bin فایلهای اصلی MongoDb قرار دارند و برای تعامل با MongoDb، به این فایلها نیاز خواهیم داشت. پس برای اینکه به راحتی بتوان در هر جای سیستم از طریق پاورشل به این فایلها دسترسی داشته باشید، این مسیر را به Path environment variable ویندوز اضافه کنید.
MongoDb دارای یک بخش اصلی یا اصطلاحا یکdaemon است که وظیفهی آن، پردازش درخواستهایی است که برای کار با دادهها صادر میشود. در حقیقت همه کارهایی که ما با دادهها انجام میدهیم مثلا دسترسی به دادهها و دستکاری آنها، از طریق این daemon انجام میگیرد و پشت صحنهی این daemon، با Storage Engine کار خواهد کرد. برای اجرای daemon، پاور شل را باز کنید و دستور mongod را وارد کنید. اگر با تنظیمات پیشفرض اجرا کنید، بر روی پورت 27017 بالا آمده و فایلهای دیتابیس را هم در مسیر C:\data\db قرار میدهد. اگر این مسیر را نداشته باشید، با خطا مواجه میشوید. یا باید این مسیر را تعریف کنید و یا از سوئیچ dbpath -- استفاده کنید تا مسیر فایل دیتابیس را تغییر دهید. پس پاور شل را باز کنید و دستور زیر را وارد کنید.
>> mongod --dbpath C:\BooksData
>> mongo
>> use BookstoreDb
بعد از ساختن دیتابیس، باید یک کالکشن بسازید. کالکشنها را میتوان معادل جداول، در دیتابیسهای رابطهای تصور کرد. با دستور createCollection می توان اینکار را انجام داد. برای اینکار دستور زیر را وارد کنید.
>> db.createCollection('Books')
بعد از ساختن کالکشن، میخواهیم مقداری دیتا را در آن قرار دهیم. معادل رکورد در دیتابیسهای رابطهای، در دیتابیس مونگو دیبی، Document نام دارد که مانند رکوردهای دیتابیسهای رابطهای نیست و ساختار و اسکیمای خاصی ندارد؛ یعنی میتوان هر دیتایی را با هر ساختاری در آن ذخیره کرد. میخواهیم دو Document را به کالکشن Books اضافه کنیم. پس دستور زیر را وارد میکنیم. توجه کنید دادهها با ساختار json وارد میشوند.
>> db.Books.insertMany([{'Name':'Design Patterns','Price':54.93,'Category':'Computers','Author':'Ralph Johnson'}, {'Name':'Clean Code','Price':43.15,'Category':'Computers','Author':'Robert C. Martin'}])
{ "acknowledged" : true, "insertedIds" : [ ObjectId("5bfd996f7b8e48dc15ff215d"), ObjectId("5bfd996f7b8e48dc15ff215e") ] }
>> db.Books.find().pretty()
{ "_id" : ObjectId("5bfd996f7b8e48dc15ff215d"), "Name" : "Design Patterns", "Price" : 54.93, "Category" : "Computers", "Author" : "Ralph Johnson" }, { "_id" : ObjectId("5bfd996f7b8e48dc15ff215e"), "Name" : "Clean Code", "Price" : 43.15, "Category" : "Computers", "Author" : "Robert C. Martin" }
UI-Router ابزاری برای مسیریابی در AngularJS است که این امکان را برایتان فراهم میکند تا بخشهای برنامه رابط کاربریتان را به شکل یک ماشین حالت ساماندهی کنید. برخلاف سرویس route$ که بر اساس مسیریابی URLها ساماندهی شده و کار میکند، UI-Router بر اساس حالتها کار میکند، که این حالتها میتوانند در صورت لزوم مسیریابی هم داشته باشند.
<!doctype html> <html ng-app="myApp"> <head> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script> <script src="js/angular-ui-router.min.js"></script> <script> var myApp = angular.module('myApp', ['ui.router']); // For Component users, it should look like this: // var myApp = angular.module('myApp', [require('angular-ui-router')]); </script> ... </head> <body> ... </body> </html>
<!-- index.html --> <body> <div ui-view></div> <!-- We'll also add some navigation: --> <a ui-sref="state1">State 1</a> <a ui-sref="state2">State 2</a> </body>
<!-- partials/state1.html --> <h1>State 1</h1> <hr/> <a ui-sref="state1.list">Show List</a> <div ui-view></div>
<!-- partials/state2.html --> <h1>State 2</h1> <hr /> <a ui-sref="state2.list">Show List</a> <div ui-view></div>
<!-- partials/state1.list.html --> <h3>List of State 1 Items</h3> <ul> <li ng-repeat="item in items">{{ item }}</li> </ul>
<!-- partials/state2.list.html --> <h3>List of State 2 Things</h3> <ul> <li ng-repeat="thing in things">{{ thing }}</li> </ul>
myApp.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) { // // For any unmatched url, redirect to /state1 $urlRouterProvider.otherwise("/state1"); // // Now set up the states $stateProvider .state('state1', { url: "/state1", templateUrl: "partials/state1.html" }) .state('state1.list', { url: "/list", templateUrl: "partials/state1.list.html", controller: function($scope) { $scope.items = ["A", "List", "Of", "Items"]; } }) .state('state2', { url: "/state2", templateUrl: "partials/state2.html" }) .state('state2.list', { url: "/list", templateUrl: "partials/state2.list.html", controller: function($scope) { $scope.things = ["A", "Set", "Of", "Things"]; } }) }]);
.state('state1', { url: "/state1/:id", templateUrl: "partials/state1.html" })
$stateParams.id
.state('list', { parent: "state1", url: "/list", templateUrl: "partials/state1.list.html", controller: function($scope) { $scope.items = ["A", "List", "Of", "Items"]; } }) .state('list', { parent: "state2", url: "/list", templateUrl: "partials/state2.list.html", controller: function($scope) { $scope.items = ["A", "List", "Of", "Items"]; } })
.state('state1', { url: "/state1", templateUrl: "partials/state1.html", data:{ foodata: 'addorder' } })
$state.current.data.foodata
<!-- index.html --> <body> <div ui-view="viewA"></div> <div ui-view="viewB"></div> <!-- Also a way to navigate --> <a ui-sref="route1">Route 1</a> <a ui-sref="route2">Route 2</a> </body>
myApp.config(function ($stateProvider) { $stateProvider .state('index', { url: "", views: { "viewA": { template: "index.viewA" }, "viewB": { template: "index.viewB" } } }) .state('route1', { url: "/route1", views: { "viewA": { template: "route1.viewA" }, "viewB": { template: "route1.viewB" } } }) .state('route2', { url: "/route2", views: { "viewA": { template: "route2.viewA" }, "viewB": { template: "route2.viewB" } } }) });
چند نکته
.state('list', { parent: "state1", url: "/list", templateUrl: "partials/state1.list.html", controller: "state1ListController as listCtrl1" } }) .state('list', { parent: "state2", url: "/list", templateUrl: "partials/state2.list.html", controller: "state2ListController as listCtrl2" } })
حالتهای انتزاعی
حساسیت به حروف بزرگ و کوچک
با توجه به پیشرفت تکنولوژی و معماریهای مدرن، در اپلیکیشنهای امروزی سرعت و کارایی از مولفه هایی هستند که بیشتر احساس نیاز میشوند و درصورت عدم دارا بودن این مولفه ها، اپلیکیشن مورد توجه کاربران قرار نخواهد گرفت و درنهایت سودی به بار نخواهد آمد.
یکی از روشهای کسب این مولفهها استفاده از کشینگ در سطح ایپلیکیشن خودتون است.
در زیر پکیجی رو براتون معرفی میکنم که میتوانید در پروژههای دات نت خودتون کشینگ رو براحتی پیاده سازی کنید.
شما با استفاده از پکیج PolyCache براحتی و در سریعترین زمان میتونید کشینگ رو پیاده سازی کنید.
روال و جزئیات پیاده سازی در گیت هاب پروژه قرار گرفته است.
Install-Package Telegram.Bot
[HttpPost] public async Task<IHttpActionResult> UpdateMsg(Update update) { //...... }
var bot = new Telegram.Bot.TelegramBotClient("Token"); bot.SetWebhookAsync("https://Domian/api/webhook").Wait();
namespace Telegrambot.Controllers { public class WebhookController : ApiController { Telegram.Bot.TelegramBotClient _bot = new Telegram.Bot.TelegramBotClient("number"); Translator _translator = new Translator(); [HttpPost] public async Task<IHttpActionResult> UpdateMsg(Update update) { if (update.Message.Text == "/start") { await _bot.SendTextMessageAsync(update.Message.From.Id, "Welcome To My Bot"); } else { var translatedRequest = _translator.Translate(update.Message.Text, "Persian", "English"); await _bot.SendTextMessageAsync(update.Message.From.Id, translatedRequest); } return Ok(update); } } }