اشتراک‌ها
Memory Profiler در Visual Studio 2015

شاید تا به حال به این فکر افتاده بودید که برنامه‌ی شما چه مقداری از RAM ، CPU و ... را اشغال کرده است، و جواب آن را به طور مثال در Task Manager ویندوز پیدا کرده باشید. اما آیا تا به حال به این فکر رفته اید که خب این برنامه چرا باید این مقدار از حافظه را اشغال کند و بخواهید به طور دقیق مقدار حافظه را چک کنید، که چه آبجکت هایی از چه کلاس هایی چه مقدار از رم را اشغال کرده است. در این مقاله قصد دارم که ابزاری به شما معرفی کنم که شما به کمک آن میتوانید به راحتی در هنگام Debug برنامه خود مصرف حافظه برنامه‌ی خود را با جزئیات آن بسنجید . همچنین شما میتوانید با اعمال یک سری از تغییرات بر روی برنامه متوجه شوید که این تغییرات چقدر بر مصرف حافظه‌ی شما تاثیر داشته اند.

با Memory Usage Tool   که در VS2015 وجود دارد، شما میتوانید در حالت عیب یابی (debugging) ، مصرف حافظه‌ی خود را بسنجید.

·   Break-Aware Live Graph

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

شما میتوانید این ابزار را در موقعی که برنامه‌ی شما در حال اجراست در سمت راست مشاهده کنید. همچنین میتوانید در هنگامی که برنامه‌ی شما از حالت اجرا خارج شد این ابزار را از مسیر
  Debug -> Show Diagnostic Tools بیاورید

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

ابتدا بر روی گزینه‌ی Memory Usage کلیک کرده و گزینه‌ی Take Snapshot را انتخاب کنید

وقتی که بر روی این گزینه کلیک کردید مصرف حافظه‌ی شما به جزئیات به شما نشان داده میشود.

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

با این ابزار شما قادر خواهید بود که میزان تغییر حافظه بر اساس مقایسه بین دو Snapshot را بسنجید. برای اینکار شما میتوانید بعد از اعمال تغییرات، و یا بعد از زمانی مشخص دوباره بر روی گزینه‌ی Take Snapshot کلیک کنید. در این حالت شما میتوانید تغییری که بر روی حافظه‌ی شما اعمال گردیده را مشاهده کنید.


Memory Profiler در Visual Studio 2015
نظرات مطالب
تولید فایل‌های اکسل حرفه‌ای بدون نیاز به نصب مجموعه‌ی آفیس
سلام
من دارم از epplus استفاده می‌کنم. به range هایی که تعریف می‌کنم فونت "B Nazanin" میدم اما اعمال نمیشه، هر چند با انتخاب یک سلول فونت رو درست نشون میده. جالب اینکه وقتی یک فایل اکسل با فونت نازنین و درست باز دارم اگرهمزمان فایل اکسل گزارش رو باز کنم، فونت رو اعمال می‌کنه. ممنون میشم راهنماییم بفرمایید که چطور مشکل رو حل کنم. با سپاس. 
نظرات اشتراک‌ها
Map-Reduce و Google
از اون مطالبی بود که اصلا انتظارش رو نداشتم. به تاریخ پیوسته است گاهی دانسته‌های ام و خبر ندارم.
مطالب
ایجاد Attribute برای کامپوننت های Angular2
شما در انگیولار میتوانید با استفاده از روش‌های databinding برای یک تگ، خواصی را مقداردهی کنید. کد زیر یک نمونه از این خواص هاست:
<img [src]="...." />
و از طریق دایرکتیوهای موجود در انگیولار هم به شکل زیر عمل می‌کنید:
<img [ngClass]='..' />
تمامی این حالات از قبل در انگیولار تعریف شده و شما میتوانید از آن‌ها استفاده کنید. ولی اگر بخواهیم یک ویژگی دلخواه را تعریف کنیم، این کار توسط دایرکتیوها امکان پذیر است و به این نوع دایرکتیوها، Attribute Directive میگویند.
import { Directive, ElementRef, OnInit } from '@angular/core';

@Directive({
    selector: '[appHighlight]',
})
export class HighlightDirective implements OnInit {

    _dval = 'green';

    constructor(private _ref: ElementRef) {
    }

    ngOnInit(): void {
        this._ref.nativeElement.style.backgroundColor = this._dval;
    }
}
در کد بالا یک دایرکتیو ایجاد کرده‌ایم و در سازنده آن نوع ElementRef را دریافت میکنیم. این نکته به ما نشان میدهد که این دایرکتیو باید داخل یک تگ، استفاده شود، تا بتواند تگ مورد نظر را از این طریق برای ما بازگرداند. وقتی که تگ مورد  نظر را دریافت کردیم، از طریق رخ‌دادگردان OnInit، ویژگی رنگ پس زمینه را به مقدار پیش فرضی که رنگ سبز در آن تعریف شده است، تنظیم میکنیم و از این پس اگر این دایرکتیو بر روی هر تگی قرار بگیرد، رنگ پس زمینه آن سبز خواهد بود:
<span appHighlight>Attibute Directive</span>
لازم است که دایرکتیو تعریف شده در بالا، به فایل AppModules معرفی شود تا استفاده از آن در کامپوننت‌ها میسر گردد. خروجی نهایی به شکل زیر نمایش داده می‌شود:

حال ممکن است که بخواهید به این ویژگی مقداری را نسبت دهید و از طریق این مقدار، عملیات مورد نظر را انجام دهید. به عنوان نمونه در اینجا میخواهیم رنگ پس زمینه را در همان تگ معرفی کنیم:

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

import { Directive, ElementRef, OnInit } from '@angular/core';

@Directive({
    selector: '[appHighlight]',
    inputs: ["hc"]
})
export class HighlightDirective implements OnInit {

    hc: string;
    _dval = 'green';

    constructor(private _ref: ElementRef) {
    }

    ngOnInit(): void {
        this._ref.nativeElement.style.backgroundColor = this.hc || this._dval;
    }
}
در اینجا ما متغیری را به نام hc که مخفف highlightColor می‌باشد، تعریف میکنیم و سپس از طریق خصوصیت inputs در بالا آن را به یک ورودی برای کلاس تبدیل میکنیم تا از این طریق بتوانیم آن‌را مقداردهی نماییم.
معرفی کردن یک فیلد به عنوان ورودی در انگیولار، از دو طریق امکان پذیر است:
1. در اولین حالت شما متغیری را تعریف میکنید و آن متغیر را همانند کد بالا داخل ویژگی inputs متادیتای Directive معرفی میکنید.
2. در شیوه بعد که در این مقاله هم ذکر شده است میتوانید از طریق متادیتایی به نام Input@ اینکار را انجام دهید:
@Input() hc:string;

اینکه از کدام شیوه استفاده کنید تفاوتی ندارد و به خودتان بستگی دارد. ولی شیوه‌ی اول به دلیل اینکه همه یکجا تعریف می‌شوند، نظم بهتری داشته و در یک نگاه میتوان ورودی‌ها را تشخیص داد؛ ولی در شیوه‌ی دوم باید کل کلاس را برای یافتن آن‌ها مشاهده کرد.
مزیت روش دوم این است که در حین کدنویسی بسیار راحت است تا در همانجا ورودی را تعریف کنیم؛ به جای اینکه مرتب به ابتدای کلاس بازگردیم تا آن را تعریف کنیم.
this._ref.nativeElement.style.backgroundColor=this.hc || this._dval;
در رخ‌دادگردان هم به این شکل کد را تغییر دادیم تا اگر مقدار ورودی، دریافت شده‌است، آن را به عنوان مقدار اصلی در نظر بگیرد و در غیر اینصورت اگر نال بود، همان مقدار پیش فرض را انتساب دهد.
<h1 appHighlight [hc]="'red'">
  َApp Works!
</h1>
در خط بالا ابتدا دایرکتیو تعیین شده و سپس نام متغیر ورودی داده می‌شود. اگر قرار باشد ورودی‌های بیشتری داشته باشید مقداردهی آن به شکل زیر خواهد بود:
<h1 appHighlight [hc]="'red'"  [hc2]="....."  [hc3]="....."   ....>
  App Works! 
</h1>

گاهی اوقات ممکن است بخواهید عمل مورد نظر را بر اساس رویدادهای یک المان انجام دهید. پس کلاس را مجددا بازنویسی کرده و کدهای جدید را به آن اضافه میکنیم:
import { Directive, ElementRef, OnInit } from '@angular/core';

@Directive({
    selector: '[appHighlight]',
    inputs: ["hc"],
    host: {
        '(mouseenter)': 'onMouseEnter()',
        '(mouseleave)': 'onMouseLeave()',
    }
})
export class HighlightDirective implements OnInit {
    hc: string;
    _dval = 'green';
    constructor(private _ref: ElementRef) {}

    ngOnInit(): void {
        this._ref.nativeElement.style.backgroundColor = this.hc || this._dval;
    }

    onMouseEnter() {
        this._ref.nativeElement.style.backgroundColor = 'blue';
    }

    onMouseLeave() {
        this._ref.nativeElement.style.backgroundColor = 'pink';
    }
}
در بخش host دو رویداد را تعریف کرده و به متدهای کلاس اعمال میکنیم و در این حالت موقعیکه ماوس بر روی المان میرود، رنگ المان آبی شده و موقعیکه ماوس از روی المان کنار می‌رود، رنگ صورتی جایگزین آن می‌شود.
پاسخ به بازخورد‌های پروژه‌ها
نمایش چندی خطی یک فیلد
با سلام
با استفاده از سلول سفارشی مشکل padding شد، ممنون.

منتهی همانطور که مشاهده می‌کنید کماکان با تاریخ مشکل دارم. از تابع FixWeakCharacters نیز استفاده کرده ام ولی باز هم مشکل دارم، کد سلول سفارشی نیز این است : 

public PdfPCell RenderingCell(CellAttributes attributes)
        {
            var value = attributes.RowData.TableRowData.GetSafeStringValueOf(colName);
            var mainTable = new PdfGrid(1)
            {
                WidthPercentage = 100,
                RunDirection = PdfWriter.RUN_DIRECTION_RTL
            };
            string[] seperatedLine = value.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
            foreach (var line in seperatedLine)
            {
                mainTable.AddSimpleRow((data, cellProperties) =>
                       {
                           cellProperties.BorderWidth = 1f;
                           cellProperties.BackgroundColor = attributes.BasicProperties.BackgroundColor;
                           data.Value = line.FixWeakCharacters();
                           cellProperties.RunDirection = PdfRunDirection.RightToLeft;
                           cellProperties.CellPadding = 2;
                           cellProperties.PdfFont = attributes.BasicProperties.PdfFont;
                           cellProperties.HorizontalAlignment = HorizontalAlignment.Left;
                       });
            }

            var cell = new PdfPCell
            {
                Border = 1,
                RunDirection = PdfWriter.RUN_DIRECTION_RTL,
                HorizontalAlignment = Element.ALIGN_RIGHT
            };
            cell.AddElement(mainTable);
            return cell;

        }

با تشکر