Showing posts with label C#. Show all posts
Showing posts with label C#. Show all posts

Domain Name Suggestion


حتما شما هم نام های دامنه ای مانند studiostyl.es یا delicio.us را دیده اید که نام گذاری آنها به گونه ای است که بخشی از نام سایت بوسیله Top-Level Domain بیان شده است. مثل در مورد اولی نام سایت Studio Styles است که es به جای آنکه مثلا نام گذاری مانند StudioStyles.X استفاده کند از TLD یی (es که مربوط به کشور اسپانیا است ) استفاده کرده است یا در مورد دوم که us آخر کلمه Delicious را توسط TLD مربوط به ایالات متحده (us) بیان کرده و به این ترتیب نام دامنه را Delicio قرار داده است.
ممکن است وقتی می خواهید برای سایت خود یک نام دامنه انتخاب کنید به این روش هم فکر کنید ( اینکه اسم به گونه ای باشد که TLD بخش آخر آن را بسازد )
امروز یک برنامه ساده نوشتم برای این کار.

دو فایل کنار این برنامه است. یکی حاوی لیست TLD های اینترنت است. دومی شامل حدود 80 هزار کلمه انگلیسی. با زدن دکمه Start این برنامه با لود کردن اطلاعات این دو فایل و پردازش آنها، آماده پاسخ گویی به پرسش های کاربر می شود. پس از پایان این مرحله، کاربر می تواند با وارد کردن کلمه ای که می خواهد نام دامنه اش قرار بگیرد پیشنهادی هایی برای این کار دریافت کند. مثلا اگر می خواهید نام وب سایت شما Headphone باشد می توانید با انتخاب نام دامنه headpho و استفاده از TLD ی ne ( کشور نیجریه ) به نام دامنه headpho.ne برسید.


البته برای کلماتی که در دیشکنری 80 هزار کلمه ای برنامه نیست نیز پیشنهادای داده می شود. برای مثال اگر می خواهید نام دامنه شما Livan (لیوان) باشد می توانید از TLD ی an و نام دامنه liv استفاده کنید.


سورس کد به زبان C# را می توانید از اینجا دانلود کنید.

Data Visualization: The most used words in naming Iranian movies

تصویر زیر دویست کلمه ای است که در نام گذاری فیلم های سینمایی 42 سال اخیر ( 2537 فیلم ) بیشتر مورد استفاده قرار گرفته اند. این تصویر که حاصل چند ساعت بی کاری (!) امروز من است را میتوان نمونه ای از Data Visualization دانست.  
سایز کلمات متناسب با تعداد دفعاتی است که از آنها در نام گذاری فیلمها استفاده شده است. مثلا کلمه شب بیش از سایر کلمات در نام گذاریها استفاده شده است!

در این نوشته قصد دارم مراحلی که برای بدست آوردن این تصویر طی کرده ام را مختصرا شرح دهم.

0- هدف
قبل از هر کاری باید بدانیم چی می خواهیم. چی چیزی را می خواهیم نمایش دهیم. چطور می خواهیم نمایش دهیم. برای چه کسی می خواهیم نمایش دهیم. هر ابهامی در تعیین هدف بعدا گریبانمان را خواهد گرفت ( همانطور که در این نمونه اتفاق افتاد )
هدف ما پاسخ به این سوال است که : " در نام گذاری فیلم های ایرانی معمولا از چه کلماتی استفاده می شود؟ "
می خواهیم اطلاعات لازم را استخراج کنیم، آنها را پردازش کنیم و به کمک روشی مناسب آنها را به نمایش بگذاریم.

1- استخراج اطلاعات
بعد از کمی جست و جو توانستم منبع اطلاعاتی مناسب را پیدا کنم: بانک اطلاعاتی سوره سینما
در این سایت می توانیم اسامی تمام فیلم های سینمایی ایرانی ساخته شده بین سالهای 1350 تا 1391 را پیدا کنید. البته برای این کار باید کمی هم زحمت بکشید. لیست فیلمهای هر سال در صفحه ای با آدرسی شبیه نمونه زیر است:
http://www.sourehcinema.com/Years/In_This_Year.aspx?Year=1388
که با قرار دادن اعداد بین 50 تا 91 به جای رقم های قرمز شده در آدرس بالا می توانید فیلم های بین سالهای 50 تا 91 را ببینید. مثلا نمونه بالا صفحه ای است که حاوی لیست تمام فیلم های سینمایی ساخته شده در سال 88 است.
یک برنامه ساده با زبان سی شارپ نوشتم که این صفحات را تک تک دانلود می کرد. ویژگی جالب این صفحات این بود که همگی  ساختار مشترکی داشتند. در تمام صفحات لیست فیلم های در تگی با شناسه Hp قرار داشت. به این ترتیب با کمترین زحمت توانستم تمام اطلاعات داخل این تگها را استخراج کنم و با کمی تمیز کاری، لیست فیلمها را بدست بیاوم. تمام اسامی را همراه سال ساخت آنها در فایلی به فرمت CSV ذخیره کردم.

2- اصلاح اطلاعات
اطلاعات استخراج شده در مرحله قبل، برای هدف ما خام بودند. باید کمی پردازش روی آنها انجام می شد. با پردازش متنی ابتدای، کلمات هر اسم را جدا کردم و سپس تکرار هر کدام را شمردم و نتیجه را در یک فایل اکسل ذخیره کردم. مهمترین مشکلی که در این مرحله باید حل می شد عبارت بود از:
  • کلمات زاید
  • پسوندها
کلماتی مانند "از"، "در" یا "و" را می توان جزو کلمات زاید برای هدف ما دانست. حتی فعل هایی مانند "است" یا "بود" هم به درد ما نمی خورد. اما برای حذف این کلمات باید اول متناسب با هدفم، تعریفی از کلمات زاید می ساختم.
پسوندهایی مانند "ها"، "ات" و "ش" هم نباید باعث تمایز بین کلمات می شد. مثلا باید "مرد" و "مرد" و "مردها" را یکی در نظر می گرفتیم ( یا نه! ). این هم نیاز مند این بود که از پسوندها تعریف درستی ارائه دهیم. البته مشکل تنها با حذف این پسوندها حل نمی شد. مثل اگر تمام پسوندهای "ات" را حذف می کردیم، کلمه ای مثل "دونات" هم به " دون" تبدیل می شد! پس باید تشخیص می دادیم پسوند هر کلمه از چه نوعی است. برای این کار باید از یک بانک اطلاعاتی واژگان استفاده میشد.
پس مهمترین چیزی که در این مرحله فهمیدم، این بود که باید اول بدانم دقیقا می خواهم نتیجه چه چیزی را نشان بدهد. آیا برای من مهم است نشان بدهم کلمه "مردان" بیشتر از "مرد" استفاده شده است یا اینکه فقط می خواهم نشان بدهم کلمه "مرد" و مشتقاتش چقدر استفاده شده است. آیا برای من مهم است که در نتیجه نشان بدهم فعل "رفت" چقدر استفاده شده است یا قرار است مانند افعالی چون "است" یا "بود" آن را حذف کنم؟ اصلا لزومی دارد همین افعال "است" و "بود" را هم در نتیجه نشان بدهم یا نه؟
پس باید برمیگشتم و هدف را دقیقتر تعریف می کردم.
علاوه بر این مشکل رایج زبان فارسی را هم باید حل می کردم. وجود چند نوع "ی" یا "ک". 
در نهایت کلمات و تکرار هر یک را محاسبه کردم و در یک فایل اکسل دخیره کردم.

3- انتخاب قالب مناسب نمایش
برای نمایش ابزار متنوعی وجود دارد. ابزار کلاسیکی مانند نمودارهای Bar، Pie یا Bubble، ... . از طرفی دیگر راهکارهای جالب و یک بارمصرفی(!) هم توسط افراد مختلف استفاده شده است که می شد از آنها الهام گرفت. در نهایت سومین راه این بود که خودم یک روش مناسب و جدید برای ارائه اطلاعات پیدا کنم.
با توجه به جنس اطلاعاتی که باید نمایش داده می شد، تعداد ویژگی ها، تناسب متغیرهای اندازه گیری شده با نمایش گرافیکی آن و ... از میان این راهها موجود، تصمیم گرفتم از یک روش مناسب و آشنا استفاده کنم: Wordle (مدتی پیش در مورد Wordle و ابزارهای مشابه آن و همچنین الگوریتمهای آنها بررسی های انجام دادم که بعدا در مورد آن صحبت می کنیم). Wordle از جمله روشهای بصری سازی خانوده Tag Cloud محسوب می شود. ابزار ارائه شده برای ساخت Wordle بسیار قوی و انعطاف پذیر و جالب توجه است.

4- بصری سازی
در آخرین قدم باید اطلاعات پردازش شده را به شکال گرافیکی مورد نظر تبدیل می کردم. برای این کار از Wordle استفاده کردم. این ابزار آنلاین از روش های مختلفی ورودی خود را تامین می کند. من از روش دادن متن به صورت مستقیم استفاده کردم. این ابزار سایز هر کلمه را بر اساس تعداد دفعات تکرار آن تعیین می کند. برای همین فایلی متنی ساختم که هر کلمه را به تعداد دفعات تکرار آن ( که در مرحله دوم محاسبه کردم ) در آن می نوشتم. سپس این فایل را به Wordle دادم تا نمودار را برای من تولید کند. با کمی دستکاری تنظیمات این ابزار توانستم خروجی دلخواه را بدست بیاروم.

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

  • دانلود فایل های HTML و مشکلی که ممکن است در زمان استخراج متن فارسی از آنها با آن بر خورد کنید.
  • Wordle و الگوریتم آن
  • پردازش متن فارسی برای محاسبه تکرار
  • روشی ساده برای کار کردن با فایلهای Excel در محیط دات نت
  • و از همه مهمتر اطلاعات جالب دیگری که از پردازش این اطلاعات به دست آوردم. مثلا بیشتر فیلم های سینمایی ایرانی 9 حرف دارند یا اینکه طولانی ترین اسم رسمی برای یک فیلم 50 حرف دارد!

Clipboard Watching & Apartment State

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

public partial class Form1 : Form
{
     public Form1()
    {
        Thread t =  new Thread(new ThreadStart(clipboardWatcher));         t.Start();
    }
    public void clipboardWatcher()
    {
        while (true)
            string text = Clipboard.GetText();
    }
}

علت این مشکل این است که طبق آنچه در اینجا گفته شده است، کلاس Clipboard باید در یک ترد از نوع STA مورد استفاده قرار بگیرد. چراکه کلاس کلیپ برد از COM استفاده می کند و این محدودیت نیز از همینجا نشعت میگیرد.
اما در اینجا هم گفته شده که تردهای ساخته شده به طور پیش فرض از نوع MTA هستند.  مگر صریحا نوع آن تعیین شود. 
اگر تا به حال متوجه این مشکل نشده اید به این دلیل است که نقطه ورود برنامه های دات نتی به طور پیش فرض بوسیله STAThreadAttribute  به نوع STA تبدیل می شود. اما برای ترد جدید که می سازید باید این کار صریحا صورت گیرد.
پس پیش ار فراخوانی متد Start ترد، نوع آن را اینگونه تنطمیم می کنیم:
t.SetApartmentState(ApartmentState.STA);
اما نکته جالب آخر اینکه هرچند در مستندات مایکروسافت  در مورد متدهای کلاس Clipboard در مورد استثنای  ThreadStateException صحبت شده و گفته شده در صورت STA نبودن تردی که فراخوانی در آن انجام می شود،این استثنا روی می دهد ولی این استثنا برای من هیچ گاه روی نداد!

Spherical Tag Cloud

مقدمه
 Spherical Tag Cloud یکی از شیوه های نمایش برچسب هاست. ابر برچسب ( Tag Cloud ) این روزها اهمیت زیادی پیدا کرده اند. دلیل این امر توانایی آنها در نمایش چند پارامتر به صورت همزمان در قالبی آشنا برای کاربران است. بررسی تفصیلی  Tag Cloud نیازمند نوشته ای جداگانه است.
آنچه در این نوشته قصد داریم بررسی کنیم نحوه ساخت Spherical Tag Cloud است. این نوع نمایش Tag Cloud عبارت است از نمایش برچسب ها به صورتی که گویی بر سطح یک کره نامرئی قرار دارند. اما پا را فراتر نهاده و امکان حرکت این برچسب ها را با سرعت های متفاوت ممکن می سازیم.

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

کمی هندسه
مختصات کروی، یکی از انواع دستگاه های مختصات است. چیزی شبیه محتصات دکارتی که در آن و در فضای سه بعدی از سه مقدار x و y و z برای مشخص کردن یک نقطه استفاده می کنیم. در مختصات کروی هر نقطه با سه پرامتر phi، theta و radius مشخص میشود:
تبدیل مختصات کروی به دکارتی نیر بسیار ساده است:




برای این برنامه، مختصات تگ به صورت مختصات کروی ذخیره می شود. به این ترتیب محاسبه محل بعدی تگ بسیار ساده و در حد افزودن مقداری به فیلد نگهدارنده ی Phi و Theta است. مقدار radius را هیچ گاه تغییر نمیدهیم تا تگ ها همیشه روی یک کره ثابت حرکت کنند. اما برای رسم تگ روی فرم، مختصات کروی هر تگ را به مختصات دکارتی تبدیل کرده و روی فرم رسمش می کنیم. 


کمی کدنویسی

کلاس Tag
این کلاس برای دخیره کردن خواص تگ شامل اسم، مختصات کروی و سرعت تغییر مختصات کروی است. همچنین با کمک سه Property عمل تبدیل مختصات کروی به مختصات دکارتی انجام میشود. مختصات دکارتی برای رسم تگها رو فرم به کار می روند.

مقداری اولیه لیست Tag ها
یک حلقه for که به تعداد تگ ها تکرار میشود و هر بار یک نمونه از کلاس Tag را ساخته و مقدار دهی می کند. Radius شعاع کره است که تگ روی آن حرکت میکند. بهتر است برای همه تگها radius برابر باشد. Phi و Teta ( هرچند در واقع Theta است ) مکان تگ را روی کره نشان می دهد. دو فیلد دیگرهم سرعت تغییرات Phi و Teta را نگه میدارند. یعنی در هر فریم چقدر این مقادیر و به تبعیت از آنها، مکان تگ عوض می شود. هر نمونه مقداردهی شده به یک لیست اضافه می شوند.

جا به جا کردن Tag ها
در هر Clock یا فریم، باید مقادیر جدیر مکانی حساب شوند. این کار را متد Clock و با افزودن مقدار سرعت بر کلاک به مختصات کروی هر تگ انجام می دهد. اگر مقدار این تغییر را برای phi غیر فعال کنیم ( در کد کامنت شده است )، تگ ها فقط به صورت افقی دور کره می چرخند. میتوانید این کار را با Teta هم انجام دهید و نتیجه را ببینید.
نکته جالب این است که با کمک مختصات کروی جابه جایی تگها بر سطح کره بسیار ساده شده است و تنها با تغییر مقادیر Phi و Teta، تگ روی سطح کره حرکت می کند. در حالی که اگر از مختصات دکارتی استفاده میکردیم، کار پیچیده تری در انتظار ما بود.
در نهایت لیست تگ ها بر اساس مقدار Z آنها مرتب می شوند (هر چند بهتر بود این کار در بخش نمایش Tag ها انجام می دادیم).
به این ترتیب رسم تگ ها را از کمترین Z (عقب ترین تگ به ببیننده ) شروع میکنیم و به جلوترین تگ می رسیم. به این ترتیب همیشه تگهای جلوتر روی تگهای عقبتر از خود را می پوشانند.

نمایش Tag ها
نمایش تگ ها در ساده ترین حالت فقط شامل یک حلقه برای رسم تک تک تگها به کمک e.Graphics.DrawString است. اما ما کمی جلوه های ویژه نیز به آن افزوده ایم. اول اینکه  تگهای جلوتر با فونت بزرگتری نمایش داده می شوند و دوما تگهای جلوتر پررنگ تر خواهند بود.
برای محاسبه اندازه فونت و رنگ هر تگ باید کمی محاسبه انجام دهیم.
اندازه فونت با توجه به مقدار Z هرتگ محاسبه می شود. Z مقداری بین منفی Radius تا مثبت Radius را کسب میکند و چون فونت نمیتواند سایز منفی داشته باشد، مقدار Z را به انداز Radius انتقال می دهیم تا همواره با مقداری بین صفر تا 2xRadius را کار کنیم و باز هم جون اندازه فونت نمی خواهیم خیلی کوچک باشد مقداری چون 5 را به آن می افزاییم تا کوچکترین فونت حداقل اندازه 5 داشته باشد.
فرض کنیم شعاعی که برای کره در نظر گرفتیم 400 باشد. پس احتمالا نزدیک ترین تگ فونتی با اندازه 805 خواهد بود. و این خیلی بزرگ خواهد بود. پس ضریبی چون 0.1 را در آن ضرب میکنیم تا اندازه معقولی بدست آید. البته انتخاب این ضریب مهم است و میتواند در تبدیل شکل نمایشی از کره به بیضی هم استفاده شود.
برای محاسبه رنگ، با توجه به مقدار Z، یک رنگ بین سفید تا سیاه را انتخاب می کنیم. این مقدار این طور حساب می شود.
ابتدا مقدار Z به بازه بین 0 تا یک انتقال داده می شود.
‏tag.Z + max) / (2 * max)
 سپس این مقدار ضریبی از 255 را تولید میکند:
(((tag.Z + max) / (2 * max)) * 255
و نهایتا از 255 کم می شود تا Z کمتر به سفید نزیکتر و Z بیشتر به سیاه نزدیک تر باشد:
 int scale = 255 - (int)(((tag.Z + max) / (2 * max)) * 255);

نمایش پیوسته
یک تایمر هر 20 میکروثانیه صدا زده میشود و فرم را دوباره رسم میکند. برای نمایش بهتر نیز مقدار DoubleBuffered  را true کرده ایم.

ایده های بیشتر
می توانید این سورس کد را تغییر دهیم و امکانت بیشتری به آن بیافزایید. مثلا:
1- مدیریت برخوردها
میتوانید برای مدیریت برخورد تگها با هم رفتارهایی را پیاده سازی کنید. مثلا پس از برخورد، جهت حرکت تگ ها تغییر کند. شاید هم مایل بودید و از رفتارتان را بر ساس قوانین فیزیکی طراحی کردید.

2- حساسیت به موس
چیزی که خیلی رایج است و با قرار گرفتن موس روی بخشی از کره، تگها جهت حرکتشان را به سمت کرسر موس تغییر میدهند.

3- تبدیل کد برای استفاده در وب
کار ساده ای است که به جاری رسم روی فرم، روی صفحه وب و با استفاده از مختصات مطلق در CSS مکان تگ ها را تعیین کنید. البته در CSS میتوانید از ویژگی جالب مقدار z هم استفاده کنید و مقدار کد را کمی کاهش بدهید. اگر عاقلانه فکر کنید، بهتر است این کد را کدی سمت کلاینت تبدیل کنید تا کدی سمت سرور !

4- برای آنکه نتیجه شبیه نمونه های رایج شود، از مقادیر یکسانی برای PhiVelocity و ،TetaVelocity استفاده کنید.

5- امکان کلیک کردن روی تگ را فراهم کنید.

6- توزیع مکانی تگ ها را مدیریت کنید. بهتر است تگ های کمتری در قطب های کره تجمع کنند. در واقع در حالت ایده آل تنها یک تگ باید در آنجا باشد !
منابع

دسترسی به اعضای خصوصی کلاس

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

یعنی مثلا اگر در کلاس A یک نمونه به اسم a از خودش رو بسازید میتونید از طریق a به اعضای خصوصی آن هم دسترسی داشته باشید. این ویژگی در C++ هم وجود داره. برای مثالی :

[C#]
    class MyClass
    {
        private void method1()
        {
            MyClass mc = new MyClass();
            mc.method1();
        }
    }
---------------------------------------------------------------
[C++]

class MyClass
{
private:
int a;

void Test()
{
MyClass m();
m.Test();
m.a = 5;
}
};



که با موفقیت کامپایل میشه.
در عین حال که عجیب به نظر میرسه و طبیعی هم هست !

فیوژن چارت



فیوژن چارت چیست؟
گاهی لازم است در برنامه خود برای نمایش اطلاعات از چارت ها استفاده کنید. در این گونه موارد گزینه های گوناگونی پیش روی شماست. اما یکی از ابزار خوب و ساده برای این کار FusionCharts است. چارت هایی که توسط فیوژن چارت می توان تولید کرد به دو نوع فلشی و جاوا اسکریپتی تقسیم می شود. ظاهر چارت ها زیبا و متحرک است و در زمان بسیار کوتاهی می توانید آنها را تولید کنید.

برای کسب اطلاعات بیشتر در مورد آن می توانید به این آدرس مراجعه کنید:
http://www.fusioncharts.com/free/Overview.asp

این هم نمونه ای از چارت ها:
http://www.fusioncharts.com/free/demos/Blueprint/

شروع کار بار فیوژن چارت
در اینجا می خواهیم با مثال ساده ای کار با فیوژن چارت را بررسی کنیم.

0- ابتدا باید فیوژن چارت را تهیه کنید. می توانید نسخه کاملی از آن را از این آدرس دانلود کنید:

یا سورس کدهای نمونه را از این جا بگیرید ( پایین صفحه ):


1- حالا یک پروژه از نوع web application بسازید.
یک فولدر به پروژه خود اضافه کنید و نام آن را FusionCharts قرار دهید و محتویات فولدری با همین نام را در سورس کدهای نمونه ای که دانلود کردید، بیافزایید.

2- به فایل aspx خود و در داخل تگ head، این کد را اضافه کنید تا بتوانید از توابع جاوا اسکریپت لازم استفاده کنید:

<script language="javascript" src="FusionCharts/FusionCharts.js" type="text/javascript">
</script>

3- برای اضافی کاری نکردن از کدهای ارائه شده همراه کدهای نمونه برای انجام برخی کارها استفاده میکنیم. پس فایل FusionChart.cs را به پروژه خود اضافه کنید. این فایل در فولدری به نام source در سورس کد های نمنه ایست که دانلود کردید.
4- حالا یک کنترل Literal به صفحه اضافه کنید. مقدار ویژگی Text کدهای html یی است که برای نمایش چارت لازم است. تنها کاری که باید انجام دهید این است که اطلاعات خود را به متدی به نام RenderChartHTML ارائه دهید و خروجی این متد را در ویژگی text کنترل literal یی که ساختید قرار دهید. این متد در داخل کلاسی به نام FusionChart و در فایلی است که به پروژه در مرحله 3 افزودید.
شما می توانید یک url به این تابع ارائه دهید تا اطلاعات را از آن تهیه کند یا اطلاعات را به صورت یک رشته به آن ارسال کنید. در هر صورت فرمت اطلاعات یکسان و به صورت xml خواهید بود.
مثلا چیزی شبیه این:
<chart caption='z' showValues='0' formatNumberScale='0' showBorder='1'>
<set label='1360' value='50' />
<set label='1370' value='60' />
<set label='1380' value='65' />
<set label='1390' value='75' />
</chart>
پس از تهیه اطلاعات آن را به صورت زیر به متد مذکور ارسال می کنیم: 
RenderChartHTML("FusionCharts/Column3D.swf","",xmlData),"chart1","500","300",false);
پارامتر اول نام فایلی است که به عنوان موتور رسم چارت در نظر دارید. به عبارتی ساده تر، نوع چارتی را تعیین می کنید که مایلید اطلاعات در آن نوع نمایش داده شود. ما نمودار میله ای - سه بعدی را انتخاب کرده ایم.
انتخاب های گوناگونی برای نوع چارت در اختیار شماست. با مشاهده فایل های swf که در فولدر FusionChart قرار دارد می بینید که انواع مختلفی چارت وجود دارد. که البته برای به دست آوردن ساختار اطلاعاتی که برای هر یک ارسال می کنید ( و ممکن است با بقیه متفاوت باشند ) باید به مستندات موجود مراجعه کنید.
پارمتر دوم آدرس URL اطلاعات است. ما در اینجا از URL استفاده نمی کنیم و اطلاعات را به صورت یک متغیر رشته ای به نام xmlData به متد می فرستیم. پس این پارامتر را خالی رها کرده و پارامتر سوم را متغیر رشته ای مذکور قرار می دهیم.
پارامتر چهارم شناسه چارت است که در تگ های HTML مورد استفاده قرار می گیرد. سعی کنید این شناسه در فایل html یکتا باشد. پارامتر های بعدی عرض و طول چارت و فعال/غیر فعال بودن حالت اشکال زدایی است.
 مقدار متغیر xmlData را می توانید چیزی شبیه این قرار دهید:





<chart caption='z' showValues='0' formatNumberScale='0' showBorder='1'>
<set label='1360' value='50' />
<set label='1370' value='60' />
<set label='1380' value='65' />
<set label='1390' value='75' />
</chart>
5- حال اگر پروژه خود را اجرا کنید می توانید خروجی را ببینید.

راه حل ابتدایی مشکل فارسی در فیوژن چارت

هر چند فیوژن چارت با نمایش زبان فارسی مشکلی ندارد اما وقتی از چند کلمه استفاده کنید، کلمات به صورت بر عکس در چارت نمایش داده می شوند. مثلا وقتی برچسب یه میله در نمودار " درصد پیشرفت پروژه " باشد، چیزی که نمایش داده می شود " پروژ پیشرفت درصد " خواهد بود. راه حل ساده و ابتدایی که برای این مشکل می توان ارائه داد، تعریف یک متد توسعه برای کلاس string می باشد تا به کمک آن کلمات یه رشته را معکوس نماییم. به این ترتیب با فراخوانی این متد پیش از ارائه برچسب ها به فیوژن چارت، آنها به صورت صحیح نمایش داده خواهند شد.
این متد را اینگونه پیاده می کنیم:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string s = "This is a test".ReverseWords();
        }
    }

    static class Utility
    {
        public static string ReverseWords(this string str)
        {
            string reversed = "";
            string[] words = str.Split(' ');

            foreach (string word in words)
                reversed = word + " " + reversed;

            return reversed.TrimEnd(' ');
        }
    }
}


ابتدا رشته را با کمک فواصل خالی به کلمات می شکنیم.کلمات را به صورت عکس کنار هم می چینیم و در نهایت فاصله خالی انتهایی را حذف می کنیم.

کنترلی برای ورود متن بی نیاز از برچسب




می خواهیم Textbox ی بسازیم که وقتی خالی است متنی را درون خود نشان میدهد و وقتی در آن اطلاعاتی وارد شود دیگر آن متن نمایش داده نشود. چیزی مثل textbox ی که برای جست و جو در سایت http://www.tebyan.net/ و در بالای صفحه وجود دارد. به این ترتیب توضیحاتی که معمولا به کمک Label در کنار textbox ها قرار میدهیم را به عنوان پیامی در داخل آنها جای میدهیم. در نتیجه نه تنها رابط گرافیکی کاربر ساده تر می شود، بلکه جلوه بهتری نیز دارد.

برای ساخت این کنترل به یک State Machine خیلی ساده نیاز داریم تا بین چهار وضعیت زیر سوئیچ کند:


0- آغاز
کنترل به عنوان  خالی علامت گذاری میشود و پیام دلخواه درون آن نمایش داده میشود

1- هنگام از دست دادن فوکس ( lostFocus )
باید بررسی شود که اگر کنترل خالی است پیام دلخواه نمایش داده شود.

2- هنگام بدست آوردن فوکس ( getFocus )
اگر کنترل خالی است، پس هم اکنون پیام دلخواه در حال نمایش است. پس باید این کنترل خالی شود
اگر کنترل خالی نیست، لازم نیست کاری انجام شود.

3- هنگام تغییر اطلاعات داخل کنترل توسط کاربر

گر کنترل خالی شد، به عنوان خالی علامت گذاری شود
اگر کنترل خالی نیست، به عنوان غیر خالی علامت گذاری شود.

نکته: چون وقتی در حال نوشتن پیام خالی بودن کنترل هستید، رویداد تغییر اطلاعات (3) صدا زده می شود از مکانیزمی برای ایجاد استثنا در این حالت استفاده میکنیم تا این متن به عنوان متنی که باعث تغییر وضعیت کنترل از خالی به پر می شود، شناخته نشود ( به کمک متغیر writtingEmptyMessage که نشان میدهد در حال نوشتن پیام خالی بودن هستیم ).

یک UserControl بسازید و یک textbox به آن اضافه کنید. حالا سه رویداد زیر را برای کنترل مدیریت میکنیم:
TextChanged
Leave
Enter
این هم کد کلاس UserControl:


public partial class UCSmartTextBox : UserControl
    {
        private bool isEmpty;
        private bool writtingEmptyMessage;
        private string emptymessage;

        public UCSmartTextBox()
        {
            InitializeComponent();

            emptymessage = "Textbox is empty ...";

            isEmpty = true;
            writtingEmptyMessage = true;
            textBox1.Text = emptymessage;
            writtingEmptyMessage = false;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text == "" || writtingEmptyMessage==true)
                isEmpty = true;
            else
                isEmpty = false;
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            if (isEmpty == true)
                textBox1.Text = "";
        }

        private void textBox1_Leave(object sender, EventArgs e)
        {
            if (isEmpty == true)
            {
                writtingEmptyMessage = true;
                textBox1.Text = emptymessage;
                writtingEmptyMessage = false;
            }
        }
    }


دانلود نمونه سورس کد:

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

شاید برای شما هم سوال باشد که نوع string و stringBuilder  با هم چه تفاوت هایی دارند و هر کدام از آنها برای چه کاری مفید هستند.

تقریبا هر دوی اینها برای کار با رشته ها استفاده می شوند. ولی stringBuilder بر روی ساخت رشته های تاکید در حالی که string عمومی تر به حساب می آید و عملیات های بیشتری را میتواند رو رشته ها انجام دهد.
نکته مهم این است که string به اندازه رشته ای که هم اکنون ذخیره کرده است ، فضا در اختیار می گیرد و برای عملیات هایی که مستلزم ساخته شدن رشته ای جدید ( حاصل AppendFormat یا Concat ) است بدون هیچ تصمیم گیری ، همیشه نمونه ای از نوع string برای ذخیره سازی نتیجه ی آن میسازد. در حالی که stringbuilder یا استفاده از مکانیزم اختصاص فضای با اندازه ای از پیش تعریف شده ( که کمتر از MaxCapecity و بیشتر یا مساوی Length است ) تنها در صورتی به افزایش فضای در دسترس اقدام می کند که به آن نیاز داشته باشد. هر چند این مقدار در زمان اجرا قبل تغییر است و همچنین در صورت نیاز افزایش می یابد، ولی همین امر باعث می شود عملکرد این کلاس در برخی موارد خیلی بهینه تر از string باشد.
اما چه موقع باید از string و چه موقع از stringbuilder استفاده کرد؟ جواب این سوال را میتوان با توجه به نحوه پیاده سازی این دو کلاس و تجربه کار کردن با آنها به دست آورد. اما مطالعه دو مقاله زیر می تواند خیلی مفید باشد:



همچنین اسناد مایکروسافت و بخصوص بخش با عنوان Performance Considerations در آدرس زیر:

 http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx