پرنیان در پریماورا چگونه کار میکند؟
برخی از دوستان در استفاده از ابزارهایی مانند "پرنیان" نگران هستند که این ابزارها مشکلساز شوند. واقعیت آن است که این نگرانیها خیلی هم بیمورد نیست. کیفیت یک نرمافزار و سلامت کارکرد آن معمولا از طریق بهکار بستن استانداردها و بهروشهای برنامهنویسی حاصل میشود، حال آنکه در جنگولکبازیهایی که برای فارسیسازی و پیادهسازی تقویم شمسی لازم است، بهروشهای شناختهشدهای وجود ندارد و اینکار بیشتر نوعی "هک" محسوب میشود که اساسا تابع استانداردهای شناخته شده نیست. به نظرم میرسد توضیحات فنی در خصوص روشکار برنامه ممکن است کمک کند تا این نگرانیها کمتر شود. این نوشته به این منظور است.
با اینکه همانطور که اشاره شد برای اینکار استاندارد شناختهشدهای وجود ندارد، میشود برای آن قواعد و ملاحظات منطقی در نظر گرفت. شاخصترین این ملاحظات در پرنیان این است: "اجتناب از تغییر هر چیزی که ذخیره میشود." به این معنا که پرنیان حق ندارد چیزی که روی هارد دیسک ذخیره میشود را تغییر دهد. وقتی از برنامهای مثل پریماورا استفاده میکنیم، در واقع در حال تولید اطلاعات هستیم، در این حالت این اطلاعات برنامهی زمانبندی است که در بانک اطلاعاتی پریماورا ذخیره میشود. اگر فارسیساز این اطلاعات را تغییر دهد، آن را از وضعیت استانداردی که پریماورا در نظر دارد خارج میکند. طبیعی است که این وضعیت مطلوبی نخواهد بود. برای مثال در مواردی نظیر ارتقاء یا انتقال اطلاعات مشکلات پیشبینی نشدهای بروز خواهند کرد. به صورت کلی استفاده از فارسیساز بایستی انتخابی باشد، دادههای مشتری متعلق به او است و نبایستی به فارسساز وابسته شود. لازم است هرگاه مشتری اراده کند، بتواند فارسیساز را خاموش کند و مطمئن باشد که دادهها و اطلاعات را بدون هیچ تغییری در اختیار دارد. این قاعده و دستورالعمل تخطی ناپذیری است که در پرنیان رعایت شده است. هر جا در پیادهسازی یک امکان نتوانستهایم آنرا رعایت کنیم، ترجیح دادهایم اساسا از ارائهی این امکان صرف نظر کنیم. بعضا به شوخی میگوییم : "ویژگی اصلی پرنیان آن است که میشود آنرا با خیال راحت پاک کرد!"
اما پرنیان واقعا چگونه این کار را انجام میدهد؟ بخش اصلی کارکرد پرنیان پیادهسازی تقویم شمسی است. نکتهی مهم در اینجا آن است که اصولا اطلاعات تاریخی، برای مثال تاریخ شروع یک فعالیت، به شکلی "بیتقویم" ذخیره میشوند. "بیتقویم" به معنای آنکه این اطلاعات به صورت یک عدد نگهداری میشوند و نه به صورت روز،ماه، سال. این عدد تنها نشاندهندهی تعداد روزها نسبت به یک مبداء زمانی مشخص، مثلا ۱/۱/۱۹۰۰، است. در این معیار مثلا اگر بخواهیم تاریخ ۱۷/۱۲/۲۰۱۷ را ذخیره کنیم لازم است تعداد روزها را محاسبه کنیم، یعنی روزهای سالهای سپری شده را با روزهای ماهها و عدد روز تاریخ جمع کنیم. این محاسبه البته وابسته به تقویم است و برای انجام آن لازم است اطلاعات سالهای کبیسهی میلادی را داشته باشیم. برعکس آن وقتی اطلاعات تاریخ را میخوانیم این اطلاعات را به صورت یک عدد دریافت میکنیم، برای نمایش آن لازم است، این عدد را بر اساس مبداء زمانی تبدیل به سال، ماه، روزی بکنیم. با این استدلال میشود فرض کرد جایی در پریماورا این محاسبات انجام میشود، اگر آنجا را بیابیم و به ترتیبی تغییر دهیم که با تقویم شمسی هم کار کند، میتوانیم تقویم شمسی را به پریماورا اضافه کنیم.
در واقع میشود فرض کرد در پریماورا دو تابع EncodeDate و DecodeDate وجود دارد. اولی سال و ماه و روز را میگیرد و عدد تاریخ را بر میگرداند و دومی بر عکس عدد تاریخ را میگیرد و سال، ماه و روز را محاسبه میکند (البته محاسبات این توابع کاملا متفاوت است و درشکل زیر فقط برای نشان دادن روش کار آورده شده است):
function EncodeDate(y,m,d)
{
return y*365 + m *12 +d;
}
function DecodeDate(value,y,m,d)
{
y = value \365;
m = (value – y* 365)\30
d = value – y*365 – m*30;
}
حال اگر بتوانیم به این توابع دسترسی داشت و آنها را بر اساس محاسبات تقویم شمسی تغییر دهیم، پریماورا از آنها استفاده خواهد کرد و با تقویم شمسی کار خواهد کرد. توجه داشته باشیم پریماورا برای ذخیرهکردن از EncodeDate استفاده میکند و اطلاعات ذخیره شده دقیقا به شکل استاندارد ذخیره میشود. اگر این اطلاعات روی سیستمی باز شود که پرنیان در آن فعال نیست، طبیعتا توابع استاندارد پریماورا تاریخهای معادل میلادی را نمایش خواهند داد. برای جایگزین کردن این توابع ابتدا بایستی آنها را پیدا کرد. ما به سورسهای برنامه دسترسی نداریم. و تنها میتوانیم با استفاده از تکنیکهای "هک" و خلاقیتهای فردی این توابع را در کدهای ماشین (Machine Code) پیدا کنیم. این کاری وقتگیر و اعصاب خردکن است که جزئیات آن در این مبحث مهم نیست.
در پرنیان از تکنیک خاصی برای جایگزینی این توابع استفاده میشود. ما این تغییرات را مستقیما در فایلهای اجرایی روی هارد دیسک انجام نمیدهیم. دستورالعمل "اجتناب از تغییر هر چیزی که ذخیره میشود" بایستی رعایت شود. در عوض ما اینکار را روی حافظهی RAM انجام میدهیم. وقتی پریماورا اجرا میشود، پروندهی اجرایی آن (pm.exe) روی RAM بارگذاری میشود. در این حالت اگر پرنیان در حال اجرا باشد، این پرونده را شناسایی کرده و عملیات جایگزینی توابع را انجام میدهد. به این ترتیب اگر کاربر پرنیان را خاموش کند، میتواند مطمئن باشد که نسخهی اصلی و دست نخوردهی برنامه را اجرا میکند. بر این اساس است که میگوییم: "نگران پرنیان نباشید، هر موقع احساس کردید اشکالی بوجود آورده است، آنرا خاموش کنید، اطلاعات شما صحیح و سالم سر جایش است و البته پرنیان اشکالی بوجود نمیآورد."