<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امیرعلی سمیعی</title>
        <link>https://virgool.io/feed/@amiralisam</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-07-06 15:53:45</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1559034/avatar/SA3jdy.jpeg?height=120&amp;width=120</url>
            <title>امیرعلی سمیعی</title>
            <link>https://virgool.io/@amiralisam</link>
        </image>

                    <item>
                <title>مقایسه‌ی RDBMS و NoSQL</title>
                <link>https://virgool.io/@amiralisam/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-%DB%8C-rdbms-%D9%88-nosql-rivhijnrtwnl</link>
                <description>سلام. من امیرعلی سمیعی هستم دانشجوی کارشناسی علوم کامپیوتر دانشگاه تهران مرکز. این دومین مقاله‌ی فعالیت کلاسی درس طراحی اصول نرم‌افزار استاد حاجی‌اسمعیلی است. اولین مقاله با عنوان باور کنیم ۲۱ میلیون بیت‌کوین بیشتر نداریم؟ را میتونید در لینک ارجاع داده شده بخوانید.چند وقتی است بازار NoSQL خیلی داغ است. خیلی‌ها برای جا نماندن از این تکنولوژی نسبتا جدید به دنبال یادگیری آن هستند. کلی دوره و آموزش آنلاین و حضوری در این زمینه برگزار می‌شود و بسیاری از استارت‌آپ‌هایی که می‌خواهند سری در میان سرها دربیاورند پایگاه داده‌ی سامانه‌ی خود را روی ساختار ‌ NoSQL طراحی می‌کنند. اما اصلا NoSql به درد چه پروژه‌ای می‌خورد؟ اصلا چه شد که نیاز به ساختاری ورای RDBMS احساس شد؟ آیا دیگر RDBMSها از جمله SQL Server، MySQL، PostgreSQL و ... جای خود را به NoSqlها از جمله MongoDB، Redis، ArangoDB و ... داده‌اند؟ در این مقاله سعی بر آن است به تمام این موارد پاسخ داده شود.پایگاه‌داده‌های RDBMSپایگاه‌داده‌های RDBMS (Relational Database Management System) نوعی از پایگاه‌داده‌های مرسوم هستند که ساختاری ردیفی - ستونی و جدولی دارند. به این معنا که داده‌ها در این نوع از پایگاه‌داده در ردیف‌های یک جدول که ستون‌هایی مشخص دارد ذخیره می‌شود. این جدول‌ها یا قابلیت مرتبط بودنی که با یکدیگر دارند (Relational) این قابلیت را در اختیار کاربر قرار می‌دهند که در آن واحد از داده‌های چند جدول واکاوی اطلاعات داشته باشد. به صورت عرف برای این منظور از زبان SQL (Structured Query Language) استفاده می‌شود، با کمک این زبان می‌توان در پایگاه‌داده‌های RDBMSای خود عملیات‌های ثبت، ویرایش، حذف و خواندن را انجام دهیم.در این نوع پایگاه‌های داده، ردیفی که می‌خواهیم ثبت کنیم باید کاملا در قالب جدول باشد. برای مثال اگر جدول شخصی داریم که داده‌های افراد در آن‌ها ثبت می‌شوند و ستون‌های نام، نام خانوادگی، جنسیت، نام پدر و کد ملی، ستون‌های این جدول باشند هر شخصی که می‌خواهیم ثبت کنیم باید تمام این اطلاعات را داشته باشیم. برای مثال اگر در این جدول پر شدن نام پدر الزامی نباشد یا به عبارتی Nullable باشد، در این صورت برای فردی که نام پدرش را نداریم می‌توانیم چیزی ثبت نکنیم. در این حالت هنگام واکاوی داده‌های آن شخص ستون نام پدر مقدار NULL را دارد.پایگاه‌داده‌های NoSQLپایگاه‌داده‌های NoSQL غیر ارتباطی هستند (non-relational) که نیازی به ساختاری دقیق ندارند و انعطاف بیشتری دارند. عبارت NoSQL به Not Only SQL یا NOT SQL اشاره دارد که در سال ۱۹۹۸ معرفی شد. این نوع پایگاه‌های داده انواع مختلفی از جمله Document Based، Key Valued Pair، Graph Databas و ... دارد که تقریبا می‌توان گفت معروف‌ترین آن‌ها MongoDb که یک پایگاه‌داده‌ی Document Based است و Redis که یک پایگاه‌داده‌ی Key Valued Pair است می‌باشند.همان طوری که گفته شد این نوع پایگاه‌های داده انعطاف بیشتری دارند. پایگاه‌داده‌های Document Based مثل MongoDB دیگر جدول، ستون و ردیف ندارند. در این نوع پایگاه‌های داده با Document سر و کار داریم. هر ردیف در RDBMS یک Document در MongoDB است. حال فرض کنید همان جدول شخصی که داشتیم را در MongoDB داشته باشیم. دیگر زمانی که داده‌های شخصی را که نام پدر ندارد را جستجو می‌کنیم با عبارت NULL مواجه نمی‌شیم! اگر مقداری را برای آن مولفه نداشته باشیم به راحتی در Document مورد نظر نام برده نمی‌شود. این خاصیت انعطاف‌پذیری خیلی خوبی به طراح دیتابیس می‌دهد. فرض کنید در اطلاعات یک میلیون نفر را داریم طبق مشخصات جدول شخص که در بالاتر نام برده شد داریم. حال می‌خواهیم شماره‌ی همراه افراد را از این به بعد بگیریم. برای این کار در دیتابیس‌های RDBMS باید ستون شماره‌ی همراه را اضافه کنیم که برای یک میلیون نفری که داریم عبارت NULL می‌افتد. (در دیتابیس‌های RDBMS پیشنهاد می‌شود برای اضافه کردن ستون به جدول کل جدول پاک شود، ساختار جدید ایجاد شود، داده‌های قبلی ثبت شود. در برخی از پایگاه‌های داده این حالت به صورت گرافیکی یا ساختاری پشتیبانی می‌شود ولی در پشت صحنه دقیقا همین‌کاری که توضیح دادم انجام می‌شود) در حالی که در دیتابیسی مثل MongoDB دیگر نیازی به این کار نیست تنها از این به بعد هر کسی شماره‌ی همراه داشت را با شماره‌ی همراه ثبت می‌کنیم و وقتی داده‌های کسی که شماره‌ی همراه ندارد را واکاوی می‌کنیم با عبارت NULL شماره‌ی همراه مواجه نمی‌شویم.این نوع دیتابیس‌ها در سال‌های اخیر در شرکت‌های بزرگ با حجم داده‌های بزرگ خیلی رواج پیدا کرد. شرکت‌های مثل فیسبوک، گوگل، آمازون و ... از این نوع پایگاه‌های داده برای کارهای بزرگی مثل طبقه‌بندی پست‌های وبسایت‌ها، شبکه‌های اجتماعی و ... استفاده می‌کنند.مثالی از یک Documentمفهوم Clusteringمی‌توان گفت بزرگ‌ترین مزیت دیتابیس‌های NoSQL آسانی Clustering است. Clustering چیست؟ اصولا شرکت‌های بزرگ از سرورهای متعددی برای ذخیره‌سازی داده‌های خود استفاده می‌کنند. فرض کنید داده‌های گوگل در یک دیتابیس باشد! اگر مشکلی برای آن سرور به وجود بیاید چی؟ همه چی از بین می‌رود! فرض کنید آن سرور فقط در آمریکا باشد. کسی که از کره‌جنوبی می‌خواهد به از سایت گوگل استفاده کند زمان بیشتری باید منتظر پاسخ‌گویی سرور باشد! برای این موارد و چند مورد بیشتر که وارد شدن بهشون خیلی تخصصی و زمان‌بر میشه، اصولا شرکت‌های بزرگ داده‌های خود را در چند سرور و بعضا در چند نقطه‌ی جغرافیایی مختلف نگهداری می‌کنند. به این صورت که کسی از هند، آمریکا، آلمان و ... خواست به سایت فیسبوک دسترسی داشته باشد packetهایی که میفرستد و می‌گیرد در نقطه‌ای نزدیک به محل سکونت خود باشد.علاوه بر این مورد اصولا سرورهای متعدد برای بک‌آپ‌گیری استفاده می‌شوند. بذارید با مثال توضیح بدم. فرض کنید شخصی از هند می‌خواهد در سایت فیسبوک ثبت‌نام کند. مثلا سرور فیسبوک جایی در حوالی دهلی قرار دارد. وقتی که شخص ثبت نام خود را انجام می‌دهد داده‌ها نه تنها درون یک سرور بلکه درون مثلا سه سرور ثبت می‌شوند! تا زمانی که ثبت داده‌ها در هر سه سرور نهایی نشود عملیات ثبت کاربر نهایی نشده! پس از اینکه هر ۳ ثبت صورت گرفت کاربر پیام موفقیت‌آمیز را می‌بیند! به این ترتیب اگر یکی از آن سرور از دسترس خارج شد، داده‌های شرکت از بین نرفته است!به این حالت که چند سرور را در اختیار بگیریم و عملیات‌های خود را بر اساس چند سرور پیاده کنیم Clustering گویند. این مفهوم حالت‌های مختلفی دارد برای مثال حالتی دیگر وجود دارد که ثبت داده در یک سرور، خواندن داده از سروری دیگر انجام می‌شود و ... کلاسترینگ مفهوم پیچیده و مهمی است که در اینجا بیش از این به آن نمی‌پردازیم چیزی که مد نظر است این است که دیتابیس‌های NoSQL برای کلاستر کردن روند ساده‌تری نسبت به دیتابیس‌های RDBMS دارند و می‌توان گفت دلیل اصلی آن نیز انعطاف‌پذیری بیشتر این نوع دیتابیس‌ها است.چند تفاوت دیگر RDBMS و NoSQLدیتابیس‌های RDBMS و NoSQL علاوه بر موارد ذکر شده ویژگی‌های متفاوت دیگری دارند. برای مثال اصولا در دیتابیس‌های NoSQLای نیازی به join زدن نیست چون داده‌ها بنا به مصرف در کنار یکدیگر نگهداری می‌شوند. دیتابیس‌های NoSQLای اصولا ACID transaction را ساپورت نمی‌کنند (البته MongoDB این ویژگی را دارد). از کاربرد اختصاصی دیتابیس‌های NoSQL می‌توان به دیتابیس‌های Key Value که اصولا برای جستجو در میان داده‌های زیاد، به خصوص کشینگ سرورها (مانند Redis) و دیتابیس‌های Graph که برای تجزیه و تحلیل داده‌های مرتبط استفاده می‌شوند اشاره کرد.در خیلی از موارد ساختار مورد نظر بهتر است در قالب RDBMS طراحی شود اما صرفا به علت نو بودن NoSQLها شرکت‌ها به آن‌ها روی می‌آورند. بهتر است برای طراحی ساختار مورد نظر جنبه‌های مختلف در نظر گرفته شود و با توجه به خاصیت و ویژگی دیتابیس‌های موجود، پایگاه‌داده‌ی مناسب برای آن طرح انتخاب شود.نام استاد: دکتر مریم حاجی اسمعیلی. دکترای علوم کامپیوتر از دانشگاه کینگستون لندنDr.Maryam HajiesmaeiliPhD of computer science from Kingston university of Londonمنابع: دوره‌های M001 و M100 دانشگاه MongoDB. سایت Besant Technologies. سایت freeCodeCamp.</description>
                <category>امیرعلی سمیعی</category>
                <author>امیرعلی سمیعی</author>
                <pubDate>Mon, 06 Jun 2022 18:08:39 +0430</pubDate>
            </item>
                    <item>
                <title>باور کنیم ۲۱ میلیون بیت‌کوین بیشتر نداریم؟</title>
                <link>https://virgool.io/@amiralisam/%D8%A8%D8%A7%D9%88%D8%B1-%DA%A9%D9%86%DB%8C%D9%85-%DB%B2%DB%B1-%D9%85%DB%8C%D9%84%DB%8C%D9%88%D9%86-%D8%A8%DB%8C%D8%AA-%DA%A9%D9%88%DB%8C%D9%86-%D8%A8%DB%8C%D8%B4%D8%AA%D8%B1-%D9%86%D8%AF%D8%A7%D8%B1%DB%8C%D9%85-ilzdbkpum496</link>
                <description>سلام. من امیرعلی سمیعی هستم دانشجوی کارشناسی علوم کامپیوتر دانشگاه تهران مرکز؛ باید به عنوان فعالیت کلاسی برای درس طراحی اصول نرم‌افزار استاد حاجی‌اسمعیلی مقاله‌ای مینوشتم، که یاد این موضوع ۲۱ میلیون بودن بیت‌کوین افتادم! چند وقت پیش یکی از مقامات گفته بود باور نداره که ۲۱ میلیون بیت‌کوین داشته باشیم، از کجا بیشتر نباشه؟ یادمه یه ویدیویی در مورد اثبات این موضوع تو یوتوب دیده بودم ولی نتونستم ویدیو رو پیدا کنم به عنوان منبع براتون بذارم، از اونجایی که روش کار رو یادمه می‌خوام این موضوع رو توضیح بدم!منبع کد بیت‌کوین مشخصه و همه نودها و ماینرها از اون منبع کد باید استفاده کنند. برای اینکه ثابت کنیم بیشتر از ۲۱ میلیون بیت‌کوین نداریم باید دست به کد بشیم! اول از همه منبع کدمون یا همون سورس کد رو باید بگیریم. پس ابتدا وارد گیت‌هاب بیت‌کوین میشیم، آدرس ریپوزیتوری رو کپی می‌کنیم و تو دستگاه خودمون ریپوزیتوری رو clone میکنیم.تو vsCode سورس کدمون رو باز می‌کنیم. اصلا الزامی وجود نداره که شما زبان سی‌پلاس‌پلاس بلد باشید تا متوجه پاسخ این سوال بشید. فقط کافی است مفهوم برنامه‌نویسی و یک زبان برنامه‌نویسی را بلد باشید. من برای حل این مسئله از پایتون استفاده می‌کنم، نوشتنش ساده‌تره و دوستان بیشتری با این زبان آشنایی دارند.همونطوری که گفتم، من هم یک بار این راه حل رو دیده بودم و سرچ هم کردم چیز خاصی بدست نیاوردم. فقط یادمه این موضوع به هاوینگ مرتبط بود. میتونید در مورد هاوینگ تو لینکی که ضمیمه کردم کامل مطالعه کنید ولی به صورت خلاصه توضیحش میدم؛ هاوینگ عملیاتی است که حدودا ۴ سال یک بار یا به عبارتی هر ۲۱۰ هزار بلاک یک‌بار در بلاکچین بیت‌کوین اتفاق میفته که باعث میشه جایزه‌ی بلاک از آن بلاک به بعد نصف شود! ابتدا هر بلاکی که ماین میشد ۵۰ بیت‌کوین برای ماینر جایزه داشت. در حال حاضر که ۳ بار هاوینگ اتفاق افتاده مقدار آن به ۶.۲۵ رسیده است. این عملیات انقدر ادامه دارد تا زمانی‌که جایزه بلاک به صفر برسد! (تقریبا سال ۲۱۴۰ میلادی) از آن زمان به بعد ماینر فقط حق تراکنش را از هر بلاکی که ماین میکند دریافت می‌کند.من سعی می‌کنم خیلی مفاهیم پایه‌ای بیت‌کوین رو توضیح ندم چون هدف این مقاله، بدست آوردن حداکثر تعداد بیت‌کوین است ولی هاوینگ ما را به جواب می‌رساند. اولین بلاکی که ساتوشی، خالق ناشناس بیت‌کوین ماین کرد ۵۰ بیت‌کوین تولید کرد، در حال حاضر ۶.۲۵ بیت‌کوین بعد از هر بلاکی که ماین می‌شود به مجموع کل بیت‌کوین‌ها اضافه می‌شود که در زمان نگارش این مقاله کمتر از ۱۹ میلیون می‌باشد. تنها راه تولید بیت‌کوین و اضافه شدن آن به تعداد کل آن، ماین‌کردن است! کافی است محاسبه کنیم چه زمانی هاوینگ باعث می‌شود که شبکه دیگر جایزه‌ای به ماینر ندهد و فقط حق تراکنش را به او اهدا می‌کند، از آنجایی که روش دیگری برای تولید بیت‌کوین نیست، در آن زمان هر چقدر بیت‌کوین باقی‌مانده باشد، حداکثر تعداد بیت‌کوین موجود خواهد بود.به این منظور، عبارت having رو در سورس کد بیت‌کوین سرچ می‌کنم.جستجوی عبارت havingهمونطوری که در عکس مشاهده می‌کنید، در ۲۸ جای این پروژه، عبارت halving استفاده شده. تک تک فایل‌ها رو باز کردم، یه مروری کردم ببینم همون متدی است که به دنبالشم یا خیر. که پاسخ رو در فایل validation.cpp پیدا کردم. (در عکس بالا نشانگر ماوس روی آن است)متد GetBlockSubsidyبرای اینکه مفهوم هر کدام از این عبارات را متوجه بشیم میتونیم رو عبارت مورد نظر کلیک راست کرده و به Go To Definistion رفته یا عبارت مورد نظر را در پروژه جستجو کنیم. من عبارت nSubsidyHalvingInterval را سرچ می‌کنم تا ببینم مقدار آن چند است. همانطور که در عکس مشاهده می‌کنید در همان قسمت جستجو به ما مقدار این متغیر را نمایش می‌دهد.nSubsidyHalvingIntervalبر می‌گردم به متد GetBlockSubsidy. همانطوری که از نام این متد مشخص است، جایزه‌ی ماینر را محاسبه می‌کند. ابتدای این متد متغیر halvings مقداردهی می‌شود. که از تقسیم nHeight به nSubsidyHalvingInterval (210,000) بدست می‌آید. nHeight همان شماره بلاک می‌باشد (به همین منظور بعد از هر ۲۱۰ هزارتا بلاک هاوینگ اتفاق میفتد، چون این تقسیم پاسخی صحیح دارد و هر ۲۱۰ هزار بلاک یک‌بار، به تعداد آن یکی اضافه می‌شود).در این متد ذکر شده اگر عدد هاوینگ بزرگتر برابر با 64 باشد صفر بازگرداند؛ یعنی بعد از شصت و چهارمین هاوینگ دیگر جایزه‌ای به هیچ ماینری تعلق نمی‌گیرد.سپس متغیر nSubsidy را مقدار دهی کرده است که ۵۰ برابر COIN است. روی عبارت COIN راست کلیک کرده و Go To Definistion را زده و طبق عکس زیر وارد کدی که این متغیر تعریف شده است می‌شویم.مقداردهی COINهمانطور که مشاهده می‌کنید COIN که در واقع یک بیت‌کوین است، برابر با ۱۰۰ میلیون است. ( که به هر COIN یک ساتوشی گفته می‌شود. به پیشنهاد یکی از کاربران فروم بیت‌کوین در ابتدای شکل‌گیری آن، برای اینکه اعداد را راحت‌تر بیان کنند، به هر بیت‌کوین عدد ۱۰۰ میلیون ساتوشی نسبت‌دهی شد.)پس جایزه‌ی هر شخص تا اینجا (اگر halving بزرگ‌تر مساوی ۶۴ نباشد) برابر است با ۵ میلیارد ساتوشی (50 بیت‌کوین). ولی پس از آن عبارت nSubsidy &gt;&gt;= halvings را مشاهده می‌کنیم و سپس nSubsidy بازگردانده می‌شود. عبارت nSubsidy &gt;&gt;= halvings در واقع یعنی nSubsidy = nSubsidy &gt;&gt; halvings. علامت &lt;&lt; به معنای شیفت راست می‌باشد. تصور کنید عدد باینری ۱۰۰ که در مبنای ۱۰ برابر با ۴ است را یه عدد شیفت راست کنیم، یعنی صفر پایانی را حذف کنیم، می‌شود عدد باینری ۱۰ که در مبنای ۱۰ برابر است با ۲. در عبارت ذکر شده، در واقع nSubsidy به تعداد halvings تقسیم بر ۲ می‌شود؛ یعنی در حال حاضر که عدد halvings برابر با ۳ است، عدد ۵۰ را در مبنای ۲، سه بار شیفت راست کرده که یعنی در مبنای ۱۰ سه بار تقسیم بر ۲ می‌کند، به این معنا که در حال حاضر هر بلاکی که ماین می‌شود nSubsidy آن برابر با ۶.۲۵ است.حال فهمیدیم GetBlockSubsidy چگونه محاسبه می‌شود. در این قسمت من یک کد پایتون می‌نویسم که همواره از زمانی که halvings برابر با ۰ است تا زمانی‌که به ۶۴ (مقدار پایانی خود) می‌رسد تعداد بیت‌کوین‌های تولید شده را محاسبه کند. از آنجایی که راه دیگری برای تولید بیت‌کوین نیست، وقتی به شصت و چهارمین halvings برسم یعنی تعداد کل بیت‌کوین‌های موجود را بدست آوردم.کد پایتون محاسبه‌ی تعداد کل بیت‌کوینهمانطوری که در عکس مشاهده می‌کنید، همان متغیر‌هایی که داشتیم را تعریف کردم. فقط nHeight را از صفر مقداردهی کردم چون می‌خواستم از اولین ماینی که صورت گرفته تا آخرین ماینی که صورت خواهد گرفت (وقتی که جایزه به ماینر اهدا می‌شود) بیت‌کوین تولید شده را حساب کنم. (توجه کنید که halvings در عبارت nSubsidy &gt;&gt; halvings باید در تابع int قرار گیرد وگرنه ارور می‌دهد.)پس تا زمانی که halvings از ۶۴ کوچکتر است باید محاسبه صورت گیرد. به ازای هر بلاک halvings محاسبه می‌شود. هر بار که حلقه شروع می‌شود به عدد بلاک یکی اضافه می‌شود. جایزه محاسبه شده و در متغیر totalSatoshi هر ساتوشی تولید شده را اضافه می‌کنم. وقتی این چرخه تمام شود، یعنی زمانی که halvings از ۶۴ بیشتر شود و قطعا بیت‌کوینی دیگری تولید نخواهد شد، مقدار totalSatoshi رو چاپ می‌کنم. که در عکس مقدار چاپ شده را مشاهده می‌کنید.تعداد کل بیت‌کویندر واقع کمی کمتر از ۲۱ میلیون بیت‌کوین خواهیم داشت (۲۰,۹۹۹,۹۴۹.۹۷۶۹) و بیشتر از آن بیت‌کوینی تولید نخواهد شد!نام استاد: دکتر مریم حاجی اسمعیلی. دکترای علوم کامپیوتر از دانشگاه کینگستون لندنDr.Maryam HajiesmaeiliPhD of computer science from Kingston university of London</description>
                <category>امیرعلی سمیعی</category>
                <author>امیرعلی سمیعی</author>
                <pubDate>Tue, 29 Mar 2022 01:03:00 +0430</pubDate>
            </item>
            </channel>
</rss>