CSCIENCE

CSCIENCE

آشنایی با Task (ادامه)



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

2 تابع داریم، یکی DoJob که Task اصلی آن را اجرا می‌کند و دیگری AfterJob که قرار است بعد از پایان DoJob اجرا شود:

public void DoJob()
{
     //Body
}

public void AfterJob()
{
     //Body
}

ابتدا یک ارجاع به Task درحال اجرا ایجاد می‌کنیم:

Task t = Task.Run(() => DoJob());

اکنون تابع AfterJob را برای اجرا بعد از پایان یافتن DoJob به t نسبت می‌دهیم:

t.ContinueWith((tsk) => AfterJob());

که tsk همان ارجاع به Task اصلی است که در اینجا برای استفاده‌های بعدی Capture می‌شود.
هر 2 تابع DoJob و AfterJob می‌توانند هرگونه آرگومان ورودی داشته باشند. در مورد خروجی توابع در پست‌های بعدی بحث خواهیم کرد.
۵ موافقین ۰ مخالفین ۰ ۰۵ فروردين ۹۳ ، ۰۰:۵۵
cscience

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


Happy [undirected] Graph!
I've tried to write my message at the lowest possible cost from 1 to 14.

[A key]
CHYPYANAWEEPOUR

[You all know the following format]
1 2 500
1 5 100
1 4 1500
2 11 100
2 6 100
3 5 100
3 11 100
4 8 200
4 10 300
5 14 2000
6 9 100
6 13 1500
7 10 90
7 14 3
8 9 200
8 13 1500
12 10 2000
12 14 1500

پاسخ در ادامه مطلب
۱ موافقین ۰ مخالفین ۰ ۰۱ فروردين ۹۳ ، ۰۱:۵۰
cscience

آشنایی با Task



قبل از اینکه Async در سیشارپ 5 پدیدار شود، دات نت در فریم‌ورک 4، موجودی(!) به نام Task را معرفی کرد که زیرساخت اصلی Async در سیشارپ 5 است. Task برای راحت‌تر کردن و مدیریت بهتر ناهمگامی بوجود آمده است و امکانات فراوانی را در این زمینه در اختیار برنامه نویس قرار می‌دهد. اگر بخواهیم به‌طور خلاصه شئ Task را تعریف کنیم، می‌توان گفت Task یک عمل در حال اجرا را در خود کپسوله می‌کند و از طریق آن می‌توانیم از وضعیت آن عمل باخبر شویم و یا آن را کنترل کنیم. البته این تعریف خیلی تعریف ساده ایست اما برای شروع مناسب است. در ادامه بیشتر با این موجود آشنا خواهید شد.
هنگامی که شما می‌خواهید یک سری عملیات را به صورت ناهمگام اجرا کنید، کافیست نمونه‌ای از Task ایجاد کنید و مدیریت اجرای آن را به او بسپارید. به محض اینکه عملیات را به Task نسبت می‌دهید، Task یک Thread آزاد را از Thread Pool انتخاب می‌کند و عملیات شما را در آن Thread اجرا می‌کند. ممکن است بپرسید Thread Pool چیست؟
به طور خلاصه می‌توان گفت که دات‌نت برای جلوگیری از هزینه‌های ایجاد و حذف Threadها، مجموعه‌ای از Threadهای آماده به کار را فراهم کرده است و برنامه‌ی شما در صورت نیاز به Thread، می‌تواند از این Threadها استفاده کند. هر Thread بعد از اتمام کار، دوباره به مجموعه باز می‌گردد (برای دریافت کار بعدی).
بنابراین Task به طور اتوماتیک یک Thread از مجموعه انتخاب می‌کند و با آن کار می‌کند و پس از اتمام کار، آن را به مجموعه باز می‌گرداند. اکنون با داشتن یکسری اطلاعات کلی در مورد Task، ادامه‌ی آموزش را با مثال‌های طبقه بندی شده بر اساس نوع عملیات پیش خواهم برد و نکات تکمیلی را اضافه خواهم کرد.

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

public void DoJob(){
     // Function Body
}

اگر بخواهیم تابع بالا را به روش Fire and Go و به صورت موازی اجرا کنیم، کافیست دستور زیر را اجرا کنیم:

Task.Run(()=>DoJob());

در حالتی هم که تابع مورد نظر، آرگومان ورودی داشته باشد، تنها کافیست هنگام فراخوانی با Task.Run، آرگومان‌ها را در آن بنویسید. به همین سادگی!
در بخش‌های بعدی با انواع مختلف مثال‌ها و ابزارهای مدیریت Task بیشتر آشنا خواهید شد.
۱ موافقین ۰ مخالفین ۰ ۲۵ اسفند ۹۲ ، ۲۱:۵۴
cscience

دلایل استفاده ناهمگامی (Asynchrony)



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

1. رابط کاربری (UI)
معروف‌ترین ابزارهای ایجاد رابط‌های کاربری در سیشارپ، Windows Form و WPF هستند. در هر دو تکنولوژی، برای مدیریت رابط کاربری (نمایش اجزا، رخدادها و ...) تنها از یک Thread* استفاده می‌شود. اکنون فرض کنید برنامه‌ی شما قرار است به عنوان مثال بعد از کلیک بر روی یک دکمه، عملیاتی طولانی را شروع کند (محاسبات پیچیده، درخواست‌های تحت شبکه، ورودی/خروجی دیسک و ...). با توجه به اینکه در خواست اجرا از طریق رابط کاربری بوده است و در آن‌جا تنها یک Thread وجود دارد، این عملیات، مدت زمان طولانی Thread مخصوص رابط کاربری را Block می‌کنند و در نتیجه رابط کاربری تا پایان عملیات، توانایی پاسخ‌گویی به کاربر را نخواهد داشت. درست است که عملیات مورد نظر در حال انجام است اما کاربر هیچگاه رابط کاربری از کار افتاده یا Unresponsive را نمی‌پسندد. بهتر است عملیات طولانی در Thread دیگر، موازی با رابط کاربری اجرا شود تا رابط کاربری همواره پاسخ‌گوی کاربر باشد و به نحوی میزان پیشرفت عملیات طولانی را نیز نمایش دهد.

2. استفاده از اوقات بیکاری CPU
گاهی اوقات در برنامه‌ها اعمالی وجود دارند که CPU را درگیر نمی‌کنند (مثل ورودی/خروجی دیسک)، یعنی CPU کار را به واحد دیگر می‌سپارد و منتظر می‌ماند تا آن واحد عملیات مورد نظر را انجام دهد. سپس دوباره به روند اجرای برنامه‌ی اصلی باز می‌گردد. از طرفی اعمالی که واحدهای دیگر انجام می‌دهند، معمولا طولانی و کند هستند و در نتیجه CPU مدت زمان زیادی را بیکار می‌ماند (البته منظور از بیکار بودن اینه که توی اون مدت با برنامه‌ی شما کاری نداره). اگر بتوانیم در این زمان عملیات قسمت دیگری از برنامه را تحویل CPU دهیم، توانسته‌ایم بیشترین استفاده را از CPU ببریم. این مسئله نیز با Asynchrony قابل حل است.

3. استفاده از حداکثر توان پردازشی
سخت‌افزارهایی که امروزه راهی بازار می‌شوند، بسیار قدرتمندتر از آنی هستند که ما (با برنامه‌های معمولی البته) از آن‌ها استفاده می‌کنیم. قلب کامپیوتر یعنی CPU هم از این قضیه مستثنا نیست. CPUهای فعلی حداقل 2 هسته‌ی پردازشی دارند. هسته‌ها می‌توانند قابلیت پردازش موازی و افزایش سرعت برنامه را فراهم کنند. در صورتی که برنامه‌ی شما موازی نباشد، شما تنها از یک هسته CPU استفاده می‌کنید (برای امتحان کافیست برنامه‌ای بنویسید که یک حلقه‌ی طولانی داشته باشد، آن را اجرا کنید و سپس از طریق Task Manager، میزان استفاده از CPU را چک کنید). قابلیت Async در سیشارپ امکان استفاده از همه‌ی هسته‌های پردازشی را به شما می‌دهد.


*مبحث Threadها در این سری آموزشی باز نخواهد شد. برای درک بهتر مفاهیم آموزشی، پیشنهاد می‌کنم از منابع دیگر در مورد Threadها مطالعه کنید.
۱ موافقین ۰ مخالفین ۰ ۲۴ اسفند ۹۲ ، ۱۸:۱۶
cscience

برنامه نویسی Asynchronous به شما اجازه می‌دهد تا بتوانید اعمال مختلف را به صورت همزمان در برنامه‌ی خود پیش ببرید. به عبارت دیگر، این قابلیت از Block شدن برنامه شما، در شرایطی که برنامه در حال انجام کاری طولانی مدت است، جلوگیری می‌کند و باعث می‌شود برنامه‌ Responsive باقی بماند. از دیگر فواید برنامه Asynchronous، می‌توان به استفاده از حداکثر توان سیستم اشاره کرد. امروزه اکثر پردازنده‌ها، چندین هسته‌ی پردازشی دارند که یک برنامه‌ی غیر موازی نهایتا از یک هسته‌ی پردازنده استفاده می‌کند اما با نوشتن یک برنامه‌ی Asynchronous و ایجاد یک الگوی موازی سازی، محاسبات شما به صورت موازی روی هسته‌های مختلف CPU اجرا می‌شود.

سیشارپ یا بهتره بگم دات نت، قابلیت‌ها و روش‌های مختلفی را برای این کار فراهم کرده‌است. یکی از قابلیت‌هایی که در سیشارپ 5 اضافه شده است، کلمات کلیدی async و await است. شما می‌توانید تنها با استفاده از این 2 کلمه کلیدی، برنامه Asynchronous بنویسید! در پست‌های بعدی آموزش مختصر و کوتاهی درباره این قابلیت جدید ارائه خواهم داد.

۰ موافقین ۰ مخالفین ۰ ۲۱ اسفند ۹۲ ، ۱۱:۴۷
cscience
در مبحث محاسبه پذیری و توابع Primitive Recursive یا به اختصار PR، ثابت میشه که تمامی توابع PR محاسبه پذیرند، در صورتی که برعکس آن برای تمامی توابع صادق نیست. یعنی حداقل یک تابع وجود دارد که محاسبه پذیر است اما PR نیست. یکی از این توابع، تابع Ackermann است. اثبات PR نبودن این تابع را در فایل زیر نوشته‌ام*.

دانلود


* منبع اصلی این اثبات این لینک است که من اثبات‌های تمامی لم‌های آن را در فایل خودم آورده‌ام.
۱ موافقین ۰ مخالفین ۰ ۱۳ اسفند ۹۲ ، ۲۳:۴۹
cscience

از این لینک* میتونید چارت درسی مجموعه‌ی علوم ریاضی را دانلود کنید

این فایل شامل سرفصل دروس رشته‌های زیر می‌باشد:


ریاضیات و کاربردها

آمار و کاربردها

علوم کامپیوتر


ویرایش 89/06/22



* برگرفته از وبلاگ CS4ALL
۲ موافقین ۰ مخالفین ۰ ۱۳ بهمن ۹۲ ، ۱۵:۲۴
cscience

تصویر زیر، تصویر بخشی از صفحه‌ی آمار وبلاگ است!


۲ موافقین ۰ مخالفین ۰ ۲۰ دی ۹۲ ، ۰۲:۱۶
cscience

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

(برگرفته از voxy.com)



1. Piece of cake – No, when someone says that the assignment they just finished was a piece of cake, it does not mean that their professor gave them a red velvet cupcake for their midterm paper, what piece of cake actually means is that something is very easy to complete.


2. Costs an arm and a leg – It would be a strange world we lived in if buying that fancy shiny purse literally required us to chop off our body parts to give as tribute. When something costs an arm and a leg it actually means that something is very expensive.


3. Break a leg – Oh, look, another idiom about legs. You’re about to take your dreaded calculus final and before you head into your classroom your roommate texts you, “Break a Leg!”  Why, you think in your head, would he ever wish that upon me? I thought we were cool with each other. Well, your roommate surely doesn't want your bones to break while walking to your seat in the exam room that’s for sure. Break a leg actually means good luck!


4. Hit the books – If you’re a student in an English speaking environment you’re probably going to be hearing this phrase a lot. Before you imagine students running into their campus library and punching, kicking and wrestling apart the complete works of Shakespeare, we would just like to say that hit the books actually means to study. There there, you can still punch books in your spare time if you want, we won’t judge you.


5. Let the cat out of the bag – Why would someone put their cat in a bag? What did the cat ever do to them? Our last idiom actually means to disclose a secret that was supposed to be kept, well, as a secret.  The next time someone lets the cat out of the bag do not immediately pick up your phone and call animal cruelty control.


6. Hit the nail on the head – This idiom has to do with doing or saying something that is precisely right. If you don’t understand this, just think about that sweet feeling you get when you swing a hammer at a nail and hit it perfectly.


7. When pigs fly – So, have you ever seen a pig fly before? Never? Me neither. This idiom basically means that something will never happen.


8.  Bite off more than you can chew – Imagine your waiter brings you the biggest juiciest hamburger from your favorite American restaurant. In your hunger, you grab it quickly and take a giant bite out of it. Unfortunately, the bite you've taken is too big, and you end up looking like an idiot trying to shove this bite down your throat while drinking water and trying not to choke. That is the most literal sense of the meaning, but in general it just means to attempt to take on a task that is too much for you to handle.

۳ موافقین ۰ مخالفین ۰ ۲۰ دی ۹۲ ، ۰۱:۵۱
cscience

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

اولین پیاده‌سازی ما با متلب بود که زمان اجرایی برابر با 24 ساعت داشت. از اونجایی که متلب به صورت ذاتی کمی کند هست، سراغ سیشارپ رفتیم. پس از اینکه با سیشارپ پیاده سازی انجام شد، مدت زمان اجرا به 8 ساعت رسید که به نظر خیلی خوب بود. کمی بعد یکی از دوستانم که کاملا به دستورات سیشارپ (حتی از نظر کارایی) مسلطه، کد رو بازبینی کرد و دو تغییر زیر را ایجاد کرد:


1. در یک قسمت از برنامه به جای

Math.Pow(x,2)

عبارت x * x را قرار داد.

2. در قسمت دیگری از برنامه، محاسبات با اعداد صحیح کافی بود ولی من از double استفاده کرده بودم، پس بجای آن‌ها از int استفاده کرد.


پس از اجرای برنامه با تغییرات بالا، مدت زمان اجرا به 3 ساعت کاهش یافت. دلیل این اتفاق برای هریک از موارد بالا این است که:


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

2. محاسبات اعشاری کلا زمان بیشتری نسبت به محاسبات صحیح مصرف می‌کنند.


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

۴ موافقین ۰ مخالفین ۰ ۲۷ آذر ۹۲ ، ۱۱:۰۰
cscience