وبلاگ شخصی علیرضا داودی

وبلاگ شخصی علیرضا داودی دانشجوی کارشناسی ارشد هوش مصنوعی

وبلاگ شخصی علیرضا داودی

وبلاگ شخصی علیرضا داودی دانشجوی کارشناسی ارشد هوش مصنوعی

وبلاگ شخصی علیرضا داودی

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

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

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

فازی و بولی

در منطق بولی با "درست" و "غلط" کار می کنیم. یک گزاره می تواند در مواقعی درست و در مواقع دیگر غلط باشد. مثلا گزاره "سیب قرمز است" از این دست است. وقتی می گوییم "امروز باران می آید" یا "امروز به سینما می روم"، داریم با اطمینان صحبت می کنیم. البته هر دوی این جملات می توانند صحیح یا غلط باشند. گزاره درست دارای ارزش یک و گزاره غلط دارای ارزش صفر است. فقط یکی از این دو ارزش را می توان به یک گزاره داد. می توان از ترکیب گزاره ها، گزاره های بزرگتری درست کرد.
در مورد برخی موضوعات نمی توانیم با اطمینان صحبت کنیم. مثلا ممکن است بگوییم "فکر می کنم امروز باران می آید". اگر بخواهیم دقیقتر باشیم می توانیم بگوییم که با یک درجه اطمینان خاص امروز باران می آید. البته این درجه اطمینان مثلا 0.8 است (به جای یک). منطق فازی برای مدل کردن همچین شرایطی بوجود آمده است. در منطق فازی با گزاره هایی کار می کنیم که می توانند با یک درجه اطمینان درست باشند (مقداری بین صفر و یک). پس ارزش یک گزاره در این منطق نشان دهنده این است که آن گزاره با چه درجه اطمینانی درست است. درجه اطمینان شبیه یک احتمال به نظر می رسد، ولی در واقع اینگونه نیست. مثلا مجموع احتمالات پیشامد های دو به دو ناسازگار نمی توانند بیش از یک شوند، اما جمع مقادیر فازی آن ها ممکن بیشتر شود. فرض کنید احتمال داغ بودن یک لیوان چای 0.8 و احتمال سرد بودن آن 0.2 باشد. این دو رویداد دو به دو ناسازگار هستند و جمع آن دو یک می شود. جمع مقادیر فازی لزومی ندارد که حداکثر یک شود. در مورد همین مثال فرض کنید ارزش گزاره داغ بودن لیوان چای 0.8 و ارزش گزاره سرد بودن 0.5 باشد. هیچ محدودیتی روی سقف مجموع تعدادی ارزش فازی وجود ندارد.

 مجموعه های فازی

فرض کنید قصد دارید مجموعه ای از روز های بارانی را جمع آوری کنید. آیا امروز را در آن مجموعه قرار می دهید؟ وقتی با منطق بولی کار می کنیم، قرار دادن امروز در آن مجموعه بر اساس یک اطمینان است؛ آیا قطعا امروز را در آن مجموعه قرار می دهیم و یا قطعا قرار نمی دهیم. در منطق فازی، امروز را به صورت یک جفت مرتب، مثل (امروز، 0.8)، در مجموعه روز های بارانی قرار می دهیم. اولین عنصر این جفت مرتب، یک کاندیدا برای حضور در مجموعه مورد نظر است و دومین عنصر هم یک مقدار بین صفر و یک است که درجه عضویت در آن مجموعه نام دارد. قرار دادن درجه عضویت در مجموعه باعث بوجود آمدن یک نظریه مجموعه بر مبنای منطق فازی شده است. مجموعه فازی به مجموعه ای از جفت مرتب ها گفته می شود که حاوی اطلاعاتی در مورد درجه عضویت می باشند. یک مجموعه سنتی از k عنصر، نوع خاصی از یک مجموعه فازی است که هر عنصر درون آن مجموعه دارای درجه عضویت یک و تمام عناصر دیگر موجود در مجموعه جهانی دارای درجه عضویت صفر هستند.

 عملیات های مجموعه فازی

اجتماع و اشتراک دو عمل مرسوم هستند که می توان روی مجموعه های عادی انجام داد. در مجموعه های فازی اجتماع یعنی پیدا کردن درجه عضویت یک عنصر برای مجموعه جواب.
اگر درجه عضویت عناصر a، b، c و d در مجموعه فازی A به ترتیب 0.9، 0.4، 0.5 و 0 باشند، آنگاه می توان مجموعه فازی A را با بردار برازش (0.9 ،  0.4  ، 0.5 ، 0 ) نشان داد. به عناصر این بردار، مقادیر برازش a، b، c و d می گویند. 

 اجتماع

یک اجتماع بین دو مجموعه عادی که یکی از عناصر فقط به یکی از مجموعه ها تعلق دارد را در نظر بگیرید. قبلا در همین بخش گفتیم که مجموعه های عادی گونه های خاصی از مجموعه های فازی هستند که در صورتی که یک عنصر در مجموعه باشد دارای درجه عضویت یک و در غیر این صورت دارای درجه عضویت صفر می باشد. به هر حال شما این عنصر را در مجموعه جواب نهایی قرار می دهید. ملاک شما در انجام این کار، مقادیر درجه عضویت این عنصر است. یعنی به درجه عضویت این عنصر در دو مجموعه نگاه می کنیم و مقدار بیشتر را انتخاب می کنیم. به عبارت دیگر مقدار بیشینه درجه عضویت یک عنصر در دو مجموعه اولیه را به عنوان درجه عضویت آن عنصر در مجموعه جواب نهایی انتخاب می کنیم.
در زیر یک مثال از عملیات اجتماع روی دو مجموعه فازی A و B با بردار های برازش نشان داده شده، آورده ایم:


اشتراک و متمم

به طور ساده، اشتراک دو مجموعه فازی به معنی انتخاب کمینه درجه عضویت عناصر موجود در دو مجموعه فازی است. به عنوان مثال اگر امروز با درجه عضویت 0.8 در مجموعه روز های بارانی و با درجه عضویت 0.5 در مجموعه روزهایی که کار در آن تمام می شود قرار داشته باشد، آنگاه امروز با درجه عضویت 0.5 به مجموعه روزهای بارانی ای که کار در آن تمام می شود تعلق دارد (یعنی کمینه 0.5 و 0.8 ).
در زیر یک مثال از عملیات اشتراک روی دو مجموعه فازی A و B با بردار های برازش نشان داده شده، آورده ایم:



با مفهوم مجموعه جهانی در مجموعه های عادی آشنا هستیم. به عنوان مثال وقتی صحبت از مجموعه آدم های متاهل می شود، مجموعه جهانی، مجموعه تمام انسان هاست. هر مجموعه دیگری از انسان ها، زیر مجموعه ای از این مجموعه است. بحث مجموعه جهانی به خاطر این مطرح شد که برای بدست آوردن متمم یک مجموعه عادی، باید تمام عناصری که در مجموعه جهانی وجود دارند و در این مجموعه وجود ندارند را انتخاب کنیم. در مورد مجموعه های فازی، اگر یک عضو دارای درجه عضویت 0.8 باشد، آنگاه آن عضو با درجه 1 - 0.8 = 0.2 به آن مجموعه تعلق ندارد. مثلا اگر امروز با درجه عضویت 0.8 در مجموعه روز های بارانی باشد، آنگاه امروز با درجه عضویت 0.2 در مجموعه روزهای غیر بارانی قرار دارد.
در زیر چند مثال آورده شده است:


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

کاربرد های منطق فازی

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

۱ نظر موافقین ۰ مخالفین ۰ ۲۰ آذر ۹۳ ، ۱۶:۳۱
علیرضا داودی

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

گروه تحقیقاتی شروع به جمع آموری داده های مورد نیاز مساله کردند. آنها 100 عکس از تانک های مخفی شده در پشت درخت ها و 100 عکس دیگر از درخت های تنها گرفتند. سپس نیمی از عکس های هر گروه را جدا کردند و کنار گذاشتند. در ادامه نیمه دیگر را اسکن کردند و به mainframe شان منتقل کردند. یک شبکه عصبی بسیار بزرگ درست کردند و در هر لحظه یکی از عکس ها را به ورودی آن می دادند و از آن می خواستند مشخص کند که تانکی در آن عکس پنهان شده است یا خیر! خب البته در ابتدا پاسخ ها به صورت تصادفی بود و این طبیعی بود چون شبکه هنوز نمی دانست چه خبر است! اما گروه تحقیقاتی بعد از هر پاسخ شبکه به آن می گفتند که پاسخ درست یا غلط است. اگر غلط بود، شبکه وزن هایش را تا زمانی که پاسخ درست بدهد، به صورت تصادفی تغییر می داد. با گذشت زمان عملکردش بهتر و بهتر می شد تا اینکه سرانجام همه ی عکس ها را درست دسته بندی می کرد. شبکه می توانست به درستی وجود یا عدم وجود تانک در یک عکس را تشخیص دهد!!

اما دانشمندان مبهوت بودند: آیا شبکه یک راه برای تشخیص تانک ها پیدا کرده یا اینکه فقط عکس ها را به خاطر سپرده است و در واقع جواب ها را حفظ کرده؟! البته این مساله ای است که در مورد شبکه های عصبی معمول است و کسی نمی داند که آنها چگونه به جواب رسیده اند. سوال این بود که آیا این شبکه مفهوم تانک بودن و تانک نبودن را فهمیده است؟

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

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

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

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

منبع

۱ نظر موافقین ۰ مخالفین ۰ ۰۸ مهر ۹۳ ، ۲۲:۵۸
علیرضا داودی

فرض کنید که یک رشته بیت به اندازه ی 2000 بایت به صورت تصادفی از یک فایل جدا می کنند و به شما می دهند؛ آیا می توانید با احتمال بالا تشخیص دهید که این رشته بیت مربوط به چه نوع فایلی هست؟

به طور کلی به این کار، تشخیص نوع فایل بر اساس محتوا ( به انگلیسی Content-based file type detection) گفته می شود. این مساله را می توان به دو صورت مطرح کرد:

1. کل فایل در دسترس است

2. تنها یک رشته بیت از آن فایل در دسترس است.

در مورد اول روش های آسانتری برای تشخیص نوع وجود دارد. مثلا همان روشی که در پست تشخیص نوع فایل بدون پسوند بدان اشاره کردم. اما اساس مساله ی تشخیص بر اساس محتوا برای زمانی است که هدر فایل در دسترس نیست و یا تنها یک رشته بیت از آن فایل را در اختیار داریم. به این تکه ها file fragments می گویند.

از سال 2001 تا کنون حدودا 20 مقاله در این زمینه منتشر شده است که اکثرا دارای دقت کمی می باشند و یا آنقدر پیچیده اند که قابل توسعه نیستند! همچنین خیلی از این روش ها تنها قابلیت تشخیص تعداد کمی نوع فایل را دارا می باشند. مثلا آخرین روشی که در این حوزه ارائه شد و مربوط به آقای طورانی و همکارانش است، تنها قابلیت تشخیص 6 نوع فایل را داراست و این در حالی است که روش پیشنهادی ایشان بسیار پیچیده می باشد و حتی در برخی مواقع برای نوع های کم ولی متفاوت با آنچه ایشان در مقاله ذکر کرده اند نیز کار نمی کند ( به دلیل اینکه از شبکه های عصبی استفاده می کنند و شبکه های عصبی ممکن است برای برخی داده ها همگرا نشوند!). البته مقاله هایی نیز منتشر شده اند که از تعداد نوع های زیادی پشتیبانی می کنند ولی خب با دقت بسیار پایین (مثلا در برخی موارد کمتر از 40 درصد!).

در مورد اهمیت این موضوع باید گفت که بسیار با اهمیت است. کاربرد های متفاوتی دارد، نظیر استفاده در سیستم های امنیتی مثل آنتی ویروس ها و یا سیستم های بازیابی اطلاعات و سیستم های کنترل داده و ... .

با توجه به اهمیت این موضوع پروژه کارشناسی من به سرپرستی دکتر احمد کشاورز (عضو هئیت علمی گروه مهندسی برق دانشگاه خلیج فارس) به این صورت تعریف شده که باید یک روش مطمئن برای تشخیص نوع فایل از میان 30 نوع پشتیبانی شده و با استفاده از یک رشته بیت دریافتی ارائه دهم.

پس از بررسی روش های ارائه شده ی قبلی و یافتن نقاط ضعف و قوت آنها توانستیم روشی ارائه دهیم که توانست رکورد بی سابقه 93.45 درصد را ثبت کند. یعنی الگوریتم ما در نهایت این توانایی را داشت که با این درصد دقت، رشته بیت دریافتی را میان 30 نوع فرنت از پیش تعریف شده طبقه بندی کند. همچنین قابل ذکر است که این روش اصلا پیچیده نیست و قابلیت پیاده سازی و توسعه فراوانی دارد و به راحتی می توان تعداد نوع های پشتیبانی شده آن را افزایش داد.

به خاطر قرار دادی که با یک شرکت خصوصی داریم از ارائه الگوریتم ذکر شده معذوریم.

امیدواریم که در آینده با بهبود الگوریتم بتوانیم دقت کار را افزایش دهیم.


۰ نظر موافقین ۰ مخالفین ۰ ۲۱ شهریور ۹۳ ، ۲۰:۴۱
علیرضا داودی

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

حال با فایل های بدون پسوند چه کار باید کرد؟ یا فایل هایی که افراد به خاطر مقاصد خاصی پسوندشان را تغییر می دهند!؟

بگذارید با یک مثال این مساله را باز کنم. فرض کنید فایلی به دست شما رسیده است (مثلا از طریق ایمیل)؛ پسوند این فایل jpg است. ولی آیا واقعا این یک فایل Jpg است؟! حتی اگر با باز کردن آن فایل یک عکس هم نشان داده شود نمی توان گفت که آن فایل یک ویروس نبوده است!! بله ویروس ها می توانند خود را به انواع فایل ها بچسبانند.

خوب در مواقعی مثل مورد بالا باید چه کار کرد؟

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

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

اما تشخیص نوع یک فایل از روی هدر آن کار آسانی نیست. زیرا هزاران نوع فایل داریم که ممکن است برخی هدر ها تا حدی شبیه هم باشند. مثلا هدر فایل های اجرایی مثل dll ها و exe ها و ocx و ... بسیار شبیه هم هستند. ضمن اینکه خود این فایل ها داری انواع مختلفی هستند. به عنوان مثال 5 نوع فایل Jpg داریم.

برای حل این مشکل از یک الگوریتم امتیاز دهی استفاده می کنیم. یعنی یک هدر را می گیریم و با ویژگی های کلیدی آن را بررسی می کنیم و به هر نوعی که دارای آن ویژگی باشد امتیازی می دهیم و در نهایت نوعی که بیشترین امتیاز را کسب کرده باشد به عنوان محتمل ترین گزینه برای نوع آن فایل گزارش می دهیم.

در یک پروژه به خاطر نیاز به همچین برنامه ای بعد از تحقیق در اینترنت به برنامه ای به نام TrIDNet رسیدم. این برنامه از یک سری فایل xml که مشخصات کلیدی نوع های مختلف در آنها ذخیره شده است،برای تشخیص نوع فایل استفاده می کند. اما مشکلی که وجود داشت این بود که این برنامه فقط در نسخه ی 32 بیت منتشر شده است و نسخه ی 64 بیت که مورد نیاز ما بود، وجود ندارد. به گفته ی تیم توسعه دهنده ی این نرم افزار نسخه ی 64 بیت در آینده منتشر خواهد شد؛ ولی برای ما دیر بود.

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

به نظرم برنامه های این چنینی که تکنولوژی خاصی ندارد را باید در اختیار همگان قرار داد. این کار به توسعه ی سریعتر علم کمک می کند.

به همین جهت بنده سورس این نرم افزار را در اختیار عموم قرار می دهم که با ذکر نام استفاده کنند.


این برنامه با زبان c++ و کتابخانه ی Qt نوشته شده است.



دریافت سورس
عنوان: سورس برنامه ی تشخیص نوع فایل
حجم: 481 کیلوبایت
توضیحات: سورس برنامه

دریافت فایل اجرایی
عنوان: برنامه تشخیص نوع فایل
حجم: 16.7 مگابایت
توضیحات: فایل اجرایی برنامه تشخیص نوع فایل


۴ نظر موافقین ۱ مخالفین ۰ ۱۸ خرداد ۹۳ ، ۱۸:۱۶
علیرضا داودی

برنامه نویس ها باید ساعت های زیادی در روز به کد ها نگاه کنند. برای همین داشتن یک فونت مناسب برای برنامه ی ویرایشگر کد یا IDE خیلی حیاتیه.

من مدت زمان زیادی از فونت Courier با سایز 10 استفاده می کردم. حدود چند ماه پیش با فونت  Consolas آشنا شدم. این فونت تجاریه و متعلق به ماکروسافت هست. البته اگر روی ویندوز Office نصب کرده باشید حتما این فونت روی سیستمتون نصب شده. 

Consolas

حدود یک هفته پیش با فونت inconsolata آشنا شدم. این فونت واقعا محشره. با فعال کردن آپشن Anti Aliasing در ویرایشگر های مدرن می تونید در سایز های بزرگ هم با کیفیت بالا از این فونت استفاده کنید.البته اینم بگم که سازنده ی این فونت خودش برنامه نویس هست و با در نظر گرفتن نقاط ضعف فونت های دیگر این فونت رو طراحی کرده.

inconsolata

برای دریافت این فونت به سایت سازنده ی آن سر بزنید.

۳ نظر موافقین ۱ مخالفین ۰ ۲۲ فروردين ۹۳ ، ۱۶:۱۳
علیرضا داودی
سلام
درس طراحی کامپایلر یکی از دروس تخصصی نرم افزار هست که در واقع یکی از کاربردهای نظریه ی زبان ها در علم کامپیوتر است.
من در ترم 5 این درس رو گذروندم. به واسطه ی پروژه های خوبی که دکتر رستمی (استاد این درس) می دادند، تونستم خیلی خوب این درس رو بفهمم و یک تسلط نسبی روی مفاهیمش پیدا کنم.
البته به خاطر اینکه استاد ما در این درس دستیاری نداشتند، مجبور بودیم خیلی از منابع رو با زحمت از دل اینترنت بیرون بکشیم. خدا رو شکر تونستم اون زمان منابع خیلی خوبی پیدا کنم.
البته بگم که برای مسلط شدن به مفاهیم کلاس تنها کافی نیست؛ می تونید از کلاس های مجازی سایت coursera استفاده کنید. خیلی خیلی خوب هستند. استاد این کلاس ها مفاهیم رو به صورت خیلی ساده ای توضیح می دن، جوری که با هر سطحی که باشین می تونید باهاش پیش برید. پس بهتون توصیه می کنم این کلاس ها رو تماشا کنید.
یکسری منابع هست که میزارم برای دانلود. مثلا آموزش JavaCC، آموزش درست کردن یک زبان برنامه نویسی به صورت قدم به قدم، یک کد جاوا برای LexicalAnalyzer که خودم نوشتم و کتاب ها و اسلاید های این درس و .... 

دریافت
عنوان: منابعی برای درس طراحی کامپایلر
حجم: 38.6 مگابایت


۴ نظر موافقین ۱ مخالفین ۰ ۱۷ مهر ۹۲ ، ۲۲:۳۴
علیرضا داودی

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

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

علم کنترل بسیار کاربردی است و کسی که بر مفاهیم این علم مسلط باشد تقریباً هر وسیله ی الکترومکانیکی که مد نظر داشته باشد را می‌تواند با کمی ابتکار بسازد.

یکی از استادان بزرگ رباتیک می‌گوید : “کنترل مانند یک چکش است و رباتیک مانند میخ و من به وسیله ی این چکش هر میخی را می‌توانم بکوبم ”

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

کنترل یکی از دروسی است که به دانشجویان کامپیوتر گرایش نرمافزار تدریس نمی‌شود ولی به نظر من یکی از علم‌هایی است که هر مهندس باید با آن آشنا باشد. پس نمی‌توان با این دلیل که چون در برنامه ی آموزشی ما نیست پس نباید دیگر سراغ آن برویم, این علم را رها کنیم و آن را یاد نگیریم.


یکی از کنترل کننده های معروف , کنترل کننده ی PID است که بیش از ۸۰ درصد کنترل کننده ها از این نوع هستند.

یادگیری این کنترل کننده اصلاً مشکل نیست و نیز لازم نیست که شما یک دوره ی کامل درس کنترل را گرفته باشید تا بتوانید آن را بفهمید.

پس زمان را از دست ندهید و با منابع زیر شروع به یادگیری کنید :

دریافت
عنوان: راهنمای میتدی کنترل کننده ی PID
حجم: 826 کیلوبایت
توضیحات: به صورت بسیار مبتدی و با زبانی صریح شما را با مفهوم کنترل کننده ی PID آشنا می کند.
دریافت
عنوان: برنامه نویسی PID
حجم: 309 کیلوبایت
توضیحات: آموزش برنامه نویسی PID

۹ نظر موافقین ۲ مخالفین ۰ ۰۶ مرداد ۹۲ ، ۱۸:۵۰
علیرضا داودی

سلام

حدودا چند ماهی هست که دنبال منابع مناسب برای کنکور می گردم. 

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

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

همچنین برای دیدن مصاحبه های بیشتر به سایت مانشت سر بزنید. 

http://www.manesht.ir/forum/forum-523.html

موفق باشید.


دریافت منابع
عنوان: منابع کنکور
حجم: 72.2 مگابایت
توضیحات: منابعی برای کنکور شامل تعدادی مصاحبه با افراد برتر و سوالات کنکور چند سال اخیر


۳ نظر موافقین ۰ مخالفین ۰ ۲۸ ارديبهشت ۹۲ ، ۲۰:۲۰
علیرضا داودی

پروژه ی نهایی درس طراحی کامپایلر ساخت یک زبان برنامه نویسی بود. 

زبان C زیادی پیچیده است ( مشکل سازی الکی برای ایجاد فرصت جدید)  پس تصمیم گرفتم که این زبان رو ساده تر کنم. این شد که پایه های فکری زبان CMM ( بخوانید C Minus Minus ) در من شکل گرفت.

از شوخی که بگذریم واقعیت اینه که  طراحی یک زبان برنامه نویسی و سخت تر از اون نوشتن یک کامپایلر برای اون زبان کاری است بس دشوار. جایی خوندم که برای طراحی زبان های پیشرفته ای مثل C++ ، جاوا ، C# و ... بیش از 500 نفر به صورت مستقیم درگیر هستند و گاهی سال ها طول می کشد تا یک کامپایلر به مرحله عرضه به بازار برسد.

کامپایلر CMM دارای ویژگی های زیر هست : 

  • Syntax مشابه با syntax زبان C 
  • پشتیبانی از داده Integer
  • دارای حلقه های for و while و do
  • دارای دستورات کنترلی if و switch
  • پیشتیبانی از توابع با آرگومان و مقدار بازگشتی
همچنین به همراه این زبان یک IDE هم قرار داده شده که ویژگی های زیر دارد : 
  • Syntax Highliting
  • ارایه کد اسمبلی برنامه نوشته شد به صورت highlight در پنجره ای جدا
  • دارای خروجی وضعیت کامپایل و مشخص کردن محل خطا و نوع خطا و ...
نمایی از IDE : 





دریافت سورس و فایل اجرایی
عنوان: C Minus Minus
حجم: 2.2 مگابایت
توضیحات: The CMM programming language

۲ نظر موافقین ۰ مخالفین ۰ ۱۱ فروردين ۹۲ ، ۲۲:۱۰
علیرضا داودی

یکی از کمبود های نرم افزار های مدیریت دانلودی که من می شناسم , نداشتن قابلیت تقسیم کردن فایل های بزرگ است. برای مثال فرض کنید یک فایل ۵۰۰ مگابایتی را می خواهید دانلود کنید. اگر محدودیت سرعت ۶۰ کیلوبایت بر ثانیه را داشته باشید , با فرض اینکه در تمام مدت دانلود با ۶۰kB/s دانلود می کنید , تقریبا ۱۴۰ دقیقه طول می کشد تا دانلود تمام شود ; حال اگر می توانستید به گونه ای این فایل یکپارچه را چند تیکه کنید و هر کدام را به یکی از دوستان خود بدهید , بدیهی است که زمان دانلود بر تعداد افرادی که دانلود می کنند تقسیم می شود. برای مثال فرض کنید فایل مورد نظر را به ۵ قسمت ۱۰۰ مگاباتی تقسیم کنید و هر یک از دوستانتان یک پارت را دانلود کند. با این حساب ۵ نفر به صورت همزمان ۱۰۰ مگابایت را دانلود می کنند . با فرض اینکه با هم محدودیت دانلود ۶۰ کیلوبایت بر ثانیه وجود داشته باشد به طور کلی ۲۸ دقیقه طول می کشد تا همه ی پارت ها دانلود شود. در آخر هم پارت ها را به هم می چسبانید و یک فایل کامل دارید.

نرم افزار GreedyDM نرمافزاری برای مدیریت دانلود است که قابلیت های زیر را دارد :

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

GreedyDM یک نرم افزار متن باز است.

*برای اجرای برنامه به JRE7 احتیاج دارید.

نویسنده ی برنامه : علیرضا داودی

  • دریافت
    عنوان: فایل اجرایی GreedyDM
    حجم: 66.2 کیلوبایت
  • دریافت
    عنوان: سورس پروژه ی GreedyDM
    حجم: 8.67 مگابایت
۴ نظر موافقین ۰ مخالفین ۰ ۰۳ اسفند ۹۱ ، ۱۹:۱۹
علیرضا داودی