CSCIENCE

CSCIENCE

۲۵ مطلب در شهریور ۱۳۹۲ ثبت شده است

تو این پست سیشارپ رو به متلب متصل خواهیم کرد، اما قبل شروع ذکر چند نکته ضروریست:
- حتما نرم افزار متلب روی سیستم باید نصب باشه
- حتما از dotNET framework 3.5 باید استفاده کنید

حالا اینی که میگیم چجوریه؟!!
- پروژه جدید ایجاد کنید
- از پنجره solution explorer روی Refrences کلیک راست کنید و گزینه add reference کلیک کنید
- وارد شاخه COM بشید
- آیتم Matlab Application را پیدا کنید و به پروژتون اضافش کنید
- داخل کلاسی که می خواین از شی متلب استفاده کنید کد زیر رو به assembly هاش اضافه کنید

using MLApp;
- اکنون برای دسترسی به متلب کافیه یک نمونه از کلاس MLAppClass ایجاد کنید
- بعد از ایجاد این نمونه با متد هایی که چند خط بعد توضیح میدیم کاراتونو انجام بدید

متد execute:
آرگومان این متد یک string خواهد بود که همان کد متلب است و متلب آن را اجرا می کند

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

متد PutFullMatrix
مواقعی که قراره یک آرایه یا ماتریس (آرایه دو بعدی) بفرستید به متلب، از این متد استفاده می کنید که آرگومان های این متد از این قرارند:
string name: نام آرایه در محیط متلب
string Workspace: نام محیط کار متلب
Array pr: ماتریس قسمت حقیقی اعداد
Array pi: ماتریس قسمت موهومی اعداد

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

خب تا اینجا هم دیدیم که چجوری ورودی بفرستیم فقط یه گام دیگه مونده که اونم گرفتن خروجیه.

متد GetWorkspaceData  
از اسمش معلومه که می خواد چیکار کنه پس مستقیم میریم سراغ آرگومان ها
string Name: اسم متغیر مورد نظر در متلب
string Workspace: محیط کار مورد نظر
out object pdata: شئ خام برای نسبت دادن خروجی

توضیح بیشتر:
آرگومان اول مثل متد قبلیه
آرگومان دوم هم همینطور
آرگومان سوم یک object که باید اولا null باشه و دوما تو متد پشتش باید واژه out نوشته بشه. یه نکته اینجا هست، اینکه برنامه نویس خودش باید بدون خروجی متلب چه جنسی داره تا بعد اجرای این متد بتونه object مربوطرو typecast کنه و ازش استفاده کنه.


امیدوارم توضیحات بالا مفید واقع بشن. اگر شد یه مثال هم برای دانلود میذارم تا بیشتر جنبه کد نویسیشو ببینید. اگه سوالی داشتید تو بخش نظرات بپرسید.

۰ موافقین ۰ مخالفین ۰ ۰۵ شهریور ۹۲ ، ۰۰:۴۴
cscience

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

در این پست قصد دارم راهی رو معرفی کنم که بشه از قدرت زبان سیشارپ و امکانات و سادگی پرولوگ به صورت همزمان استفاده کرد. با این روش هرجای برنامه رو میشه با زبانی نوشت که عملکر بهتری داره و در کل برنامه‌ای با کارایی و حجم مناسب ایجاد کرد. توضیحات کامل چگونگی کار رو توی این فایل ppt آوردم.
در پست‌های بعدی سعی میکنم یک برنامه‌ی نمونه هم قرار بدم تا بیشتر آشنا بشید. اگر سوالی هم داشتید در بخش نظرات بپرسید.
۲ موافقین ۰ مخالفین ۰ ۰۵ شهریور ۹۲ ، ۰۰:۳۵
cscience
یادمه از وقتی SL یا همون Silverlight شروع کردم، خیلی دوست داشتم بتونم اونو توی وبلاگ هم استفاده کنم. چند بار هم تلاش کردم ولی به نتیجه نرسیدم. خلاصه گذشت و وبلاگ هم که حدود یک سال ساکت بود تا الان که دوباره شروع کردم به نوشتن. دیشب نمیدونم چی شد که جستجوهای اینترنتیم به قرار دادن SL توی وبلاگ رسید و به طور خیلی جالب یه لینک از Code Project دیدم که توضیح داده بود.
به نظرم کار خوب و کاربردی‌ایه و میتونه امکانات خوبیو به وبلاگ اضافه کنه. به همین دلیل تصمیم گرفتم اینجا هم این روشو به پارسی روان بگم.

مرحله 1. Dropbox Account
برای میزبانی پروژه SL باید یه اکانت Dropbox بسازید. اکانت های مجانیشم کفایت میکنه.

مرحله 2. SL Project
برنامه SLتون رو با خیال راحت بنویسید و هرچه‌قدر خواستین رو سیستمتون تستش کنید که مشکل اجرایی نداشته باشه.

مرحله 3. آپلود فایل های لازم
وقتی پروژه SL تحت ASP بسازید بعد از اینکه Build میشه، توی فولدر پروژه این موارد رو خواهید دید:
- فولدر ClientBin
- فایل های
- YourprojectTestPage.html
- Silverlight.js
- Web.config
کاری که باید انجام بدین اینه که دقیقا همینارو آپلود کنید توی فولدر Public اکانت Dropbox.
بعد از آپلود اگر فایل TestPage.html رو باز کنید می‌بینید که App به نمایش در می‌آد.

مرحله 4. قرار دادن فایل SL در یک صفحه HTML
با استفاده از کد HTML زیر، می‌تونید Appتون رو تو هر صفحه‌ای خواستین قرار بدین فقط آدرس و اندازه‌های App خودتون رو در قسمت‌های src و height و width بنویسید.

<iframe height="300" src="http://dl.dropbox.com/u/8050878/silverlight-app/hellosilverlight/HelloSilverlightTestPage.html" width="400">
<h3>Silverlight not loaded</h3>
</iframe>


۰ موافقین ۰ مخالفین ۰ ۰۴ شهریور ۹۲ ، ۰۱:۴۷
cscience
مقدمه‌ای بر Pi-Calculus

Pi-Calculus ابزاریست برای مدلسازی سیستم‌هایی که در ارتباط همگام با یکدیگر هستند و به صورت موازی اجرا می‌شوند

فایلی که برای دانلود قرار داده‌ام، فایلی است که برای درس طراحی نرم‌افزار پیشرفته ارائه داده‌ام.
امیدوارم مفید واقع گردد.

۰ موافقین ۰ مخالفین ۰ ۰۴ شهریور ۹۲ ، ۰۱:۴۴
cscience

منطق زمانی یا Temporal Logic یک نوع تعمیم منطق کلاسیکه که توی مدل‌های خودش زمان رو هم دخیل کرده. به عبارت دیگه با این منطق میشه گزاره‌هایی رو مدل کرد که با تغییر زمان، ارزش درستی اونا هم تغییر می‌کنه.

به عنوان یک مثال ساده، جمله‌ی
هم اکنون باران می‌بارد
در حال حاضر ارزش درست داره اما ممکنه 1 ساعت بعد دیگه جمله‌ی درستی نباشه.

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

برای اینکه در مورد منطق زمانی بیشتر بدونید این فایل رو دانلود کنید. منابع زیادی توی اینترنت وجود داره. من بخاطر اینکه باید این مطلبو سر کلاس ارائه می‌دادم منابع مختلفیو دیدم و از نظرم این فایل راحت‌تر و روون‌تر گفته بود.
۰ موافقین ۰ مخالفین ۰ ۰۴ شهریور ۹۲ ، ۰۱:۴۲
cscience
دقت یا سرعت؟

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

  • نوع double: این نوع داده، محاسبات را در مبنای 2 انجام می‌دهد، حدود 14 تا 15 رقم اعشار دقت دارد و بازه‌ی عددی حدود 324-^10 تا حدود 308^10 را در بر می‌گیرد (مثبت و منفی).
  • نوع decimal: این نوع داده، محاسبات را در مبنای 10 انجام می‌دهد، حدود 28 تا 29 رقم اعشار دقت دارد و بازه‌ی عددی حدود 28-^10 تا 28^10 را دربر می‌گیرد (مثبت و منفی).
این نکته از آن جهت اهمیت دارد که:
هنگامی که در محاسبات دقت زیاد لازم است می‌توان از decimal استفاده کرد اما decimal دارای دو محدودیت زیر است:
  • بازه‌ی عددی نسبتا کوچک
  • کاهش سرعت محاسبات (تقریبا 10 برابر کندتر از double)
پس همواره باید بررسی کرد که دقت مهم است یا سرعت. معمولا باید بین این دو معیار توازن برقرار بشه تا یه برنامه‌ی خوبی ساخته بشه.

۰ موافقین ۰ مخالفین ۰ ۰۴ شهریور ۹۲ ، ۰۱:۳۷
cscience
تفاوت out و ref

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

بهتر است که:
از این روش تنها موقعی استفاده کنید که مجبورید. گرفتن چندین خروجی از یک تابع می تواند پیچیدگی کد را زیاد و رفع خطای آن را سخت تر کند.
۰ موافقین ۰ مخالفین ۰ ۰۴ شهریور ۹۲ ، ۰۱:۳۶
cscience
ارجاع یا مقدار؟

باید دانست که:
هنگامی که شما یک تابع را به صورت عادی صدا می زنید، تمامی آرگومان ها به وسیله ی مقدار فرستاده می شوند یا به عبارت دیگر یک کپی از مقدار آن ها به تابع فرستاده می شود و تغییراتی که توسط تابع روی متغیر انجام می شود در متغیر اصلی تاثیر نمی گذارد. این امر در مورد تایپ های پایه ای سیشارپ کاملا واضح است. اما اگر دقت کرده باشید وقتی یک شئ نمونه از یک کلاس را به عنوان آرگومان ارسال کنید، با تغییر اجزای آن شئ در تابع، این تغییرات در شئ اصلی هم قابل دیدن است. سوال اینجاست که اگر کپی فرستاده شده است پس چرا تغییرات باقی مانده است؟
برای جواب این سوال باید به مفاهیم شئ گرایی مراجعه کرد. هنگامی که شما یک نمونه از یک کلاس ایجاد می کنید، ابتدا در حافظه مکانی برای اطلاعات و اجزای شئ در نظر گرفته می شود و سپس آدرس آن محل در یک متغیر که شما با نام شئ به آن دسترسی دارید، ذخیره می شود. پس چیزی که به عنوان مقدار شناخته می شود، آدرس محل اجزای شئ است. حال وقتی یک شئ را به یک تابع ارسال می کنید این آدرس است که کپی می شود و نه محتویات آدرس. اکنون هر تغییری که در تابع روی شیئی که متغیر مربوطه به آن اشاره می کند، رخ دهد، در همان آدرس ثبت می شود و چون این یک آدرس مشترک است، تغییرات از طریق متغیر اصلی هم قابل دیدن است. دقت کنید که اگر مقدار متغیر یا همان آدرس را در تابع تغییر دهید، هیچ تغییری در مقدار متغیر اصلی ایجاد نمی شود.
حال اگر قصد دارید یک ارجاع واقعی انجام دهید، باید از کلمه کلیدی ref قبل از نام آرگومان مورد نظر (هنگام تعریف و فراخوانی تابع) استفاده کنید.
۰ موافقین ۰ مخالفین ۰ ۰۴ شهریور ۹۲ ، ۰۱:۳۵
cscience
آزادسازی و مدیریت منابع (حافظه)

باید دانست که:
مدیریت فضاهای خالی و یا بلا استفاده حافظه در پروژه های بزرگ مسئله ی مهمی است. خوشبختانه سیشارپ با استفاده از Garbage Collector تا حد خیلی خوبی این عمل را انجام می دهد. به این صورت که به صورت موازی با برنامه ی شما اجرا می شود و هرگاه شئی پیدا کند که ارجاع به آن وجود ندارد و یا مطمئن باشد که دیگر به آن ارجاعی داده نمی شود، حافظه ی آن را آزاد می کند.
اما موازی اجرا شدن خود مسئله ی بزرگیست. این مسئله باعث می شود تا نتوان تشخیص داد چه موقع آزاد سازی صورت می گیرد. گاهی اوقات لازم است در یک زمان مشخص منبع آزاد شود. برای حل این مشکل لازم است از آزاد سازی دستی استفاده کنیم.
راه ساده برای این کار استفاده از Interfaceی به نام IDisposable می باشد. اکنون در کلاس شما باید متد Dispose به صورت مناسب در جهت آزاد سازی منابع مورد نظر پیاده سازی شود.

class MyClass IDisposable
{
        public void Dispose()
        {
            // Clean Up Here
        }
}

کافیست هرجا که لازم داشتید این متد را فراخوانی کنید.

این نکته از آن جهت اهمیت دارد که:
شاید این سوال را بپرسید که دلیل استفاده از IDisposable چیست و چرا یک متد به همین نام ننویسیم؟ کدی که در اینجا می بینید ظاهر کار است. سیشارپ در عمل از شئ دیگری استفاده می کند که از بوجود آمدن مشکلات احتمالی جلوگیری می کند. یکی از مشکلات Garbage Collector است! فرض کنید دستورات شما برای آزاد سازی منبع به سرعت انجام نشود و کمی طولانی شود و از طرف دیگر Garbage Collector که موازی اجرا شده است برای حذف شئ شما در نیمه ی کار سر می رسد. خودتان تصور کنید که چه مشکلات غیر قابل پیش بینی می تواند رخ دهد. اما با استفاده از IDisposable در هنگام استفاده از Dispose به Garbage Collector اطلاع داده می شود که عمل آزاد سازی صورت گرفته است و لازم نیست برای آزاد سازی این شئ کاری انجام دهد.

نکته دیگر اینکه:
گاهی اوقات زمان آزادسازی (قطعیت) اهمیت ندارد و فقط لازم است در هنگام آزاد سازی چند عمل دیگر انجام شود. به عبارت دیگر وقتی Garbage Collector برای آزاد سازی اقدام می کند، قبل از آن کارهای دیگری نیز انجام شود. برای این کار کافیست از finalizer استفاده کنید.

~MyClass()
{
    // Clean Up Here
    // Or Just Call Dispose()
}


۱ موافقین ۰ مخالفین ۰ ۰۴ شهریور ۹۲ ، ۰۱:۳۵
cscience

دستورات یکسان برای چند case

باید دانست که:
برای اینکه بتوان در ساختار switch یک دستور را برای چند case اجرا کرد، باید مانند نمونه زیر کد نوشت


switch (myint)
            {
                case 1:
                case 2:
                case 3:
                    Console.WriteLine("It's OK");
                    break;
                case 4:
                    Console.WriteLine("It Isn't OK");
                    break;
            }

در مثال بالا، برای حالات 1 و 2 و 3 جمله ی It's OK چاپ می شود و برای حالت 4 جمله ی It Isn't OK.
۰ موافقین ۰ مخالفین ۰ ۰۴ شهریور ۹۲ ، ۰۱:۳۳
cscience