پرنیان چگونه کار میکند
در این مطلب روش کار پرنیان از نظر فنی توضیح داده میشود. پرنیان امکان استفاده از تقویم شمسی در بسیاری از برنامههای کاربردری را برای کاربران فراهم میسازد. در این مقاله سعی میشود، روش کار پرنیان توضیح داده شود، شناسایی این مکانیزم ممکن است به کاربران پرنیان کمک کند تا بتوانند به شکل موثرتری از آن استفاده کنند.
مشکلات مربوط به تقویم شمسِی یا شاید بایستی بگوییم گاهشمار جلالی ، به برخی ناکارآمدیها وبعضا ناهماهنگیهایی مربوط میشود که از سیستم عامل ویندوز ناشی میشوند. برای مثال این امکان در سیستم عامل ویندوز وجود ندارد که شما بتوانید بر اساس SDK آن تقویم جدیدی را به سیستم اضافه کنید. تقویمهای مورد استفاده در ویندوز از پیش تعیین شده و ثابت هستند. و یا اینکه شما در SDK ویندوز، توابع مناسبی برای محاسبات تقویم در اختیار ندارید و یا اینکه تقویم استاندارد مورد استفاده در ایران در پروندهی Locale.nls روی تقویم هجری قمری تنظیم شده و مواردی دیگر که از حوصلهی این بحث خارج است.
همچنین ناهماهنگیهایی نظیر این مورد که مایکروسافت در داتنت کلاس خاصی برای تقویم جلالی با نام PersianCalendar را ارائه میکند ولی عملا استفاده از این کلاس در داتنت به سادگی سایر تقویمها امکان پذیر نیست.
مواردی شبیه آنچه در بالا اشاره شد لزوم پیادهسازی نرمافزارهایی نظیر پرنیان را نشان میدهد. نگارنده امیدوار است با رفع این نواقص و اضافه شدن صحیح تقویم جلالی کاربران بتوانند به سهولت از تقویم مورد علاقهی خود استفاده کنند و دیگری نیازی به انجام کارهای نسبتا پیچیده آنچنان که در این مقاله توضیح داده میشود، نباشد.
روشهای نگهداری اطلاعات تاریخ و زمان قبل از ورود به بحث لازم است راجع به روشهای مختلف نگهداری اطلاعات مربوط به تاریخ و زمان نکاتی روشن شود. برنامهنویسان برای نگهداری اطلاعات تاریخ، مثلا برای آنکه تاریخ تولد شخص را در یک بانک اطلاعاتی ذخیره کنند از روشهای مختلفی استفاده میکنند. این روشها در طول زمان دچار دگرگونی شده است. در ابتدا به نظر میرسد برای اینکار از رشتههای حروفی استفاده شده است. مثلا یک رشتهی هشت حرفی به شکل "۸۹۰۳۲۵" میتواند نماد ۲۵ خرداد سال ۸۹ باشد. مسلما این روش بسیار ناکارآمد است برای مثال نمیتواند اطلاعات مربوط به ساعت را در خود نگهداری کند، و یا اینکه برای نگهداری حداقل به ۸ بایت احتیاج دارد. روش دیگر استفاده از ساختارهای پیچیدهتر اطلاعاتی بوده است. برای مثال در سیستم عامل ویندور هنوز از ساختار SYSTEMTIME که شامل فیلدهایی برای نگهداری عدد سال، ماه، روز، هفته و ... است، استفاده میشود. اطلاعات تاریخ در SQL Server به صورت یک عدد اعشاری نگهداری میشوند. قسمت صحیح این عدد نشاندهندهی تعداد روزهایی است که از یک مبداء مشخص تاریخی (۱/۱/۱۹۰۰ میلادی) سپری شده است روشهای نوینتر نگهداری اطلاعات تاریخ، به سبک هوشمندانهتری مسئله را حل میکنند. برای مثال اطلاعات تاریخ در SQL Server به صورت یک عدد اعشاری نگهداری میشوند. قسمت صحیح این عدد نشاندهندهی تعداد روزهایی است که از یک مبداء مشخص تاریخی (۱/۱/۱۹۰۰ میلادی) سپری شده است. شما میتوانید این موضوع را براحتی در برنامهی اکسل تجربه کنید. اکسل را اجرا کنید و در یکی از خانهها عدد ۴۰۳۱۱ را وارد کنید. سپس با فرمت این خانه را برای نمایش تاریخ تنظیم کنید و میبینید که این خانه مقدار ۲۰۱۰/۰۶/۰۲ را نشان میدهد. توجه کنید که ۴۰۳۱۱ تقریبا ۱۱۰*۳۶۵ است، که به معنای ۱۱۰ سال بعد از سال ۱۹۰۰ یعنی سال ۲۰۱۰ است. نکتهی مهم در این روش آنست که اصولا اطلاعات ذخیره شده وابسته به یک سیستم خاص تقویم نیست، تعداد روزهای سپری شده در تقویم شمسی و یا میلادی عدد ثابت ۴۰۳۱۱ است.
این روش نگهداری اطلاعات تاریخی به خصوص برای انجام محاسبات بسیار موثر است. برای مثال اگر به خواهیم دو روز به جلو برویم کافی است عدد تاریخ را با ۲ جمع کنیم. و یا برای مقایسهی دو تاریخ کافی است عدد متناظر آنها را با هم مقایسه کنیم. با اینکه این روش محاسبات را بسیار تسهیل میکند و روش بهینهای برای نگهداری اطلاعات تاریخ در برنامههای کامپیوتری را فراهم میکند، مسلما استفاده از این روش برای کاربران انسانی امکان پذیر نیست کاربران نمیتوانند از روی این اعداد به سرعت تاریخ مورد نظر را درک کنند و یا برای وارذ کردن تاریخ تولد خود تعداد روزهای سپری شده از ۱۹۰۰/۱/۱ را محاسبه کنند. به این ترتیب هموارده لازم میشود که برنامهنویسان برای نمایش اطلاعات تاریخ، و همچنین ورود آن تسهیلاتی را آماده کنند. توابع اصلی محاسبات تاریخ تسهیلاتی که در بالا به آن اشاره شد، معمولا به صورت دو تابع نمود پیدا میکنند. این دو تابع ممکن است در نرمافزارهای مختلف اسامی کاملا متفاوتی داشته باشند اما در عمل کاربردهای یکسانی دارند. یکی از آنها میتواند با در اختیار داشتن اعداد مربوط به سال، ماه و روز، عدد متناظر تاریخ (روزهای سپری شده از مبدا) را محاسبه کند و دیگری به عکس میتواند بر اساس یک عدد تاریخ، اعداد متناظر سال، ماه و روز را در اختیار قرار دهد.
اگر نرمافزاری داشته باشیم که به این روش محاسبات تاریخ را انجام میدهد، برای آنکه تقویم به شکل مطلوب ما نشان داده شود کافی است این دو تابع را تصحیح کنیم. اولین تابع بایستی به ترتیبی تغییر داده شود، که عدد تاریخ را بر اساس تقویم شمسی درست محاسبه کند مثلا اگر اعداد ۱۳۸۹، ۳، و ۱۲ به عنوان سال، ماه و روز به آن داده شود عدد درست یعنی ۴۰۳۱۱ را محاسبه کند و دومین تابع همین کار بدرستی برای محاسبات معکوس تاریخ انجام دهد، عملا ما میتوانیم در این نرمافزار به سادگی از تقوبم شمسی استفاده کنیم. از آنجاییکه هرگونه محاسبه و یا ذخیرهسازی تاریخ در داخل برنامه صرفا با اعداد انجام میشود، در عمل هیچگونه تغییر و یا اشکالی در آن بوجود نخواهد آمد. این دقیقا همانکار سادهای است که پرنیان انجام میدهد. فقط اشکال آنست که پیدا کردن این توابع به سادگی در کدهای ماشین امکانپذیر نیست. پیدا کردن توابع در کدهای ماشین برای آنکه برنامههای کامپیوتری بتوانند روی یک ماشین اجرا شوند، لازم میشود ابتدا از زبانی (مانند بیسیک) که برای کاربر انسانی قابل فهم است به زبانی که اصطلاحا کد ماشین نامیده میشود، تبدیل شود. کدهای ماشین، برای اجرا مناسب هستند اما عملا درک آنها برای کاربر انسانی بسیار مشکل است. از آنجاییکه معمولا نرمافزارهای کاربردی (نظیر مایکروسافت آفیس) فقط به صورت کدهای ماشین در دسترس هستند و ما به سورس این برنامهها دسترسی نداریم، یافتن توابع تاریخ در آنها کار نسبتا سخت و طاقتفرسایی است که دوستان من در گسترهنگار برای تولید پرنیان بایستی انجام دهند. البته مسلم است که هر کاری که ممکن است بسیار پیچیده به نظر آید، برای گروهی که سالها در این زمینه تجربه دارند، آنقدر که سخت به نظر میرسد، پیچیده نیست.
جایگزین کردن توابع پس از پیدا کردن توابع نوبت به جایگزین کردن آنها میرسد. در اینجا باز هم بخاطر در دسترس نبودن سورس کدهای برنامهی اصلی، جایگزینی بایستی با تکنیکهای خاصی صورت پذیرد. پرنیان اینکار را بر اساس روشهایی که در پروژهی Microsoft Detour مطرح میشوند، انجام میدهد. وقتی پرنیان اجرا میشود، ابتدا برنامههای اجرا شده را بررسی میکند. در صورتکیه هر یک از برنامههای هدف پیدا شود، عملیات تغییر در آن در حافظهی RAM انجام میشود نکتهی مهم در پرنیان آنست که جایگزین کردن، در هنگام اجرا (Runt Time) انجام میشود و به هیچ وجه پروندههای ذخیره شده بر روی دیسکها تغییر داده نمیشوند.
وقتی پرنیان اجرا میشود، ابتدا برنامههای اجرا شده را بررسی میکند. در صورتکیه هر یک از برنامههای هدف پیدا شود، عملیات تغییر در آن در حافظهی RAM انجام میشود. مثلا اگر مایکروسافت اکسل در حال اجرا باشد، پرنیان تغییرات لازم برای استفاده از تقویم هجری شمسی را در آن خواهد داد. به محض اینکه پرنیان بسته میشود، این تغییرات دوباره به حال اول برگردانده میشود. با این روش استفاده از امکانات پرنیان، کاملا در کنترل کاربر است، آنرا اجرا میکند و از امکانات آن استفاده میکند. از آن خارج میشود و برنامههای خود را بدون هیچ تغییری اجرا میکند.
این خصوصیت پرنیان به خصوص برای آندسته از کاربرانی که نگرانند که تغییرات فارسیسازی میتواند باعث بروز اشکال در سایر برنامههای آنها شود، بسیار جالب خواهد بود.
همچنین این روش باعث میشود تا در بسیاری از مواقع نصب Patchهای بروزآوری بدون اشکال نصب شود. از آنجاییکه عملیات جستجو و تغییر در زمان اجرا انجام میشود، وقتی شما نسخهی جدیری را نصب میکنید لازم نخواهد بود، نیازی به دریافت نسخهی جدید پرنیان نخواهید داشت.
محاسبات تقویم جلالی با آنکه پرنیان قبل از ظهور PersianCalendar در داتنت، محاسبات تقویم شمسی را توسط توابعی مخصوصی انجام میداد، ترجیح دادهشد به منظور استفاده از روشهای استاندارد این محاسبات توسط داتنت انجام شود. از اینرو تمامی محاسبات مربوط به تقویم شمسی در نسخههای جدید پرنیان بر اساس کلاس استاندارد PersianCalendar انجام میشود. خلاصه پرنیان امکان استفاده از تقویم شمسی را به برخی نرمافزارها اضافه میکند.
پرنیان اینکار را با تغییر در توابع مربوط به محاسبات تاریخ انجام میدهد.
پرنیان تغییر در کدها را به هنگام اجرا و در حافظهی RAM انجام میدهد.
وقتی پرنیان بسته میشود تمامی این تغییرات به حالت اول برگردانده میشوند.