پرنیان امكان استفاده از تقویم شمسی در بسیاری از برنامههای كاربردری را برای كاربران فراهم میسازد. در این مقاله سعی میشود، روش كار پرنیان توضیح داده شود، شناسایی این مكانیزم ممكن است به كاربران پرنیان كمك كند تا بتوانند به شكل موثرتری از آن استفاده كنند.
مشكلات مربوط به تقویم شمسِ یا شاید بایستی بگوییم گاهشمار جلالی ، به برخی ناكارآمدیها وبعضا ناهماهنگیهایی مربوط میشود كه از سیستم عامل ویندوز ناشی میشوند. برای مثال این امكان در سیستم عامل ویندوز وجود ندارد كه شما بتوانید بر اساس SDK آن تقویم جدیدی را به سیستم اضافه كنید. تقویمهای مورد استفاده در ویندوز از پیش تعیین شده و ثابت هستند. و یا اینكه شما در SDK ویندوز، توابع مناسبی برای محاسبات تقویم در اختیار ندارید و یا اینكه تقویم استاندارد مورد استفاده در ایران در پروندهی Locale.nls روی تقویم هجری قمری تنظیم شده و مواردی دیگر كه از حوصلهی این بحث خارج است.
همچنین ناهماهنگیهایی نظیر این مورد كه مایكروسافت در داتنت كلاس خاصی برای تقویم جلالی با نامه PersianCalendar را ارائه میكند ولی عملا استفاده از این كلاس در داتنت به سادگی سایر تقویمها امكان پذیر نیست.
مواردی شبیه آنچه در بالا اشاره شد لزوم پیادهسازی نرمافزارهایی نظیر پرنیان را نشان میدهد. نگارنده امیدوار است با رفع این نواقص و اضافه شدن صحیح تقویم جلالی كاربران بتوانند به سهولت از تقویم مورد علاقهی خود استفاده كنند و دیگری نیازی به انجام كارهای نسبتا پیچیده آنچنان كه در این مقاله توضیح داده میشود، نباشد.
قبل از ورود به بحث لازم است راجع به روشهای مختلف نگهداری اطلاعات مربوط به تاریخ و زمان نكاتی روشن شود. برنامهنویسان برای نگهداری اطلاعات تاریخ، مثلا برای آنكه تاریخ تولد شخص را در یك بانك اطلاعاتی ذخیره كنند از روشهای مختلفی استفاده میكنند. این روشها در طول زمان دچار دگرگونی شده است. در ابتدا به نظر میرسد برای اینكار از رشتههای حروفی استفاده شده است. مثلا یك رشتهی هشت حرفی به شكل "890325" میتواند نماد 25 خرداد سال 89 باشد. مسلما این روش بسیار ناكارآمد است برای مثال نمیتواند اطلاعات مربوط به ساعت را در خود نگهداری كند، و یا اینكه برای نگهداری حداقل به 8 بایت احتیاج دارد. روش دیگر استفاده از ساختارهای پیچیدهتر اطلاعاتی بوده است. برای مثال در سیستم عامل ویندور هنوز از ساختار SYSTEMTIME كه شامل فیلدهایی برای نگهداری عدد سال، ماه، روز، هفته و ... است، استفاده میشود.
| |
اطلاعات تاریخ در SQL Server به صورت یك عدد اعشاری نگهداری میشوند. قسمت صحیح این عدد نشاندهندهی تعداد روزهایی است كه از یك مبداء مشخص تاریخی (1/1/1900 میلادی) سپری شده است |
|
روشهای نوینتر نگهداری اطلاعات تاریخ، به سبك هوشمندانهتری مسئله را حل میكنند. برای مثال اطلاعات تاریخ در SQL Server به صورت یك عدد اعشاری نگهداری میشوند. قسمت صحیح این عدد نشاندهندهی تعداد روزهایی است كه از یك مبداء مشخص تاریخی (1/1/1900 میلادی) سپری شده است. شما میتوانید این موضوع را براحتی در برنامهی اكسل تجربه كنید. اكسل را اجرا كنید و در یكی از خانهها عدد 40311 را وارد كنید. سپس با فرمت این خانه را برای نمایش تاریخ تنظیم كنید و میبینید كه این خانه مقدار 2010/06/02 را نشان میدهد. توجه كنید كه 40311 تقریبا 110*365 است، كه به معنای 110 سال بعد از سال 1900 یعنی سال 2010 است. نكتهی مهم در این روش آنست كه اصولا اطلاعات ذخیره شده وابسته به یك سیستم خاص تقویم نیست، تعداد روزهای سپری شده در تقویم شمسی و یا میلادی عدد ثابت 40311 است.
این روش نگهداری اطلاعات تاریخی به خصوص برای انجام محاسبات بسیار موثر است. برای مثال اگر به خواهیم دو روز به جلو برویم كافی است عدد تاریخ را با 2 جمع كنیم. و یا برای مقایسهی دو تاریخ كافی است عدد متناظر آنها را با هم مقایسه كنیم. با اینكه این روش محاسبات را بسیار تسهیل میكند و روش بهینهای برای نگهداری اطلاعات تاریخ در برنامههای كامپیوتری را فراهم میكند، مسلما استفاده از این روش برای كاربران انسانی امكان پذیر نیست كاربران نمیتوانند از روی این اعداد به سرعت تاریخ مورد نظر را درك كنند و یا برای وارذ كردن تاریخ تولد خود تعداد روزهای سپری شده از 1900/1/1 را محاسبه كنند. به این ترتیب هموارده لازم میشود كه برنامهنویسان برای نمایش اطلاعات تاریخ، و همچنین ورود آن تسهیلاتی را آماده كنند.
تسهیلاتی كه در بالا به آن اشاره شد، معمولا به صورت دو تابع نمود پیدا میكنند. این دو تابع ممكن است در نرمافزارهای مختلف اسامی كاملا متفاوتی داشته باشند اما در عمل كاربردهای یكسانی دارند. یكی از آنها میتواند با در اختیار داشتن اعداد مربوط به سال، ماه و روز، عدد متناظر تاریخ (روزهای سپری شده از مبدا) را محاسبه كند و دیگری به عكس میتواند بر اساس یك عدد تاریخ، اعداد متناظر سال، ماه و روز را در اختیار قرار دهد.
اگر نرمافزاری داشته باشیم كه به این روش محاسبات تاریخ را انجام میدهد، برای آنكه تقویم به شكل مطلوب ما نشان داده شود كافی است این دو تابع را تصحیح كنیم. اولین تابع بایستی به ترتیبی تغییر داده شود، كه عدد تاریخ را بر اساس تقویم شمسی درست محاسبه كند مثلا اگر اعداد 1389، 3، و 12 به عنوان سال، ماه و روز به آن داده شود عدد درست یعنی 40311 را محاسبه كند و دومین تابع همین كار بدرستی برای محاسبات معكوس تاریخ انجام دهد، عملا ما میتوانیم در این نرمافزار به سادگی از تقوبم شمسی استفاده كنیم. از آنجاییكه هرگونه محاسبه و یا ذخیرهسازی تاریخ در داخل برنامه صرفا با اعداد انجام میشود، در عمل هیچگونه تغییر و یا اشكالی در آن بوجود نخواهد آمد. این دقیقا همانكار سادهای است كه پرنیان انجام میدهد. فقط اشكال آنست كه پیدا كردن این توابع به سادگی در كدهای ماشین امكانپذیر نیست.
برای آنكه برنامههای كامپیوتری بتوانند روی یك ماشین اجرا شوند، لازم میشود ابتدا از زبانی (مانند بیسیك) كه برای كاربر انسانی قابل فهم است به زبانی كه اصطلاحا كد ماشین نامیده میشود، تبدیل شود. كدهای ماشین، برای اجرا مناسب هستند اما عملا درك آنها برای كاربر انسانی بسیار مشكل است. از آنجاییكه معمولا نرمافزارهای كاربردی (نظیر مایكروسافت آفیس) فقط به صورت كدهای ماشین در دسترس هستند و ما به سورس این برنامهها دسترسی نداریم، یافتن توابع تاریخ در آنها كار نسبتا سخت و طاقتفرسایی است كه دوستان من در گسترهنگار برای تولید پرنیان بایستی انجام دهند. البته مسلم است كه هر كاری كه ممكن است بسیار پیچیده به نظر آید، برای گروهی كه سالها در این زمینه تجربه دارند، آنقدر كه سخت به نظر میرسد، پیچیده نیست.
پس از پیدا كردن توابع نوبت به جایگزین كردن آنها میرسد. در اینجا باز هم بخاطر در دسترس نبودن سورس كدهای برنامهی اصلی، جایگزینی بایستی با تكنیكهای خاصی صورت پذیرد. پرنیان اینكار را بر اساس روشهایی كه در پروژهی Microsoft Detour مطرح میشوند، انجام میدهد.
| |
وقتی پرنیان اجرا میشود، ابتدا برنامههای اجرا شده را بررسی میكند. در صورتكیه هر یك از برنامههای هدف پیدا شود، عملیات تغییر در آن در حافظهی RAM انجام میشود |
|
نكتهی مهم در پرنیان آنست كه جایگزین كردن، در هنگام اجرا (Runt Time) انجام میشود و به هیچ وجه پروندههای ذخیره شده بر روی دیسكها تغییر داده نمیشوند.
وقتی پرنیان اجرا میشود، ابتدا برنامههای اجرا شده را بررسی میكند. در صورتكیه هر یك از برنامههای هدف پیدا شود، عملیات تغییر در آن در حافظهی RAM انجام میشود. مثلا اگر مایكروسافت اكسل در حال اجرا باشد، پرنیان تغییرات لازم برای استفاده از تقویم هجری شمسی را در آن خواهد داد. به محض اینكه پرنیان بسته میشود، این تغییرات دوباره به حال اول برگردانده میشود. با این روش استفاده از امكانات پرنیان، كاملا در كنترل كاربر است، آنرا اجرا میكند و از امكانات آن استفاده میكند. از آن خارج میشود و برنامههای خود را بدون هیچ تغییری اجرا میكند.
این خصوصیت پرنیان به خصوص برای آندسته از كاربرانی كه نگرانند كه تغییرات فارسیسازی میتواند باعث بروز اشكال در سایر برنامههای آنها شود، بسیار جالب خواهد بود.
همچنین این روش باعث میشود تا در بسیاری از مواقع نصب Patchهای بروزآوری بدون اشكال نصب شود. از آنجاییكه عملیات جستجو و تغییر در زمان اجرا انجام میشود، وقتی شما نسخهی جدیری را نصب میكنید لازم نخواهد بود، نیازی به دریافت نسخهی جدید پرنیان نخواهید داشت.
محاسبات تقویم جلالی
با آنكه پرنیان قبل از ظهور PersianCalendar در داتنت، محاسبات تقویم شمسی را توسط توابعی مخصوصی انجام میداد، ترجیح دادهشد به منظور استفاده از روشهای استاندارد این محاسبات توسط داتنت انجام شود. از اینرو تمامی محاسبات مربوط به تقویم شمسی در نسخههای جدید پرنیان بر اساس كلاس استاندارد PersianCalendar انجام میشود.
پرنیان امكان استفاده از تقویم شمسی را به برخی نرمافزارها اضافه میكند.
پرنیان اینكار را با تغییر در توابع مربوط به محاسبات تاریخ انجام میدهد.
پرنیان تغییر در كدها را به هنگام اجرا و در حافظهی RAM انجام میدهد.
وقتی پرنیان بسته میشود تمامی این تغییرات به حالت اول برگردانده میشوند.