Meysam's Experiences

MeyEx ,محلی برای انتشار تجربیات من در زمینه های مرتبط با حوزه ی تولید نرم افزار

Meysam's Experiences

MeyEx ,محلی برای انتشار تجربیات من در زمینه های مرتبط با حوزه ی تولید نرم افزار

Meysam's Experiences

در زمینه ی تولید نرم افزار فعالیت دارم. نوشته های این بلاگ به طور خاص در مورد تمامی زمینه هایی که منتهی به تولید نرم افزار و یا تجربیاتی که در محیط کاریم کسب می کنم خواهند بود. [البته فعلا به دلیل مشغله های جانبی دیگر و داشتن مخاطب در آن حوزه ها, مطالب کمی غیر نرم افزار شده است!]
در این بلاگ سعی شده که مطالب به صورت تخصصی و دسته بندی شده منتشر شوند

تابلوی اعلانات
جدیدترین نظرات
  • Ali در ۳۱ تیر ۹۶، ۱۵:۴۷ ، نظرش اين بود كه:
    عالی

۸ مطلب با موضوع «کد نویسی» ثبت شده است

۱۵
دی
۹۳

  • میثم هوشمند
۳۰
آبان
۹۳

 

 

 

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

انگیزشو از حضور در کلاس اینطور تعریف کرد که: دیدم دوستانم ثبت نام کردند گفتم من هم میرم ببینم چی میشه؟

در پایان دوره بود که زودتر از همه تمرین هارو حل می کرد و الگوریتم های دیگه ای که به ذهنش رسیده بود را چک می کرد؛

خودش میگفت: " از اینکه این همه مدت بدون آشنایی درست و انگیزه ی کافی, با برنامه نویسی قهر بودم پشیمونه و الان دیگه دلم نمیخواد این رشته را عوض کنم"

 

این ها تجربه ی یکی از دانشجویان دوره کارشناسی که دوره ی آموزشی برنامه نویسی را گذرانده بود  و بعد از دوره هم چند نفر از دوستانش را تشویق به شرکت کرد.

 

دوره آموزشی ویژه مفاهیم برنامه نویسی

1. مهارت تعریف مسئله

2. مهارت تحلیل مسئله

3. طراحی راه حل

4. پیاده سازی راه حل به زبان برنامه نویسی

5. تسط بر مفاهیم پایه ای زبان های برنامه نویسی

 

در مورد این دوره بیشتر بدانید در ادامه مطلب ....

  • میثم هوشمند
۲۹
خرداد
۹۳

گاهی اوقات در گزارشات فیلدی قرار داد که مقدار آن از نوع Boolean می باشد. شاید بد نباشد که به ازای مقادیر True یک علامت "تیک" و به ازای مقادیر False یک علامت "ضربدر" نمایش دهیم. اما چگونه؟

مقادیری از این نوع که توسط به طور مثال سیکوئل سرور برگردانده می شوند به صورت کلمات "True" یا "False" می باشند.

برای این کار چند راه حل وجود دارد.

اول 

لازم هست که یک Formula Field روی فرم قرار دهیم. روی فیلد کلیک راست می کنیم و Edit Formula را انتخاب می کنیم و عبارت ذیل را در بخش فرمول می نویسیم. فرض می کنیم اسم فیلد Table.MyField هست.

If {Table.MyField } = true then 'P' else 'O'
سپس نام فونت این فیلد را برابر با
"Wingdings 2"
قرار می دهیم.
دوم 
مقدار فیلد مورد نظر را در کوئری دیتابیس به این صورت بخوانیم   (به طور مثال فیلد مورد نظر وضعیت فعال بودن کاربر را نشان می دهد)
SELECT
name,
family,
gender,
CASE
WHEN IsActive= 1   THEN char(110)
ESLE char(111) END
as 'IsActive'
FROM dbo.Users
سوم 
مانند راه اول است با این تفاوت که نیازی به تغییر نوع فونت فیلد نیست
تنها به جای حروفی که در فرمول نوشته شده باید کد اسکی کاراکتر های تیک و ضربدر را باید قرار داد. مانند عبارت ذیل:
If {Table.MyField } = true then CHAR(254)  else CHAR(168)

اگر در بین فونت های دیگر جستجو کنیم؛ شکل های جالبی برای فیلدهای گزارش می توانیم پیدا کنیم

اگر شما هم از این ترفند استفاده می کنید؛ به اشتراک بگذارید.

  • میثم هوشمند
۲۵
خرداد
۹۳

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

برای اینکه، این قسمت به صورت پیش فرض نمایش داده نشود باید در پنجره Property Window مقدار ToolPanelView  را برابر با  False  قرار دهید.

همچنین می توان عرض آن را تغییر داد.


نکته مهمی در این پست نیست، فقط اینکه من خودم در نت گشتم، منتهی همگی پاسخ ها به مخفی کردن دکمه مربوط به نمایش این ToolPanel اشاره داشتند.
حس کردم جای یک مطلب فارسی خالیست. به همین سادگی!!!!

  • میثم هوشمند
۰۸
ارديبهشت
۹۳

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

اگر علاقمند به یادگیری

Node.js

jQuery

BootStrap

SQL Server Analysis Service

WPF

C++

Assembly

Objective-C

و ... هستید؛ پیشنهاد می کنم سری کتاب های Succinctly را دریافت کنید.

  • میثم هوشمند
۲۴
بهمن
۹۲

طی هفته ی اخیر, مجبور بودم برای رضایت مشتری تن به ایجاد تغییر و اضافه کردن یک امکان جدید به نرم افزاری که با کدهای آن اصلا آشنایی نداشتم؛ بدهم. و اعتراف می کنم که قطعا این کار یکی از کابوس های هر برنامه نویس می تواند باشد. امروز زمانی که مراحل آخر کار را طی می کردم؛ به چند مشکل برخورد کردم ؛ که تصمیم گرفتم تجربه ی آن را برای شما هم بنویسم.

چند نکته که برای کد نویسی حتما باید رعایت بشود؛ در غیر اینصورت چند ماه بعد که به سراغ کدها بروید؛ به خون نویسنده ی آن تشنه می شوید.

1. نام گذاری صحیح متغیر ها, توابع و پارامتر ها

امروز در حال بررسی کد و در حقیقت مهندسی معکوس بودم که در عین ناباوری؛ متوجه شدم که تابعی با نام GetCustomerContracts مقداری از جنس boolean بر می گرداند. کار این تابع پر کردن یک combobox بود حاوی لیست قرارداد های یک مشتری, و در صورتی که این مشتری قرار دادی نداشت, مقدار false برگشت داده می شود.

به نظر من نامگذاری مثل HasCustomerContrast یا اسامی سوالی دیگری نیز؛ چندان مناسب این تابع نیستند؛ به این دلیل که در حقیقت این تابع باید تنها یک کار انجام دهد؛ تا از اسم آن مشخص شود که کاری که تابع انجام می دهد چیست؟

2. مدیریت صحیح خطا Error Handling

در این کدها چیزی که به وفور دیده میشد؛

بلوک

try

{

// some code;

}

catch

{

//some code;

}

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

شدیدا توصیه می کنم که حتما به این شکل استفاده بشود

try

{

// some code;

}

catch( Exception ex)

{

//some code;

// for example

MessaBox.Show(ex.Message);

}

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

3. نکته ی سوم در زمینه T-SQL است؛ امروز در حین دیباگ برنامه به مشکلی برخورد کردم؛ که تنها با نمایش پیام خطای شی Exception متوجه آن شدم.

مشکل این بود که نام دیتابیس در دستور select نوشته شده بود.

در نظر بگیرید

select id, name, registerdate from MyDataBase.dbo.Users

به طور کلی مشکلی نباید وجود داشته باشد. اما زمانی که این sp به یک محیط دیگر منتقل می شود و یا اینکه همان دیتابیس دچار تغییر نام می شود؛ این کوئری کار نخواهد کرد.

بنابراین همیشه این نکته را در نظر داشته باشید که نام دیتابیس ( که بعید نیست دچار تغییر شود؛ به دلایل مختلف) را در کوئری ها به کار نبرید.

بنابر این کوئری فوق به شکل ذیل صحیح و مطمئن تر خواهد

select id, name, registerdate from MyDataBase.dbo.Users

قوانین نام گذاری؛ رعایت اصول طراحی که در حالت کلی برای تسهیل امور هستند و همگی بر اساس دنیای واقعی الهام گرفته شده و مطرح شده اند؛ و همچنین در نظر گرفتن مواردی که ممکن است دچار تغییر شوند و باید از وابستگی به آن ها اجتناب کرد, می تواند به دوستی بیشتر بین شما و کد نویس قبلی کمک کند!

  • میثم هوشمند
۰۴
آذر
۹۰

چند روز پیش وقتی که یک گزارش را برای نمایش کاربران یک سیستم طراحی کردم و خواستم با Crystal Report پیاده سازی کنم،

هنگام معرفی گزارش مربوطه به Crystal Report Viewer با پیغام زیر مواجه شدم.

Unable to find the report in the manifest resources. Please build the project, and try again

که تا به حال با آن مواجه نشده بودم.

پس از کمی جستو به این جواب رسیدم.

در فایل myReport.cs در قسمت FullResourceName Property  نام کامل منبع اشتباه بود که باید به شکل ذیل تصحیح بشود.

Namespace+ClassName+.rpt

 

  • میثم هوشمند
۲۹
آبان
۹۰

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

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

حاصل کار، شد یک متد همراه با باگ، که توسط همکار محترم، خانم محمد باقری[]، تکمیل گردید، برای تشکر از ایشان، حاصل دسترنج ایشان را اینجا، ارائه کردم!!!

Code Snippet
  1. class JalaliDate
  2.   {
  3.       public static bool IsValidDate(string date)
  4.       {
  5.           Regex pattern = new Regex(“^\\d{4}/\\d{2}/\\d{2}$”);
  6.           Regex[] arrPattern = new Regex[] {
  7.               new Regex(“^\\d{4}/\\d{2}/\\d{2}$”),
  8.               new Regex(“^\\d{4}/\\d{2}/\\d{1}$”),
  9.               new Regex(“^\\d{4}/\\d{1}/\\d{2}$”),
  10.               new Regex(“^\\d{4}/\\d{1}/\\d{1}$”),
  11.               new Regex(“^\\d{2}/\\d{2}/\\d{2}$”),
  12.               new Regex(“^\\d{2}/\\d{2}/\\d{1}$”),
  13.               new Regex(“^\\d{2}/\\d{1}/\\d{2}$”),
  14.               new Regex(“^\\d{2}/\\d{1}/\\d{1}”)
  15.           };
  16.           int kabise = 1387;
  17.           int year = 0;
  18.           int mounth = 0;
  19.           int day = 0; bool flag = false;
  20.           for (int i = 0; i < arrPattern.Length; i++)
  21.           {
  22.               if (arrPattern[i].IsMatch(date))
  23.                   flag = true;
  24.           }
  25.           if (flag == false) return flag;
  26.           //جدا کننده تاریخ می تواند یکی از این کاراکترها باشد
  27.           string[] splitDate = date.Split(‘/’,‘-’,‘:’);
  28.           year = Convert.ToInt32(splitDate[0]);
  29.           mounth = Convert.ToInt32(splitDate[1]);
  30.           day = Convert.ToInt32(splitDate[2]);
  31.           if (mounth > 12 || mounth <= 0)
  32.               flag = false;
  33.           else
  34.           {
  35.               if (mounth < 7)
  36.               {
  37.                   if (day > 31)
  38.                   {
  39.                       flag = false;
  40.                   }
  41.               }
  42.               if (mounth == 12)
  43.               {
  44.                   int t = (year – kabise) % 4;
  45.                   if ((year – kabise) % 4 == 0)
  46.                   {
  47.                       if (day >= 31)
  48.                           flag = false;
  49.                   }
  50.                   else if (day >= 30)
  51.                       flag = false;
  52.               }
  53.               else
  54.               {
  55.                   if (day > 30)
  56.                       flag = false;
  57.               }
  58.           }
  59.           return flag;
  60.       }
  61.    }
  • میثم هوشمند