Meysam's Experiences

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

Meysam's Experiences

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

Meysam's Experiences

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

تابلوی اعلانات
جدیدترین نظرات
۲۵
خرداد
۹۳

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

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

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


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

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

"مطلبچه های مهندسی نرم افزار"

در حال حاضر هدف این سایت، تهیه ترجمه از پادکست‌های صوتی و تصویری (از سایت SE Radio یا دیگر منابع) در حوزه مهندسی نرم‌افزار است. 

نخست آنکه، اغلب افراد تسلطی که در خواندن متون انگلیسی دارند در درک مطلب شنیداری ندارند.

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

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

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

سری پادکست های سایت SE Radio برای اهالی مهندسی نرم افزار اگر آشنا هم نباشد؛ اما قطعا می تواند مفید فایده باشد؛

محمد علی بزرگ زاده در وب سایت "مطلبچه های مهندسی نرم افزار" , اقدام به ترجمه ی سری پادکست های سایت SE Radio  کرده است؛ که حقا کار بکری هست در زمینه ی تولید محتوای تخصصی فنی فارسی؛ البته اینجا منظور از تولید, تالیف شخصی نیست, اما به هر ترتیب بازگردان این سری پادکست ها به متن به زبان فارسی که قطعا همراه هست با دقت نظر های تخصصی در زمینه ی مهندسی نرم افزار] کاریست قابل تقدیر و توجه,

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

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

این روز ها داشتن یک تقویم شمسی خوب و کاربردی بر روی گوشی های هوشمند؛ به یکی از نیازهای اصلی اغلب استفاده کنندگان مبدل شده.

از این رو گروه smart-apps اقدام به تولید نرم افزار تحت موبایل "تقویم هوشمند پرند" نموده است؛

دوست خوبم مهرداد اندامی طراح این برنامه و یکی از دو موسس گروه smart-apps هست,

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

استقبال نسبتا خوبی که از این برنامه به عمل آمده؛ نوید خوبی هست برای پیشرفت های آتی؛

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

همچنین بررسی این برنامه در سایت appReview را مشاهده کنید؛

و در آخر سایت گروه smart-apps

صفحه ی اختصاصی تقویم هوشمند پرند

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

اگر تا به حال به سایت SlideShare.net مراجعه کرده باشید؛ قطعا از دیدن اسلایدهای حرفه ای آن از نظر طراحی و همچنین از نظر محتوای خوبی که در آن ها ارائه شده است لذت برده اید؛

شاید برای خیلی از مواقعی که نیاز به ارائه مطلبی داشته باشیم به این سایت مراجعه کنیم؛ 

حتما تا به حال پیش آمده است که بخواهید کل مجموعه ی تصاویر یکی از اسلایدهای آن را ذخیره کنید و برای این کار تک تک تصاویر را دریافت کرده باشید؛

 

خب دقیقا همین موقع هست که SlideShare'sSlidesGrabber از راه می رسد؛

 


آخرین به روز رسانی
1394/09/24


 

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

 

این نسخه ی آزمایشی نرم افزار هست که منتشر می شود؛ 

از کتابخانه ی HtmlAgility استفاده شده است؛

لطفا نظرات و ایرادات موجود در برنامه را جهت بهبود آن ارائه نمایید. با تشکر

 

به روز رسانی جدید

1402-09-12

نسخه 1.6 نرم افزار

 

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

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

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

Node.js

jQuery

BootStrap

SQL Server Analysis Service

WPF

C++

Assembly

Objective-C

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

  • میثم هوشمند
۱۷
فروردين
۹۳

در زمان پیاده سازی دیتابیس یک پروژه؛ چیزی که توجهم را به خود جلب کرد این بود که چهار فیلد ( InsertedBy, InsertDateTime, ModifiedBy, ModifyDateTime ) در تمامی جداول (98%) تکرار شده بود, طبیعتا ایجاد 232 فیلد (4 فیلد تکراری در 58 جدول) تکراری کار خسته کننده ای هست.

خب چرا از طریق یک داینامیک کوئری این کار را به صورت اتوماتیک انجام ندهیم؟

به این صورت که با استفاده از یک کرزر (Cursor) لیست جداول دیتابیس  پیمایش می شوند, سپس به ازای هر یک از جداول, با استفاده از دو کوئری ابتدا وجود فیلد مورد نظر بررسی می شود, و در صورت عدم وجود آن؛ کوئری اضافه شدن فیلد اجرا می شود.

به کد زیر دقت کنید:

USE My_DB
GO

DECLARE @TableName VARCHAR(30)
DECLARE @Query VARCHAR(MAX)
DECLARE AlterTable_Cursor CURSOR
FOR
SELECT SCHEMA_NAME(schema_id) + '.' + t.name
FROM sys.tables AS t
OPEN AlterTable_Cursor
FETCH NEXT FROM AlterTable_Cursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN

SET @Query = 'IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''InsertedBy'')
ALTER TABLE ' + @TableName + ' ADD InsertedBy int not NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''InsertDateTime'')
ALTER TABLE ' + @TableName + ' ADD InsertDateTime datetime not NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''ModifiedBy'')
ALTER TABLE ' + @TableName + ' ADD ModifiedBy int NULL

IF NOT EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE ''dbo.''+TABLE_NAME = ''' + @TableName + '''
AND COLUMN_NAME = ''ModifyDateTime'')
ALTER TABLE ' + @TableName + ' ADD ModifyDateTime datetime NULL
'
--PRINT @Query
EXEC(@Query)
FETCH NEXT FROM AlterTable_Cursor INTO @TableName
END
CLOSE AlterTable_Cursor
DEALLOCATE AlterTable_Cursor

توجه: می توان در صورت نیاز ابتدا ستون موجود را حذف و مجددا اقدام به ایجاد آن نمود؛

همچنین دقت داشته باشید در صورتی که جداول شما دارای رکورد باشند؛ برای ایجاد ستون هایی که Not Null می باشند؛ پیغام خطا صادر خواهد شد.

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

  • میثم هوشمند
۲۷
اسفند
۹۲

اگر شما هم برای پیدا کردن مقاله ای برای ارائه به استاد؛ تحقیق شخصی؛ و... به مشکل برخورد کرده اید

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

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

  • میثم هوشمند
۲۱
اسفند
۹۲

قابل توجه دوستانی که در حوزه ی تحلیل و مستند سازی نیازمندی های نرم افزار فعال هستند و همچنین عزیزانی که علاقمند به کسب اطلاعات بیشتر در این زمینه دارند؛

کتاب "روش کاربردی تحلیل نیازمندی های نرم افزار" می تواند یکی از بهترین گزینه های موجود برای مطالعه در این زمینه باشد.

چاپ اول این کتاب در زمستان 89 منتشر گردید

استاد ارجمندم جناب آقای مهندس مهدی خواجه - که درس "مهندسی نرم افزار (1)" را در مقطع کارشناسی در محضر ایشان گذراندم - این کتاب را به من معرفی نمودند؛ و حقَّا که کتاب کابردی و ارزشمندی می باشد.

جهت کسب اطلاعات بیشتر در مورد کتاب و نحوه ی تهیه ی آن و همچنین دریافت فهرست کتاب می توانید به اینجا مراجعه نمایید.

همچنین از دوستانی که این کتاب را - حتی بخشی از آن را - مطالعه کرده اند؛ دعوت می کنم نظراتشان را در خصوص این کتاب کامنت بگذارند؛

متشکرم از مشارکت شما

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

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

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

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

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

  • میثم هوشمند
۱۵
دی
۹۲

قصد دارم دهه ی آخر بهمن مجددا شروع کنم

  • میثم هوشمند