ادامه در دامنه شخصی

12 12 2011

پس از این وقفه طولانی وبلاگ به دامنه شخصی انتقال دادم.

آدرس وبلاگ از این به بعد blog.salarcode.com هست.

آدرس فید وبلاگ تغییری نکرده و همچنان از طریق feeds2.feedburner.com/salarblogدر دسترس است.

در آینده در فرصت های مناسب که اگه زنده بودیم، کارها و کامپوننت های خودم که پراکند بود رو در وبسایتم قرار می دم.





Parallel سازی برای دات نت 2

8 10 2010

Parallel

همانطور که در دو پست قبلی مطالعه کردید در دات نت فریم ورک 4 قابلیت بسیار مفید parallel اضافه شده است. آن مجموعه کلاسها این امکان را فراهم می کنند که چندین کار در میان هسته های سیستم تقسیم شده و همزمان انجام شود. تنها عیب آن این است که فقط برای دات نت 4 در دسترس است.

برای حل این محدودیت می توان از روش های جایگزین استفاده کرد. گرچه این روشها باز هم به پای امکانات مهیا شده در دات نت 4 نمی رسد ولی باز هم بسیار راه گشا هستند. برای روش جایگزین می توان هم مستقیما از Thread ها استفاده کرد و هم از ThreadPool که کنترل thread ها را خودکار انجام می ده. البته این دو روش تفاوت فاحشی با هم دارند. تفاوت روش استفاده مستقیم از thread با threadpool عدم وابستگی به تعداد هسته cpu ها است، بدین معنا که در آن تقریبا همه آیتمها را به یکباره مورد پردازش قرار خواهند گرفت(البته به تعداد تعیین شده). اما threadpool همانند دات نت 4 عمل کرده و متدهای در حال اجرا و همزمان را به تعداد هسته cpu محدود می کند (با اندکی تفاوت). ابتدا متدی که مستقیما با thread ها کار می کند را معرفی می کنم و سپس روش threadpool را معرفی خواهم کرد.

با استفاده تابع زیر که تهیه کردم این امکان فراهم می آید که لیستی از آیتم ها را برای پردازش توسط یک متد یا رویه به طور همزمان پردازش نمایید. متد WorkAsParallel که در پایین ملاحظه می کنید دو ورودی می گیرد که ورودی اول لیستی جنریک از آیتم ها است و ورودی دوم متد پردازشگر مورد نظر که بر روی تک تک آیتم ها اجرا شده و عمل مورد تان را انجام می دهد.

public static void WorkAsParallel<T>(IList<T> itemsList, ParameterizedThreadStart itemDoWork)
{
// the maximum number of active threads
const int maxThreads = 10;
List<Thread> workers = new List<Thread>();

if (itemsList.Count > maxThreads)
{
    int currentItem = 0;
    for (int i = 0; i < maxThreads; i++)
    {
        T item = itemsList[i];
        try
        {
            Thread worker = new Thread(itemDoWork);
            worker.IsBackground = true;
            worker.Name = item.ToString();

            workers.Add(worker);

            // item index
            currentItem++;

            // start the thread
            worker.Start(item);
        }
        catch
        {
            // ignore any exception
        }
    }

    // A little break in current thread
    Thread.Sleep(5);

    do
    {
        // start waiting
        for (int i = workers.Count - 1; i >= 0; i--)
        {
            Thread worker = workers[i];

            if ((worker.ThreadState | ThreadState.Stopped) == ThreadState.Stopped)
            {
                workers.RemoveAt(i);

                // thread finished! run next irem if it is there
                if (currentItem <= itemsList.Count - 1)
                {
                    T item = itemsList[currentItem];
                    worker = new Thread(itemDoWork);
                    worker.IsBackground = true;
                    worker.Name = item.ToString();

                    workers.Add(worker);

                    // increase the item index
                    currentItem++;

                    // start the thread
                    worker.Start(item);
                }
            }
        }

        // a little break
        Thread.Sleep(5);

    } while (itemsList.Count > currentItem);

    // now all the list items are in progress

    // start waiting for them to be done
    foreach (Thread worker in workers)
    {
        // just wait for it
        // an infinity wait!
        worker.Join();
    }
}
else
{
    // all items are starting in threads
    foreach (T item in itemsList)
    {
        try
        {
            Thread worker = new Thread(itemDoWork);
            worker.IsBackground = true;
            worker.Name = item.ToString();

            workers.Add(worker);

            // start the thread
            worker.Start(item);
        }
        catch
        {
            // ignore any exception
        }
    }

    // A little break in current thread
    Thread.Sleep(5);

    // start waiting for them to be done
    foreach (Thread worker in workers)
    {
        // just wait for it
        // an infinity wait!
        worker.Join();
    }
}
}

به طور پیش فرض تعداد thread فعال 10 در نظر گرفته شده است (توسط ثابت maxThreads که قابل افزایش است) بدین معنا که در صورتی تعداد آیتمهای لیست شما بیش از 10 تا باشد ابتدا فقط 10 آیتم ابتدایی اجرا خواهند شد و تنها پس از پایان هر thread آیتم بعدی مورد پردازش قرار خواهد گرفت. این محدودیت به خاطر جلوگیری از وارد شدن فشار بیش از حد به سیستم در نظر گرفته شده و در صورت صلاحدید شما قابل افزایش است.

  • روش استفاده از WorkAsParallel

در مثال زیر یک لیست از DateTime با تاخیر زمانی 1 ثانیه چاپ می شود تا همزانی اجرا هم مشخص شود.

public void TestWorkAsParallel()
{
    List<DateTime> theList = new List<DateTime>();
    theList.Add(DateTime.Now.AddDays(1));
    theList.Add(DateTime.Now.AddDays(2));
    theList.Add(DateTime.Now.AddDays(3));

    ParallelWorks.WorkAsParallel(theList, x =>
    {
        DateTime item = (DateTime)x;
        Console.Write(item);
        Thread.Sleep(1000);
    });
}

و برای استفاده در VS 2005 که با کامپایلر CCS2 کار می کنه مثال مذبور رو به این تغییر بدید:

ParallelWorks.WorkAsParallel(theList, delegate(object x)
{
    DateTime item = (DateTime) x;
    Console.Write(item);
    Thread.Sleep(1000);
});
  • استفاده از ThreadPool

متد مورد نظر من در این پست از وبلاگ معرفی شده است. این متد لیستی از متد های قابل اجرا را دریافت کرده و به صورت همزمان اجرا می کند.

public class ParallelProcessor
{
    public delegate void Method();

    /// <summary>
    /// Executes a set of methods in parallel and returns the results
    /// from each in an array when all threads have completed.  The methods
    /// must take no parameters and have no return value.
    /// </summary>
    /// <param name="m"></param>
    /// <returns></returns>
    public static void ExecuteParallel(params Method[] methods)
    {
        // Initialize the reset events to keep track of completed threads
        ManualResetEvent[] resetEvents = new ManualResetEvent[methods.Length];

        // Launch each method in it's own thread
        for (int i = 0; i < methods.Length; i++)
        {
            resetEvents[i] = new ManualResetEvent(false);
            ThreadPool.QueueUserWorkItem(new WaitCallback((object index) =>
            {
                int methodIndex = (int)index;

                // Execute the method
                methods[methodIndex]();

                // Tell the calling thread that we're done
                resetEvents[methodIndex].Set();
            }), i);
        }

        // Wait for all threads to execute
        WaitHandle.WaitAll(resetEvents);
    }
}

روش استفاده آن هم همانطور که در آن پست ذکر شده آسان است.

ParallelProcessor.ExecuteParallel(() =>
{
    Console.WriteLine("The long task 1");
    Thread.Sleep(500);
}, () =>
{
    Console.WriteLine("The long task 2");
    Thread.Sleep(500);
},
() =>
{
    Console.WriteLine("The long task 3");
    Thread.Sleep(500);
});

و برای VS2005 از این روش فراخوانی استفاده کنید:

ParallelProcessor.Method[] methods = new ParallelProcessor.Method[3];
methods[0] = delegate{
    Console.WriteLine("The long task 1");
    Thread.Sleep(500);
};
methods[1] = delegate{
    Console.WriteLine("The long task 1");
    Thread.Sleep(500);
};
methods[2] = delegate{
    Console.WriteLine("The long task 1");
    Thread.Sleep(500);
};
ParallelProcessor.ExecuteParallel(methods);
  • مقایسه WorkAsParallel و ParallelProcessor در عمل

مسلما مقایسه این دو روش زیاد صحیح نخواهد بود. این به علت متفاوت بودن شیوه اجرای این دو روش است. به هرحال جهت نمایش این تفاوت مثال زیر را اجرا می کنیم:

static void Main(string[] args)
{
    Console.WriteLine("Parallels for .NET 2, salarblog.wordpress.com");

    // The list
    List<int> taskList = new List<int>() { 1, 2, 3, 4, 5, 6 };

    var pwatch = Stopwatch.StartNew();
    ParallelWorks.WorkAsParallel(taskList, x =>
    {
        Console.WriteLine("The long task {0} started at {1}", x, DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    });
    pwatch.Stop();
    Console.WriteLine("WorkAsParallel done!");

    var twatch = Stopwatch.StartNew();
    ParallelProcessor.ExecuteParallel(delegate
    {
        Console.WriteLine("Task 1 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 2 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 3 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 4 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 5 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    }, delegate
    {
        Console.WriteLine("Task 6 started at " + DateTime.Now.ToString("ss:fff"));
        Thread.Sleep(1000);
    });
    twatch.Stop();

    Console.WriteLine();
    Console.WriteLine("WorkAsParallel finished in {0} seconds", pwatch.Elapsed.TotalSeconds);
    Console.WriteLine("ParallelProcessor finished in {0} seconds", twatch.Elapsed.TotalSeconds);

    // wait
    Console.ReadKey();
}

نتیجه اجرا چیزی مانند این خواهد بود (این نتیجه سیستم دو هسته من هست):

WorkAsParallel v.s. ParallelProcessor

WorkAsParallel v.s. ParallelProcessor

به زمانها دقت کنید. تفاوت فاهش است، 3 ثانیه برای ParallelProcessor در مقابل 1 ثانیه برای WorkAsParallel. اما این دلیل بر بهتر بودن WorkAsParallel نیست. اگر به زمانهای شروع هر تسک نگاه کنید می بینید که تسک های متد WorkAsParallel همه تقریبا همزمان اجرا شده اند. (زمانها به صورت میلی ثانیه:ثانیه هستند). دلیل این امر را همانطور که گفتیم استفاده مستقیم از thread است.

 

در هر صورت این دو توابع در دسترس هستند و می توانید با توجه به نیاز خود هر کدام را که خواستید انتخاب کرده و مورد استفاده قرار دهید.





مرگ تدریجی

13 06 2009

دیشب خوابم نمی برد.
صبح با اولین خبر خشکم زد.
امیدم ناامیدیست

راه مصالحه با این قاعده بازی ها به پایان رسیده.

فقط مبارزه به هر نحو





Visual Paradigm ابزاری در دست تحلیل گران

8 04 2009
Visual Paradigm

زمانی که صحبت از تحلیل پروژه های نرم افزای به میان میاد اکثر افراد بی اختیار به یاد Rational Rose می افتند.
گرچه IBM Rational Rose یکی از قدرتمندترین ابزارهای مدلینگ و تحلیل پروژه ها است، ولی در این میدان تنها نیست.
یکی از رقیبان اصلی در این زمینه مجموعه ابزارهای Visual Paradigm هست. VP توسط یک شرکت چینی طراحی و توسعه داده شده که در مقابل امکاناتی که در اختیار قرار میدهد قیمت مناسبی دارد.
مجموعه Visual Paradigm Suit شامل چندین ابزار هست که به ترتیب عبارت هستند از:

Visual Paradigm for UML

VP-UML اصلی ترین نرم افزار این مجموعه است که برای مدل سازی مورد استفاده قرار می گیرد. در مبحث BPM با پشتیبانی از آخرین استاندارد مدلسازی گرافیکی پروسه های تجاری BPMN و پشتیبانی از دو نوع مدل سازی BPD و DFD که از دیگر قابلیت های مدلینگ این ابزار است.

در بحث مدسازی پایگاه داده، مدل سازی های ERD برای روابط فیزیکی پایگاه داده و ORM Diagram برای روابط کلاسها و entity ها پشتیبانی می شوند.

همچنین پشتیبانی از UML 2.1 و تولید کد ازنمودارهای class برای اکثر زبانهای برنامه نویسی از دیگر امکانات مهم این نرم افزار است.

علاوه بر این امکان واردکردن پروژه های Rational Rose نیز وجود دارد و می توانید خروجی کامل از پروژه را در قالب های مختلف تهیه کنید.

Visual Paradigm for UML

Visual Paradigm for UML

Smart Development Environment

با پشتیبانی از اکثر محیط های توسعه و برنامه نویسی این امکان را فراهم می کند که مدل سازی های خود را در داخل محیط توسعه محبوب خود انجام دهید.

از محیط های Visual Studio, Eclipse, JBuilder, NetBeans و غیره پشتیبانی میشود.

Agilian

مجموعه ابزارها برای مدل سازی متودولوژی های agile که در یکجا در دسترس هستند. علت جداشدن این بخش از VP-UML تمرکز بر روی ویژگی های agile است.

سایر ابزارهای این شرکت به صورت لیست وار:

*پ.ن   : به علت اینکه فقط لایسنس VP-UML رو داشتم ، بررسی سایر ابزارهای محیا نشد و به همین معرفی جزئی اکتفا می کنم.





برای رضای خدا Internet Explorer را رها کنید

4 02 2009
Don't hurt web with Internet Explorer

Bad IE

طبق آمارها تعداد کاربران Internet Explorer (به طور مخفف IE) از سایر مرور گر ها بیشتر است. زیاد بودن کاربران IE چند دلیل دارد. مهمترین دلیل تعداد کاربران ویندوز هست. از اونجایی که IE به صور پیش فرض بر روی ویندوز نصب است و مرورگر پیش فرض آن می باشد، بسیاری از افزاد اینترنت رو با نام Internet Explorer می شناسند و از وجود سایر مرورگرها بی اطلاع هستند.

متاسفانه تعداد کسیری از کاربران اینترنت از این دسته افراد هستند.

طبق آمار در ساعات اداری که کارمندان مشغول به کار هستند استفاده کنندگان از IE زیاد هست و پس از ساعات اداری هست که آمار استفاده از سایر مرورگرها به خصوص Firefox بالا می رود. این نشان دهنده این مورد هست که بیشتر کارمندان که دور از ذهن هم نیست که در این مقوله بی اطلاع باشند از IE استفاده می کنند.

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

تصور نکنید که بحث فوق برای گشور های غربی مطرح هست. بلکه عینا این مسله برای ایران نیز صادق است.

طبق تجربه شخصی خودم اکثریت بازدیدکنندگان سایتهای عمومی از IE استفاده می کنند که شاید به چیزی حدود 95 درصد برسد. در حالی که سایت خودم که در زمینه برنامه نویسی هست و یک سایت قبلیم در حدود 65 درصد از IE و 26 درصد از Firefox و بقیه از سایر مرورگرها استفاده می کنند.

این درصد ها گفته های قبلی مبنی بر کم آگاهی از سایر مرورها رو تصدیق می کند.

این مقدمه ای بود بر وضعیت IE در میان کاربران.

اما بیایید ببینیم چرا باید Internet Explorer رو ترک کنیم!

*- اولین مورد که شاید هم طنز آمیز بیاید نفرین های طراحان وب است. من به عنوان کسی که مدتی به عنوان طراح وب کار می کردم و هم اکنون طراحی سایت SoftProjects را خودم انجام دادم و همچنین دوستانی دارم که طراح وب هستند، خاطرات زیادی از عذاب و شکنجه هایمان از در دست و پنجه نرم کردم با IE داریم.از زمان عرضه نسخه 6 از IE در سال 2002 تا کنون که نسخه 8 از IE درحال آمدن است. استانداردهای وب تغییرات زیادی کرده اند و مرورگرها پیشرفتهای بسیار زیادی کرده اند.

این درحالی است که مرورگر IE بسیار بد و تنبل حرکت کرده است و دست طراحان وب را برای استفاده از تکنولوژی های روز بسته مانده است.

این وقاحت تا جایی است که حتی تیم ماکروسافت استانداردهای وب را جدا از مسیر حرکت IE دانسته و از پیاده سازی آن در کوتاه مدت سر باز می زنند! برای لینک به اخر مطلب مراجعه کنید.

*- استاندارد و به روز بودن. مدتی هست که جنگ مرورگرها در محافل وب مطرح است. این جنگ بر روی کسب کاربران بیشتر از طرق مختلف است. مهمترین محور جنگ پشتیبانی از آخرین تکولوژی های وب است که استانداردها در راس قرار می گیرند.استانداردهای وب با این هدف ایجاد شدند تا جلوی ناهماهنگی در رفتار مرورگرها را بگیرند. مرورگرها در جهت هر چه بیشتر استاندارد شدن در رقابت با هم هستند. در حالی IE مانند یک غده مغرور همیشه مشکل ساز بوده است.

مهمترین این استانداردها شامل:

Html 5, CSS 2.1, CSS 3, SVG, APng و چند مورد دیگر

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

عملکرد ماکروسافت در این زمینه ضعیف بوده و معمولا برای رفع مشکلات امنیتی یک ماه تاخیر دارد و در چندین مورد مشاهده شده است که همان مشکل به درستی رفع نشده است. حتی در صورت عرضه نسخه اصلاحی به علت مشکل بودن اعمال بسته اصلاحی و کم اطلاعی افراد، بسیاری از افراد در مقابل حملات آسیب پذیر باقی می مانند.

*- قابلیت سفارش سازی.افزونه های نوشته شده برای IE به ندرت یافت می شوند. همچنین امکانات بسیار کمی برای سفارشی سازی مرورگر وجود دارد.

در مقابل سایر مرورگرها به خصوص Firefox با داشتن چند هزار افزونه که در نوع خود کم نظیر است می توانید امکانات فوق العاده ای به مرورگر خود اضافه کنید و یا تغییر پوسته آن را سفارشی کنید.

*- سرعت اجرای سایتهای Web 2این سایتها به علت استفاده زیاد از javascript در IE باعث کند شدن مرورگر می شوند. این درحالی هست سایر مرورگرها در زمان اجرای javascript شدیدا با یکدیگر مبارزه می کنند.

Don't hurt web with Internet Explorer

Don't hurt web with Internet Explorer

مراجع برای تحقیق مطالب فوق

به عنوان خلاصه مطلب لینک ها و مطالبی رو برای رجوع سریع مطرح می کنم.

مقایسه سرعت اجرای javascript که مثل همیشه IE آخر هستند

تست Acid 3 که میزان پشتیبانی از استانداردهای وب را نشان می دهید (به در صد IE8 توجه کنید!)

تکنولوژیها و جلوه های وب که کابران IE از آن محروم هستند:

طراحی سه بعدی مستقیما در خود مرورگر با استفاده از تگ Canvas

ویژگیهای جدید CSS 3 بخش 1

ویژگیهای جدید CSS 3 بخش 2

Don't hurt web with Internet Explorer

جلوه های ویژه و سایه برای متون

انتخابگر ها ( یا CSS Selector) که در نحوه شکل دهی ظاهر صفحات بسیار مهم هستند.
مرورگر خود را در مقابل CSS Selector ها بررسی کنید

حیله هایی که طراحان وب برای هماهنگی با IE استفاده می کنند:

حقه ای برای قعال کردن تگهای article,section و … از Html 5 در IE

چند حقه برای شناسایی مرورگر IE

مشکل با تگ img

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

Chris Wilson [MS] (Expert):

Q: What do you guys think of the Acid-tests, especially Acid3? Is it your goal to let IE 8 pass Acid3?

A: Alex, The ACID3 test is a collection of interesting tests, spread across a large set of standards. Some of those standards will see improvements in IE8 – in fact, IE8 already improves on IE7’s score – but we are focused on the most important features and standards to make web developers› lives easier. The ACID3 test does not map directly to that goal.

پیشرفتهایی که در IE8 صورت می گیرد که به نظرم کمتر از حد انتظار هستند

و مراجعی برای تعداد کابران مرورگرها و غیره

تعداد کاربران سایتهای مشهور

تعداد کاربران سایت w3schools.com

بررسی کلی از ویژگیهای مرورگرهای مختلف

جنگ مرورگرها

مقایسه مرورگرها

Firefox از Chrome جلو می زند

ناتوانی مایکروسافت در رفع نقص امنیتی اینترنت اکسپلورر برای مدت 453 روز

با این اوصاف برای رضای خدا هم که شده در آشنا کردن افراد با سایر مرورگرها کوشا باشید

مشترک این وبلاگ شوید و آن را از طریق RSS دنبال کنید.





سال 2009 میلادی مبارک

31 12 2008

سال میلادی رو به همه تبریک میگم.
بی صبرانه منتظر رویدادهای دنیای فناوری در سال جدید میلادی هستم.

این درخت هم تقدیم به مسیحی های عزیز:

Xmas Tree