۷۶ مطلب با کلمهی کلیدی «آموزشگاه آنلاین» ثبت شده است
توابع توسعه
بسم الله الرحمن الرحیم
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
در بعضی مواقع ممکن است شما کلاسی را داشته باشید که نتوانید از آن ارث ببرید و یا تغییری در آن ایجاد کنید راه حل چیست؟
راه حل استفاده از توابع توسعه است در تعریف این توابع باید اولا static باشند و دوما اولین پارامتر ورودی با کلمه کلیدی this شروع شود (فقط اولین پارامتر) مثال:
static class MyExtensionMethodes
{
public static string PrintString(this int input)
{
return input.ToString();
}
}
برای روشن تر شدن مطلب یک مثال را بررسی خواهیم کرد فکر کنید که یک کلاس با نام Car داریم و این کلاس را اجازه دسترسی به آن نداریم به عبارتی نمی توانیم ان را تغییر دهیم کلاس ما به صورت زیر تعریف شده است
public class car
{
public void PrintName(String name)
{
MessageBox.Show(name);
}
}
ادامه مطلب...
آموزش Lambda
بسم الله الرحمن الرحیم
بسم الله الرحمن الرحیم
مشاهده تمامی آموزش های دوره LINQ
آموزش LINQ
در این بخش قصد دارم به معرفی عبارات لامبدا بپردازم انشالله که مفید واقع گردد.
در حالت عادی ما یک تابع را به صورت زیر تعریف می کنیم
public void Load(object parameter)
{
.....
}
این تابع دارای بخش های زیر است:
- میدان دید تابع public
- خروجی تابع void
- نام تابع load
- پارامتر ورودی تابع parameter
- بدنه تابع
حال در تابع هایی که به وسیله عبارت لامبدا تعریف می شوند بخش های زیر فقط وجود دارد:
- پارامترها
- بدنه تابع
(int x) => x + 1;
ادامه مطلب...
معرفی برخی از ابزارهای ALT.Net
بسم الله الرحمن الرحیم
آموزش ابزارهای ALT.Net
این مطلب را برای دوستان تیم طراحی و تست قرار دادم انشالله مفید واقع شود
معرفی برخی از ابزارهای ALT.Net
به ابزارهایی که جهت افزایش کیفیت و ابداع روش های جدید جهت افزایش بهره وری کار تولید می شوند را ALT.NET می گویند.
ابزارهایی که بسیار در تولید و توسعه نرم افزار کارا خواهند بود را معرفی کرده ام و البته در هر مورد چند نمونه ذکر کردم اما مطما تنها کافی است که بهترین را از دیدگاه خود و نیاز های خود انتخاب کنید و در طراحی خود از آن بهره ببرید من شخصا از هر مجموعه تنها یک ابزار را انتخاب و با آن کار می کنم اما بدلایلی چون شاید انتخاب من انتخاب مناسبی برای شما نباشد از مشخص نمودن ابزارهایی که از آنها استفاده می کنم خود داری کرده ام و انتخاب را به عهده خودتان قرار داده ام البته شاید با توجه کردن به مطالب آموزش داده شده در این وبلاگ به انتخاب من نیز پی ببرید:
برنامه های آزمایش واحد
NUnit
xNUnit
فریمورک های Mock
Moq
Rhino Mocks
فریمورک های واگذاری مسئولیت (inversion of control)
Ninject
Autofac
ابزارهای کنترل یکپارچه گیفیت نرم افزار که با عنوانContinuous Integration شناخته می شوند
Cruise Control
Team City
ابزارهای ORM
NHibernate
Subsonic
Entity Framework
توسعه تست محور
بسم الله الرحمن الرحیم
آموزش TDD - توسعه تست محور
این مطلب را برای دوستان تیم طراحی و تست قرار دادم انشالله مفید واقع شود.
توسعه تست محور
برای تست نرم افزار روش های متعددی وجود دارد، من شخصا در پروژه ها از روش Test Driven Development (TDD) یا به عبارتی توسعه تست محور استفاده می کنم این روش در واقع از تفکر Agile منشات می گیرد.
متاسفانه روش TDD و ابزار های موجود در این روش به خوبی با Asp.net Web Form سازگار نیست و ولی باز می توان از این روش استفاده کرد.
دو نوع از این ابزار ها را معرفی خواهم کرد:
ابزار های آزمایش واحد (Unit testing tools)
همانطور که از نام آن مشخص است اجازه می دهد تا کلاس ها، متدها و بخش های مختلف نرم افزار را به صورت جدا بررسی کنید.
اما نکته ای که وجود دارد این است که باید لایه های نرم افزار از هم جدا باشند و در واقع وابستگی به صورت صحیح باشد مبحث وابسگی را قبلا توضیح دادم در صورتی که در این زمینه اطلاعی ندارید مبحث تزریق وابستکی و سایر مباحث Design Pattern را مطالعه نمایید تا بتوانید از این ابزار استفاده نمایید.
متاسفانه بسیاری از دوستان در طراحی نرم افزار به گونه ای عمل می کنند که نرم افزار را نمی توان به صورت بخش های جدا تقسیم و تست نمود که این باعث مشکلات زیادی خواهد شد.
مخصوصا Asp.net Web Form کار ها به دلیل ماهیت خود این تکنولوژی ساختار را به گونه ای تعریف می کنند که بیشتر مواقع منطق را در Event ها قرار می دهند! به هر حال.
ابزار های خودکار سازی محیط
در واقع این نرم افزارها رفتار کاربر را برای کار با نرم افزار شما شبیه سازی می کنند از این نرم افزار ها نیز می توانید در تکنولوژی های مختلف استفاده کنید ولی به محض تغییر ساختار برنامه یا هر رخداد دیگری که باعث شود در شناسایی نرم افزار تغییری ایجاد شود باید مجددا ساختار جدید را معرفی نمایید.
روش BDD) Behavior Driven Design) یا به عبارتی توسعه رفتار محور آخرین روش موجود برای تست نرم افزار است که این روش نیز زیر مجموعه تفکر Agile است.
پیکربندی Database Mail وارسال ایمیل از طریق Database Mail
بسم الله الرحمن الرحیم
آموزش DataBase Mail
پیکربندی Database Mail وارسال ایمیل از طریق Database Mail
در این مقاله قصد داریم یک Database Mail راه اندازی کنیم و بهتر است دوستانی که باDatabase Mail آشنایی ندارند ابتدا معرفی و تفاوت آن را با SQLMail که قبلا در مورد آن مطلبی را قرار داده ام بررسی کنند.
برای شروع کار ابتدا باید Database Mail را پیکر بندی کنیم، در این مرحله ابتدا یک profile ایجاد می کنیم
ابتدا SSMS (اسکیوال سرور) را باز می کنیم در بخش سمت چپ Object Explorer بر روی Management کلیک می کنیم و از گزینه های زیر مجموعه آن بر روی Database Mail کلیک راست می کنیم و گزینه Configuration Database Mail را انتخاب می کنیم
ادامه مطلب...تفاوت بین SQLMAIL و Database Mail
بسم الله الرحمن الرحیم
این مبحث را برای دوستان تیم طراحی پایگاه داده قرار دادم انشالله مفید واقع شود
تا کنون کسی را ندیده ام که اولا تفاوت این دو را بداند (در بحث های انجام شده در تمامی سایت هایی که بررسی کرده ام؛ هیچ بحثی در این مورد وجود ندارد!) و دوما هیچ کس از این روش برای ارسال ایمیل استفاده نمی کند مجددا در هیچ مطلب فارسی این مبحث مطرح نشده است به همین دلیل این مطلب را قرار داده تا شاید دوستان خارج از مجموعه با مباحث این چنینی بیشتر آشنا شوند
Database mail یک مفهوم جدید است که در SQL Server 2005 مطرح شد و جایگزین SQLMail در نسخه های قبل تر Sql گردید
Database Mail چندین مزیت و پیشرفت بر SQLMail دارد. Database Mail بر اساس SMTP (Simple Mail Transfer Protocol) و همچنین خیلی سریعتر و قابل اعتماد تر از SQLMail است و SQLMail بر اساس MAPI (Messaging Application Programming Interface) است.
ادامه مطلب...تزریق وابستگی و DDD
بسم الله الرحمن الرحیم
آموزش تزریق وابستگی
با توجه به اینکه چندین مطلب در مورد DI قرار دادم اما با توجه به مطلبی با عنوان معرفی متدولوژی DDD که برای دوستان قرار دادم و مثالی را در آن مطرح کردم و تصمیم گرفتم چند نکته جدید در بحث DI را در ادامه مثال مطلب DDD خدمتتان عرض کنم
همه با DI آشنا هستیم (در صورت عدم آشنایی لطفا مطالب قبلی را مطالعه نمایید) در مثال مطرح شده در مطلب DDD کدی به صورت زیر داشتید (پیشنهاد می کنم مطلب مربوطه را با عنوان معرفی متدولوژی Domain Driven Design برای درک هر چه بهتر این مطلب مطالعه فرمایید هر چند در صورت عدم مطالعه آن بحث زیر را متوجه خواهید شد) :
public class Account
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
public class People
{
public Account account { get; set; }
public int Id { get; set; }
public string FullName { get; set; }
public string NationalCode { get; set; }
}
public class Report
{
public People people { get; set; }
public int Id { get; set; }
public string Text { get; set; }
public DateTime RegisterDate{ get; set; }
}
ادامه مطلب...
معرفی WCF
بسم الله الرحمن الرحیم
آموزش WCF
در این بخش مطلبی را جهت کار با WCF قرار خواهیم داد تا انشالله تمامی دوستان با این مبحث آشنا شوند.
WCF چیست؟
WCF ترکیبی از ویژگی های Web Service, Remoting, MSMQ ،COM+ است. WCF یک پلتفرم مشترک جهت برقراری ارتباط برای تمامی تکنولوژی های Net. است، که در واقع قسمتی از Net 3. است.
تفاوت بین WCF و Web service
در web service ما باید به کلاس خاصیت [WebService] را اضافه کنیم.
در WCF ما باید به کلاس خاصیت [ServiceContract] را اضافه کنیم.
در وب سرویس ما WebMethod را به متد اضافه می کنیم.
در WCF ما OperationContract را به متد اضافه می کنیم.
برای serialization در وب سرویس از System.Xml.serialization استفاده می کنیم.
برای serialization در WCF از System.Runtime.Serialization استفاده می کنیم.
ما می توانیم یک وب سرویس را در IIS هاست کنیم.
ما می توانیم یک WCF را در WAS (Windows Activation Service), self-hosting ,Windows Service ,IIS هاست کنیم.
ساخت یک پروژه WCF
مسیر زیر را جهت ساخت یک پروژه طی کنید:
Start Menu >> All Programs >> Microsoft Visual Studio 2010 >> Microsoft Visual Studio 2010
File >>New >> Project
نوع پروژه را NET Framework 4. و گزینه WCF Service Application را از لیست WCF انتخاب می کنیم.
در پروژه جدید ایجاد شده در قسمت Solution Explorer شما باید فایل های Service1.svc و IService1.cs را مشاهده نمایید.
فایل IService1.cs را باز کنید.
شما در این فایل کدهای ServiceContract, OperationContract , DataContract را مشاهده می کنید.
Service Contract
Service Contract خاصیتی است که بر روی interface اعمال می شود و تعیین می کند که کلاینت چه فعالیتهایی را روی سرویس می تواند انجام دهد.
Operation Contract
Operation Contract خاصیتی است که بر روی متدهای یک اینترفیس تاثیر می گذارد و معین می کند که چه متدهایی در اختیار قرار خواهد گرفت.
Data Contract
Data Contract تعیین می کند که چه data types از طریق سرویس انتقال داده می شوند Data Contract برای تعریف کلاس استفاده می شود و DataMember برای تعریف Properties ها استفاده می شود.
ادامه دارد...
متدولوژی Domain Driven Design
بسم الله الرحمن الرحیم
این مطلب را برای دوستان طراح قرار دادم انشالله مفید واقع شود
متدولوژی Domain Driven Design
قبل از پرداختن به متدولوژی مربوطه می بایست با چند مبحث آشنا شویم.
Domain Model نمایی کلی از هر آنچه در سیستم می گذرد که قلب یک برنامه MVC است که قسمت های دیگر مثل View,Controller فقط وظیفه ایجاد ارتباط با این قسمت را دارند.
یک Domain Model شامل موارد زیر است:
اجزای سی شارپ مانند کلاس ها، Structها و همانند آنکه در مجموع به آن Domain type گفته می شود.
عملیاتی که در Domain Model انجام می شوند به وسیله متدهایی که در Domain Type تعریف شده اند انجام می پذیرند.
زمانی که نمونه ای از یک Domain Type را که نمایانگر موجودیتی است ایجاد می کنید، در حقیقت در حال ایجاد یک Domain Object هستید.
یک روش خوب برای ایجاد Domain Model ایجاد یک پروژه از نوع Class Library تنها برای Domain Model است بدین ترتیب می توان از قسمت های دیگر پروژه به پروژه ی Domain Model ارجاع داشت.
در Asp.Net MVC سه قابلیت برای کار با Domain Model وجود دارد:
Model Binding: همان ویژگی که در View از آن استفاده می کنید. (ارسال و دریافت پراپرتی ها به صورت یک مدل)
Model Metadata:روشهایی مانند [Display] که در مدل از آن استفاده می کنید.
Validation: اعتبارسنجی که در مدل انجام می دهید.
مدل کردن یک Domain
مدل کردن یک Domain یا Domain Modeling، فرایندی است که در طی آن اهداف و نیازمندی های پروژه شناسایی می شود.
ادامه مطلب...برخی مشکلات تکنولوژی Asp.Net Web Forms
بسم الله الرحمن الرحیم
مطلبی را برای دوستان عزیز در تیم های توسعه و طراحی وب قرار دادم تا با برخی مشکلات مطرح Asp آشنا شوند و همچنین این مشکلات نیز از سویی در MVC حل گردیده و نتیجه آن این است که مطلب زیر معایب Asp و از سویی مزیتهای MVC می باشد انشالله مفید واقع شود.
برخی مشکلات تکنولوژی Asp.Net Web Forms
View State
از View State برای نگه داری وضعیت صفحه در هنگام رد و بدل شدن درخواست و پاسخ بین کلاینت و سرور استفاده می شود. این فیلد به صورت مخفی است و گاهی به دلیل فضای زیادی که اشغال می کند مشکلاتی را به وجود می آورد کسانی که با این تکنولوژی کار کرده اند حتما مثال هایی در ذهن دارند، حجم زیاد این فیلد باعث از بین رفتن پهنای باند و طولانی شدن زمان بارگذاری صفحه می شود
Page Life Time
زمان حیات هر صفحه متفاوت استو گاهی برای اجرای یک درخواست روالهای زیادی فراخوانی می گردد که این موضوع باعث طولانی شدن زمان بارگذاری صفحه می شود و همچنین کد نویسی آن را پیچیده می کند
ادامه مطلب...تاریخچه برنامه های مبتنی بر وب
بسم الله الرحمن الرحیم
تاریخچه برنامه های مبتنی بر وب
بازه انتشار |
نام تکنولوژی |
مزایا |
معایب |
وقتی به دنیا آمدم |
Common Getway Interface (CGI) |
· آسان · انعطاف پذیر · گزینه اول وآخر |
برنامه خارج از وب سرور اجرا می شود و به ازای هر درخواست یک پروسه ایجاد می کند |
زمانی که ما شرکتی هنوز نداشتیم (کودک بودیم) |
Microsoft Internet Database Connector |
در وب سرور اجرا می شود |
فقط واسطه ای که اجابزه انجام دستورات متداول SQL را می دهد |
1996 (زمانی در حال فراگرفتن علوم کامپیوتر بودیم) |
Active Server Page (ASP) |
چند منظوره |
کامپایل وتفسیر دستورات در زمان اجرا کدهای در هم آمیخته (مثل سالاد فصل) |
2002-2003 (شروع کار به صورت مبتدی) |
Asp.Net Web Form 1.0/1.1 |
· کدهای کامپایل شده · کنترل هایی که وضعیت خود را نگه می دارند · امکانات زیاد و زیر ساخت قدرتمند · دیدگاه جدیدی از برنامه نویسی شی گرا |
مصرف زیاد پهنای باند کدهای HTML غیر بهینه سخن بودن تست کد |
2005(تاسیس اولین شرکت) |
Asp.Net Web Form 2.0 |
|
|
2007 (فعالیت به صورت حرفه ای) |
Asp.Net Ajax |
|
|
2008 (تغییر حوزه کاری شرکت ) |
Asp.Net Web Form 3.5 |
|
|
2009 (فعالیت در حوزه و شرکت جدید) |
Asp.Net MVC 1.0 |
|
|
2010 (فراهم کردن بستر و آموزش نیروها) |
Asp.Net Web Form 4.0 Asp.Net MVC 2.0 |
|
|
2011 (به دنبال ایجاد زیرساخت ) |
Asp.Net MVC 3.0
|
|
|
2012 (فراهم کردن بستری حرفه ای) |
Asp.Net MVC 4.0 Asp.Net Web Form 4.0 |
|
|
شد آنچه شد |
کار با Ninject
بسم الله الرحمن الرحیم
آموزش dependency injection
این مطلب را برای تیم طراحی قرار دادم انشالله دوستان این تیم از آن استفاده نمایند.
چرا Ninject مفید است؟
بخش اعظمی از دست آوردهای به وجود آمده در حوزه نرم افزار از نسخه ابتدایی منتشر شده بدست می آید.
بیشتر زمان سرمایه گذاری شده در بخش تحلیل بعد از شروع به کار نرم افزار هزینه می شود.
باعث می شود تغییرات نرم افزار شما بسیار ساده تر انجام شود.
بعد از استفاده spring.net به مدت طولانی در asp.net به دنبال یک روش ساده تر و سریعتر و نه روشی بر پایه تریق وابستگی به صورت xml بودم. برای برنامه های MVC4 در نهایت به Ninject رسیدم چون رویکرد آن XML ای نیست و ساده است و استفاده از آن راحت است.
چطور تزریق کننده وابستگی را انتخاب کنیم؟
هر تزریق کننده مزایا و معایب خود را دارد و یک سری ویژگی را با خود به همراه دارد.
انتخاب یک تزریق کننده بستگی به مواردی دارد که شما بیشتر نیاز دارید دارد و این موضوع کاملا قابل بررسی است.
Ninject یک تزریق کننده متن باز است که برای NET. به وسیله Nate Kohari تولید شده است و یک سری ابزار مناسب به همراه دارد که همچنین ابزارهایی نیز برای MVC3 در آن قرارداده شده است. به هرحال، اگر شما هم مثل من به دنبال راه جدید هستید Ninject را دوست خواهید داشت.
Design Patterns و Dependency Injection
بسم الله الرحمن الرحیم
آموزش dependency injection
امروزه تمرکز بیشتری از گذشته بر روی استفاده مجدد از کامپوننت های موجود و ارتباط بین کامپوننت های مستقل به شکل یک معماری منسجم مطرح است.
اما این ارتباط در انجام وابستگی می تواند به دلیل اندازه نرم افزار و افزایش پیچیدگی باعث ایجاد ترس شود. یک راه برای کاهش تکثیر وابستگی استفاده از تزریق وابستگی یا به اصطلاح Dependency Injection که به صورت مختصر (DI) است که اجازه می دهد یک شی را به یک کلاس تزریق کنید بجای اینکه در کلاس خود شی ایجاد شود، تکثیر وابستگی با تزریق بسیار متفاوت است وقتی یک شی را می سازید تکثیر می کند اما تزریق اینطور نیست کمی اگر صبور باشید آن را نیز فرا خواهید گرفت.
استفاده از یک کلاس کارخانه یکی از راه حل های موجود است. هنگامی که یک جزء، (Component) یک نمونه خصوصی از کلاس دیگر را می سازد، آن مقدار دهی منطقی می شود درون آن جزء، این مقدار دهی منطقی بندرت خارج از ساخت جزء قابل استفاده است بنابراین برای هر کلاسی که نیاز به این نمونه دارد باید فرایند ساخت تکرار گردد (اضافه کردن سربار به سیستم قابل توجه دوستان طراح وب).
برای مثال اگر کلاس Foo یک شی از کلاس Bar بسازد و نمونه ای از کلاس Bar نیاز به چندین مقدار دهی داشته باشد و برای هر نمونه متفاوت باشد، کلاس های دیگر که نمونه ای از کلاس Bar را می سازند مجبورند نمونه ای با مقداری یکسان دوباره بسازند! (توضیح دادن آن کمی پیچیده است انشالله در مثال ها بیشتر متوجه خواهید شد.)
توسعه دهندگان کارهای تکراری و خسته کننده ای دارند و هنوز بیشتر توسعه دهندگان کارهایی شبیه رفع وابستگی و ساخت اشیا را به صورت دستی انجام می دهند. وضوح وابستگی می تواند حل کردن وابستگی های یک شی یا نوع را توصیف کند.
ساخت یک پروژه MVC
بسم الله الرحمن الرحیم
این دوره آموزشی دارای پیش نیاز می باشد، برای مطالعه پیش نیاز این دوره لطفا مقاله "آموزش WebApi" مطالعه کنید.
مشاهده تمامی آموزش های دوره آموزش Web API
آموزش Web API– سطح پیشرفته
بخش اول– آموزش Web API و ASP.NET MVC و RESTfull
آموزش Web API
برای دوستان عزیز که در تیم های توسعه وب MVC فعالیت می کنند مطلبی را آماده کردم که انشالله مفید واقع شود البته این مطلب برای دوستانی مفید خواهد بود که تازه به جمع شرکت اضافه شده اند و هنوز به MVC مسلط نیستند.
البته دوستان لطفا قبل از شروع به خواندن این مطلب، مطلبی را که در همین بخش با عنوان معرفی Web Api قرار داده ام را مطالعه کنید.
خوب از آنجا که همه دوستان عزیز تیم های توسعه وب Net. با VS 2012 کار می کنند این مثال را با VS 2012 انجام می دهیم برای شروع یک پروژه جدید به صورت Internet Application ایجاد می کنیم.
Entity Framework
ما از EF به صورت Code First برای Data Model استفاده خواهیم کرد. EF Code First اجازه می دهد تا جداول پایگاه داده را تولید کنیم با چیزی بیشتر از چند (Plain Old CLR Objects (POCO. به علاوه EF به ما اجازه می دهد تا از LINQ to Entities و Lambda expressions استفاده کنیم که باعث می شود صدور فرامین و کوئری ها آسان تر گردد.
ادامه مطلب...بهینه سازی کوئری
بسم الله الرحمن الرحیم
بخش های ابتدایی این مقاله مباحث تئوری خواهد بود، باتوجه به پیشنهاد دوستان یک مثال کامل به همراه مطالب تئوری لازم را در این مثال بیان نموده ایم که می توانید از آن نیز استفاده کنید.
برای دوستان عزیز که در تیم طراحی پایگاه داده SQL فعالیت می کنند مطلبی را آماده کردم که انشالله مفید واقع شود.
برای اینکه بفهمید چطور می توانید یک کد اسکیوال با کارایی مناسب بنویسید نیاز است که درک کنید که کدهای بهینه چطور کار می کنند.
بهینه ساز های کوئری اسکیوال بهینه سازی را بر مبنای هزینه انجام می دهند.
این آنالیز ها یکی از روش های اجرایی انتخاب شده است برای کوئری مشخص، تخمین زدن هزینه هر کدام از این روش ها و انتخاب روشی که کمترین هزینه در بین گزینه های مورد نظر را داشته باشد
درواقع با توجه به اینکه بهینه ساز کوئری نمی تواند هر طرح ممکن را برای هر کوئری در نظر گیرد
این عملا انجام یک فعالیت متعادل بر پایه ی هزینه است که درنظر گرفتن دو هزینه یکی هزینه یافتن روش بالقوه و دیگری هزینه خود روش.
ادامه مطلب...حذف کانکشن های یک دیتابیس
بسم الله الرحمن الرحیم
برای دوستان عزیز که در تیم طراحی پایگاه داده SQL فعالیت می کنند این کد بسیار کارا خواهد بود.
برای اینکه شما بتوانید یک پایگاه داده را Restore کنید می بایست ابتدا تمامی Connection های آن را حذف کنید برای این فرایند کافی است که دستور زیر را بر روی پایگاه داده خود اجرا نمایید (بجای MyDATABASE نام پایگاه داده خود را وارد نمایید). البته این مشکل مربوط به نسخه های قدیمی SQL می باشد.
اما به هر حال بسیاری از مواقع شما نیاز دارید تمامی Connnection های فعال اسکیوال سرور را حذف کنید. برای این کار کافی است تکه کد زیر را بروی دیتابیس مورد نظر خود اجرا کنید.
ادامه مطلب...