Archive for 2012

بهبود فونت فارسی پیش فرض ویندوز 8

۱۳۹۱/۰۶/۱۳ ۲۰:۵۲ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۱/۰۶/۱۳ دسته بندی : 11

فونت پیش فرض ویندوز 8 با نام Segoe UI در این نسخه از ویندوز دستخوض تغییراتی شده است. این تغییرات برای زبان انگلیسی بیشتر باعث بهبود خوانایی آن شده اند. اما تغییری که کاراکترهای عربی و فارسی آن کرده اند قابل ملاحظه است، بگونه ای که حتی می شد نام جدید برای این فونت انتخاب کرد.
پس از ویندوز XP که فونت پیش فرض زیبا و خوانای Tahoma را داشت، فونت Segoe UI جایگزین آن شد. متاسفانه این فونت تا نسخه اخیر بسیار ناخوانا بود و ترکیب آن در صفحه نمایش زشت دیده می شد.
نسخه جدید Segoe UI برای رسم الخط عربی تغییرات بسیاری کرده تا آنجا که حتی بهتر از Tahoma نیز می باشد.
تصویر زیر پیش نمایش از تعدادی حرف و عدد در این سه فونت مختلف را نمایش می دهد:

همانطور که ملاحظه می کنید فونت Tahoma در وضعیت ضخیم و کمی اندازه بزرگتر کیفیت خود را از دست می دهد، اما فونت Segoe UI همانچنان خوانا و زیبا می باشد.

جهت دانلود و نصب این فونت بر روی ویندوز 7 از این لینک استفاده کنید.

جهت اطلاع از تغییرات این فونت برای الفبای لاتین:

 

مسابقه ایرانی هوش مصنوعی

۱۳۹۱/۰۶/۰۹ ۱۱:۴۵ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۱/۰۶/۰۹ دسته بندی : ، ، 4

مسابقات آنلاین شبیه سازی و برنامه نویسی که اخیرا راه اندازی شده است بر روی هوش مصنوعی تاکید دارد. این مسابقات به صورت دوره ای و آنلاین برگذار می شود و برای برندگان نیز جایزه هایی تعیین شده است.
دور اول مسابقه موش پنیر یاب است که برنامه نویس باید با استفاده از پکیج های آماده شده الگوریتم خود را در زبان برنامه نویسی منتخب خود پیاده کرده و مسائله را سریعتر از رقیب خود حل کند.
نمایی از مسابقه در حال اجرا:
با توجه به بسته های شروع موجود آغاز کار بسیار ساده است. با استفاده از همه معلومات داده شده به روبات مانند موقعیت پنیرها ، دیوارها و رقیب و با به کار گیری از بهینه ترین روشها و الگوریتمها باید سریع تر از رقیب پنیر و امتیاز بیشتری بدست آورد.
در نگاه اول مسئله بسیار ساده می رسد و با توجه به اینکه هیچ مجهولی نداریم به ظاهر با استفاده از یک الگوریتم (مانند A-Star) می توان به نتیجه رسید. اما همینجا است که الگوریتم های بهینه سازی نتیجه، کاربرد پیدا می کنند و شما باید در هر لحظه سعی کنید با پیش بینی ها بهترین مسیر را انتخاب کرده و بیشترین پنیر را بدست آورید.

به قولی معروف: ما روباتهایی باهوش درست نمی کنیم، ما سعی دارین روباتهایی درست کنیم که کمتر احمق باشند.

جوایزی که برای مسابقه (یا دوره مسابقات؟) در نظر گرفته شده (100 هزار تومان برای نفر اول و... است) که برای یک چنین مسابقه ای اغوا کننده هستند. اما چندین ابهام و اشکال در این میان وجود دارد.
با توجه هزینه ها و جوایز هیچ تبلیغاتی روی آن صورت نگرفته(تا آنجایی که می دانم) و این جای شک را ایجاد می کند که آیا واقعا قادر به پرداخت هستند؟ (با توجه به پاسخ سوالی که به من در فروم دادند تمام هزینه به صورت شخصی بر عهده شخص متولی است)
مسئولین و متولیات معرفی نشده اند. با توجه به چنین ایده و کار جالبی، چرا نباید خود را معرفی کنند؟ عدم معرفی به نظر مخفی کار می رسد!
امیدوارم متولیان به این موارد رسیدگی کنند. گرچه تا اینجای کار و راه اندازی سایت و مسابقه کم کاری هم نبوده است.

به نظر من تعریف مسئله ساده انجام شده است. امکانش بود که با افزودن جزئیات و مسائل بیشتر سختی و جذابیت بیشتری به مسابقه داد. برای مثال دو موش نتوانند روی یک خانه قرار گیرند. و یک دشمن مانند گربه برای هر دو موش باشد. و یا محیط بزرگ بوده و دید موش محدود به چند خانه اطراف و خانه های بازدید کرده باشد. و یا پنیر ها ظاهر بشوند و پس از مدتی فاسد بشوند(امتیاز منفی) و ...

یکی از اشکالات عمده ای که سایت فعلا دارد، مدت زمان کامپایل کد و انجام مسابقه است. این مدت معمولا 1 تا 3 روز طول می کشد که ناراحت کننده است. (با توجه به مشکلات کامپایل که ممکن است پیش بیاید)

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

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

 

SalarDbCodeGenerator نسخه 2 و NHibernate

۱۳۹۱/۰۶/۰۳ ۱۴:۲۸ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۱/۰۶/۰۳ دسته بندی : ، 1

در پست قبلی با SalarDbCodeGenerator آشنا شدید. در این پست می خواهیم نسخه 2 این نرم افزار رو به طور خلاصه بررسی کنیم.
برخی از تغییرات مهم نسخه 2:
  • الگوی جدید NHibernate MappingByCode (پشتیبانی از MVVM و data annotations)
  • الگوی جدید Dapper+SQLinq که از کتابخانه SQLinq و توابع کمکی در Dapper استفاده می کنه
  • باز نویسی مجدد موتور شمای الگوها
  • بازنویسی مجدد موتور اصلی
  • شمای جدید پروژههای برنامه
  • به روز شدن همه الگوها
  • بهبود سرعت کلی تولید کد
  • خواندن و شناسایی اعمال کلید خارجی
  • پشتیبانی از توضیحات ستون ها در oracle و sqlCe
و البته پروژه های نسخه 1 توسط این نسخه پشتیبانی نمی شود.
لیست کامل تغییرات در صفحه دانلود قرار دارد.

نگاهی به پیاده سازی NHibernate MappingByCode انجام شده.
پیاده سازی نگاشتها بدون استفاده ClassMapping و صرفا با استفاده از کلاس کمکی ModelMapper انجام شده است. این متد کمکی در فایل SampleDbMapper قرار می گیرد.
همچنین برای پیاده سازی های سفارشی متد دیگری با نام CustomMapToModel در نظر گرفته شده است.
در کل ساختار پروژه به این صورت می شود:

Base\SampleDbBase.cs
Entities\DataAnnotations\*Meta.cs
Entities\UserEntities\*Entity.cs
Entities\Principal\EntityObjects.cs
Entities\SampleDbMapper.cs
Entities\SampleDbMapper.User.cs
Entities\SampleDbSession.cs
app.config
تقریبا ساختار بیشتر پروژه های تولید شده توسط این برنامه به همین شکل است. به همین منوال بقیه، کلاس پایه SampleDbBase.cs شامل چند متد اضافی هست که به تهیه کپی از کلاسهای مدل کمک می کند. از جمله متدهای CloneUnproxied و CopyUnproxied که یک نمونه بدون پراکسی را تهیه می کنند.
طریقه استفاده از این پروژه ساده است. با استفاده از کلاس کمکی SampleDbSession یک نمونه از session را ایجاد کرده و بقیه اعمال را به منوال عادی NHibernate انجام می دهیم:

using (var session = SampleDbSession.OpenSession())
{
    var newCar = new Car()
        {
            Color = "white"
        };
    session.Save(newCar);
    session.Flush();
}
using (var session = SampleDbSession.OpenStatelessSession())
{
    dataList = session.Query<car>().Where(x => x.Color == "white");
}

نگاهی به Dapper+SQLinq
این الگو همانند الگوی DapperAccess است که کتابخانه SQLinq به آن اضافه شده است. این کتابخانه این امکان را برای Dapper فراهم می کند که با استفاده از عبارات LINQ کوئری مورد نظر بدون استفاده مستقیم از عبارات sql عملیات استاندارد را انجام دهد. ترکیب Dapper و این کتابخانه راحتی و سرعت قابل قبولی را فراهم می کند.
این کتابخانه فقط از SqlServer پشتیبانی می کند.

نمونه کد:

using (var dap = new CarDap())
{
    dataList = dap.Query(new SQLinq<car>().Where(x => x.Color == "white"));
}

بهبودها و نسخه بعدی
در این نسخه از SalarDbCodeGenerator اصلاح کننده نام های نامعتبر تغییرات زیادی کرده و بهبود یافته است. به همین علت ممکن است که پروژه تولید شده با این نسخه سازگار با نسخه های قبلی سازگار نباشد.

همچنین برای نسخه های آینده احتمالا بر روی ویژگی های جدید EF5 کار خواهم کرد (پشتیبانی از Enum و Table-Valued).

نظر شما چیست؟ چه ویژگی به نظرتون حیاتی است و می خواهید در نسخه بعدی مشاهده کنید؟

دانلود

 

دانلود دیتابیس اوراکل

۱۳۹۱/۰۴/۱۴ ۷:۵۴ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۱/۰۴/۱۴ دسته بندی : 6

قبلا درهای سایت اوراکل برای ایرانی ها یک طرفه باز بود و می شد وارد شد ولی اجازه دانلود نداشتیم، اما مدتی هست که ظاهرا همه درها بسته شده، حتی اجازه دیدن قیافه سایت نیز منع شده است!
برای رفع مشکل دانلود لینک دانلود های زیر را جمع آوری کردم که فعلا آخرین نسخه دیتابیس یعنی 11g Release 2 رو می تونید دریافت کنید.
روش کلی جستجو خیلی ساده است، فقط کافی هست که نام فایل مورد نظر رو به صورت کامل به صورت زیر در گوگل وارد کنید:
intitle:index.of ODTwithODAC112030.zip
نتایج معمولا سایتهای شخصی هستند که افراد فایلها رو روی سرور دانلود کرده و گوگل آنها را یافته است. البته این لینک ها زیاد دوام نمی آورند، به خاطر همین لینک جستجو آنها رو نیز قرار دادم.


دانلود Oracle Database 11g Release 2 Win32-Part1 Win32-Part2 | لینک جستجو
دانلود Oracle Database 11g Release 2 Win64-Part1 Win64-Part2
دانلود Oracle Database XE 11g R2 | لینک جستجو

دانلود Oracle Instant Client Win32 Win64 | لینک جستجو
دانلود Oracle Database Client 11g R2  Win32 Win64

دانلود ODAC 11.2 Release 4 (11.2.0.3.0) with Tools for Visual Studio | لینک جستجو

دانلود ODAC 11.2 Release 4 (11.2.0.3.0) with Xcopy Deployment | لینک جستجو

دانلود Jdk7 u5 i586 | لینک جستجو
دانلود Jdk7 u5 x64 | لینک جستجو

در مورد JRE به سایت Download JRE FileHippo و سایتهای دیگه مراجعه کنید که همیشه آخرین نسخه را قرار می دهند.

 

تغییر کلمه عبور فراموش شده در SQL Server

۱۳۹۱/۰۴/۱۱ ۱۶:۰۹ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۱/۰۴/۱۱ دسته بندی : 1

فراموشی کلمه عبور SQL Server از مواردی هست که کم برای کسی پیش می آید ولی اگر پیش بیاد دردسر بزرگی خواهد بود.
چند راه مختلف برای بازیابی و ریست کلمه عبور وجود دارد، در اینجا قصد ندارم آنها رو شرح بدهم. اما شاید ساده ترین روش ورود با استفاده از حساب sa و یا با استفاده از حساب ویندوز (Windows authentication) باشد.
اما اگه این دو نشد چه؟ مثلا حساب sa غیر فعال است و windows authentication برای کاربران تعریف نشده باشد .(البته غیر فعال بودن sa توصیه میشه.)
یک راه جالبی وجود دارد که نیاز به روش خاصی برای انجام دارد که در ادامه می خوانید، اما قبل از آن لینک های زیر شامل روشهای مختلف دیگری برای بازیابی کلمه عبور هستند:
اجرای sql server در حالت single user هم جالب هست که در لینکهای بالا توضیح داده شده است.

اما روشی که من استفاده کردم بر یک نکته ساده مربوط به حساب کاربری جاری متصل شونده به دیتابیس استوار است. در زمان اتصال به sql server و استفاده از روش windows authentication حساب کاربر جاری مورد استفاده قرار می گیرد. برای مثال اگه حساب کاربری ویندوزی جاری salar باشد، وجود حساب وی و دسترسی وی به sql server بررسی شده و سپس اجازه ادامه عملیات و برقراری اتصال داده می شود.
حال اگر کاربر جاری را به SYSTEM تغییر دهیم چه می شود؟ به طور پیشفرض کاربر SYSTEM جزو کاربران مجاز با دسترسی کامل در هنگام نصب sql server تعیین می شود.
پس با این اوصاف اگر بتوانیم با کاربر SYSTEM وارد شویم امکان تغییر کلمه عبور کاربران و کارهای دیگر فراهم می شود.
وجود کاربر جاری و کاربر سیستم

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

همه این نکات در برنامه/سرویس SQLServerPasswordChanger جمع شده است. این برنامه دستور SQL را که در فایل cmd.sql قرار دارد اجرا کرده و نتیجه اجرا را (موفقیت / عدم موفقیت) در فایل result.log می نویسد. دستور پیش فرض قرار گرفته شامل تغییر کلمه عبور sa و سپس فعال کردن sa در صورت غیر فعال بود هست.

exec sp_password @new='1234567890', @loginame='sa' ;
alter login sa enable ; 


قبل از همه این مراحل سرویس این برنامه باید نصب شود، عملیات نصب/عذل توسط خود برنامه انجام می شود و دارای تعدادی نکته هست که بررسی آن خالی از لطف نیست.
همچنین کانکشن اتصال در فایل SQLServerPasswordChanger.exe.config قرار دارد که فقط در صورت وجود Instance نیاز به تغییرش هست.
  • دانلود
برنامه SQLServerPasswordChanger در این آدرس قابل دریافت است.
کد های این برنامه به صورت آنلاین در این آدرس قرار دارند.

 

Dapper یک mini-ORM سریع

۱۳۹۱/۰۲/۲۹ ۱۹:۵۴ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۱/۰۲/۲۹ دسته بندی : ، ، ، 3

اخیرا در حال کار بر روی سرویس تحت وبی بودم که برخلاف حجم کوچک پروژه کار خیلی زیادی رو انجام میده و ترافیک زیادی قراره روی اون سوار بشه.

به علت فشاری که سرویس قرار بود متحل بشه مشغول بهینه سازی عملکرد بخش های مختلف بودم. این فشار حداقل 100 درخواست در ثانیه از مجموع 10 کاربر همزمان برای شروع کار در نظر گرفته شده بود. در چنین حجم کاری هر میلی ثانیه نیز با ازش هست. در حین بررسی اجرای برنامه متوجه تاخیرهای بیش از حد و غیر عادی عملیات دیتابیس شدم. برای کاهش تاخیر سعی شد تا عملیات به روز رسانی و درج در دیتابیس غیر همزمان انجام شود(با Thread Pooling توسط BeginInvoke ساده)، اما این کار ممکنه ایجاد تداخل کنه و همیشه قابل انجام نیست.
در کل تاخیر های انجام شده توسط EntityFramework محسوس بودند. بنچمارک های انجام شده نیز این مطلب را نشان می دهد که EF کندتر از سایر orm ها عمل می کند. این کندی به چه معناست؟ یعنی برای انجام 500 درخواست متوالی EF حدود 600 میلی ثانیه زمان مصرف می کند، در حالی کار به ado.net ساده زمانی حدود 44 میلی ثانیه لازم دارد.
البته این برای برنامه های دسکتاب اصلا به چشم نخواهد آمد، چون اصلا کاربر بیش از چند نفر نمی شود.
در این بین مدل 3Tier که توسط این برنامه تولید می شود یک گزینه موجود بود اما مناسب نبود. این مدل نیاز به کار با StoredProcedures ها دارد، در حال حاظر مقدور نبود از sp ها استفاده کنم و همچنین وابستگی شدیدی به مدل(database model) خود دارد و چند محدودیت دیگر. در حین جستجو برای بهترین نتایج، Dapper جالب به نظر رسید.
Dapper یک نیمچه ORM که به علت سرعت بالایی که داره انتخاب من شد. کارکرد Dapper بسیار جالب هست، یک فایل را به پروژه اضافه می کنید و تمام. با استفاده از چند متن افزوده به connection دیتابیس به راحتی امکان دریافت نتایج و مپ کردن آنها به کلاسهای مدل دیتابیس را فراهم میکنه.
استفاده از آن هم به سادگی کد زیر هست:
using (var conn = new SqlConnection(myConnectionString)) {
     conn.Open();
     Account result = conn.Query<account>(@"SELECT * FROM Account WHERE Id = @Id", new {  Id = Id }).FirstOrDefault();
     ...
}
همانطور که می بینید با استفاده از عبارات sql فراخوانی ها مستقیما انجام میشود. پارامتر دوم پارامترهای کوئری است که از نوع dynamic تعریف شده و هر نوع شیئی را می پذیرد.
امضاهای مختلفی از این متد وجود دارد. در صورتی که نیاز باشد تا فقط چند ستون از جدول انتخاب شود از امضای زیر که خروجی dynamic دارد استفاده می کنیم:

dynamic account = conn.Query<dynamic>(@"SELECT Name, Address, Country FROM Account WHERE Id = @Id", new { Id = Id }).FirstOrDefault();
Console.WriteLine(account.Name);
Console.WriteLine(account.Address);
Console.WriteLine(account.Country);
براس آشنایی بیشتر با چند متدهای دیگر به صفحه Dapper مراجعه کنید.
کارایی dapper برای من سوال بود و زیاد به بنچ مارکهای دیگران اعتماد نداشتم به همین جهت به گفته ها بسنده نکرده و در یک تست ساده select بر آن شدم تا مقایسه ای انجام بدم. و این هم از نتایج:
Selecting 1 record in 200 iterations
------------------------
EF CodeFirst total: 00:00:00.2616611, ms: 261
ActiveRecord total: 00:00:00.1116575, ms: 111
Dapper total:       00:00:00.0177814, ms: 17
------------------------
EF CodeFirst total: 00:00:00.2460143, ms: 246
ActiveRecord total: 00:00:00.1105966, ms: 110
Dapper total:       00:00:00.0183922, ms: 18
------------------------
EF CodeFirst total: 00:00:00.2454677, ms: 245
ActiveRecord total: 00:00:00.1116689, ms: 111
Dapper total:       00:00:00.0173781, ms: 17
------------------------
EF CodeFirst total: 00:00:00.2448425, ms: 244
ActiveRecord total: 00:00:00.1117898, ms: 111
Dapper total:       00:00:00.0174709, ms: 17
------------------------
EF CodeFirst total: 00:00:00.2478316, ms: 247
ActiveRecord total: 00:00:00.1104544, ms: 110
Dapper total:       00:00:00.0197321, ms: 19
هر فراخوانی 200 بار تکرار شده و کل آزمون رو 5 بار تکرار کردم. همانطور که می بینید EntityFramework بدترین نتیجه رو بدست آورده و البته این همه اختلاف جای تعجب دارد. در این تست کار مستقیم با ado.net رو پوشش ندادم ولی با توجه به نتایج تست خود صفحه dapper در 500 تکرار در حد 4 یا 5 میلی ثانیه اختلاف بین dapper و ado.net مسقیم وجود دارد.

به همین دلایل یک الگو برای SalarDbCodeGenerator مهیا کردم که تا من رو از خطر نگهداری و نوشتن کدهای SQL تاحدودی راحت کنه. این الگو یک کلاس میانی برای هر جدول دیتابیس ایجاد می کنه که علاوه بر مدیریت اتصال های پایگاه داده (dapper مدیریت اتصال پایگاه داده را انجام نمی دهد) متد های اصلی CRUD را دارا است. همچنین برای ارتباطات جداول و کلیدهای اندیس و یکتا(unique) متدهای کمکی را تولید می کند.
خلاصه با استفاده از این الگو بدون نیاز به هر کاری می توان کارهای ساده با جداول را با قدرت Dapper انجام داد.
نکته: لازم نیست که حتما مدلهای جداول این الگو را تولید کنید، می توان از مدلهای سایر ORM ها با اندکی تغییر استفاده کرد.
نمونه کد:
using (var pdap = new PersonDap())
using (var transaction = pdap.BeginTransaction())
using (var cdap = new CarDap(pdap))
{
 var person = pdap.GetByPersonID(10);
 var carList = cdap.GetByPersonID(person.PersonID);

 var newCar = new Car()
     {
         CarPlaque = "1982-92",
         Color = "White",
         ModelType = "BMW",
         PersonID = person.PersonID,
     };
 cdap.Insert(newCar);
 transaction.Commit();

 var bmwList = pdap.Query<Car>(
  CarDap.SqlSelectCommand + " WHERE ModelType=@ModelType",
  new {ModelType = "BMW"})
  .ToList();

 ....
}
تنها نکته لازم به توضیح، ثابت SqlSelectCommand هست، این ثابت و سه ثابت دیگر دستورات sql پیشفرض برای عملیات CRUD در پایگاه داده هستند که توسط generator تولید شده و همیشه به روز هستند و در همه جداول وجود دارند. می توانید دردسر نوشتن دستورات sql را تا حدودی کاهش دهید.

و  در آخر بهتر است بدانید که Dapper توسط Sam Saffron یکی از برنامه نویسان سایت StackOverflow و برای همان سایت توسعه داده شده و بعدا open-source شده است.
  • لینکهای مفید

*پ.ن: نسخه جدید SalarDbCodeGenerator در سایت قرار گرفت که همراه با این مدل به نام DapperAccess است، یک به روزرسانی برای مدل EF دارد. از صفحه پروژه قابل دریافت است.

به روزرسانی: همانطور که در متن توضیح دادم Dapper یک ORM کامل نیست، برای اینکه شبهه ای ایجاد نشه، عنوان مطلب اصلاح شد.

 

معرفی SalarDbCodeGenerator

۱۳۹۱/۰۲/۱۶ ۹:۲۱ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۱/۰۲/۱۶ دسته بندی : ، ، ، 7

مدتی بود که تصمیم داشتم پروژه رو که در ادامه مشاهده می کنید، اوپن سورس کنم. این برنامه در طول مدت تقریبا نزدیک به 4 سال به تدریج توسعه یافته و به شکل کنونی خود رسیده. تقریبا در بیشتر پروژه هایی که خودم شروع کردم از اون استفاده کردم و تا حد قابل قبولی آزمایش شده و قابل اعتماد هست.
SalarDbCodeGenerator یک تولید کننده کد است که از مدل اول دیتابیس (Database first) پیروی می کند. با استفاده از الگوهای از قبل تهیه شده پروژه را تولید کرده و آماده کامپایل و استفاده می شه. هر الگو معمولا شامل کلاسها مدلینگ جدوال، ویو ها و در نهایت کلاسهای پایه کار دیتابیس و یا کلاسهای پایه ORM مورد استفاده است.
از عمده مزیت استفاده از یک تولید کننده کد کاهش زمان مورد نیاز برای نوشتن کلاسهای مدل و توابع mapping است. تقریبا همه این کارها انجام شده و پروژه قابل استفاده تحویل می گیرید.
الگوهای مورد استفاده برنامه همگی قابلیت سفارشی سازی دارند و در حالت کلی برای نرم افزار زبان مورد استفاده شده هیچ اهمیتی ندارد و هر آنچه که در الگو معین شده خروجی را تعیین می کند. در نتیجه خروجی این تولید کننده در هر زبانی می تواند باشد.

پایگاه داده های مورد پشتیبانی
  • Micorsoft SQL Server (2000/2005/2008/2012)
    (پشتیبانی از توضیح برای فیلدها)
  • SQL Server Compact Edition 4
  • Oracle Database (8i/9i/10g/11g)
  • SQLite (v3 and above) 
خلاصه امکانات
  •  شناسایی کلید واژه های رزروشده (Keywords) زبان برنامه نویسی و عدم ایجاد تداخل کد تولیدی
  • پستیبانی از تغییر نامه جداول و ویوهای تولیدی جهت خوانا شدن در هنگام برنامه نویسی
  • افزودن توضیحات هر یک از فیلدهای جدول به مدلهای تولید شده جهت راحتی در هنگام کد نویسی (فقط SQLServer)
  • الگوی های سفارشی
  • استفاده شده از الگوهای کد به صورت XML که تغییر و ویرایش آنها را ساده می کند
  • تولید کد برای کلیدهای خارجی (Foreign keys) و اندیس ها (Index)

الگوهای همراه برنامه

Entity Framework Code First
  • EF4 CodeFirst
    (همراه با data annotations)
  • EF4 CodeFirst MVVM
  • (همراه با  data annotations و اعلان تغییر پراپرتی های mvvm)
  • EF4 CodeFirst Simple
    (کلاسهای ساده بدون ویژگی اضافه)
مدل دیتابیس را برای استفاده توسط Entity Framwork 4.2 CodeFirst تولید می کند. همچنین چندین متد و ویزگی اضافه که برای برنامه نویس مفید هستند همراه این مدل افزوده است.

data annotations و اعلان تغییر پراپرتی ها(INotifyPropertyChanged) به صورت دو الگوی جداگانه طراحی شده و در دسترس هستند. همچنین همه کلاسها به صورت partial بوده و قابلیت سفارش سازی دارند.
همراه با همه الگوهای پیش فرض معمولا کلاسهای Partial جداگانه ای تولید می شود تا برنامه نویس بتواند ویژگی ها و متد های سفارشی خودش را در آنها قرار دهد.

NHibernate Mapping By Code (در حال آماده سازی)
Mapping By Code از نسخه NHibernate 3.2 معرفی شد و بدون نیاز به داشتن فایلهای xml اضافه اجازه استفاده از مدلها را می دهد.
در زمانها فراقتم در حال آماده کردن این الگو هستم، که پس از آزمایش اطمینان از صحت عمل آن منتشر می کنم.

NHibernate ActiveRecord

  • NHibernate ActiveRecord
  • NHibernate ActiveRecord WCF
مدل های دیتابیس و کلاسهای مورد نیاز را تولید می کند که  توسط هر دو نسخه Castle ActiveRecord 2.2 یا 3 قابل استفاده است. Castle ActiveRecord از الگوی  ActiveRecord پیروی می کند و به صورت توکار از NHibernate برای اجرای کوئری ها استفاده میکند.
الگوی "NHibernate ActiveRecord WCF" اختصاصا برای کار با WCF بهینه سازی شده است، به این صورت که ID جدوال خارجی را نیز در خود نگه میدارد (این کار در حال عادی مرسوم نیست) جهت سهولت ارسال مدل ها در WCF. البته این Id ها باید به صورت دستی مقدار دهی شوند.

LinqToSql
نسخه متفاوتی از مدل Linq To Sql را تولید می کند. مدل تولید شده از روش برنامه های سه لایه تبعیت می کند. البته توجه شود که فقط دو لایه Bussinuess و DAL در این الگو تولید می شوند. طبق معمول جهت سفارشی سازی کلاسها  و متدهای اضافه مد تظر گرفته شده اند.

Entity Framework 4 POCO
  • EF4 POCO
  • EF4 POCO LINQ
مدل های دیتابیس و کلاسهای Entity Framework 4 را به صورت مدل POCO تولید می کند. POCO مخفف Plain Old Clr Object استفاده از روش سفارشی سازی شده برای Entity Framework نسخه 4 است.
الگوی "EF4 POCO LINQ" یک مدل اضافه روش برنامه نویسی سه لایه نیز تولید می کند، که هر دو روش در برنامه قابل استفاده هستند. جهت استفاده از این دو الگو باید حتما مراحل زیر را دنبال کنید.
ابتدا در پروژه باید حتما مدل ایجاد شود، نام مدل باید همنام دیتابیس به علاوه Entities باشد (مثلا TestDbEntities.edmx و TestDbEntities برای نام کلاس).
هنگام تهیه مدل حتما باید گزینه "Pluralize or singularize generated object names" حذف شود. و در نهایت ویرایشگر مدل (Model Designer) مقدار ویژگی "Code Generation Strategy" باید به "None" تغییر داده شود.
پس از طی این مراحل مدل تولیدی قابل استفاده خواهد بود.


3Tier
  • 3Tier CSharp
  • 3Tier VB.NET
مدل های دیتبایس را جهت استفاده در یک برنامه سه لایه کلاسیک تولید می کند. این الگوها از کلاسهای پایه ADO.Net جهت دسترسی به داده و انجام عملیات استفاده می کنند. همچنین همه عملیات پیش فرض این مدل ها توسط Stored Procedure تولید شده انجام می شود.
به همین دلایل سرعت عملیاتی این مدل بسیار بالا بوده و برای برنامه هایی که نیاز به سرعت زیادی دارند، بسیار مناسب می باشد.
الگوی "3Tier CSharp" علاوه بر موارد ذکر شده از یک مرحله caching اضافه هنگام خواندن اطلاعت بر روی ترتیب رکوردها نیر استفاده می کند. این باعث افزایش کارایی هنگام خواندن حجم عظیمی از داده می شود.
این دو الگو محدودیت های خودشان را نیز دارند، از جمله نیاز به نوشتن هر عملیات جدید به صورت دستی، عدم پشتیبانی از Linq و محدود بودن به SQL Server می توان اشاره کرد.

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

پنجره اصلی برنامه
پنجره تنظیمات برنامه

  • دانلود
این پروژه به صورت اوپن سورس و رایگان در آدرس salardbcodegenerator.codeplex.com قرار گرفته است.
همچنین کدهای برنامه به صورت آنلاین در این آدرس قابل مشاهده هستند.

پیشنهادات و ایرادات مشاهده شده از اینجا و یا صفحه نظرات پروژه مطرح کنید.

 

دیکشنری سبک فارسی/انگلیسی

۱۳۹۱/۰۱/۱۷ ۱۵:۴۶ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۱/۰۱/۱۷ دسته بندی : ، ، ، ، 5

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

ویژگی های این دیکشنری:
  • ترجمه لغت فارسی به انگلیسی و انگلیسی به فارسی
  • غلط یاب هوشمند با استفاده از الگوریتم و کتابخانه پیشرفته برای فارسی و انگلیسی
  • غلط یاب جداگانه جهت تطبیق کلمات یافت نشده برای نمایش معانی کلمات مشابه موجود
  • بهینه سازی شده برای شروع سریع 
  • نمایش معانی کلمات موجود در حافظه موقت سیستم (Clipboard)
  • تلفظ کلمات انگلیسی با صدای سیست

چند ویژگی خیلی مهم این برنامه که اشاره شد می تونه توجیهی مناسبی برای استفاده از اون با وجود سایر دیکشنری ها باشه.
  • اجرای سریع و نمایش سریع نتایج
  • وجود چند نوع غلط یاب پیشرفته که کلمات مشابه را نشان می دهند. این موضوع از این جهت مهمه که معمولا کلمات تایپ شده در دیکشنری برای فرد ناآشنا هستند، پس امکان تایپ غلط بسیار زیاد است. متاسفانه اکثر برنامه ها در این زمینه ضعیف عمل می کنند.
  • نمایش معانی کلمات از clipboard، این مورد هم قبلا در برنامه مثل babylon با روش point-click بسیار سریع و ساده عمل می کردند بسیار مفید بود، اما از زمانی که اکثر برنامه ها از سیستم های جدید نمایش متون استفاده می کنند (Hardware accelerated rendering & ClearType fonts)، دیگه این روش کار ساز نیست و لغت رو باید در حافظه کپی کرد. این برنامه یک قدم سریع برداشته و معنای لغت موجود در حافظه رو نشون میده.
صفحه اصلی - نمایش غلط گیر و کلمات مشابه
نمایش غلط گیر و کلمات مشابه برای فارسی

نمایش معنی نزدیکترین کلمه با اصلاح غلط املایی در اول آن

 دانلود
قبل از استفاده از این برنامه باید Microsoft .NET Framework 4 رو در سیستم خود نصب شده داشته باشد.

برای دانلود برنامه به صفحه آن در codeplex مراجعه کنید، در این آدرس.

بررسی مختصر کدها
این برنامه با زبان #C نوشته شده، رایگان و کدباز تحت MPL2 هست.
کدهای برنامه در آدرس پروژه به صورت آنلاین نیز قابل مشاهده است. در اینجا.

فراخونی با تاخیر و گرم کردن
گرم کردن یا اصطلاحا Warm-Up علت اصلی سرعت بهینه اجرا برنامه است. به این صورت که در یک thread جداگانه برنامه اقدام به ایجاد یک اتصال به پایگاه داده می کند، این کار قبل از شروع ایجاد فرم صورت می گیرد. به علت خاصیت thread برای اجرای همزمان، این دو کار همزان اجرا می شوند. در thread اصلی برنامه فرم ایجاد شده و thread دیگر اولین اتصال به پایگاه داده که بسیار وقت گیر انجام می شود.
اولین اتصال به پایگاه داده از این جهت مهم است معمولا این اتصال پس از بسته شدن به صورت نیمه فعال باز باقی می ماند و در صورتی که درخواستی مجددا صورت گیرد، بدون نیاز به باز کردن اتصال جدید همین اتصال نیمه فعال، فعال شده و مورد استفاده قرار می گیرد.

در طی همین مراحل نیز در thread جدید و جداگانه دیگری بانک اطلاعاتی غلط یابها بارگذاری می شود که شامل فارسی و انگلیسی است. بارگذاری این دو بانک نیز زمانبر است ولی به علت استفاده از thread ها این تاخیر های مشاهده نمی شوند.

ابزارهای و کامپوننت های برنامه
* دیتابیس لغات، از جمله آنهایی هست که دست به دست شده و بالاخره به من رسیده، به همین علت نمی دونم کی زحمت تهیه اش را کشیده.
* کتابخانه غلط یاب NHunspell، که الگوریتم پیشرفته آن که به نام Hunspell در مجموعه نرم افزارهای بسیار زیاد و مشهوری استفاده شده.
* تلفظ کننده متون که توکار در نسخه 4 دات نت است. در برنامه تنظیمات پیش فرض سیستم استفاده شده و در صورت اعمال تغییر در گوینده و صدا و غیره به برنامه نیز اعمال خواهد شد.
* کنترل نمایش دهنده لیست پیشنهادات که مخصوصا برای این برنامه نوشتم؛ به این علت که AutoComplete استاندارد که توسط کنترل ارائه میشه جوابگوی نیاز نبود.

نکته:
بانک اطلاعاتی این برنامه Access هست و اگر سیستم 64 بیتی باشد، امکان اتصال به بانک میسر نیست زیرا برای Access فقط درایور 32 بیتی موجود است. راه حل خیلی ساده تنظیم platform برنامه بر روی x86 هست. با این کار کامپایلر زمان اجرای دات نت همیشه برنامه را به صورت 32 بیتی کامپایل می کند. در نهایت امکان دسترسی به دیتابیس هم در سیستم 32 بیتی و هم در 64 بیتی محیا میشه.

امیدوارم مفید واقع بشه.

 

ماژول دانلودر برای ASP.NET

۱۳۹۰/۱۲/۰۶ ۱۳:۰۴ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۰/۱۲/۰۶ دسته بندی : ، ، ، 3

  • مقدمه
بیشتر مواقع لازم است تا بر روی دانلود های وبسایت نظارت انجام شود, برای مثال فقط اعضا اجازه دانلود فایلی را داشته و یا دانلود یک شمارنده داشته باشد و غیره. در حالت عادی برنامه نویسان فایل را مستقیم به خروجی می نویسند. این روش کار را انجام داده و به نتیجه لازم نیز می رسد اما یک مزیت بزرگ را از دست می رود. آن مزیت قابلیت Resumable Downloading است که به طور خلاصه به کاربر این اجازه را می دهد که در هر زمان دانلود را متوقف کرده و پس از شروع مجدد از همان محل قبلی ادامه دانلود را انجام دهد. این موارد بیشتر در فایلهای حجیم صادق است و مورد نیاز می شود.
همچنین یک نیاز دیگر هم پیش می آید و آن محدود کردن پهنای باند مصرفی برای دانلود است. که در حالت عادی و ارسال فایل از طریق دستورات asp.net این کار امکان پذیر نیست.

  • معرفی
برای رفع مشکلات و محدودیت های مطرح شده ماژولی را آماده کرده ام که با استفاده از آنها میتوانید کنترل نسبتا کاملی بر دانلود کاربر داشته باشید.
مجموعه کلاسهای ResumableDownload چندین کار مخلتف را انجام می دهد که با کنار هم قرار دادن آنها به مقصودمان می رسیم.

  • طریقه استفاده
قبل از هرکاری باید درخواست ورودی کاربر بررسی شده و دقیقا بدانیم که کدام فایل مد نظر است. سپس حجم آن را بدست بیاوریم.
اولین قدیم شناسایی درخواست کاربر است. این درخواست معمولا توسط یک نرم افزار دانلودر مانند IDM انجام شده است. هدف در اینجا شناسایی هدر های ارسالی است که توسط یکی از متدهای کلاس HeadersParser انجام می شود.
قدم دوم باید اطلاعات فایلی که قرار است دانلود بشود توسط کلاس DownloadDataInfo جمع آوری شود. یکی از سازنده های کلاس اطلاعات فایل را دریافت می کند باید مورد استفاده قرار گیرد. سپس خروجی متد مورد استفاده از HeadersParser باید به کلاس DownloadDataInfo اطلاع داده شود و این کار با استفاده از متد InitializeRanges آن انجام می شود.
قدم سوم بررسی صحت درخواست دانلود است. این کار توسط متد های Validate کلاس HeadersParser انجام می شود. این کار از این جهت مهم است که ممکن است فایل در سرور تغییر داده شده باشد ولی کاربر سعی دارد تا همچنان به دانلود نسخه قدیمی که ناقص انجام شده بود ادامه دهد.
قدم اختیاری در این بین اعمال محدودیت در پهنای باند دانلود فایل برای کاربر است. این محدودیت توسط کلاس UserSpeedLimitManager قابل اعمال است. در آزمایشاتی که من انجام دادم مشخص شد که در هر صورت استفاده از این کلاس بار زیادی را از دوش سرور بر می دارد. این بدان علت است که در حالت بدون محدودیت سرور تمام فایل را از دیسک خوانده و به یکباره به بافر انتظار می فرستد, این عملیات یکباره بار زیادی بر سرور وارد می کند. همچنین مشخص شد که گذاشتن محدودیت حتی در حد 2MB/s می تواند تاثیر زیادی در افزایش بازدهی سرور داشته باشد.
قدم نهایی ارسال فایل به کاربر طبق درخواست وی که از طرق متد ProcessDownload کلاس DownloadProcess انجام می شود.

در ادامه یک مثال کامل را مشاهده می کنید. در این مثال نام فایل به عنوان ورودی ارسال می شود, سیستم این فایل را از مسیر برنامه یافته و برای کاربر ارسال می کند.
برای مثال آدرس به این صورت خواهد بود: http://localhost:5200/ResumableDownload.ashx?file=sample.zip

// 50 KB limit
const int DownloadLimit = 50 * 1024;

public void ProcessRequest(HttpContext context)
{
 // Accepting user request

 // reading the query
 var fileNameQuery = context.Request.QueryString["file"];

 // validating the request
 if (string.IsNullOrEmpty(fileNameQuery))
 {
  InvalidRequest(context, "Invalid request! Specify file name in url e.g.: ResumableDownload.ashx?file=sample.zip");
  return;
 }

 // the physical file address path
 var fileName = context.Server.MapPath(fileNameQuery);
 if (!File.Exists(fileName))
 {
  InvalidRequest(context, "File does not exists!");
  return;
 }

 // reading file info
 var fileInfo = new FileInfo(fileName);
 var fileLength = fileInfo.Length;

 // Download information class
 var downloadInfo = new DownloadDataInfo(fileName);

 // Reading request download range
 var requestedRanges = HeadersParser.ParseHttpRequestHeaderMultipleRange(context.Request, fileLength);

 // apply the ranges to the download info
 downloadInfo.InitializeRanges(requestedRanges);

 string etagMatched;
 int outcomeStausCode = 200;

 // validating the ranges specified
 if (!HeadersParser.ValidatePartialRequest(context.Request, downloadInfo, out etagMatched, ref outcomeStausCode))
 {
  // the request is invalid, this is the invalid code
  context.Response.StatusCode = outcomeStausCode;

  // show to the client what is the real ETag
  if (!string.IsNullOrEmpty(etagMatched))
   context.Response.AppendHeader("ETag", etagMatched);

  // stop the preoccess
  // but don't hassle with error messages
  return;
 }

 // user ID, or IP or anything you use to identify the user
 var userIP = context.Request.UserHostAddress;

 // limiting the download speed manager and the speed limit
 UserSpeedLimitManager.StartNewDownload(downloadInfo, userIP, DownloadLimit);

 // It is very important to destory the DownloadProcess object
 // Here the using block does it for us.
 using (var process = new DownloadProcess(downloadInfo))
 {
  // start the download
  var state = process.ProcessDownload(context.Response);

  // checking the state of the download
  if (state == DownloadProcess.DownloadProcessState.PartFinished)
  {
   // all parts of download are finish, do something here!
  }
 }
}

 
  • دانلود
جهت دانلود از این آدرس و یا این آدرس اقدام کنید.
کدهای این پروژه به صورت آنلاین در این آدرس در دسترس هستند.

چندین کانکشن همزمان برای دانلود در حالی که کاربر به 50KB/s محدود شده است

  • مشکلات احتمالی
یک مشکل که فعلا حل نشده است و مربوط به محدودیت دانلود اعمال شده است که ممکن است دقیق اعمال نشود, برای مثال اگر محدودیت 50KB/s را اعمال کرده باشید سرعت دانلود کاربر بین 30 تا 60 در نوسان خواهد بود.

  • کدهای استفاده شده از سایر نویسندگان
کلاس ThrottledStream جهت اعمال محدودیت در پهنای باند مصرفی. اینجا.
نسخه ابتدایی و قدیمی ZipHandler در زبان vb.net که چند سال پیش این ماژول ها بر اساس آن تبدیل و تهیه شد. اینجا.

 

نمایش صحیح متون فارسی در جهت چپ به راست (بخش دوم)

۱۳۹۰/۱۱/۰۵ ۱۷:۱۳ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۰/۱۱/۰۵ دسته بندی : ، ، ، 0

قبلا کدی را برای تصحیح نمایش صحیح متون فارسی در محیطهایی که فارسی یا یونیکد را پشتیبانی نمی کنند نوشته بودم. آن تکه کد مشکلاتی داشت که بر آن شدم تا مجددا کلاسی را برای انجام صحیح این کار تهیه کنم که مشکلات قبلی را نداشته باشد.
قبل از استفاده از این کلاس باید مطمئن باشید که کامپوننت یا برنامه مورد نظر شما از یونیکد پشتیبانی نمی کند. اما در صورتی که از یونیکد پشتیبانی کرد بهتر است که از راه حل یونیکد استفاده کنید.
در راه حل یونیکد که با استفاده از تابع CorrectPersinRtlToDisplayLtrUnicode در دسترس است کارکاکتر RTL Embedding را به ابتدای رشته اضافه می کند. وجود این کاراکتر سبب خواهد شد یا رشته مورد به صورت راست به چپ و درست نمایش داده شود و در عین حال نیز چپ چین باقی بماند (Aligned to left).
در صورتی که از عدم پشتیبانی یونیکد مطمئن هستید از تابع CorrectPersinRtlToDisplayLtr استفاده کنید. این تابع ترتیت کلمات در متون فارسی/انگلیسی را طوری جابجا می کند که متن راست به چپ بتواند به درستی در محیط چپ به راست نیز نمایش داده شود. توجه کنید متن تبدیل شده قابل برگشت نیست.
نکته مهم در مورد اعداد. به علت اینکه رفتار اعداد به RTL یا LTR بودن محیط وابسته است در برخی شرایط خاص امکان تصحیح نمایش آنها برای محیط چپ به راست وجود ندارد. این استثنا در صورتی رخ می دهد که عددی در ابتدای جمله و با فاصله از کلمه بعدی قرار بگیرد.
مثال: راست به چپ: 1 تست 2
1 تست 2
به هر ترتیب در صورت عدم وجود فاصله بعد از اولین عدد مشکلی پیش نخواهد آمد.
نکته: برای سهولت تابعی نیز برای تبدیل اعداد به معادل فارسی آنها و بالعکس که البته یونیکد نیز هستند تعبیه شده است. فراموش نشود که برای محیط یونیکد از تابع یونیکد استفاده کنید.

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

نتیجه اجرای کلاس تبدیل
دریافت کلاس و برنامه PersianLeftToRight از اینجا و یا اینجا
کدهای پروژه به صورت آنلاین از اینجا نیز قابل مشاهده است.

 

الگوریتم ژنتیک برای n وزیر و الگوریتم های جستجو

۱۳۹۰/۱۰/۲۰ ۲۲:۲۴ Salar Khalilzadeh https://plus.google.com/105397214522932500988 منتشر شده در تاریخ : ۱۳۹۰/۱۰/۲۰ دسته بندی : ، ، 7

چندی قبل برای یکی از همکاران روی پروژه الگوریتم ها کار کردیم که یکی مربوط به الگوریتم ژنتیک برای مسئله n وزیر است و دیگری الگوریتمهای جستجوی BFS , DSF و UCF است.
عملکرد تمامی قسمت ها توضیح داده شده و به صورت کامنت برای هر دستور نوشته شده است, همچنین سعی شده که کدها کمترین پیچیدگی رو داشته باشه تا برای دانشجو قابل درک بوده و مفید واقع بشه.
امیدوارم از این پروژه ها در جهت صحیح استفاده شده و مفید واقع بشه. زبان استفاده شده C# است.

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

دانلود الگوریتم ژنتیک برای n وزیر از اینجا یا اینجا
دانلود الگوریتمهای جستجوی BFS , DSF و UCF از اینجا یا اینجا

لینکهای مفید: