How to Create Asp.Net MVC 3 Report ?

Bài viết khá hay về sử dụng iTextSharp để tạo báo cáo

LINK: http://sampathloku.blogspot.com/2013/04/how-to-create-aspnet-mvc-3-report.html

Advertisements

Boostrap – Admin & dashboards

Trang có khá nhiều theme cho admin và dashboards

https://wrapbootstrap.com/themes/admin

Mức độ hiệu quả của các cuộc họp và hướng giải quyết

header.

Nếu bạn đang làm việc trong một nhóm hay cho một tổ chức thì việc họp hành không còn xa lạ gì với bạn nữa. Các cuộc họp là dịp mọi người ngồi cùng nhau để phổ biến công việc, đưa ra các ý kiến, thảo luận vấn đề để có được quyết định tốt nhất cho tập thể. Từ xưa đến nay, nó vẫn được coi làphương pháp làm việc hiệu quả trong các tổ chức.

Tuy nhiên, hiện nay, phần lớn các cuộc họp đều không mang lại hiệu quả làm việc, đặc biệt khi so với thời gian và tiền bạc mà nó lấy đi của các tổ chức. Tuy nhiên những vấn đề này hoàn toàn có thể khắc phục được.

Infographic dưới đây trình bày những sự thật xấu xí đang diễn ra trong các cuộc họp hiện nay và cách thức khắc phục vấn đề ấy.

Cac-cuoc-hop-co-that-su-hieu-qua-va-huong-giai-quyet.

 

LINK: http://www.tinhte.vn/threads/infographic-muc-do-hieu-qua-cua-cac-cuoc-hop-va-huong-giai-quyet.2327550/

Log all parameters that were passed to some method in C#

To track this exception we use error loggers which only logges the exception detail and some other information if you want to. But hardly we get any idea for which input set(parameters and its values) a perticular method is throwing the error.

Introduction

Exception is an common issue in projects. To track this exception we use error loggers which only logges the exception detail and some other information if you want to. But hardly we get any idea for which input set(parameters and its values) a perticular method is throwing the error.

ParamLogUtility

This is the utility which we can use to trace Parameters values during exception.

internal class ParamLogUtility
{
    private readonly String _methodName;
    private String _paramaterLog;

    private readonly JavaScriptSerializer _serializer;
    private readonly Dictionary<String, Type> _methodParamaters;
    private readonly List<Tuple<String, Type, object>>_providedParametars;

    public ParamLogUtility(params Expression<Func<object>>[] providedParameters)
    {
        try
        {
            _serializer = new JavaScriptSerializer();
            var currentMethod = new StackTrace().GetFrame(1).GetMethod();

            /*Set class and current method info*/
            _methodName = String.Format("Class = {0}, Method = {1}", currentMethod.DeclaringType.FullName, currentMethod.Name);
            
            /*Get current methods paramaters*/
            _methodParamaters = new Dictionary<string, Type>();
            (from aParamater in currentMethod.GetParameters()
                select new { Name = aParamater.Name, DataType = aParamater.ParameterType })
                .ToList()
                .ForEach(obj => _methodParamaters.Add(obj.Name, obj.DataType));

            /*Get provided methods paramaters*/
            _providedParametars = new List<Tuple<string, Type, object>>();
            foreach (var aExpression in providedParameters)
            {
                Expression bodyType = aExpression.Body;
                if (bodyType is MemberExpression)
                {                    AddProvidedParamaterDetail((MemberExpression)aExpression.Body);
                }
                else if (bodyType is UnaryExpression)
                {
                    UnaryExpression unaryExpression = (UnaryExpression)aExpression.Body;
                    AddProvidedParamaterDetail((MemberExpression)unaryExpression.Operand);
                }
                else
                {
                    throw new Exception("Expression type unknown.");
                }
            }

            /*Process log for all method parameters*/
            ProcessLog();
        }
        catch (Exception exception)
        {
            throw new Exception("Error in paramater log processing.", exception);
        }
    }
    private void ProcessLog()
    {
        try
        {
            foreach (var aMethodParamater in _methodParamaters)
            {
                var aParameter =
                    _providedParametars.Where(
                        obj => obj.Item1.Equals(aMethodParamater.Key) && obj.Item2 == aMethodParamater.Value).Single();
                _paramaterLog += String.Format(@" ""{0}"":{1},", aParameter.Item1, _serializer.Serialize(aParameter.Item3));
            }
            _paramaterLog = (_paramaterLog != null) ? _paramaterLog.Trim(' ', ',') : string.Empty;
        }
        catch (Exception exception)
        {
            throw new Exception("MathodParamater is not found in providedParameters.");
        }
    }

    private void AddProvidedParamaterDetail(MemberExpression memberExpression)
    {
        ConstantExpression constantExpression = (ConstantExpression) memberExpression.Expression;
        var name = memberExpression.Member.Name;
        var value = ((FieldInfo) memberExpression.Member).GetValue(constantExpression.Value);
        var type = value.GetType();
        _providedParametars.Add(new Tuple<string, Type, object>(name, type, value));
    }

    public String GetLog()
    {
        return String.Format("{0}({1})", _methodName, _paramaterLog);
    }
}

Using the code

To use the code we have to add System.Web.Extensions.dll reference at our project, which is located somewhere around this location, if we don’t find it from reference explorer

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Web.Extensions.dll

If the method contains any parameter.

private void Add(string id, int age, string name, PersonEntity aPersonEntity)
{
    try
    {
        throw new NotImplementedException();
    }
    catch (Exception exception)
    {
        /*gives the log*/
        var paramLog = new ParamLogUtility(() => aPersonEntity, () => age, () => id, () => name).GetLog();
    }
}

It is not important that all methods should have parameter, If  there is no parameter, we can use it like,

var paramLog = new ParamLogUtility().GetLog();

Log String Sample

Class = MethodParamatersLog.Program, Method = Add(“id”:”1″, “age”:24, “name”:”Dipon”, “aPersonEntity”:{“CreatedDateTime”:”\/Date(1405115574273)\/”,”Id”:”1″,”Name”:”Dipon”,”Age”:24})

Limitation

This logers does have some limitations. Like

1. Only parameters pacified at method signature could participate in log process. If we add some extra variables to the process it would throw error. Has here aPersonEntity is not part of the method signature

private static void Add(string id, int age, string name)
{
    PersonEntity aPersonEntity = new PersonEntity();
    try
    {
        throw new NotImplementedException();
    }
    catch (Exception exception)
    {
        /*aPersonEntity would not take part in log process, 
          as it is not used in methodes signature, and with throw error
        */
        var paramLog = new ParamLogUtility(() => aPersonEntity, () => age, () => id, () => name).GetLog();
        var error = exception;
    }
}

 

2. All the parameters of the method sunbather variables must take part in log process. If not it would throw error.

This is important, because sometime we may forget to add method parameters to the log string. This error will remind as to use thus unused parameters.

private static void Add(string id, int age, string name)
{
    PersonEntity aPersonEntity = new PersonEntity();
    try
    {
        throw new NotImplementedException();
    }
    catch (Exception exception)
    {
        /*did n't pointed all the paramether of the method(id, age)*/
        var paramLog = new ParamLogUtility(() => name).GetLog();
        var error = exception;
    }
}

3. There can be some other errors too, which I haven’t faced yet, so if you find any let me know.

 

LINK: http://www.codeproject.com/Tips/795865/Log-all-parameters-that-were-passed-to-some-method

Z Extension Methods

Nhiều hàm mở rộng khá hay và tiết kiệm thời gian khi phát triển:

http://zextensionmethodswithobjectnamespace.codeplex.com/