<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های صادق دُرّی نوگورانی</title>
        <link>https://virgool.io/feed/@sdorri</link>
        <description>استادیار و مدیر آزمایشگاه زنجیره قالب‌ها در دانشگاه تربیت مدرس تهران</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:23:42</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/92174/avatar/UiiLH6.jpeg?height=120&amp;width=120</url>
            <title>صادق دُرّی نوگورانی</title>
            <link>https://virgool.io/@sdorri</link>
        </image>

                    <item>
                <title>آشنایی گام به گام با اتریوم و قراردادهای هوشمند</title>
                <link>https://virgool.io/@sdorri/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D9%85%D9%82%D8%AF%D9%85%D8%A7%D8%AA%DB%8C-%D8%A8%D8%A7-%D8%A7%D8%AA%D8%B1%DB%8C%D9%88%D9%85-%D9%88-%D9%82%D8%B1%D8%A7%D8%B1%D8%AF%D8%A7%D8%AF%D9%87%D8%A7%DB%8C-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF-ry0ew1q1ip5l</link>
                <description>در این نوشته که برگرفته از یکی از پروژه‌های ما در درس امنیت تجارت الکترونیکی است، می‌خواهیم شما را با زنجیره قالب‌های Ethereum و مفاهیم پایه آن آشنا کنیم. به طور خاص کارهای زیر را به صورت گام به گام انجام می‌دهیم:با کیف پول MetaMask آشنا می‌شوید و با استفاده از آن اتر آزمایشی رد و بدل می‌کنید.با نحوه نوشتن و انتشار قراردادهای هوشمند با زبان Solidity و در محیط remix آشنا می‌شوید.با فراخوانی قراردادهای هوشمند با MyEtherWallet و نیز از درون کد Javascript آشنا می‌شوید.پیشنهاد می‌کنم پس از این نوشته، نوشته دیگر با عنوان سالیدیتی از ایده تا عمل در یک هفته را بخوانید.لوگوی چیزهایی که در این نوشته از آن‌ها استفاده می‌کنیم.مقدمهزنجیره قالب‌ها نوعی دفتر کل توزیع شده (distributed ledger) است که توسط گره‌ها در یک شبکه همتا به همتا (peer-to-peer / P2P) نگهداری می‌شود. قالب‌ها متشکل از یک یا چند تراکنش هستند که در صورت اجماع اعضای شبکه به زنجیره افزوده می‌شوند. هر قالب با استفاده از عبارت درهم منحصر به فرد به قالب قبلی خود متصل می‌شود و به این طریق یک زنجیره از قالب‌ها پدید می‌آید. تعاملات (تراکنش‌های) افراد با این دفتر کل به صورت تنها افزودنی، تغییر ناپذیر و امن شده با استفاده از رمزنگاری قدرت‌مند است.اتریوم (Ethereum) یک سکوی زنجیره قالب‌های متن‌باز است که به هرکس این اجازه را می‌دهد تا برنامه توزیع شده (dApp) یا اصطلاحاً قرارداد هوشمند (smart contract) بسازد یا از آن استفاده کند. دو نوع حساب (account) در اتریوم وجود دارد:حساب‌های خارجی (external) که مربوط به کاربران هستند و موجودی اتر آن‌ها را نگهداری می‌کنند. آدرس 	حساب خارجی،	برگرفته از کلید عمومی و لازمهٔ استفاده از آن، دسترسی به کلید خصوصی متناظر است. جزئیات یک نمونه حساب خارجی از این آدرس قابل دسترسی است:https://etherscan.io/address/0x2d7c76202834a11a99576acf2ca95a7e66928ba0حساب قرارداد که موجودی اتر و کد قرارداد هوشمند را در خود ذخیره می‌کند. موجودی اتر قرارداد تحت کنترل کد آن است. یک نمونه حساب قرارداد از آدرس زیر قابل دسترسی است:https://etherscan.io/address/0x900d0881a2e85a8e4076412ad1cefbe2d39c566cقراردادهای هوشمند بر روی زنجیره قالب‌های اتریوم نگهداری و توسط تمام اعضای شبکه به صورت یکسان و مضاعف اجرا می‌شوند. این قراردادها مشابه کلاس‌های ++C و جاوا هستند و پس از کامپایل به صورت بایت‌کد در‌می‌آیند. این بایت‌کدها بر روی ماشین مجازی اتریوم (EVM) اجرا می‌شوند. یک قرارداد هوشمند موارد زیر را در بر می‌گیرند:متغیرهای	حالت (state variables)توابع (functions)رویدادها (events)یک نمونه (instance) از قرارداد هوشمند طی مراحل زیر ساخته می‌شود:https://dzone.com/ :مراحل ایجاد قرارداد هوشمند. منبعبرای 	ایجاد، یک تراکنش در شبکه ثبت می‌شود. تراکنش‌ها برای	اینکه قابلیت اجرا پیدا کنند باید استخراج (mine) شوند.هنگامی که یک گره استخراج کردن را با موفقیت انجام دهد، یک قالب جدید ایجاد می‌شود که شامل تراکنش و آدرس قرارداد است. گره استخراج کننده، قالب جدید را با همه‌پخشی (broadcast)	به سایر گره‌ها اطلاع می‌دهد.قالب جدید توسط سایر گره‌ها تأیید و تصدیق می‌شود و به نسخه خودشان از زنجیره قالب افزوده می‌شود.بنابراین هر نمونه از قرارداد هوشمند یک آدرس منحصر به فرد دارد و هنگام اجرا، این آدرس فراخوانی می‌شود. مراحل فراخوانی مشابه ایجاد است؛ با این تفاوت که قالب جدید، تغییرات ناشی از اجرا بر روی موجودی حساب‌ها و متغیرهای قراردادها را در خود دارد:مراحل فراخوانی یک قرارداد هوشمند و ثبت تغییرات متغیرهای آن. منبع: https://dzone.comزنجیره قالب اصلی (main network) اتریوم برای همگان قابل دسترسی است و می‌توانند با خرج کردن مقدار مناسب از رمزارز رایج اتریوم یعنی اتر (Ether)، از آن استفاده کنند و بر روی آن قرارداد هوشمند بگذارند یا تراکنش اجرا کنند. نگهداری زنجیره قالب اصلی نیاز به مقادیر قابل توجهی از توان محاسباتی دارد و همه تراکنش‌ها و قراردادهای موجود بر روی آن برای همگان قابل مشاهده است. علاوه بر زنجیره اصلی، تعدادی زنجیره آزمایشی (test network) نیز برای کاربردهای تحقیق و توسعه موجود هستند که اتر موجود بر روی آن ارزش خاصی ندارد. طبق آخرین آمار مربوط به امروز (۱۶ شهریور ۱۴۰۰)، شبکه اصلی اتریوم بیش از ۳،۶۸۵ عضو داشته است؛ در حالی که شبکه آزمایشی Ropsten با تنها چند گره نگهداری می‌شود. امکان راه‌اندازی زنجیره قالب‌های خصوصی یا محلی هم وجود دارد که گره‌های عضو آن تحت نظر سازمان متبوع است.توجه: در این نوشته تمام فعالیت‌ها بر روی یک شبکه آزمایشی اتریوم انجام می‌شود و لازم نیست برای آن‌ها اتر واقعی خرج کنید. اتری که در شبکه آزمایشی با آن کار می‌کنید هیچ ارزش مالی ندارد!بخش اول. افتتاح و کار با حساب!برای کار کردن با اتریوم باید از یک کیف پول استفاده کنید. مهمترین وظیفه کیف پول حفاظت از کلید خصوصی مالک است. کیف پول‌های مختلفی وجود دارد که در این بخش از افزونه مرورگر MetaMask که بر روی مرورگرهای Firefox, Chrome, Opera یا Brave کار می‌کنیم.گام ۱. با مراجعه به آدرس https://metamask.io افزونه MetaMask مناسب مرورگر خود را نصب کنید.گام ۲. با فعال شدن افزونه، مراحل ایجاد یک کیف پول جدید را طی کنید.توجه: ما در این نوشته از روش اتصال قدیمی‌تر MetaMask به صفحات وب استفاده می‌کنیم. به این منظور باید افزونه MetaMask Legacy Web3 را هم نصب کنید. (لینک کروم را گذاشتم. برای بقیه مرورگرها هم هست!)در صورتی که به صورت موفقیت آمیز کیف پول خود را ایجاد کرده باشید، تصویری مشابه شکل زیر مشاهده خواهید کرد که در آن آدرس شما و موجودی حساب (صفر) قابل مشاهده است.نمونه اطلاعات حسابی که تازه با متامسک ساخته‌اید.گام ۳. به صورت پیش‌فرض شبکه اصلی اتریوم (Main Ethereum Network) برای فعالیت انتخاب شده است. از قسمت بالا سمت راست پنجره، شبکه را به شبکه آزمایشی Ropsten تغییر دهید.گام۴. آدرس کیف پول خود را در گزارش بگذارید. برای این منظور می‌توانید ماوس را برروی آدرس کیف پول در قسمت بالا سمت راست برده و بر روی نماد Copy to clipboard اشاره کنید.گام۵. به شیر آب Ropsten به آدرس https://faucet.ropsten.be مراجعه کنید و با دادن آدرس حساب خود اتر  آزمایشی دریافت کنید. در این صورت، پیامی مبنی بر ارسال اتر به حساب خود مشاهده می‌کنید که شامل یک آدرس تراکنش نیز می‌باشد (تصویر پایین). با کلیک کردن برروی درهم شده تراکنش، به صفحه جزییات تراکنش هدایت می‌شوید.Test ETH sent to 0x63e54004e1f117C06Efdb692F932a2D47b95b7E3Transaction hash 0xb470d082351471c8b2f4a0fc7253793053147de9694122460d6c3f67fc36d3b9گام۶. در صفحه MetaMask به منظور ارسال Ether به یک حساب دیگر، روی گزینه Send کلیک کنید. اگر دوست داشتید محض امتحان، آدرس مقصد زیر را وارد کنید:0x15114838531074F04680FaA4fb9d0AC6409ce4d2سپس یک مقدار دلخواه را به عنوان مبلغ وارد کنید و Transaction Fee را مشخص کنید. همان‌طور که از گزینه‌ها مشخص است، اگر بخواهید تراکنش سریع‌تر در زنجیره قالب قرار گیرد باید اتر بیشتری مصرف کنید. سپس برروی Next کلیک کنید. در صفحه بعد، جزییات تراکنش به منظور تأیید نمایش داده می‌شود. روی گزینه Confirm کلیک کنید.گام۷. مدتی صبر کنید تا تراکنش شما در زنجیره قالب ثبت شود (در صفحه اول MetaMask وضعیت تراکنش از PENDING به CONFIRMED تغییر کند.) سپس برروی تراکنش کلیک کرده و در جزییات نمایش داده شده رویView on Etherscan کلیک کنید تا جزئیات بیشتری را در مورد این تراکنش مشاهده کنید.بخش دوم. ساخت قرارداد هوشمندزبان اصلی نوشتن قراردادهای هوشمند در شبکه اتریوم، Solidity است. ساختار کلی قراردادهای هوشمند در این زبان به صورت زیر است:pragma solidity 0.4.24
contract ContractName {
 	&lt;variable declaration&gt;
 	&lt;mappings&gt;
 	&lt;constructor&gt;
 	&lt;functions&gt;
 	&lt;modifiers&gt;
}خط اول، نسخه Solidity برای اجرای این قرارداد را نشان می‌دهد. در خط بعد قرارداد هوشمند تعریف می‌شود که داخل آن متغیرها، توابع و غیره تعریف می‌شوند. برای نمونه قرارداد هوشمند زیر را درنظر بگیرید:contract OwnedToken{
	TokenCreator creator;
	address owner;
 	byte32 name;
 	constructor(byte32 _name) public {
 		owner = msg.sender;
 		creator = TokenCreator(msg.sender);
 		name = _name;
 	}
}
contract TokenCreator {…}در یک فایل Solidity می‌توان بیش از یک قرارداد هوشمند داشت. در اینجا دو قرارداد به نام‌های OwnedToken و TokenCreator تعریف شده‌اند. همان‌طور که در خط دوم مشاهده می‌کنید، می‌توان یک قرارداد را داخل قرارداد دیگر استفاده کرد (البته باید آدرس همدیگر را داشته باشند!). دو خط بعدی، تعریف متغیرهای owner و name است که  به ترتیب برای نگه‌داری آدرس مالک قرارداد و نام قرارداد استفاده می‌شوند. بعد از آن constructor قرار دارد. این تابع تنها یک‌بار در زمانی که قرارداد بر روی شبکه قرار می‌گیرد اجرا می‌شود. در خط ۶ آدرسی که با استفاده از آن قرارداد هوشمند در شبکه قرار گرفته است ذخیره می‌شود. هنگام قراردادن قرارداد می‌توان مقدار اولیه متغیرهای آن را هم تنظیم کرد. مثلا در اینجا از طریق آرگومان name_ در خط ۸، متغیر name مقدار اولیه می‌گیرد.در ادامه، از ابزار remix برای نوشتن قرارداد هوشمند استفاده می‌کنیم. این ابزار متن‌باز و برخط است، و بدون نیاز به نصب، در محیط مرورگر اجرا می‌شود.گام ۸. صفحه ابزار Remix را در مرورگر خود باز کنید. در صفحه اصلی، ابتدا از قسمت Environments، گزینه مربوط به زبان Solidity را انتخاب کنید. سپس از نوار سمت چپ، روی گزینه File Explorers کلیک کنید و سپس، Create new file را انتخاب کنید و در پنجره باز شده یک نام برای قرارداد هوشمند خود انتخاب کنید. مشاهده می‌کنید که فایل قرارداد تازه ساخته شده شما در بخش Browser نمایان می‌شود.گام ۹. قطعه کد زیر را وارد کنید (شماره خط‌ها را حذف کنید!)pragma solidity 0.5.1;
contract Messenger{
     address owner;
     string[] messages;
     
     constructor() public {
       owner = msg.sender;
    }

    function add(string memory newMessage) public {
         require(msg.sender == owner);
         messages.push(newMessage);
     }

     function count() view public returns(uint) {
         return messages.length;
     }

     function getMessage(uint index) view public returns(string memory) {
         return messages[index];
     }
}توضیح: در دو خط اول متغیرهایی از نوع address و آرایه string با نام‌های owner و messages ایجاد می‌کنیم. در خط بعدی constructor را ایجاد می‌کنیم. در اولین خط constructor مقدار متغیر owner را برابر با شناسه کسی که قرارداد خود را در شبکه قرار داده قرار می‌دهیم (متغیر msg.sender). در خط بعدی یک تابع public تعریف می‌کنیم. در اولین خط تابع شرطی تعریف می‌کنیم که ارسال کننده پیام حتماً باید مالک قرارداد هوشمند باشد. در خط بعد پیام دریافتی را به آرایه‌ای از پیام‌ها اضافه می‌کنیم. در خط بعدی یک تابع جدید تعریف می‌کنیم که یک پیام را با استفاده از index بازمی‌گرداند.گام ۱۰. پیشنهاد می‌کنم مطالب زیر را در خصوص زبان Solidity مطالعه کنید:تفاوت بین msg.sender و tx.origin چیست؟انواع external, public, internal و private چه هستند و تفاوت آن‌ها چیست؟انواع مرجع (reference type)	چه هستند و منظور از محل‌های ذخیره‌سازی memory, storage و calldata چیست؟‌اگر می‌خواهید با خود زبان سالیدیتی بیشتر آشنا شوید، پیشنهاد می‌کنم به صفحه سالیدیتی با مثال از سایت رسمی این زبان مراجعه کنید.گام ۱۱. از نوار سمت چپ، روی Solidity Compiler کلیک کنید. سپس گزینه Compile filename.sol را انتخاب کنید تا قرارداد هوشمند کامپایل شود:بخش کامپایل در Remixهمانطور که در این شکل مشاهده می‌شود، نسخه کامپایلر منطبق با نسخه قرارداد هوشمند ما است.گام ۱۲. از نوار سمت چپ، روی Deploy &amp; run transactions کلیک کنید، محیط اجرا را برروی JavaScript VM قرار دهید، و گزینه Deploy را انتخاب کنید. نتیجه کار در پایین (بخش Deployed contracts) قابل مشاهده است. (شکل زیر)توضیح: محیط اجرای Javascript VM در remix و مرورگرتان کار می‌کند و تعدادی حساب آزمایشی با موجودی ۱۰۰ اتر در اختیار شما می‌گذارد که می‌توانید با استفاده از آن‌ها اجرای قرارداد را آزمایش کنید. می‌توانید با تغییر Account، حساب جاری را تغییر دهید.قرارداد هوشمندی که در Javascript VM درون مرورگر مستقر شده است.گام ۱۳. در بخش Deployed contracts در فضای جلوی تابع add یک رشته دلخواه تایپ کنید و بر روی دکمه add کلیک کنید. فراموش نکنید که رشته خود را داخل گیومه (&quot;) قرار دهید. نتیجه اجرا در پنجره پایین وسط صفحه با یک علامت  نشان داده شده است. اگر بر روی علامت فلش سمت چپ سطر مربوطه کلیک کنید، جدولی شامل جزئیات کامل ظاهر می‌شود.گام ۱۴. چند رشته تصادفی دیگر را اضافه کنید، و از توابع count و getMessage استفاده کنید.گام۱۵. Account خود را از بالای قسمت Deploy &amp; run transactions عوض کنید و یک حساب دیگر به جز حسابی که با آن قرارداد هوشمند را در شبکه قرار داده‌اید انتخاب کنید. سعی کنید با این اکانت، تابع add را با یک رشته دلخواه فراخوانی کنید. اینجا یک خطا اتفاق می‌افتد. اگر گفتید چرا؟بخش سوم. انتشار قرارداد هوشمنددر این بخش می‌خواهیم قرارداد هوشمند Messenger (بخش دوم) را بر روی شبکه آزمایشی Ropsten قراردهیم تا در شرایطی نزدیک‌تر به واقعیت با آن کار کنیم. همچنین جهت ایجاد شفافیت بیشتر، کد منبع قرارداد را از طریق سایت Etherscan منتشر می‌کنیم.گام ۱۶. در remix، کد Messenger.sol را باز کنید و پس از کامپایل کردن آن، از نوار سمت چپ روی Deploy &amp; run transactions کلیک کنید و محیط اجرا را به Injected Web3 تغییر دهید.تغییر محیط استقرار Remix به Injected Web3گام ۱۷. در اینجا MetaMask صفحه‌ای را به شما نمایش می‌دهد که اجازه اتصال remix به MetaMask را می‌گیرد. اجازه را صادر کنید.کسب اجازه MetaMask برای اتصال Remix به کیف پول شما توضیح: با این کار کلیه تراکنش‌ها از طریق کیف پولی که در مرورگرتان است با شبکه (آزمایشی) اتریوم انجام می‌شود و حساب جاری، به حساب شما که تحت مدیریت MetaMask است تغییر می‌کند.گام ۱۸. گزینه Deploy را انتخاب کنید. در این صورت MetaMask تاییدیه تراکنش را از شما می‌گیرد.گام ۱۹. پس از انتشار قرارداد، لینک مشاهده تراکنش مربوطه روی Etherscan در پنجره پایین صفحه نمایش داده خواهد شد (مانند تصویر زیر).توجه: با مراجعه به افزونه MetaMask می‌توانید تراکنش خود را در بخش History نیز مشاهده کنید و با کلیک کردن بر روی تراکنش جزییات بیشتری از آن نمایش داده خواهد شد.جزئیات استقرار قرارداد روی Ropsten توسط Remixگام ۲۰. برای بدست آوردن آدرس قرارداد باید از قسمت Deploy &amp; run transactions به بخش Deployed Contracts مراجعه کنید. سپس بر روی نماد Clipboard کنار نام قرارداد خود کلیک کنید تا آدرس در حافظه کپی شود.گام ۲۱. قرارداد نویسان می‌توانند به صورت اختیاری کد منبع قراردادشان را هم منتشر کنند. ما هم می‌خواهیم همین کار را بکنیم. به این منظور، به اینجا مراجعه کنید و آدرس قرارداد خود، و سایر اطلاعات لازم را تکمیل کنید. سپس گزینه Continue را انتخاب کنید.گام ۲۲. در صفحه جدید (Contract Source Code)، کد قرارداد را وارد کنید و نهایتاً گزینه Verify and Publish را انتخاب کنید. پس از انجام عملیات، صفحه Compiler Output نمایش داده می‌شود که در آن مشخص شده است که قرارداد شما به صورت موفقیت آمیزی وارسی و منتشر شده است.توجه: از این پس،هر مراجعه کننده‌ای به سایت Etherscan با مراجعه به صفحه قرارداد شما می‌تواند از بخش Code، کد منبع قرارداد را مشاهده نماید (مشابه شکل زیر که متن قرارداد معروف TheDAO را نشان می‌دهد.)متن قرارداد معرف TheDAO که در Etherscan منتشر شده است.بخش چهارم. اجرای قرارداد هوشمند سایرینتا این لحظه قرارداد هوشمند خود را در شبکه آزمایشی Ropsten قرار داده‌اید. برای اینکه دیگران نیز بتوانند قرارداد را اجرا کنند باید از نحوه فراخوانی آن مطلع باشند. این اطلاعات در قالب واسط باینری برنامه (Application Binary Interface / ABI) بیان می‌شود. این واسط چگونگی تبدیل فراخوانی‌های متدها به کد EVM را تعیین می‌کند و بایستی توسط سازنده قرارداد در اختیار استفاده کنندگان قرار گیرد. در این بخش چگونگی دسترسی به ABI قرارداد و نیز استفاده از آن را تمرین می‌کنیم. افزونه MetaMask امکان فراخوانی قراردادهای هوشمند را ندارد. به این منظور از قابلیت کیف پول برخط MyEtherWallet در ترکیب با MetaMask استفاده می‌کنیم (این روش ساده‌ترین روش ممکن نیست؛ ما برای مقاصد آموزشی این روش را انتخاب کرده‌ایم.)گام ۲۳. در remix به قسمت Solidity Compiler مراجعه کنید و در پایین تب، گزینه  را انتخاب کنید. محتویات Clipboard که حاوی ABI قرارداد است را در گزارش خود بیاورید.توجه: در صورتی که کد منبع قراردادی مانند کاری که پیش‌تر در انتهای بخش سوم انجام دادیم بر روی Etherscan موجود باشد، می‌توان ABI را نیز از همان سایت دریافت کرد.گام ۲۴. به سایت MyEtherWallet مراجعه کنید و گزینه Access My Wallet را انتخاب کنید. در صفحه بعدی، اتصال به کیف پول MetaMask (گزینه MEW CX)  را انتخاب کنید و پس از تأیید شرایط استفاده، اجازه اتصال MyEtherWallet به MetaMask را صادر نمایید.گام ۲۵. از منوی سمت چپ، گزینه Contract را انتخاب کنید (شکل زیر)بخش تعامل با قراردادهای هوشمند در MyEtherWalletگام ۲۶. در بخش Contract Address، مقدار زیر را به صورت نمونه وارد کنید:0xd376b8f069EB545E747054aA5DcDD64Bac717B7aاین قرارداد مخصوص این نوشته ایجاد شده است و قرار است طی آن به این نوشته رأی مثبت (Like) یا منفی (Dislike) بدهید. در بخش ABI هم مقدار زیر را وارد کنید:[{&amp;quotconstant&amp;quot:false,&amp;quotinputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quotproposal&amp;quot,&amp;quottype&amp;quot:&amp;quotuint256&amp;quot}],&amp;quotname&amp;quot:&amp;quotvote&amp;quot,&amp;quotoutputs&amp;quot:[],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotnonpayable&amp;quot,&amp;quottype&amp;quot:&amp;quotfunction&amp;quot},{&amp;quotconstant&amp;quot:true,&amp;quotinputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quot&amp;quot,&amp;quottype&amp;quot:&amp;quotuint256&amp;quot}],&amp;quotname&amp;quot:&amp;quotproposals&amp;quot,&amp;quotoutputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quotname&amp;quot,&amp;quottype&amp;quot:&amp;quotstring&amp;quot},{&amp;quotname&amp;quot:&amp;quotvoteCount&amp;quot,&amp;quottype&amp;quot:&amp;quotuint256&amp;quot}],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotview&amp;quot,&amp;quottype&amp;quot:&amp;quotfunction&amp;quot},{&amp;quotconstant&amp;quot:true,&amp;quotinputs&amp;quot:[],&amp;quotname&amp;quot:&amp;quotchairperson&amp;quot,&amp;quotoutputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quot&amp;quot,&amp;quottype&amp;quot:&amp;quotaddress&amp;quot}],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotview&amp;quot,&amp;quottype&amp;quot:&amp;quotfunction&amp;quot},{&amp;quotconstant&amp;quot:false,&amp;quotinputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quotto&amp;quot,&amp;quottype&amp;quot:&amp;quotaddress&amp;quot}],&amp;quotname&amp;quot:&amp;quotdelegate&amp;quot,&amp;quotoutputs&amp;quot:[],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotnonpayable&amp;quot,&amp;quottype&amp;quot:&amp;quotfunction&amp;quot},{&amp;quotconstant&amp;quot:true,&amp;quotinputs&amp;quot:[],&amp;quotname&amp;quot:&amp;quotwinningProposal&amp;quot,&amp;quotoutputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quotwinningProposal_&amp;quot,&amp;quottype&amp;quot:&amp;quotuint256&amp;quot}],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotview&amp;quot,&amp;quottype&amp;quot:&amp;quotfunction&amp;quot},{&amp;quotconstant&amp;quot:false,&amp;quotinputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quotvoter&amp;quot,&amp;quottype&amp;quot:&amp;quotaddress&amp;quot}],&amp;quotname&amp;quot:&amp;quotgiveRightToVote&amp;quot,&amp;quotoutputs&amp;quot:[],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotnonpayable&amp;quot,&amp;quottype&amp;quot:&amp;quotfunction&amp;quot},{&amp;quotconstant&amp;quot:true,&amp;quotinputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quot&amp;quot,&amp;quottype&amp;quot:&amp;quotaddress&amp;quot}],&amp;quotname&amp;quot:&amp;quotvoters&amp;quot,&amp;quotoutputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quotweight&amp;quot,&amp;quottype&amp;quot:&amp;quotuint256&amp;quot},{&amp;quotname&amp;quot:&amp;quotvoted&amp;quot,&amp;quottype&amp;quot:&amp;quotbool&amp;quot},{&amp;quotname&amp;quot:&amp;quotdelegate&amp;quot,&amp;quottype&amp;quot:&amp;quotaddress&amp;quot},{&amp;quotname&amp;quot:&amp;quotvote&amp;quot,&amp;quottype&amp;quot:&amp;quotuint256&amp;quot}],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotview&amp;quot,&amp;quottype&amp;quot:&amp;quotfunction&amp;quot},{&amp;quotconstant&amp;quot:true,&amp;quotinputs&amp;quot:[],&amp;quotname&amp;quot:&amp;quotwinnerName&amp;quot,&amp;quotoutputs&amp;quot:[{&amp;quotname&amp;quot:&amp;quotwinnerName_&amp;quot,&amp;quottype&amp;quot:&amp;quotstring&amp;quot}],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotview&amp;quot,&amp;quottype&amp;quot:&amp;quotfunction&amp;quot},{&amp;quotinputs&amp;quot:[],&amp;quotpayable&amp;quot:false,&amp;quotstateMutability&amp;quot:&amp;quotnonpayable&amp;quot,&amp;quottype&amp;quot:&amp;quotconstructor&amp;quot}]گام ۲۷. رأی خود را ارسال کنید:ابتدا اندیس هر پروپوزال (Like/Dislike) را از طریق خواندن عناصر ۰ و ۱ از آرایه 	Proposals پیدا کنید.سپس از طریق فراخوانی متد giveRightToVote، آدرس خود را به عنوان یک رأی دهنده معتبر ثبت کنید.نهایتاً رأی خود را از طریق ارسال اندیس پروپوزال مناسب به متد vote بدهید.چطور بود؟بخش پنجم. ارسال اتر از طریق کد Javascriptدر این بخش می‌خواهیم از طریق کد، مقداری اتر به آدرس دلخواه انتقال دهیم. بنابراین کد ما باید به زنجیره قالب‌ها متصل شود و بر روی آن تراکنش انجام دهد. در زبان‌های مختلف امکاناتی گذاشته شده است که یکی از معروف‌ترین آن‌ها، کتابخانه Web3 برای زبان Javascript است. MetaMask به صورت پیش‌فرض کد این کتابخانه را در تمام صفحاتی که توسط مرورگر باز می‌شود می‌گذارد و از همین طریق تاکنون remix و MyEtherWallet به حساب شما دسترسی پیدا می‌کردند. کد Javascript بایستی بر روی یک سرور وب HTTP قرار گرفته باشد و در صورتی که آن را از یک فایل محلی (بدون پروتکل HTTP) در مرورگر باز کنید نتیجه‌ای نخواهد داشت!در ادامه می‌خواهیم یک سرویس‌دهنده وب را راه‌اندازی کنیم. برای این منظور، از برنامه BusyBox استفاده می‌کنیم. در صورتی که از سیستم‌عامل ویندوز استفاده می‌کنید، نسخه اجرایی را از اینجا دریافت کنید. در صورتی هم که از سیستم عامل اوبونتو استفاده می‌کنید دستور زیر را اجرا کنید تا نصب شود:sudo apt-get install busyboxگام ۲۸. یک پوشه دلخواه ایجاد کرده و داخل آن یک فایل با عنوان index.html ایجاد کنید و محتوای آن را متن زیر قرار دهید:&lt;!DOCTYPE html&gt;
&lt;html lang=&amp;quoten&amp;quot&gt;
&lt;head&gt;
    &lt;meta charset=&amp;quotUTF-8&amp;quot&gt;
    &lt;script type=&amp;quottext/javascript&amp;quot src=&amp;quotcode.js&amp;quot&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;Send Ether using Web3js&lt;/h1&gt;
&lt;p&gt;Type the amount and address, then press Send.&lt;/p&gt;
  &lt;p&gt;Amount (wei):&lt;br&gt;
  &lt;input type=&amp;quottext&amp;quot id=&amp;quotamount&amp;quot value=&amp;quot0&amp;quot&gt;&lt;/p&gt;
  &lt;p&gt;Address:&lt;br&gt;
  &lt;input type=&amp;quottext&amp;quot id=&amp;quotaddress&amp;quot value=&amp;quot0x&amp;quot&gt;&lt;/p&gt;
  &lt;input type=&amp;quotsubmit&amp;quot value=&amp;quotSend!&amp;quot =&amp;quotsend()&amp;quot&gt;
&lt;div&gt;
&lt;h2&gt;Output:&lt;/h2&gt;
&lt;p id=&amp;quotlog&amp;quot&gt; &lt;/p&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;گام ۲۹. در همان پوشه یک فایل دیگر به نام code.js ایجاد کنید و محتوای آن را موارد زیر قرار دهید:function mylog(htm) {
    document.getElementById(&#039;log&#039;).insertAdjacentHTML(&#039;beforebegin&#039;, &#039;&lt;p&gt;&#039;+htm+&#039;&lt;/p&gt;&#039;);
}
async function myconnect() {
    if (window.ethereum) {
        window.web3 = new Web3(ethereum);
        try {
            await ethereum.enable();
        } catch (error) {
            console.error(error);
        }
    } else if (window.web3) {
        window.web3 = new Web3(web3.currentProvider);
    } else {
        windows.alert&#40;&#039;Non-Ethereum browser detected. You should consider trying&#039;+ &#039;MetaMask!&#039;&#41;;
    }
}
myconnect();
function send() {
    web3.eth.sendTransaction({ 
        from: web3.eth.accounts[0],
        to: document.getElementById(&#039;address&#039;).value,
        value: document.getElementById(&#039;amount&#039;).value
    }, function(error, hash){
        if(error) {
            console.error(error);
            mylog(error.message);
        } else {
            var htm = &amp;quotSent! Transaction hash: &lt;a target=&#039;_blank&#039;&amp;quot + &amp;quothref=&#039;https://ropsten.etherscan.io/tx/&amp;quot+hash+&amp;quot&#039;&gt;&amp;quot+hash+&amp;quot&lt;/a&gt;&amp;quot
            mylog(htm);
        }
    });
}گام ۳۰. محتویات پوشه را بر روی وب سرور بگذارید. در محیط خط فرمان و پوشه مربوطه دستور زیر را اجرا کنید تا یک وب‌سرور روی درگاه ۸۰۰۰ اجرا شود (بعداً می‌توانید با دستور busybox pkill httpd این وب‌سرور را غیرفعال کنید.)busybox httpd -p 127.0.0.1:8000به منظور بازکردن صفحه index.html باید آدرس http://127.0.0.1:8000 را در مرورگر وارد کنید.گام ۳۱. صفحه index.html را در مرورگر باز کنید و اجازه اتصال صفحه به MetaMask را بدهید.گام ۳۲. در صفحه وب باز شده مبلغ و آدرس گیرنده دلخواهی را وارد کنید و روی دکمه Send کلیک کنید تا درخواست ارسال اتر ایجاد شود. MetaMask اجازه ارسال اتر از حساب شما را می‌گیرد. می‌توانید اتر آزمایشی را به این آدرس بفرستید:0x15114838531074F04680FaA4fb9d0AC6409ce4d2گام ۳۳. صبر کنید تا تراکنش CONFIRM شود.زیاد سخت نبود! نه؟جمع‌بندیدر این نوشته به صورت گام به گام با اتریوم و قراردادهای هوشمند آشنا شدید، کیف پول ساختید، اتر گرفتید و فرستادید، قرارداد هوشمند ساختید، به این نوشته رأی دادید و در پایان هم یک برنامه JavaScript خیلی ابتدایی  برای تعامل با شبکه اتریوم نوشتید. الان باید اصول را فهمیده باشید چون خیلی سطح پایین کارها را انجام داده‌اید. یک کتابخانه حرفه‌ای به اسم Truffle Suite برای توسعه قراردادهای هوشمند به زبان سالیدیتی و تعامل با آن‌ها از جاوا اسکریپت هست و می‌توانید به جای BusyBox از NodeJS استفاده کنید. به این منظور، نوشته دیگرم با عنوان  سالیدیتی از ایده تا عمل در یک هفته را بخوانید.پی‌نوشت: در تهیه این نوشته از دانشجویان گرامی که دستیار درس امنیت تجارت الکترونیکی در ترم‌های مختلف بوده‌اند یا به من محبت داشته‌اند کمک گرفته‌ام. شایسته است نامی از ایشان در اینجا ببرم: آقایان و خانم‌ها مهندس یاشار نصابیان، مرتضی امیرمحسنی، نسیبه محمدزاده، و محمد رجبی‌نسب.</description>
                <category>صادق دُرّی نوگورانی</category>
                <author>صادق دُرّی نوگورانی</author>
                <pubDate>Tue, 07 Sep 2021 15:59:03 +0430</pubDate>
            </item>
                    <item>
                <title>سالیدیتی از ایده تا عمل در یک هفته</title>
                <link>https://virgool.io/Solidity/%D8%B3%D8%A7%D9%84%DB%8C%D8%AF%DB%8C%D8%AA%DB%8C-%D8%A7%D8%B2-%D8%A7%DB%8C%D8%AF%D9%87-%D8%AA%D8%A7-%D8%B9%D9%85%D9%84-%D8%AF%D8%B1-%DB%8C%DA%A9-%D9%87%D9%81%D8%AA%D9%87-xkxqrdv16wak</link>
                <description>سلام. در این نوشته می‌خواهم تجربه خودم در چگونگی پیاده‌سازی یک ایده حول قراردادهای هوشمند به زبان سالیدیتی (Solidity) را با شما به اشتراک بگذارم. در این مسیر از OpenZeppelin و Truffle Suite استفاده می‌کنیم و در نهایت قرارداد را روی شبکه آزمایشی اتریوم (Ropsten) می‌بریم تا مقدار گس مصرفی را اندازه بگیریم. یک بلاکچین نسبتاً جدید شبیه اتریوم را هم به نام RSK آزمایش می‌کنیم که کارمزد دلاری تراکنش‌ها درش خیلی مقرون به صرفه‌تر است. نتیجه اینکه این کار، برای کسی که تجربه کافی در برنامه‌نویسی داشته باشد، خیلی سخت نیست و در کمتر از یک هفته جمع می‌شود!اگر می‌خواهید به صورت گام به گام و عملی با مقدمات اتریوم و قراردادهای هوشمند آشنا شوید، پیشنهاد می‌کنم نوشته دیگر با عنوان آشنایی گام به گام با اتریوم و قراردادهای هوشمند را بخوانید.لوگوی چیزهایی که استفاده می‌کنیم!پیشگفتارماجرا از اینجا شروع شد که وقتی نوشتن یکی از مقالاتمان در حوزه کاربردهای بلاکچین و قراردادهای هوشمند به آخرهایش رسید، گفتیم یک برآوردی از هزینه‌هایش داشته باشیم. چون کدی نداشتیم، گفتیم حداقل یک برآورد سرانگشتی بکنیم. برآورد اینطوری شد که متوسط زمان تأیید تراکنش‌ها روی شبکه اتریوم حدود ۱۳.۱۹ ثانیه و متوسط یک ماهه کارمزد تراکنش‌ها طی ۸ ماهه اول ۲۰۲۱ از ۳.۴۸ تا ۲۳.۶۴ دلار بوده است! یعنی باید می‌گفتیم برای یک تراکنش ساده (مثلا به روز رسانی یک متغیر عددی از قرارداد هوشمند)، اینهمه دلار باید خرج کرد! با خودمان گفتیم حتماً اینجا داریم یک اشتباهی می‌کنیم و به احتمال خیلی زیاد ما جزو این میانگینی‌ها نیستیم! این قلقلک اساسی باعث شد دل به دریا بزنیم و اقدام به پیاده‌سازی یک اثبات مفهومی یا proof-of-concept بکنیم (البته مفهومی بودنش را قبول ندارم چون ما کد زدیم!) کل ماجرا چند روزی طول کشید و اگر می‌خواهید بفهمید که ارتباط این تصور ما با واقعیت چطوری بود، در بخش «یک لحظه تأمل» به آن هم می‌رسم!ما به واسطه مطالبی که من در درس امنیت تجارت الکترونیکی می‌گویم، از لحاظ تئوریک با یکسری مسائل در سالیدیتی آشنا بودیم. یعنی صفرِ صفر نبودیم. مثلا می‌دانستیم که تا جای ممکن باید از نوشتن حلقه و کارهایی که نیاز به پیمایش آرایه و لیست دارد پرهیز کرد. یا بهتر است به جای string در جاهایی که رشته خیلی طولانی نیست از bytes32 (طول ثابت) استفاده کرد. یا اینکه مثلا یک دستور مخصوص ecrecover برای چک کردن امضای دیجیتالی در سالیدیتی هست. اما نمی‌دانستیم دقیقا چطوری یک برنامه کامل داشته باشیم که به قرارداد هوشمند وصل شود و آزمایشش کنیم. در این نوشته سعی می‌کنم ترکیبی از آموزش و انتقال تجربه را برای شما ارائه دهم.اگر می‌خواهید با خود زبان سالیدیتی بیشتر آشنا شوید، پیشنهاد می‌کنم به صفحه سالیدیتی با مثال از سایت رسمی این زبان مراجعه کنید.مرحله اول: شروع از راهنمای OpenZeppelinما باید در بخشی از کارمان یک توکن ERC-20 و یک توکن ERC-721 درست می‌کردیم. کتابخانه OpenZeppelin کد آماده درست و حسابی برای این کار دارد. لذا پیشنهاد می‌کنم مثل ما از راهنمای کتابخانه OpenZeppelin شروع کنید. دست کم سه تا عنوان اولش را بخوانید و قدم به قدم انجام دهید. در این مرحله یاد می‌گیرید که:۱. چطور یک پروژه NodeJS بسازید و Truffle Suite را به آن اضافه کنید (برای کار کردن با قراردادهای هوشمند از داخل کد جاوا اسکریپت)۲. چطور قراردادهای خودتان به زبان سالیدیتی را به پروژه اضافه کنید، آن‌ها را کامپایل کنید، و از کتابخانه‌های OpenZeppelin در آن‌ها استفاده کنید.۳. چطور یک گره (ماینر) بلاکچین (ganache-cli) را به صورت محلی برای تست سریع  بالا بیاورید، قراردادهای کامپایل شده را رویش مستقر کنید، و چطور از داخل کد جاوا اسکریپت تراکنش بزنید و قراردادها را فراخوانی کنید.اجرا کردن دستور العمل‌های آموزش در حد چند ساعت زمان می‌بَرَد.مرحله دوم: نوشتن قرارداد هوشمند خودمان به زبان سالیدیتیبا این چیزهایی که یاد گرفتید، باید بروید سراغ نوشتن کد خودتان. داشتن چیزی شبیه شبه کد که جزئیات فرایندها درش مشخص است، می‌تواند کارتان را خیلی جلو بیاندازد! در مورد پروژه ما، برای توکن ERC-20 که فقط چند خط کد constructor باید زده می‌شد و بقیه‌اش را OpenZeppelin انجام داده بود. از اینجا ببینید. برای توکن ERC-721 هم علاوه بر constructor باید یک تابع ضرب توکن نوشته می‌شد که توکن‌های جدید را به تناسب ایجاد کند. کلّیّت روشِ کار اینجا بود ولی ما میخواستیم یک transfer برای توکن ERC-20 درش داشته باشیم و هزینه ضرب توکن را بگیریم. برای آن لازم بود فراخواننده قبل از درخواست ضرب توکن، مقدار مناسب از توکن ERC-20 را برای نقل و انتقال توسط قرارداد ما approve کند؛ همین!اما اصل کار در یک قرارداد دیگر بود که یکسری اطلاعات را باید نگه می‌داشت و یکسری چیزها را چک می‌کرد و خلاصه منطق قراردادْ-هوشمندیِ ما در این قرارداد بود. یک نکته‌ای که اینجا یاد گرفتیم این بود که برای صدا زدن یک قرارداد دیگر که قبلاً روی شبکه رفته است، راحت‌ترین کار این است که یک interface تعریف کنیم و تعریف دقیق توابعی که می‌خواهیم ازش صدا کنیم را درش بگذاریم. همه این توابع با قید external تعریف می‌شوند و بدنه ندارند. بعد، یک متغیر از نوع همان interfaceی که تعریف کرده‌ایم را در قرارداد خودمان می‌گذاریم و مساوی آدرس شبکهٔ قرارداد مستقر شده می‌گذاریم (یک cast لازم است!) البته در محیط آزمایشی باید هر دو قرارداد را خودمان مستقر کنیم و یک نسخه آزمایشی از قراردادی که اول بهش اشاره کردم داشته باشیم!مرحله سوم: صدا زدن قراردادها از جاوا اسکریپتبعد از اینکه کد سالیدیتی را نوشتید، طبق همان آموزش‌های مرحله اول، با جاوا اسکریپت و گره محلی Ganache آزمایشش کنید. ما اینجا چندتا نکته یاد گرفتیم که ذکر می‌کنم:۱- هر فراخوانی تابعی باید با ذکر await باشد و گرنه بدون اینکه صبر کند جواب معلوم شود می‌رود خط بعدی!مگر اینکه بخواهید به صورت async برنامه بنویسید. اگر اینطور است هم پیشنهاد می‌کنم اول مطمئن شوید که sync کار می‌کند بعد بروید و asyncش کنید.۲- آدرس‌ها و bytes32ها به صورت مبنای شانزده در یک متغیر رشته‌ای در جاوا اسکریپت ذخیره می‌شوند.۳- مقدار بازگشتی فراخوانی‌های قراردادهای هوشمند یک مقدار ساده (مثلا عدد صحیح یا رشته) نیست. بلکه کلی اطلاعات همراهش هست (جزئیات تراکنش، خطا در صورت وقوع، logهایی که تولید شده، و صد البته مقدار خروجی تابع فراخوانده شده سالیدیتی). اگر چیزهای اضافه را نمی‌خواهید می‌توانید از toString استفاده کنید یا به نوع مورد نظر cast کنید. در این میان، مقدار بازگشتی، دو تا attribute خوب برای مستندسازی آزمایش‌هایی که انجام می‌دهید دارد: receipt.gasUsed و tx که اولی گس مصرف شده و دومی آدرس تراکنشی را می‌دهد که متعاقب فراخوانی صادر شده است. پیشنهاد می‌کنم این اطلاعات را console.log کنید. در خصوص این‌ها به این مستندات Truffle مراجعه کنید.۴- برای فراخوانی‌های توابعی که در سالیدیتی pure یا view نیستند، باید تراکنش صادر شود و گس پرداخته شود. Truffle به صورت پیش فرض برآورد خوبی برای مقدار گس مصرفی ندارد و شما به اشتباه فکر می‌کنید باید کلی پولدار باشید تا بتوانید حتی یک تراکنش ساده را بزنید! برای مشخص کردن سقف گس مصرفی و اینکه از چه حسابی کم شود، این آکولاد را به عنوان آرگومان آخر به انتهای آرگومان‌ها اضافه کنید: {from:THEADDRESS, gas:AMOUNTGAS} و به جای عبارت‌های حروف بزرگ، مقدار مناسب را بگذارید. ۵- اگر می‌خواهید توابع pure یا view را صدا بزنید، نیازی به زدن تراکنش و خرج کردن نیست. این توابع را با استفاده از call باید صدا بزنید. ما تا وقتی به آزمایش روی شبکه Ropsten نرسیدیم متوجه نشدیم که داریم این فراخوانی‌ها را اشتباه می‌زنیم و الکی بابتشان اتر می‌پردازیم. مثلاً به جای اینکه mycontract.balanceOf() را استفاده کنید که سعی می‌کند یک تراکنش صادر کند، mycontract.balanceOf.call() را بزنید. راهنمای تکمیلی این دو نکته اخیر در مستندات ذکر شده در مورد (۳) آمده است.اینجای کار بستگی به خودتان دارد. ممکن است یکی دو روز یا بیشتر طول بکشد!مرحله چهارم: بردن قراردادها روی شبکه آزمایشیآزمایش کردن قراردادها با گره محلی خیلی سریع است و یکسری مشکلات اصلی را برایتان مشخص می‌کند. اما برای ارزیابی مقدار گس مصرفی در واقعیت، چندان مناسب نیست. یک سوتی‌هایی(!) هم که مربوط به کدهای جاوا اسکریپت است خودش را روی گره محلی نشان نمی‌دهد. وقتی دیگر از همه چیز مطمئن شدید، باید قرارداد را ببرید روی شبکه آزمایشی. در این مرحله هم راهنمای OpenZeppelin کارگشا است. باید یک حساب آزمایشی هم روی Infura درست کنید که درگاه اتصال برنامه شما به Ropsten است. در این خصوص چند تا نکته هست که ممکن است به دردتان بخورد:۱- اگر مقدار mnemonic را به کیف پول MetaMask بدهید یا اصلا از mnemonic ساخته شده توسط MetaMask استفاده کنید، می‌توانید راحت‌تر با حساب‌هایتان روی شبکه آزمایشی کار کنید. می‌توانید آدرس قرارداد توکن‌هایی را که ساخته‌اید را هم بهش بدهید تا امکان نمایش موجودی و نقل و انتقال را به شما بدهد.۲- می‌توانید از سایت Etherscan تراکنش‌ها را ببینید و با قراردادها کار کنید. حواستان باشد که روی شبکه آزمایشی مورد نظرتان تنظیمش کنید و گرنه تراکنش‌های یک شبکه دیگر را می‌بینید! این سایت هم توکن‌های ERC-20 و ERC-721 را تشخیص می‌دهد و نحوه نمایش متفاوتی برای آن‌ها دارد.۳. ما هر کاری کردیم نتوانستیم از Faucetهایی که اتر روی شبکه Ropsten می‌دهند چیزی بگیریم! قبلاً اینطوری نبود! مجبور شدیم از اکانت‌هایی که قبلاً برای پروژه‌های درس شارژ کرده بودیم استفاده کنیم. لذا بعد که کارتان تمام شد، اتر مانده ته حساب‌هایتان را برای روز مبادا به یک حساب تجمیعی منتقل کنید.یک لحظه تأمل!چیزی که ما در اینجا فهمیدیم این بود که استقرار یک قرارداد هوشمند کلّی گس مصرف می‌کند (چندین میلیون!) کارهای دیگر هم همینطور. مثلا یک ERC20.approve حدود ۴۷۰۰۰ گس، یک ERC20.transferFrom حدود ۵۹۰۰۰ گس، و کارهای یک کمی پیچیده‌تر دیگر دست کم ۲۰۰۰۰۰ گس را لازم دارند. روی شبکه آزمایشی همه چیز رایگان است اما هدف ما این بود که هزینه‌ها را روی شبکه اصلی برآورد کنیم. برای فهمیدن اینکه این مقدار گس معادل چند دلار می‌شود، کافی است به سایت Ethgasstation مراجعه کنید. قیمت گس را بسته به اینکه بخواهید تراکنش‌تان چقدر سریع تأیید شود به صورت لحظه‌ای (بر حسب giga Wei یا Gwei) نشان می‌دهد. از این اطلاعات می‌توانید استفاده کنید و مقدار اتری که برای کارمزد تراکنش لازم است را برآورد کنید:fee = gasUsed * gasPrice * 10^-9مقدار gasPrice را بر حسب همان Gwei در این فرمول بگذارید. اگر عدد حاصل را ضربدر قیمت اتر بکنید، کارمزد دلاری (یا ریالی) تراکنش معلوم می‌شود. با این اوصاف، این روزها یک انتقال ساده توکن روی شبکه اصلی اتریوم باید حدود ۳۰ دلار آب بخورد! یا قرارداد ما به ۳.۶۴۶ میلیون گس و به عبارت دیگر ۱۸۶۸.۴۰ دلار فقط برای استقرار احتیاج دارد! کارهای دیگر هم از حدود ۸۷ دلار به بالا در می‌آید! اینجا بود که فهمیدیم ما نه تنها جزو میانگینی‌های مورد اشاره در «پیشگفتار» نوشته نیستیم، بلکه از آن‌ها لاکچری‌تر هم هستیم!دستمان را از پوست گردو در بیاوریم!ما اگر از اول می‌دانستیم که خرج زندگی در دنیای اتریوم اینقدر گران است، اصلا به یک جای دیگر مهاجرت می‌کردیم! فرهنگ آن جاهای دیگر مثل Cardano یا Tezos یا EOS با اتریوم فرق می‌کند و قراردادهایشان هم با زبان‌های دیگری هم به غیر سالیدیتی نوشته می‌شوند! الان ما بومی اتریوم شده‌ایم و آنجا برایمان دیار غربت است! شبی که به این نتایج رسیدیم، من به سختی خوابیدم از بس که با موبایل در رختخواب جستجو می‌زدم :-(صبح با ذهن آزاد شروع کردم و اتفاقا به یک شبکه‌ای به نام RSK برخوردم که ظاهرا یک زمانی مخفف Rootstock بوده است. خیلی در جزئیاتش وارد نشدم ولی همین بس که یک بلاکچینی است با پشتیبانی از قراردادهای هوشمند به زبان سالیدیتی و تا حد زیادی هم با اتریوم سازگار است. اما یک جورهایی خودش را به بلاکچین بیتکوین چسبانده و ادعا می‌کند امنیت بیتکوین و قراردادهای هوشمند اتریوم را در کنار هم دارد. یک مزیت مهمش برای ما این است که (فعلاً؟) کارمزد دلاری تراکنش‌ها روی RSK خیلی ارزان‌تر است. ما که می‌خواستیم مقاله‌مان را بنویسیم و دستمان هم در پوست گردو مانده بود. لذا بلافاصله اقدام به مهاجرت به RSK کردیم!مهاجرت به RSKاین کار خیلی ساده است! یک پروژه نمونه در اینجا با توضیحات روی سایت Truffle Suite هست. با تجربه‌ای که تا اینجا داشته‌اید، خیلی سریع می‌توانید پروژه را آزمایش کنید و مطمئن شوید که همه چیز کار می‌کند. بعد با تغییر در truffle-config مهاجرت انجام می‌شود. همین! تجربه ما روی RSK اینطوری بود:۱- گرفتن اتر آزمایشی و اجرا کردن تراکنش‌ها سریع و راحت است و مستقیما با اتصال به آدرسی که RSK مشخص کرده است انجام می‌شود. ۲- یک کیف پول به نام Nifty دارند که برای کار با شبکه ‌RSK تنظیم شده است. ۳- نحوه ساختن آدرس‌ها در RSK با اتریوم متفاوت است. همچنین ظاهراً اینکه آدرس مربوط به چه شبکه‌ای هست هم درش ذکر می‌شود. لذا شما نمی‌توانید با Nifty لزوماً به آدرس‌هایی که طبق استاندارد اتریوم ساخته شده‌اند اتر RSK منتقل کنید (جلوی یکسری اشتباه‌ها گرفته می‌شود.)دستاورد مهاجرت!ما دقیقاً همان قراردادها را روی RSK بردیم و چیزی که فهمیدیم این بود که در این شبکه گس لازم برای استقرار قراردادمان حدود ۲۲ درصد بیشتر از Ropsten بود. اما همه تراکنش‌ها گس کمتر یا مساوی مصرف می‌کردند. خبر خوش اینکه قیمت گس در این شبکه خیلی ارزان‌تر از اتریوم بود. به طور دقیق، این روزها قیمت گس RSK حدوداً ۰.۰۰۶۳ برابر یا ۰.۶۳ درصد گس اتریوم است. لذا علی رغم بیشتر بودن گس لازم برای استقرار، قرارداد ما روی RSK با کمی بیش از ۱۴ دلار مستقر می‌شد؛ انتقال توکن فقط ۱۷ سنت هزینه داشت؛ و کارهای دیگر هم زیر یک دلار ترتیب داده می‌شد. البته اشکال این شبکه این است که طبق آمار لحظه‌ای رسمی RSK، فاصله زمانی تأیید بلوک‌ها ۳۱.۵ ثانیه است و تعداد گره‌های شبکه‌شان هم خیلی کم، یعنی ۲۶ عدد است. این را با ۱۳.۲ ثانیه اتریوم و ۳,۶۸۵ گره عضو آن مقایسه کنید.اینجا یک نفس راحت کشیدیم. نتایج را بردیم در مقاله، و ارسالش کردیم! هورا!جمع‌بندیما دیگر از اینجا جلوتر نرفتیم که خدمتتان عرض کنم. کلی کارهای دیگر از جمله آزمایش‌های خودکار، آزمون امنیتی و غیره هست که در مورد یک پروژه واقعی روی بلاکچین باید انجام شود که به آن‌ها نپرداختم. Truffle و OpenZeppelin هم کلی مطلب برای خودشان دارند که ما به آن‌ها وارد نشدیم. اما تجربه این بود که در فقط چند روز می‌شود از ایده به عمل رسید! اگر قصد مهاجرت به جاهای خیلی دور مثل Cardano یا امثالهم را هم ندارید، همین همسایگی هم جاهای خوش آب و هوا و ارزان هست! خوش بگذرد! خوشحال می‌شوم نظراتتان را در مورد این نوشته با من هم در میان بگذارید!</description>
                <category>صادق دُرّی نوگورانی</category>
                <author>صادق دُرّی نوگورانی</author>
                <pubDate>Mon, 06 Sep 2021 20:40:06 +0430</pubDate>
            </item>
                    <item>
                <title>چگونه یک وبینار علمی خوب برگزار کنیم؟</title>
                <link>https://virgool.io/@sdorri/%DA%86%DB%8C%D8%B2%D9%87%D8%A7%DB%8C%DB%8C-%DA%A9%D9%87-%D8%A8%D8%B9%D8%AF-%D8%A7%D8%B2-%D8%AA%D8%AF%D8%A7%D8%B1%DA%A9-%DA%86%D9%86%D8%AF-%D9%88%D8%A8%DB%8C%D9%86%D8%A7%D8%B1-%DB%8C%D8%A7%D8%AF%DA%AF%D8%B1%D9%81%D8%AA%D9%85-cqwb93iw0gwt</link>
                <description>سلام. دوست دارم در این نوشته تجربه‌ای که بعد از تدارک چند وبینار علمی با سخنرانان مختلف داشتم را خدمتتان انتقال دهم که اگر یک وقت خواستید شما هم از این جور کارها بکنید، لازم نباشد از صفر شروع کنید!Image source: https://blog.contentools.com/خوان اول: انتخاب سخنرانانمهم‌ترین مسأله طبیعتاً انتخاب موضوع وبینار است. هدف من و دوستان دیگری که در این مسیر کمکم می‌کردند، و البته سخنرانان گرامی، همگی ترویج یک موضوع علمی (به طور خاص، رمزنگاری پساکوانتومی) در کشورمان بود. اولش هم عرض کنم که ما انگیزه مالی نداشتیم و بیشتر امور به صورت داوطلبانه انجام می‌شد. کلیت موضوع که مشخص بود، اما انتخاب سخنرانان و تعیین موضوع سخنرانی هر کدام طی یک فرایند نسبتاً طولانی و تا حد زیادی متکی به نظر جمع صورت گرفت. متخصصین داخل کشور خیلی زیاد نبودند و ما هم دوست داشتیم حتما به قوّه داخلی اتکا کنیم که یک جمع از فعالین حوزه مورد نظر ما شکل بگیرد و این حرکت ادامه پیدا کند.این قسمت را خلاصه می‌کنم در اینکه اول از جمع خودمان مشخصات افرادی که با تخصص و تحصیلات در این حوزه می‌شناختیم گرفتیم، رزومه‌های علمیشان را از Google Scholar و سایر مراجع علمی بررسی کردیم و به منتخبی از ایشان ایمیل زدیم. عزیزانی که از حرکت مورد نظر ما استقبال کردند هر کدام در یکی از موضوعات مرتبط تخصص و آشنایی داشتند و قرار شد وبینارها مکمل هم باشند. قبلا هم با یکی از متخصصین خارج از کشور هماهنگ شده بود که ما هم با خوشحالی، وبینارهایمان را به وبینار ایشان ملحق کردیم! تا اینجای مسیر تا حد زیادی اکتشافی جلو رفت؛ خیلی وقت‌گیر بود؛ تأمین نظر جمع سخت بود؛ تخصص هم می‌طلبید (که من نداشتم! قرار بود چیزهایی یاد بگیریم و یک حرکت را شروع کنیم :-))همینجا بگویم که از هریک از سخنرانان عزیز، عنوان وابستگی مورد نظر خودشان (affiliation) را پرسیدیم که در تهیه پوستر اولیه استفاده کنیم و اطلاعات تماس کامل گرفتیم و اطلاعات تماس خودمان را هم دادیم که بتوانیم راحت با ایشان تماس برقرار کنیم.خوان دوم: تعیین زمان وبینارهاوبینار یک چیز خاصی است. با سخنرانی عادی فرق می‌کند و چون مجازی برگزار می‌شود، باید دقت کنیم خسته کننده نباشد چون در این صورت، مخاطب خیلی راحت و بدون رودربایستی جلسه را ترک خواهد کرد! ما هم چهار وبینار پیش رو داشتیم که دوست داشتیم مخاطبان با ما همراه بمانند. (البته ناگفته نماند که ما یکسری مخاطبان پای کار عضو انجمن علمی خودمان داشتیم که تا حدی خیالمان را از حداقل مخاطب راحت می‌کردند!) وبینار با یک رویداد فشرده مثل کارگاهِ یک روزه یا مدرسه فصلیِ چند روزه فرق می‌کند. مخاطب می‌خواهد بیاید که هم تنوعی باشد و هم یک چیزی یاد بگیرد. بنابراین یک فرصت تنفس باید در نظر گرفت که با ما همراه بماند. ما دو هفته یکبار روزهای چهارشنبه را که قبلا تجربه موفقی بود انتخاب کردیم.ساعت برگزاری از یک طرف باید مطابق پسند سخنران باشد؛ ثانیا باید یک وحدت رویّه‌ای داشته باشد که مخاطبین یادشان بماند؛ ثالثا باید وقتی باشد که بتوانند شرکت کنند. افراد شاغل غیر دانشگاهی شاید ترجیح بدهند بعد ساعت اداری و از منزل در وبینار شرکت کنند؛ در حالی که کشش ذهنی برای مطالب علمی در اول روز بیشتر است. ما هم که خودمان و مخاطبینمان دانشگاهی بودند، ترجیح دادیم ساعت ۱۰ جلسه را شروع کنیم. البته بماند که ما هم به خاطر شرایط کرونایی اغلب در منزل بودیم! ؛-) از طراح طرف قرارداد با انجمن خواستیم که یک پوستر درست کنند که سلسله وبینارها را در کنار هم داشته باشیم. از هر فرصتی استفاده کردیم که اطلاع رسانی کنیم و روی سایت انجمن هم گذاشتیم:پوستر سلسله وبینارهای مابعد از سخنرانی اول، یک وقفه‌ای به خاطر امتحانات و رویدادهای پایان ترم بین سخنرانی‌ها انداختیم. همچنین یکی از سخنرانان ترجیح می‌دادند جلسه بعد ساعت ۱۷ باشد که ما هم همینطور برنامه ریختیم. مدت زمان جلسه را یک ساعت و نیم گذاشتیم. آخر کار به نتیجه رسیدیم که بهتر است مدت جلسه دو ساعت باشد. نه اینکه همه دو ساعت را سخنران صحبت کند! بلکه سخنران باید برای یک ساعت و ربع برنامه‌ریزی کند و بقیه را برای پرسش و پاسخ بگذاریم (دقیقاً مثل کلاس‌های درس! البته با فرض اینکه یک کلاس تعاملی باشد!)خوان سوم: تشکیل گروهطبق نظرخواهی‌های رسمی و غیررسمی، پست الکترونیکی یا ایمیل همچنان یک وسیله ارتباطی مؤثر و مورد پسند در جامعه دانشگاهی است. (من خودم بعضی روزها بیش از ۲۰ ایمیل می‌زنم!) اما پیام‌رسان‌ها هم جذابیت و مخاطبین خاص خود را دارند. سایت‌های اجتماعی تخصصی (مثل لینکدین) و پرمخاطب (مثل اینستاگرام) را هم نباید فراموش کرد. ما در دو پیام‌رسان کانال/گروه ساختیم و مخاطبینمان را دعوت کردیم که عضو شوند تا آن جمع تخصصی مد نظرمان به مرور شکل بگیرد و مخاطبان را بتوانیم با خودمان همراه کنیم. بحث تعاملی بودن و امکان ارسال پیام از سمت مخاطبین موضوع مهمی است. ما فعلا فقط برای اطلاع رسانی یک طرفه از این بستر استفاده می‌کنیم. برای جبران این موضوع، اطلاعات تماس با مدیر کانال/گروه را به صورت شفاف در توضیح کانال/گروه اعلام کردیم که در صورت نیاز استفاده شود.خوان چهارم: تدارکات قبل از هر وبیناربه نظرم حدود دو هفته قبل از هر وبینار باید کارهای مقدماتی آن را انجام داد و همه کارها نهایتا هفته قبل از سخنرانی هماهنگ، و محتوای لازم آماده شده باشد. از طراح انجمن خواستیم که برای هر سخنرانی یک پوستر مستقل درست کنند. محیطی که وبینار در آن ارائه می‌شود هم از قبل هماهنگ و تدارک دیده شده بود. فرم آنلاین نظرسنجی هم با همکاری یکی از دانشجویان دکتری آماده شد. تقدیرنامه هم باید آماده می‌بود ولی حواسمان نبود! شما حواستان باشد!اگر محیط مورد استفاده امکان ضبط دارد که فبها! اما ما باید خودمان ضبط می‌کردیم. به این منظور با دو نفر از دوستان هماهنگ کردیم که به طور همزمان ضبط را انجام دهند که اگر احیانا مشکلی برای یکی پیش آمد، دستمان در پوست گردو نماند! بهتر است فرمت، کیفیت، و حتی ابزار ضبط هم با ایشان هماهنگ شود که نتیجه با حداکثر کیفیت ممکن باشد. دقت فرمایید که سخنران، مسؤول نشست، یا حتی مسؤول فنی جلسه نباید همزمان مسؤول ضبط هم باشند! ضبط جلسه باید از دید یک شرکت کننده که هیچ کاری انجام نمی‌دهد باشد! از هر سخنران خواستیم که بیوگرافی، عکس با کیفیت، و خلاصه سخنرانی را برایمان بفرستند. در این درخواست باید حدود تعداد کلمه مورد نظرمان را برای بیوگرافی و خلاصه سخنرانی تعیین می‌کردیم ولی من حواسم نبود و مجبور شدم در مواردی خودم مطالب را خلاصه کنم :-( به نظرم حدود ۱۰۰ کلمه برای بیوگرافی و ۲۰۰ کلمه برای چکیده مناسب باشد. پوستر یکی از وبینارها را اینجا به عنوان مثال می‌آورم:پوستر یکی از وبینارها به عنوان نمونهپوستر وبینارهای انجمن حداقل اطلاعات لازم را در خود دارد. مثلا بیوگرافی و خلاصه سخنرانی درش نیست. ما یک صفحه اختصاصی هم در سایت انجمن برای هر وبینار داریم که باید اطلاعات تکمیلی را در آن گذاشت و لینک را در پوستر قرار داد.یک موضوعی مهم دیگر، مدیریت نشست است. مدیر نشست مثل مجری-کارشناس می‌ماند. سخنران را معرفی می‌کند؛ با ایشان خوش و بش می‌کند؛ حواسش به زمان جلسه هست؛ حواسش به پرسش‌هایی که مطرح می‌شود هست و آن‌ها را به ترتیب از سخنران می‌پرسد و یا به مخاطبین اجازه میکروفن/وبکم می‌دهد. لذا بهتر است فردی باشد که آشنا با مطلب وبینار است. باید هماهنگی با فرد مناسب هم نزدیک زمان وبینار انجام شود. به نظرم شایسته است که عکس و مشخصات مدیر نشست هم در پوستر ذکر شود چون به غنای جلسه کمک می‌کند.ما ابتدای هفته‌ای که چهارشنبه‌اش وبینار بود، اطلاع‌رسانی را در همه کانال‌های در اختیار انجام می‌دادیم. بعضی شبکه‌های اجتماعی تخصصی (مثل لینکدین) امکان ایجاد یک رویداد را دارند که به بهتر دیده شدن کمک می‌کند و با اعلام آمادگی افراد به شرکت در رویداد، مخاطبینِ بیشتری علاقمند به شرکت می‌شوند.خوان پنجم: هماهنگی‌های نهایی با سخنران و مسؤول نشستباید قبل جلسه با سخنران و مسؤول نشست یک هماهنگی نهایی انجام شود. ما یکی دو روز مانده به وبینار یک ایمیل به سخنران و مسؤول نشست می‌زدیم و یکسری مطالب مهم را در آن مطرح می‌کردیم:یادآوری ساعت و زمان جلسهیادآوری زمان‌بندی جلسه (مدت ارائه، زمان مناسب جهت پرسش و پاسخ، ...)لینک شرکت در جلسه و نحوه وروددرخواست جهت استفاده از وبکم هنگام سخنرانیدرخواست اسلایدها و کسب اجازه جهت ضبط و انتشار عمومی ویدیوی وبینارحتما باید در یک زمان مناسب برای سخنران/مسؤول نشست، یک جلسه خصوصی در محیط برگزاری تشکیل شود تا وبکم، صدا، امکان اشتراک‌گذاری اسلاید و سایر امکانات محیط آزمایش شود و مشکلی نباشد. همچنین از سخنران و مسؤول نشست خواسته شود که ده دقیقه تا یک ربع قبل از ساعت رسمی شروع، در جلسه حاضر شوند.خوان ششم: برگزاری وبیناردر روز برگزاری بد نیست به مخاطبین در این خصوص یادآوری شود. نهایتاً قبل از همه باید فردی که مسؤول فنی نشست است وارد جلسه شود و محیط را آماده‌سازی کند. مسؤول فنی نقش سخنران، مسؤول نشست، و هر کس دیگر را به تناسب تنظیم می‌کند. همچنین حواسش به حضور همه مسؤولین دیگر هست. اگر هم لازم بود با ایشان تماس می‌گیرد و مشکلاتشان را حل می‌کند. با توجه به اینکه جلسه ضبط می‌شود، شایسته است که ابتدای جلسه تذکر داده شود که ضبط می‌شود و بعداً به صورت عمومی منتشر می‌شود.ما یکسری اسلاید شامل مطالب اطلاع رسانی، پوستر نشست، لینک شرکت در نظرسنجی و... از قبل آماده کرده بودیم که در زمان مناسب نمایش می‌دادیم. یک کلیپ کوتاه تلاوت قرآن آماده داشتیم که سر ساعت مقررِ شروع جلسه پخش می‌کردیم و پس از آن با یک معرفی کوتاه، جلسه به مسؤول نشست سپرده می‌شد. ایشان هم سخنران را معرفی می‌کردند و از ایشان می‌خواستند که ارائه‌شان را شروع کنند. ما دو مدل پرسش و پاسخ داشتیم. بعضی سخنران‌ها در مقاطعی صحبتشان را قطع می‌کردند و به پرسش‌ها پاسخ می‌دادند. بعضی‌ها هم ترجیح می‌دادند کل سخنرانی را انجام دهند و بعد به پرسش‌ها پاسخ دهند. مشکل روش اول طولانی شدن بیش از حد سخنرانی، و روش دوم خسته کننده شدن بحث‌ها بود. به نظرم حالتی که در وسط‌های سخنرانی یک فرصتی برای پرسش و پاسخ باشد بهتر است. البته باید مدت آن به پنج تا ده دقیقه محدود شود وگرنه احتمالا سخنرانی سر وقت تمام نخواهد شد!پس از پایان سخنرانی بهتر است لینک شرکت در نظرسنجی به شرکت کنندگان داده شود تا اگر نمی‌خواهند تا پایان پرسش و پاسخ‌ها بمانند، حداقل نظرشان را داده باشند. حتما دقت کنید که جلسه بیش از زمانی که وعده داده شده است به درازا نکشد! درست است که مجازی است ولی ملّت کار و زندگی دارند! :-)در آخر جلسه هم  شایسته است که تقدیرنامه را به حضّار نشان دهید و از سخنران تشکر کنید که تا اصطلاحاً «عرق سخنران خشک نشده»، تقدیر انجام شده باشد!خوان آخر: اقدامات پس از برگزاری وبیناردیگر اصل ماجرا تمام شده است! اما به قول معروف «کار آن کرد که تمام کرد!» بهتر است با فاصله کمی از وبینار به دست‌اندرکاران پیام بدهید و از زحماتشان به خاطر برگزاری خوب وبینار تشکر کنید. اگر سخنران اسلایدهایش را نداده بود یا قرار شده بود مطالب تکمیلی (مثل مراجع)  بدهد هم یادآوری کنید. نسخه الکترونیکی تقدیرنامه را هم برای سخنران پیوست کنید. ممکن است ایشان مایل باشند که نسخه فیزیکی را هم برایشان پست کنید که در این مورد از ایشان بپرسید.نتایج نظرسنجی و نسخه‌های ضبط شده را از مسؤولین مربوط دریافت کنید و به مسؤولِ تدوین ویدیو بدهید. نهایتاً هم ویدیوی تدوین شده و نتایج نظرسنجی (در صورت لزوم) را منتشر کنید. اگر مثل ما هر دو هفته یکبار وبینار دارید، کارهای وبینار بعدی از همین الان شروع می‌شود! :-)جمع‌بندیبرگزاری یک وبینار در نگاه اول ساده به نظر می‌آید. اما مقدمات زیادی دارد و چندین نفر باید برای برگزاری یک وبینار خوب همکاری کنند. فکر نمی‌کردم اما وقتی نوشته واقعاً به خوان آخر رسید، هفت خوان شد! از لحاظ زمانی، حداقل دو هفته قبل باید تدارکات وبینار را شروع کنید و یک هفته قبل از وبینار، همه چیز هماهنگ شده و اغلب محتواها آماده باشند. همچنین به غیر از مسؤول نشست و سخنران، دست کم یک نفر مسؤول فنی و دو نفر مسؤول ضبط در پشت صحنه لازمند. امیدوارم تجربه من برایتان مفید باشد. خوشحال می‌شوم نظراتتان را داشته باشم.پی‌نوشت: کاری که ما انجام دادیم، یک فعالیت گروهی بوده است. در اینجا لازم می‌دانم از همکاران گرامیم در کمیته علمی انجمن رمز (خصوصا جناب آقایان دکتر محمدحسن مجیدی و دکتر سید امیر مرتضوی)، جناب آقای مهندس سید حسام الدین هاشمی (دانشجوی دکتری دانشگاه بیرجند)، جناب آقای مهندس حبیب رستمی (دبیر محترم انجمن رمز)، جناب آقای مهندس علیرضا کریمی (دبیر کمیته ارتباطات انجمن)، جناب آقای مهندس احسان طهرانچی (پژوهشکده فضای مجازی دانشگاه شهید بهشتی)، و سرکار خانم زواریان در دفتر انجمن نهایت تشکر را داشته باشم. امیدوارم کسی از قلم نیافتاده باشد!</description>
                <category>صادق دُرّی نوگورانی</category>
                <author>صادق دُرّی نوگورانی</author>
                <pubDate>Sun, 05 Sep 2021 14:41:05 +0430</pubDate>
            </item>
                    <item>
                <title>«حد متعارف» برای درس خواندن</title>
                <link>https://virgool.io/@sdorri/%D8%AD%D8%AF-%D9%85%D8%AA%D8%B9%D8%A7%D8%B1%D9%81-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D8%AD%D8%B5%DB%8C%D9%84-uycmq3hhyhka</link>
                <description>آیا تعریف یک حد متعارف یا نرمال برای تحصیل و پرداختن به فعالیت‌های درسی، ممکن است؟ آیا این امر، یک واجب است یا مستحب یا حتی مکروه؟Image courtesy: www.medcarespain.comهمیشه با نزدیک شدن به فصل تابستان، بحث‌ها پیرامون اوقات فراغت در رسانه‌ها رونق می‌گیرد. همه از این صحبت می‌کنند که والدین چگونه برای اوقات فراغت فرزندانشان برنامه‌ریزی کنند و به بهترین وجه از این فرصت‌ها استفاده شود. اما خیلی از ما هستیم که سال‌هاست نه تنها در تابستان فراغتی نداریم بلکه تعطیلی نوروز، فاصلهٔ بین دو ترم، اعیاد و تعطیلات رسمی، و حتی روزهای پایان هفته نیز از یادمان رفته است. البته به نظر می‌رسد گذشتن از سد کنکور و ورود به یک دانشگاه خوب و کسب یک جایگاه ممتاز دانشجویی چیزی جز این تلاش مداوم را نمی‌طلبد.یادتان می‌آید وقتی خیالمان از دادن کنکور راحت شد و منتظر اعلام نتایج بودیم، احساس خلأ شدیدی می‌کردیم و به فکر چاره‌ای بودیم برای پرکردن اوقات فراغت «فراخی» که پس از عبور از این به اصطلاح «قیف بر عکس» برایمان فراهم می‌شود. با شروع ترم نخست و مشاهدهٔ ساعات خالی بین کلاس‌ها، روزهایی که فقط نصفشان پر شده و پنج‌شنبه‌های خالی نیز این حس در ما تقویت شد. شاید هم برای بعضی‌ها تا دیدن نمرات ترم اول ادامه داشت.برای بعضی‌ها این حس هیچ وقت از بین نرفت و آن را در بوفه یا فضای سبز دانشگاه یا بیرون دانشگاه یا بیرون‌تر از دانشگاه و جاهای دیگری که خودشان می‌دانند پر کردند و می‌کنند. اما صحبت ما در مورد کسانی است که آن روحیه سخت‌کوشی، ایده‌آل طلبی، تلاش برای انجام دادن هر کاری به بهترین وجه، رعایت مو به موی مقررات، و راضی نگه‌داشتن همه کس یا در یک کلام «بچه مثبتی» را که تا پیش از دانشگاه درشان پرورش داده شده بود حفظ می‌کنند. چنین روحیاتی به طور مطلق ستودنی هستند و حتی یک فرد مقید و دین‌دار نیز معمولاً چنین است.اینجاست که می‌رسیم به جان کلام، و اینکه در شرایط کنونی درس و دانشگاه، جای شگفتی ندارد که یک دانشجوی مثبت تمام زندگی خود را به ادای وظایف درسی خود بگذراند و حرف زدن از اوقات فراغت و تعطیلی برای وی عجیب و غریب باشد. اما آیا تعریف یک حد «متعارف» برای تحصیل و پرداختن به فعالیت‌های درسی، نابخردانه و منجر به، یا ناشی از بی‌تعهدی است؟ از یک طرف باید دید که آیا واقعاً دست اندرکاران، فعالیت‌های تحصیلی را به تمام اوقات یک دانشجو گسترده‌اند یا خیر. اگر چنین است، انگیزه آنان چیست؛ و آیا این انگیزه درست است؟ و از طرف دیگر آیا یک دانشجو نمی‌تواند و نباید سعی کند بخش‌های دیگری از «زندگی» خود را در کنار این فعالیت‌ها بگنجاند؟پدیده‌ای به نام «درس‌زَدگی»!پژوهش‌ها نشان می‌دهد استراحت، تفریح، و فعالیت‌های غیر کاری برای بهره‌وری و خلاقیت ضروری هستند [۱]. این پژوهش‌ها بیشتر به رابطهٔ کار و زندگی می‌پردازند ولی قابل تعمیم به رابطهٔ درس و زندگی هم هستند. در خصوص کار همانند درس، ساعات زیاد کاری تقدیس می‌شود و فناوری‌های نوین تماس دائمی را با محل کار فراهم کرده‌اند. چنین فضایی منجر به فجایعی نیز شده است. تابستان چند سال پیش در لندن، یک دانشجوی ۲۱ ساله کارآموز بانکداری پس از آنکه گفته می‌شود ۷۲ ساعت بدون خوابیدن کار کرده بود، جان خود را از دست داد [۲]. پس از مرگ وی، کارآموزان دیگری درباره تجربیات خود سخن گفتند، از جمله ۲۰ ساعت کارکردن در روز و بازگشت به منزل فقط برای دوش گرفتن در حالی که تاکسی بیرون در منتظر است. چنین وضعیتی برای بعضی دانشجویان رشته کامپیوتر هم چندان ناآشنا نیست. «درس خواندن» شبانه روزی برای امتحان، ماندن در دانشگاه تا پاسی از (نیمه) شب برای «رساندن پروژه» در مهلت مقرر یا «فرستادن مقاله» به کنفرانس، نمونه‌هایی از چنین سبکی در تحصیل است. حتی فجایع مشابهی نیز از قبیل خودکشی در دانشگاه‌های طراز اول رخ داده است. نمی‌توان گفت که اصولاً این فعالیت‌ها طوری برنامه‌ریزی شده‌اند که به سبکی جز این قابل انجام دادن نیستند؛ اما تا وقتی حد «متعارفی» برای تحصیل تعریف نشود، نمی‌توان متناسب با آن حد برنامه‌ریزی کرد.استادان نیز از تعریف نشدن این حد متعارف رنج می‌برند. نتایج بررسی‌ها در یکی از کشورهای اروپایی نشان می‌دهد که استادان و معلمان ساعات فوق العاده بدون دستمزد بیشتری نسبت به سایر مشاغل حتی مدیران در حوزه‌های مالی، داشته‌اند. جریان غالب در ۴۰ سال گذشته نیز چنین بوده است و فعالان در حوزه‌های آکادمیک به طور معمول ۵۰ ساعت در هفته یا بیشتر کار می‌کنند [۱]. یکی از مخاطرات فرهنگ ساعات زیاد کار، فرسودگی شغلی یا کارزَدگی است که در زبان انگلیسی واژه جالبی را برای آن استفاده می‌کنند: «burn out». بنگاه‌ها و دولت‌ها نیز شروع به اقداماتی در خصوص این مسئله کرده‌اند. مثلاً برخی شرکت‌های آلمانی از جمله فولکس واگن، پوما، و بی‌ام‌و همگام با وزارت کار و امور اجتماعی این کشور استفاده از پست الکترونیکی را در خارج از ساعات کاری محدود کرده‌اند. طرفداران این طرح‌ها معتقدند که به نفع کارفرمایان است که کارمندانشان بتوانند با اطمینان خود را از کارشان منفصل کنند، و آنان در غیر این صورت در طولانی مدت کارزده می‌شوند.خُب، راه گریز چیست؟ برای دانشجویان باید این روحیه اصلاح شود که: یک کار به بهترین نحو انجام نمی‌شود مگر اینکه تمام وقت خود را روی آن بگذاریم. به عبارت دیگر باید دید چه چیزی باعث افزایش بهره‌وری می‌شود. همچنین نباید فراموش کرد که زندگی فقط تحصیل نیست! درست است که بیشتر زندگی یک دانش‌آموزِ مدرسه‌برو را درس خواندن تشکیل می‌دهد اما این امر با ورود به تحصیلات دانشگاهی و تحصیلات تکمیلی (و پس از آن با ورود به یک شغل آکادمیک برای استادان) دیگر درست نیست.آمادگی جسمانیپژوهش‌ها نشان می‌دهند تفاوت آمادگی جسمانی کسانی که ورزش می‌کنند با دیگران ابتدا چندان مشهود نیست اما از سن چهل و پنج سالگی افت آمادگی جسمانی در کسانی که سبک زندگی مناسب و فعالیت جسمانی کافی ندارند، شتاب می‌گیرد [۳]. همچنین یک سبک زندگی فعال خطر ابتلا به افسردگی را کاهش می‌دهد. فعالیت بدنی خواب را بهبود می‌دهد و از اضطراب و تنش می‌کاهد [۱]. حتی ‍۱۰ تا ۱۵ دقیقه قدم زدن می‌تواند بهبود قابل توجهی در روحیه ایجاد کند. دوچرخه سواری، آهسته دویدن، شنا کردن، و... اثر شگرفی در بهبود روحیه دارند. حتی ورزش کردن در دفتر کار یا آزمایشگاه پژوهشی نیز می‌تواند به بهره‌وری ذهنی کمک کند. بنابراین فعالیت جسمی نه تنها نافی کار یا تحصیل نیست بلکه بهره‌وری ما را افزایش می‌دهد و ما را سرزنده‌تر و شادتر می‌کند. از همه مهم‌تر اینکه که فدا کردن سلامتی به بهانه تحصیل نوعی خرج کردن از سرمایه است و نه سرمایه اندوزی!خواب کافینباید عنصر ضروری دیگری از بهره‌وری (و البته طول عمر و سلامتی) را از یاد ببریم: خواب کافی. مرگ و میر در کسانی که پنج ساعت یا کمتر در شب می‌خوابند، تقریباً ۱۵ درصد افزایش می‌یابد [۴]. همچنین خطر ابتلا به دیابت و بیماری‌های قلبی در آنان بسیار بیشتر است. بنیاد ملی خواب در آمریکا برآورد کرده است که خستگی هزینه‌ای بالغ بر۱۰۰ میلیارد دلار به خاطر کاهش بهره‌وری، غیبت‌ها، و سلامت پایین بر اقتصاد این کشور تحمیل می‌کند. یکی از راه‌های مقابله با این مشکل چرت زدن است. برخی شرکت‌ها به طور فعال کارمندانشان را به چرت زدن تشویق می‌کنند: نایک جایی را برای چرت زدن یا تمدد اعصاب در اختیار کارمندانش می‌گذارد؛ در حالی که گوگل تخت‌های ویژه‌ای را برای چرت زدن فراهم کرده است که آن‌ها را Pod می‌نامند. البته پژوهش‌ها نشان می‌دهند که حالت بهینه آن است که چرت زدن در اوایل بعد از ظهر باشد و بیشتر از ۳۰ دقیقه طول نکشد [۱].A Nap Pod at Google. Image courtesy: www.geek.comزمان‌بندیممکن است به نظر برسد که با محدود کردن ساعاتی که بر روی مسائل درسی می‌گذاریم هیچ‌گاه نخواهیم توانست از پس همه کارها برآییم. یکی از راهکارها برای افزایش بهره‌وری در امر پژوهش آن است که کارهایمان را در بلوک‌های زمانی کوتاه (البته طبق زمان‌بندی) انجام دهیم [۱]. این روش یکی از مصداق‌های «آهسته و پیوسته رفتن» است که نهایتاً منجر به نتایج بزرگ می‌شود. در دوران کنکور به ما توصیه می‌شد که به جای تمرکز طولانی روی یک درس، برنامه متنوعی از دروس مختلف را با چیدمان مناسب از دروس حفظی و فکری تدارک ببینیم؛ مگر حالا چه فرقی کرده است؟نشان داده شده است که افرادی که به طور مزمن پرمشغله هستند به خاطر کاهش زیاد قوه شناختی، بازدهی کمتری دارند و نمی‌توانند خوب تصمیم بگیرند [۱]. به بیان خودمانی، اگر وقفه‌ای به ذهنمان داده نشود و نتوانیم آن را آزاد کنیم، مثل خنگ‌ها رفتار خواهیم کرد! حتی در خطوط تولید کارخانه‌ها نیز مدت‌هاست ثابت شده کاهش زمان کار منجر به بهره‌وری بیشتر می‌شود و رابطهٔ این دو، نقطهٔ بهینه‌ای دارد که عدول از آن منجر به افت بهره‌وری می‌شود. حتی در رویکردهای مدیریتی جدید، به امدادگران در حالات بحرانی نیز «زنگ تفریح» و استراحت داده می‌شود تا بتوانند از نهایت توانایی، ذکاوت، و قدرت تصمیم‌گیری خود استفاده کنند و به خود آسیب نزنند.کلام آخرو در آخر اینکه تعیین یک «حد متعارف» برای تحصیل و درس خواندن کار آسانی نیست و باید همه دست به دست هم دهیم تا بتوانیم به آن برسیم. اما بدون شک، زندگی فقط درس خواندن نیست. اگر درس خواندن برای زندگی بهتر است، کار، تفریح، ورزش، ازدواج، بزرگ کردن فرزندان، تقرب به خدا، رشد اخلاقی، خدمت به خلق و خصوصاً والدین، صله ارحام، ساختن جامعه، و خیلی چیزهای دیگر نیز برای زندگی بهتر و جزئی از یک زندگی پربار هستند که باید به آن‌ها هم فکر کنیم...پی‌نوشت: این نوشتار را حدود ۵ سال پیش که هنوز دانشجوی دکتری بودم برای نشریه دانشجویی شریفتروم نوشتم. اصل مطلب الهام گرفته از مقاله [۱] است. گزاره‌های علمی و برخی توصیه‌ها نیز برگرفته از مقاله مذکور است. با کمی اصلاحات مجدداً با توجه به شرایط کرونا و اینکه همه در خانه داریم به کارهایمان می‌رسیم در ویرگول منتشرش می‌کنم.مراجعP. Schell, &quot;Work less, do more, live better,&quot; Times Higher Education, Aug. 2014, URL: 	http://www.timeshighereducation.co.uk/features/work-less-do-more-live-better/2014929.fullarticleM. Kennedy and agencies, &quot;Bank intern Moritz Erhardt died from epileptic seizure, inquest told,&quot; theguardian.com, Nov. 2013, URL: http://www.theguardian.com/business/2013/nov/22/moritz-erhardt-merrill-lynch-intern-dead-inquest&quot;Fitness Levels Decline With Age, Especially After 45,&quot; Science Daily, Oct. 2009, URL: 	http://www.sciencedaily.com/releases/2009/10/091026161846.htm&quot;Sleep and Disease Risk,&quot; Division of Sleep Medicine, Harvard Medical School, URL: 	http://healthysleep.med.harvard.edu/healthy/matters/consequences/sleep-and-disease-risk</description>
                <category>صادق دُرّی نوگورانی</category>
                <author>صادق دُرّی نوگورانی</author>
                <pubDate>Sat, 18 Jul 2020 13:25:28 +0430</pubDate>
            </item>
                    <item>
                <title>چطور ویدیوی خوبی از سمینارمان بسازیم؟ بخش دوم: ساخت ویدیو</title>
                <link>https://virgool.io/@sdorri/%DA%86%D8%B7%D9%88%D8%B1-%D9%88%DB%8C%D8%AF%DB%8C%D9%88%DB%8C-%D8%AE%D9%88%D8%A8%DB%8C-%D8%A7%D8%B2-%D8%B3%D9%85%DB%8C%D9%86%D8%A7%D8%B1%D9%85%D8%A7%D9%86-%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D9%85-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%88%DB%8C%D8%AF%DB%8C%D9%88-eiuvezwa8shq</link>
                <description>در قسمت قبلی این نوشته‌ی دو قسمتی یکسری تجربیات در مورد تهیه محتوای خوب برای ارائه و سمینار را با شما در میان گذاشتم. در این قسمت می‌خواهم بگویم مواد اولیه‌ای را که آماده کرده‌ایم چطور به یک ویدیوی آموزشی خوب تبدیل کنیم! بسته به اینکه در چه شرایطی ارائه می‌کنید باید مقدمات لازم برای ضبط را فراهم کنید. ویدیو از دو چیز مهم تشکیل شده است: صدا و تصویر. برای هر دو باید فکری بکنید. بهترین کار این است که هردو را به صورت همزمان انجام دهید تا برای ترکیبشان دردسر کمتری داشته باشید.Image Courtesy: Nicepng.com۱. ضبط صدا با میکروفناگر می‌خواهید فقط صدا را ضبط کنید طبیعتاً دستگاه ضبط صدای خبرنگاری و حرفه‌ای در بازار موجود هست ولی اغلبمان یک گوشی هوشمند یا لپ‌تاپ داریم که نرم‌افزارهای خوبی برای ضبط صدا با کیفیت خوب دارند. حتی نرم‌افزار پیش‌فرض هم ممکن است با رعایت یکسری نکات بتواند این کار را به خوبی انجام دهد.اگر از میکروفن استفاده نکنید احتمال دارد صدای محیط دردسرساز شود. مثلاً اگر دستگاه ضبط صدا را در جیب بغلتان بگذارید صدای خش‌خش ناشی از تکان خوردن دستگاه هنگام جابجا شدن خیلی آزار دهنده خواهد بود. اگر دستگاه را روی میز یا صندلی بگذارید، غیر از اینکه با دور شدن از آنجا صدایتان ضعیف می‌شود، انعکاس صدایتان در محیط را هم ضبط می‌کند و مثل سخنرانی‌ها می‌شود! اگر با میکروفن لپ‌تاپ ضبط می‌کنید، صدای فن لپ‌تاپ روی اعصاب می‌رود! البته می‌توان با نرم‌افزار بعد از ضبط صدا نویز یا صداهای اضافه را حذف کرد؛ اما بهترین نتیجه وقتی حاصل می‌شود که کیفیت ضبط اصلی صدا در بهترین حالت ممکن باشد. هندزفری موبایل میکروفن خوبی دارد که من با چند میکروفن مستقل مقایسه کردم و حتی از آن‌ها بهتر بود. فیش هندزفری به بعضی لپ‌تاپ‌ها می‌خورد اما اگر می‌خواهید زیاد هزینه نکنید یک تبدیل ارزان (من ده تومان خریدمش) یک به دو هم می‌تواند فیش‌های هدفن و میکروفن را جدا کند و به کامپیوتر یا لپ‌تاپ‌های دیگر بخورد. هدست‌های بهتر هم هست که استفاده‌شان ممکن است برایتان راحت‌تر باشد. بهترین چیزی که من خیلی ازش خوشم آمد یک هدست برای مکالمه اینترنتی بود که یک گوشی کوچک و میکروفن دارد که با یک حلقه کوچک دور گوش ثابت می‌شود. خیلی تو چشم نمی‌زند و شبیه چیزی می‌شود که بعضی مجری‌های تلویزیون استفاده می‌کنند. چون میکروفن نزدیک دهانتان قرار می‌گیرد صدا در مقایسه با نویز با قوت خیلی زیادی ضبط می‌شود و نویز کمتر تو ذق می‌زند!من با هر روشی که آزمایش کردم همیشه مقداری نویز روی صدا می‌افتاد. در مورد فن لپ‌تاپ یا کامپیوتر که قبلاً نوشتم؛ اما حتی تبلتی که داشتم و بدون فن بود، وقتی به شارژر وصل می‌شد یک نویز اساسی به صدا اضافه می‌کرد به طوری که میکروفنِ خودش بهتر از میکروفنِ مستقل کار می‌کرد. در بعضی مطالب اینترنتی هم دیده‌ام که اگر اتصال به زمین منبع تغذیه دستگاه‌تان خوب باشد می‌تواند مقداری از این نویز را کم کند. خلاصه اینکه سعی کنید صدا را به بهترین نحو ممکن به ضبط کننده برسانید و باید روش‌های مختلف را آزمایش کنید تا به حالت بهینه برسید. نهایتاً از امکان حذف نویز نر‌م‌افزارهای ویرایش صدا یا نرم‌افزاری که برای ضبط ارائه استفاده می‌کنید هم می‌توانید بهره ببرید تا نویز باقی‌مانده را هم حذف کنید.هنگام ضبط صدا تنظیمات را طوری بگذارید که بعداً پشیمان نشوید. پیشنهادی که BBC برای پادکست‌ها می‌دهد، فرمت MP3 با نرخ 64kbps و دامنه فرکانس 44.1khz  است که به صورت Constant Bitrate, Mono کد شده باشد. این تنظیمات به فایل خروجی حدوداً ۴۳ مگابایت برای ۹۰ دقیقه منجر می‌شود که حجم قابل قبولی است. اگر تنظیمات ضبط از این‌ها بالاتر است بعداً می‌شود کاهش داد ولی بالا بردن آن‌ها بعداً به صورت نرم‌افزاری باعث بهبود کیفیت نمی‌شود!من تجربه خوبی با نرم‌افزار Audacity داشتم که متن-باز و رایگان است و بر روی ویندوز و لینوکس نصب می‌شود. حتی می‌توانید فایل ویدیویی را در آن باز کنید و قسمت صدای آن را جدا می‌کند و می‌توانید جدا رویش کار کنید.۲. ضبط تصویربرای ضبط تصویر می‌توانید کار سخت را انجام دهید و ابتدا صدا را ضبط، و پس از آن با یک نرم‌افزار تهیه فیلم اسلایدها را به آن اضافه کنید. این کار را اصلاً توصیه نمی‌کنم چون بسیار وقت‌گیر است و از شنیدن صدای خودتان خسته خواهید شد! بنابراین حتما از یک نرم‌افزار ضبط تصویر (Screen Recorder) کمک بگیرید. بعضی از این نرم‌افزارها امکان ضبط وبکم را هم دارند که در این صورت چهره شما هم ضبط می‌شود و بعداً می‌توانید در گوشه تصویر بگذارید. بعضی‌ها این کار را دوست دارند که باید ملاحظات خاصش را هم رعایت کنید. مثلاً پس زمینه باید طوری باشد که به راحتی حذف شود.نرم‌افزارتان را قبل از ضبط واقعی آزمایش کنید و مطمئن شوید که سرعت سیستم‌تان را کم نمی‌کند و اختلالی در کارها پیش نمی‌آورد. فضای دیسک کافی برایش بگذارید و برآوردی از حجم خالی لازم در طول ارائه داشته باشید که وسط ضبط به کمبود جا نخورید! لپ‌تاپ‌تان را هم شارژ کافی بکنید یا به منبع تغذیه وصل کنید.با توجه به اینکه معمولاً ارائه‌ها و سمینارها تصاویر پرتحرک ندارند، می‌توانید با پایین آوردن تعداد فریم ضبط در ثانیه هم حجم فایل ضبط شده را کاهش دهید و هم از بار اضافی ضبط روی سیستم کم کنید. بعضی نرم‌افزارها خودشان یک آزمایشی می‌کنند و تنظیم مناسب انجام می‌دهند. ولی تجربه من نشان داده که حتی ۷ فریم در ثانیه هم کفایت می‌کند (در مقایسه با فیلم‌ها که ۲۵ یا حتی ۶۰ فریم در ثانیه توصیه می‌شود.)ابعاد صفحه نمایش را طوری تنظیم کنید که اسلایدها همه صفحه را بپوشانند. من معمولا با توجه به اینکه پرده پروژکتورها معمولا 3x4 هستند اسلایدهایم و رزولوشن صفحه نمایش را هم با همین نسبت تنظیم می‌کنم. تراکم پیکسلی (پیکسل‌ها در طول و عرض تصویر) را طوری تنظیم کنید که به اندازه کافی باشد. تراکم پیکسلی بیش از حد می‌تواند باعث افزایش حجم ویدیو شود. اگر می‌خواهید صفحه مرورگر، خط فرمان یا برنامه‌ای را هم نشان دهید، تراکم پیکسلی زیاد باعث ریزشدن نوشته‌ها می‌شود. طبق تجربه من، انتخاب 1024x768 کمینه کیفیت ولی قابل قبول است. بعضی برنامه‌ها هم می‌توانند به صورت خودکار هنگام ضبط رزولوشن را روی مقدار مشخصی تنظیم کنند.اگر از ماوس به عنوان اشاره‌گر استفاده می‌کنید، بعضی برنامه‌های ضبط می‌توانند یک نشان‌گر یا دایره دور ماوس اضافه کنند که جایش به خوبی روی صفحه دیده شود. اگر نمی‌خواهید از ماوس استفاده کنید این امکان را غیرفعال کنید. برنامه‌های اضافی (خصوصاً شبکه‌های اجتماعی) را روی سیستم‌تان ببندید که اعلان‌های شخصی‌تان را نبینند و اگر خواستید وسط ارائه بین چند برنامه جابجا شوید همه زندگی‌تان در فضای مجازی در انظار مخاطبین قرار نگیرد! بعضی برنامه‌های ضبط این امکان را هم دارند که به صورت خودکار نوار وظیفه (Taskbar) و آیکون‌ها و تصویر پس‌زمینه میزکار (Desktop) را هنگام ضبط پنهان می‌کنند.من تجربه خوبی با نرم‌افزار FlashBack Express داشتم که بر روی ویندوز نصب می‌شود و سبُک و رایگان است. البته امکانات ویرایش پس از ضبط آن در نسخه Express بسیار محدود است و برای امکانات کامل باید خریداری شود. همه چیزهایی که در توضیحات بالا به عنوان امکانات «بعضی نرم‌افزارها» ذکر کردم در این نسخه رایگان هست. اگر برنامه خوبی برای محیط لینوکس سراغ دارید لطفا با من به اشتراک بگذارید. تنظیمات این نرم‌افزار اگر برای ضبط ویدیوهایی که تحرک زیاد ندارند تنظیم شود، منجر به خروجی‌های MP4 بسیار کم حجم می‌شود. مثلا یک جلسه حدوداً ۹۰ دقیقه‌ای را در حدود ۷۰ تا ۹۰ مگابایت می‌گنجاند.پی‌نوشت: برای لینوکس می‌توانید از SimpleScreenRecorder استفاده کنید.۳. ویرایشسعی کنید ضبط را در یک مرحله انجام دهید و نیاز به ویرایش نداشته باشد. کلیدهای سریع نرم افزار ضبط را طوری تنظیم کنید که بتوانید بدون آنکه بخواهید پنجره آن را بیاورید، ضبط را مکث و سپس ادامه دهید. برای چسباندن یا جداکردن ویدیو می‌توانید از برنامه خط فرمان ffmpeg (ویندوز و لینوکس) استفاده کنید که بعضی کارها را می‌تواند بسیار سریع و بدون کدگذاری مجدد که زمان‌بر است انجام دهد. اما اگر می‌خواهید کارهای بیشتری بکنید، برنامه VSDC بر روی ویندوز چیز خیلی خوبی است که بسیاری امکانات آن به صورت رایگان قابل استفاده است.۴. کاهش حجماگر از حجم فایل خروجی نهایی نرم‌افزار ضبط یا ویرایش راضی نبودید یا می‌خواستید تغییرات جزئی (حتی زیاد کردن صدا) انجام دهید من تجربه خوبی در کار با نرم‌افزار Handbrake داشتم. خیلی جمع و جور و ساده است و در عین سرعت عملکرد خوب، حجم را به خوبی کاهش می‌دهد. برنامه‌های Flashback، VSDC و Handbrake هرسه یکسری تنظیمات پیش فرض برای گرفتن خروجی متناسب با کاربرد مورد نظر دارند. من وقتی که حجم برایم مهم است از پروفایل‌های YouTube یا Vimeo که برای وب هستند استفاده می‌کنم. پروفایل 720p برای تصاویر 3x4 استاندارد و پروفایل 1080p برای تصاویر 6x9 با کیفیت‌تر گزینه‌های خوبی هستند.اگر می‌خواهید تنظیمات را دست بزنید فقط دقت داشته باشید که چیزی از کیفیت (Quality) کم نکنید! هرچقدر دلتان خواست با فریم در ثانیه، ابعاد تصویر، یا تنظیمات صدا کلنجار بروید. کم شدن تعداد فریم باعث می‌شود تغییر تصاویر یا حرکت در تصویر کمی زمخت شود و روان به نظر نرسد اما اگر کیفیت را پایین بیاورید تصویر مات و معوج می‌شود و خیلی تو ذق می‌زند!۵. انتشار ویدیوبعد از اینکه دست پختتان آماده شد می‌توانید آن را در سایت دلخواهتان مثلاً آپارات بگذارید. اگر چند ویدیو دارید می‌توانید از آن‌ها یک لیست پخش (Play list) بسازید که وقتی کسی یکی از ویدیوهایتان را دید بقیه را هم پیدا کند. عنوان مناسبی برای ویدیویتان انتخاب کنید که در عین کوتاه بودن، محتوای آن را نشان دهد. کلمات کلیدی مناسب هم بگذارید. در توضیحات می‌توانید به لینک اسلایدهایتان هم اشاره کنید (و بالعکس). راستی، ویدیوی خودتان را هم می‌توانید لایک کنید!جمع‌بندیدر قسمت اول این نوشته تجربه شخصی خودم را در مورد تهیه محتوا با شما به اشتراک گذاشتم. در این نوشته هم یکسری ابزار و نکته برای ضبط خوب معرفی کردم. این مطالب خلاصه تجربه من و چیزهایی است که از دانشجویان یاد گرفته‌ام. همه چیزهایی که اینجا نوشته‌ام وقتی مهم است که حرف خوبی برای زدن داشته باشید. اگر چیز بدرد بخوری بلد هستید دست به کار شوید و به دیگران هم یاد دهید! بسیار خوشحال می‌شوم شما هم تجربه شخصی‌تان را با من در میان بگذارید.</description>
                <category>صادق دُرّی نوگورانی</category>
                <author>صادق دُرّی نوگورانی</author>
                <pubDate>Tue, 23 Jun 2020 19:54:01 +0430</pubDate>
            </item>
                    <item>
                <title>چطور ویدیوی خوبی از سمینارمان بسازیم؟ بخش اول: تهیه محتوا</title>
                <link>https://virgool.io/@sdorri/%DA%86%D8%B7%D9%88%D8%B1-%D9%88%DB%8C%D8%AF%DB%8C%D9%88%DB%8C-%D8%AE%D9%88%D8%A8%DB%8C-%D8%A7%D8%B2-%D8%B3%D9%85%DB%8C%D9%86%D8%A7%D8%B1%D9%85%D8%A7%D9%86-%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D9%85-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-%D8%AA%D9%87%DB%8C%D9%87-%D9%85%D8%AD%D8%AA%D9%88%D8%A7-qrx29uqczyb8</link>
                <description>بچه‌های کامپیوتری (و فکر کنم همه دانشجویان رشته‌های فنی) یک درس به نام «ارائه مطالب علمی و فنی» در دوره کارشناسی دارند که طی آن باید یاد بگیرند که چطور یک گزارش فنی، مقاله، پایان نامه یا رساله بنویسند و چطور آن را به بهترین شکل ارائه کنند. متأسفانه بچه‌ها و استادها این درس را که مثل درس‌های عمومی ارائه می‌شود چندان جدی نمی‌گیرند. این است که خیلی‌ها وقتی وارد دوره کارشناسی ارشد می‌شوند حتی بلد نیستند یک ارائه پاورپوینت درست کنند! دیگر چه برسد که بخواهند ارائه‌شان را به صورت ویدیویی با کیفیت خوب و حجم کم ضبط کنند! در این نوشته کوتاه چند نکته که بر اساس تجربه شخصی و نیز از دانشجویان یاد گرفته‌ام را با شما به اشتراک می‌گذارم. برای اینکه حوصله‌تان سر نرود مطالبم را در دو بخش تنظیم کرده‌ام که الان دارید بخش اول که مربوط به هشت نکته برای تهیه محتوا و انتشار اسلایدهاست را می‌خوانید. در بخش دوم به ضبط و انتشار ویدیویی می‌پردازم. Image Credit: Clipdealer.comپی‌نوشت: برای جاافتادن بهتر توضیحاتم از اسلایدهایی که قبلا درست کرده‌ام استفاده می‌کنم.۱. پیش ارائهانجام یک ارائه یا سمینار مثل تدریس می‌ماند و کاری پرزحمت و وقت‌گیر است! پس بدترین چیز آن است که مجبور شوید آن را چندبار انجام دهید. پیشنهاد می‌کنم وقتی مطالبتان را آماده کردید به صورت آزمایشی و بدون آنکه بخواهید ضبط کنید برای خودتان دو یا سه دور ارائه کنید. دور اول برای این است که مطمئن شوید سیر مطالب و محتوای اسلایدهایتان خوب است. دور دوم و سوم برای تنظیم زمان‌بندی است و احتمالا طی این دو دور تقریباً توضیحاتتان را حفظ شده‌اید. اگر بیش از حد پیش ارائه داشته باشید باعث می‌شود خودتان از مطلبتان خسته شوید یا بیش از حد تند توضیح دهید. بنابراین در تمرین زیاده روی نکنید!۲. تنظیم وقتاحتمالا متوجه می‌شوید که ارائه‌تان بیش از زمان مجاز وقت می‌گیرد! اگر از امکان پاورپوینت برای ذخیره زمانی که روی هر اسلاید گذاشته‌اید استفاده کنید می‌تواند ببینید کجاها وقت بیش از حد برده است. تجربه شخصی من برای تدریس دانشگاهی حدوداً سه دقیقه برای هر اسلاید، و برای سمینارهای فشرده و ارائه مقاله، حدوداً یک دقیقه برای هر اسلاید است (کل اسلایدها و نه فقط اسلایدهای پرمحتوا!). بنابراین اگر اسلایدهایتان زیاد است کم‌شان کنید.۳. نوشته در اسلایدهااگر اسلایدهایتان پر از نوشته است احتمالاً وقت زیادی هم روی‌شان می‌گذارید. تمام حواس مخاطب هم تا مدتی به خواندن نوشته‌های شما می‌رود. بنابراین فقط رئوس مطالب را در اسلایدها بگذارید و با توضیحات خودتان آن‌ها را تکمیل کنید. اگر می‌بینید باز هم زمان زیادی روی یک اسلاید می‌رود، شاید درست این باشد که اسلاید به دو یا حتی چندتا شکسته شود تا روی همه اسلایدها تقریباً وقت یکسانی بگذارید.۴. انیمیشن‌هااگر می‌خواهید از وقت بهتر استفاده شود، انیمیشن و افکت‌های انتقال بین اسلایدها را کمینه کنید. اگر می‌خواهید اسلایدهایتان را بعداً به دیگران بدهید احتمالا ترجیح می‌دهید نسخه PDF به ایشان بدهید. بنابراین اسلایدها را طوری درست کنید اگر انیمیشن یا افکت نداشته باشد مطالب روی هم نیافتد و قابل استفاده باشد. همچنین اگر می‌خواهید یک فرایند را توضیح دهید شاید به جای اینکه کل آن را در یک اسلاید با کلی انیمیشن بگذارید، بهتر باشد آن را به چند مرحله بشکنید و هر مرحله را در یک اسلاید مستقل بگذارید.۵. استفاده از فونت و رنگسعی کنید از تعداد محدودی رنگ در اسلایدهایتان استفاده کنید. استفاده افراطی از یک رنگین کمان رنگ اصلاً فکر خوبی نیست و باعث از دست رفتن تمرکز مخاطب می‌شود. نوشته‌ها را پررنگ و به اندازه کافی درشت بگذارید. در مورد فونت هم به نظرم برای کل بدنه اسلاید از یک فونت و برای عنوان از فونت مناسب دیگری (یا حتی همان فونت) استفاده کنید. بعضی فونت‌ها فقط برای چاپ خوب هستند و روی پرده یا کامپیوتر اصلاً خوب خوانده نمی‌شوند (خصوصا لوتوس) و بعضی‌ها بر عکس. من برای عنوان اسلایدها از فونت تیتر و برای متن از یاس استفاده می‌کنم. پس زمینه را طوری انتخاب کنید که اختلاف رنگ با محتوا زیاد باشد و اگر پروژکتور کیفیت رنگ خوبی نداشت بازهم بشود متن را به راحتی خواند.مثال برای استفاده از رنگ و فونت در اسلایدها، بولت‌گذاری متن۶. تقسیم‌بندی محتوایک ارائه خوب با یک صفحه عنوان و چشم‌انداز (یا فهرست مطالب) شروع می‌شود. بعضی اوقات هم یک یا چند اسلاید خیلی جذاب را قبل از چشم‌انداز به عنوان جلب انگیزه در مخاطب می‌گذارند. معمولاً یک ارائه مثل یک متن علمی به تعدادی بخش تقسیم می‌شود. در ابتدای هر بخش یک اسلاید ویژه تغییر بخش بگذارید. این اسلایدها خیلی خوب هستند چون بار ذهنی مخاطب را کم می‌کنند و او می‌فهمد که یک مطلب تمام شده و مطلب دیگری دارد شروع می‌شود. در هر بخش چندتا اسلاید داریم که سعی کنید حتما عنوان داشته باشند. درون بدنه هم از بولت استفاده کنید تا مطالب به صورت تقسیم‌بندی شده جلوی مخاطب قرار گیرد.مثال برای صفحه عنوان یا آغاز اسلایدهامثال برای اسلاید تغییر بخشبه نظرم هر اسلاید بین دو تا چهار یا پنج بولت اصلی می‌تواند داشته باشد و هر بولت اصلی می‌تواند چندتا بولت فرعی هم داشته باشد. من از فونت درشت با سایه برای بولت‌های اصلی و از فونت کمی کوچک‌تر و بعضا کم‌رنگ‌تر برای بولت‌های فرعی استفاده می‌کنم. متن را مثل خلاصه نویسی در بیاورید و سعی کنید مجبور به گذاشتن جمله نشوید. اما اگر جمله دارید، حتما از علائم نقطه‌گذاری مناسب استفاده کنید. بعضی کلمات را می‌توانید برای تأکید بیشتر درشت کنید یا از یک رنگ متفاوت برایشان استفاده کنید. اگر در این کار زیاده‌روی نکنید مخاطبتان خیلی سریع توجهش به چیزهای مهم جلب می‌شود.۷. رعایت اخلاق علمیاگر از تصاویر، جدول، یا نمودار دیگران استفاده می‌کنید و ارزش علمی دارند، حتماً فراموش نکنید که به ایشان ارجاع دهید. می‌توانید لینک صفحه یا مرجع را پایین اسلاید بیاورید یا در پایان اسلایدها فهرست مراجع داشته باشید. فکر بسیار خوبی است که اگر از دیگران یا اسلایدهایشان در تهیه مطالبتان استفاده کرده‌اید، در پایان اسلایدها از ایشان تشکر کنید. ۸. سایر ریزه‌کاری‌هابرای اسلایدهایتان حتماً شماره بگذارید. من معمولاً پایین اسلایدهای ارائه‌های کوتاه یا مقالات، عنوان ارائه و اسم خودم را می‌گذارم که اگر کسی وسط جلسه هم آمد بفهمد چه کسی هستم و دارم در مورد چه صحبت می‌کنم. حتماً تاریخ ارائه و محفلی که ارائه را در آن انجام می‌دهید را در صفحه اول ذکر کنید که اگر کسی بعداً اسلایدهایتان را دید متوجه شود. اگر وابسته به سازمان، دانشگاه یا آزمایشگاه پژوهشی هستید آرم و نام آن را در اسلایدهایتان داشته باشید. همچنین بد نیست آرم محفلی که برایشان ارائه می‌کنید (مثلاً آرم کنفرانس) را هم در اسلایدها بگذارید.اطلاعات تماس خودتان (مثلاً ایمیل یا شناسه شبکه‌های اجتماعی) را فراموش نکنید! می‌توانید در صفحه پایانی که معمولاً برای تشکر است، این اطلاعات را بگذارید که مخاطبین چند لحظه فرصت داشته باشند یادداشت کنند یا عکس بگیرند. آدرس سایت یا وبلاگتان را می‌توانید به صورت QRCode در این صفحه بگذارید که دردسر تایپ کردن نداشته باشد و بتوانند با دوربین موبایل اسکن کنند. اگر هم می‌خواهید می‌توانید آدرس‌های طولانی را به صورت کوتاه شده در بیاورید. برای ساختن QRCode و کوتاه کردن آدرس، سایت‌های متعددی هستند که می‌توانید از آن‌ها استفاده کنید.مثال از ارائه اطلاعات تماس در اسلاید پایانیتکمیل کار: ضبط و انتشار ارائهپیشنهاد می‌کنم اگر ارائه‌تان مطلب خاصی ندارد که نگران لو رفتنش (!) باشید، روی یک سایت مثل SlideShare یا LinkedIn با بقیه به اشتراک بگذارید. متاسفانه سایت داخلی برای این منظور نمی‌شناسم! تهیه یک ارائه خوب ریزه‌کاری‌های زیادی دارد و در این مجال نمی توانستم به همه بپردازم اما امیدوارم چیزهایی که نوشتم برایتان مفید باشد. مرا از نظرات و تجربیات شخصی خود بی‌نصیب نگذارید!مرحله بعدی کار مربوط به انجام ارائه یا سمینار، ضبط و انتشار ویدیوی آن است که در بخش دوم این نوشته به آن می‌پردازم.</description>
                <category>صادق دُرّی نوگورانی</category>
                <author>صادق دُرّی نوگورانی</author>
                <pubDate>Tue, 23 Jun 2020 16:37:00 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با رمزارهای معروف</title>
                <link>https://virgool.io/@sdorri/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%B1%D9%85%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D9%85%D8%B9%D8%B1%D9%88%D9%81-ubcq8ntce5ll</link>
                <description>یکی از بخش‌های جذاب درس امنیت تجارت الکترونیکی، ارائه یا سمینار کلاسی است. در این ارائه‌ها بچه‌ها یک رمزارز معروف را انتخاب می‌کنند و در حدود بیست دقیقه به معرفی آن می‌پردازند. این معرفی مشتمل بر تاریخچه کوتاه، فلسفه ایجاد، معماری سیستم و پروتکل‌های درون آن، و سایر مباحث خاص هر کدام است.روند کار به این صورت است که ابتدا موضوعشان را انتخاب می‌کنند و فقط موضوعاتی پذیرفته می‌شوند که جزو رمزارزهای معروف (حجم بازار دلاری بزرگ طبق سایت Coinmarketcap یا جزو لیست برترین‌ها) باشند، تکراری از ترم‌های قبلی یا مشتق ساده‌ای از رمزارز دیگری هم نباشند. باید ارائه‌شان را یکبار قبل از موعد نهایی ضبط کنند و به عنوان پیش ارائه برای من بفرستند که تجربه نشان داد این کار روی ارتقای کیفیت سمینارها بسیار مؤثر است.پس از ارائه هم باید اسلایدهایشان را روی سایت اسلایدشر، و ویدیوی ضبط شده‌شان را روی آپارات بگذارند. تصمیم دارم از بستر ویرگول هم برای معرفی این رمزارزها استفاده کنم. به مرور نوشته‌های اختصاصی برای هریک خواهم گذاشت که خیلی خلاصه هرکدام را معرفی کند و کامپیوتری‌هایی که علاقمند به اینطور مباحث هستند بتوانند از این محتوا استفاده کنند. لینک نوشته‌ها را اینجا هم اضافه می‌کنم تا دنبال کردنشان برای علاقمندان راحت‌تر باشد.به روز رسانی: به علت مقررات سایت ویرگول امکان لینک‌های متعدد وجود ندارد؛ لذا یک لیست پخش از ارائه‌ها ساخته‌ام که می‌توانید آن را دنبال کنید.Credit: https://cointelegraph.comمعرفی شبکه و رمزارز NEOمعرفی شبکه و رمزارز Tetherمعرفی شبکه و رمزارز Wavesمعرفی شبکه و رمزارز Moneroمعرفی شبکه و رمزارز Digix DAOمعرفی شبکه و رمزارز Stellar / Lumensمعرفی شبکه و رمزارز Dashمعرفی شبکه و رمزارز Zcashمعرفی شبکه و رمزارز Decredمعرفی شبکه و رمزارز Rippleمعرفی شبکه و رمزارز Cardanoمعرفی شبکه و رمزارز Ontologyمعرفی شبکه و رمزارز Stratisمعرفی شبکه و رمزارز Ravencoinمعرفی شبکه و رمزارز Spectrecoinمعرفی شبکه و رمزارز IOTAمعرفی شبکه و رمزارز NEMمعرفی شبکه و رمزارز Liskمعرفی شبکه و رمزارز Makerمعرفی شبکه و رمزارز TRONمعرفی شبکه و رمزارز Qtumمعرفی شبکه و رمزارز EOSمعرفی شبکه و رمزارز Arkمعرفی شبکه و رمزارز Algorandمعرفی شبکه و رمزارز ChainLinkمعرفی شبکه و رمزارز Cosmosمعرفی شبکه و رمزارز ICONمعرفی شبکه و رمزارز HedgeTradeمعرفی شبکه و رمزارز Tezosمعرفی شبکه و رمزارز VeChainمعرفی شبکه و رمزارز Hashgraphمرا از نظراتتان بی‌بهره نگذارید...</description>
                <category>صادق دُرّی نوگورانی</category>
                <author>صادق دُرّی نوگورانی</author>
                <pubDate>Wed, 10 Jun 2020 16:18:17 +0430</pubDate>
            </item>
                    <item>
                <title>فناوری بلاکچین برای کامپیوتری‌ها</title>
                <link>https://virgool.io/@sdorri/%D9%81%D9%86%D8%A7%D9%88%D8%B1%DB%8C-%D8%A8%D9%84%D8%A7%DA%A9%DA%86%DB%8C%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1%DB%8C%D9%87%D8%A7-y6bmoe5ggnrs</link>
                <description>وقتی اولین بار طی سمینار یکی از دوستانم در دانشگاه شریف با بیتکوین آشنا شدم، ایده ایجاد پول با اثبات کار (PoW) چیزی بود که به نظرم می‌توانست یک ارزش ذاتی به بیتکوین بدهد. اما اصلاً مرا درگیر خود نکرد! چند سال بعد که بلاکچین و بیتکوین گُل کردند، دوباره و با دقت بیشتری بهشان نگاه انداختم و این بار برایم واضح شد که ارزش وقت گذاشتن و کار علمی دارند. این شد که از سال ۹۶ به طور جدّی روی موضوع بلاکچین متمرکز شدم. طرح جلد مجله اکونومیست (۳۱ اکتبر ۲۰۱۵ میلادی) در مورد بلاکچین (The Trust Machine)در مهرماه سال ۹۶ درس امنیت تجارت الکترونیکی، فقط یکی دو جلسه را به معرفی بیتکوین و بلاکچین اختصاص دادم؛ اما هرچه جلوتر آمدم اهمیت آشنایی با این فناوری را برای بچه‌های کامپیوتری احساس کردم و این دو ترمی که درس را دوباره ارائه کرده‌ام بخش مهمی از درسمان را به خود اختصاص داده است. ما در این درس از جنبه‌های جذاب و نوآورانه بیتکوین شروع می‌کنیم، بعد با مباحث فنی‌تر و عمیق‌تر آن آشنا می‌شویم؛ حتی کمی هم از بیتکوین اسکریپت می‌گوییم. از اینجا مفهوم قراردادهای هوشمند را مطرح می‌کنیم و با اتریوم به عنوان معروف‌ترین بستر قراردادهای هوشمند و بلاکچین‌های نسل دوم آشنا می‌شویم. به اینجای بحث که می‌رسیم چند جلسه را به امنیت قراردادهای هوشمند اختصاص می‌دهیم. پس از آن در مورد انواع بلاکچین (نسل سوم و دفتر حساب‌های توزیع شده با ساختار غیر بلاکچینی) صحبت می‌کنیم؛ و حسن ختام درسمان مباحث مربوط به ایجاد برنامه‌های کاربردی مبتنی بر بلاکچین است.پارسال که تجربه اول ارائه درس به این شکل بود سعی کردم کلاس را ضبط کنم و بعدش اسلایدها را به صدای ضبط شده کلاس اضافه کردم و با کلی زحمت (-؛ به صورت ویدیویی در آوردم. به عنوان تجربه اول، اشکالاتی داشت و خصوصا یکی دو جلسه اول کیفیت صدا خوب از آب در نیامد. اما جلوتر که رفتم یک مقدار بهتر شد. می‌توانید صوت کلاس را از شنوتو گوش کنید، ویدیوی چند جلسه اول را از آپارات ببینید، و به اسلایدهایشان هم در اسلایدشر دسترسی پیدا کنید. امسال که همه به زور مجبور شدیم کلاس‌ها را آنلاین برگزار کنیم ضبط‌های جدیدی دارم که کیفیتشان خیلی بهتر است. اما هنوز موفق نشدم سر و سامانشان بدهم.امیدوارم مرا از نظراتتان بی‌بهره نگذارید...</description>
                <category>صادق دُرّی نوگورانی</category>
                <author>صادق دُرّی نوگورانی</author>
                <pubDate>Wed, 10 Jun 2020 15:41:32 +0430</pubDate>
            </item>
            </channel>
</rss>