PDA

View Full Version : کتابخانه PCore



pswin.pooya
سه شنبه 01 تیر 1395, 13:01 عصر
سلام دوستان من در حال نوشتن یک کتابخانه برای کیوت هستم که یکسری از کلاسهایی که برای برنامه نویسی روزمره به اونها نیاز هست رو داخلش داره. شما می تونید این کتابخونه رو بصورت متن باز از آدرس زیر دریافت کنید:
https://github.com/pswin/pcore


فعلا این کتابخانه در مراحل اولیه هست و کلاسها و امکانات زیر رو داره:

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

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



140983





سیستم رمز نگاری:
یکی از کمبود های کیوت سیستم رمزنگاری هست. در PCore ما از کتابخونه OpenSSL که یکی از معتبرترین کتابخونه ها برای رمزنگاری هست استفاده کردیم و الگوریتم های زیر رو بصورت کلاسهای خیلی ساده آماده وارد کتابخونه کردیم:

RSA
AES
DES


140981


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


پردازنده
رسانه های ذخیره سازی
کارت گرافیک
کارت صدا
مانیتورها
دستگاهای رابط ورودی (HID) (اضافه خواهد شد)
رابطهای شبکه (اضافه خواهد شد)




140980
140988




فشرده سازی داده:
برای فشرده سازی داده یک کلاس تخصیص داده شده که از کتابخونه معروف zlib استفاده می کنه و در حال حاضر با دو الگوریتم deflate و gzip کار می کنه. البته فایلهای zip رو نمی تونه باز کنه. برای فایلهای فشرده احتمالا از یک کتابخونه دیگه استفاده کنیم و یه رابط روش بکشیم که بشه خیلی راحت با کیوت باهاش کار کرد. (در حال حاضر در حال تست کتابخونه ها هستیم که بهترین رو انتخاب کنیم)

140986




Globalization:
یکی از زیر فضاهای نام اصلی PCore فضای نام جهانی سازی یا Globalization است. هدف این فضای نام فراهم کردن یه ساختار برای localization و ساخت برنامه های چند زبانه راحتر هست. از جمله کلاسهای این فضای نام عبارتند از:


کلاس تقویم شمسی (دقت این تقویم بسیار بالا هست و کاملا الگوریتمیک کار می کنه. و نسبت به الگوریتمهای معمولی که استفاده می شه دقت فوقالعاده زیادی داره.)
تقویم هجری: الگوریتمی که برای این تقویم استفاده شده رو از یکی از استاید دانشگاه زوریخ گرفتم. این الگوریتم یکی از بهترینها هست. منتها هنطور که می دونید تقویم هجری-قمری هیچ مبنای و الگوریتم درستی برای محاسبه نداره. دقت این کلاس یک روز هست و امکان داره تاریخی رو که می ده یک روز کمتر یا بیشتر باشه اما در اکثر موارد با دقت بالا کار میکنه.
کلاس پارسر تاریخ: این کلاس میتونه متن رو تاریخ تبدیل کنه که در دو کلاس بالا برای تبدیل متن به تاریخ ازش استفاده شده
کلاس Locale: این کلاس با توجه به استانداردهای ISO اطلاعات در موردی زبانها، واحدهای پولی، کشورها و ... رو می ده. (البته این کلاس فعلا در حال توسعه هست). دلیل نوشته شدن این کلاس اینه که کلاس معادل اون یعنی QLocale در کیوت از اطلاعات سیستم عامل استفاده می کنه که در برخی موارد اشتباه هستن. مثلا در مورد اسم ماه های شمسی.


140982




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

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

دوستان این پروژه به صورت فعال (Active) در حال توسعه هست و امکان اضافه شدن و یا حتی کم شدن کلاسها وجود داره. من سعی می کنم تغییرات رو اینجا اعلام کنم. همچنین خیلی خوشحال می شم در صورتی که نیازی به کلاس و یا امکانات خاصی احساس می کنید در میون بزارید تا در صورت امکان به پروژه اضافه اش کنیم.

AliRezaBeytari
یک شنبه 06 تیر 1395, 21:56 عصر
فوق العاده هست. همیشه دنبال یه کتابخانه اینطوری بودم !!!

pswin.pooya
دوشنبه 07 تیر 1395, 15:51 عصر
یه فریم ورک برای کار با کش ها دارم اضافه می کنم. فرق کش با کانتاینرهایی مثل QMap اینه که شما می تونید اندازه رو محدود کنید و یا سیاست های دیگه برای کنترلش اعمال کنید. از جمله انقضای داده با گذشت زمان یا بیشترین تعداد دسترسی و ... . برای هر آیتمی که وارد کش می شه یه هزینه تعیین می کنیم و به کلاس کش می گیم که اجازه نداره از هزینه تعیین شده تجاوز کنه. این هزینه می تونه اندازه حافظه اشغال شده باشه و یا اینکه حتی تعداد آیتم باشه. مثلا هزینه ماکزیمم کش رو می دیم سه و برای هر آیتمی که اضافه می شه یک واحد هزینه در نظر می گیریم. و یا هزینه ماکزیمم رو میدیم یک مگابایت و هر آیتم رو که اضافه می کنیم به کمک sizeof و ... اندازه اون رو به عنوان هزینه می فرستیم.

امروز اولین کلاسش رو یعنی کش مدل LRU رو اضافه کردم. این مدل کش زمانی که به محدودیت می رسه، آیتمی رو حذف می کنه که دیرتر از بقیه مورد دسترسی قرار گرفته و یکی از محبوب ترین مدلهای کش هست.

شاید بگین چرا سیستم کش رو نوشتی و سیستم های آماده و یا حتی کلاسهای آماده ای مثل QCache استفاده نمی کنی:

1. کلاس QCache فریم ورک کیوت Thread Safe نیست و نمی شه ازش توی کارهای چند نخی استفاده کرد. که استفاده ازش رو خیلی محدود می کنه.
2. یکی دیگه از کلاسهای کش معروف پوکو هست که برای قفل هاش از موتوکس ها استفاده می کنه که باعث می شه خوندن افت کنه. در مقابل کلاس من از قفلهای ReadWrite استفاده می کنه که باعث می شه در حالت خوندن چندین نخ همزمان بتونن از کش بخونن.
3. کلاس که نوشته شده از اشاره گر خالی بر نمی گردونه و از QSharedPointer ها استفاده می کنه که باعث می شه اگر نخی داده رو گرفت. و همزمان نخ دیگه اون داده رو منقضی کرد مشکلی پیش نیاد. در حقیقت داده ها تا زمانی که کار نخها باهاشون تموم نشده باقی می مونن و این باعث می شه خطاهای عجیب غریب پیش نیاد.
4. شاید بگید چرا اشاره گر؟ چرا کپی داده رو بر نمی گردونی که اصلا مشکلی پیش نیاد. در حقیقت این روش به شدت رو مصرف حافظه می تونه تاثیر داشته باشه. فرض کنید شما 100 تا نخ دارین که داده 100 مگابایتی رو درخواست کردن. خب مشکلی که پیش میاد اینه شما اینجا 10 گیگ حافظه لازم دارین اما با این روش فقط همون 100 مگ حافظه مصرف می شه.

hamsafar1989
پنج شنبه 15 تیر 1396, 08:22 صبح
خیلی کار خوبی رو شروع کردی
خسته نباشی
امیدوارم بتونیم تو هرچه بهتر شدنش کمکت کنیم :چشمک: