گنوم، چندسال اخیر رو در حال بهبود تجربه کاربریش روی دستگاههایی مثل گوشیهای همراه و همچنین تبلتهاست. در کل، داره برای یک انقلاب در صفحات لمسی آماده میشه. حالا، یک رابط کاربری جالب به اسم Phosh (مخففی برای Phone Shell) ارائه کرده که روی دبیان (بله، حتی دسکتاپ!) قابل نصب و اجراست.
نماگرفت زیر، نماگرفتی از صفحه قفل این رابط کاربریه:
و خب همونطوری که میبینید، کار تمیز و نسبتا زیباییه. حالا سوال اینه چطور نصبش کنیم؟ در ادامه مطلب مفصلا توضیح میدم 🙂
نصب قدم به قدم Phosh روی دبیان
گام اول: نصب دبیان
توجه داشته باشید که دبیان مد نظر من اینجا، دبیانیه که شما روی پردازندههای x86 نصب میکنید. اگر قراره این دبیان روی رزبری پای باشه، یا سیستم شخصی شما صفحه لمسی داره، میتونید این قسمت رو نادیده بگیرید. اما من نصب رو روی یک ماشین مجازی با کمک Virtual Box انجام دادم. آموزش نصب دبیان، در اینترنت زیاد پیدا میشه؛ فلذا اینجا حرفی از آموزش نصب به میان نمیارم. فقط حواستون باشه نسخه Net Install دبیان رو دانلود و نصب کنید که چیز اضافهای نداشته باشیم. برای دانلود دبیان هم میتونید به وبسایت دبیان مراجعه کنید و آخرین ISO مورد نظر رو بگیرید.
گام دوم: قبل از نصب Phosh چه کنیم؟
خب اولین کاری که قبل از نصب Phosh کنید اینه که با خودتون یک فنجان قهوه یا نوشیدنی خنک داشته باشید چون پروسه نصب ممکنه شما رو خسته و تشنه کنه. بعد از اون، بد نیست که سیستم رو بروزرسانی کنید. بعد از بروزرسانی سیستمعامل، نوبتی هم باشه نوبت اینه که مستقیم بریم سر نصب Phosh. اینجا هم جا داره نکته مهم رو متذکر بشم که من phosh رو از مخازن نصب میکنم تا صرفا کنجکاوی رفع شده باشه وگرنه روش درستتر نصب phosh نصب از کد منبعه (حداقل اگر روی سیستم x86 و به قصد توسعه نصب میکنید).
گام سوم: نصب و راهاندازی Phosh
خب برای نصب کافیه که دستورات زیر رو اجرا کنیم:
sudo apt install phosh-core
و اگر میخواهید Phosh شما مناسب تبلت باشه:
sudo apt install phosh-tablet
و اگر میخواهید نسخه کامل Phosh رو نصب کنید، کافیه که دستور رو به این شکل تغییر بدید:
sudo apt install phosh-full
و بعد از نصب حدود یک گیگابایت بستههای نرمافزاری، کل میزکار گنوم مخصوص صفحات لمسی یا همون Phosh برای شما نصب خواهد شد. پس از نصب، کافیه که اول سرویسش رو فعال و سپس راهاندازی کنیم:
سپس، صفحه قفل (که بالاتر عکسش رو قرار دادم) و بعد از اون، صفحه ورود رمز به شما نمایش داده میشه.
پس از ورود رمز، وارد صفحه منوی اصلی میشیم که از اونجا میتونیم به نرمافزارها و ابزارهای نصب شده روی سیستم دسترسی داشته باشیم:
خب، حالا با خیال راحت میتونیم از Phosh استفاده کنیم و لذت ببریم 😁
نکات مهم
از اونجایی که Phosh نرمافزار نوپا و نسبتا جدیدیه، لازمه چند نکته مهم رو در موردش متذکر بشم:
نسخه خاصی ازش در مخازن دبیان پایدار موجوده که خب برای یک تست دم دستی و ویرچوالباکسی، بهترین گزینه بود (حداقل برای من) و خب قاعدتا روی مخازن تستینگ و ناپایدار هم قرارش دادند. موقع نصب، مراقب باشید تا به ضررتون نشه 😁 ترجیحا نصب رو روی یک ماشین مجازی انجام بدید.
این میزکار خاص، برای صفحات لمسی خیلی بهینه شده و استفاده ازش با ماوس و کیبرد تا حد زیادی سخته. اگر صفحه لمسی دارید که میتونید به سیستمتون وصلش کنید، احتمالا تجربه کاربری بهتری داشته باشید.
بعضی نرمافزارها اندازهشون برای من مشکل داشت (که احتمالا برمیگرده به ویرچوال باکس). اگر در جای دیگری امتحان بشه شاید اندازه صفحه و برنامهها، مناسب باشه.
کدوم توزیعها از Phosh پشتیبانی میکنند؟
این هم سوال مهمیه، تا جایی که دیدم PostmarketOS (که برمبنای آلپاین ساخته شده) و همچنین Mobian (که برپایه دبیانه) از این میزکار (یا بهتر بگم پوسته) پشتیبانی میکنند. در مورد سایر توزیعها/سیستمعاملهایی که ممکنه گنوم رو اجرا کنند، ایدهای ندارم.
جمعبندی
این بلاگ اصلا قرار نبود نوشته شه، ولی امروز از سر خستگی (دقیقا خستگی 😂) جستجو کردم ببینم Phosh چطور میتونه روی دبیان دسکتاپ نصب بشه. امتحانش کردم و به نظرم پروژه تمیز، باحال و آیندهداری اومد. حالا هم تستش کردم و هم یک سری ایده اومد به ذهنم. در آینده، احتمالا بیشتر با Phosh کار کنم و در موردش بنویسم. در آخر هم بابت وقتی که صرف کردید و این مطلب رو خوندید، ازتون تشکر میکنم.
در دو پست قبلی (+، +) در مورد پروژه جبیر با شما صحبت کردم و توضیح دادم که ایدهش از کجا اومد و چی شد و چه کردیم. قسمت دوم یکم پرش قلم من زیاد بود چون موضوعات زیادی رو شامل میشد اما خب نیاز بود که گفته بشه. حالا رسیدیم به قسمت آخر. در این قسمت، میخوام از این بگم که در جشنواره خوارزمی چه گذشت و چرا جشنواره خوارزمی شروعی بود بر پایان این پروژه.
بذارید قبل از هرچیزی، یک مرور کلی داشته باشیم بر دو قسمت قبلی. در قسمت اول، توضیح دادم که من شیفته اپل شده بودم و میخواستم مثل استیو جابز، یک شخصیت مهم در دنیای تکنولوژی باشم و همون قدر شناخته بشم و همونقدر هم ثروتمند (بالاخره آرزو بر نوجوانان عیب نیست، هست؟) و تصمیمم این شد که یک سیستم عامل بسازم و بعد از کلی تحقیق و توسعه؛ نتیجه این شد که یک سیستم عامل مبتنی بر گنو/لینوکس و توزیع اوبونتو بسازم. اسم این پروژه هم گذاشتیم جبیر.
در قسمت دوم، از فراز و نشیبهای فنی این قضیه گفتم. از این گفتم که چی شد که اینطوری شد و چی شد که ساخته شد. بذارید سادهتر و مفصلتر بگم، اول گفتم که فاز تحقیقم چی بود و چه کردم و چه چیزایی خوندم. بعد گفتم که چرا تصمیم گرفتم بیام سراغ سیستمعاملهای متنباز موجود مثل لینوکس یا BSD و در نهایت گفتم چرا لینوکس رو انتخاب کردم. بعدش از عادت Distro Hopping گفتم (این عادت یعنی که شما بیایید و توزیعهای مختلفی تست کنید و همیشه روی یک توزیع ثابت نمونید) بعدش هم گفتم چی شد که مینت و اوبونتو رو به عنوان مبنا در نظر گرفتم و چطور نسخههای اولیه جبیر ساخته شد.
بعد از اون، از انتشار جبیر و اشتباهاتی که در ساخت این پروژه شد نوشتم. بعد از این موضوع، وارد بحث نسخه ۴ که نسخه جنجالی جبیر بود شدیم (نسخهای که به اینترنت متصل نمیشد، به همراه نظر جادی و تبعاتش) و بعد از اون چه شد که به سراغ BSD رفتیم و همین موضوع هم مزید بر علت شد که جبیر روز به روز به پایان خودش، نزدیکتر بشه.
جشنواره خوارزمی
جشنواره خوارزمی، یک جشنوارهست که در سطوح مختلف (چه مقطع تحصیلی و چه تقسیمات جغرافیایی) برگزار میشه و یکی از اهدافش، اینه که به مخترعین و مبدعین و محققین جوان کمک کنه تا نتایج کارهاشون دیده بشه. مقام آوردن در این جشنواره، خودش یک سری امتیاز خاص به همراه داره که این امتیازات عبارتند از دانشگاه بدون کنکور رفتن (طبیعتا در رشتهای که پروژه/اختراع ارائه کنید) و معافیت سربازی و اینها. البته اینها مال اون زمان بود و الان نمیدونم چطور شده ولی فکر نمیکنم تغییری کرده باشه.
احتمالا اگر الان این رو خوندید و دبیرستانی هستید، براتون خیلی دغدغه شده که حتما در این جشنوارهها شرکت کنید، ولی خواهش میکنم که قبلش حتما مطلبی که اول این پست لینک شده رو یه نگاه بندازید. قدیمیه ولی ارزشش رو داره. خلاصه بگذریم؛ چیزی که اینجا مهمه اینه که شما بدونید اگر طرحتون به زعم داوران جشنواره واقعا خوب بیاد، امتیازاتی دریافت میکنید که میتونه شما رو به اهداف زندگیتون نزدیک کنه.
حقیقتا من از وقتی بچهتر بودم، بچههایی که به این جشنواره راه پیدا میکردند رو از تلویزیون و روزنامه و … دنبال میکردم، دلم میخواست روزی مثل اونها باشم. مادامی که در تهران در مقطع راهنمایی تحصیل میکردم خبری از این جشنواره برای دانشآموزان راهنمایی نبود (سالی که ما شرکت کردیم ولی بود) و همین امر، باعث شده بود که من با این تیپ جشنوارهها غریبه باشم. اما در دبیرستان اوضاع فرق کرد. ما این پروژه رو شروع کرده بودیم. بخصوص سال دوم دبیرستان که بودم، رضا باقرزاده عزیز هم به من پیوست و با هم پروژه جبیر رو پیش میبردیم.
یک روز، ما از مدیر مدرسهمون خواستیم که سالن اجتماعات مدرسه رو در اختیارمون بذاره و از بچههایی که اون ساعت خاص، بیکارن دعوت کنه که بیان و پروژه ما رو ببینن. این هم خودش یکی از حرکات «استیو جابز»گونه بود 🙂 خلاصه این اتفاق افتاد و از قضا، مدیر مدرسه هم خودش اومد در اون جلسه دورهمی حضور پیدا کرد. این قضیه برای ما خیلی خوب بود چرا که حسابی در چشم مدیر مدرسه، درخشیده بودیم.
اما این تمام ماجرا نبود …
روز بعد اون کنفرانس، مدیر مدرسه از من و رضا درخواست کرد که جزییات پروژه رو براش بنویسیم. من هم یک صفحه A4 نوشتم تحویلش دادم. یک هفته بعد، ما رو از سر کلاس (که اگر اشتباه نکنم دینی بود) خواستند به دفتر. ما اول کمی ترسیده بودیم (بهرحال سیستم آموزشی ما ایجاب میکنه که از دفتر بترسیم 😂) و وقتی رفتیم، دیدیم یک آقای میانسالی هم اونجا هستند. مدیر مدرسه به ما گفت که ایشون از مسولین آموزش و پرورش استان هرمزگانن و پروژه ما در مرحله استانی خوارزمی پذیرفته شده.
ایشون گفت که روز بعدش، بریم پیشش. پرسیدیم بعد مدرسه؟ گفت نه، از مدیرتون اجازه بگیرید و دو زنگی رو ما در خدمتتون هستیم. ما هم از این بابت خوشحال شدیم. میدونید چرا؟ چون بالاخره دو زنگ پیچوندن هم خودش صفای خودش رو داشت. حالا از این حال و هوا بیاییم بیرون. ما فرداش رفتیم پیش ایشون. ایشون ما رو برد پیش مسولین خوارزمی و کلی تحویلمون گرفتند. این تحویلگیریها البته دلیل داشت! دو سه سالی بود که از استان هرمزگان در رشته کامپیوتر هیچ پروژهای معرفی نشده بود و اینها هم از این موضوع حسابی خوشحال بودند.
خلاصه که این دوستان، به ما گفتند یک A4 کافی نیست و در قالب یک پرپوزال باید در مورد پروژه بنویسیم. من و رضا هم گفتیم پس ما میریم روی این کار میکنیم و میآییم پیش شما. اون خانمی که در آموزش پرورش به ما گفت که بعدا بریم پیشش، گفت که چهارشنبه ها عصر هم حضور داره در همون دفتر و نیازی نیست کلاس رو بخاطر قرار با ایشون بپیچونیم. خلاصه کلام که ما رفتیم و یک فایل ۲۰-۳۰ صفحهای با عنوان «سیستمعامل جبیر» نوشتیم و این رو پرینت کردیم و در طلق و شیرازه قرار دادیم و چهارشنبه بردیم پیش ایشون.
بعد از کمی بررسی، غلطهای این پرپوزال رو به ما گفت و ما اون رو اصلاح کردیم. بعدش به ما گفتند که تا تیرماه حدودا صبر کنیم (و این ماجرا حدودای فروردین اتفاق افتاد اگر درست یادم باشه). ما هم به درس و مشقمون رسیدیم و امتحان دادیم. اما خب اینجا یک سری اتفاق خاص هم افتاد.اتفاقاتی که به نوبه خودشون جذاب و جالب بودند.
جشنواره خوارزمی استانی
جشنواره استانی، برخلاف کشوری، اینطوری نیست که شما بری از پروژه دفاع کنی. بر اساس همون توضیحاتی که از پروژهها ارائه شده، داوری میکنند و اونایی که حس میشه شانس خوبی برای مقام کشوری آوردن دارند انتخاب میشن. بعد از این، این مورد به صاحبان ایده و پروژه، ابلاغ میشه.
در همین حین، ما که سخت مشغول کار روی جبیر بودیم و حتی یادمه که دونفری با رضا میرفتیم پیش خدمات کامپیوتریها که مجابشون کنیم که یکی دو تا سیستم بدن دست ما که روش جبیر نصب کنیم (شاید باورتون نشه ولی یکی از پلنهای من، برای هر توزیعی که درش نقشی داشتم تولید کامپیوترهای رومیزی با همون سیستمعامل هم بوده) و معمولا اونها هم یه چراغ سبز الکی نشون میدادن، یک باره به تلفن رضا زنگ زدند. رضا گفت «آقای …؟» و بعد گوشی رو روی اسپیکر گذاشت و به ما اعلام شد که در استانی، رتبه اول شدیم (لینک خبر).
در مورد تاریخ خبر باید به شما بگم که این اخبار، بعد از برگزاری جشنواره کار شدند. یعنی ما تیر ماه خبر داشتیم از این که در استانی پذیرفته شدیم ولی ظاهرا قوانینی که روی جشنواره حاکمه، ایجاب میکرد که تا زمان شروع جشنواره سال بعد خبری ازش کار نشه. خلاصه بگذریم. ما دو تا هم خوشحال و سرخوش گفتیم که فرداش میریم آموزش پرورش.
در آموزش و پرورش، بیش از گذشته تحویلمون گرفتند! این بار به ما گفتند که نیازه تا فیلمی بگیریم که هردو توش باشیم (البته ما دو فیلم مجزا گرفتیم. چرا که رضا بیشتر روی جنبه UI و ظاهری قضیه کار میکرد و من روی بیس سیستم) و بعد یک پرپوزال دیگر بنویسیم که یک سری ملاحظات خاص رو درش رعایت کرده باشیم. این ملاحظات شامل نحوه فهرستبندی، استفاده از فونت و … بودند. خلاصه ما دوتا CD و یک کتابچه تحویل دادیم و بعدش مدت نسبتا طولانی، از هم دور شدیم.
جشنواره خوارزمی کشوری
مرداد ماه بود و من به همراه مادرم چند روزی (فکر کنم دو هفته!) آمدیم تهران. در همین روزها، یادمه که رضا به من زنگ زد. بهش گفتم چه خبر؟ چه کارا میکنی؟ و خیلی عادی حرف زد. برای من این موضوع خیلی جالب بود که چطور تونسته بود اونقدر خونسرد باشه و یهو من رو غافلگیر کنه :)) پای تلفن به من گفت که «فلانی زنگ زد و گفت که اوایل شهریور باید تهران باشیم که از پروژه دفاع کنیم.
خلاصه بعد برگشت من به بندر، قرار شد با رضا بریم و در مورد این پروسه بپرسیم. به ما گفتند که داورا اینطورین و باید چه کنید و … (که با تقریب خوبی البته درست نبود) و به ما پولی دادند که بلیت هواپیما تهیه کنیم و با هواپیما بریم تهران. همچنین بودجهای به ما دادند که لباسهای متحدالشکل تهیه کنیم و ما هم دوتا پیراهن گرفتیم که لعنت خدا هم گرونش بود، ولی سال ۹۱ بابت هر پیراهن ۶۰ هزار تومان پول دادیم 😂.
خلاصه ۵ شهریور ۹۱ شد. ما رفتیم فرودگاه بندرعباس و سوار یک عدد ایرباس A300 هواپیمایی ماهان شدیم و به سمت فرودگاه مهرآباد تهران پرواز کردیم. در تهران هم مسول آموزش و پرورش هرمزگان (همون آقای میانسالی که کارهای ما رو انجام داده بود) آمد و ما رو به خوابگاه دانشجویی دانشگاه تربیت دبیری شهید رجایی برد. حقیقتا تا حد خوبی حالمون گرفته شد، چرا که به ما گفته شده بود برای ما هتل رزرو شده و از این دست چرت و پرتا. ولی خب ایرادی نداشت، فرداش روز بزرگی بود.
فرداش رفتیم. ظهر شد و دعوت شدیم که بریم داخل اتاق. داخل اتاق، سهتا آقا نشسته بودند که علیالظاهر، اساتید کامپیوتر همون دانشگاه بودند (اینجا این رو بگم که بعدا روش بحث صورت بگیره، اگر جشنواره خوارزمی یک جشنواره کشوریه، آیا بهتر نیست که فراخوانی زده شه و از اساتید و صاحبنظران کل کشور خواسته شه که داوطلب بشن؟ چرا فقط یک دانشگاه خاص؟) و یک سری سوال پرسیدند. ما وقتی داشتیم صحبت میکردیم و …؛ من اشاره کردم که جبیر مبتنی بر گنو/لینوکس ساخته شده. یادمه یکی اونجا خندید و گفت «پس مثل همون لینوکس فارسیهست…».
حالا شما خودتون حساب کنید که این که این دوستان زده بودند تو کانال مسخرهبازی، چقدر به ما فشار آورد. خلاصه ما ارائه و دفاعمون رو تحویل دادیم و آمدیم بیرون. ناهاری بر بدن زدیم و کمی تهرانگردی کردیم و بعدش هم رفتیم سمت فرودگاه. دقیقا یادمه بعد از این که مسول آموزش پرورش ما رو ترک کرد، ما کاری نداشتیم که انجام بدیم پس با رضا نشستیم به خوندن آموزش Bash و اسکریپتنویسی 😁
خلاصه به سمت بندرعباس برگشتیم و بعد از اعلام نتایج، فهمیدیم که رتبه قابل قبولی در این جشنواره کسب نکردیم. این خودش یک شکست بسیار بسیار بزرگ برای ما محسوب میشد. گرچه کادر مدرسه تاکید داشتند سال بعدش هم شرکت کنیم ولی حقیقتا ما سال بعد تصمیم داشتیم دیگه شرکت نکنیم و همین هم شد. این دقیقا اینجا به این معنا بود که پروژه هم داره تا حد خوبی به آخرای خودش نزدیک میشه.
رفتن روی BSD، بزرگترین اشتباه
هنوز که هنوزه، من سیستمعامل FreeBSD رو به شدت دوست دارم و محاله وقتی نسخه جدید میده، نصبش نکنم و باهاش کمی بازی نکنم. اما حقیقت امر این بود که BSD ها – به جز مک – واقعا برای استفاده دسکتاپ و روزمره مناسب نیستند. حتی روی سرور و روتر و … (که BSDها حرفهای به شدت زیادی برای گفتن دارند) هم معمولا انتخاب خوب و اول نمیتونن باشند.
یکی از مهمترین دلایل، اینه که BSDها معمولا ساپورت سختافزاریشون اونقدری که باید و شاید، خوب نیست. دلیل دیگری که به ذهنم میرسه اینه که استفاده از BSDها به شدت محدوده و بین هزاران شرکت و استارتاپی که مبتنی بر لینوکس هستند، شاید فقط Netflix, WhatsApp و Sony باشند که از FreeBSD (یا نسخههای دیگر BSDها) استفاده کنند. همین امر، باعث شده که BSDها مستندات کمتر و جوامع کوچکتری داشته باشند.
و البته اشتباه دیگری که داشتم این بود که فکر میکردم اگر برم روی BSD و یه بخش خوبی از رابط کاربری هم خودم بسازم (که تاحدی این کار رو کرده بودم) و مجوز اون هم BSD قرار بدم، شاید بتونم کد رو ببندم. اما هیچ کس نبود بهم این نکته رو گوشزد کنه که بستن کد برای پروژهای که تیم کوچکی داره و ساپورت مالی نمیشه و سرمایهگذار خاصی هم نداره، سم مطلقه.
خلاصه با پیادهسازی نه چندان بد، تفکرات اشتباه و صد البته واکنشهای عجیب و غریب جوامع نرمافزار آزاد و متنباز ایران، این پروژه باز بیشتر و بیشتر روی سراشیب سقوط قرار گرفت. اما حقیقت امر اینه که یکی از بزرگترین تیرهای خلاص این قضیه رو، همین جامعه نرمافزار آزاد به این پروژه وارد کرد.
واکنشهای جامعه نرمافزار آزاد ایران و پیامدهایش
من اصلا دوست ندارم در نقش قربانی فرو برم و شکستها و عدم موفقیتم رو گردن کسی بندازم. حقیقتا از این رفتار به شدت بدم میاد و اگر ببینم کسی چنین رفتاری داره خیلی سریع، از دایره دوستی و حتی آشنایی من ممکنه حذف بشه. پس امیدوارم این بند خاص از مطلب من، این حس رو القاء نکنه که در نقش قربانی فرو رفتم.
بگذریم، جامعه نرمافزار آزاد ایران، که در حال حاضر عمدتا حول اوبونتو و در فروم اوبونتو متمرکز شده تقریبا (و این تمرکز هم خودش سم مهلکیه) رفتارهای عجیب و جالبی دارند. این جامعه عموما اینطوری بود که خیلی سخت افرادی که بیرون گود بودند رو میپذیرفت و خیلی وقتها هم نمیتونستند یک سری موضوعات خاص رو بپذیرند. به همین دلیل، رفتارها بیشتر شبیه گنگسترها و یاکوزاها میشد. حقیقتا در مقابل پروژه جبیر هم تا حد زیادی به این شکل برخورد نشان دادند.
برخوردهایی از این دست که «چرا به فلان پروژه کمک نمیکنی؟» اصلا از نظرم بد نیست. خیلی هم خوبه و خیلی راحت میتونه شما رو مجاب کنه که نیاز نیست چرخ رو از اول اختراع کنید. اما خب، گاهی برخوردها سمت ترولینگ و قلدری سایبری پیش میرفت. مثلا شخصی میومد میگفت «بیا کرنل رو بکن داروین» و بعد چند نفر ادامه میدادند. نکته جالب هم این که از سادگی من هم به عنوان یک نوجوان، تا حد خوبی بهرهکشی شده بود اینجا. من الان دانشی دارم که بهم میگه که تعویض کرنل بسیار سخته، و در بعضی موارد کاملا ناممکن. اما اون موقع من چنین آگاهیای نداشتم.
خلاصه بگم که کم کم به جایی رسید که من دیگه میفهمیدم کجاها ملت دارند دستم میندازن. حقیقتا خوشم اومده بود که خودم همراه شم با این قضیه و تا میتونم چرت و پرت ببافم. اما خب حقیقتا این به ضرر من شد چرا بعدتر، برچسب ترول به من چسبید و از جامعه کاملا پاک شد. جامعهای که تقریبا همیشه نشون داده با افراد جدید – صرفنظر از این که آدمهای خوبین یا بد – چنین برخوردی رو داشته و خب این برخوردها، نتایج خوبی هم نداشته. برای مثال، خود من از سال ۹۳ تا ۹۶ واقعا در این جامعه هیچ حضور فعالی نداشتم و ۹۶ دوباره برگشتم بهش. سال ۹۹ هم موارد مشابهی پیش آمد و دلخوریهایی ساخته شد.
خلاصه بگذریم از این موضوع، میخواستم صرفا این موضوع رو شفاف کنم که جامعه، از دور ممکنه قشنگ به نظر برسه اما خب درونش نیازمند سازگاری بالا و همرنگ جماعت شدنه. حقیقتا من هم شخصی نیستم که بخوام همرنگ جماعت باشم، به همین خاطر ممکنه در جوامع مختلف، متضرر بشم 😁
سخن آخر
اول از همه از شما ممنونم که این مطلب رو خوندید و تا اینجا اومدید. دوم، میخوام ازتون دعوت کنم که علاوه بر این وبلاگ، ویرگول هم میتونید مطالب من رو بخونید ولی در ویرگول معمولا انقدر حرافی نمیکنم 🙂 و در نهایت، میخوام یک جمعبندی کلی روی این سه قسمت بکنم و بگم که به پایان آمد این دفتر، حکایت همچنان باقیست.
حقیقتا بعد از شکست پروژه جبیر، من یک درس بزرگ گرفتم. درسی که بهم گفت «نیاز نیست استیو جابز دوم باشی، تو خود خودت باش» و این درس به نظرم بزرگترین نکته شخصیتی بود که میتونستم از انجام چنین پروژهای دریافت کنم. درس و نکته بعدی هم این بود که حرفهای اطرافیان میتونه به شدت روی روان آدم تاثیر بذاره و نباید گذاشت این حرفها، از ما یک موجود کینهای بسازه که بعدتر نیازمند انتقامگیری و پروندهسازی و فلان باشه. درسهای شخصیتی و روانی این پروژه، واقعا برای من مهم و ارزنده بودند.
از نظر فنی هم، درسهای خوبی گرفتم. برای مثال اندازه افرادی که LPIC 1, 2 میگذرونند از لینوکس یاد گرفتم. تا حد خوبی پایتون یاد گرفتم. حتی همین امر باعث شد که بعدتر، روبی یاد بگیرم و … . همچنین یاد گرفتم که نیاز نیست برای متفاوت بودن حتما به سمت BSD رفت بلکه یک رابط کاربری متفاوت هم میتونه به خودی خود، تا حد خوبی تاثیر مثبت روی ذهن افراد داشته باشه.
از منظر بیزنسی هم بخواهیم نگاه کنیم یک درس خیلی خوب گرفتم. اون این که «وقتی تیم کوچیکه یا پروژه تکنفره جلو میره نیازی نیست که کد، بسته باشه. اتفاقا باز بودن کد به نفع توئه». و همین باعث شد از اون به بعد عمده پروژههای من روی گیتهابم قرار بگیرند.
خلاصه که یک پروژه شکستخورده، میتونه پر از درس برای ما باشه. مهم اینه که ما بخواهیم همیشه در سوگ بمونیم؟ یا این که به قدری سوگواری کنیم و بعد از اون سوگواری به سمت انجام یک پروژه جدیدتر قدم برداریم. نمیدونم فیلم Whiplash رو دیدید یا نه، اما در صحنهای یکی از شخصیتها میگه «چارلی پارکر وقتی با اون صحنه مواجه شد، اول سوگواری کرد. بعد یک روز کامل استراحت کرد و بعدش اونقدر تمرین کرد که ما امروز ازش حرف بزنیم». پس باید گفت که این ماییم که انتخاب میکنیم چارلی پارکر باشیم، یا اون نوازندهای که با یک شکست، کلا ساز و نوازندگی رو میذاره کنار.
در پایان، مجددا از شما بابت وقتی که برای خوندن این مطلب گذاشتید تشکر میکنم. همچنین امیدوارم که این تجربه شکست طولانی، تونسته باشه برای شما جرقه یا کمکی باشه در هندل کردن پروژههاتون یا حداقل بهتون کمک کرده باشه که چطور با پروژههای شکست خورده کنار بیایید. امیدوارم که در آینده نزدیک، بتونم با مطالب بیشتری در خدمت شما باشم.
در مطلب پیشین (لینک) اشاره کردم که ایدهها و جرقههای ابتدایی پروژه جبیر، از کجا به ذهنم رسید و چرا مهم بود که اون ایده رو پیاده کنم و حتما به اون هدف برسم. این موضوع، باعث شد که من بیش از پیش تلاش کنم که به هدفی که برای خودم گذاشتم برسم.
در این یکی مطلب، قصدم اینه که در مورد فرایندی که جبیر برای ساخته شدن طی کرد صحبت کنم و قطع به یقین، خیلی از این مراحل قدیمیتر از اونی هستند که شما بتونید الان پیادهسازیشون کنید. پس اگر نیازمند این هستید که توزیع لینوکسی مبتنی بر دبیان یا اوبونتو بسازید، میتونید راهنمای عملی قرار دادن فیل در یخچال و همچنین چگونگی ساخت توزیع لینوکس رو بخونید. ولی اگر دوست دارید سفر طولانی یک نوجوان در مسیر پیادهسازی رویاش رو بدونید، به خوندن همین مطلب ادامه بدید.
بررسی راههای ساخت یک سیستمعامل
ابتدای راه، باید بررسی میکردم که سایرین چطور سیستمعامل ساختند و چطور شده که سیستمهای عاملشون، رشد و نمو خوبی داشته. همونطور که در قسمت اول هم اشاره کردم، یکی از idol های من در زندگی، استیو جابز بود (و کماکان هم هست) و طبیعتا اولین سیستمعاملی که به نظرم اومد که داستان موفقیتش رو مطالعه کنم، مک بود. اما مک یک مشکل بزرگ داشت. بررسی درست و حسابیش نیازمند این بود که حتما یک سیستم اپل تهیه کنم. حالا چه آیمک، چه مکبوک و … . به همین خاطر، مک رو بیخیال شدم.
داستان موفقیت ویندوز هم تقریبا اظهر من الشمسه. این سیستمعامل عمده محبوبیتش رو به این خاطر داره که روی سیستمهای سازگار با PC های IBM نصب میشد و از قضا، همون دوره IBM تصمیم گرفته بود که لایسنس تولید کامپیوترهای شخصی مشابه کامپیوترهای خودش رو به کمپانیهای دیگری مثل Dell, Compaq, HP و … هم بفروشه. پس تعداد بیشتر، مصادف شده بود با مصرف بیشتر و محبوبیت بیشتر.
نهایتا، با خودم گفتم که «خب، میرم بین محبوبیت توزیعهای لینوکس جستجو میکنم». اونجا بود که فهمیدم چندین توزیع ایرانی مثل پارسیکس (متوقف شده)، کارآمد (متوقف شده) و آریوس (متوقف شده) وجود دارند. در عین حال، فهمیدم اینها ویژگیهای مشترک زیادی دارند. خلاصه که این مورد رو گذاشتم در لیست مطالعه که بعدتر در موردش مطالعه کنم و ببینم که دنیا دست کیه.
خلاصه، مطالعه پیرامون موفقیت سیستمهای عامل تموم شد. دلم میخواست اون موقع وارد جامعهای از برنامهنویسان بشم و ازشون یاد بگیرم و انتقال تجربه انجام بشه. به همین خاطر، در وبسایت برنامهنویس، ثبتنام کردم. اونجا بود که متوجه شدم یکی از اعضا، یک سیستم عامل نوشته به اسم آراکس. برخلاف عمده پروژههای سیستمعامل که دیده بودم، این یکی توزیع لینوکس نبود بلکه سیستمعاملی بود که از بیخ و بن توسعه داده شده بود و با خودم گفتم که پسر! باید با این رفیق شم حتما. اما خب نشد، یعنی نمیدونم چی شد ولی احتمالا شلوغی سر ایشون و عدم تمایلشون باعث این شد که دوستیای شکل نگیره.
خلاصه، کمی هم به زبان انگلیسی گشتم. اون موقع مثل الان زبانم خوب نبود و در فهم بسیاری از مطالب، مشکل داشتم. با این حال با گشتن در اینترنت به ویکی توسعهدهنگان سیستمعامل رسیدم. جایی که هزاران و دهها هزاران نفر دیگر، مشغول توسعه پروژههای خودشون بودند و همین باعث شده بود که من یک بهشت برین پیدا کنم. اما اونقدری نگذشت که امیدم ناامید شد. چرا؟ چند مدخل رو که خوندم فهمیدم از صفر نوشتن یک سیستمعامل که بتونه کلی کار ریز و درشت انجام بده به این سادگیها هم نیست. که البته اگر نظر خودم رو بخواهید، خیلی خوب شد که این اتفاق افتاد. بعدا در موردش حرف خواهم زد.
به همین خاطر، یک تحقیق بزرگی در مورد سیستمعاملهای متنباز موجود کردم که ببینم کدوم بعنوان پایه سیستمعامل میتونه گزینه خوبی باشه. گنو/لینوکس، بیاسدیها، هایکو و حتی کولیبری رو چک کردم و به این نتیجه رسیدم که خب، لینوکس بهترین گزینهست! حتی در این میان داشتم به اندروید هم فکر میکردم ولی باز پس ذهنم گنو/لینوکس رو داشتم. حالا وقت این بود که ببینم از کدوم یکی میشه یک نسخه شخصیسازیشده بهتر ساخت.
پیدا کردن توزیع مناسب به عنوان مبنا
خب وقتی که فهمیدم قراره بیس سیستمعامل من لینوکس باشه، نیاز داشتم که ببینم کدوم توزیع بهتره. به همین خاطر بارها و بارها، توزیع عوض کردم (و حتی همین امر موجب این شد که هاردم به شدت کند و حتی خراب بشه. بعد از مدتی حتی مجبور به تعویض هارددیسک لپتاپی شدم که اون زمان داشتم). نخستین توزیع، اوبونتو بود. بعدش دبیان. بعد اوپن سوزه، فدورا و … . به همین سبک و سیاق هزاران توزیع رو تست کردم که ببینم کدوم بهتره. البته دروغ چرا، هزاران خیلی مبالغهست. درستترش اینه که هر توزیعی که اسم و رسمی داشت رو نصب و آزمایش کردم که ببینم قضیه چی به چیه.
اما مشکلاتی هم در این میان بودند. یکی از بزرگترین مشکلات پیش روی من، اینترنتی بود که اون زمان داشتیم. اینترنت پرسرعتی بود نسبتا اما دو مشکل اساسی داشت. اولین مشکل محدودیت حجمی بود و خب طبیعتا میدونید که بسیاری از این توزیعها حتی موقعی که نصب میشن هم نیازمند اینترنت هستند و همین یعنی باید فاتحه اون حجم رو خوند. مورد دوم هم قطعیهای زیاد اون خط خاص بود. خلاصه که با تمام این ماجراها، من تهش به چند کاندیدای قدر قدرت رسیدم.
اولین کاندیدا، خود دبیان بود. اصل کاری، پدر اوبونتو. دبیان نصب و راهاندازیش هربار من رو پیر میکرد البته. به همین خاطر ترجیح دادم که مدتی کنارش بذارم. در همین میان، باز به اوبونتو برگشتم. بعد از بازگشتم به اوبونتو، با لینوکس مینت آشنا شدم. حقیقتا از مفهومی که مینت داشت هم خوشم اومد! فهمیدم که مطابق قوانین خیلی از کشورها، یک تعداد زیادی از نرمافزارها مثل فلشپلیر، فونتهای مایکروسافت، کدکها، واین و … امکان «بازتوزیع» یا Redistribute شدن ندارند. اما مینت از این قاعده مستثناء بود. چطور؟ مینت در ایرلند جنوبی ساخته شده. کشور ایرلند هم مثل روسیه و کشور ما، از کشورهاییه که کپیرایت درش به اون شکل مطرح نیست و شما احتمالا راحتتر میتونید این تیپ بازتوزیعها رو انجام بدید.
وقتی دیدم اینطوریه، با خودم گفتم چرا پایه این قضیه مینت نباشه؟ به همین خاطر مینت نصب کردم تا ببینم چی به چیه و دروغ چرا؟ عاشقش شدم. روی مینت گنوم ۳ نصب کردم و کلی باهاش کار کردم و دیدم عجب چیز خوبیه. خلاصه اینجا بود که کاندیداهای من به مینت و اوبونتو، تقلیل پیدا کردند.
پیدا کردن راهی برای پکیج کردن مجدد توزیع شخصیسازی شده
اینجا دیگه روی لپتاپ مینت نصب کرده بودم. شخصیسازیهای مختلفی رو روش انجام داده بودم و وقتش رسیده بود که یک پکیج ازش بسازم. در واقع میخواستم یک ISO بسازم که بتونم بعدا روی لپتاپ خودم یا کامپیوترهای دیگر به طور کل، نصبش کنم. به همین خاطر از Relinux استفاده کردم (این پروژه تقریبا دو سالی میشه که از رده خارج شده، ولی اون موقع جوان اول ابزارهای ساخت توزیع بود). حالا وقت این رسیده بود که یک مینت خوش رنگ و لعاب با هزاران هزار بسته رنگارنگ، به ISO تبدیل بشه و همین تبدیل همانا و سیستمعاملساز شدن من همان!
اما اینجا یه مشکلی پیش اومد. انقدر نرمافزارها زیاد بودند که حجم ISO تولیدی توسط Relinux بالای ۴ گیگابایت رفت. اگر این پست رو تشریف ببرید بخونید، توضیح دادم که استاندارد ISO9660 یک محدودیت روی حجم داره و بیش از چهار گیگابایت رو نمیتونه در خودش جای بده. همین امر، باعث شد که پروژه رو بکوبم و از اول بسازم. به همین خاطر، دوباره DVD اوبونتو 11.10 رو برداشتم (و در همون حین نخستین بتاهای ۱۲.۰۴ هم داشتند میومدند) و روی لپتاپ نصبش کردم. پس از نصب، تغییراتی روش دادم مثل جایگزینی یونیتی با گنوم، نصب تعدادی نرمافزار و جایگزینی تعداد دیگر. این بار شد! این بار واقعا شد و خب خوشحال و خرم بودم.
عکس از توزیع کاپریس است – کاپریس در سال ۹۹ ساخته شد.
انتشار نسخه اول به صورت LTS و اولین اشتباهات
خب در فروردین سال ۱۳۹۱، نخستین نسخه جبیر آمد. یادمه که ده روز قبل از انتشارش حتی این پست رو در فروم اوبونتو ایجاد کردم که خب همونطور که میتونید بخونید؛ کم هم حاشیه نداشته. خلاصه اینجا بود که اولین اشتباهات رو متوجه شدم. در این قسمت بیش از این که بخوام پیرامون این که جبیر چه بود مانور بدم، میخوام روی اشتباهات مانور بدم.
اولین اشتباه شاید برمیگشت به جهانبینی من. اینطور بخوام بگم که این جهانبینی این طور بود که اگر در ۱۶ سالگی یک سیستمعامل مثل جبیر ساختم، دیگه ته دنیای تکنولوژی و اینام. به قول یه بندهخدایی، دچار سندرم «جلوزدگی از خود» شده بودم. خب این مورد در سنین نوجوانی طبیعیه و حتی همین الان باور دارم که نسبت به سن و سال اون زمانم، واقعا کارم خفن بوده ولی نه اونقدری که خودم همیشه فکر میکردم. بهرحال در دوران نوجوانی خیلیها دوست دارند کارهای بزرگ کنن و همونطور که در مطلب پیشین عرض کردم، این قضیه باعث شد من بشم اینی که الان هستم.
خلاصه این اشتباه، اشتباه اول بود. اشتباه دوم این بود که فکر میکردم اینجا میتونم سبک و سیاق اپل رو پیش بگیرم. یعنی چی؟ یعنی که یک سیستمعامل مبتنی بر یک سیستمعامل دیگر بسازم و بعدش، کدش رو ببندم و نهایتا سختافزارهای مبتنی بر اون سیستمعامل رو به ملت بفروشم. نه روی زیرساخت فکری داشتم، نه روی این که پروانهها چه اجازههایی میدند. خلاصه که اینجا کلی اشتباه پشت هم دیدیم. اما تلاش کردم این موارد رو در نسخه ۲ اصلاح کنم.
نسخه ۲، رابط کاربری افسانهای
توزیع آریوس، علاوه بر این که ریمستر از اوبونتو بود دو ویژگی داشت که از سایر توزیعهای ریمستر؛ متمایزش میکرد. یکیش نصاب آفلاین درایورها بود، دیگری این که یک رابط کاربری خیلی خوشگلی هم داشت که خب به شکل یک نشست روی گنوم اجرا میشد. در نسخه دوم تصمیم گرفتم چنین تغییری رو ارائه بدم. به همین خاطر، با کمک AWN, Mutter و یک سری تغییر ریز دیگر، یک رابط کاربری نسبتا کاستوم ساختم و اسمش هم گذاشتم Legendary UI یا «رابط کاربری افسانهای». همچنین در کنار اون نسخه، یک ایزو با XFCE هم ارائه کردم که خب در این مقطع، جبیر با دو میز کار داشت عرضه میشد.
حقیقتا نسخه ۲ تا حد خوبی ترکوند. به حدی که با این پروژه به جشنوارههای استانی و کشوری (منجمله خوارزمی) راه پیدا کرده بودم. این رو هم اینجا بگم چرا که واقعا نمیتونم این رفرنس رو اینجا ندم 😁 در فیلم The Social Network – که داستان ساخت و رشد فیسبوک رو به شکل سینمایی روایت میکنه – کرکتر Divya Narendra (یکی از شرکای دوقلوهای وینکلواس در پروژه Harvard Connection) در مورد مارک زاکربرگ میگه که «مارک بزرگترین شخصیت دانشگاه شده بود. اون هم دانشگاهی که نوزدهتا برنده نول و پونزدهتا برنده پولتیزر و حتی یک ستاره سینمایی داره». حقیقتا در میان دانشآموزان اون مدرسه و حتی شهر بندرعباس من چنین حسی داشتم و همینجا بود که دوباره کمی از خودم جلو زدم. اما این تمام ماجرا نبود. جزییات این بخش رو، در قسمتهای بعدی این داستان خواهیم خوند.
نسخه ۳ و ۴، مشکل اینترنت و متاع خنده؟
در نسخه ۳، تغییر خاصی نبود جز این که قبل از این که Ubuntu GNOME Remix منتشر بشه، این توزیع با میزکار گنوم عرضه شد (حقیقتا جا داشت این مورد شدیدا بهش اشاره بشه). اگر دوست دارید در مورد این نسخه بیشتر بدونید میتونید به این مصاحبه من با لینوکس سیزن مراجعه کنید و کمی با ذهنیت من در اون سال آشنا شید. نسخه ۳ خیلی حاشیه نداشت. در عین حال، خیلی هم سر و صدا و برند نساخت. یک توزیعی بود که نصب میشد و خلقالله استفاده میکردند.
نسخه ۴، برای من خیلی مهم بود. در این حد که حتی اسم نسخهش هم خواستم یک چیز باحال انتخاب کنم و از همین رو، اسم رو گذاشتم Pirates of Galaxy یا «غارتگران کهکشان». در این یکی نسخه خیلی سعی داشتم که همهچی رو مینیمال در عین حال شخصی نگه دارم. اما یک مشکل اساسی اینجا پیش آمد. مشکل چی بود؟ مشکل این که اوبونتو باگی داشت که اگر شما اون رو باز دوباره بستهبندی میکردی، نمیتونست کارت شبکه رو درست شناسایی کنه و به اینترنت متصل نمیشد. همین موضوع باعث این کامنت از جادی شد:
خب بخش اول کامنت تذکری بود به دوستی که ظاهرا ادب رو رعایت نکرده بود. بخش دوم هم از نظر من بد نیست، اما نکته مهم برخورد جامعه نرمافزار آزاد با این موضوع بود. چرا؟ چون من یادمه حتی سال ۹۶ که خودمم یادم نبود چه کرده بودم تو این سیستمعامل، در بعضی جلسات لاگ و بعضی رویدادها این موضوع شده بود متاع خنده! طبیعتا هیچکس خوشش نمیاد کاری که در نوجوانی کرده و حتی کار بدی هم نبوده (ساخت توزیع لینوکس واقعا کار بدی نیست، شاید بیهوده باشه ولی بد، نه!) سوژه خنده یک جمع باشه.
خلاصه اینجا دیگه شد آخرین جایی که جبیر بعنوان یک توزیع گنو/لینوکس عرضه شد و دفترش به پایان آمد. اما حکایتش همچنان باقی ماند.
رفتن سراغ BSD
بعد از جبیر ۴، دیگه تصمیم رو جدی گرفتم. با خودم گفتم لینوکس برای من سیستم بشو نیست :)) در این حد که هرجا بحثی از لینوکس میشد، سریعا اشاره میکردم به این که در PlayStation 4 از FreeBSD استفاده شده، واتسپ داره FreeBSD استفاده میکنه و OpenBSD ایمنترین سیستمعامل جهانه و اپل با BSD اپل شد و اینها و در عین حال لگدی هم به لینوکس میزدم و میگفتم این سیستمعامل، یک سیستمعامل مردهست.
در همین حین، ما باز به تهران برگشتیم و خب کمی سخت بود که روی توسعه جبیر کار کنم چرا که اینترنت درست و درمونی نداشتم، لپتاپم برای کامپایل کردن کدهای FreeBSD ضعیف بود و کلی داستان و مشکل از این قبیل پیش آمد. خلاصه پس از این که مدتی گذشت و کمی این مشکلات حل شد، موفق شدم که جبیر رو دوباره از نو با کرنل FreeBSD تولید کنم و بعد مدتی حتی اسم کرنل رو از FreeBSD به JabirOS تغییر دادم (که خب این خودش یک اشتباه خیلی خیلی بزرگ محسوب میشد چون عملا از پورتها نمیشد دیگه استفاده کرد) و کلا در مسیری بودم که با خودم میگفتم «دو سال دیگه به اپل رسیدم».
یکی از دلایلش، این بود که من کم کم داشتم وارد مدیای خارجی میشدم. مثلا این وبسایت، خبر انتشار جبیر جدید رو کار کرد یا این یکی، با من مصاحبهای ترتیب داد. همه این موارد دست به دست هم دادند تا من خیلی بیشتر از پیش، از خودم جلو بیفتم.
اما خب این موضوعات پشت سر هم، پیشدانشگاهی و کنکور و ورود به دانشگاه باعث شدند که کلا بیخیال پروژه جبیر بشم و این مورد باعث شد که ذهنم برای پروژههای دیگری که در این سالها انجام دادم بازتر بشه.
این داستان ادامه دارد
فکر میکردم شاید این داستان چهار یا پنج قسمت بشه، اما تا اینجا که توضیحاتم رو ارائه کردم، فکر کنم کلا یک مطلب دیگر که کلیت این دو قسمت رو جمعبندی کنه و کمی به رفتارهای اطرافیان – بخصوص جامعه نرمافزار آزاد – و داستانهایی مشابه شرکت در جشنواره خوارزمی و … اشاره کنه، کافی باشه.
خلاصه، دوست دارم ازتون تشکر کنم که تا اینجای مطلب رو خوندید و همراه من بودید. من همیشه دوست داشتم این تجربه رو مکتوب کنم و خب اتفاقات اخیر، موجب این شد که این مطالب مکتوب بشند و در وبلاگ هم به رشته تحریر دربیان.
در نهایت، برای تکتک خوانندگان این بلاگ، آرزوی موفقیت و خوشحالی میکنم.
احتمالا اگر وبلاگ یا محتوایی که من تولید میکنم رو دنبال کرده باشید، با مفاهیم و اسامی خاصی من رو به یاد خواهید آورد. چه مثل چند ماه اخیر با پروژههای بینایی ماشین ، چه روبی و ریلز که چندین ساله کم کم با اون شناخته میشم، چه لینوکس و سختافزار و این داستانها. احتمالا هم اگر از دنبالکنندگان این وبلاگ باشید، میدونید که داستان برنامهنویس شدن من (قسمت اول، قسمت دوم) چیه و چطور شد که من شدم اینی که هستم.
اما قطع به یقین، خیلی از دوستان قدیمیتر من رو با «پروژه جبیر» یا «جبیر او اس» یا «سیستمعامل جبیر» میشناسند. پروژهای که من رو با جدیت وارد دنیای توسعه نرمافزار، نرمافزار آزاد و جامعه کاربری گنو/لینوکس ایران کرد. در این پست، قصد دارم تا در مورد پروژه جبیر کمی بنویسم. در واقع، قصد من اینه که داستان این پروژه رو تعریف کنم و بگم که چی شد که اینطوری شد 🙂
چرا این مطلب نوشته شد؟
حقیقتا از سال ۹۴ به بعد که دیگه وبسایت پروژه جبیر آپدیت نشد و حتی از برند جبیر برای پروژهای استفاده نشد، دلم نخواست که راجع بهش چیزی بنویسم. چرا که این پروژه علیرغم تمام خوبیها و آموزههاش برای من، خاطرات بدی هم داشت و خب هرچیزی، لازمه که روزی کنار گذاشته بشه. در حقیقت، جایی که انسان حس میکنه باید رها کنه، باید رها کنه و برای من این زمان سال ۹۴ بود. زمانی که همهجا اعلام کردم پروژه جبیر، چه در قالب «توزیع لینوکس» و چه در قالب «نسخهای از BSD» دیگر عرضه نخواهد شد.
اما چندی پیش، پای یکی از پستهای جبیر (لینک) نظری دریافت کردم (که البته تایید نشده) و در بخش آمار وبگاه (که به کمک افزونه Jet Pack بررسی میکنم) هم متوجه شدم که افرادی هستند که در حال رصد کردن گذشته من هستند. یکی از چیزهایی که عمیقا بهش باور دارم اینه که نباید در گذشته افراد زیاد کند و کاو کرد، چرا که تهش شما یا خودت ضایع میشی یا چیزی که دنبالش میگردی چیزی در حد زیربغل مار خواهد بود. پس با این حساب، تصمیم گرفتم که در یک سلسله مطلب جامع، داستان جبیر او اس رو جمع کنم.
حالا وقت اینه که حدودا ده سال در زمان سفر کنم و برسیم به سال ۸۹-۹۰ که این پروژه رو استارت زدم، بگم چی شد که این پروژه به ذهنم رسید و چطور شد که رفتم سمت لینوکس و … .
جرقههای اولیه
بسیاری از افرادی که من رو میشناسند، از ارادتی که نسبت به استیو جابز دارم، خبر دارند. سال حدود ۸۹ بود و من در مجلاتی که اون زمان به صورت روتین از قیمت فلان گوشی و فلان کامپیوتر و فلان کارت گرافیک مینوشتند از رونمایی از محصولات جدید اپل مثل iPhone 4 یا iPad میخوندم. بعد مدتی، با استیو جابز و زندگی اون آشنا شدم و فهمیدم که این بابا، آدمی بوده که خیلی خیلی از صفر شروع کرده (تقریبا بر خلاف خیلی از ابرپولدارهای سیلیکونولی، ایشون اصلا خونواده متمول و حتی اهل فنی نداشته و خونوادهای که درش رشد کرده بوده یک خونواده خیلی معمولی بوده).
خلاصه آشنایی با استیو جابز، بعدش خریدن یک iPod Touch 3G در من جرقهای روشن کرد. جرقهای مبنی بر این که «من باید دنیا را تغییر بدم». تغییر دنیا، کار سختیه. خیلی از ما جایی از زندگی این قصد رو داشتیم ولی کار خاصی براش نکردیم. خیلیها هم حرکتایی زدیم ولی بعدا سرمون به سنگ خورده. خلاصه که خیلیامون اونقدری دیوانه بودیم که روزی بخوایم دنیا رو تغییر بدیم و به قول استیو جابز، افرادی که اونقدر دیوانن که فکر میکنن میتونن دنیا رو تغییر بدن، دقیقا همونایین که دنیا رو تغییر میدن.
در همون سالها بود که ما مهاجرتی از تهران به بندرعباس داشتیم و خب حقیقتا این مهاجرت و دوری از فضای تهران – بویژه محلهای که درش بزرگ شده بودم و طبیعتا بسیاری از همکلاسیهای دبیرستانم هم قرار بود همون بچههای راهنمایی و دبستان باشند – باعث شده بود کمی ناامید و افسرده باشم. تمام این دلایل دست به دست هم دادند که من تصمیم بگیرم که بخوام استیو جابز دوم باشم (شاید اشتباه همین بود، هوم؟).
خلاصه شبانهروز در حال ایدهپردازی بودم. اما ایدهها همین جا متوقف نشدند. ایدهها خیلی بیش از اون چه که فکر کنید پیش رفتند در ذهنم. اما نیاز داشتم یک محرک خیلی اولیه داشته باشم. نمیدونستم چه محرکی ولی بهرحال یک محرک نیاز بود.
من باید سیستمعامل بسازم
بالاخره پیداش کردم. محرکی که لازم داشتم تا باهاش دنیا رو تغییر بدم، پیدا کرده بودم. شاید باورتون نشه ولی به معنای واقعی در نقطه نقطه بدنم شور و شوق رو حس میکردم و برای انجام این کار، انگیزه بسیار بسیار زیادی داشتم. حالا که این انگیزه بود، سوال اینجاست که چرا نه؟ اما قبل از هرچیزی بهتره ببینیم که این انگیزه چی بود.
نمیدونم شما چقدر با نشریات قدیمی آشنایید ولی نشریه مورد علاقه من، یا بهتر بگم یکی از نشریات مورد علاقه من، مجله دانشمند بود. مجله دانشمند مطالب علمی و فنی جالبی داشت. در اون میشد از ژنتیک و زیستشناسی تا هوش مصنوعی و … رو خوند و یاد گرفت و لذت برد. در بسیاری از شمارههاش، کارهای عملی رو توضیح میداد که شما میتونستید در خانه انجام بدید و … . خلاصه کلام که یکی از بهترین نشریاتی بود که میخوندم.
در تابستان ۸۹ یا ۹۰ بود که درست یادم نیست؛ در یکی از شمارههای دانشمند کتاب «سیستمهای عامل: طراحی و پیادهسازی» اثر «اندرو استوارت تنن باوم» معرفی شده بود. به صورت خلاصه بگم، در این مطلب اومده بود که انگیزه تننباوم از نوشتن این کتاب چی بوده و چه فرایندی (بسته شدن کد منبع یونیکس نسخه ۷) باعث شد که سیستمعامل خودش رو از بیخ بنویسه و بعد از اون، شروع کنه به این که مراحل توسعه رو مستند کنه و در قالب یک کتاب برای دانشجویانش و همچنین علاقمندان عرضهش کنه.
اما این کل ماجرا نبود. آخر این مطلب اشاره شده بود که این کتاب و این سیستمعامل (مینیکس) باعث شدند که دانشجوی فنلاندی بیاعصاب، یعنی لینوس تروالدز؛ برای این که بتونه با مینیکس درست و حسابی کار کنه و گروههای گفتوگو رو بخونه و … یه سری ابزار توسعه بده و در همین حین یک هسته هم از بیخ و بن بنویسه. در ادامه توضیح داده شد که لینوس تروالدز یک باره هاردش رو نابود کرد (و خب شاید این نابودی یکباره هارددیسک که در میان لینوکسیها شایعه، از همین قضیه نشات بگیره 😂) و این نابودی باعث شد که سیستمعامل خودش – که ملغمهای از ابزارهای پروژه گنو و کرنلش بود – رو روی دستگاهش نصب کنه.
در ادامه کمی به تاریخچه لینوکس و دعواهای روتین تروالدز با بقیه اشاره کرده بود. این بخش کاملا من رو شیر کرد. من این بند رو که خوندم (و دقیقا یادمه که داخل یک خودرو هم بودیم که من این مطلب رو خوندم) با صدای بلند گفتم که «من باید سیستم عامل بسازم» طوری که خونواده هم نگاهشون به سمتم برگشت. خلاصه که این شد که من تصمیم گرفتم که اولین پروژه خیلی جدی زندگیم، یک سیستم عامل دسکتاپ باشه.
نخستین مطالعات، نخستین پیادهسازیها
خب من بعد از خوندن اون مطالب یادمه که کتابی به اسم «کلید لینوکس» که آموزشش بر مبنای «اوبونتو ۱۰.۰۴» بود رو خوندم و خیلی چیزا ازش یاد گرفتم. در عین حال، روی یک ماشین مجازی اوبونتو نصب کردم و کمی از آموزشهایی که از لینوکس دیده بودم بهره بردم که ببینم چه خبره و دنیاش دست کیه. بعد از اون خلاصه اینطور شد که یک روز تصمیم گرفتم اوبونتو ۱۱.۰۴ (یا دقیق یادم نیست، ۱۱.۱۰) رو روی لپتاپم نصب کنم و حین نصب کل دیتام هم پرید.
بعد از این نصب، شروع به این کردم که یاد بگیرم که چطور میتونم شخصیسازی کنم و تا حد خوبی هم موفق بودم. اما هنوز کلی علامت سوال در ذهنم بود. به همین خاطر، کاری که کردم این بود که وارد فروم اوبونتو شدم و این سوالات رو پرسیدم. اینگونه بود که ماجرای عریض و طویل جبیر، آغاز شد …
این داستان ادامه دارد …
تا همین الان، این مطلب شدیدا طولانی شده. به همین خاطر این مطلب رو اینجا قطع میکنم و اجازه میدم که شما حدس بزنید باقی ماجرا چی شد. البته دروغ چرا، باقی ماجرا رو خیلی زود (شاید حتی فردا شب) در وبلاگ منتشر میکنم و منتظر بازخوردهای شما میمونم.
امیدوارم که این مطالب، اطلاعات خوبی به شما از روند یک پروژه اوپن سورس که از قضا در جاهای مختلفی به شدت اشتباه زده؛ بده و براتون مفید واقع بشه. از این که وقت گذاشتید و این مطلب رو خوندید، ممنونم.
ساخت توزیع لینوکس از جمله کارهاییه که معمولا وقتی کسی وارد دنیای لینوکس میشه دوست داره تجربهش کنه. چرا؟ چون فکر میکنه افراد قبلی که این کار رو کردند، آدمهای خفنی بودن (که تفکر غلطی هم نیست) و فکر میکنند اگر دست کم یک توزیع بسازن آدم خفنی میشن (که تفکر غلطیه).
حالا آیا واقعا آدم خفنی میشیم اگر یک توزیع بسازیم؟ خیر. اما به ما در جهت پیشرفت و خفن شدن کمک میکنه. میپرسید چطوری؟ در جریان ساخت توزیع لینوکس شما با زیر و بم این سیستمعامل آشنا میشید و میفهمید ابزارهای مختلف چطور کار میکنند. این روش، یکی از بهترین روشهای یادگیری لینوکس و حتی سیستمعامله.
فکر کنم پیشتر به قدر کافی در مورد این که چند راه برای ساخت توزیع داریم حرف زدم. در این پست منتها قصد اینه که یک دبیان یا اوبونتویی که از پیش روی سیستم خودمون (یا ماشین مجازی) نصب شده رو به یک ISO زنده تبدیل کنیم.
نصب و پیکربندی دبیان یا اوبونتو
در قدم اول، شما نیاز دارید که دبیان یا اوبونتو رو روی سیستم خودتون یا ماشین مجازی نصب کنید. توصیه شخصی من اینه که در دیسک یا پارتیشن جدایی نصب کنید. چرا؟ چون ما محدودیتهایی در ISO داریم. عموم ISO هایی که از توزیعهای مختلف لینوکس ساخته میشن، استانداردشون iso9660 عه که یک محدودیت ۴ گیگابایتی داره. پس باید حواسمون به این موضوع هم باشه.
بعد از نصب (نصب دبیان و اوبونتو خیلی سادهست : نکست نکست نکست …)، نیازه که این بستهها حتما نصب بشن:
این بستهها شامل یک سری ابزار دم دستی برای مدیریت فایلسیستم و … هستند. حجم زیادی هم ندارند. البته، git که معرف حضور هست برای چی استفاده میشه و خب ما قراره باهاش یه سری چیزا رو از گیتهاب/گیتلب دریافت کنیم.
همچنین، بعد از نصب بستههای بالا، مطمئن بشید که rsync هم در سیستم نصب شده. این بسته معمولا در توزیعهای لینوکسی نصبه، اما اگر نبود هم خطری نداره. میتونید نصبش کنید.
شخصیسازی
خب در بحث شخصی سازی ما سناریوهای مختلفی داریم. در حال حاضر، قصد ورود به بخشهایی مثل تغییر لوگو و … ندارم. اما مثلا شخصی سازی میزکار کجاست؟!
شما اگر دستور زیر رو اجرا کنید:
~:$ ls -a ~
یک سری فایل و فولدر میبینید که با نقطه شروع شدند. اینها اسمشون «نقطهپرونده» یا «داتفایل»ـه. معمولا پیکربندیها اینجان. این پیکربندیها، تنظیمات پوسته، میزکار و … رو شامل میشن.
خب، حالا که در مورد اینها میدونیم با خیال راحت شخصیسازیمون رو انجام میدیم. بعدش با این دستور، پیکربندیهامون رو آماده انتقال به کاربران دیگر میکنیم :
حواستون باشه که یک سری تنظیماتی مثل gnome-keyring در پوشه local هست که باید حذف کنید بعد انتقال.
حالا این skel چیه که انقدر مهمه؟ skel کوتاهشده skeleton عه. در واقع اسکلت کاربرا رو اینجا نگه میداریم. بعد از این که با useradd یا adduser یک کاربر جدید ایجاد کنیم، محتویات این پوشه رو برمیداره میبره میذاره در پوشه خانگی اون کاربر.
به عبارتی فرض کنید که یک سری الگو و نقشه از دکوراسیون خونه داریم، وقتی کسی از ما یه واحد میخره همون الگو رو میبریم در واحدش پیادهسازی میکنیم.
باقی شخصیسازیها هم بیشتر به نصب نرمافزار و … مربوط میشن. گرچه در مورد لوگو و … توضیح زیادی ندادم اما یک تقلبی به شما میرسونم. اگر از دبیان استفاده میکنید، دنبال desktop-base بگردید و اونجا خرابکاری کنید 😁 البته راههای تغییر ظاهر سیستمهای لینوکسی به اندازه راههای رسیدن به خداست، با کمی جست و جو و پرسشگری میتونید به نتیجههای بسیار خوبی برسید.
اسکریپت ساخت دیسک زنده
مدتها پیش در جریان ساخت کاپریس لینوکس (لینک) برای تهیه ایزوی نهایی، یک اسکریپتی نوشتم. این اسکریپت بعدها در ساخت سیستمعامل سانا (لینک) هم استفاده شد. در واقع، این اسکریپت تلاشی برای زنده کردن ابزارهایی مثل remastersys و relinux بود که در دوران قدیم (حوالی سال ۴۲) برای ساخت ایزوی زنده از یک سیستم لینوکسی استفاده میشد.
این اسکریپت رو به این شکل از گیتهاب دریافت میکنیم :
که به این شکل، پوشهای به اسم custom_live برای شما ساخته میشه که حاوی اسکریپت و متعلقاتش (مثل تنظیمات گراب و syslinux) میشه. الان، ما آمادهایم که دیسک زنده بسازیم!
ساخت دیسک زنده
حالا، ما مقدمات ساخت دیسک رو داریم و وقتشه که دیسک رو بسازیم. ابتدا، این دستورات رو اجرا میکنیم :
~:$ cd custom_live
~/custom_live:$ mkdir chroot
با دستور اول وارد پوشه custom_live میشیم و با دستور دوم یک فولدر خالی به اسم chroot ایجاد میکنیم. حالا وقتشه که از rsync عزیزمون استفاده کنیم برای انتقال سیستم نصب شده به این فولدر:
خب حالا وقتشه که با یک دستور جدید به اسم chroot آشنا شیم. این دستور، کارش ارسال یک سیگنال از پردازندهست که دایرکتوری ریشه رو به دایرکتوری مورد نظر ما تغییر بده. البته شرایط خاصی هم داره، مثلا این که سیستمعامل هر دو جا، یکی باشه. معماری یکی باشه و قص علی هذا.
با دستور chroot دایرکتوری root رو به chroot ای که ساختیم تغییر میدیم:
~/custom_live:$ sudo chroot chroot/
و حالا باید یک سری تغییراتی هم اینجا اعمال کنیم. این تغییرات شامل چیان؟ اول از همه دسترسی به اینترنت رو باید به قولی «یارو» کنیم. چطوری یارو کنیم؟ به این شکل :
حالا لازمه یه سری بسته نصب کنیم. البته در حقیقت، چون ما از سیستم نصبشده استفاده کردیم، نیازی نیست تعداد زیادی بسته نصب کنیم و فقط یکیش کافیه :
# apt update
# apt install live-boot
بسته live-boot ماژولهای مورد نیاز کرنل برای بوت شدن به صورت زنده رو هم بهش اضافه میکنه. در واقع به کرنل میگه که «من ازت میخوام به صورت زنده هم بتونی بوت بشی».
بعد از اضافه کردن این بسته، نوبتی هم باشه نوبت اینه که کَش apt رو پاک کنیم و یک کاربر به سیستم اضافه کنیم. به این شکل:
# apt clean
# adduser live
بعد از این که کاربر رو اضافه کردیم، لازمه که لاگین اتوماتیک رو به lightdm و یا gdm (بسته به میزکار، توزیع مبدا و … ممکنه این قضیه فرق کنه) اضافه کنیم. از اونجا که این مطلب یه آموزش عمومیه، این قسمت رو بر عهده شما میذارم.
پس از این، لازمه دسترسی sudo هم به کاربر لایو بدیم :
تذکر مهم: این روش به شدت ناامنه و فقط برای دیسک زنده پاسخگوعه. اگر قراره دیسکتون قابل نصب باشه، حتما در تنظیمات نصاب لحاظ کنید که به صورت NOPASSWD کاربر رو نسازه. البته، نصابهای مطرح معمولا این موارد رو با سوال و جواب لحاظ میکنند.
خب، کافیه که الان با تایپ exit و فشردن کلید اینتر از محیط chroot خارج شیم. یه سری پیکربندی ریز مونده که باید انجام بدیم. این پیکربندیهای ریز در دبیان و اوبونتو متفاوتن ولی تفاوت اونقدری بزرگ نیست. در ادامه با هم میبینیم که چه تفاوتیه.
خب، همونطور که میدونید سیستمعامل برای بوت شدنش نیازمند کرنله. کرنل سیستمعامل و یک initial ram disk برای بوت شدن دیسک زنده نیازه. حالا اینا رو از کجا بیاریم؟ سادهست. از chroot مون میاریم.
در دبیان
خب در دبیان این قضیه راحته. به این شکل فایلا رو کپی میکنیم :
و بعد چند دقیقه ایزوی شما آمادهست. ایزویی که ساختید رو میتونید حالا با استفاده از qemu یا ویرچوالباکس و … تست کنید.
جمعبندی
همونطوری که دیدید، این کار گرچه از شما یه متخصص خفن نمیسازه، به شما یک دید بسیار بسیار خوب از کلیت قضیه ساخت توزیع میده. شاید باورتون نشه ولی خیلی از توزیعهای مطرح امروزی مثل مینت، المنتری و …؛ از همین جاها شروع کردند و این راه شروع خوبی برای یادگیری لینوکس و سیستمعامله.
امیدوارم مطلب، مطلب مفیدی بوده باشه. دوست دارم بدونم وقتی شما با استفاده از این مطلب توزیع خودتون رو میسازید، چه خلاقیتهایی به خرج میدید.
امروز بعد از مدتها به وبسایت محبوب و معروف دیستروواچ سر زدم و دیدم که یکی از سیستم عامل های محبوبم یعنی FreeBSD یک نسخه نامزد انتشار منتشر کرده!
خب با خوشحالی تمام دانلودش کردم.
اولین چیزی که در FreeBSD 11 برام جالب شد، این بود که توی نصاب خیلی ریز شده بودن و سوال پرسیده بودن، یعنی عمده پیکربندی رو جزئی از نصاب کردن که این خودش یک پوئن مثبت در نوع خودش محسوب میشه. و یک پیشرفت خیلی بزرگ، چون عمده کاربران FreeBSD مدیران سیستم ها هستند، پس این تیپ پیکربندی هنگام نصب بدرد میخوره.
خب، بعد نصب، تصمیم گرفتم اول pkg رو راه بندازم. بعد nano رو نصب کردم (ادیتور محبوب من در CLI ! یه چیز تنبل پسند و عالی!) ، بعدش تصمیم گرفتم دسکتاپ رو راه اندازی کنم. دیدم توی هندبوک، به gnome3 اشاره شده، اونجا بود که فهمیدم احتمالا گنوم شل دوست داشتنیمون هم اومده به FreeBSD . پس gnome3 رو نصب کردم و این خطوط رو به rc.conf افزودم :
dbus_enable="YES"hald_enable="YES"#Running GNOME and GDM servicesgdm_enable="YES"gnome_enable="YES"
و بعد از یک ریبوت، چشممون به جمال گنوم شل با 3D Acceleration روشن شد :
و این عکس هم به جهت تایید اصالت سیستم عامل :
در مورد این دسکتاپ، که خب یک دسکتاپ مدرن محسوب میشه و تا مدتها در FreeBSD پیداش نبود، میشه گفت که با اضافه شدنش بدون مشکل به سیستم عامل، میتونه به پیشرفت این سیستم عامل در حوزه دسکتاپ کمک کنه. البته، در کل 11 نرم تر از ۹ و ۱۰ بود که قبل تر تست کرده بودم و حتی به عنوان سیستم عامل اصلی ازشون استفاده میکردم.
در گذشته، پست هایی که در مورد اسمبلی قرار دادم، همه در مورد اسمبلی ۱۶ بیت بودن اما حالا میخوایم بریم سراغ اسمبلی ۳۲ بیت. خب فرق ۱۶ با ۳۲ بیت در چیه؟!
اولین نکته، سایز ثبات هاست! در ۱۶ بیت در هر ثبات میتونستیم حداکثر یک مقدار ۴ رقمی هگزادسیمال ذخیره کنیم ولی در ۳۲ بیت این مقدار به ۸ رقم میرسه! حالا خیلی مسائل دیگه مثل دیتاباس و کنترل باس و … که بماند (چون اینجا داریم برنامه نویسی میکنیم و بیشتر با ثبات ها کار داریم).
اینجا، قضیه یه فرقای کوچولویی داره، مثلا اسمبلر nasm قراره استفاده بشه (گرچه قبلا در ساخت اون سیستم عامل کوچک ازش استفاده کردیم) و همچنین وقفه ها و system call هایی که استفاده میکنیم شماره و مقدارشون و مکانشون متفاوته.
اینجا، مقدار طول رشته ای که خواستیم چاپ کنیم رو توی EDX یا رجیستر داده قرار دادیم. بعدش اومدیم پیامی که میخوایم چاپ بشه رو قرار دادیم درو نECX .
بعدش سیستم کال ۴ یا sys_write رو توی eax قرار دادیم و وقفه ۸۰ رو صدا زدیم. حالا وقفه ۸۰ با مقدار ۴ که توی eax ذخیره شده، میگرده دنبال رشته ای که توی ecx هست و بعدش چاپش میکنه.
اینجا هم مقدار ۰۱ یا sys_exit رو وارد eax کردیم، تا برنامه پس از اجرا، خارج شه. بعد از این هم باز وقفه ۸۰ رو صدا زدیم.
بخش دیتا هم، مثل همه برنامه های قبلی، تمام داده های مورد نیاز رو با Directive ها تعریف کردیم که بتونیم به راحتی توی کد سگمنت ازشون استفاده کنیم و چون قبلا توضیح داده شده، دیگه دوباره کاری نمی کنم. فقط این پست رو نوشتم تا فرقهای اسمبلی ۳۲ و ۱۶ بیت رو ببینیم. که درآینده بسطش خواهم داد به ۶۴ بیت.
در پست های گذشته بسیار بسیار در مورد زبان ماشین و اسمبلی بحث کردیم، اما این بار میخوایم بررسی کنیم که یک دستور، چطور کار میکنه. برای این کار، ما از ساده ترین دستورات استفاده میکنیم. قبل از اون، باید ببینیم که چه اتفاقی میفته که دستورات ما، شناسایی میشن! پس میایم و دستوراتمون رو بررسی میکنیم.
یک دستور در ماشین چطور خونده میشه؟
این خیلی مهمه که بدونیم یک دستور به چه شکلی خونده میشه. بسیار خوب، دستور زیر رو در نظر بگیرید :
که البته این ماشین کد، یک ماشین کد هگزادسیمال هست. اون چهار صفری که داریم که مقداری هست که خواستیم توی AX قرار بدیم و باهاش کاری نداریم، ولی B8 ما ، همون دستوریه که لازمه رمزگشایی شه و به صورت دو دویی به این شکل در میاد :
خب ما یک «دیکدر» (که یک مدار متشکل از n ورودی و دو به توان n خروجی هست) داریم، که این اعداد رو به ترتیب روشن و خاموش میکنه، و به این شکله که ما به دستور میرسیم. در واقع مدارات مربوط به دستور رو خواهیم داشت.
بسیار خوب، حالا که میدونیم چه چیزی باعث میشه که ما بتونیم زبان ماشین رو درک کنیم، بیایم بررسی کنیم که :
زبان ماشین از چند بخش تشکیل شده؟
زبان ماشین، اول به صورت اسمبلی نوشته میشه که به زبون انسان خیلی خیلی نزدیکه. یعنی هرکس کمی انگلیسی بدونه میدونه که کلمه ای مثل ADD یعنی جمع کردن. اما، حالا مشکلی که هست اینه که وقتی «اسمبلی» به «آبجکت کد» یا همون کد هگزادسیمال تبدیل میشه رو هرکسی نمیتونه بخونه. پس راه حل چیه؟
اول باید ببینیم که یک خط آبجکت کد از چیا تشکیل میشه! بیاید این مثال رو در نظر بگیریم باز :
خب اینجا من آبجکت کد رو به صورت کامنت در آوردم. دو بخش داریم، یکیش چهارتا صفر، که بهش عملوند یا Operand میگیم و دیگری «کد عملیات» یا Operation Code هست. مثلا برای انتقال به AX همیشه از B8 استفاده میشه. چرا؟ چون اینتل اینطور خواسته 😀 . بعد از این، این کد هگزادسیمال به یک کد باینری تبدیل میشه که CPU میتونه اون رو برای ما اجرا کنه.
از کجا آبجکت کد رو بخونیم؟
همه اسمبلر های موجود میتونن فایلی تولید کنن که آبجکت کد، سمبلهای به کار رفته و … رو شامل شه، و در اسمبلر MASM این فایل با پسوند LST ساخته میشه. شما میتونید با باز کردن این فایل با یک ویرایشگر متنی و خوندنش، ببینید که هر دستوری چه کدی رو داره.
یک برنامه نمونه
خب، من یک برنامه اسمبلی خیلی ساده نوشتم که اجرا کردنش هیچ خروجی ای نداره (:D ) ولی خب آبجکت کد ها تولید شده و اسمبل بدون مشکل صورت گرفته. این برنامه با آبجکت کدهاش به صورت کامنت به این شکله (بررسی دستور MOV در ۱۲ حالت مختلف) :
اگر یادتون باشه، مدتهای پیش، یک سری مقاله نوشتم، که آخرین مقاله این بود. توی حدود چهار تا مقاله، بررسی کردیم چطور میتونیم یه سیستم عامل ساده و ۱۶ بیتی بنویسیم. اونقدری نگذشت که تصمیم گرفتم برنامه نویسی رو به C تعمیم بدم و سپس NanOS رو بعنوان نسخه اولیه نوشتم، تجربه جالبی بود چون یه درایور ساده کارت گرافیک و کیبرد داشت و چند تا پیام میتونست نشون کاربر بده. اونقدری نگذشت که یه تجمعی به اسم «بنیاد نانو» درست کردیم که NanOS رو توضیح بدیم. NanOS الان سه تا چیزی رو داره که خیلی جالبن : IDT, IRQ و ISR .
برای این که ببینیم اینها چی به چین، اگر توی داس اسمبلی نوشته باشید، احتمالا برای چاپ رشته و کرکتر و خوندنشون این عدد و این عملگر رو دیدید :
خب همونطور که توی مقالات قبلی هم گفتم، int اینجا به معنای «عدد صحیح» نیست، بلکه به معنای «وقفه» است. وقفه های سخت افزاری و نرم افزاری که تا الان استفاده کردیم چه کار میکردن؟ عملکرد پردازنده رو متوقف میکنن و میگن که یه کار جدید انجام بده (به ساده ترین زبان ممکن!). خیلی راحت بگم فرض کنید توی یک کلاس دارید درس میدید (عمل جاری) ، یک نفر در میزنه و شما کار درس دادن رو متوقف میکنید و اینجاست که وقفه اجرا میشه (عمل جدید). خب IDT چیه؟ IDT مخفف Interrupt Descriptor Table ــه که به معنای «جدول توضیح وقفه ها» ست. این جدول، یک ساختمان دادهست که توش توضیح میدیم پردازنده چه جوابی باید به وقفه هایی که بهش وارد میشه بده. در این بین یه IRQ یا Interrupt Request داریم که درخواست دهنده وقفه هاست. درخواست دهنده وقفه، توی خود پردازنده وجود داره، و ما برای استفاده ازش باید براش کد بزنیم. کار IRQ چیه؟ این که نسبت به وقفه ها واکنش نشون بده و سیگنال های مربوطه رو بفرسته. سپس، با استفاده از هندل کننده وقفه ها جواب وقفه ها رو بسنجه، یا برنامه ای رو متوقف کنه و به برنامه جدید اجازه اجرا بده.
خب، در نهایت باید Interrupt Service Routine یا ISR داشته باشیم. ISR کارش کلا اینه که بیاد و چک کنه که وقفه درست انجام شده یا نه، بعدش، بیاد و یک مقدار منطقی به ما بده، که بفهمیم وقفه درست انجام شده یا نه.
بعنوان یک جمع بندی نهایی، میشه گفت که ما اول باید بگیم چه وقفه هایی داریم و هرکدوم چه میکنه (IDT) ، بعد همه اینا رو با یک قطعه خاص تست کنیم (IRQ) و نهایتا با یک نرم افزار از درست کار کردن وقفه هامون مطمئن شیم (ISR). کاربرد این قضیه چیه؟ فرض کنیم سیستم عامل تا حدی پیشرفت کرد و تونست برنامه اجرا کنه، با استفاده از جدول و هندل کننده های وقفه ها، میتونیم برای سیستم عامل خودمون یه اسمبلر طراحی کنیم، کامپایلر ها رو روش بیاریم و برنامه هایی که دسترسی سطح پایین میخواند رو اجرا کنیم.
اگر لینوکسی باشید (یا حداقل با یکی از سیستم عاملهای خانواده *NIX کار کرده باشید) ، به احتمال خیلی زیاد GCC رو میشناسید. GCC که مخفف GNU Compiler Collection هست یک کامپایلر بزرگ، یا بهتر بگیم یه مجموعه از کامپایلرهاست که توسط پروژه گنو ارائه شده. این کامپایلر به صورت پیشفرض روی تمام توزیع های لینوکس هست (چون چیزیه که عمده ابزارهای لینوکس باهاش کامپایل شدند) و احتمالا روزهای اولی که خواستید توی لینوکس کد C بزنید با این کامپایلر بوده و البته کلی هم فحش دادید بهش 😀 . اگر کمی پیش بریم و برسیم به کسایی که تجربه ساخت LFS رو داشتن، اونها هم احتمالا با کامپایل کردن GCC مواجه شدن. شاید نفس گیر ترین بخش ماجرا در LFS همین GCC باشه ، چون هم طولانیه و هم کلی کانفیگ داره! . اما خب کراس کامپایلر قضیش یکم متفاوته.
من چند وقتیه (خیلی وقته!) درگیر ساخت یک سیستم عاملم و کلی هم برای خودم تحقیق کردم و داکیومنت خوندم و حتی داکیومنت هام رو بازنشر دادم. اما مشکل اینجاست که سیستم عامل قبلیمون کاملا با اسمبلی بود ولی این یکی رو میخوایم با C پیاده سازی کنیم. به نظرتون چی میشه؟ هیچی نمیشه! فقط نیاز داریم تا به جای این که صرفا از NASM استفاده کنیم، جناب GCC که برای خودش غولیه رو هم بازی بدیم. اما اگر سیستممون ۶۴ بیتی باشه چطور؟ اصلا اگر سیستم عامل مقصدمون برای پردازنده ای مثل ARM نوشته شده باشه چی؟ برای این که بتونیم نتیجه و خروجی درست و حسابی بگیریم، نیاز داریم تا کراس کامپایلر داشته باشیم. (برای دونستن اهمیت کراس کامپایلر این لینک رو بخونید).
خب GCC برای کامپایل شدن به Binutils نیاز داره. همچنین قبل از کامپایل Binutils برای معماری مورد نظرمون، باید این کتابخونه ها رو نصب کنیم :
خب، حالا که این کتابخونه ها رو نصب کردیم میریم که محیط ساخت و ساز (ممکنه درست نباشه ولی باحال ترین معادل ممکن برای Build Environment بود!) رو فراهم کنیم. من میخوام gcc من، برای i686-elf کار کنه. همچنین نمیخوام خیلی پر و بال بدم به ماجرا و نصب رو راحت و با کاربر خودم انجام بدم، پس این کد ها رو وارد ترمینال میکنم تا توی همون پوشه خونگی، gcc مورد نظرمون قرار بگیره!
exportPREFIX="$HOME/opt/cross"# فراموش نکنید این پوشه رو خودتون باید بسازید :)exportTARGET=i686-elf
exportPATH="$PREFIX/bin:$PATH"
خب، حالا باید binutils رو از اینجا و gcc رو هم از اینجا دانلود کنید، و سورس ها رو درون پوشه ای به اسم src قرار بدید (پوشه src داخل پوشه خونگی شما قرار داره!). بسیار خوب! توی پوشه src پوشه ای بسازید به اسم build-binutils و سپس سورس binutils رو از حالت فشرده خارج کنید. حالا وارد پوشه build-binutils بشید (هیچی رو وارد این پوشه نکنید!) و سپس تایپ کنید :
بعد از زدن این دستور، اسکریپت configure براتون Makefile درست میکنه. من از نسخه ۲.۲۵ استفاده کردم و واقعا بی مشکل بود، شما هم بهتره از همین نسخه استفاده کنید. حالا که Makefile برامون تولید شده کافیه به ترتیب make و سپس make install رو تایپ کنیم تا binutils مون نصب شه. حالا نوبتی هم باشه نوبت gcc دوست داشتنیه!
خب پوشه build-gcc هم بسازیم و بریم داخلش! حالا باید از فایل configure دوباره برای ساختن Makefile استفاده کنیم!