(function () { var itemCtx = {}; itemCtx.Templates = {}; itemCtx.Templates.Header = "<div><b title=\"اطلاعات فیلم ها\">Movie Data</b></div><ul>"; itemCtx.Templates.Item = MyOverrideTemplate; itemCtx.Templates.Footer = "</ul>"; itemCtx.BaseViewID = 1; itemCtx.ListTemplateType = 100; //For Generic List (More : http://msdn.microsoft.com/en-us/library/ms462947(v=office.12).aspx) SPClientTemplates.TemplateManager.RegisterTemplateOverrides(itemCtx); })(); function GT(val , index) { // example of val : 60 % var temp = val.split(' ')[0]; var v = Number(temp); return v > index; } function LT(val, index) { var temp = val.split(' ')[0]; var v = Number(temp); return v < index; } function EQ(val, index) { var temp = val.split(' ')[0]; var v = Number(temp); return v == index; } function MyOverrideTemplate(ctx) { if (LT(ctx.CurrentItem.PopularityPercent ,25)) { return "<li title='خیلی کم بازدید' style='color:white;background-color: red;width: 300px;height: 24px;'>" + ctx.CurrentItem.Title + " – " + ctx.CurrentItem.PopularityPercent + "</li>"; } else if (LT(ctx.CurrentItem.PopularityPercent ,50)) { return "<li title='کم بازدید' style='color:maroon;background-color: #ffcc00;width: 300px;height: 24px;'>" + ctx.CurrentItem.Title + " – " + ctx.CurrentItem.PopularityPercent + "</li>"; } else if (LT(ctx.CurrentItem.PopularityPercent ,75)) { return "<li title='بازدید معمولی' style='color:#ffcc00;background-color: maroon;width: 300px;height: 24px;'>" + ctx.CurrentItem.Title + " – " + ctx.CurrentItem.PopularityPercent + "</li>"; } else if (LT(ctx.CurrentItem.PopularityPercent ,95)) { return "<li title='پر بازدید' style='color:yellow;background-color: blue;width: 300px;height: 24px;'>" + ctx.CurrentItem.Title + " – " + ctx.CurrentItem.PopularityPercent + "</li>"; } else if (EQ(ctx.CurrentItem.PopularityPercent, 100)) { return "<li title='بالاترین بازدید' style='color:black;background-color: green;width: 300px;height: 24px;'>" + ctx.CurrentItem.Title + " – " + ctx.CurrentItem.PopularityPercent + "</li>"; } else { return "<li title='نامعلوم' style='color:navy;background-color: yellow;width: 300px;height: 24px;'>" + ctx.CurrentItem.Title + " – " + ctx.CurrentItem.PopularityPercent + "</li>"; } }
~site/_catalogs/masterpage/MyJsLinkSample.js
آموزش ساخت یک بلاگ با Blazor .Net 8
8# آموزش سیستم مدیریت کد Git
$ git branch | grep -v "master" | xargs git branch -D
یکی کردن و فشرده سازی فایلهای استاتیک در ASP.NET Core
هدف از یکی کردن و فشرده سازی فایلهای استاتیک مانند اسکریپتها و فایلهای CSS، بهبود کارآیی برنامه با کاهش حجم نهایی ارائهی آن و همچنین کاهش تعداد رفت و برگشتهای به سرور برای دریافت فایلهای متعدد مرتبط به آن است. در عملیات Bundling، چندین فایل، به یک تک فایل تبدیل میشوند تا اتصالات مرورگر به وب سرور، جهت دریافت آنها به نحو چشمگیری کاهش پیدا کند و در عملیات Minification، مراحل متعددی بر روی کدهای نوشته شده صورت میگیرد تا حجم نهایی آنها کاهش پیدا کنند. مایکروسافت در ASP.NET Core RTM، ابزاری را به نام BundlerMinifier.Core جهت برآورده کردن این اهداف ارائه کردهاست. بنابراین اولین قدم، نصب وابستگیهای آن است.
برای اینکار یک سطر ذیل را به فایل project.json اضافه کنید. این بسته باید به قسمت tools اضافه شود تا قابلیت فراخوانی از طریق خط فرمان را نیز پیدا کند:
"tools": { "BundlerMinifier.Core": "2.1.258" },
No executable found matching command "dotnet-bundle" Version for package `BundlerMinifier.Core` could not be resolved.
اسکریپت نویسی برای کار با BundlerMinifier.Core
روشهای زیادی برای کار با ابزار BundlerMinifier.Core وجود دارند؛ منجمله انتخاب فایلها در solution explorer و سپس کلیک راست بر روی فایلهای انتخاب شده و انتخاب گزینهی bundler & minifier برای یکی کردن و فشرده سازی خودکار این فایلها. برای این منظور افزونهی Bundler & Minifier را نیاز است نصب کنید.
اما روشی که قابلیت خودکارسازی را دارد، استفاده از فایل ویژهی bundleconfig.json این ابزار است. برای این منظور فایل جدید bundleconfig.json را به ریشهی پروژه اضافه کرده و سپس محتوای ذیل را به آن اضافه کنید:
[ { "outputFileName": "wwwroot/css/site.min.css", "inputFiles": [ "wwwroot/css/site.css" ] }, { "outputFileName": "wwwroot/js/site.min.js", "inputFiles": [ "bower_components/jquery/dist/jquery.min.js", "bower_components/jquery-validation/dist/jquery.validate.min.js", "bower_components/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js" ], "minify": { "enabled": true, "renameLocals": true }, "sourceMap": false } ]
با ذخیره سازی این فایل، کار یکی سازی و فشرده کردن مداخل آن به صورت خودکار صورت خواهد گرفت.
خودکار سازی فرآیند یکی کردن و فشرده سازی فایلهای استاتیک
برای خودکار سازی این فرآیند، میتوان به صورت زیر عمل کرد. فایل project.json را گشوده و قسمت scripts آنرا به نحو ذیل تغییر دهید:
"scripts": { "precompile": [ "dotnet bundle" ], "prepublish": [ "bower install" ], "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ] }
یک نکته: به منوی Build گزینهی Update all bundles نیز با نصب افزونهی Bundler & Minifier اضافه میشود. همچنین اگر از منوی Tools گزینهی Task runner explorer را انتخاب کنید، فایل bundleconfig.json توسط آن شناسایی شده و گزینهی update all files را نیز در اینجا مشاهده خواهید کرد.
ساده سازی تعاریف فایل Layout برنامه
در یک چنین حالتی دیگر نباید در فایل layout شما، ارجاعات مستقیمی به پوشهی مثلا bower_components وجود داشته باشند و یا در کلاس آغازین برنامه، نیازی نیست تا این پوشه را عمومی کنید. لیست مداخلی را که نیاز دارید، به ترتیب از پوشههای مختلفی تهیه و در فایل bundleconfig.json ذکر کنید تا یکی شده و خروجی js/site.min.js را تشکیل دهند. این مورد تنها مدخلی است که نیاز است در فایل layout برنامه ذکر شود (بجای چندین و چند مدخل مورد نیاز):
<script src="~/js/site.min.js" asp-append-version="true" type="text/javascript"></script>
در مورد الگوی MVVM پیشتر دو مطلب در این سایت منتشر شدهاند : + و +
مشکل عمدهای هم که در مورد این الگو وجود دارد کمبود منابع آموزشی آن به زبان ساده است. هر چند این الگو از طرف خود مایکروسافت ارائه شده اما همانند ASP.Net MVC به آن پر و بال ندادند و شاهد چند ده کتاب منتشر شده در مورد آن نیستیم.
به همین جهت خلاصهای چند قسمتی را در این مورد تهیه کردهام که در طی روزهای آتی ارائه خواهند شد.
فهرست قسمت اول:
- M-V-VM چیست؟
- آشنایی با اجزای مختلف الگوی M-V-VM
- مزایای استفاده از الگوی M-V-VM
- اصول کاری و بایدها و نبایدهای الگوی M-V-VM
- بایدها و نبایدهای یک View
- بایدها و نبایدهای ViewModel
- بایدها و نبایدهای Model
- مروری بر معایب الگوی M-V-VM
کامپوننتها در Vue.js
Vue.component('todo-item', { template: '\ <li>\ {{ title }}\ <button v-on:click="$emit(\'remove\')">Remove</button>\ </li>\ ' })
Vue.component('custom-input', { template: ` <input v-bind:value="value" v-on:input="$emit('input', $event.target.value)" > ` })
<script type="x-template" id="my-template" src="template.js"> </script> <div id="app"></div> new Vue({ el: '#app', template: '#my-template' })
<div id="app"> <gallery inline-template> .... Vue.component('gallery', { ...
const template = ` <ul> <li v-for="item in items"> {{ item }} </li> </ul>`; const compiledTemplate = Vue.compile(template); new Vue({ el: '#app', data() { return { items: ['Item1', 'Item2'] } }, render(createElement) { return compiledTemplate.render.call(this, createElement); } });
new Vue({ el: '#app', data: { msg: 'Show the message' }, methods: { hello () { alert('Here is the message') } }, render (createElement) { return createElement( 'span', { class: { 'my-class': true }, on: { click: this.hello } }, [ this.msg ] ); }, });
new Vue({ el: '#app', data: { msg: 'Show the message.' }, methods: { hello () { alert('This is the message.') } }, render(h) { return ( <span class={{ 'my-class': true }} on-click={ this.hello } > { this.msg } </span> ) } });
cloc-x.x.exe hello.c
1 text file. 1 unique file. 0 files ignored. https://github.com/AlDanial/cloc v 1.65 T=0.04 s (28.3 files/s, 340.0 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C 1 0 7 5 -------------------------------------------------------------------------------
cloc-x.x.exe projectDirectoryName
16 text files. 15 unique files. 3 files ignored. https://github.com/AlDanial/cloc v 1.65 T=0.23 s (57.1 files/s, 188914.0 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C 10 4680 6621 30812 C/C++ Header 3 99 286 496 ------------------------------------------------------------------------------- SUM: 13 4779 6907 31308 -------------------------------------------------------------------------------
در ،قسمت قبلی پیاده سازی درختها را بررسی کردیم و در این قسمت مبحث گرافها را آغاز میکنیم .
گرافها یکی از پر اهمیتترین و
همچنین پر استفادهترین ساختارها هستند و به خوبی روابط بین تمامی اشیاء را نشان میدهند
و در عمل تقریبا همه چیز را پشتیبانی میکنند. در ادامه متوجه خواهید شد که درختها،
زیر مجموعهای از گرافها هستند و همانطور که میدانید لیستها هم زیر مجموعهی درختها
هستند. پس لیستها هم زیر مجموعهی گرافها میشوند .
مفهوم پایهای گراف
در این بخش تعدادی از مهمترین خصوصیات
گرافها را بررسی میکنیم که تعدادی از آنها بسیار شبیه به ساختمان درختهاست، ولی
تفاوتهای زیادی با هم دارند؛ زیرا که درخت، خود نوع متفاوتی از ساختمان گرافها است .
درخت زیر را در نظر بگیرید؛ این درخت هم مانند سایر درختها با گرههای شماره دار، نامگذاری شده است که تشخیص آنها را برای
ما آسانتر میسازد. در گراف، به گرهها راس یا vertice هم
میگویند. هر چند نام گره هم برای آنها به کار برده میشود. به فلشهایی که به
این رئوس اشاره میکنند، لبههای جهت دار directed edges گفته میشود که در ویکی پدیا و کتب آموزشی فارسی، به آنها یال
اطلاق میشود . به یال هایی که از هر راس بیرون میآیند Predecessor گفته میشود که به معنی آغاز کننده است و به راسی که اشاره میکند، Successor گویند که
به معنی ارث برنده یا جایگزین شناخته میشود. در شکل زیر عدد راس 19 آغاز کننده راس
1 است و 1 هم جایگزین یا ارث برنده 19 و اگر با دقت به شکل نگاه کنید میبینید که
یک راس میتواند از چند راس ارث برنده باشد؛ مثل راس 21 .
برای نمایش گراف، ما از عبارت (V,E) استفاده میکنیم که
V مجموعهای از راسها و E مجموعهای از لبههاست. هر لبه (که با
e کوچک نمایش داده میشود) و در مجموعه E قرار دارد، پیوند دو راس
v و
u را نشان میدهد یا به عبارتی به صورت
ریاضی میشود (e=(u,v .
برای
اینکه مطالب را بهتر درک کنیم
بهتر است که هر راس را یک شهر و هر لبه را یک جادهی یک طرفه برای ارتباط با
این راسها فرض کنیم. مثلا اگر یکی از راسها را تهران تصور کنیم و دیگری را
کاشان، لبه یا
جادهی یک طرفهای که این دو شهر را به هم متصل میکند، میشود جاده یا لبهی تهران کاشان.
در بعضی مواقع از لبههای بدون جهت استفاده میشود که این لبهها را لبههای دو طرفه میگویند؛ مثل جادهی دو طرفه. گاهی هم از دو لبهی جهت دار به جای یک لبهی بدون جهت استفاده میکنند که نمونهی آن را در شکل زیر میبینید.
دو راسی که به وسیلهی یک یال به یکدیگر متصل میشوند را همسایه Neighbor مینامند. هر یال میتواند یک عدد برای خود داشته باشد که به این عدد وزن یال یا لبه میگویندWeight (Cost) و در مثال بالا میتوان گفت وزن هر یال میشود مسافت آن جاده؛ مسافتی که بین دو شهر همسایه باید طی شود. تصویر زیر یک گراف را نشان میدهد که وزن یالهای آن در کنار هر یال نوشته شده است.
مسیر Path در گراف همانند درختها، طی کردن مسیری است که از یک راس به راس دیگر میرسد. در مثال بالا باید گفت که برای رسیدن از شهر مبدا به شهر مقصد، باید از چه شهرهایی عبور کرد. در شکل بالا مسیر 1 - 12 - 19 - 21 - 7 - 21 و 1 مسیر نیستند؛ چرا که راس 21 هیچ لبهی آغاز کنندهای ندارد و بیشتر ارث برنده است.
طول Length هر مسیر هم تعداد یالهایی است که در طول مسیر قرار دارد یا تعداد راسها منهای یک؛ به این مثال دقت کنید:
مسیر 1 -12-19-21 مسیری است که طول آن سه میباشد.
وزن مسیر هم از جمع وزن یالهایی که در طول مسیر طی میشود به دست میآید.
حلقه Loop مسیری است که راس اولیه با راس نهایی یکی باشد. نمونهی آن مسیر 1-12-19-1 میباشد. ولی مسیر 1-7-21 حلقهای تشکیل نمیدهد.
لبهی حلقه ای Looping Edge لبهای است که مبداء یا آغاز کنندهی آن با مقصد یا ارث برندهی آن یکی باشد. یعنی به راسی وصل شود که از همان، آغاز شده است. مثل لبهی متصل به راس 14.
یک کلاس گراف به چه مواردی نیاز دارد:
عملیات ایجاد گراف
افزودن و حذف یک راس یا لبه
بررسی اینکه بین دو راس لبه ای وجود دارد یا خیر
جست و جوی جانشینهای یک راس
در قسمت آینده کد آن را در سی شارپ پیاده سازی خواهیم کرد.
طبق مطلب ارائه شده در مقاله:
تابع submit :
function(event, value, message, formVals){}
خب حالا مشابه مثال زیر عمل کنید:
<div class="prompt-content" style="display: none;"> <span>ایمیل خود را وارد نمایید : </span> <span> <input type="text" name="user_email" /> </span> </div>
$.prompt( $(".prompt-content").html(), { submit: function (e, v, m, f) { var userEmail = f["user_email"]; console.log(userEmail); } });