multi-layering

2009/03/22
سلام
اول عید نوروز رو دوباره تبریک میگم
بعدشم میخوام مطلبی رو بذارم که خیلی وقت پیش تایپ کردم ولی وقت نشد توی وبلاگم بذارم.

چندلایه‌ای بودن:

یکی از دلایلی که من عاشق لینوکس هستم همین چندلایه‌ای بودنش هست. حالا این چی هست؟ یه مفهوم کلی هست که خیلی جاها مصداق پیدا میکنه، حالا ما که بحثمون در حوزهٔ کامپیوتر هست، بازم خیلی مصادیق میتونیم براش پیدا کنیم. اونقدر مفهومش ساده‌س که ترجیه با چند تا مثال بیانش کنم.

مثلاً معروفترین نرم‌افزار پارتیشن‌بند چی هست؟ معلومه دیگه partition magic ویندوز. اما همین پارتیشن‌بند معروف و قدرتمند رو فقط بصورت گرافیکی میشه استفاده کرد. یعنی اگه بخواید تحت داس پارتیشن‌بندی کنید مجبورید از همون ابزار مزخرف fdisk داس استفاده کنید. اما توی لینوکس قضیه خیلی فرق داره، ابزار تجت ترمینال parted قدرتش به اندازهٔ ابزار گرافیکی GParted هست، حتی شاید بیشتر باشه چون اصولاً GParted یه رابط گرافیکی برای parted هست. اما این تنها رابط گرافیکی نیست که برای parted نوشته شده. QTParted و VisParted و از همه باحال‌تر YaST Partitioner هم هستن. پس شما در هر محیطی که باشید(ترمینال، گرافیکی و GTK رو داشته باشید یا QT رو، یا هیچ کدوم رو نداشته باشید از VisParted استفاده کنید، مثل لینوکس لایو 54 مگابایتی Parted Magic) همه جا قدرت ابزار Parterd رو خواهید داشت. (نکتهٔ دیگه اینکه YaST Partitioner و کلاً ابزارهای YaST هم رابط مبتنی بر GTK دارن هم رابط مبتنی بر QT هم حتی رابط مبتنی بر ncurses که توی ترمینال اجرا بشه). خیلی نرم‌افزارهای تحت ترمینال هستن که ابزار قدرمتندی هستن، ولی چون کار کردن با ترمینال(و به خاطر سپردن کلی اوپشن و آرگومان) برای همه راحت نیست(محبوبیت ابزارهای گرافیکی رو نداره) یه عده ای اومدن برای اون ابزار قدرتمند تحت ترمینال، رابط گرافیکی نوشتن. پس این برنامهٔ گرافیکی دو لایه داره، لایهٔ بالاییرابط گرافیکی وابسته هست، و لایهٔ پایینی موتور درونی و رابط سادهٔ تحت ترمینال. لایهٔ بالایی به لایهٔ پایینی وابسته هست، اما لایهٔ پایینی به لایهٔ بالایی وابسته نیست و میتونه مستقل کار خودش رو انجام بده. پس میشه لایهٔ بالایی رو عوض کرد (یه رابط گرافیکی دیگه برای برنامه استفاده کرد). در ضمن کسی که یک رابط گرافیکی رو می‌نویسه، دیگه با جزئیات موتور درونی برنامه کاری نداره و با اونها سر و کله نمی‌زنه، و فقط تمرکز خودش رو روی رابط گرافیکی می‌ذاره.

شاید اصطلاح Abstraction layer یا «لایهٔ تجرید» رو خونده یا شنیده باشید. اگه به ویکی پدیا مراجعه کنید:

An abstraction layer (or abstraction level) is a way of hiding the implementation details of a particular set of functionality.

In computer science, an abstraction level is a generalization of a model or algorithm, away from any specific implementation.

یک لایهٔ تجرید (یا سطح تجرید) راهی است برای پنهان کردن جزئیات پیاده‌سازی مجموعهٔ خاصی از وظایف(عملکردها).

در دانش کامپیوتر، یک لایهٔ تجرید یک تعمیم برای یک مدل یا الگوریتم هست، مستقل از یک پیاده‌سازی خاص.

بازم ترجیه میدم با مثال مطلب رو روشن کنم. یه مثال واضحش فایل‌سیستم‌ها هستن، با به زبان ساده‌تر، فرمت‌های پارتیشن‌های هارد(یا فلش). هر فایل‌سیستم یک abstraction layer هست برای خوندن و نوشتن دیتاهای هارد. مثلاً شما وقتی یه فایل رو از یه پارتیشن به یه پارتیشن دیگه(یا به همون پارتیشن) کپی می‌کنید، کاری دارید که فرمت پارتیشن مبدا و مقصد چی هست؟! اصلاً ازتون نمی‌پرسه که «با چه فرمتی بخونم؟» و «با چه فرمتی بنویسم؟» چه برسه به اینکه بخواد جزئیات نحوهٔ خوندن از و نوشتن روی هارد رو ازتون بپرسه. برای هر فایل‌سیستم سری کارها (مثل خوندن یک فایل، ایجاد یک فایل یا دایرکتوری جدید، گرفتن لیست محتویات یک دایرکتوری، گرفتن مشخصات یک فایل و…) تعریف شده، که وقتی یک کاربر(یا برنامه) درخواست یکی از این کارها رو به کرنل میده، کرنل(بعد از بررسی مجوزها) اون کار رو بسته به نوع فایل‌سیستم انجام میده، و اون کاربر(یا برنامه) دیگه به جزئیاتش کاری نداره.
همینطور درایورهای سخت‌افزاری هر کدوم یک abstraction layer هستن برای ارتباط با اون سخت افزار.(احتمالاً اصطلاح Hardware Abstraction Layer یا به اختصار HAL رو شنیدید)

همینطور مفهوم Database abstraction layer هم شبیه دو نمونهٔ قبلی هستن.
کتابخانه‌ها(Library ها) هم هر کدوم رو میشه یک abstraction layer تصور کرد(مثل GTK و QT). حتی هر کدوم از زبانهای برنامه‌نویسی. گفتم یه مفهوم خیلی کلی هست که میشه همه جا مصادیقش رو پیدا کرد!

وقتی abstraction layer اینقدر کاربرد و مصداق داره، پس میشه انتظار داشت هر سیستم‌عامل کلی از این abstraction layer ها داشته باشه.
به قول ویکی پدیا:

A typical vision of a computer architecture as a series of abstraction layers: hardware, firmware, assembler, kernel, operating system and applications

Computer_abstraction_layers.svg

هر سیستم‌عامل از یه سیستم چند لایه تشکیل شده. و حتی قسمتهای مختلف یک سیستم‌عامل. اما این قضیه بین سیستم‌عامل‌های مختلف کم و زیاد داره. توی ویندوز کمتر هست و توی یونیکس و لینوکس خیلی بیشتر. مثلاً شما ویندوز بدون گرافیک نمی‌تونید داشته باشید. یا نمی‌تونید محیط گرافیکی ویندوز رو عوض کنید. و توی ویندوز(بر خلاف لینوکس) کرنل به محیط گرافیکی وابسته هست. اما توی لینوکس ما یه چیزی داریم به اسم X Window System که رابط بین کرنل و محیطهای گرافیکی مختلف(Window Manager ها مثل گنوم و KDE) هست و در واقع یک abstraction layer. یا مثلاً توی لینوکس Shell های مختلف(مثل bash و sh و tcsh و…) هر کدوم بصورت یک برنامهٔ جدا و مستقل تعریف شدن که میشه توی ترمینال‌های مختلف اجرا کرد(مثل ترمینال‌های 1 تا 6 و یا terminal emulator هایی مثل gnome-terminal یا konsole یا xterm یا…). اما توی ویندوز حتی شل(که همون داس باشه) از ترمینال جدا نیست و نمیشه تفکیک کرد.(مثلاً نمیشه از شر اون پنجرهٔ کامند زشت خلاص شد. اصلاً خط فرمان ویندوز درپیت نه ظاهر داره نه باطن!)

فکر می‌کنم دیگه واضح شده باشه.

راستی از اونجایی که من از این ساختار چندلایه‌ای بودن خیلی خوشم اومد، سعی کردم برنامهٔ خودم یعنی PyGlossary رو هم دو لایه‌ای کنم. یعنی موتور دورنیش مستقل از رابط گرافیکیش باشه. و یه رابط سادهٔ مبتنی بر خط فرمان براش نوشتم(جدیداً ProgressBar متنی هم براش گذاشتم) که بشه هم با رابط GTK ازش استفاده کرد هم با رابط خط فرمان. رابط گرافیکیش که همینطوری باز میشه(با کلیک روی آیکونش یا اجرای دستورش بدون هیچ اوپشن و آرگومانی). اما برای رابط خط فرمانش کافیه بنویسید:
pyglossary --help
البته فعلاً با رابط خط فرمانش فقط میشه Convert و Reverse کرد(نه Edit).
من خودم این PyGlossary رو توی ویندوز هم اجرا کردم، ولی چون dependency هاش برای ویندوز زیاد هست(python و gtk و python-gtk و python-cairo و چند تا library دیگه که مجموعاً بالای 20 مگ میشه) اجرای رابط گرافیکیش توی ویندوز یه خورده سخته. بنابراین رابط مبتنی بر خط فرمانش میتونه به درد کاربران ویندوز بخوره، چون فقط یه مفسر پایتون میخواد. البته هنوز خوندن از bgl ش برای ویندوز کار نمیکنه(یه کد ++C باید جدا برای ویندوز کامپایل بشه). اما کاربران ویندوز میتونن باهاش مثلاً از دیتابیس Tabfile (مثلاً دیتابیس ساختهٔ خودشون) به StarDict تبدیل کنن(یا بالعکس) و در نتیجه دیتابیس استاردیکت رو ویرایش کنن، البته بصورت غیر مستقیم(با واسطهٔ Tabfile یا xFarDic).

من چون از اول انشام زیاد خوب نبوده، بلد نیستم چطوری بحث رو شروع کنم و خاتمه بدم! پس فعلاً خداحافظ

Advertisements

StarCalendar 1.0.0

2009/03/12

سلام
بالأخره اون تقویمی که وعده داده بودم، اولین ورژنش رو آپلود کردم. یکم دیر شد ولی عوضش چیز توپی شده. امیدورام به درد دوستان بخوره.
در ضمن پیشاپیش عید نوروز رو هم تبریک میگم. این برنامه هم عیدی ما به لینوکس‌کارها
http://ospdev.net/projects/starcal
و اما تغییراتی که نسبت به اپلت تقویم جلالی(برای گنوم) ایجاد کردم:

1- این برنامه بصورت اپلت نیست(که وابسته به window manager باشه) بلکه بصورت پنجره‌ای اجرا میشه پس علاوه بر گنوم، در KDE و سایر محیطهای گرافیکی هم اجرا میشه. در ضمن آیکونش به system tray هم اضافه میشه(چه توی گنوم و چه KDE) و اون گوشه هم روز ماه رو(بعنوان ایکون tray) نشون میده(مثل همون اپلت گنوم). در ضمن توی ویندوز هم اجراش کردم ولی اجراش توی ویندوز یه خورده دردسر داره(باید پایتون و GTK و PyGTK و یه سری کتابخونهٔ دیگه نصب بشه که مجموعاً حدود 20 مگ میشه)

2- پشتیبانی از تقویم هجری قمری اضافه شد. تاریخ‌های قمری در این چند سال اخیر(1384 تا 1388) وقیق هستن، یعنی کاملاً مطابق با تقویم‌های چاپی(و تقویم رسمی ایران) هست(در حالیکه هیچ برنامهٔ تقویم نیست که اینطور باشه، همشون ممکنه یک روز در تاریخپ قمری خطا داشته باشن، مگه اینکه فقط برای یک سال نوشته شده باشن). اما تاریخ‌های قمری در خارج از این سالها(قبل از 1384 و بعد از 1388) ممکنه حداکثر یک روز خطا داشته باشه.

3- تغییرات و بهینه‌سازی‌هایی در ظاهر برنامه، از جمله درشت کردن فونتها(برای خوانایی بیشتر) و تغییر رنگ‌ها. همینطور در تنظیمات برنامه میتونید هر کدوم از سه نوع تقویم(شمسی، میلادی و قمری) رو غیرفعال(یا دوباره فعال) کنید و یا فونتها و رنگ‌های نمایش داده شده رو به سلیقهٔ خودتون تغییر بدید.

4- جدا کردن دیتابیس مناسبت‌ها بعنوان مناسبت‌های شمسی، مناسبت‌های قمری و مناسبت‌های میلادی. در نتیجه این مناسبت‌ها برای تمام سالها نمایش داده میشه(نه فقط برای سالهای 1386 تا 1388). یه سری اشکالاتی هم که در دیتابیس مناسبت‌ها بود رفع شد و مناسبت‌های جدیدی هم اضافه شد.
میتونید در تنظیمات برنامه نمایش یا عدم نمایش مناسبت‌ها رو تنظیم کنید.

5- پشتیبانی از کیبورد. یعنی شما علاوه بر اینکه با کلیک موس میتونید بین روزهای مختلف جابجا بشید، با کلیدهای چهار جهت اصلی کیبورد هم میتونید این کارو انجام بدید، همینطور با زدن دکمهٔ Space یا دکمهٔ Home امروز رو سلکت کنید(مثل زدن دکمهٔ «امروز» با موس).

6- پشتیبانی همزمان از فارسی و انگلیسی. یعنی توی تنظیمات برنامه می‌تونید زبان کل برنامه رو انتخاب کنید(این هیچ ارتباطی به تقویم شمسی یا میلادی نداره). برای اینکه زبان جدید کاملاً اعمال بشه، بعد از زدن دکمهٔ اعمال(Apply) باید یه بار از برنامه خارج بشید(دکمهٔ Quit برنامه یا دکمه Q کیبورد) و دوباره برنامه رو اجرا کنید.
قصد دارم به زودی ترجمهٔ عربی رو هم تکمیل کنم.
اگه بسته‌های language-pack فارسی روی سیستمتون نصب نباشه، برنامه راست به چپ نمیشه و بعضی دکمه‌ها هم(که دکمه‌های پیش‌فرض خود GTK هستن) فارسی نخواهند شد(اگرچه بیشتر برنامه فارسی میشه). برای اینکه کل(100٪) برنامه فارسی بشه و راست به چپ هم نشون بده، باید این چند تا پکیج رو روی سیستم نصب کنید:
language-pack-fa-base
language-pack-fa
language-pack-gnome-fa-base
language-pack-gnome-fa
البته این مال اوبونتو هست، برای توزیع‌های دیگه نمیدونم. توی اوبونتو 8.10 این پکیج‌های بطور پیش‌فرض نیست ولی توی dvd خود اوبونتو 8.10 هست، اگه دارید به مخازن اضافه کنید اگه هم ندارید و نصب کنید. یا از مخازن اینترنت استفاده کنید یا دستی دانلود کنید و نصب کنید.

اینم عکس دسکتاپم که این برنامه و قسمتهای مختلفش رو نشون میده:

screenshot-saeedgnu-starcal-100