چطور یک توزیع لینوکس بسازیم؟

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

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

فکر کنم پیش‌تر به قدر کافی در مورد این که چند راه برای ساخت توزیع داریم حرف زدم. در این پست منتها قصد اینه که یک دبیان یا اوبونتویی که از پیش روی سیستم خودمون (یا ماشین مجازی) نصب شده رو به یک  ISO زنده تبدیل کنیم.

نصب و پیکربندی دبیان یا اوبونتو

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

بعد از نصب (نصب دبیان و اوبونتو خیلی ساده‌ست : نکست نکست نکست …)، نیازه که این بسته‌ها حتما نصب بشن:

~:$ sudo apt install git mtools xorriso squashfs-tools

این بسته‌ها شامل یک سری ابزار دم دستی برای مدیریت فایل‌سیستم و … هستند. حجم زیادی هم ندارند. البته، git که معرف حضور هست برای چی استفاده میشه و خب ما قراره باهاش یه سری چیزا رو از گیت‌هاب/گیت‌لب دریافت کنیم.

هم‌چنین، بعد از نصب بسته‌های بالا، مطمئن بشید که rsync هم در سیستم نصب شده. این بسته معمولا در توزیع‌های لینوکسی نصبه، اما اگر نبود هم خطری نداره. می‌تونید نصبش کنید.

شخصی‌سازی

خب در بحث شخصی سازی ما سناریوهای مختلفی داریم. در حال حاضر، قصد ورود به بخش‌هایی مثل تغییر لوگو و … ندارم. اما مثلا شخصی سازی میزکار کجاست؟!

شما اگر دستور زیر رو اجرا کنید:

~:$ ls -a ~

یک سری فایل و فولدر می‌بینید که با نقطه شروع شدند. این‌ها اسمشون «نقطه‌پرونده» یا «دات‌فایل»ـه. معمولا پیکربندی‌ها اینجان. این پیکربندی‌ها، تنظیمات پوسته، میزکار و … رو شامل می‌شن.

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

~:$ sudo cp -r ~/.config /etc/skel
~:$ sudo cp -r ~/.local /etc/skel
~:$ sudo cp ~/.bashrc /etc/skel
~:$ sudo cp ~/.profile /etc/skel 
~:$

حواستون باشه که یک سری تنظیماتی مثل gnome-keyring در پوشه local هست که باید حذف کنید بعد انتقال.

حالا این skel چیه که انقدر مهمه؟ skel کوتاه‌شده skeleton عه. در واقع اسکلت کاربرا رو اینجا نگه می‌داریم. بعد از این که با useradd یا adduser یک کاربر جدید ایجاد کنیم، محتویات این پوشه رو برمیداره می‌بره میذاره در پوشه خانگی اون کاربر.

به عبارتی فرض کنید که یک سری الگو و نقشه از دکوراسیون خونه داریم، وقتی کسی از ما یه واحد می‌خره همون الگو رو می‌بریم در واحدش پیاده‌سازی می‌کنیم.

باقی شخصی‌سازی‌ها هم بیشتر به نصب نرم‌افزار و … مربوط میشن. گرچه در مورد لوگو و … توضیح زیادی ندادم اما یک تقلبی به شما می‌رسونم. اگر از دبیان استفاده می‌کنید، دنبال desktop-base بگردید و اونجا خرابکاری کنید 😁 البته راه‌های تغییر ظاهر سیستم‌های لینوکسی به اندازه راه‌های رسیدن به خداست، با کمی جست و جو و پرسشگری می‌تونید به نتیجه‌های بسیار خوبی برسید.

اسکریپت ساخت دیسک زنده

مدتها پیش در جریان ساخت کاپریس لینوکس (لینک) برای تهیه ایزوی نهایی، یک اسکریپتی نوشتم. این اسکریپت بعدها در ساخت سیستم‌عامل سانا (لینک) هم استفاده شد. در واقع، این اسکریپت تلاشی برای زنده کردن ابزارهایی مثل remastersys و relinux بود که در دوران قدیم (حوالی سال ۴۲) برای ساخت ایزوی زنده از یک سیستم لینوکسی استفاده می‌شد.

این اسکریپت رو به این شکل از گیتهاب دریافت می‌کنیم :

~:$ git clone https://github.com/Caprice-Linux/live_image custom_live

که به این شکل، پوشه‌ای به اسم custom_live برای شما ساخته میشه که حاوی اسکریپت و متعلقاتش (مثل تنظیمات گراب و syslinux) میشه. الان، ما آماده‌ایم که دیسک زنده بسازیم!

ساخت دیسک زنده

حالا، ما مقدمات ساخت دیسک رو داریم و وقتشه که دیسک رو بسازیم. ابتدا، این دستورات رو اجرا می‌کنیم :

~:$ cd custom_live
~/custom_live:$ mkdir chroot

با دستور اول وارد پوشه custom_live می‌شیم و با دستور دوم یک فولدر خالی به اسم chroot ایجاد می‌کنیم. حالا وقتشه که از rsync عزیزمون استفاده کنیم برای انتقال سیستم نصب شده به این فولدر:

~/custom_live:$ rsync -av --one-file-system \ 
--exclude=/home/* \ 
--exclude=/root/* \ 
--exclude=/tmp/* \ 
--exclude=/sys/* \ 
--exclude=/dev/* \ 
--exclude=/proc/* \ 
--exclude=/var/mail/* \ 
--exclude=/var/spool/* \ 
--exclude=/var/tmp/* \ 
--exclude=/media/* \ 
--exclude=/etc/mtab \ 
--exclude=/etc/fstab \ 
--exclude=/etc/hosts \ 
--exclude=${pwd}/chroot / chroot

خب حالا وقتشه که با یک دستور جدید به اسم chroot آشنا شیم. این دستور، کارش ارسال یک سیگنال از پردازنده‌ست که دایرکتوری ریشه رو به دایرکتوری مورد نظر ما تغییر بده. البته شرایط خاصی هم داره، مثلا این که سیستم‌عامل هر دو جا، یکی باشه. معماری یکی باشه و قص علی هذا.

با دستور chroot دایرکتوری root رو به chroot ای که ساختیم تغییر می‌دیم:

~/custom_live:$ sudo chroot chroot/

و حالا باید یک سری تغییراتی هم اینجا اعمال کنیم. این تغییرات شامل چیان؟ اول از همه دسترسی به اینترنت رو باید به قولی «یارو» کنیم. چطوری یارو کنیم؟ به این شکل :

# rm /etc/resolv.conf
# echo "nameserver 4.2.2.4" > /etc/resolv.conf

بعد از این، لازمه که اسم میزبان رو تغییر بدیم :

# echo "custom" > /etc/hostname

بعدش هم دسترسی ریشه رو یارو کنیم:

# passwd

حالا لازمه یه سری بسته نصب کنیم. البته در حقیقت، چون ما از سیستم نصب‌شده استفاده کردیم، نیازی نیست تعداد زیادی بسته نصب کنیم و فقط یکیش کافیه :

# apt update
# apt install live-boot

بسته live-boot ماژول‌های مورد نیاز کرنل برای بوت شدن به صورت زنده رو هم بهش اضافه می‌کنه. در واقع به کرنل میگه که «من ازت میخوام به صورت زنده هم بتونی بوت بشی».

بعد از اضافه کردن این بسته، نوبتی هم باشه نوبت اینه که کَش apt رو پاک کنیم و یک کاربر به سیستم اضافه کنیم. به این شکل:

# apt clean
# adduser live

بعد از این که کاربر رو اضافه کردیم، لازمه که لاگین اتوماتیک رو به lightdm و یا gdm (بسته به میزکار، توزیع مبدا و … ممکنه این قضیه فرق کنه) اضافه کنیم. از اونجا که این مطلب یه آموزش عمومیه، این قسمت رو بر عهده شما میذارم.

پس از این، لازمه دسترسی sudo هم به کاربر لایو بدیم :

# echo "live      ALL=(ALL)       NOPASSWD: ALL" > /etc/sudoers.d/live

تذکر مهم: این روش به شدت ناامنه و فقط برای دیسک زنده پاسخگوعه. اگر قراره دیسکتون قابل نصب باشه، حتما در تنظیمات نصاب لحاظ کنید که به صورت NOPASSWD کاربر رو نسازه. البته، نصاب‌های مطرح معمولا این موارد رو با سوال و جواب لحاظ می‌کنند.

خب، کافیه که الان با تایپ exit و فشردن کلید اینتر از محیط chroot خارج شیم. یه سری پیکربندی ریز مونده که باید انجام بدیم. این پیکربندی‌های ریز در دبیان و اوبونتو متفاوتن ولی تفاوت اونقدری بزرگ نیست. در ادامه با هم می‌بینیم که چه تفاوتیه.

خب، همونطور که می‌دونید سیستم‌عامل برای بوت شدنش نیازمند کرنله. کرنل سیستم‌عامل و یک ‌initial ram disk برای بوت شدن دیسک زنده نیازه. حالا اینا رو از کجا بیاریم؟ ساده‌ست. از chroot مون میاریم.

در دبیان

خب در دبیان این قضیه راحته. به این شکل فایلا رو کپی می‌کنیم :

~/custom_live:$ cp chroot/boot/vmlinuz-* isotmp/live/vmlinuz
~/custom_live:$ cp chroot/boot/initrd.img-* isotmp/live/initrd.img

در اوبونتو :

در اوبونتو، اون initrd.img کمی اذیت می‌کنه. در واقع بخش اول عین دبیانه ولی بخش دوم اینطوریه :

~/custom_live:$ sudo cp chroot/boot/initrd.img-* isotmp/live/initrd.img
~/custom_live:$ sudo chown $USER:$USER isotmp/live/initrd.img

خب حالا مرحله آخر رسیده. مرحله آخر جاییه که میذاریم ISOمون پخته بشه …

ساخت ISO نهایی

خب لحظه موعود رسید. وقتشه که این همه کاری که کردیم رو ببریم در قالب یک ایزو. برای این کار فقط کافیه که اسکریپت build_image.sh رو به این شکل اجرا کنید:

~/custom_live:$ ./build_image.sh CustomLive.iso isotmp CUSTOMLIVE chroot

و بعد چند دقیقه ایزوی شما آماده‌ست. ایزویی که ساختید رو میتونید حالا با استفاده از qemu یا ویرچوال‌باکس و … تست کنید.

جمع‌بندی

همونطوری که دیدید، این کار گرچه از شما یه متخصص خفن نمی‌سازه، به شما یک دید بسیار بسیار خوب از کلیت قضیه ساخت توزیع میده. شاید باورتون نشه ولی خیلی از توزیع‌های مطرح امروزی مثل مینت، المنتری و …؛ از همین جاها شروع کردند و این راه شروع خوبی برای یادگیری لینوکس و سیستم‌عامله.

امیدوارم مطلب، مطلب مفیدی بوده باشه. دوست دارم بدونم وقتی شما با استفاده از این مطلب توزیع خودتون رو می‌سازید، چه خلاقیت‌هایی به خرج می‌دید.

Share

به روز رسانی اوبونتو از نسخه های LTS به STS

توزیع اوبونتو، معمولا در دونسخه ارائه میشه. نسخه های «پشتیبانی طولانی مدت» یا همون LTS (مخفف Long Term Support ) که اگر اشتباه نکنم هر کدوم تا پنج سال، پشتیبانی دریافت میکنند. این پشتیبانی به معنای پشتیبانی از سمت کنونیکال (شرکت سازنده این توزیع)، دریافت آپدیت های امنیتی و همچنین به روز شدن مستندات توزیع است.

نسخه های STS که طبق روتین ارائه اوبونتو هر شش ماه یه بار میان، قبلا دو سال پشتیبانی می‌شدند ولی مثل این که الان این پشتیبانی کمتر شده و همون شش ماه (یا یک سال، دقیقا نمیدونم و یادم نیست) پشتیبانی رو دریافت میکنن. این نسخه ها به قول معروف «روی لبه تکنولوژی حرکت میکنند» و معمولا تکنولوژی های جدیدی رو در خودشون جای دادن.

هر کدوم از این نسخه ها، مزایای خودش رو داره. خیلی از افراد رو دیدم که با هر آپدیتی، سریعا سیستم عامل خودشون رو آپدیت میکنند و خیلی ها هم ترجیح میدند دو سال یک بار، نسخه های LTS رو آپدیت کنند و یا حتی کل پنج سالی که برای LTS ها پشتیبانی در نظر گرفته شده، روی اون بمونن. اما برگردیم به دسته اول!

فرض کنیم شما آخرین اوبونتوی LTS (در حال حاضر ۱۸.۰۴ ) رو نصب کردید و میخواهید به STS جدید (در حال حاضر ۱۹.۰۴) به‌روز رسانی کنید. برای این کار، نیاز به چند مرحله داریم. اول لازمه که update-manager رو نصب کنیم :

sudo apt install update-manager-core

و البته معمولا این بسته روی اوبونتو نصب شده. فقط در صورتی که نصب نباشه، این دستور نصبش میکنه. نصب هم باشه یا به شما میگه که آخرین نسخه رو نصب کردید یا به روز رسانی میکنه.

گام دوم، اینه که به آپدیت منیجر، بگیم که به جای lts در نسخه های normal برامون دنبال ریلیز جدید بگرده. فقط کافیه این فایل رو با یک ویرایشگر متن باز کنیم (البته ترجیحا ویرایشگرهای خط فرمان؛ چون دسترسی ریشه نیاز داریم) :

/etc/update-manager/release-upgrades

سپس در این فایل، شما احتمالا این خط رو می‌بینید :

Prompt=lts

با تغییر مقدار متغیر prompt به normal ، شما به آپدیت منیجر گفتید که در نسخه های STS به دنبال ریلیز جدید بگرده. بعد از این که عبارت lts رو با normal جایگزین کردید، کافیه فایل رو ذخیره کرده، ببندید و در ترمینال تایپ کنید :

do-release-upgrade

و جایی هم نیاز به پسورد داشته باشید، این دستور ازتون دریافتش خواهد کرد.

این راه حلی بود که خودم دقیقا استفاده کردم برای آپدیت به ۱۹.۰۴. نمیدونم قبلتر کسی در وب فارسی توضیحش داده یا نه، ولی خب امیدوارم که به کارتون بیاد 🙂

Share

چگونه در سطح سخت افزار، عدد تصادفی تولید کنیم؟

تولید عدد تصادفی، یکی از کارهاییه که در برنامه نویسی بسیار نیازش داریم. برای چه منظورهایی؟ برای مثال فرض کنید میخواهیم یک شبکه عصبی طراحی کنیم و وزن‌های ما باید تصادفی باشن. به همین خاطر، ما از عدد های تصادفی برای تولید وزن استفاده میکنیم. در سطح نرم افزار، تولید عدد تصادفی بسیار آسونه. مثلا در پایتون ما میتونیم به این شکل عدد تصادفی تولید کنیم (راهی غیر از numpy هم هست، ولی من اکثرا از این روش استفاده میکنم) :

from numpy import random 

random.seed(1) 

print(random.random((1, 1)))

ولی در سطح سخت‌افزار، کار کمی پیچیده تر میشه. در اینجا قصد دارم یک مدار ساده بسازم که دقیقا چنین کاری رو انجام میده. البته به این مدار گفته میشه Pseudo Random Number Generator چون نتایج، تصادفی تصادفی هم نیستند ولی برای کارهایی که به عدد تصادفی نیاز داره، خوبن.

خب، طراحی مدار ما به شکل زیره :

ما اومدیم چهار فلیپ فلاپ D رو به هم متصل کردیم. سپس، دو بیت کم ارزش در اتصال این زنجیره را با یک XNOR با هم مقایسه کردیم و یک پالس ساعت هم به مدار وارد کردیم.

وقتی که دو بیت کم ارزش صفر باشن، خروجی XNOR ما یک میشه. یعنی Q در فلیپ فلاپ پر ارزش (سمت چپ ترین)، برابر با یک خواهد شد. در پالس بعدی این اتفاق برای فلیپ فلاپ بعدی میفته، این اتفاق تا جایی میفته که نتیجه مقایسه، صفر میشه و فلیپ فلاپ پر ارزش مقدارش تغییر میکنه، به این شکل، دقیقا ترتیب اعدادی که در این Ring Counter داریم به هم میریزه و اعداد «شبه‌تصادفی» تولید میشن.

این هم از شبیه‌سازی این مدار :

همونطور که در ویدئو مشخصه، داره به صورت رندم عددهای چهاربیتی تولید میکنه.

امیدوارم که این مطلب مفید واقع شده باشه. همچنین اگر با ویدئوی شبیه‌سازی مشکلی دارید و یا لود نمیشه، میتونید از این لینک دانلودش کنید.

Share

راهنمای یک صفحه‌ای برای علاقمندان به رشته کامپیوتر

مدتهاست که با دوستان مختلف، روی نوشتن مطالبی پیرامون رشته مهندسی کامپیوتر بحث می‌کنیم. این بحثها شامل ایرادات روتین بچه‌های مهندسی کامپیوتر تا کار کردن روی یک پروژه نه چندان بزرگ (ولی پرچالش!) میشه. از اونجایی که تازه هم کنکور گذشته و بچه ها کمی آزاد شدن، ولی ممکنه برای انتخاب رشته دچار تردید بشن؛ وقت خوبی بود که مطالبی در مورد ماهیت این رشته نوشته بشه. مطالبی که مینویسم، حاصل مطالعاتیه که در این چند سال داشتم. سعی میکنم کمی تاریخ تعریف کنم، کمی از علوم کامپیوتر بگم و در نهایت هم کمی از چیستی و ماهیت خود خود کامپیوتر (نه رشته).

کمی تاریخ

باید ببینیم کامپیوترها از کجا اومدن و چه اشخاصی در شکل گیری اونها، نقش داشتن. این کمی سخته که دقیقا بخوایم بگیم از کجا اومدن. انسان، از وقتی هوشمند شد و ابزار ساخت به دنبال ابزار کاملی برای حل مساله بود، پس همیشه هم تلاشش در این راستا بوده که این ابزار رو بسازه. در طول تاریخ هم، علوم و فنون مختلف به کمکش اومدن تا این ابزار رو کامل تر کنه. بذارید تعدادی از این علوم رو با هم بررسی کنیم.

فلسفه و ریاضیات

فلاسفه و ریاضی دانان، افرادی بودن که به دنبال پاسخ بودن. البته فلاسفه، پرسشگران قهارتری هم بودن و گاهی، سوالاتی مطرح کردند و ریاضیدانان، اون سوالات رو پاسخ دادن. حالا با توجه به این که کامپیوتر یک «ابزار حل مساله‌»س، میشه گفت هر دو گروه به شدت درش دخیل بودن.گاهی هم فلاسفه‌ای که روی علوم کامپیوتر تاثیر داشتند، ریاضی دان هم بودن. نمونه‌ش هم «محمد بن موسی خوارزمی» دانشمند پارسی‌گو.

خوارزمی، شاید اولین کسی بود که «تفکر رایانش» رو ابداع کرد. در کتاب معروفی به نام «جبر و مقابله» به حل معادلات جبری پرداخته و راه حل هاش، عموما مرحله مرحله و شفافن. به همین خاطر هم وقتی این روش حل مساله به اروپا میرسه، اروپایی ها بخاطر «الخوارزمی» (اسم ایشون) ، که در لاتین «الگوریتمی» گفته می‌شده، روش حل مساله رو «الگوریتم» اسم گذاشتند. چیزی که هنوز که هنوزه، داره استفاده میشه.

البته، کار خوارزمی نظام بخشیدن و سازمان دادن به علوم و فنونی بوده که در زمان خودش، مطرح می‌شده. در واقع، از کشف صفر توسط هندی ها تا قضایای که امثال تالس و فیثاغورث پایه گذاشتن، همه در نوشته شدن «جبر و مقابله» و ایجاد تفکر سیستماتیک برای حل مساله، دخیل بودن.

منطق

گرچه بهتر بود این یک مورد رو، قبل از فلسفه و ریاضیات میاوردم، ولی به نظر من منطق حاصل برخورد فلسفه و ریاضیه. گرچه خیلی قبل تر از خوارزمی منطق مطرح شده بود، اما دورانی هم که ماحصل کارش یعنی «جبر و مقابله» به اروپا رسید، ابتدای راه استفاده از منطق در بیان و حل مسائل بودند. پس سعی کردند با استفاده از منطق و جبر، بسیاری از مسائل رو حل کنند. منطقی که در اینجا قراره درموردش صحبت کنم همون منطق «ارسطو» است، منطقی که شاید امروزه پایه و اساس همه کامپیوترهاست.

منطقی که ارسطو بنیان گذاشته، یک منطق صفر و یکی به حساب میاد. بذارید اینطوری بگم؛ با منطق ارسطویی میشه اینطور گفت :

علی از احمد قدبلندتره. احمد از حسن قد بلند تر. پس علی از حسن هم قدبلندتره

و در این مورد، منطق ارسطویی کاملا کار میکنه. مثلا ریاضیاتیش میشه :

اگر x آنگاه y ، اگر y آنگاه p -> اگر x آنگاه p

و این بیان رو ما اصولا در نوعی از ریاضیات به نام «ریاضیات گسسته» یاد می‌گیریم. چیزی که پایه و اساس علوم و مهندسی کامپیوتر امروزیه. اما، این فقط کافی نیست؛ منطق در یک محیط خاص کار میکنه که ما اعدادی جز صفر و یک نداریم! پس نیاز به نوعی از محاسبه و جبر داریم که برای فقط صفر و یک، کار کنه و کافی باشه. چیزی به اسم «جبر بول»

آقایی که در تصویر می‌بینید، جورج بول، ریاضی‌دان و فیلسوف انگلیسیه که با پایه گذاری جبر صفر و یکی بر مبنای «صحیح و غلط» خودش، علوم کامپیوتر رو شدید تسریع کرد. در سده نوزدهم خیلی چیزا ساخته شدن و اکثرا هم، بر پایه همین «بودن یا نبودن» آقای بول کار میکردن. اما اشتباهاتی هم در این میان رخ داده که حالا بهش میرسیم!

وقتی همه چیز مکانیکی شد

 

محاسبه گرهای مکانیکی، تقریبا از زمانی که معاملات جزئی از زندگی بشر شدند وجود داشتن. مثل چرتکه که حاصل کار چینی ها بوده (روزگاری هم باقی دنیا از چینی ها کپی می‌کردن!) ، ولی محاسبه‌گرهایی مثل چرتکه، صرفا چهارعمل اصلی رو انجام میدادن و بعدها ریاضی‌دانها از اون وسیله برای محاسبه ریشه دوم و سوم اعداد هم سعی کردند استفاده کنن. ولی محاسبه گرهای پیچیده تری لازم بود!

آقایی که در تصویر می‌بینید «چارلز بابیج» یک ریاضی‌دان و مهندس انگلیسی بود. ایشون ایده «موتور تحلیلی» رو مطرح کرد که چیزی بود شبیه کامپیوترهای امروز. برنامه پذیر و قابلیت حل تعداد زیادی مساله در زمانی کم. اما، کار ایشون مشکلاتی داشت. ایشون سعی داشت همه چیز رو مکانیکی پیاده کنه و زمانی که این ایده رو مطرح کرد ماشین های مکانیکی هنوز اونقدر پیشرفته نبودن. و مشکل دوم رو بالاتر اشاره کردم، ایشون مدعی بوده که بدون جبر بول هم میتونه کامپیوتر رو پیاده کنه و کامپیوتری بسازه که با مبنای ده کار کنه (چیزی که هنوز هم نشده 🙂 ) .

اما ماشین های مکانیکی کم کم به سمت جبر بول و محاسبات آماری رفتن. یک بار دیگه این تصویر رو با هم ببینیم:

این تصویر، تصویری از یک ماشین «شرط بندی» است که در نیوزلند نصب شده بوده. عملکرد مکانیکی برای محاسبات آماری مربوط به شرط بندی روی مسابقه اسبها داشته.

اما مکانیک کافی نبود، لازم بود اما کافی نبود. پس به عصر «الکترومکانیک» باید سفری کوتاه داشته باشیم!

همه چیز از یک رله شروع شد

رله، قطعه الکتریکیه که میتونه مشابه یک کلید عمل کنه. در واقع اعمال ولتاژ به یک قسمتش، میتونه قطع و وصل شدن جریان الکتریکی در یک قسمت دیگر مدار رو تضمین و کنترل کنه (به این شکل ما مثلا میتونیم با استفاده از اینترنت، یک لامپ رو خاموش روشن کنیم!). در اون زمان، به فکر یه مهندس خوش ذوق آلمانی به اسم «کانراد تسوزه» زد که جبر بول رو با رله پیاده کنه. تسوزه چند تا پیاده سازی داشت ولی معروفترینشون این بود :

کامپیوتر Z4 آلمانی که در دهه ۳۰ ساخته شد و خیلی هم به کمک ارتش آلمان در جنگ دوم جهانی اومد. اما مطمئنا یک نابغه خوش ذوق دیگر در طرف انگلیسی وجود داره که بتونه از ساز و کار این ماشین، سردربیاره!

قبل از این که به اونطرف قضیه بپردازیم، این ماشین به شکل امروزی تونست برنامه اجرا کنه و زبان برنامه نویسی خاص خودش رو داشت. مجهز به سیستم ذخیره و بازیابی «پانچ کارد» بود و خیلی از مفاهیم امروزی رو در خودش داشت. اما هنوز نمیتونست «کامپیوتر» کاملی باشه چون خیلی مفاهیم رو نتونست پیاده سازی کنه، مهم تر از همه، شدیدا وابسته به عامل انسانی بود.

شروع بازی تقلید!

موقعی که کشورهای مختلف درگیر جنگ دوم بودن، اکثرا پیامهاشون رو رمزنگاری می‌کردن و شکستن رمزها، واقعا یک نابغه می‌طلبید. یک نابغه خوش ذوق که بتونه قهرمان جنگی باشه و رمز آلمانها رو بشکنه و متفقین رو، پیروز میدان کنه!

آقایی که در تصویر می‌بینید «آلن تورینگ» انگلیسی، این کار رو کرد. رمز آلمانیها موسوم به «انیگما» رو شکست و به این ترتیب قهرمان جنگی شد. اما کارش به همینجا ختم نشد و در دهه ۵۰ میلادی ایده «تفکر در رایانه» و «هوش مصنوعی» رو مطرح کرد که تا امروز هم مطالعه روی این موضوعات، ادامه داره. این شخص به معنای واقعی، نابغه و خوش ذوق بوده.

ترانزیستور و عصر سیلیکون

خب، این هم از فصل آخر تاریخ کامپیوتر. در اواخر دهه ۴۰ ، کامپیوترها یک دفعه رشد کردند. کشف ترانزیستور باعث شد مدارات الکتریکی و الکترونیکی مورد نیاز برای ساخت کامپیوتر بتونن روی یک سطح چند سانتی متری از سیلیکون خلاصه بشن. قطعاتی با کاربرد بالاتر ساخته بشن. عصر سیلیکون مصادف بود با حضور امثال دنیس ریچی و کن تامپسون و مفاهیمی مثل «سیستم عامل» (توضیح این بخش از تاریخ خودش یک پست جدا میطلبه پس شاکی نباشید از من لطفا!) مطرح بشن و رشد نرم افزاری در این حد، باعث شد که اصلا سرعت رشد یک شکل دیگری به خودش بگیره!

کامپیوتر چیست؟ کامپیوتر کیست؟

شاید باورتون نشه ولی قبل از ظهور ماشین های محاسبه گر، کامپیوتر یک عنوان شغلی بوده برای کسانی که محاسبات پیچیده رو انجام میدادن (و طوری که در موردشون مطالعه کردم، ظاهرا حق پرسش در مورد این که این محاسبه رو چرا دارن انجام میدن نداشتن) و بخش جالبتر این بوده که عموما «کامپیوتر»ها رو در سازمانها، خانمها تشکیل میدادن (البته اولین برنامه نویس جهان هم یک خانم به اسم ایدا لاولس بوده که در تصویر زیر می‌بیندشون).

البته، اونقدری نمی‌گذره که «علوم کامپیوتر» مطرح میشه. بعنوان علم مطالعه و پردازش داده. و این پدیده، همزمان بوده با پدیدار شدن کامپیوترهای به معنای امروزی. پس بیشتر اپراتور و برنامه نویس تربیت می‌کردند.

در تصویر بالا هم، عکسی از اپراتورهای کامپیوتر انیاک (در امریکا) رو می‌بینید که هم باید به نرم افزار مسلط می‌بودن و هم سخت افزارش.

اما به طور کل، کامپیوتر امروزه چی تعریف میشه؟ کامپیوتر یعنی وسیله‌ای برای پردازش داده و استفاده از اون داده در علم. ما داده های مختلفی داریم که کامپیوتر میتونه برای ما پردازشش کنه و نتیجه اون پردازش رو در هر شکلی به ما بده (یک نمودار، روشن و خاموش شدن یک دستگاه خاص یا حتی یادگیری و تکرار یک عمل از روی همون داده ها). پس، تا اینجا هم تا حد زیادی تاریخ کامپیوتر رو تونستیم بفهمیم، هم تعریفش رو. شاید براتون جالب باشه که اصلا کامپیوتر ها چطوری هم ساخته میشن!

کامپیوتر چطور داده رو پردازش میکنه؟

برگردیم به همون جبر بول. ما یه سری وسیله (یا بهتر بگم نمایش الکترونیکی!) از عملیات بولی داریم که بهشون میگن «دروازه منطقی» یا همون گیت. گیتها به این شکل هستند :

هر کدوم از اینها میتونن یکی از توابع بولین رو پیاده کنن. حالا، ما اگر اینها رو کنار هم بچینیم میتونیم بخش بزرگی از محاسبات رو به سادگی انجام بدیم. مثلا این مداری که من ساختم رو ببینید :

این مداریه که یک عدد BCD (که نوعی رمزگذاری در کامپیوتره) رو دریافت میکنه، به صورت دهدهی (دسیمال، مبنای ده) در خروجی قرار میده. حالا ما میتونیم اونطرف با یک Encoder این مقادیر رو دوباره به BCD یا هر فرمت دیگری تبدیل کنیم. در واقع کاری که ما انجام دادیم همون پردازش داده‌س. حالا هر قسمتی رو میشه یک بلاک در نظر گرفت و کنار هم قرار داد تا به چنین چیزی رسید :

مداری که در بالا طراحی کردم، یک واحد محاسبه و منطق برای یک کامپیوتر هشت بیتی بود (لینک) و این واحد، همونجاییه که داده پردازش میشه. البته واحد کنترل و حافظه هم در کامپیوتر داریم که برای کنترل پروسه پردازش و ذخیره داده پردازش شده ازشون استفاده می‌کنیم!

خب، فکر کنم به اندازه کافی اون چیزایی که میخواستم رو پوشش دادم، امیدوارم اگر قصد کامپیوتر خوندن دارید، شیرینی و زیبایی این رشته رو قبل از ورود به دانشگاه درک کنید و وقتی واردش می‌شید، لذت ببرید 🙂

Share

امنیت حسابهای اجتماعی

امروز صبح در تلگرام پیامی برای من فوروارد شد که حاوی یک اسکرین شات از توییت خود شرکت توییتر بود. این اسکرین شات :

همونطوری که می‌بینید، توییتر میگه یک باگ پیدا کردن که باعث شده یک سری پسوردها، بدون این که ماسک بشن، لاگ شدن. یعنی چی؟

فرض کنیم ما یک پسورد میسازیم، پسورد ما موقعی که داریم وارد میکنیم یک چیزی مثل MySecurePassword@123456 عه. این پسورد تقریبا تمام فاکتورهای یک پسورد امن رو داره. ولی اگر به صورت Plain Text بخوایم ذخیره‌ش کنیم این که جای خود، یک میلیون کارکتر دیگر هم داشته باشه احتمال لو رفتنش بسیار بالاست. (داخل پرانتز عرض کنم خدمت آقای علیرضا شیرازی، مدیریت محترم بلاگفا که تا چند سال پیش هم همینطوری پسورد ها رو نگهداری میکرد، جای این که در توییتر و … ملت رو بخاطر مواخذه کردنتون بلاک کنید، پاسخ میدادید که چرا اینطور بود! چون همون موقع هم بسیاری از اسکریپت های مدیریت محتوا پسوردها رو ماسک می‌کردن!).
حالا بخوایم MySecurePassword@123456 رو در دیتابیسی ذخیره کنیم باید چه کنیم؟ باید از «هش» و الگوریتم های مربوطه استفاده کنیم. مثلا الگوریتم MD5 (لینک جهت مطالعه). حالا این عبارت نسبتا سخت رو من با کمک ابزارهایی که دم دستم بود به MD5 هش میکنم و نتیجه میشه :

23b7618b2a23e171e6cda057a9736423

و وقتی من پسورد رو وارد کنم، اسکریپتی که برای لاگین نوشتم، یا API ای که وظیفه لاگین کردن من رو برعهده میگیره، اول پسورد رو هش میکنه بعد در دیتابیسش چک میکنه و اگر هش یکی بود، اجازه میده من به سیستم دسترسی داشته باشم. برای مثال این یک سیستم لاگین بسیار ساده بود که خودم نوشته بودم :

کد   
post '/welcome' do
 begin 
  params[:user][:password] == params[:user][:password_again]
  user = User.create(:username => params[:user][:username], :password => Digest::MD5.hexdigest(params[:user][:password]))
  redirect to("/welcome")
 rescue
  redirect to("/signup_error")
 end
end

و این یعنی ذخیره ایمن پسورد در یک دیتابیس (در اینجا از دیتابیس های مونگو استفاده کردم). و حالا اگر اون قسمتی که مربوط به هش کردن پسورد نمیشد رو، در کد قرار میدادم چه میشد؟ وقتی قرار بود Query بزنم مثلا به یوزر mamad و پسوردش 1125 بود، اینطور بر میگردوند :

کد   
{
"username":"mamad", 
"password":"1125"
}

و مثلا اگر شما قرار بود با API ای که من برای عضوگیری سرویس نوشتم کار کنید (مثلا لاگین کردن به وسیله سرویس من در اپلیکیشن، بازی یا سیستم حضور غیاب و … )، پسوردها رو به سادگی میتونستید ببینید. اما چیزی که الان بر میگرده اینه :

کد   
{"username":"mamad","password":"c21002f464c5fc5bee3b98ced83963b8"}

و خب شما نمیتونید به پسورد دسترسی پیدا کنید، مگر این که ابزار یا دیکشنری مربوط به شکستن این الگوریتم رو داشته باشید. البته معمول هم نیست شما JSON مربوط به اطلاعات کاربران رو برگردونید! چون باز هم دیتای کاربر به خطر میفته.

فکر کنم به قدر کافی در مورد پسورد و نحوه ذخیره سازیش توضیح داده باشم، هدف این بود که مباحثی مربوط به هک شدن و نفوذ به تلگرام هم در این پست مطرح کنم که متاسفانه این پست بیش از چیزی که فکر کردم، طولانی شد. پس در مورد تلگرام در پست جداگانه ای خواهم نوشت 🙂

 

Share

سلول های دیجیتال!

بعد از مدتها، یک تاپیک قشنگ برای نوشتن پیدا کردم، شاید مدتها هم در همین مورد در وبلاگم بنویسم. موضوعی که در جهان، در کنار موضوعات دیگر مطرح هست، موضوعی هست به اسم زیست شناسی مصنوعی که به نوعی میشه گفت پیوند علوم مختلف با زیست شناسی، و تغییر در ساختار بیولوژیک موجوداتی هست که در اطراف ما زندگی میکنن. لینکی را در توییتر دیدم (و البته خاطرم نیست که کجا دیدمش، وگرنه لینک میکردم بهش) که نوشته بود دانشمندان با استفاده از DNA تونستند مدار منطقی بسازند. همونجا خشکم زد و گفتم چطوری میشه؟! تا این که این ویدئو رو دیدم. حقیقت اینه که تا قبل از این، دیده بودم که از نورون (سلول های عصبی) برای انتقال اطلاعات و پیاده سازی منطق های مختلف استفاده بشه، ولی استفاده از DNA برای من به شدت جدید و جذاب بود. و فکر نمیکردم که بشه از DNA ها، ساختار ترانزیستوری گرفت.

در حقیقت، چیزی که اینجا برای ما صفر و یک میسازه، الکتریسیته نیست. بلکه پروتئین ها هستند. در واقع شما دو نوع پروتئین دارید، که یکی نماینده صفر منطقی و دیگری نماینده یک منطقی به حساب میاد. حالا یکم دقیق تر پیش بریم، اگر ویدئو رو ببینید، خواهید دید که ساختار DNA یک نوع باکتری به اسم E.coli (با تلفظ ایکولای) مثل یک گیت NOR هست. یعنی همه منطق های موجود رو میشه با استفاده از این DNA طراحی کرد! نکته جالب تر و شگفت آورتر قضیه هم اینجاست که دانشگاه MIT پلتفرمی به اسم سلوکد منتشر کرده که شما با مراجعه بهش، میتونید کد Verilog بنویسید و تحلیل DNA ایش رو ببینید! و از همه جالبتر اینه که MIT کدهای نوشته شده شما رو، روی سلول های زنده تست میکنه!

تست سلوکد

خب برای این که این پلتفرم دوست داشتنی رو تست کنم، نشستم و یک معکوس کننده یا گیت NOT رو با Verilog HDL نوشتم :

کد   
module NOT(output out, input in);
 always@(in)
   begin
   case({in})
   1'b0: {out} = 1'b1;
   1'b1: {out} = 1'b0;
   endcase
  end
endmodule

بعد از این که روی دکمه Run کلیک کردم (البته یادتون باشه که قبلش تعدادی DNA Sequence رو به عنوان ورودی و خروجی انتخاب کنید تا تحلیل های درست و بهتری تحویل بگیرید) ، شروع کرد به تحلیل کردن. حالا نتایج رو با هم می بینیم!

شکل گیت NOT به صورت قسمتی از DNA :

inverter_A000_dnaplotlib_Eu_outخب، این شکلی هست که در «زیست شناسی مصنوعی» برای بخش های کوچک DNA و نمایندگی اون ها استفاده میشه. ورودی و خروجی های این طراحی ها Promoter هستند که اتصالات بین پروتئین ها رو میتونن به وجود بیارن. پس میشه در یک سلول زنده منطق های مختلف داشت، و ساخت. حالا، جدول درستی این ساختار رو با هم می بینیم :

inverter_A000_RFP_truthهمونطور که می بینید، با صفر و یک طرف نیستیم، بلکه دو نوع ماده شیمیایی هستند که نقش صفر و یک رو بازی میکنند. البته یک ساختار گیت هم برای این واحد ها در نظر گرفته شده که به این شکل هستند :

inverter_wiring_agrn

که می بینید با ساختار گیت هایی که میشناختیم فرق داره. اگرچه، قبل از این که بخوایم اصلا HDL نویسی کنیم، نیاز داریم که اون طراحی منطقی رو انجام بدیم و منطق مدارهای خودمون رو تست کنیم. ولی این ابزار هم خودش برامون گیت ها رو میسازه.

و آخرین چیزی که توجهم رو به خودش جلب کرد، نمودار زیستی ای بود که در خروجی قرار داشت و عملکرد گیت رو به صورت کاملا زیستی تحلیل میکرد :

inverter_A000_xfer_model_P1_PhlF

و البته یک ساختار گیتی دیگر هم داره، که «جنس» ورودی خروجی ها، همون پروتئین هایی که نماینده صفر و یک منطقی هستند رو برای ما مشخص میکنه :

inverter_A000_wiring_grn

خب، تا اینجا میشه فهمید که بشر قصد داره کم کم ترانزیستور رو کنار بذاره و خب در آینده، کامپیوتر الکترونیکی، جای خودش رو به کامپیوترهای بیولوژیکی میده! و این به این معنیه که احتمالا نسل های بعد از ما، زمانی که بخوان سخت افزار رو مطالعه کنن، احتمالا درس «سلول های دیجیتال» خواهند داشت به جای «الکترونیک دیجیتال»! سعی میکنم در این مورد بیشتر مطالعه کنم و یاد بگیرم، و در آینده در موردش بیشتر بنویسم.

موفق باشید 🙂

Share

پیشنهادهای شما برای پیاده سازی یک ایده سخت افزاری

با سلام. خیلی وقت بود وبلاگ نویسی نکرده بودم و حالا پس از مدتها اومدم که بنویسم! شاید بگید الان که فرجه امتحانات هست و بهتره برم به زندگیم برسم، ولی خب توی همین فرجه هم وقت آزاد فراوان هست.

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

توی پست های جادی چند مساله جالب به چشم میخوره، اولیش اینه «چی نداریم؟! آیا وسیله ای هست اون کار رو انجام بده؟ اگر نیست، خودم میسازمش». و دومین نکته هم «پیاده سازی ایده و تبدیل کردنش به استارتاپ و حتی تا حدی به پول رسوندنش، اونقدر ها هم که فکر میکنیم سخت نیست». و حتی شاید سومیش این باشه که «معطل نکن، شروع کن به پیاده سازی». خب، حالا بیایم ببینم که من میخوام چی کار کنم؟ جادی به من ایده داد که ایده جمع کنم برای یک محصول سخت افزاری! اما محصولی که بشه به در یک مدت زمان نه چندان کوتاهی پیاده سازیش کرد و بعد ازش به پول رسید (بر خلاف StrongPC که بیشتر فاز تحقیقی داره).

ایده هایی که در ذهن خودم هستن اینان :

  • پیاده سازی یه دستگاه ساده با استفاده از میکروکنترلرهایی که توی بازار موجودند، و روبرو شدن با چالش هایی مثل مطالعه معماری، برنامه نویسی برای ریزپردازنده، طراحی مدارهای واسط و … .
  • پیاده سازی یه دستگاه ساده با استفاده از آردوینو و ماژول هاش
  • پیاده سازی یک دستگاه ساده IoT طور با استفاده از Cubieboard یا رزبری
  • و …

حالا از شماها که این پست رو میخونید، میخوام در این باره کمک بدید. اول این که «دستگاه ساده» چی میتونه باشه (مثلا ساعت؟! تقویم رومیزی؟ سیستم اطفاء حریق و …) و دوم این که با چی و چطوری پیاده سازی بشه. بعد از این که ایده مشخص بشه، مرحله مرحله پیاده سازیش در همین وبلاگ، گزارش میشه.

Share

دوستی با محصول جدید اتودسک

اکثرا میدونیم که شبیه سازی و استفاده از بردهای آردوینو و AVR و … ، برای کاربران لینوکس خیلی مشکله. حتی شبیه سازی ساده مدارهای الکتریکی و الکترونیکی هم مشکلیه که اکثرا کاربران لینوکس باهاش روبرو هستند. اما امروز، میخوام ابزاری رو معرفی کنم، که هم رایگانه و هم تحت وب. به شما امکان کد زدن روی آردوینو و تست کردن مدارهای مجتمع، ساختن مدارهای دیجیتال و آنالوگ رو میده.

شرکت اتودسک که پیش تر با محصولاتی مثل اتوکد و مایا شناخته شده بود، الان اومده محصولی به اسم 123D Circuits رو ارائه کرده که با ساختن یک اکانت و عضویت درش، میتونید به راحتی آزمایشات الکترونیکی خودتون رو انجام بدید.

این هم نمونه مداری که بستم، یک آی سی 7408 هست که داره دو ورودی رو با هم AND میکنه :

کافیه روی start simulation کلیک کنید و بعد با کلید ها بازی کنید تا تغییرات توی ولت متر و LED قرمز رنگ روی برد بورد رو شاهد باشید.

Share

بررسی معماری MIPS

خب، همونطور که داریم سلسله آموزش های ساخت کامپیوتر ساده در Logisim رو دنبال میکنیم، گفتم این وسط یه توضیحی هم در مورد معماری MIPS داشته باشیم. در واقع MIPS یکی از ساده ترین و کم دستور ترین معماری های ممکنه، و البته پیاده سازی دوبارش در نرم افزارهایی مثل Logisim بسیار ساده. میشه.

این یک ALU بسیار ساده بر اساس میپس هست (که البته یک بیتی پیاده شده) :

MIPS

در اینجا، برای تفریق مدار جداگانه ای در نظر نگرفته، بلکه مقدار B رو با یک، XOR کرده (هوشمندانه به نظر میرسه، نه؟) و از less هم برای مقایسه، از یک مالتی پلکسر ۸ به ۱ هم برای انتخاب عملیات استفاده شده (به جای استفاده از دیکدر و گیت های AND )، در کل میشه یک ساختار خیلی قشنگ براش قائل شد، البته بهتر از این هم میشد الگوریتم هایی مثل تفریق رو هم پیاده کرد (مثلا با استفاده از یه mux میشد انتخاب کرد که خود B نیازه یا نقیضش؟ و البته نیاز بود که cin هم حتما روشن شه که مکمل ۲ گرفته شه).

زبان ماشین این ALU هم خیلی سادس، به ازای مقدار ۰ ، عملیات AND ، به ازای ۱ عملیات OR ، به ازای ۲ عملیات XOR ، به ازای ۳ عملیات NOR ، به ازای ۴ عملیات ADD و به ازای ۵ عملیات مقایسه رو انجام میده (البته برای مقایسه هم میشه از XNOR استفاده کرد و تساوی رو سنجید).

امیدوارم که این مطلب به دردتون خورده باشه، همچنین میتونید این معماری رو پیاده کنید و نتیجش رو حتی روی برد بُرد بیارید 🙂 .

موفق باشید.

Share

ساخت یک کامپیوتر ساده در Logisim – قسمت دوم (مجموعه دستور العمل ها)

در قسمت قبلی، چالش رو مطرح کردیم که کامپیوتر هشت بیتی خودمون رو بسازیم. ببینیم چه مداراتی نیاز داریم؟!

خب ما دو ورودی هشت بیتی A و B رو خواهیم داشت، پس به این موارد نیاز داریم :

  1. مداری برای NOT کردن ورودی A
  2. مداری برای NOT کردن ورودی B
  3. مداری برای AND کردن هر دو ورودی
  4. مداری برای OR کردن هر دو ورودی
  5. مداری برای جمع کردن دو ورودی
  6. مداری برای تفریق دو ورودی

خب، چون ما از یک قطعه به اسم «دیکدر» برای انتخاب دستورات استفاده میکنیم، و دیکدرها هم یک ورودی با سایز n میگیرن، و خروجی اونها «دو به توان n» هست، و ما اینجا «مجموعه دستور العمل» یا Instruction Set مون دارای ۶ دستور هست، بهینه ترین حالت استفاده از یک دیکدر ۳ به ۸ هست. خب، با این حساب، باید کد عملیات ها یا Operation Code ها رو به این شکل تعریف کنیم :

Operation Code
NOT A 000
NOT B 001
AND A, B 010
OR A, B 011
ADD A , B 100
SUB A, B 101

خب الان ما میدونیم که کامپیوتر محترم باید چه دستوراتی رو اچرا کنه. در واقع، وقتی میگیم ۰ ، کامپیوتر اون رو به دیکدر میده و میفهمه که باید نقیض A رو بهمون بده. وقتی ۱ رو فراخوانی میکنیم، باید نقیض B بهمون داده شه، وقتی میگیم ۵ در واقع مقدار B رو از A کم میکنیم و … . با توجه به این که الان، ما یک دیکدر ۳ به ۸ در مدار «واحد محاسبه و منطق» داریم، میتونیم ۴ دستور العمل دیگه هم بهش اضافه کنیم (با شما 🙂 ). در قسمت بعدی این آموزش، میرسیم به این که ورودی ها و خروجی ها رو چطوری مدیریت کنیم. بعدش هم در مورد ساختار کلی ALU صحبت میشه و بعد از چند پست دیگه، یک ALU کامل با هم خواهیم داشت. پس فعلا در مورد بلاهایی که سر ۸ بیت ورودی میشه آورد فکر کنید و شاد باشید 🙂

Share