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

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

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

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

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

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

۴ مطلب با موضوع «پروژه های من» ثبت شده است

فرض کنید که یک رشته بیت به اندازه ی 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 مگابایت
توضیحات: فایل اجرایی برنامه تشخیص نوع فایل


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

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

زبان 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 مگابایت
۴ نظر موافقین ۰ مخالفین ۰ ۰۳ اسفند ۹۱ ، ۱۹:۱۹
علیرضا داودی