<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات روزمرگی های برنامه نویسان 🌿</title>
        <link>https://virgool.io/codenevis/feed</link>
        <description>🟢 دوره ۱۲ قدم برنامه نویسی یکی از برترین دوره های آموزشی جهت شروع اصولی برنامه نویسی است و حدود ۵۰۰۰ شرکت کننده با ۹۹ درصد موفقیت داشته است. 🔗 https://avasam.ir/product/12-step-for-be-programmer</description>
        <language>fa</language>
        <pubDate>2026-06-15 20:34:24</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/wsixlnj8cxsu/1v20lu.jpg</url>
            <title>روزمرگی های برنامه نویسان 🌿</title>
            <link>https://virgool.io/codenevis</link>
        </image>

                    <item>
                <title>وقتی اینترنت «زشت» بود! ۱۹۹۱ و اولین سایت تاریخ</title>
                <link>https://virgool.io/codenevis/first-website-syy8ylw67mri</link>
                <description>امروز که در حال اسکرول کردن ویرگول هستید یا در یوتیوب ویدیوهای 4K می‌بینید، سخت است تصور کنید که &quot;جدِ بزرگ&quot; تمام این‌ها، تنها یک صفحه متنی ساده بود که حتی رنگ هم نداشت! در این مقاله می‌خواهیم ماشین زمان را روشن کنیم و به سرن (CERN) در سوئیس برویم؛ جایی که آقای «تیم برنرز لی» با یک کامپیوتر عجیب، جهان را برای همیشه تغییر داد.جرقه اولیه: وقتی دانشمندان کلافه می‌شوندداستان اولین وب‌سایت جهان، داستان پول یا شهرت نبود؛ داستان «نیاز» بود.در دهه ۸۰ میلادی، موسسه تحقیقاتی CERN (مرکز تحقیقات هسته‌ای اروپا) پر از دانشمندانی بود که هر کدام روی پروژه‌های مختلف کار می‌کردند. اما یک مشکل بزرگ وجود داشت: اطلاعات در کامپیوترهای مختلف حبس شده بود. اگر شما می‌خواستید مقاله همکارتان را بخوانید، باید فیزیکی به دفتر او می‌رفتید یا فلاپی دیسک رد و بدل می‌کردید.تیم برنرز لی (Tim Berners-Lee)، مهندس نرم‌افزار انگلیسی، ایده‌ای جسورانه داشت:&quot;چه می‌شود اگر تمام این اطلاعات به هم لینک شوند و مثل یک تار عنکبوت (Web) در دسترس همه باشند؟&quot;و اینگونه بود که پروژه WorldWideWeb (که بعدها به WWW خلاصه شد) متولد شد.سخت‌افزار مقدس: کامپیوتری که استیو جابز ساختشاید جالب‌ترین بخش داستان که کمتر کسی می‌داند، نقش غیرمستقیم استیو جابز در اختراع وب است.تیم برنرز لی برای پیاده‌سازی این ایده، به یک کامپیوتر قدرتمند نیاز داشت. او از کامپیوتر NeXT Cube استفاده کرد.این کامپیوتر توسط شرکت NeXT (شرکتی که استیو جابز پس از اخراج از اپل تاسیس کرد) ساخته شده بود. سیستم‌عامل پیشرفته‌ی این دستگاه به تیم اجازه داد تا اولین مرورگر و اولین سرور جهان را کدنویسی کند.یک حقیقت بامزه: روی کیس این کامپیوتر تاریخی در سرن، یک برچسب با دست‌خط قرمز چسبانده شده بود:&quot;این ماشین یک سرور است. آن را خاموش نکنید!&quot; (DO NOT POWER DOWN)چون اگر کسی اشتباهاً آن را از برق می‌کشید، کل اینترنت جهان قطع می‌شد!آناتومی اولین سایت: زشت، ساده اما انقلابیاگر امروز آن سایت را ببینید، احتمالا فکر می‌کنید با یک فایل Notepad طرف هستید. خبری از CSS، جاوا اسکریپت، ویدیو یا حتی عکس نبود (عکس‌ها بعدها اضافه شدند).آدرس سایت چه بود؟اولین آدرس اینترنتی جهان info.cern.ch بود.محتوای سایت چه بود؟این سایت در واقع یک «دفترچه راهنما» بود. در آن توضیح داده شده بود که:۱. وب چیست؟۲. چگونه می‌توان یک مرورگر ساخت؟۳. چگونه می‌توان اطلاعات را در آن قرار داد؟زیر کاپوت: ۳ اختراعی که هنوز پابرجاستبرای اینکه آن صفحه ساده روی مانیتور نمایش داده شود، تیم برنرز لی مجبور شد سه تکنولوژی پایه را اختراع کند که ما هنوز بعد از ۳۰ سال، دقیقاً از همان‌ها استفاده می‌کنیم:۱. HTML (زبان ساختار)فرمت‌دهی متن‌ها. اینکه کدام خط تیتر است &lt;h1&gt; و کدام خط لینک است &lt;a&gt;. ساختار کدهای اولین سایت بسیار ساده و بدون استایل بود.۲. URI (آدرس‌دهی)چیزی که ما امروز به نام URL می‌شناسیم. استانداردی برای اینکه هر سند در فضای مجازی یک آدرس یکتا داشته باشد.۳. HTTP (پروتکل انتقال)زبان مشترکی که مرورگر و سرور با آن با هم حرف می‌زنند تا اطلاعات رد و بدل شود.چرا این سایت &quot;وایرال&quot; شد؟ (میراث رایگان)در آگوست ۱۹۹۱، تیم برنرز لی این پروژه را عمومی کرد. اما مهم‌ترین تصمیم او در سال ۱۹۹۳ گرفته شد.در آن زمان، شرکت‌ها برای تکنولوژی‌هایشان حق امتیاز (Patent) می‌گرفتند و پول‌های کلان طلب می‌کردند. اما سرن و تیم برنرز لی اعلام کردند که سورس کدِ وب، برای همیشه رایگان و متعلق به عموم مردم است.اگر آن‌ها وب را پولی می‌کردند، شاید امروز اینترنتی به این شکل وجود نداشت و ما در شبکه‌های خصوصی و جداگانه شرکت‌هایی مثل مایکروسافت یا AOL محصور بودیم.کلام آخر: بازگشت به آیندهدیدن اولین وب‌سایت جهان، درسی بزرگ برای طراحان و توسعه‌دهندگان امروز دارد: «محتوا، پادشاه است».آن سایت هیچ گرافیکی نداشت، اما چون نیازی را برطرف می‌کرد و اطلاعات ارزشمندی داشت، پایه و اساس تمدن دیجیتال امروز شد.امروز سایت اصلی دیگر روی آن کامپیوتر NeXT میزبانی نمی‌شود، اما سرن (CERN) نسخه بازسازی شده آن را در همان آدرس قدیمی زنده نگه داشته است تا یادمان نرود همه چیز از کجا شروع شد.شما چه فکر می‌کنید؟اگر الان اینترنت به همان سادگی سال ۱۹۹۱ بود (فقط متن و لینک)، آیا زندگی آرام‌تری داشتیم یا دنیای بدون عکس و ویدیو برایتان غیرقابل تحمل بود؟ نظرات خود را بنویسید.</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>پارسا خلج زاده</author>
                <pubDate>Sat, 13 Dec 2025 17:35:41 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش جامع سوکت نویسی با پایتون</title>
                <link>https://virgool.io/codenevis/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%85%D8%B9-%D8%B3%D9%88%DA%A9%D8%AA-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%A7-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-ywuyz0kukmgm</link>
                <description>سلام وقت همگی بخیر.امیرحسین ناظوری هستم و خیلی خوش اومدید به یکی از مقالات سنگین و حجیم و عجیبم داخل ویرگول 😉تو این مقاله قصد دارم در مورد سوکت نویسی یا برنامه نویسی شبکه با زبان پایتون، یسری مطالب رو آموزش بدم.اگه به موضوعات مربوط به برنامه نویسی، بدافزار و سیستم عامل علاقه مندید، سایت و شبکه های اجتماعیم رو دنبال کنید 👍برای درک این آموزش، شما باید با زبان Python و مقدمات شبکه آشنا باشید.من یه ویدیو طولانی داخل کانال یوتیوبم قرار دادم و مقدمات شبکه رو به ساده ترین روش ممکن که در توانم بود، توضیح دادم. در صورت لزوم از اون ویدیو شروع کنید. (مشاهده ویدیو)در ابتدا لازمه بررسی کنیم که برنامه نویسی شبکه چیه و کجاها کاربرد داره.برنامه نویسی شبکه یعنی نوشتن برنامه هایی که بتونن با برنامه های دیگه، داخل کامپیوترهای دیگه ارتباط بگیرن. به زبان ساده تر یعنی برنامت فقط روی کامپیوتر خودت کار نمیکنه، بلکه میتونه با کامپیوترهای دیگه ارتباط بگیره و داده ارسال و دریافت کنه.وقتی شما وارد مرورگر میشی و سایت google رو باز میکنی، مرورگرت یه برنامه ایی هست که تحت شبکه نوشته شده و میره متصل میشه به سرور گوگل.برنامه نویسی شبکه کجاها کاربرد داره؟ تقریبا همه جا. چندتا از مهمترین کاربردهاش:وب و اینترنت: برنامه هایی مثل مرورگر، نرم افزارهای چت محور (مثل تلگرام)، بازی های آنلاین، وب سرویس ها و...ابزارهای مدیریت شبکه: برنامه هایی که کمک میکنن شبکه رو مدیریت کنیم، از برنامه نویسی شبکه استفاده میکنن تا ارتباط بین کامپیوترها و شبکه ها رو فراهم کنن.هک و امنیت: ابزارها یا برنامه هایی که این امکان رو میدن تا بتونیم ترافیک های مختلف رو شنود کنیم، دارن از برنامه نویسی شبکه استفاده میکنن. یا بدافزاری که روی کامپیوتر هدف اجرا میشه و وصل میشه به سرور کنترلش، داره از مدل برنامه نویسی شبکه استفاده میکنه.تو اندروید، نرم افزارهایی مثل SHAREit یا Zapya تحت شبکه برنامه نویسی شدن تا شما اون هارو نصب کنید و از طریقشون، فایل هایی رو داخل یک شبکه ردوبدل کنید.Socket چیه و چه ارتباطی با برنامه نویسی شبکه داره؟یه رستوران رو تصور کن. این رستوران یه آشپزخونه داره که پخت و پز داخلش انجام میشه، آشپزخونه ساختار و پیچیدگی خودشو داره و اصولا کسی از بیرون واردش نمیشه تا سفارش ثبت کنه. وقتی شما میری رستوران، باید به پیشخدمت سفارشت رو ثبت کنی. پیشخدمت رابط بین تو و آشپزخونه ایی میشه که قراره درخواستت رو آماده کنه و اینم در نظر بگیر که آشپزخونه داره چندین غذارو باهم آماده میکنه و کلا یه پیچیدگی و شلوغی خاصی اونجا حکم فرماست.طبق این مثال، پیشخدمت نقش Socket رو بازی میکنه.وقتی یک نرم افزار قراره ارتباط شبکه ایی با یک نرم افزار دیگه برقرار کنه، باید بتونه با لایه های مختلف OSI صحبت کنه، سخت افزار و کارت شبکه رو مدیریت کنه، پورت هارو مدیریت کنه و... سیستم عامل نمیزاره هرکسی که از راه رسید بیاد و این بخش هارو به روش خودش مدیریت کنه و ازشون استفاده کنه، سیستم عامل میاد Socket رو ارائه میده، تا من بتونم به روش امن تر و کنترل شده تر از شبکه و برنامه نویسی شبکه استفاده کنم.درنتیجه، برای برقراری ارتباط بین دو کامپیوتر، باید درون هرکدوم یک سوکت ساخته بشه و به واسطه این سوکت ها، ارتباط رو برقرار میکنیم.سوکت به زبان ساده ترکیبی از IP و Portعه که در ادامه بیشتر باهاش آشنا میشیم.شروع سوکت نویسی با پایتون.نکته. برنامه نویسی شبکه (سوکت نویسی) فقط مختص به پایتون نمیشه و با زبان های مختلف میتونیم تحت شبکه برنامه نویسی کنیم.برای برنامه نویسی شبکه در پایتون، کتابخونه های مختلفی وجود داره که تو این آموزش قراره با کتابخونه socket کار کنیم.همینطور که بالاتر گفته شد، باید هم سمت Server یک سوکت ایجاد کنیم و هم سمت Client و در نتیجه از طریق این سوکت ها ارتباط رو برقرار کنیم. کد زیر مربوط میشه به ساخت Socket سمت سرور:import socket # بصورت پیشفرض داخل پایتون وجود داره

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# AF_INET = IPv4
# SOCK_STREAM = TCP (Connection Oriented)یه متغیر ساختم به اسم s و برای مقدارش از کلاس socket که داخل ماژول socket وجود داره استفاده کردم. تو ورودی کلاس socket دوتا آرگومان رو نوشتم. با آرگومان اول مشخص کردم، Socketیی که میخوام بسازم، باید از IPv4 استفاده کنه. با آرگومان دوم مشخص کردم که باید از پروتکل TCP برای ساخت Socket استفاده کنه.حالت های دیگش:s2 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
# AF_INET6 = IPv6
# SOCK_DGRAM = UDP (Connection Less)
# ترکیبی هم میشه استفاده کردیه فایل داریم به اسم server.py و کدهای زیر داخلش قرار داره:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)این کد تا به الان فقط قالب اون سوکت رو آماده کرده. به این صورت قالب بندی کرده که سوکت باید از IPv4 و TCP استفاده کنه.تو قدم بعدی باید تعریف کنم که سوکت، روی چه آیپی و پورتی باید سوار بشه. کد:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;127.0.0.1&quot;, 50111))متد bind به سوکت میگه IP و پورتی که به عنوان ورودی گرفتم رو، رزرو کن. تا قبل از bind سوکت فقط یه در ارتباطی خالیه. بعد از bind یه آدرس داره که سیستم عامل میدونه باید روی اون آدرس، بسته های مربوط به سوکت رو ارسال/دریافت کنه.متد bind یک ورودی Tuple میگیره. داخل Tuple باید ابتدا آدرس IP که میخوام سوکت روی اون فعال بشه رو وارد کنم. برای این آدرس مقادیر مختلفی میتونم بنویسم.localhost: اگه این کلمه رو بنویسم یعنی سوکت فقط روی کامپیوتر خودم ساخته بشه و کسی نمیتونه بهش متصل بشه (حتی اگه داخل یک LAN باشیم)127.0.0.1: اگه این IP رو قرار بدم فرقی با localhost نداره (برای زمان هایی که بخوام سرور و کلاینت رو روی یک کامپیوتر اجرا کنم)192.168.1.100: میتونم IP محلی خودم رو قرار بدم و بگم درخواست ها باید سمت این IP ارسال بشه که با این حرکت دیگر کامیپوترهای موجود در LAN میتونن وصل بشن.ورودی دوم Tuple مربوط میشه به شماره پورتی که سوکت باید روی اون فعال بشه. پیشنهاد میکنم از پورت 1024 تا 65535 یه عددی رو انتخاب کنید.تا الان سوکت رو ساختیم و با متد bind یک IP و Port رو براش مشخص کردیم.تو قدم بعد باید سوکت رو ببرم تو حالت انتظار یا گوش دادن. با این حرکت به سیستم عامل میگم اون سوکتی که ساختم رو بزارش روی حالت گوش دادن تا اگه درخواستی از سمت Client اومد متوجه بشه.import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;127.0.0.1&quot;, 50111))

s.listen(1)وقتی چند Client همزمان میخوان وصل بشن، سیستم باید یک صف از درخواست های درحال انتظار درست کنه.ورودی که متد listen دریافت میکنه تعداد حداکثر اتصالاتی هست که میتونن توی اون صف، منتظر بمونن. مثال:s.listen(5)تو کد بالا گفتم اگه 5 تا Client همزمان درخواست بدن و Server هنوز هیچکدوم رو accept نکرده باشه، درخواست ششم رو رد کن. این حرکت باعث نمیشه که سرور بیشتر از 5 تا Client رو قبول نکنه، فقط گفته که 5 تا بیشتر تو صف نمونن. (توی فایل server.py همون کد s.listen(1) رو نوشتم)برای درک بهتر مراحل، فرض کن یه مغازه باز کردی!socket: ساختن یا اجاره مغازه.bind: نصب تابلو با آدرس و شماره تماس.listen: باز کردن در مغازه و گذاشتن صف برای مشتری ها.accept: پذیرش هر مشتری و شروع گفتگو.درنتیجه، بعد از اینکه socket رفت روی حالت listen، باید درخواست هایی که ارسال میشه رو accept کنیم.import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;127.0.0.1&quot;, 50111))

s.listen(1)

client, address = s.accept()وقتی متد accept میاد یک درخواست رو قبول میکنه یا به عبارتی، میاد یک ارتباطی رو ایجاد میکنه، دوتا مقدار رو برمیگردونه و من این مقادیر رو داخل client و address ذخیره کردم.client: زمانی که accept اجرا میشه، یه سوکت جدید ساخته میشه که این سوکت فقط مختص به همون کلاینتیه که درخواستش قبول شده. این سوکت جدید با سوکت اصلی که تو متغیر s ذخیره کردم متفاوته و کتابخونه سوکت اینکارو انجام میده تا سوکت/ارتباط هر کلاینت مجزا باشه و از طرفی، سوکت اصلی، رو همون حالت و آدرس ها درحال listen بمونه تا بتونه به دیگر درخواست ها واکنش نشون بده. پس تو متغیر client سوکت جدید قرار میگیره و از این لحظه به بعد هرکاری با اون کلاینت داشته باشم رو باید با این متغیر انجام بدم.address: تو این متغیر IP و Port کلاینت در قالب Tuple ذخیره میشه.عکس پایین مراحل ارتباط دوتا socket رو نشون میده.همینطور که قبلا گفتیم، سوکت باید هم سمت Server ساخته بشه هم سمت Client. طبق عکس، تو سمت Server اول از همه باید یک socket تعریف بشه. اینکارو با کد زیر انجام دادیم:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)بعدش باید سوکت رو روی یک آدرسی bind کنیم و با کد زیر اینکارو انجام دادیم:s.bind((&quot;127.0.0.1&quot;, 50111))تو قدم بعدی، سوکت باید روی حالت listen بره و منتظر بمونه تا درخواست ها سمتش ارسال بشن.s.listen(1)تو قدم بعدی باید متد accept رو تعریف کنیم تا درخواست هایی که از سمت Client ها ارسال میشه رو قبول کنیم.client, address = s.accept()حالا به سمت Client دقت کن.تو سمت کلاینت هم اولین قدم، ساخت socket هست. (دارم فایل client.py رو مینویسم)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)قدم بعدی ارسال درخواست به سمت Serverعه.s.connect((&quot;127.0.0.1&quot;, 50111))فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;127.0.0.1&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection:\nclient: {client}\naddress: {address}&quot;)

client.send(b&quot;Hello Client&quot;)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;127.0.0.1&quot;, 50111))

print(&quot;Ok&quot;)

print(s.recv(1024))من میام server.py رو اجرا میکنم و برنامه میره رو حالت listen.بعدش میام client.py رو اجرا میکنم. به محض اجرا شدن، هر دو فایل خروجی هایی رو برمیگردونن.خروجی server.py:New Connection:
client: &lt;socket.socket fd=180, family=2, type=1, proto=0, laddr=(&#039;127.0.0.1&#039;, 50111), raddr=(&#039;127.0.0.1&#039;, 63716)&gt;
address: (&#039;127.0.0.1&#039;, 63716)خروجی client.py:Ok
b&#039;Hello Client&#039;تو فایل server.py گفتم هرموقع درخواستی رو accept کردی بیا مقدار متغیر client و server رو نمایش بده.بعدش متغیر client رو صدا زدم، این متغیر اختصاص داره به همون کلاینتی که از طریق سوکت بهم متصل شده و، متد send رو فراخانی کردم، یعنی میخوام یه داده ایی رو برای اون کلاینت بفرستم. توی ورودی متد متن Hello Client رو بصورت byte ارسال کردم (راجب این متد بعدا توضیح میدم)توی فایل client.py متد connect رو نوشتم و آدرس سروری که میخوام بهش وصل بشم رو در قالب Tuple وارد کردم. بعدش print رو قرار دادم که اگه تونست به سرور متصل بشه، متن OK رو print کنه. در آخر متغیر s رو که مربوط میشه به ارتباط من با سوکت هدف رو صدا زدم و متد recv رو فراخانی کردم. این متد منتظر میمونه تا داده ایی از طرف مقابل ارسال بشه و دریافت کنه، حالا من چیزی که تو سمت سرور ارسال کردم رو اینجا دریافت و print میکنم که خروجی همون Hello Client هست.به مقدار متغیر address که موقع accept کردن ارتباط ساخته شده دقت کن:address: (&#039;127.0.0.1&#039;, 63716)اینجا IP و Port کلاینت رو میبینم. کلاینت وقتی میخواد به یک کامپیوتری متصل بشه، میاد یک Port تصادفی ایجاد میکنه و ارتباطش رو به این پورت گره میزنه. چرا اینکارو میکنه؟ شما در آن واحد با چندین سرور و کامپیوتر دیگه ارتباط دارید، برای مثال داخل مرورگر تب های مختلفی بازه که هرکدوم سایت خاصی رو بالا اوردن، از طرفی ممکنه نرم افزارهایی مثل تلگرام هم روی سیستمتون باز باشه که اون هم اتصالات خاص خودشو داره. کامپیوترها این Port های تصادفی رو ایجاد میکنن که وقتی بسته ایی رو ارسال میکنن به مقصد و جوابش برمیگرده، بدونن این جوابی که اومده مربوط به کدوم سرویس یا نرم افزار میشه.یه دستور وجود داره به اسم netstat -n که میتونم درخواست های ارسال/دریافت شده رو به همراه Portشون ببینم.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

input(&quot;Accept?&quot;)

client, address = s.accept()

print(f&quot;New Connection:\nclient: {client}\naddress: {address}&quot;)

client.send(b&quot;Hello Client&quot;)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Ok&quot;)

print(s.recv(1024))یه ترمینال باز کردم و فایل server.py رو اجرا کردم. به محض اجرا شدن عبارت ?Accept رو چاپ کرد که یعنی سوکت ساخته شد، bind شد و رفت روی حالت listen با تعداد 1 کاربر ولی تا زمانی که من Enter نزنم، دستور بعدی که accept هست اجرا نمیشه. میزارم روی همین input بمونه.سه تا ترمینال دیگه باز میکنم و داخل هرکدوم، فایل client.py رو فراخانی میکنم.ترمینال اول که فایل رو داخلش اجرا کردم مقدار OK رو برگردوند. یعنی تونست به سرور connect بشه.داخل ترمینال دوم هم فایل رو اجرا میکنم و مجدد مقدار OK چاپ میشه.داخل ترمینال سوم هم فایل رو اجرا میکنم ولی خروجی برنمیگرده، بعد از مدتی خطای Connection timed out میده.سوال! من تو سمت Server متد accept رو نزاشتم فراخانی بشه، پس چرا خروجی client.py مقدار OK بود و خطا نداد؟ متد connect که تو سمت Client وجود داره میاد یک Three-Way Handshake رو با Server انجام میده و وقتی این Three-Way Handshake کامل بشه، میره سراغ خط بعد که در نتیجه OK چاپ میشه. connect ارتباطی با accept نداره چون اون سمت Server هست و connect فقط وظیفش اینه که یک Connection-Oriented با سرور برقرار کنه، حالا اینکه سرور اون درخواست رو accept کنه یا نه به خودش مربوطه ولی تا اینجای داستان connect تو وظیفه ی خودش موفق بوده و خطا نداد.سوال بعدی! من برای listen تعیین کردم که فقط 1 نفر بتونه تو صف انتظار بمونه. چرا وقتی ترمینال اول هنوز accept نشده، ترمینال دوم تونسته یک Three-Way Handshake انجام بده و همراه با ترمینال اول بره داخل صف انتظار؟ بزار خیلی ساده بگم! عددی که من به listen ورودی میدم، میتونه تو سیستم عامل های مختلف یکم بزرگتر در نظر گرفته بشه، هر سیستم عامل ممکنه رفتار متفاوتی نسبت به این عدد نشون بده که دلایل فنی داره و من نمیخوام بیام ریز بشم که چرا و چطور! فقط این رو بدونید که برمیگرده به کرنل سیستم عامل.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

client.send(b&quot;Hello Client&quot;)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(s.recv(1024))وقتی Server تو حالت listen باشه و یک Client بهش درخواست بزنه، اون رو accept میکنه، پیام Hello Client رو براش ارسال میکنه و برنامه یا سوکت بسته میشه. من میخوام Server همیشه تو حالت listen بمونه. برای اینکار میتونم کدم رو بدین شکل تغییر بدم:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

while True:
    client, address = s.accept()

    print(f&quot;New Connection: {address}&quot;)

    client.send(b&quot;Hello Client&quot;)داخل حلقه while متد accept رو فراخانی کردم، برنامه روی اون متد منتظر میمونه تا درخواستی بیاد و قبولش کنه. وقتی درخواستی رو قبول کرد، print اجرا میشه و بعد از اون هم یک پیغامی به سمت Client فرستاده میشه. بعد از این موارد، مجدد حلقه تکرار میشه و برنامه روی accept منتظر میمونه تا درخواست دیگه ایی بیاد و قبولش کنه.اگه بخوام ارتباطم رو یکبار accept کنم و دستورات مربوط به ارسال پیام مدام اجرا بشه:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

while True:
    msg = input(&quot;Enter message: &quot;).encode()

    client.send(msg)وقتی این کد رو برای Server نوشتم باید سمت Client هم به شکلی کد رو بنویسم که مدام بیاد داده ایی رو دریافت و نمایش بده:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

while True:
    print(s.recv(1024).decode())فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

while True:
    client, address = s.accept()

    print(f&quot;New Connection: {address}&quot;)

    msg = input(&quot;Enter Message: &quot;).encode()
    client.send(msg)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

print(s.recv(1024))یه ترمینال باز میکنم و فایل server.py رو اجرا میکنم که روی accept منتظر میمونه.یه ترمینال دیگه باز میکنم و client.py رو اجرا میکنم. به محض اجرا شدن عبارت Connect Successfully رو چاپ میکنه و روی متد recv منتظر میمونه تا داده ایی از سمت سرور ارسال بشه. همچنین تو ترمینال Server عبارت New Connection به همراه اطلاعات Client چاپ میشه.توی ترمینال مربوط به Server پیام Hi رو مینویسم و Enter میزنم که این پیام سمت کلاینت ارسال میشه و نمایش میده.بعد این مراحل سوکت کلاینت بسته میشه اما سوکت سرور همچنان باز و روی حالت listen قرار داره (چون داخل حلقه نوشتم)یبار دیگه client.py رو اجرا میکنم ولی تو سمت سرور پیامی رو ارسال نمیکنم، یعنی رو همون recv منتظر میمونه.یه ترمینال دیگه هم باز میکنم و client.py رو اجرا میکنم، به محض اجرا شدن عبارت Connect Successfully رو نمایش میده که یعنی Three-Way Handshake رو تونسته با سرور انجام بده اما تو ترمینال مربوط به Server عبارت New Connection چاپ نمیشه چون درخواست هنوز accept نشده و توی صف قرار گرفته.اگه من توی ترمینال سرور عبارت Hello رو بنویسم و Enter بزنم، پیغام برای ترمینال اول ارسال میشه و سوکت بسته میشه، بعدش درخواست ترمینال دوم که داخل صف قرار داشت، accept میشه و حالا میتونم به اون یک پیغامی رو ارسال کنم.سوالی که به وجود میاد اینه که هر سوکت یا Client رو چطور جداگانه ذخیره کنم تا بصورت همزمان بتونم با چندین Client ارتباطم رو داشته باشم؟! برای این مورد باید از برنامه نویسی چندنخی کمک بگیریم و هر Client رو به یک thread اختصاص بدیم. شاید بعدها این مورد رو توضیح دادم.یه سوال دیگه. چطور با Client (فرضا یه دونه کلاینت) ارتباط Full-Duplex داشته باشم؟ ارتباط Full-Duplex یعنی بصورت همزمان هم بتونم ارسال انجام بدم و هم دریافت داشته باشم. خود پروتکل TCP بصورت Full-Duplex کار میکنه اما متدهایی مثل recv توی socket باعث میشن برنامه بلاک بشه تا زمانی که داده ایی دریافت کنه. برای حل این مشکل میتونیم send و recv رو داخل thread های جدا تعریف کنیم.سوکت نویسی با UDP به چه شکله؟UDP چون Connectionlessعه به متدهایی مثل listen و accept تو سمت سرور و به متد connect تو سمت کلاینت احتیاجی نداره.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.bind((&quot;localhost&quot;, 50111))

data, client = s.recvfrom(1024)
print(f&quot;from: \&quot;{client}\&quot; data: \&quot;{data}\&quot;&quot;)

s.sendto(b&quot;Hi Client&quot;, client)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

s.sendto(b&quot;Hi&quot;, (&quot;localhost&quot;, 50111))

data, server = s.recvfrom(1024)

print(f&quot;from \&quot;{server}\&quot; data: \&quot;{data}\&quot;&quot;)متد send و recv متدهایی هستن که داخل Object مربوط به Client در TCP وجود دارن. چون از UDP استفاده کردم، سوکت خاصی رو نساختم و بنابراین باید از متدهای sendto و recvfrom که داخل خود s یا Object اصلی socket وجود دارن استفاده کنم.متد recvfrom تا زمانی که بسته ایی براش ارسال نشه بلاک میمونه و وقتی چیزی ارسال بشه، اون رو دریافت میکنه و داده رو داخل data ذخیره میکنه. همچنین اطلاعات کسی که داده رو ارسال کرده بصورت Tuple درون server قرار میده. متد sendto داده و مشخصات کسی که داده رو باید براش ارسال کنه رو میگیره.بررسی متد send و recv در TCP Connection.زمانی که ارتباط بین دو سوکت برقرار میشه، باید با متدهای send و recv بسته هایی رو ارسال و دریافت کنیم و بعد از اتمام کار، با متد close سوکت رو ببندیم.متد send یک ورودی رو بصورت byte دریافت میکنه و به سمت مقصد ارسال میکنه. این متد، هم برای Client وجود داره و هم برای Server.زمانی که داده ایی به سمت مقصد ارسال میشه، اون داده وارد بافر سیستم عامل میشه. متد recv میاد از بافر، اطلاعاتی که به سمت سوکت اومده رو دریافت و برمیگردونه. تو ورودی این متد باید حداکثر تعداد بایتی که میخوام از بافر بیرون بکشه رو مشخص کنم. برای مثال:s.recv(1024)اینجا گفتم 1024 بایت رو برام بیرون بکش. اگه متد recv صدا زده بشه ولی چیزی توی بافر نباشه (یعنی send تو طرف مقابل انجام نشده باشه) برنامه بلاک میشه و منتظر میمونه داده ایی داخل بافر قرار بگیره و بعد بیرون بکشه.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

client.send(b&quot;Hello&quot;)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(s.recv(1))خروجی فایل client.py:b&#039;H&#039;ورودی متد recv رو 1 قرار دادم که یعنی فقط 1 بایت از بافر بیرون بکشه و فقط کاراکتر اول عبارت Hello رو برگردوند. فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

while True:
    msg = s.recv(1).decode()

    if msg == &quot;&quot;:
        break

    print(msg)خروجی:H
e
l
l
oاز سمت سرور یکبار send انجام شد و اون مقادیر داخل بافر مقصد قرار گرفتن، حالا client.py هربار میره 1 بایت از بافر بیرون میکشه، بررسی میکنه که آیا چیزی که بیرون کشیده با یک رشته خالی برابر هست یا نه، اگه برابر نبود همون رو چاپ میکنه و اگه برابر بود حلقه شکسته میشه.متد recv محدودیتی برای تعیین حداکثر بایت نداره ولی باید به منابع سیستم نگاه کنیم و یه عدد معقول رو قرار بدیم.یه متد دیگه وجود داره به اسم sendall که اگه بخوام خلاصه بگم، نسخه بهتر و قابل اطمینان تر متد sendعه و پیشنهاد میکنم از این متد استفاده کنید.یه توضیح راجب non-blocking بدم. متد recv همینطور که گفته شد وقتی داده ایی داخل بافر نباشه میره روی حالت بلاک. به دو روش میتونیم این رفتار رو تغییر بدیم. روش اول:s.setblocking(False)
# معادل
s.settimeout&#40;0.0&#41;تو این حالت، recv اصلا منتظر نمیمونه، به محض اجرا شدن و نبودن داده داخل بافر، خطای BlockingIOError رو اجرا میکنه. روش دوم:s.settimeout&#40;3&#41;تو این روش، recv سه ثانیه منتظر میمونه و بعد خطای BlockingIOError رو اجرا میکنه :)چطوری فایل ارسال/دریافت کنم؟فرقی نداره حجم فایل چقدره، همیشه باید فایل رو با یک اندازه مشخص به قطعه های کوچیک تقسیم و ارسال کنیم. فرضا یه فایل دارم با حجم 50MB و میخوام ارسالش کنم. میام هربار 64KB از فایلم رو میخونم و ارسال میکنم و تو مقصد هربار 64KB دریافت میشه و داخل فایل، write میکنه.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(&quot;Connection OK&quot;)

input(&quot;Send?&quot;)
with open(&quot;send.mp4&quot;, &quot;rb&quot;) as mp4:
    chunk = mp4.read(65536) # 64KB

    while chunk:
        client.sendall(chunk)
        chunk = mp4.read(65536)فایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connec with Server is OK&quot;)

with open(&quot;recv.mp4&quot;, &quot;wb&quot;) as mp4:
    data = s.recv(65536) # 64KB

    while data:
        mp4.write(data)
        data = s.recv(65536)تو سمت Server وقتی فایل به انتها میرسه و متد recv فراخانی میشه، چون چیزی برای خوندن نمونده مقدارb&#039;&#039;داخل متغیر chunk قرار میگیره. میدونید که این مقدار حالت False داره و وقتی برای شرط مربوط به حلقه while ازش استفاده کردم، یعنی تا زمانی حلقه اجرا بشه و عمل خوندن/ارسال انجام بشه که، چیزی داخل chunk قرار گرفته باشه. با این کار هم تو سمت Client و هم تو سمت Server حلقه رو تا زمانی جلو میبرم که مقادیری برای خوندن و ارسال وجود داشته باشه و حلقه همیشه اجرا نمونه.متد close و بستن سوکت.بعد از ساخت سوکت، برقراری ارتباط و تبادل داده ها، نوبت به پایان ارتباط و بستن سوکت میرسه.متد close زمانی که صدا زده میشه، سوکت ساخته شده رو نابود و منابع مربوط به اون هم آزاد میکنه، همچنین مقدار زیر هم به سمت طرف مقابل ارسال میکنه تا طرف مقابل متوجه بشه که سوکت بسته شده:b&#039;&#039;فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

while True:
    msg = input(&quot;Message for send to client: &quot;)

    if msg != &quot;exit&quot;:
        client.send(msg.encode())
    else:
        client.close()
        breakفایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

while True:
    msg = s.recv(1024)

    if msg:
        print(f&quot;from server: {msg.decode()}&quot;)
    else:
        s.close()
        breakاگه ارتباط از یک سمت بصورت ناگهانی قطع بشه (یعنی بدون close)، بسته ایی برای طرف مقابل ارسال نمیشه و ما باید با مدیریت خطاها یا موارد مربوط به timeout این موضوع رو مدیریت کنیم.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

while True:
    msg = input(&quot;Message for send to client: &quot;)

    if msg != &quot;exit&quot;:
        client.send(msg.encode())
    else:
        client.close()
        breakفایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

while True:
    msg = s.recv(1024)

    if msg:
        print(f&quot;from server: {msg.decode()}&quot;)
    else:
        s.close()
        breakفایل server و client رو اجرا میکنم و برنامه تو سمت سرور روی input بلاک میشه و تو سمت client هم روی recv بلاک میشه. تو سمت سرور داده ایی رو مینویسم و enter میزنم، این داده به سمت client ارسال میشه و client از حالت بلاک خارج، و داده رو نمایش میده. چون از while استفاده کردم، کلاینت تو recv دوباره بلاک میشه و server هم تو input.میام فایل client رو میبندم، تو سمت سرور داده ایی رو مینویسم و enter میزنم، سرور اون داده رو با متد send ارسال میکنه و خطایی برنمیگرده (در صورتی که من فایل client رو بستم و اون سوکت وجود نداره)مجدد روی input قفل میشه که من چیزی مینویسم و enter میزنم، الان دوباره متد send میخواد اجرا بشه ولی خطای BrokenPipeError میده.چرا بار اول که متد send اجرا شد و سوکت کلاینت بسته شده بود خطا دریافت نکردم و بار دوم خطا داد؟حقیقتا دلیل فنیش خیلی پیچیده و تخصصیه ولی اگه بخوام ساده توضیح بدم، باید بگم که...ارسال (send) اولی موفق بود چون داده رو تو بافر خروجیِ، کرنل گذاشت! یعنی هنوز کرنل خبر نداشت یا FIN/RST از طرف مقابل پردازش نشده بود که ارتباط قطع شده. بین send اول و دوم، کرنل فهمید که طرف مقابل ارتباط رو بسته، پس وقتی دوباره send کردم، خطای EPIPE تولید شد که پایتون تبدیلش میکنه به BrokenPipeError.خطای BrokenPipeError یعنی میخوام با سوکتی ارتباط بگیرم یا به سوکتی ارسال و دریافت داشته باشم که بسته شده.فایل server.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((&quot;localhost&quot;, 50111))

s.listen(1)

client, address = s.accept()

print(f&quot;New Connection: {address}&quot;)

while True:
    try:
        msg = input(&quot;Message for send to client: &quot;)

        if msg != &quot;exit&quot;:
            client.send(msg.encode())
        else:
            client.close()
            break

    except BrokenPipeError:
        print(&quot;Connection Closed&quot;)
        client.close()
        breakفایل client.py:import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((&quot;localhost&quot;, 50111))

print(&quot;Connect Successfully&quot;)

while True:
    msg = s.recv(1024)

    if msg:
        print(f&quot;from server: {msg.decode()}&quot;)
    else:
        s.close()
        breakتو کدهای بالا من سوکت اصلی که تو متغیر s ذخیره شده رو نبستم. دقت کنید هرجا که ارتباط قراره کلا قطع بشه، باید سوکت اصلی رو هم close کنیم.ساخت یک Port Scan با کمک socket.پورت اسکن یعنی بررسی کنیم چه پورت هایی روی یک سیستم باز هستن و گوش میدن.موقع اتصال به یک پورت، سه حالت ممکنه رخ بده:Open: سوکت به مقصد وصل میشه. یعنی روی اون پورت یه سرویس در حال گوش دادن وجود داره.Closed: مقصد بلافاصله میگه این پورت و سرویس، فعال نیست (به شکل RST برمیگرده).Filtered: مثلا فایروال وسطه و اجازه نمیده بفهمی پورت بازه یا بسته. معمولا نتیجشش میشه timeout یا reset مبهم.متدی وجود داره به اسم connect_ex که بعد از درخواست به پورت، عددی رو برمیگردونه، اگه اون عدد 0 باشه یعنی پورت بازه و اگه هرچیز دیگه ایی باشه یعنی پورت بستس.import socket

for port in range(1, 65536):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout&#40;1&#41;

    result = s.connect_ex((&quot;localhost&quot;, port))

    if result == 0:
        print(f&quot;port [{port}] is open&quot;)

    s.close()با timeout زمان انتظار رو تنظیم میکنم و اگه نزارم، connect_ex ممکنه 30 ثانیه برای هر پورت منتظر بمونه.کتابخونه socket تو کد بالا سعی میکنه یک Three-Way Handshake کامل با هر پورت انجام بده.شما بجای localhost میتونید IP یکی دیگه از دستگاه های LAN رو وارد کنید.برای مرور و درک بهتر سعی کنید کدهای زیر رو خودتون بنویسید و نتیجش رو ببینید.فایل server.py:import socket

main_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
main_socket.bind((&quot;localhost&quot;, 50111))
main_socket.listen(1)
print(f&quot;Server on \&quot;localhost\&quot; and port \&quot;50111\&quot;&quot;)
client, address = main_socket.accept()
print(f&quot;\nConnect Successfully. Client IP: {address[0]} Client Port: {address[1]}\n\n&quot;)

while True:
    from_client = client.recv(1024)
    if not from_client:
        client.close()
        break

    print(f&quot;from client: {from_client.decode()}&quot;)

    to_client = input(&quot;Enter message for send: &quot;)
    if to_client.lower() == &quot;exit&quot;:
        client.close()
        break

    client.sendall(to_client.encode())فایل client.py:import socket

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.connect((&quot;localhost&quot;, 50111))
print(&quot;Connect with \&quot;localhost:50111\&quot; Successfully\n\n&quot;)

while True:
    to_server = input(&quot;Enter message for send: &quot;)
    if to_server.lower() == &quot;exit&quot;:
        server.close()
        break
    
    server.sendall(to_server.encode())

    from_server = server.recv(1024)
    if not from_server:
        server.close()
        break
    
    print(f&quot;from server: {from_server.decode()}&quot;)داخل کتابخونه socket یسری متدهایی وجود داره که من اسمشون رو میزارم متدهای کمکی، بریم با چندتا از این متدها آشنا بشیم.socket.gethostbyname(&quot;google.com&quot;) # 142.250.151.100
# این متد یه دامنه رو میگیره و آیپی مربوط بهش رو برمیگردونه

socket.gethostbyaddr(&quot;8.8.8.8&quot;) # &#039;dns.google&#039;, [], [&#039;8.8.8.8&#039;])
# این متد یه آیپی رو میگیره و نام هاست یا دامنه رو برمیگردونه

print(socket.gethostname())
# این متد اسم کامپیوتر فعلی رو برمیگردونه

print(socket.gethostbyname_ex())
# این متد نسخه پیشرفته تر متد بالاست و یک اسم رو میگیره، اسم اصلی، لیست اسم های مستعار و لیست آیپی هارو برمیگردونه.

print(socket.getservbyname(&quot;http&quot;)) # 80
# این متد اسم یک سرویس رو میگیره و پورت مربوط بهش رو برمیگردونه

print(socket.getservbyport(80)) # http
# این متد یک پورت رو میگیره و سرویس مربوط بهش رو برمیگردونهبه آخر مقاله رسیدیم :)خسته نباشید و امیدوارم که براتون مفید بوده باشه.من که انرژی زیادی ازم رفت بخوام این مقاله رو بنویسم و لطف کنید با نظرات ارزشمندتون، انرژی از دست رفته من رو برگردونید ❤</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Wed, 03 Dec 2025 15:34:29 +0330</pubDate>
            </item>
                    <item>
                <title>مسئله اي ترکیبی ازریاضیات وبرنامه نویسی وفضای چندبعدی را حل کنیم.</title>
                <link>https://virgool.io/codenevis/%D9%85%D8%B3%D8%A6%D9%84%D9%87-%D8%A7%D9%8A-%D8%AA%D8%B1%DA%A9%DB%8C%D8%A8%DB%8C-%D8%A7%D8%B2%D8%B1%DB%8C%D8%A7%D8%B6%DB%8C%D8%A7%D8%AA-%D9%88%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%88%D9%81%D8%B6%D8%A7%DB%8C-%DA%86%D9%86%D8%AF%D8%A8%D8%B9%D8%AF%DB%8C-%D8%B1%D8%A7-%D8%AD%D9%84-%DA%A9%D9%86%DB%8C%D9%85-y9hgo5iiba3n</link>
                <description>ماخونمون أنارفروشي داریم ازدوستان وآشنایان هرکدوم خواستید درخدمتتان هستیم.کدوم کس کشی قسمت اجتماعی دیوارمن را پاک کرد؟کدوم زن جنده ای این فحش هایی که نوشته بودم را پاک کرده است.چه ربطی دارد به زبان های برنامه نویسیریاضیاتفضای چندبعدی؟من أنارش را مي فروشمبقيه ازاین ارتباط ها استفاده می کنندالان حداقل ده سال است که اینطوری است یاهست یا بوده استولی من تازه فهمیدممشکل اش چی بود که فهمیدی؟تمام اعضای بدنم به خاطر این کلک هایی که بهم زده بودند ازبین رفته است.کارت چیه؟من برای سازمان بحران کارمی کنم هرمکانی میروم دعوامی کنم یک بحرانی درست شود.کدوم حروم زاده ای این قسمت هایی که نوشته بودم را پاک کرد یاپاک می کند.برای وصل شدن اینترنتم الان به سه تا شرکت درون ایران متصل شدمشرکت همراه اولشرکت مخابراتبانک تجارتدفعه ی قبل به سه تابانک وصل شدمبعد تازه می پرسند کارت چیهوچراعصبی هستی؟کیرتوکون ایران وزیرساخت هایش برود.میان می برنتکیرم را هم نمیتوانند بخورندمی برنت وقتی دررابازکنی بهت قرص می دهند پس من درخیابان آذرهستم هنوزاره ترسو اونجاییکس کش حرومزاده برای چی هرروز من را می بری اونجابرای این که کارنداریکیرم تو اون اروقت برود.ازدستشون شکایت کون یاکن.من ازدست سرورهایی که زبان ندارند حرف بزنندو اینترنت من را قطع می کنند و ارتباط من را دست این وان می دهند شکایت می کنم بعد به کی به قاضی های بی سوادی که حتی نمی دونند سرورچیه؟من ازدست نظام های ارتباط انسانی که ندونسته برای من دوست و دوستی بسازد شکایت دارم خوب هنوز این بخش قانونی ساخته نشده است آخه من ازدست کی شکایت کنم.بگذارید آتیشش بخوابد مگه کاری کرده اید که بخواهم آتیشی شوم.قبلا هم بهتان گفته ام بی خودی من را لایک نکنیدطوبا وطنخواه@toobavatankhahمحتوای شما با محتوای من چه سنخیتی ندارد که محتوای من را لایک می کنید.اخه لایک کردن محتوا که دیگه چه مشکلی داره یا داردمشکلی درلایک کردن محتوا نیست مشکل دراین است اون حساب کاربری و اکانتی که اسم ومشخصات ات را درونش برای اعتماد کردن بهت گذاشته ای اون نیستی کس دیگری استی یا هستی کی هستم همین مشکل همینه که چه کسی استی یا هستی که محتوای من را لایک می کنی و خیلی خوب من را هم می شناسی.تو ازکجا می دونی که من تورا می شناسم ازروی محتوایت.کلا همه ی مردم دنبال این هستند که دختری بهش پیام بدهد یا لایک شان کند که ارتباط با دختری داشته باشند خوب مشکل همین است یا همین جاست یا همین بوده است که درطول زندگی من هیچ دختری اصلا نه به من پیام داده است نه با من ارتباط برقرارکرده است و تمام مرد بوده اند و با کلک دخترانه با من ارتباط برقرارکرده اند یا ارتباط برقرارکرده اند و اصلا اجازه ارتباط با من را نداشته اند مگر درارتباط خاصی با مراتب خاصی مشکل کلا درطول زندگی من همین بوده است که می گویی.همانطورکه دودوقلیون وقلیان تو را خمار می کند همانطورهم ازحالت های بدت خارج ات می کند.کی می رسی به چیزی که مابهت می گوییممگه چی کارمی کنید اونی که هستم نیستم می شوم و نیازاست که به چیزی که شما می گویید برسم به جای این که من خودم بخواهم به چیزی که می خواهم برسم!یادت هست پدرت مرده است آره یادم هست که پدرم را کشتید همان دستبندی که به زنم داده بودم و ازمشهد آورده بودم همان را برادرم ازکربلا برای ام اُورد دیگه می خواهید چه کسی را بکشید درزندگی من مادرم را که کشتید پدربزرگ را هم کشتید دیگه می خواهید چه کسی را درزندگی من بکشید تا به چیزهایی که می خواهید برسید به چه کسی داری می گویی من خودم هم نمی دانم ولی به زن صیغه ای دائم وموقت ام می گویم دریک دنیایی و به کسانی که با من درارتباط هستند می گویم دردنیاهای مختلف.این برادری که نوشتی کیه؟برادرم هست نه برادرکسی است یا ارتباطی است یا هست که باهاش درارتباط هستی خوب این کیه معلوم نیست کیه ما فقط می دونیم چه کسی هست یااست چه نیازی باشخصی درارتباط باشم که نیاز باشد درارتباط با برادرش باشم قاعده های ارتباطی دنیا اینطوریه دست من وتونیست.اولین عنوان ات چی بود؟بگذاریک مسئله ترکیبی از ریاضیات و برنامه نویسی و فضای چند بعدی را حل کنیمبگ بعلاوه ذاراست دقیقا بگ یعنی کیف انگلیسی و ذار هم یعنی عزا.پس چرا پاک کردی این عنوان را من اینطوری فکرنمی کنم درمورد موضوعات.چطوری فکرمی کنی درمورد ریاضیاتش فکرمیکنم و کارمی کنم چه فایده ای دارد نمیدونم چه فایده ای دارد ولی اینطوری فکرکرده ام الان هم اینطوری فکرمیکنم.نمی خواهی آدم بشوی راستش را بخواهی خیلی سعی می کنم ولی هرچی سعی می کنم نمی دونم آدم هاچطوری زندگی می کنند که همانطور زندگی کنم.هرجا میروی بشین روح ات تغذیه کند بعد هرکاری خواستی بکنی بکن یا بوکون.فعلا چیزی توی ذهنم نیست که بخواهم بوکون یا بوک کنم.درکمتراز3روز عنوان من توسط موتورجستجوی گوگل ایندکس شده است شناسایی شده است ولی یک مشکلی است یاهست چی این که من درون ارتباط هیچ کدوم یا کدام ازاین مسائل نیستم وفقط درارتباط فحش قانونی بودم چرایی اش را خودم هم نمیدانم.کد کامل: HTML + CSS + JavaScript (بردار از صفر تا صد)index.html&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;fa&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;title&gt;Vector Space Shape&lt;/title&gt;
&lt;style&gt;
  body {
    background:#111;
    display:flex;
    justify-content:center;
    align-items:center;
    height:100vh;
  }
  canvas {
    background:#000;
    border:2px solid #fff;
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;canvas id=&quot;c&quot; width=&quot;600&quot; height=&quot;600&quot;&gt;&lt;/canvas&gt;


// ---- فضای برداری -----
// تعریف یک کلاس برای بردارها (R^2)
class Vec {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  add(v) { return new Vec(this.x + v.x, this.y + v.y); }
  mul(a) { return new Vec(this.x * a, this.y * a); }
}

// ----------------------
// بردار موقعیت پارامتریک  r(t)
function r(t) {
  let v1 = new Vec(Math.cos(3*t), Math.sin(3*t)).mul(150);
  let v2 = new Vec(Math.cos(t), Math.sin(t)).mul(50);
  return v1.add(v2);   // ترکیب خطی → a*v1 + b*v2
}

// ----------------------
let canvas = document.getElementById(&quot;c&quot;);
let ctx = canvas.getContext(&quot;2d&quot;);

function draw() {
  ctx.clearRect(0,0,600,600);

  ctx.translate(300,300);  // مرکز مختصات

  ctx.strokeStyle = &quot;cyan&quot;;
  ctx.lineWidth = 2;
  ctx.beginPath();

  let start = r(0);
  ctx.moveTo(start.x, start.y);

  for (let t=0; t&lt;Math.PI*2; t+=0.01) {
    let p = r(t);   // بردار موقعیت
    ctx.lineTo(p.x, p.y);
  }

  ctx.stroke();
  ctx.resetTransform();
}

draw();

&lt;/body&gt;
&lt;/html&gt;داشتیم روی این مسئله کارمی کردیم که چطورکلاس وبردار دراین کدنویسی یا زبان برنامه نویسی جاوااسکریپت ساخته شده است ومی خواستیم این قسمت اش را بررسی کنیم.// ---- فضای برداری -----
// تعریف یک کلاس برای بردارها (R^2)
class Vec {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  add(v) { return new Vec(this.x + v.x, this.y + v.y); }
  mul(a) { return new Vec(this.x * a, this.y * a); }
}این قسمت اش را می خواستیم بررسی کنیم چطوری ساخته شده استadd(v) { return new Vec(this.x + v.x, this.y + v.y); }به چگونگی محاسبات ریاضی اش نمی تونی برسی چون خیلی جزئی می شود نیازبه تمرکزدارد وسکوت دارد بعد فضای ارتباطی درون ذهنت دچارمشکل شده است واعصاب ات را بهم می ریزند سرچیزهای کوچیک یا کوچک بعد دچارمشکل می شوی تاهرجایی که توانستی بروی بسه یا مشکلی نیست یا کافیه یا کافی است نمی خواهد بیشتر ازاین خودت را اذیت کنی که بدونی چطور این مسئله حل شده است.کمی درموردکلاس هادرون جاوااسکریپت مطالعه کردم چون نحوه ی کارکردش رایادم رفته بودمی گوید دوتا ورودی دارد این کلاسclass Vec {
  constructor(x, y) {دوتا هم مقداراولیه دارد یا می گیرد   this.x = x;
    this.y = y;
  }این مسئله را می خواهیم حل کنیم که این قسمت چطورازفضای برداری استفاده می کندadd(v) { return new Vec(this.x + v.x, this.y + v.y); }یعنی ترکیبی ازریاضیات و برنامه نویسی وفضای چندبعدی.مقداردهی کلاس را قبلا کارکردیم.Vec(5,10)تواول بگو کلاس چطوری ازروی ریاضیات ساخته شده است بعد به استفاده کردن ازکلاس بپرداز.برداشتن یا تعریف یا نمونه ای ازیک کلاسconst test= new Vec(5, 10);دراین کلاس تعریف شده// ---- فضای برداری -----
// تعریف یک کلاس برای بردارها (R^2)
class Vec {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  add(v) { return new Vec(this.x + v.x, this.y + v.y); }
  mul(a) { return new Vec(this.x * a, this.y * a); }
}اصلا نگفته است که ورودی اش چه نوعی باشدعدد باشد یا حرف باشدعدد باشد یا کاراکترباشدعدد باشد یا غیرکاراکتری باشد؟افرین مسئله یا یکی ازمسائل بردارها یا تفاوتش با عددها یاحرف ها یا کاراکترها همینه این است یا اینه که به نوع خاصی وابسته نیست یا نیستند.حال ببینیم درون این کلاسی که تعریف کرده ایم چی نهفته است.Vec {x: 5, y: 10}x: 5y: 10[[Prototype]]: Objectadd: ƒ add(v)length: 1name: &quot;add&quot;arguments: (...)caller: (...)[[FunctionLocation]]: VM132:8[[Prototype]]: ƒ ()[[Scopes]]: Scopes[3]constructor: class Veclength: 2name: &quot;Vec&quot;prototype: {add: ƒ, mul: ƒ}arguments: (...)caller: (...)[[FunctionLocation]]: VM132:4[[Prototype]]: ƒ ()[[Scopes]]: Scopes[3]mul: ƒ mul(a)length: 1name: &quot;mul&quot;arguments: (...)caller: (...)[[FunctionLocation]]: VM132:9[[Prototype]]: ƒ ()[[Scopes]]: Scopes[3][[Prototype]]: Objectconstructor: ƒ Object()hasOwnProperty: ƒ hasOwnProperty()isPrototypeOf: ƒ isPrototypeOf()propertyIsEnumerable: ƒ propertyIsEnumerable()toLocaleString: ƒ toLocaleString()toString: ƒ toString()valueOf: ƒ valueOf()__defineGetter__: ƒ defineGetter__()__defineSetter__: ƒ defineSetter__()__lookupGetter__: ƒ lookupGetter__()__lookupSetter__: ƒ lookupSetter__()__proto__: (...)get proto: ƒ proto()set proto: ƒ proto()چراحالت کشویی دارد یا دارهدوباره آفرین برای این دقت ات چراچون حالت کشویی اش یا لایه لایه اش دقیقا علت تعریف یا ساخت کلاس می باشدچه ربطی به ریاضیات داردیا داره؟راستش رابخواهی الان نمی توانم یا فضای ذهنی اش را ندارم بگویم ریاضیات درونش چی می باشد یا چطورساخته می شود یا شده است.خوب الان این برداری که ساختی به این شکلconst test= new Vec(5, 10);چه نتیجه ای ازاین کلاس// ---- فضای برداری -----
// تعریف یک کلاس برای بردارها (R^2)
class Vec {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  add(v) { return new Vec(this.x + v.x, this.y + v.y); }
  mul(a) { return new Vec(this.x * a, this.y * a); }
}به مامی دهد؟وقتی دومقدارداشته باشد یعنی نقطه به مامی دهد؟یعنی الان ما یک نقطه داریم با دومقدار؟یعنی ما با دوتاعدد یا نقطه ساختیم؟یعنی مایک بردارداریم با دوتا مقدار؟add(v) { return new Vec(this.x + v.x, this.y + v.y); }این یعنی یک برداربا دوتامقدار؟Vec(this.x + v.x, this.y + v.y);چون ورودی اش دوتامقدارداره یا داردمعنی نقطه را می دهد؟آره دیگه نقاط درکنارهم تشکیل خط درفضا می دهند یعنی این جمع پشت اش یعنی جمع نقاط است ؟add(v) { return new Vec(this.x + v.x, this.y + v.y); }یک طوردیگری:یعنی ما برای ساخت یک نقطه درون کامپیوترمان به این همه مقدار/ویژگی نیازداریم؟يكباراين قسمت را عكس گرفتی.پس این ضربه چیه؟اگراین مقداردهی نقطه می سازد و جمع پشت اش خط می سازد؟mul(a) { return new Vec(this.x * a, this.y * a); }یعنی الان درون این خط کدنویسی جاوااسکریپت نقاط درهم ضرب می شوند؟وقتی نقاط درهم ضرب شوند چی می سازند؟الان درحال چه کاری هستیم یک هدف گذاری کنیم.الان درحال واکشی ارتباط یا مسئله ی این کلاس هستیم.ببینم درونش چی می گذرد.الان مشکل ات چیه؟محاسبه ی این مسئله را نمیفهممadd(v) { return new Vec(this.x + v.x, this.y + v.y); }mul(a) { return new Vec(this.x a, this.y a); }این قسمت یک نقطه می سازدclass Vec {constructor(x, y) {this.x = x;this.y = y;}}این قسمت هم نقاط را فراخوانی می کند// ---- فضای برداری -----// تعریف یک کلاس برای بردارها (R^2)class Vec {constructor(x, y) {this.x = x;this.y = y;}add(v) { return new Vec(this.x + v.x, this.y + v.y); }mul(a) { return new Vec(this.x a, this.y a); }}بگذارببینیم این اجراکننده مرورگرگوگل کروم نتیجه ی شکلی هم نشان می دهد.هنوزنفهمیدی که کدچی کارمی کند می خواهی رسم اش کنی یاکونی نه می خواهم به این مسئله برسم که فهم ریاضی من نسبت به کدی که نوشته است و با نتایج اش چه فرقی داره یا چه فرقی می کند یا کرده است.ولی مسئله ی خیلی جالبی درستهنه درست نیستچراچون هیچ ارگان سازمانی که درون آن ریاضی درس داده می شود درمورد این مسئله هنوز هیچ نظری نداده است ونگفته است که نظرشان درمورد این طراحی مسئله من چی است یاهست بوده است دربعد ریاضی اش نه ولی دربعد انسان شناسی اش چرا خیلی نظرداده اند.راستش رابخواهی تا همین جا که رسیدم دوبار ریدم توی دستشویی فکرکنم بس باشم فکرکنم روزی یک بار دستم را یاانگشتم را توی کونم بکنم کافی باشد نه این که چندبارتوی کونم بکنم چون گهگاهی هم دردداره.راه حل این مسائل چیه ؟راه حل اش اینه که بروی پایین مگه پایین نبودم .کارکردن روی این مسائل ذهن من را خسته می کند و تاثیری بدی روی خانواده ام می گذارد لطفا دیگه ازاین مسائل برای من طراحی نکنید.مسائلی که نوشتم درمورد دعواوجروبحث و اعصاب وروانم به خصوص درمحیط خانواده ام به همین خاطر بوده است.نه قربونت همان یک مطلبی که ازمن برداشتید و توی حساب کاربری تان یا اکانتتان گذاشته اید برای شناختم همان کافی است دیگه مطلبی ازمن درون حساب کاربری تان یا اکانت یا هراسم کفت و زهرماری که داره نگذاریدcodenevisمن حتی خونه ای که تویش زندگی می کنم عاریه وقرضی است و هردفعه صاحبش می آید ازم پس می گیرد و من دائم توی پارک ها و خیابان ها وت وول می شوم چیزی از من برندارید یا درون حساب هایتان نگذارید که معلوم نیست برای چه کسی است یاهست استفاده می کنید بعد صاحبانشان پیدام می کنند من نوشته ام یا من کارکرده ام می آیند دنبالم یا سراغم.اگرمیبینی من مطلی درمورد ریاضیات می نویسم یا برنامه نویسی برای این است که می خواهم مغز نمیرد یا زنده بماند درارتباط با دیگران سیستم های ارتباطی.اینهایی که می نویسم واقعیت زندگی من است!نه شوخی می کنم نه دنبال فروتنی یا تواضع هستم.آره با زوروقدرت تمام دنیا برای من است ولی کی جواب بعد ازانجام هرزوروقدرتی را می دهد؟برای فیلم دیدن باید چی کارکرد؟مسئله خوب همینهاین که تو فیلم ببینی درون یک ارتباطی هستی یا استی که ایندیدن فیلم ات را به دیگران می فروشند.اول باید ارتباط غیرپشت فیلم را برای مغزت بسازی.وقتی دربدنت احساس مومی کردی گرگ بودیخوب هرحیوانی بدنتش ممکنه مو داشته باشد.چه ربطی داره یا دارد.پات چرایک دفعه یک احساسی درونش شدبه خاطرایمیل هایی است یاهست که کردم یا پیداکردم ودسته بندی کردممگه دسته بندی هم روی اعضای بدن تاثیرمی گذارد؟خره هرکسی برای خودش مراتبی دارد یا دارهنه این که فقط تومراتبی داریکمرت درد میگیره خیلی باهاشون مقاومت نکن.داره جالب میشه نه اَبله نمی دونی یا نمی فهمی داره چی میگهازطرفی درست میگه یادگیری این مسئله که ایمیل وکدنویسی و برنامه نویسی تشکیل این مسئله را می دهد که خلق جدیدی می سازی و باژن های جدیدیازطرف داره تمام کارهایت را می رینه توش چون اینطوری اگر فکرکنی یا کونی که کارهایی که می کنی انسان هایی یا موجوداتی می سازی نصف انسان و نصف حیوان باعث ترس ات میشه دیگه ازاین نوع کارها تاآخرعمرت نمی کنی یانمی کونی حالا ازمن گفتن بود.دیگه هرزری بزنی فایده ای نداره چون دیگه فهمیدم مسئله اش چی بوده است یا هست.ازنشانه های انسان بودنت اینه که می رینییعنی اگرروغن برینی انسان نیستی؟نه دیگه نیستی یعنی ماهی هستی یعنی چهخوب ماهی بخوری روغن داره روغن میرینیخوب انسانی که کون نداشته باشد اسم اش چیه؟آدم جانی آدم جانیه استهرچقدرهم بهش محبت کنیهرچقدرهم محبت داشته باشی نسبت بهشتچراچون شغل وکاروزندگی اش اینهوحیات زندگی هرکسی به شغل وکارش متصله یا وصله.آره مادرم داره روی پله هایمان چسب می چسباندو ضربه می زند ولی مادرهای ما یا مادرمن یامادرت این کارها رانمی کند چرا.حالا فهمیدیحالا فهمیدمخوب اون موقع تومی دونستی این مثال وعلت هاآره می دونستم ولی به چه کسی نگو.مسئله ی من برنامه نویسی یا زبان برنامه نویسی اش نیست مسئله ی من جهان و دنیای ریاضیات پیاده سازی شده درون کدهای زبان های برنامه نویسی می باشد و این که چطور فضای چندبعدی توسط این کدها ساخته می شوند.موفق باشیدبه امید خدا</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>knowledgecomputer2023</author>
                <pubDate>Sat, 29 Nov 2025 14:09:44 +0330</pubDate>
            </item>
                    <item>
                <title>مهم‌ترین مهارت های لازم برای پیشرفت در برنامه نویسی</title>
                <link>https://virgool.io/codenevis/%D9%85%D9%87%D9%85-%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%87%D8%A7%D8%B1%D8%AA-%D9%87%D8%A7%DB%8C-%D9%84%D8%A7%D8%B2%D9%85-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%BE%DB%8C%D8%B4%D8%B1%D9%81%D8%AA-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-xtqgrxw1vibe</link>
                <description>مهارت های لازم برای پیشرفت در برنامه نویسیتو دنیای امروز که فناوری با سرعتی بی‌سابقه درحال پیشرفته، برنامه نویسی به یکی از مهارت‌های کلیدی و حیاتی تبدیل شده. اما تو این حوزه، صرف داشتن دانش پایه کافی نیست و پیشرفت و موفقیت تو این فیلد کاری رقابتی، شناخت و تسلط روی مهارت های لازم برای پیشرفت در برنامه نویسی ضروریه. این مهارت‌ها هم به ارتقای کیفیت کدها و پروژه‌ها کمک می‌کنن و هم زمینه‌ساز رشد حرفه‌ای و فرصت‌های شغلی بهتر می‌شن. تو این مقاله، به بررسی مهم‌ترین مهارت‌هایی می‌پردازیم که برنامه‌نویس‌ها باید اون‌ها رو یاد بگیرن و توسعه بدن.مهارت‌های فنی اساسیبرای موفقیت و پیشرفت تو حوزه برنامه نویسی، تسلط روی مهارت‌های فنی اساسی ضروریه. این مهارت‌ها زیربنای توسعه نرم‌افزارهای با کیفیت و کارآمد رو تشکیل می‌دن.تسلط بر زبان‌های برنامه نویسی مهمزبان‌های برنامه نویسی ابزارهای اصلی برنامه‌نویس‌ها محسوب می‌شن. آشنایی عمیق با زبان‌های پرکاربردی مثل Python، Java، JavaScript، C# و مابقی زبان‌های مرتبط، امکان توسعه پروژه‌های متنوع رو فراهم می‌کنه. انتخاب زبان مناسب بسته به نیاز پروژه و بازار کار، قدمی مؤثر تو پیشرفت حرفه‌ایه.درک عمیق الگوریتم‌ها و ساختمان داده‌هاالگوریتم‌ها و ساختمان داده‌ها پایه‌های حل مسائل پیچیده و بهینه‌سازی عملکرد برنامه‌ها محسوب می‌شن. توانایی طراحی و پیاده‌سازی الگوریتم‌های کارآمد و مدیریت ساختارهای داده‌ای، باعث افزایش سرعت و کیفیت نرم‌افزارها می‌شن.کار با ابزارهای توسعه و کنترل نسخه (مانند Git)ابزارهای توسعه مثل محیط‌های برنامه‌نویسی (IDE) و سیستم‌های کنترل نسخه مثل Git، امکان مدیریت بهتر کدها و همکاری تیمی رو فراهم می‌کنن.  داشتن مهارت تو استفاده از این ابزارها به بهبود فرایند توسعه، کاهش خطاها و هماهنگی بین اعضای تیم کمک می‌کنه.مهارت‌های نرم و رفتاریپیشرفت تو برنامه نویسی فقط به دانش فنی محدود نمی‌شه؛ مهارت‌های نرم و رفتاری هم نقش خیلی مهمی تو موفقیت برنامه‌نویس‌ها ایفا می‌کنن.توانایی حل مسئله و تفکر تحلیلیبرنامه‌نویس‌ها باید بتونن مسائل پیچیده رو به بخش‌های کوچکتر تقسیم کنن و راه‌حل‌های مؤثر و بهینه ارائه بدن. تفکر تحلیلی به اون‌ها کمک می‌کنه تا مشکلات رو به صورت منطقی بررسی کنن و بهترین روش رو برای رفع اون انتخاب کنن.یادگیری مداوم و به‌روزرسانی دانشدنیای فناوری به سرعت در حال تغییر و دگرگونیه و ابزارها، زبان‌ها و روش‌های جدید هر روز ظهور می‌کنن. بنابراین، برنامه‌نویس‌های موفق کسانی‌ان که همواره در حال یادگیری و به‌روزرسانی دانش خود باشن و با تغییرات همراه بشن.مهارت‌های ارتباطی و همکاری تیمیبرنامه‌نویسی اغلب به صورت تیمی انجام می‌شه و توانایی برقراری ارتباط مؤثر با اعضای تیم، مدیران پروژه و حتی مشتریان اهمیت زیادی داره. مهارت‌های ارتباطی خوب باعث تسهیل همکاری، جلوگیری از سوءتفاهم‌ها و افزایش بهره‌وری تیم می‌شن.مهارت‌های تخصصی پیشرفتهبرای پیشرفت چشمگیر تو مسیر برنامه نویسی، تسلط روی مهارت‌های تخصصی پیشرفته ضروریه. این مهارت‌ها باعث افزایش کیفیت و قابلیت توسعه نرم‌افزارها می‌شن.طراحی نرم‌افزار و معماری سیستم‌هادرک اصول طراحی نرم‌افزار و معماری سیستم‌ها به برنامه‌نویس‌ها کمک می‌کنه تا کدهایی ساختارمند، قابل نگهداری و توسعه‌پذیر بنویسن. این مهارت نقش مهمی تو مدیریت پروژه‌های بزرگ و پیچیده داره و باعث می‌شه تا نرم‌افزارها در طول زمان به‌راحتی به‌روزرسانی بشن.تست نرم‌افزار و رفع اشکال (دیباگینگ)اطمینان از عملکرد صحیح و بدون خطا بودن برنامه‌ها از طریق تست‌های مختلف و مهارت تو دیباگینگ، بخش مهمی از فرایند توسعه نرم‌افزار محسوب می‌شه. این توانایی‌ها به بهبود کیفیت نهایی محصول و کاهش مشکلات بعداز انتشار کمک می‌کنن.آشنایی با مباحث امنیت تو برنامه نویسیامنیت نرم‌افزار یکی از چالش‌های مهم دنیای فناوریه. برنامه‌نویس‌ها باید با اصول امنیتی آشنا باشن تا از نفوذ، سرقت داده‌ها و آسیب‌پذیری‌های احتمالی جلوگیری کنن. توجه به امنیت تو طراحی و کدنویسی، تضمین‌کننده اعتماد کاربران به محصوله.راهکارهای تقویت مهارت های لازم برای پیشرفت در برنامه نویسیبرای تبدیل شدن به یه برنامه‌نویس موفق و پیشرفت تو مسیر حرفه‌ای، به جز آشنایی با مهارت‌های لازم برای پیشرفت در برنامه نویسی، باید به طور مستمر در جهت تقویت این مهارت‌ها تلاش کرد. تو ادامه به چند راهکار کاربردی اشاره می‌کنیم:استفاده از منابع آموزشی معتبر: استفاده از کتاب‌ها، دوره‌های آنلاین، و ویدئوهای آموزشی تخصصی می‌تونه دانش فنی و مهارت‌های نرم شما رو ارتقا بده. منابعی مثل دوره‌های دانشگاهی، وب‌سایت‌های آموزشی و پلتفرم‌های تخصصی به روز، بهترین گزینه‌ها هستن.تمرین عملی و انجام پروژه‌های واقعی: بهترین روش برای تسلط روی مهارت‌ها، اجرای پروژه‌های واقعی یا نمونه‌ست. این کار به شما کمک می‌کنه تا مهارت‌هاتون رو تو شرایط عملی و چالش‌های واقعی بهبود بدین.شرکت تو دوره‌ها و کارگاه‌های تخصصی: حضور تو دوره‌ها، کارگاه‌ها و وبینارهای تخصصی علاوه بر یادگیری مطالب جدید، فرصتی برای شبکه‌سازی و آشنایی با مابقی برنامه‌نویس‌ها رو هم فراهم می‌کنه.استفاده از فرصت‌های شغلی و آموزشی معتبر: استفاده از پلتفرم‌های کاریابی و آموزشی می‌تونه نقش مهمی تو ارتقای مهارت‌ها و پیشرفت حرفه‌ای داشته باشه. برای مثال، وب‌سایتی مثل جابینجا منابع متنوعی از فرصت‌های شغلی مرتبط با برنامه‌نویسی رو ارائه می‌ده که این فرصت‌ها می‌تونن مسیر یادگیری و رشد رو برای برنامه‌نویس‌ها هموار کنن.جمع‌بندیپیشرفت تو حوزه برنامه نویسی نیازمند تسلط روی مجموعه‌ای از مهارت‌های فنی و نرمه که به صورت همزمان باید توسعه داده بشن. مهارت های لازم برای پیشرفت در برنامه نویسی شامل دانش عمیق زبان‌های برنامه نویسی، درک الگوریتم‌ها و ساختمان داده‌ها، توانایی حل مسئله، یادگیری مستمر، مهارت‌های ارتباطی و تخصص تو زمینه‌هایی مثل طراحی نرم‌افزار، تست و امنیته.استمرار تو یادگیری و تعهد به توسعه فردی، کلید اصلی رسیدن به پیشرفت پایدار تو این حوزه پرتلاطم و پررقابته.</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>careerlog</author>
                <pubDate>Fri, 28 Nov 2025 22:46:33 +0330</pubDate>
            </item>
                    <item>
                <title>خداحافظ گیت‌هاب، سلام کدبرگ: کوچ بزرگ ریپازیتوری اصلی زیگ</title>
                <link>https://virgool.io/codenevis/%D8%AE%D8%AF%D8%A7%D8%AD%D8%A7%D9%81%D8%B8-%DA%AF%DB%8C%D8%AA-%D9%87%D8%A7%D8%A8-%D8%B3%D9%84%D8%A7%D9%85-%DA%A9%D8%AF%D8%A8%D8%B1%DA%AF-%DA%A9%D9%88%DA%86-%D8%A8%D8%B2%D8%B1%DA%AF-%D8%B1%DB%8C%D9%BE%D8%A7%D8%B2%DB%8C%D8%AA%D9%88%D8%B1%DB%8C-%D8%A7%D8%B5%D9%84%DB%8C-%D8%B2%DB%8C%DA%AF-ibs5h7ciebw0</link>
                <description>زبان برنامه‌نویسی زیگ (Zig) رسماً ریپازیتوری اصلی خود را از گیت‌هاب به کدبرگ (Codeberg) منتقل کرد. این تصمیم که از مدت‌ها قبل مورد بحث بود، نشان‌دهنده تعهد زیگ به تمرکززدایی، متن‌باز بودن واقعی و دوری از وابستگی به پلتفرم‌های متمرکز تحت مالکیت شرکت‌های بزرگ است. کدبرگ یک پلتفرم غیرانتفاعی مبتنی بر جامعه است که بر اساس Gitea (یک فورک متن‌باز از گیت‌هاب) ساخته شده و بر ارزش‌های آزادی نرم‌افزار و حریم خصوصی کاربران تاکید دارد.انتقال شامل ریپازیتوری اصلی زیگ (ziglang/zig) و همچنین سایر ریپازیتوری‌های مرتبط با اکوسیستم زیگ است. این اقدام با هدف تقویت کنترل جامعه بر توسعه زیگ و کاهش خطرات ناشی از تغییرات سیاستی یا مالکیت گیت‌هاب انجام شده است. اندرو کلی، رهبر پروژه زیگ، در بیانیه‌ای اعلام کرد که این انتقال گامی حیاتی برای تضمین آینده‌ای پایدار و مستقل برای زیگ است.این تصمیم پس از بررسی دقیق گزینه‌های مختلف و نظرسنجی از جامعه زیگ اتخاذ شد. کدبرگ به دلیل تعهد به متن‌باز بودن، حریم خصوصی و عدم وابستگی به سرمایه‌گذاری خطرپذیر، به عنوان بهترین گزینه انتخاب شد. اگرچه گیت‌هاب همچنان یک پلتفرم محبوب و قدرتمند است، نگرانی‌ها در مورد مالکیت مایکروسافت و احتمال تغییر سیاست‌ها باعث شد تا زیگ به دنبال جایگزینی مستقل‌تر باشد.فرآیند انتقال به تدریج انجام شده و شامل انتقال کد، تاریخچه، مسائل (issues) و درخواست‌های ادغام (pull requests) است. تیم زیگ ابزارهایی را برای تسهیل انتقال برای توسعه‌دهندگانی که در این پروژه مشارکت دارند، ارائه کرده است. این انتقال ممکن است در کوتاه‌مدت باعث ایجاد اختلالاتی شود، اما انتظار می‌رود در بلندمدت به نفع پایداری و استقلال زیگ باشد.این اقدام زیگ بازتابی از یک روند رو به رشد در بین پروژه‌های متن‌باز است که به دنبال کاهش وابستگی به پلتفرم‌های متمرکز و تقویت کنترل جامعه بر توسعه خود هستند. این انتقال می‌تواند الهام‌بخش سایر پروژه‌ها برای بررسی جایگزین‌های متن‌باز و تمرکززدایی شده باشد.**چرا این مطلب مهم است؟**انتقال ریپازیتوری زیگ از گیت‌هاب به کدبرگ نشان‌دهنده یک تغییر پارادایم در دنیای متن‌باز است. این حرکت نه تنها استقلال و پایداری زیگ را تضمین می‌کند، بلکه الگویی برای سایر پروژه‌ها ارائه می‌دهد که به دنبال کنترل بیشتر بر سرنوشت خود هستند. این تصمیم می‌تواند تاثیر قابل توجهی بر آینده توسعه نرم‌افزار متن‌باز و توزیع قدرت در اکوسیستم فناوری داشته باشد. این رویداد نشان می‌دهد که جامعه متن‌باز به طور فزاینده‌ای نسبت به تمرکز و کنترل شرکت‌های بزرگ حساس است و به دنبال جایگزین‌های مستقل‌تر و پایدارتر است.منبع:https://ziglang.org/news/migrating-from-github-to-codeberg/</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>علیرضا داودی نیا</author>
                <pubDate>Thu, 27 Nov 2025 10:50:28 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش برنامه نویسی قسمت 15 (thread در زبان C++):</title>
                <link>https://virgool.io/codenevis/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%82%D8%B3%D9%85%D8%AA-13-thread-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-c-vuemlat0yf1u</link>
                <description>مولتی‌تردینگ یعنی اجرای چند جریان (Thread) به‌صورت همزمان در یک برنامه. هر ترد یک مسیر اجرایی مستقل دارد، اما تمام تردها حافظه‌ی مشترک برنامه (Shared Memory) را به اشتراک می‌گذارند.مزایا:افزایش سرعت اجرای برنامه‌ها به خصوص در پردازش‌های سنگین.پاسخگویی بهتر برنامه‌های رابط کاربری (UI) و سرویس‌ها.امکان اجرای کارهای مستقل همزمان.معایب / چالش‌ها:همزمانی دسترسی به منابع مشترک → نیاز به Synchronization.پیچیدگی در طراحی و دیباگ.امکان بروز Deadlock یا Race Condition.تردها در C++C++11 به بعد، کلاس std::thread را معرفی کرده که کار با تردها را ساده کرده است.۲-۱. ایجاد یک ترد ساده#include &lt;iostream&gt;
#include &lt;thread&gt;

void printMessage() {
    std::cout &lt;&lt; &quot;Hello from thread!&quot; &lt;&lt; std::endl;
}

int main() {
    std::thread t(printMessage); // ترد جدید ساخته و اجرا شد
    t.join(); // منتظر پایان ترد می‌مانیم
    return 0;
}توضیح:std::thread t(func) یک ترد جدید اجرا می‌کند.t.join() برنامه اصلی را متوقف می‌کند تا ترد کامل شود.۲-۲. چند ترد همزمان#include &lt;iostream&gt;
#include &lt;thread&gt;

void printNumbers(int start, int end) {
    for (int i = start; i &lt;= end; ++i) {
        std::cout &lt;&lt; i &lt;&lt; &quot; &quot;;
    }
    std::cout &lt;&lt; std::endl;
}

int main() {
    std::thread t1(printNumbers, 1, 5);
    std::thread t2(printNumbers, 6, 10);

    t1.join();
    t2.join();

    return 0;
}خروجی ممکن است متفاوت باشد چون تردها همزمان اجرا می‌شوند و ترتیب چاپ ثابت نیست.۲-۳. استفاده از داده‌ی مشترک و Mutexهنگامی که چند ترد می‌خواهند به داده‌ی مشترک دسترسی داشته باشند، باید از Mutex برای جلوگیری از Race Condition استفاده کنیم.#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;mutex&gt;

int counter = 0;
std::mutex mtx;

void incrementCounter(int times) {
    for (int i = 0; i &lt; times; ++i) {
        mtx.lock();   // ورود به بخش بحرانی
        ++counter;
        mtx.unlock(); // خروج از بخش بحرانی
    }
}

int main() {
    std::thread t1(incrementCounter, 1000);
    std::thread t2(incrementCounter, 1000);

    t1.join();
    t2.join();

    std::cout &lt;&lt; &quot;Counter: &quot; &lt;&lt; counter &lt;&lt; std::endl;
    return 0;
}توضیح:بدون mtx ممکن بود مقدار counter کمتر از 2000 شود، زیرا دسترسی همزمان باعث Overwrite می‌شود.mutex تضمین می‌کند فقط یک ترد به بخش بحرانی دسترسی دارد.۲-۴. مثال پیشرفته:مدلی کلاسیک در مولتی‌تردینگ که در آن یک ترد داده تولید می‌کند و ترد دیگر مصرف می‌کند.#include &lt;iostream&gt;
#include &lt;thread&gt;
#include &lt;queue&gt;
#include &lt;mutex&gt;
#include &lt;condition_variable&gt;

std::queue&lt;int&gt; dataQueue;
std::mutex mtx;
std::condition_variable cv;
bool finished = false;

void producer(int n) {
    for (int i = 1; i &lt;= n; ++i) {
        std::unique_lock&lt;std::mutex&gt; lock(mtx);
        dataQueue.push(i);
        std::cout &lt;&lt; &quot;Produced: &quot; &lt;&lt; i &lt;&lt; std::endl;
        lock.unlock();
        cv.notify_one(); // اطلاع دادن به مصرف‌کننده
    }
    finished = true;
    cv.notify_one();
}

void consumer() {
    while (true) {
        std::unique_lock&lt;std::mutex&gt; lock(mtx);
        cv.wait(lock, [] { return !dataQueue.empty() || finished; });

        while (!dataQueue.empty()) {
            int val = dataQueue.front();
            dataQueue.pop();
            std::cout &lt;&lt; &quot;Consumed: &quot; &lt;&lt; val &lt;&lt; std::endl;
        }

        if (finished) break;
    }
}

int main() {
    std::thread prod(producer, 10);
    std::thread cons(consumer);

    prod.join();
    cons.join();

    return 0;
}
توضیح:condition_variable باعث می‌شود مصرف‌کننده منتظر تولید داده باشد.Mutex از دسترسی همزمان به صف جلوگیری می‌کند.الگوی کلاسیک تولیدکننده-مصرف‌کننده (Producer-Consumer) را نشان می‌دهد.قبل از ساختن Thread:بعد از ساختن Thread:Telegram: @CaKeeganGmail : amidgm2020@gmail.com</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>سید عمید قائم مقامی</author>
                <pubDate>Wed, 26 Nov 2025 17:45:44 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش برنامه نویسی قسمت 13 ( عملگر new و delete در زبان C++):</title>
                <link>https://virgool.io/codenevis/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%82%D8%B3%D9%85%D8%AA-12-%D8%B9%D9%85%D9%84%DA%AF%D8%B1-new-%D9%88-delete-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-c-dflvlgiwihpn</link>
                <description>عملگرهای new و delete در C++مدیریت حافظه پویا (Dynamic Memory Management) یکی از ویژگی‌های مهم زبان C++ است. این کار معمولاً با استفاده از دو عملگر اصلی انجام می‌شود:new برای تخصیص حافظهdelete برای آزادسازی حافظه1. چرا به حافظهٔ پویا نیاز داریم؟در حالت معمولی، وقتی یک متغیر را داخل تابع تعریف می‌کنید، روی استک (Stack) ذخیره می‌شود و با پایان یافتن بلوک کد، از بین می‌رود.اما گاهی نیاز داریم:مقدار حافظه در زمان اجرا (Runtime) تعیین شود.داده‌ها تا زمانی که خودمان بخواهیم باقی بمانند.ساختارهای بزرگ (مثل آرایه‌های بزرگ) داشته باشیم.در چنین مواقعی به حافظهٔ هیپ (Heap) نیاز داریم که با new و delete کنترل می‌شود.2. عملگر new در C++عملگر new حافظه را در هیپ رزرو می‌کند و آدرس آن را برمی‌گرداند.مثال ساده:int* ptr = new int;
*ptr = 10;

cout &lt;&lt; *ptr; // خروجی: 10در این مثال:با new int یک خانهٔ حافظه روی هیپ ساختیم.آدرس آن در پوینتر ptr ذخیره شد.مقدار 10 در آن خانه ذخیره کردیم.تخصیص همزمان با مقداردهی.int* p = new int(25);3. تخصیص حافظه برای آرایه‌هابرای آرایه‌ها از new[] استفاده می‌کنیم:int* arr = new int[5];
arr[0] = 10;
arr[1] = 20;4. آزادسازی حافظه با deleteهر حافظه‌ای که با new گرفته می‌شود حتماً باید با delete آزاد شود؛ وگرنه نشتی حافظه (Memory Leak) پیش می‌آید.مثال:int* ptr = new int;
*ptr = 10;

// آزادسازی
delete ptr;5. آزادسازی آرایه‌ها با delete[]int* arr = new int[5];

// ...

delete[] arr;اگر از delete بدون [] برای آرایه استفاده کنید، برنامه دچار رفتار نامشخص (Undefined Behavior) می‌شود.6. خطاها و نکات مهم1. هر new باید یک delete داشته باشد.اگر فراموش کنید، برنامه کم‌کم حافظه را از دست می‌دهد.2. هرگز یک آدرس آزادشده را دوباره آزاد نکنید.این کار خطرناک و غیرقابل پیش‌بینی است:delete ptr;
delete ptr; // خطا3. بعد از delete بهتر است پوینتر را nullptr کنید.delete ptr;
ptr = nullptr;4. برای مدیریت امن حافظه از smart pointer استفاده کنید.مثال:#include &lt;iostream&gt;
using namespace std;

int main() {
    // تخصیص یک عدد
    int* x = new int(50);
    cout &lt;&lt; &quot;x = &quot; &lt;&lt; *x &lt;&lt; endl;

    // تخصیص یک آرایه
    int* arr = new int[3];
    arr[0] = 5;
    arr[1] = 10;
    arr[2] = 15;

    cout &lt;&lt; &quot;Array: &quot;;
    for(int i = 0; i &lt; 3; i++)
        cout &lt;&lt; arr[i] &lt;&lt; &quot; &quot;;

    // آزادسازی حافظه
    delete x;       // برای متغیرها
    delete[] arr;   // برای آرایه‌ها

    return 0;
}Telegram: @CaKeeganGmail : amidgm2020@gmail.com</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>سید عمید قائم مقامی</author>
                <pubDate>Tue, 25 Nov 2025 15:49:32 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای مسیر شغلی برنامه ‌نویسی</title>
                <link>https://virgool.io/codenevis/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D9%85%D8%B3%DB%8C%D8%B1-%D8%B4%D8%BA%D9%84%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-ddegs7ahjqol</link>
                <description>مسیر شغلی برنامه ‌نویسیبرنامه‌نویسی این‌روزا یکی از پراهمیت‌ترین مسیرهای شغلی تو حوزه فناوری محسوب می‌شه و افراد خیلی زیادی به دنبال ورود یا پیشرفت تو مسیر شغلی برنامه نویسی هستن. تنوع نقش‌ها، امکان رشد سریع و نیاز گسترده بازار کار باعث شده که این حوزه برای علاقه‌مندان، به مسیری جذاب و قابل اتکا تبدیل بشه.تو این راهنما تلاش شده که تصویری روشن از مهم‌ترین گرایش‌ها، مهارت‌های پایه، مسیرهای یادگیری و روش‌های ورود به بازار کار مسیر شغلی برنامه ‌نویسی ارائه بشه. هدف اینه که خواننده بتونه با آگاهی از فرصت‌ها و چالش‌ها، مسیر مناسب خودش رو انتخاب کنه و برای آینده حرفه‌ای‌اش برنامه‌ریزی دقیق‌تری داشته باشه.آشنایی با انواع مسیرهای برنامه ‌نویسیورود به مسیر شغلی برنامه نویسی بدون شناخت دقیق از نقش‌ها و گرایش‌های موجود، می‌تونه باعث سردرگمی و اتلاف زمان بشه. هر حوزه از برنامه‌نویسی ویژگی‌ها، ابزارها و فرصت‌های شغلی خاص خودش رو داره و انتخاب درست می‌تونه مسیر رشد حرفه‌ای فرد رو تسهیل کنه.۱. فرانت‌اند (Front-end):تمركز این حوزه روی توسعه بخش ظاهری و قابل مشاهده وب‌سایت‌ها و اپلیکیشن‌هاست. مهارت‌هایی مثل HTML، CSS و JavaScript تو این مسیر ضروری‌ان.۲. بک‌اند (Back-end):تو این بخش، منطق اصلی سیستم، مدیریت دیتا و ارتباط با پایگاه داده طراحی و پیاده‌سازی می‌شه. زبان‌هایی مثل Python، Java، Node.js و PHP تو این مسیر رایج‌ان.۳. فول‌استک (Full-stack):برنامه‌نویس فول‌استک توانایی کار هم‌زمان تو فرانت‌اند و بک‌اند رو داره. این مسیر برای افرادی مناسبه که به تنوع کار و یادگیری گسترده علاقه‌مندن.۴. توسعه موبایل:این حوزه شامل ساخت اپلیکیشن‌های اندروید و iOSه. Android با Kotlin و Java توسعه پیدا می‌کنه و iOS با Swift.۵. علم داده و هوش مصنوعی:تمرکز این مسیر روی تحلیل داده، یادگیری ماشین و مدل‌های هوش مصنوعیه. Python، کتابخانه‌های مرتبط و دانش ریاضی تو این زمینه نقش کلیدی دارن.۶. DevOps:مسیر DevOps روی یکپارچه‌سازی توسعه و عملیات متمرکزه و برای اطمینان از استقرار پایدار و سریع سیستم‌ها استفاده می‌شه. آشنایی با CI/CD، Docker و لینوکس تو این بخش ضروریه.مهارت‌های پایه برای شروع مسیر شغلی برنامه‌ نویسیشروع موفق تو مسیر شغلی برنامه نویسی نیازمند تسلط روی مجموعه‌ای از مهارت‌های بنیادینه؛ مهارت‌هایی که تو یادگیری ابزارها و فناوری‌های پیشرفته‌تر نقشی زیربنایی دارن و مسیر رشد فرد رو هموار می‌کنن.۱. آشنایی با منطق برنامه‌نویسی:درک مفاهیمی مثل متغیرها، شرط‌ها، حلقه‌ها و توابع اولین قدم برای ورود به هر شاخه از برنامه‌نویسیه. این مفاهیم تو همه زبان‌های برنامه‌نویسی مشترک‌ان.۲. انتخاب یک زبان پایه:یادگیری یه زبان ساده و پرکاربرد مثل Python یا JavaScript می‌تونه شروع مناسبی باشه. این زبان‌ها منابع آموزشی فراوانی دارن و برای ورود به حوزه‌های مختلف قابل استفاده‌ان.۳. ساختار داده‌ها و الگوریتم‌ها:تسلط روی ساختارهایی مثل آرایه، لیست، صف و درخت، و آشنایی با الگوریتم‌های رایج، باعث حل سریع‌تر مسائل و درک عمیق‌تر کد می‌شه.۴. کار با Git و مدیریت نسخه:فرایند توسعه نرم‌افزار بدون استفاده از ابزارهایی مثل Git دشواره. این ابزار امکان کنترل تغییرات، همکاری تیمی و نگهداری نسخه‌های مختلف پروژه رو فراهم می‌کنه.۵. تمرین با پروژه‌های کوچک:ساخت پروژه‌های ساده بهترین روش تثبیت آموخته‌ها به شمار میاد. این پروژه‌ها بعداً به‌عنوان نمونه‌کار هم می‌تونن استفاده بشن و تو ادامه مسیر شغلی برنامه‌ نویسی ارزش بالایی دارن.تقویت این مهارت‌ها پایه‌ای محکم برای ورود به دنیای نرم‌افزار ایجاد و فرد رو برای انتخاب مسیرهای تخصصی آماده می‌کنه.انتخاب مسیر مناسب بر اساس اهداف فردیانتخاب یه مسیر تخصصی تو مسیر شغلی برنامه نویسی زمانی مؤثره که بر اساس شناخت دقیق از توانایی‌ها، علایق و هدف‌گذاری‌های فردی انجام بشه. هر شاخه از برنامه‌نویسی نیازمندی‌ها و ماهیت کاری متفاوتی داره و هماهنگ‌سازی اون با خصوصیات شخصی، شانس موفقیت رو به‌‌شکل چشمگیری افزایش می‌ده.۱. ارزیابی علاقه‌ها و ترجیحات:افرادی که به طراحی بصری و تعامل کاربر علاقه دارن، معمولاً تو فرانت‌اند عملکرد بهتری دارن؛ از اون طرف کسایی که از تحلیل منطق و مدیریت داده لذت می‌برن، مسیر بک‌اند رو مناسب‌تر می‌دونن.۲. بررسی توانایی‌ها و سبک یادگیری:بعضی مسیرها نیازمند تفکر ریاضی و تحلیلی عمیق‌تری‌ان (مثل علم داده)، در حالی که بعضی‌های دیگه روی خلاقیت و تجربه کاربری تأکید می‌کنن. شناخت سبک یادگیری کمک می‌کنه تا انتخاب واقع‌بینانه‌تری داشته باشیم.۳. تحلیل وضعیت بازار کار:آگاهی از نیازهای بازار، نقش مهمی تو تصمیم‌گیری داره. بررسی موقعیت‌های شغلی فعال؛ برای مثال تو پلتفرم‌هایی مثل جابینجا؛ به فرد نشون می‌ده که کدوم مهارت‌ها بیشترین تقاضا رو دارن و چه مسیری می‌تونه آینده شغلی مطمئن‌تری ایجاد کنه.۴. تعیین اهداف کوتاه‌مدت و بلندمدت:اگه هدف ورود سریع‌تر به بازار کار باشه، مسیرهایی مثل فرانت‌اند یا بک‌اند معمولاً مناسب‌ترن. اما اگه هدف فعالیت تو پروژه‌های پیشرفته‌تری مثل هوش مصنوعیه، زمان یادگیری طولانی‌تره اما طبیعتاً آینده حرفه‌ای هم متفاوت از حالت قبلیه.با ترکیب این عوامل، فرد می‌تونه مسیری رو انتخاب کنه که هم با توانایی‌هاش سازگار باشه و هم چشم‌انداز شفافی رو از پیشرفت حرفه‌ای تو مسیر شغلی برنامه نویسی ارائه بده.نقشه‌ی یادگیری برای هر مسیرتو مسیر موفقیت تو مسیر شغلی برنامه نویسی، داشتن یه نقشه‌ی یادگیری دقیق و منظم اهمیت خیلی زیادی داره. این نقشه به برنامه‌نویس‌ها کمک می‌کنه تا گام‌به‌گام مهارت‌های موردنیاز هر حوزه رو یاد بگیرن و تو زمان مناسب، تمرکز خودشون رو روی یادگیری تکنولوژی‌های مرتبط قرار بدن.۱. مسیر یادگیری فرانت‌اند:·       یادگیری HTML، CSS و JavaScript·       آشنایی با فریم‌ورک‌هایی مثل React، Angular یا Vue.js·       درک مفاهیم ریسپانسیو و طراحی تجربه کاربری (UI/UX)·       آشنایی با ابزارهای ساخت و تست کد (Webpack، Babel و غیره)۲. مسیر یادگیری بک‌اند:·       انتخاب یه زبان برنامه‌نویسی مثل Python، Java، PHP یا Node.js·       یادگیری کار با پایگاه داده‌ها (SQL و NoSQL)·       آشنایی با توسعه API و معماری RESTful·       یادگیری امنیت وب و مدیریت سرور۳. مسیر یادگیری فول‌استک:·       ترکیب مهارت‌های فرانت‌اند و بک‌اند·       توانایی مدیریت پروژه‌های کامل از طراحی تا اجرا·       تسلط روی ابزارهای DevOps و استقرار نرم‌افزار۴. مسیر یادگیری موبایل:·       یادگیری زبان‌های Kotlin/Java برای اندروید و Swift برای iOS·       آشنایی با فریم‌ورک‌های کراس‌پلتفرم مثل React Native یا Flutter·       درک چرخه عمر اپلیکیشن‌های موبایل و تست اون‌ها۵. مسیر یادگیری علم داده و هوش مصنوعی:·       تسلط بر Python و کتابخانه‌های NumPy، Pandas، TensorFlow و PyTorch·       یادگیری مفاهیم آمار، یادگیری ماشین و پردازش زبان طبیعی·       آشنایی با تحلیل داده‌های بزرگ و بصری‌سازی داده‌هابرای هر مسیر، زمان‌بندی یادگیری بسته به سطح شروع فرد و منابع آموزشی متفاوته، اما داشتن نقشه‌ای منظم و پیوسته کلید موفقیت تو مسیر شغلی برنامه نویسیه.ورود به بازار کار برنامه‌نویسیبعد از کسب مهارت‌های لازم و آماده‌سازی رزومه و پرتفولیو، قدم بعدی ورود به بازار کاره که نقش مهمی تو پیشرفت تو مسیر شغلی برنامه نویسی ایفا می‌کنه. موفقیت تو این مرحله نیازمند آمادگی کامل برای مصاحبه‌های فنیه؛ جایی که باید توانایی حل مسائل الگوریتمی، تسلط روی پروژه‌های قبلی و توانایی توضیح دقیق اون‌ها رو به نمایش بذارین.جستجوی فرصت‌های شغلی هم باید به صورت هدفمند انجام بشه؛ استفاده از پلتفرم‌های معتبر به پیدا کردن موقعیت‌های متناسب با مهارت‌ها و اهداف فرد کمک زیادی می‌کنه.به‌علاوه، کسب تجربه از طریق پروژه‌های فریلنسری، کارآموزی یا مشارکت تو پروژه‌های متن‌باز، باعث افزایش مهارت‌های عملی و تقویت شبکه ارتباطات حرفه‌ای می‌شه.همچنین، استمرار تو یادگیری و به‌روزرسانی مداوم دانش فنی، کلید ماندگاری و پیشرفت تو این مسیره. به این ترتیب، فرد می‌تونه با اعتمادبه‌نفس و مهارت‌های لازم جایگاه مناسبی تو بازار کار برنامه‌نویسی پیدا کنه و مسیر شغلیش رو با موفقیت ادامه بده.مسیر پیشرفت تو شغل برنامه‌نویسیپس از ورود به بازار کار، مسیر پیشرفت تو مسیر شغلی برنامه نویسی مستلزم یادگیری مداوم، توسعه مهارت‌ها و ارتقای نقش‌های شغلیه. با کسب تجربه بیشتر و تسلط روی فناوری‌های جدید، برنامه‌نویس‌ها می‌تونن به موقعیت‌های ارشدتر مثل توسعه‌دهنده ارشد (Senior Developer)، رهبر تیم (Tech Lead) و معمار نرم‌افزار (Software Architect) دست پیدا کنن. علاوه بر تخصص فنی، مهارت‌های نرم‌افزاری مثل مدیریت پروژه، ارتباط موثر و همکاری تیمی نقش مهمی تو ارتقاء شغلی دارن. همچنین مشارکت فعال تو جامعه‌های برنامه‌نویسی، شرکت تو دوره‌های آموزشی پیشرفته و دنبال کردن روندهای نوین فناوری، می‌تونن زمینه‌ساز توسعه حرفه‌ای پایدار باشن. به این ترتیب، مسیر پیشرفت نه فقظ به افزایش دانش فنی که به رشد همه‌جانبه مهارت‌ها و تجربیات فردی هم وابسته‌ست.جمع‌بندیمسیر شغلی برنامه نویسی راهی پرچالش اما پر فرصته که با برنامه‌ریزی دقیق، یادگیری مستمر و انتخاب آگاهانه مسیر تخصصی می‌شه توش به موفقیت‌های چشمگیری دست پیدا کرد. شناخت دقیق گرایش‌ها، تقویت مهارت‌های پایه، آماده‌سازی رزومه و پرتفولیو، و ورود هدفمند به بازار کار از گام‌های اساسی این مسیرن. همچنین پیشرفت تو این حوزه نیازمند ارتقای مهارت‌های فنی و نرم‌افزاری و بهره‌گیری از منابع معتبره. با پیروی از این راهنما، هر فرد می‌تونه مسیر شغلی برنامه نویسی‌ش رو به شکل بهینه مدیریت کنه و تو دنیای فناوری آینده‌ای روشن بسازه.</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>careerlog</author>
                <pubDate>Thu, 20 Nov 2025 23:38:22 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای کامل Regex برای سئوکاران: چگونه داده‌های GSC و GA4 را «جراحی» کنیم؟</title>
                <link>https://virgool.io/codenevis/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%DA%A9%D8%A7%D9%85%D9%84-regex-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%A6%D9%88%DA%A9%D8%A7%D8%B1%D8%A7%D9%86-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-gsc-%D9%88-ga4-%D8%B1%D8%A7-%D8%AC%D8%B1%D8%A7%D8%AD%DB%8C-%DA%A9%D9%86%DB%8C%D9%85-a3moliw2l9nv</link>
                <description>اگر در دنیای سئو فعالیت می‌کنید، احتمالاً هر روز با اقیانوسی از داده‌ها در ابزارهایی مانند Google Search Console و Google Analytics 4 سروکار دارید. همه ما آنجا بوده‌ایم: ساعت‌ها وقت صرف خروجی گرفتن در اکسل، استفاده از فیلترهای ساده «Contains» یا «Does not contain» و در نهایت، تلاشی نافرجام برای رسیدن به آن «بینش» (Insight) ارزشمندی که می‌دانیم جایی در میان داده‌ها پنهان شده است.اینجاست که مرز باریکی شکل می‌گیرد. مرز بین یک «اپراتور سئو» که صرفاً داده‌ها را گزارش می‌کند و یک «متخصص تکنیکال» که داده‌ها را جراحی می‌کند.ابزار این جراحی چیست؟ Regex (Regular Expressions).Regex یا «عبارات باقاعده»، زبان قدرتمندی برای «جستجوی الگوها» است. Regex یک زبان برنامه‌نویسی نیست؛ یک ابزار تحلیلی است. ابزاری که به شما اجازه می‌دهد به جای فیلترهای سطحی، دقیقاً به GSC یا GA4 بگویید دنبال چه الگویی از داده هستید.اگر تا امروز با دیدن گزینه «Custom (regex)» در سرچ کنسول، به‌سرعت از آن عبور می‌کردید، این مقاله برای شماست. در این راهنما، ما Regex را از یک مفهوم ترسناک، به قدرتمندترین ابزار تحلیلی شما تبدیل خواهیم کرد.چرا Regex دیگر یک «انتخاب» نیست، یک «ضرورت» است؟در گذشته، فیلترهای ساده کافی بودند. اما امروز، در مواجهه با ده‌ها هزار کوئری، هزاران صفحه فرود و رفتار پیچیده کاربران در GA4، اتکا به فیلترهای ساده مانند تلاش برای صید یک ماهی خاص با تور ماهیگیری در اقیانوس است.تسلط بر Regex به شما اجازه می‌دهد:دقت جراحی: دقیقاً همان چیزی را استخراج کنید که نیاز دارید، نه یک کلمه کمتر یا بیشتر.سرعت عمل: کاری که ساعت‌ها در اکسل زمان می‌برد را در چند ثانیه در خود ابزار انجام دهید.عمق تحلیل: الگوهایی را کشف کنید که از چشم ۹۰٪ رقبا پنهان می‌ماند.جعبه ابزار جراحی: کاراکترهای Regex که باید بدانیدقبل از ورود به اتاق عمل (GSC و GA4)، باید با ابزارهای اصلی آشنا شویم. نگران نباشید، شما فقط به چند کاراکتر کلیدی نیاز دارید:| (Pipe): به معنای «یا» (OR) است. (مثال: brand1|brand2 یعنی کوئری‌هایی که شامل «برند۱» یا «برند۲» هستند.)^ (Caret): به معنای «شروع با» (Starts with). (مثال: ^چگونه یعنی کوئری‌هایی که با کلمه «چگونه» شروع می‌شوند.)$ (Dollar): به معنای «پایان با» (Ends with). (مثال: html$ یعنی URLهایی که به .html ختم می‌شوند.).* (Dot-Star): این یک ترکیب جادویی است! نقطه . یعنی «هر کاراکتری» و ستاره * یعنی «صفر یا بیشتر». ترکیب این دو یعنی «هر چیزی».() (Parentheses): برای گروه‌بندی عبارات. (مثال: ^(چگونه|چطور|آیا) یعنی کوئری‌هایی که با «چگونه» یا «چطور» یا «آیا» شروع می‌شوند.)\ (Backslash): کاراکتر گریز (Escape). اگر بخواهید خود نقطه . را جستجو کنید (نه به معنای «هر کاراکتری»)، باید از \. استفاده کنید.حالا که ابزارها را می‌شناسیم، وارد اتاق عمل شویم.اتاق عمل اول: جراحی Google Search Console (GSC)سرچ کنسول، معدن طلای سئو است. Regex در GSC به شما اجازه می‌دهد این معدن را هوشمندانه کاوش کنید.مثال ۱: جداسازی کوئری‌های «برند» از «غیر برند»این یکی از پایه‌ای‌ترین و در عین حال مهم‌ترین تحلیل‌هاست.فیلتر عادی: باید ده‌ها فیلتر &quot;Doesn&#039;t contain&quot; برای نام برند، اشتباهات املایی برند و... بسازید.جراحی با Regex:1️⃣ به تب Performance بروید و روی فیلتر کوئری کلیک کنید.2️⃣ Custom (regex) را انتخاب کنید.3️⃣ Doesn&#039;t match regex را انتخاب کنید.4️⃣ در کادر، نام برند و تمام مشتقات آن را با | جدا کنید:virgool|virgoul|ویرگول|ویر گولنتیجه: شما با یک خط کد، تمام کوئری‌های واقعی و غیر-برند (Non-Brand) که برای شما ورودی آورده‌اند را می‌بینید.مثال ۲: پیدا کردن فرصت‌های محتوایی (کوئری‌های پرسشی)شما می‌خواهید تمام کوئری‌های پرسشی (Content Gap) که رتبه زیر ۲۰ دارند را پیدا کنید.فیلتر عادی: غیرممکن است.جراحی با Regex:یک فیلتر کوئری از نوع Custom (regex) و Matches regex بسازید.الگوی زیر را وارد کنید:1️⃣ ^(چگونه|چطور|کجا|آیا|چرا|بهترین)2️⃣ حالا یک فیلتر Position اضافه کنید و Greater than 10 (یا ۲۰) را انتخاب کنید.نتیجه: شما لیستی از تمام مقالات بالقوه و فرصت‌های بهینه‌سازی محتوای موجود را در چند ثانیه پیدا کرده‌اید.مثال ۳: فیلتر کردن URLهای یک بخش خاص (مثلاً /blog/)فیلتر عادی: استفاده از &quot;Contains&quot; کلمه blog ممکن است URLهای دیگری مثل /category/blog-tips/ را هم بیاورد.جراحی با Regex:فیلتر Page را روی Custom (regex) و Matches regex بگذارید.الگوی زیر را وارد کنید:^https://yourdomain.com/blog/.*نتیجه: دقیقاً تمام URLهایی که با /blog/ شروع می‌شوند (و نه هیچ چیز دیگر) فیلتر می‌شوند.اتاق عمل دوم: جراحی Google Analytics 4 (GA4)در GA4، رجکس حتی حیاتی‌تر است، خصوصاً در ساختن سگمنت‌ها، Audienceها و گزارش‌های Exploration.مثال ۱: ساخت سگمنت برای بازدیدکنندگان «وبلاگ»شما می‌خواهید رفتار کاربرانی که «حداقل یک بار» از وبلاگ بازدید کرده‌اند را تحلیل کنید.جراحی با Regex:1️⃣در یک Explore، یک سگمنت جدید بسازید.2️⃣ Condition را بر اساس Page path قرار دهید.3️⃣ فیلتر را روی matches regex بگذارید.4️⃣ الگوی زیر را وارد کنید:^/blog/نتیجه: شما سگمنتی از تمام کاربران علاقه‌مند به محتوای وبلاگ دارید و می‌توانید رفتار، نرخ تبدیل و مسیر آن‌ها را تحلیل کنید.مثال ۲: پاکسازی دیتای Referral (ورودی‌های اسپم)اگر ورودی‌های اسپم (مثل referralهای ناخواسته) دارید، می‌توانید آن‌ها را در گزارش‌ها فیلتر کنید.جراحی با Regex:1️⃣ در بخش Explore، یک فیلتر بر اساس Session source بسازید.2️⃣ Doesn&#039;t match regex را انتخاب کنید.3️⃣ تمام منابع اسپم را با | جدا کنید:(spam-site1.com|spam-referral2.net|another-spam.org)نتیجه: گزارشی تمیز و قابل اتکا، بدون داده‌های کثیف (Dirty Data).ابزار تکمیلی: Regex در Screaming Frogقدرت واقعی Regex زمانی مشخص می‌شود که آن را در ابزارهای کراول مانند Screaming Frog استفاده کنید.مثال: پیدا کردن URLهای ایندکس شده با پارامتر UTMاین یک فاجعه سئو است که URLهای کمپین شما ایندکس شوند.جراحی با Regex:1️⃣ در Screaming Frog به Configuration &gt; Custom &gt; Search بروید.2️⃣ یک فیلتر جدید بسازید و Contains regex را انتخاب کنید.3️⃣ الگوی زیر را برای پیدا کردن پارامترهای UTM در هر جای URL وارد کنید:utm_اما اگر بخواهیم دقیقاً پارامتر را در URL پیدا کنیم (نه در تگ‌های a):Configuration &gt; URL &gt; Excludeو تمام URLهایی که نباید کراول شوند را با Regex بلاک کنید:.*\?utm_.*نتیجه: شما قبل از اینکه گوگل این URLها را ببیند، آن‌ها را شناسایی و NoIndex یا Canonical می‌کنید.سخن پایانی: از «اپراتور» به «جراح» تبدیل شویدRegex ترسناک نیست؛ «ناآشنا» است. تسلط بر آن، تفاوت بین کسی است که به داده‌ها «نگاه» می‌کند و کسی که از داده‌ها «بازجویی» می‌کند.شما با یادگیری همین چند دستور ساده، سطح تحلیل خود را از ۹۰٪ افراد فعال در این حوزه بالاتر می‌برید. Regex به شما کنترل کامل بر داده‌ها را می‌دهد و این، دقیقاً همان چیزی است که یک «متخصص تکنیکال» را تعریف می‌کند.</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>mohammad sadra hosseini</author>
                <pubDate>Sat, 15 Nov 2025 22:20:35 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی Literal و Constant در زبان C</title>
                <link>https://virgool.io/codenevis/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-literal-%D9%88-constant-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-c-yfoabqfac9uz</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)Literal یعنی یه مقدار ثابت که مستقیم توی کد نوشته شده. یعنی مقداری که خودش همون چیزیه که هست. نه متغیره، نه تابعیه، نه چیزی که از جای دیگه بیاد. مثال:int i = 10;
i = 15;
printf(&quot;%d - %c - %d&quot;, i, &#039;A&#039;, 10);طبق کد بالا، &#039;A&#039; یک literal هست! عدد 10 یک literal هست. چون اینا مستقیم و بدون متغیر نوشته شدن.به خط اول کد دقت کن، اونجا مقدار 10 یک literal هست چون داره مستقیما به i نسبت داده میشه.Constant یعنی یه متغیر که مقدارش دیگه تغییر نمیکنه. یعنی یه چیزی که فقط یه بار مقدار می‌گیره و بعدش دیگه قفل میشه. مثال:const int maxUsers = 100;یه عدد داریم به اسم maxUsers که همیشه 100 میمونه. هیچ‌کس حق نداره تغییرش بده.define# چیه؟ یه دستور پیش‌پردازندست که میگه هر جا این اسم رو دیدی، جاش این مقدار رو بذار. مثال:#define PI 3.14159هر جا تو کد نوشتی PI، کامپایلر قبل از اجرا، اون رو با 3.14159 جایگزین میکنه.مقایسه define# با const:define#:زمان پردازش: قبل از کامپایلمحدوده: از لحظه تعریف تا آخر فایلاشکال‌زدایی: اسمش در دیباگر دیده نمیشهحافظه: مقدارش مستقیما جایگزین میشهconst:زمان پردازش: هنگام کامپایلمحدوده: مثل متغیرهای عادی (block scope)اشکال‌زدایی: در دیباگر قابل مشاهدستحافظه: در حافظه ذخیره میشه</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sat, 25 Oct 2025 13:43:17 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی تابع scanf در زبان C</title>
                <link>https://virgool.io/codenevis/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%AA%D8%A7%D8%A8%D8%B9-scanf-%D8%AF%D8%B1-%D8%B2%D8%A8%D8%A7%D9%86-c-anjypcc1zzap</link>
                <description>ویدیو مربوط به این مقاله: (کلیک کن)تو مقاله قبلی با stdio و تابع printf آشنا شدیم. تابع printf برای نمایش مقداره و تابع scanf برای گرفتن مقدار.چطوری از scanf استفاده کنم؟scanf(&quot;فرمت_ورودی&quot;, &amp;variable);فرمت ورودی: نوع داده‌ای که می‌خوای دریافت کنی (مثلا d% برای عدد صحیح)variable&amp;: آدرس متغیر رو میدی تا scanf بتونه مقدار رو داخلش ذخیره کنه (&amp; یعنی آدرس این متغیر رو بده) مثال:int age;
printf(&quot;Enter Your age: &quot;);
scanf(&quot;%d&quot;, &amp;age); // دریافت عدد و ذخیره در متغیر age
printf(&quot;Your age: %d&quot;, age);تو خط اول یه متغیر ساختم ولی مقداری بهش ندادم.تو خط دوم از printf استفاده کردم و متنی رو چاپ کردم.تو خط سوم از scanf (که داخل همون stdio.h هست) استفاده کردم و تو ورودی اول نوع مقداری که کاربر باید وارد کنه رو نوشتم (d% یعنی باید int بزنه) تو ورودی دوم علامت &amp; گذاشتم و اسم متغیر رو قرار دادم تا آدرس اون متغیر بدست بیاد و مقداری که کاربر وارد کرده داخلش قرار بگیره.تو خط آخر از printf استفاده کردم، متنی رو چاپ کردم و در آخرش d% گذاشتم یعنی میخوام بجای d% یک عدد چاپ بشه، و بیرون string یه ویرگول گذاشتم و اسم متغیری که عدد داخلش هست و باید همراه رشته چاپ بشه رو دادم.(من میتونم چندین تا % داخل یک رشته قرار بدم)برنامه رو اجرا میکنم، تو ورودی بهش عدد میدم و بدون مشکل اجرا میشه. اما اگه کاراکتر یا رشته وارد کنم چه اتفاقی میوفته؟ خطا بهم نمیده و یه عدد تصادفی برام برمیگردونه! یعنی یه عدد تصادفی داخل age قرار میگیره. دلیلش چیه؟ به کد زیر که قبلا بررسی کردیم دقت کن:int age;این خط فقط یه متغیر تعریف می‌کنه، ولی هیچ مقداری بهش اختصاص نمیده. یعنی مقدارش از قبل ممکنه هر چیزی باشه. پس وقتی scanf نتونه مقدار تعیین شده رو بخونه، همون عدد قبلی داخل age باقی می‌مونه، و توی printf هم چاپ میشه.نکته. علامت &amp; یه اپراتور خیلی مهم تو زبان Cعه و استفادش فقط به scanf ختم نمیشه.به کد زیر دقت کن:char name[]; // Error
char ch; // no Errorخط دوم مشکلی نداره چون گفتم یه متغیر ساده به اسم ch از نوع char بساز. کامپایلر چون دقیقا می‌دونه باید برای ch فقط 1 بایت حافظه کنار بذاره خطا نمیده (هیچ چیزی مبهم نیست)اما خط اول خطا میده چون گفتم یه آرایه‌ایی از نوع char به اسم name بساز و تعیین نکردم که این آرایه چندتا خونه و چقدر حافظه داشته باشه! به همین دلیل کامپایلر نمیتونه حدس بزنه که این آرایه چندتا عضو داره، چون نه اندازش رو گفتم نه مقدار اولیه دادم و درنتیجه:‌ Error 🤔توی C اگه قرار باشه آرایه تعریف کنم و مقدار اولیه بهش ندم باید بدین شکل عمل کنم:char name[10];تو کد بالا تعیین کردم که آرایه name باید 10 تا خونه داشته باشه. اما تعداد خونه دقیقا یعنی چه؟تو کد بالا گفتم یه آرایه بساز با 10 خونه از نوع char، یعنی 10 بایت حافظه پشت‌سرهم. هر خونه میتونه یه کاراکتر نگه‌ داره.حالا یه سوال! آیا من میتونم رشته Amirhosein رو داخل name قرار بدم؟ عبارت Amirhosein تعداد 10 تا کاراکتر داره ولی نمیتونم داخل name قرارش بدم. چرا؟تو زبان C رشته‌ها همیشه با کاراکتر 0\ تموم می‌شن. یعنی وقتی می‌خوای Amirhosein رو توی آرایه بریزی، واقعا داری اینو میریزی:&#039;A&#039; &#039;m&#039; &#039;i&#039; &#039;r&#039; &#039;h&#039; &#039;o&#039; &#039;s&#039; &#039;e&#039; &#039;i&#039; &#039;n&#039; &#039;\0&#039;یعنی 11 تا خونه لازم داری نه 10 تا (البته ممکنه خطا نده ولی هزاران دلیل به وجود میاد که برنامه به شکل های نادرست رفتار کنه)</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>امیرحسین ناظوری</author>
                <pubDate>Sat, 25 Oct 2025 13:26:31 +0330</pubDate>
            </item>
                    <item>
                <title>چرا اپلیکیشن های مخرب محبوب هستند؟ ( اینستاگرام و...)</title>
                <link>https://virgool.io/codenevis/%DA%86%D8%B1%D8%A7-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D9%87%D8%A7%DB%8C-%D9%85%D8%AE%D8%B1%D8%A8-%D9%85%D8%AD%D8%A8%D9%88%D8%A8-%D9%87%D8%B3%D8%AA%D9%86%D8%AF-%D8%A7%DB%8C%D9%86%D8%B3%D8%AA%D8%A7%DA%AF%D8%B1%D8%A7%D9%85-%D9%88-p76p1zq3fher</link>
                <description>چرا ما ساعت های زیادی را بدون اینکه متوجه شویم در اپلیکیشن هایی مثل اینستاگرام و تیک تاک و ... غرق میشویم؟ اما نمی‌توانیم حتی برای چند روز متوالی به استفاده از اپلیکیشن‌های مفید مانند مدیتیشن یا یادگیری زبان پایبند بمانیم؟من یک طراح اپلیکیشن با بیش از 10 سال سابقه ی کاری روی اپلیکیشن های مفید هستم و به خوبی رفتار کاربران را تحلیل کرده ام و متوجه ام که کاربر در مقابل چه رفتاری بیشتر به اپلیکیشن ها سر میزند.اعتیاد به اپلیکیشن های مخرب مثل اینستاگرام و ... بخاطر نداشتن اراده نیست بلکه بخاطر طراحی اپلیکیشن هست اپلیکیشن‌هایی که به ما آسیب می‌زنند، از نظر ساختاری قدرتمندتر از اپلیکیشن‌هایی هستند که می‌خواهند به ما کمک کنند. این یک تصادف نیست؛ بلکه به این دلیل است که قدرتمندترین تکنیک‌های افزایش درگیری کاربر (Engagement)، ذاتاً مضر هستند و با اهداف اصلی اپلیکیشن‌های مفید در تضادند. اگر این رفتار را اپلیکیشن مفید داشته باشد تفاوتی با اپلیکیشن های مضر نخواهند داشت.کوتاه مدت ولی متنوع = دوپامین موقتدر ادامه به جزییات بیشتری برای علت اعتیاد به اینستاگرام و امثالهم میپردازیمنکته اصلی ۱: اضطراب، رضایت را شکست می‌دهد (Anxiety Beats Fulfillment)اپلیکیشن‌های اعتیادآور (تیک‌تاک، اینستاگرام، بازی‌ها) مکانیسم‌هایی دارند که اضطراب ایجاد می‌کنند، در حالی که اپلیکیشن‌های مفید (مدیتیشن، ورزش) به دنبال ایجاد رضایت هستند. حقیقت ناخوشایند این است که اضطراب، نیروی محرک بسیار قوی‌تری برای رفتار انسان است.اپلیکیشن‌های مضر و FOMO (ترس از دست دادن): این اپلیکیشن‌ها با ایجاد حس &quot;شاید در حال از دست دادن چیزی مهم هستی&quot;، یک اضطراب خفیف و مداوم در شما ایجاد می‌کنند. تنها راه تسکین این اضطراب، چک کردن اپلیکیشن است. اما این تسکین موقتی است، زیرا سیستم بی‌پایان طراحی شده و همیشه محتوای جدیدی برای ایجاد دوباره اضطراب وجود دارد.اپلیکیشن‌های مفید و نقطه پایان: وقتی یک جلسه مدیتیشن را تمام می‌کنید، احساس آرامش و رضایت می‌کنید. اپلیکیشن به هدف خود رسیده و شما دلیلی برای باز کردن فوری آن ندارید. رضایت، نقطه پایان است. اپلیکیشن‌های اعتیادآور هرگز به شما نقطه پایان نمی‌دهند، زیرا اضطراب، شما را درگیر نگه می‌دارد.بخش آموزشی: مکانیک‌هایی که شما را استثمار می‌کننددر این قسمت، نویسنده به طور دقیق تکنیک‌هایی را که اپلیکیشن‌های مضر قدرتمند می‌کند، توضیح می‌دهد و می‌گوید چرا اپلیکیشن‌های مفید از آن‌ها استفاده نمی‌کنند (یا نباید استفاده کنند):پاداش‌های متغیر (Variable Rewards):چگونه کار می‌کند؟ مانند دستگاه‌های اسلات، شما هرگز نمی‌دانید با کشیدن صفحه به پایین (رفرش) چه چیزی دریافت خواهید کرد. گاهی یک محتوای عالی، گاهی چیزی معمولی و گاهی هیچ چیز. این عدم قطعیت شما را وادار به چک کردن مداوم می‌کند.چرا اپلیکیشن مفید از آن استفاده نمی‌کند؟ یک اپلیکیشن ردیاب عادت (Habit Tracker) همیشه یک ستاره طلایی به شما می‌دهد. این قابل پیش‌بینی است و انگیزه کمتری دارد. اگر پاداش‌ها را تصادفی می‌کردیم، اپلیکیشن از یک ابزار کمکی به یک ابزار استثمارگر تبدیل می‌شد.مقایسه اجتماعی (Social Comparison):چگونه کار می‌کند؟ هیچ چیز مانند مقایسه خود با دیگران، درگیری کاربر را افزایش نمی‌دهد. لایک‌ها، فالوورها و بازدیدها همگی ابزارهای مقایسه‌ای هستند که اضطراب دائمی نسبت به جایگاه اجتماعی شما ایجاد می‌کنند.چرا اپلیکیشن مفید از آن استفاده نمی‌کند؟ در اپلیکیشن‌های سلامت، به خصوص برای افراد با مشکلات روحی یا جسمی، مقایسه اجتماعی ایجاد حس شرم و اضطراب می‌کند که هدف اصلی سلامتی را از بین می‌برد.کمیابی مصنوعی (Artificial Scarcity):چگونه کار می‌کند؟ محدود کردن تعداد سوایپ‌ها در اپلیکیشن‌های دوست‌یابی، محدود کردن انرژی در بازی‌ها، یا ایجاد تایمر شمارش معکوس برای فروش‌ها، حس فوریت و اضطراب &quot;اگر الان اقدام نکنم، از دست می‌دهم&quot; را ایجاد می‌کند.چرا اپلیکیشن مفید از آن استفاده نمی‌کند؟ اپلیکیشن آموزشی می‌توانست دروس روزانه را محدود کند تا شما را مشتاق‌تر کند، اما این کار با هدف اصلی آن که ایجاد یک عادت پایدار است (نه ایجاد فوریت کاذب)، در تضاد است.محتوای بی‌پایان (Infinite Content):چگونه کار می‌کند؟ اعتیادآورترین اپلیکیشن‌ها پایانی ندارند. شما هرگز نمی‌توانید تیک‌تاک را تمام کنید. همیشه محتوای بیشتری وجود دارد، یعنی هیچ نقطه توقف طبیعی وجود ندارد. شما باید به طور آگاهانه تصمیم به توقف بگیرید که این به اراده نیاز دارد.چرا اپلیکیشن مفید از آن استفاده نمی‌کند؟ اپلیکیشن‌های مفید معمولاً نقاط پایانی مشخصی دارند: تمرین ورزشی تمام شد، درس به پایان رسید. این نقاط پایانی رضایت‌بخش هستند و اپلیکیشن شما را رها می‌کنند.اطلاعات ناقص (Incomplete Information):چگونه کار می‌کند؟ نوتیفیکیشن‌ها و نشانگرهای قرمز (Badges) به شما می‌گویند چیزی نیاز به توجه شما دارد، اما نمی‌گویند چه چیزی. این یک &quot;حلقه اضطراب کوچک&quot; ایجاد می‌کند: عدم قطعیت، سپس تسکین (هنگام چک کردن)، و سپس عدم قطعیت جدید (از چیزی که دیده‌اید).چرا اپلیکیشن مفید از آن استفاده نمی‌کند؟ اپلیکیشن‌های بهره‌وری می‌توانستند از نوتیفیکیشن‌های تهاجمی‌تر برای ایجاد این اضطراب استفاده کنند، اما این کار زندگی افراد را استرس‌انگیزتر می‌کرد و هدف اصلی که کاهش استرس است، را نقض می‌کرد.نکات اصلی و راهکارها: این موضوع چه معنایی برای شما دارد؟تقصیر شما نیست: وقتی نمی‌توانید به عادت مفید خود پایبند بمانید اما نمی‌توانید چک کردن شبکه‌های اجتماعی را متوقف کنید، شما در حال شکست خوردن نیستید. شما دقیقاً طبق طراحی دو سیستم کاملاً متفاوت واکنش نشان می‌دهید. یکی برای کمک به شما طراحی شده و دیگری برای به دام انداختن توجه شما.موفقیت اپلیکیشن مفید به معنای بی‌نیاز شدن شماست: بهترین نتیجه برای یک اپلیکیشن ورزشی این است که شما تناسب اندام خود را به دست آورید و دیگر به آن نیازی نداشته باشید. این شکست اپلیکیشن نیست، بلکه موفقیت آن در انجام وظیفه‌اش است. در مقابل، اپلیکیشن‌های اعتیادآور زمانی موفق می‌شوند که شما بیشتر به آن‌ها وابسته شوید.ساختار خارجی برای خود ایجاد کنید: از آنجایی که اپلیکیشن‌های مفید فوریت کاذب ایجاد نمی‌کنند، شما باید خودتان آن را بسازید. زمان‌بندی در تقویم، پیدا کردن یک شریک پاسخگو (Accountability Partner)، و طراحی محیط اطراف خود. شما به حمایت خارجی بیشتری نیاز دارید، زیرا خود اپلیکیشن شما را برای ثبات قدمManipulate نمی‌کند.اپلیکیشن‌های اعتیادآور را حذف کنید: اگر اپلیکیشنی از مکانیسم‌های ایجاد اضطراب استفاده می‌کند و شما علی‌رغم احساس بدی که بعد از استفاده از آن دارید، به طور وسواسی آن را چک می‌کنید، آن را حذف کنید. این عدم تقارن قدرت به این معناست که شما باید در حذف اپلیکیشن‌های مضر، پرخاشگرتر از اضافه کردن اپلیکیشن‌های مفید عمل کنید.طراحی اخلاقی را قدر بدانید: وقتی یک اپلیکیشن از نوتیفیکیشن‌های تهاجمی، FOMO مصنوعی یا اضطراب مقایسه استفاده نمی‌کند، این &quot;طراحی ضعیف&quot; نیست، بلکه &quot;طراحی محترمانه&quot; است. آن اپلیکیشن با شما به چشم یک انسان مستقل رفتار می‌کند، نه یک &quot;معیار engagment یا بازدید گرفتن&quot;.نتیجه‌گیری نهایی: اپلیکیشن‌های طراحی شده برای کمک به شما، هرگز به اندازه اپلیکیشن‌های طراحی شده برای استثمار شما، جذاب نخواهند بود. قدرتمندترین تکنیک‌های درگیری کاربر ذاتاً مضر هستند. طراحی اخلاقی یعنی انتخاب تکنیک‌های کم‌قدرت‌تر که به رفاه کاربر احترام می‌گذارند، به جای به حداکثر رساندن درگیری.پس دیگر خودتان را سرزنش نکنید که چرا بیشتر درگیر تیک‌تاک هستید تا اپلیکیشن ردیاب عادتتان. یکی از تمام ترفندهای روانشناختی ممکن برای فریب دادن شما استفاده می‌کند و دیگری واقعاً تلاش می‌کند به شما کمک کند. این دو قابل مقایسه نیستند. و این هم عمدی است.نویسنده : سام نیک زاد - کارشناس ارشد هوش مصنوعی و مدرس برنامه نویسی در پلتفرم آموزشی آواسام</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>آواسام ; آکادمی آموزش برنامه نویسی</author>
                <pubDate>Wed, 15 Oct 2025 00:01:49 +0330</pubDate>
            </item>
                    <item>
                <title>۵ نکته شگفت‌انگیز درباره این دوره‌های برنامه‌نویسی که باید بدانید</title>
                <link>https://virgool.io/codenevis/%DB%B5-%D9%86%DA%A9%D8%AA%D9%87-%D8%B4%DA%AF%D9%81%D8%AA-%D8%A7%D9%86%DA%AF%DB%8C%D8%B2-%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-%D8%A7%DB%8C%D9%86-%D8%AF%D9%88%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%A9%D9%87-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A8%D8%AF%D8%A7%D9%86%DB%8C%D8%AF-npesmpce1lb4</link>
                <description>دوره برنامه نویسی رایگان که من کار سال پیش ضبط کردم و تا آلان ادامه داره. مقدمه: قلاب اولیه.انتخاب نقطه شروع برای یادگیری برنامه‌نویسی یکی از بزرگترین چالش‌ها برای علاقه‌مندان به این حوزه است. بسیاری از دوره‌های آموزشی با فرض اینکه شما از قبل با مفاهیم پایه‌ای کامپیوتر آشنا هستید، شروع می‌شوند و نیازهای واقعی یک فرد کاملاً مبتدی را نادیده می‌گیرند. اما اگر مسیری وجود داشته باشد که نه تنها این مشکل را حل کرده، بلکه با رویکردی کاملاً غیرمنتظره، فرآیند یادگیری را متحول کند چطور؟ در این مطلب، به بررسی یک مجموعه دوره آموزشی منحصربه‌فرد (دوره‌های استاد صابر طباطبایی) می‌پردازیم که با رویکردی شگفت‌انگیز، چالش‌های رایج را حل کرده است. با خواندن این مطلب، نگاهی نو به فرآیند یادگیری پیدا خواهید کرد.--------------------------------------------------------------------------------۱. شروع از «صفرِ صفر»: وقتی آموزش از نصب ویندوز آغاز می‌شوداستاد طباطبایی پس از تدریس دوره پیشرفته لاراول، متوجه شد که بسیاری از دانشجویان به مقدمات بیشتری نیاز دارند. این نیازسنجی دقیق، منجر به خلق دوره «برنامه‌نویسی از صفر» شد تا «اصطلاحات مهم برنامه‌نویسی» و «مفاهیم دیتابیس» را پوشش دهد. اما نکته شگفت‌انگیز اینجا بود: حتی این دوره هم برای برخی کافی نبود. به همین دلیل، دوره دیگری به نام «برنامه‌نویسی از صفر صفر» ایجاد شد تا به پایه‌ای‌ترین نیازهای ممکن پاسخ دهد؛ نیازمندی‌هایی که کمتر کسی جرأت می‌کند آن‌ها را بخشی از یک دوره برنامه‌نویسی بداند.محتوای این دوره شامل مواردی است که عمق تعهد به آموزش واقعی را نشان می‌دهد:* کار با ویندوز، نصب برنامه‌ها و دانلود از اینترنت* مفاهیم پایه شبکه و اینترنت* روش‌های جستجوی مؤثر در اینترنت* آموزش تایپ ده‌انگشتی برای تسلط بر کیبورد* اصطلاحات گیت و کار با محیط برنامه‌نویسی* مفاهیم بنیادی مانند تعریف متغیرها و توابعاینجا با یک فلسفه آموزشی رادیکال روبرو هستیم: آموزش برنامه‌نویسی نباید از کدنویسی، بلکه باید از رفع تمام موانع دیجیتالی که پیش روی یک مبتدی قرار دارد، آغاز شود. این رویکرد بیانیه‌ای قدرتمند در زمینه سواد دیجیتال و فراگیری است و با پرداختن به مهارت‌های فیزیکی (تایپ) و فنی (ویندوز)، دسترسی به دنیای برنامه‌نویسی را برای همگان دموکراتیک می‌کند.۲. مسیر یادگیری معکوس: از دوره پیشرفته شروع کنید!برخلاف تمام مسیرهای یادگیری سنتی که شما را از مبتدی به پیشرفته هدایت می‌کنند، پیشنهاد استاد طباطبایی کاملاً غیرمتعارف است: «پیشنهاد می‌کنم که هر کسی از دوره لاراول جلسه اول شروع کند».منطق پشت این پیشنهاد جسورانه این است که دانشجو ابتدا با سطح پیشرفته و هدف نهایی روبرو می‌شود. اگر در حین تماشای جلسه اول دوره لاراول احساس کرد که مفاهیم برایش پیچیده است، می‌تواند به صورت موازی به دوره‌های قبلی («از صفر» یا «از صفر صفر») مراجعه کند. این روش به افراد «زرنگ» که توانایی جستجو و تمرین دارند اجازه می‌دهد مسیر را سریع‌تر طی کنند و در دام آموزش‌های تکراری نیفتند. در عین حال، مسیر بازگشت برای مبتدیان همیشه باز است تا هر جا که لازم بود، به عقب برگردند و پایه‌های خود را تقویت کنند. این رویکرد، تفکر خطی در یادگیری را به چالش می‌کشد و با اعتماد به توانایی خودارزیابی دانشجو، او را از یک دریافت‌کننده منفعل به یک مدیر فعال در مسیر آموزشی خود تبدیل می‌کند.۳. لپ‌تاپ، یک پیش‌نیاز قطعی: رویای برنامه‌نویسی فقط با موبایلرویای یادگیری برنامه‌نویسی در هر زمان و مکان، تنها با یک گوشی هوشمند، برای بسیاری جذاب است. این یک تصور رایج و یک درخواست پرتکرار از سوی دانشجویانی است که به کامپیوتر یا لپ‌تاپ دسترسی ندارند. اما در این دوره‌ها، با شفافیتی ستودنی و بدون تعارف، یک واقعیت کلیدی و غیرقابل‌انکار بیان می‌شود:در تمامی دوره‌ها دسترسی به لپ‌تاپ واجب و لازم است.این صراحت از ایجاد انتظارات غیرواقعی در دانشجویان جلوگیری می‌کند. در حالی که بسیاری از دوره‌ها ممکن است برای جذب مخاطب بیشتر وعده‌های غیرعملی بدهند، اینجا بر اهمیت داشتن ابزار مناسب برای یادگیری حرفه‌ای و استاندارد تأکید می‌شود. این یک پیام قدرتمند است: هدف، ارائه یک آموزش واقعی و کاربردی برای ورود به بازار کار است، نه صرفاً یک سرگرمی موقت.۴. دوره‌ای که هنوز وجود ندارد: واقعیت دوره برنامه‌نویسی اندرویدبا توجه به درخواست‌های مکرر دانشجویان برای یادگیری برنامه‌نویسی روی موبایل، مدرس تحقیقاتی را برای ایجاد یک دوره تخصصی روی گوشی اندروید آغاز کرد. این موضوع حتی در معرفی برخی دوره‌ها نیز ذکر شده و ممکن است این تصور را ایجاد کند که چنین دوره‌ای در دسترس است. اما واقعیت چیز دیگری است.با وجود تقاضا و تحقیقات اولیه، حقیقت این است که این دوره هنوز ضبط نشده است. در پاسخ به سوالات مستقیم درباره جزئیات این دوره، پاسخ کاملاً شفاف است: «اصلاً این دوره ضبط نشده است». این سطح از شفافیت برای مخاطبی که به دنبال یک دوره مشخص می‌گردد، فوق‌العاده ارزشمند است. این کار از اتلاف وقت و انرژی دانشجو برای جستجوی محتوایی که هنوز وجود خارجی ندارد جلوگیری کرده و اعتبار مجموعه آموزشی را تقویت می‌کند.۵. پشتیبانی مادام‌العمر و شخصی: شما تنها نیستیددر دنیای دوره‌های آنلاین انبوه (MOOCs) که اغلب دانشجو با ویدیوهای ضبط‌شده تنها گذاشته می‌شود، این مجموعه یک مزیت رقابتی کلیدی ارائه می‌دهد: پشتیبانی مستقیم و دائمی.1. دسترسی دائمی: تمام ویدیوها و فایل‌های پاورپوینت در کانال آپارات برای همیشه در دسترس هستند. شما یک بار به محتوا دسترسی پیدا می‌کنید و این دسترسی هرگز منقضی نمی‌شود.2. پشتیبانی مستقیم: یک گروه تلگرامی فعال وجود دارد که دانشجویان می‌توانند سوالات خود را مستقیماً از خود استاد بپرسند و پاسخ بگیرند. سطح این پشتیبانی به پیگیری خود دانشجو بستگی دارد: «به میزانی که افراد کنجکاو سوالات خود را برای من بفرستند من پاسخگو خواهم بود».این مدل مربی‌گری شخصی و مادام‌العمر، تضاد کاملی با ماهیت بی‌نام‌ونشان و یک‌بار مصرف بسیاری از پلتفرم‌های آموزشی دارد. این رویکرد حس اطمینان و همراهی را به دانشجو می‌دهد و تضمین می‌کند که در هیچ مرحله‌ای از مسیر یادگیری تنها نخواهد ماند.--------------------------------------------------------------------------------جمع‌بندی: یادگیری تطبیقی، کلید موفقیتاز شروع آموزش با تایپ ده‌انگشتی گرفته تا پیشنهاد مسیر یادگیری معکوس و شفافیت در مورد پیش‌نیازها، تمام این نکات نشان‌دهنده یک رویکرد منحصربه‌فرد و «تطبیقی» هستند. این دوره‌ها بر اساس نیازسنجی واقعی دانشجویان شکل گرفته‌اند و به جای تحمیل یک مسیر ثابت، به فرد قدرت انتخاب و انعطاف می‌دهند.این رویکرد تطبیقی ما را به فکر وا می‌دارد: چند حوزه آموزشی دیگر می‌توانند با گوش دادن دقیق به مخاطبان خود و بازگشت به «صفرِ صفر»، متحول شوند؟</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>صابر طباطبائی یزدی</author>
                <pubDate>Mon, 06 Oct 2025 01:29:45 +0330</pubDate>
            </item>
                    <item>
                <title>API چیست و چگونه کار می‌کند؟ (به زبان ساده)</title>
                <link>https://virgool.io/codenevis/api-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%DA%AF%D9%88%D9%86%D9%87-%DA%A9%D8%A7%D8%B1-%D9%85%DB%8C-%DA%A9%D9%86%D8%AF-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-pjfrtcie3fxq</link>
                <description>در دنیای نرم‌افزار، برنامه‌ها به‌صورت مستقل کار نمی‌کنند؛ آن‌ها برای تبادل داده و انجام کارهای مشترک، نیاز دارند با یکدیگر ارتباط برقرار کنند. این ارتباط از طریق چیزی به نام API یا رابط برنامه‌نویسی کاربردی انجام می‌شود.در این مقاله، به زبان ساده توضیح می‌دهیم که API چیست، چگونه کار می‌کند و چرا تا این اندازه در توسعه‌ی نرم‌افزار اهمیت دارد.API چگونه کار می کند؟تعریف APIAPI یا رابط برنامه‌نویسی کاربردی(Application Programming Interface)، مجموعه‌ای از قوانین و پروتکل‌ها است که به برنامه‌های نرم‌افزاری اجازه می‌دهد با یکدیگر ارتباط برقرار کرده و داده‌ها، قابلیت‌ها و عملکردهایشان را به اشتراک بگذارند.به‌عنوان مثال، برنامه‌ی آب‌و‌هوای تلفن شما از طریق API با سرور هواشناسی در ارتباط است و پیش‌بینی روزانه‌ی وضعیت هوا را نمایش می‌دهد؛ یعنی بدون اینکه کل داده‌ها را در خودش ذخیره کند، فقط اطلاعات مورد نیاز را از منبع اصلی می‌گیرد.اجزای مفهومی API (Application &amp; Interface)در عبارت Application Programming Interface:واژه‌ی Application به هر نرم‌افزار با هدف و کارکرد مشخص اشاره دارد.واژه‌ی Interface به معنای رابط یا نقطه‌ی اتصال بین دو برنامه است.می‌توانیم API را نوعی قرارداد خدماتی (Service Contract) بدانیم که نحوه‌ی ارتباط بین دو نرم‌افزار را با استفاده از درخواست‌ها (Requests) و پاسخ‌ها (Responses) مشخص می‌کند. مستندات (Documentation) هر API توضیح می‌دهد که چه نوع درخواست‌هایی مجاز است و پاسخ‌ها چگونه بازگردانده می‌شوند.API چگونه کار می‌کند؟برای درک نحوه‌ی عملکرد API، کافی است آن را به‌عنوان پلی بین کلاینت (Client) و سرور (Server) در نظر بگیریم.کلاینت همان برنامه‌ای است که درخواست (Request) را ارسال می‌کند و سرور برنامه‌ای است که پاسخ (Response) را برمی‌گرداند.API نقش واسطه‌ای را ایفا می‌کند که ارتباط بین این دو را برقرار می‌سازد.یک مثال ساده از عملکرد API را می‌توان در سیستم‌های پرداخت آنلاین مشاهده کرد.فرض کنید در یک فروشگاه اینترنتی قصد خرید دارید و گزینه‌ی «پرداخت با PayPal» را انتخاب می‌کنید. در این لحظه، وب‌سایت فروشگاه از طریق API به سرور PayPal متصل می‌شود.مراحل کار به‌صورت خلاصه این‌گونه است:کاربر دکمه‌ی پرداخت را می‌زند ← درخواست API به سرور ارسال می‌شود.درخواست شامل اطلاعاتی مانند آدرس منبع (URI)، نوع درخواست (مثل POST یا GET)، هدرها و گاهی داده‌های ارسالی است.API این درخواست را به سرور مقصد (مثلاً PayPal) منتقل می‌کند.سرور پس از پردازش، پاسخی حاوی نتیجه (مثلاً موفق بودن پرداخت) به API برمی‌گرداند.در نهایت، API پاسخ را به برنامه‌ی اولیه (سایت فروشگاه) ارسال می‌کند و کاربر نتیجه را در رابط کاربری خود می‌بیند.تمام این ارتباط‌ها در پس‌زمینه انجام می‌شوند؛ یعنی کاربر فقط نتیجه‌ی نهایی را می‌بیند، در حالی که تبادل داده بین برنامه‌ها در سطح شبکه و از طریق API اتفاق می‌افتد.کاربردها و مزایای APIAPIها با فراهم‌کردن امکان ادغام داده‌ها و قابلیت‌های سایر برنامه‌ها، فرآیند توسعه‌ی نرم‌افزار را ساده‌تر و سریع‌تر می‌کنند. به‌جای ساختن همه‌چیز از صفر، توسعه‌دهندگان می‌توانند از APIها برای استفاده از داده‌ها یا سرویس‌های موجود بهره ببرند. برای مثال، پرداخت آنلاین، نقشه‌های گوگل یا قیمت لحظه‌ای رمزارزها.علاوه بر این، صاحبان نرم‌افزار می‌توانند از طریق API، بخشی از داده‌ها یا قابلیت‌های سیستم خود را به‌صورت کنترل‌شده و امن در اختیار دیگران قرار دهند.امنیت و کنترل دسترسی در APIAPIها معمولاً به گونه‌ای طراحی می‌شوند که فقط داده‌ها و توابع ضروری را برای یک درخواست خاص ارائه دهند. این یعنی سرورها نیازی ندارند کل پایگاه داده یا منطق داخلی خود را افشا کنند و همین موضوع به حفظ امنیت و یکپارچگی سیستم کمک می‌کند.برای محافظت بیشتر، بسیاری از APIها از روش‌هایی مانند کلید API (API Key) یا احراز هویت (Authentication) استفاده می‌کنند تا فقط کاربران مجاز بتوانند به داده‌ها دسترسی داشته باشند.در نهایت، APIها همان زبان مشترکی هستند که باعث می‌شوند نرم‌افزارها بتوانند با هم ارتباط برقرار کنند. شناخت نحوه‌ی عملکرد آن‌ها، دید عمیق‌تری نسبت به منطق اپلیکیشن‌ها و سیستم‌های مدرن به ما می‌دهد.</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>ملیکا رضائی</author>
                <pubDate>Sat, 04 Oct 2025 21:35:00 +0330</pubDate>
            </item>
                    <item>
                <title>ماشین مجازی اتریوم چیست؟</title>
                <link>https://virgool.io/codenevis/%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-%D8%A7%D8%AA%D8%B1%DB%8C%D9%88%D9%85-%DA%86%DB%8C%D8%B3%D8%AA-uhjxbtottjzw</link>
                <description>شرح EVMبلاکچین از یک فناوری ویژه به جریانی اصلی تبدیل شده است. شما در مورد بلاکچین ها در خبر ها می شنوید یا در پست های اینترنتی می خوانید. می بینید که حوزه توانائی و نفوذ آن فقط به موارد مالی و یا فناوری محدود نمی شود. بلاکچین ها با توانائی دگرگونی صنایع اهمیت جهانی پیدا کرده اند. اگر به تازگی با بلاکچین ها آشنا شده اید، یادگیری مطالبی در مورد اتریوم و ماشین مجازی اتریوم، شروع خوبی است.اگر تازه واردید و یا برنامه نویسی هستید که تازه با بلاکچین آشنا شده اید، احتمالا با اصطلاح ماشین مجازی اتریوم(EVM) و چیستی آن و چگونگی شکل گیری این ایده برخورد می کنید و در ذهنتان سوال ایجاد می شود.سازندگان اتریوم از روز اول دیدگاهی شفاف داشتند و می خواستند ایده ای را خلق کنند که شبیه &quot;کامپیوتری جهانی&quot; یا اینترنتی باشد؛ اما چگونه این ایده بلند پروازانه را به اجراء در آوردند؟بخشی از این پاسخ در ماشین مجازی اتریوم (EVM) پنهان است. علاوه بر این مورالیس(Moralis) به عنوان میان افزار برتر بلاکچین از پشتیبانی وسیعی از(EVM) برخورداراست. این (EVM) ها چیستند را توضیح می دهیم و اینکه وقتی  dApps ها را به عنوان اپلیکیشن های غیر متمرکز می سازید؛ پشتیبانی (Moralis) تا چه اندازه کار را آسان می کند.پیش نیاز مطالعه در مورد ماشین های مجازی اتریوم یا (EVM)، دانستن سابقه مفاهیمی مانند ماشین های کامل تورینگ و ماشین های مجازی است و اینکه اکوسیستم های غیر متمرکز چگونه کار می کند. بیتکوین اولین باراکوسیستم غیر متمرکز را معرفی کرد و بعد از چند سال از راه اندازی بیتکوین، توسعه دهندگان با ایده کامپیوتر ها یا ماشین های مجازی کنترل کننده جهان آشنا شدند. ایده بلاکچین های قدرتمند تر و پیچیده تر بیشتر ذهنشان را به خود مشغول کرد که به طور مستقیم به Web3 و وب غیر متمرکز مربوط می شود؛ بنابراین بهتر است به خصوصیات (EVM)ها بپردازیم.ماشین مجازی اتریوم چیست؟هنگام خواندن مطلبی زرد در مورد اتریوم یا توضیحات مختلف در مورد اتریوم در اینترنت شاید از خود بپرسید &quot;ماشین مجازی اتریوم چیست؟&quot; درک و فهم (EVM) ها به عنوان اکوسیستمی کامل لازم است؛ اما قبل از پاسخ به این سوال باید روش یادگیری خود را بخش بندی کنید. اتریوم دارای بخش های زیادی است و شما باید بدانید چگونه همه با هم هماهنگ عمل می کنند.ماشين مجازیماشین های مجازی چیستند؛ ماشین های مجازی در سطحی بالاتر از سیستم عامل های معمولی یا OS فعالند و مفاهیم را انتزاع می کنند و بر خلاف ویندوز یا OIS در بالای سیستم عامل های معمولی ایجاد می شوند تا بتوانند عملکرد مشابهی با ماشین های محاسباتی فیزیکی داشته باشند.در حقیقت ماشین های مجازی یا VMها با شبیه سازی نوعی معماری مجازی امکان عملکرد ماشین های محاسباتی فیزیکی را بر روی هر سیستم عامل یا سخت افزاری ایجاد می کنند و آنها را به موتوری عالی برای اکوسیستمی غیر متمرکز تبدیل می کنند.فلوچارتی از نمای انتزاعی ارتباط کاربر و وب 3 و اپ ها و ماشین مجازیاز مسیر VM می توان بدون در نظر گرفتن محل یا جغرافیای شرکت کنندگان از منابع آن ها برای ساخت و پردازش و اجرای خواسته هایشان بهره برد. از این نظر، EVM مانند یک پردازنده یا کامپیوتر جهانی عمل می کند که قدرت محاسباتی انباشته شده خود را به توسعه دهندگان می دهد. توسعه دهندگان نیز از این منبع برای ایجاد قراردادهای هوشمند و برنامه های غیرمتمرکز یا dApps استفاده می کنند.هر مشارکت کننده از هر کجا و از راه &quot;گره&quot; های اتریوم امکان دسترسی به ماشینی مجازی را دارد . واگذاری امتیاز قدرت محاسباتی به شبکه، داوطلبانه است و توسط چندین انگیزه کنترل می شود. با توجه به تمام ویژگی‌های ماشین‌های مجازی و نیاز به پردازش همه داده‌ها از طریق یک شبکه داوطلبانه، انتخاب نوع معماری VM برای اتریوم منطقی است.کامل بودن تورینگ چیست؟زمان پاسخ به ماشین مجازی اتریوم چیست؟، با اصطلاحاتی مانند کامل بودن تورینگ مواجه خواهید شد. EVM تورینگ کامل است، دقیقا به چه معناست؟ این مفهوم از طریق ایده های دانشمند مشهور کامپیوتر آلن تورینگ ایجاد شده است. او ایده هایی را در مورد آنچه که یک کامپیوتر فرضی یا ماشین فکر می تواند انجام دهد، توسعه داد. او استدلال می‌کرد که رایانه‌ها مانند انسان‌ها فکر نمی کنند، بلکه برای حل مسائل از مجموعه‌ای از قوانین پردازش داده پیروی می کنند.ماشین های تورینگ چگونه فکر می کنندماشین تورینگ، که زمانی توسط تورینگ به عنوان یک ماشین (به معنای ماشین خودکار) از آن یاد می‌کرد، ماشینی فرضی است که مفهوم تفکر غیرانسانی یا ماشینی را مجسم می کند. فرآیند تفکر در چارچوب الگوریتم ها عینی می شود.تورینگ در مقاله اش اشاره کرده که چنین ماشینی باید یک حلقه نوار را با خطی از نمادها یا توابع پردازش کند که می تواند به عقب و جلو حرکت کند. همچنین می توان یک هد خواندن/نوشتن را تصور کرد که بین این توابع حرکت می کند. بنابراین، دستگاه می تواند یک نماد را پردازش کند یا آن را تغییر دهد. چنین ماشینی فقط می تواند توجه خود را در یک زمان به یک &quot;وضعیت&quot; معطوف کند. (مفهوم &quot;وضعیت&quot; در درک EVMها مفید است).در ماشین فکر در یک زمان فقط به یک وضعیت توجه می شودبه طور فرض، هیچ محدودیتی برای این نوار وجود ندارد مگر محدودیت های فیزیکی و اگر آنرا مشابه حافظه کامپیوتر در نظر بگیریم. با اضافه کردن به طول نوار، فضای حافظه کامپیوتر افزایش یافته است. پس وقتی کامپیوتر مجبور است مجموعه ای از دستورالعمل ها را دنبال کند، داده ها و پاسخ ها به چنین دستوراتی فقط با محدودیت های فیزیکی محدود می شود. این ایده ها برای درک ماشین مجازی اتریوم بنیادین است؛ چون مفاهیم بنیادین اولیه و معماری آن را شکل می دهند. از اصول بیشتر فیزیکی تورینگ، دیگرانی مشابه مجازی آن را با اصول بنیادین یکسانی ایجاد کردند.جاوا اسکریپت در ETH به طور خلاصه، سیستم تورینگ کامل می تواند هربخش منطقی از یک تابع محاسباتی را انجام دهد. زبان های برنامه نویسی، نه فقط ماشین ها، از کامل بودن تورینگ استفاده می کنند. یکی از این موارد جاوا اسکریپت است. جاوا اسکریپت یک زبان برنامه نویسی مهم است که برای کار با اتریوم و EVM و همچنین درک ترکیب و هماهنگی قسمت های مختلف زبان برنامه نویسی قراردادهای هوشمند اتریوم یعنی Solidity (زبان برنامه نویسی اتریوم)مورد نیاز است.جاوا اسکریپت در اتریومبرای کسب اطلاعات بیشتر در مورد جاوا اسکریپت و روش اتصال آن با اتریوم، می توانید مقدمه ما را در مورد JavaScript و Web3.js را مطالعه کنید.. اگر به Solidity علاقه دارید و نیاز به مقدمات دارید؛ می توانید برای درک جامع تر از قراردادهای هوشمند، پست Solidity ما را مطالعه کنید. Ivan on Tech Academy یک دوره عالی در مورد جاوا اسکریپت و ارتباط آن با بلاکچین دارد، توصیه می کنیم آن را مد نظر قرار دهید. ماشین مجازی اتریوم یا EVM چیست؟حالا شما ایده ای اولیه از ماهیت ماشین تورینگ کامل و مروری کلی از روش کار ماشین‌های مجازی دارید و به درک ماشین مجازی اتریوم و به خصوص EVM نزدیک‌تر شده‌ایم. در سال‌های اخیر، اتریوم مورد توجه قرار گرفته است، زیرا ثابت شده است که  اتریوم پیشرفتی مفهومی در بلاکچین و ایجاد شبکه‌های غیرمتمرکز داشته که بیش از پردازش تراکنش‌های نقدی پایه انجام می‌دهند. اگر توسعه‌دهنده پیشرفته‌تری هستید و می‌دانید که اتریوم چگونه کار می‌کند واین انتقال شبکه به اتریوم 2.0 را مهم می‌دانید، خوب است این دانش را از ماشین مجازی اتریوم (EVM) به  e WASM  در اتریوم 2.0 منتقل و به اشتراک بگذارید.کاربرانی که علاقه مند به آموزش های پیشرفته تر در مورد قراردادهای هوشمند اتریوم و EVM هستند، می توانند در کلاس های Ivan on Tech Academy&#039;s Ethereum Contract Programming 201 ثبت نام کنند. این دوره ها دانش عمیقی را در مورد چگونگی موفقیت در این فضا به شما ارائه می دهند و کمک می کند تا سرتیفیکیت دریافت کنید تا با به کارگیری مهارت های خود در پروژه های متعدد، به فرصت های کاری بهتری با مهارت های به دست آورده دست یابید. رابطی یوزرفرند در اتریومماشین حالت توزیع شدهتلاش اتریوم برای چیزی بالاتر از طرح نهائی است. این فقط یک دفتر کل توزیع نیست، بلکه چیزی بسیار پیچیده تر است. وب سایت اصلی اتریوم آن را به عنوان یک «ماشین موقعیت توزیع» توصیف می کند. اتریوم نه تنها داده‌های حساب‌ها یا موجودی‌ها را نگه می‌دارد، بلکه کل وضعیت ماشین را حفاظت می کند. ماشین در حالت توزیع با هر بلوک دیگری متفاوت است، زیرا ماشین با هر مجموعه ای از برنامه هایی که اجرا می کند طبق قوانین ثابت خاصی جابجا می شود. چه چیزی این تغییر حالات مبتنی بر قوانین خاص را تعیین می کند؟ این کار ماشین مجازی اتریوم است. پروتکل اتریوم همچنین از قراردادهای هوشمندی استفاده می کند که دستورالعمل های کدگذاری شده ای هستند که با ماشین مجازی اتریوم یا EVM تعامل دارند. این قراردادهای هوشمند برنامه هایی هستند که بسیاری از جنبه های مختلف رفتار انسانی را پوشش می دهند یا حداقل آنها را شبیه سازی می کنند. از این طریق می توانید ببینید که چرا طراحی اساسی اتریوم باید بسیار پیچیده تر از بیتکوین باشد.در حالی که اتریوم  منطبق برساختار پیچیده ای است، زبان برنامه نویسی رو به توسعه آن چنین نیست. برای جذب بیشتر مشارکت کنندگان در اکوسیستم اش، موسسین زبان برنامه نویسی کاربر پسندتری را انتخاب کردند تا یادگیری آن نسبتاً آسان باشد. Solidity، زبانی است که قراردادهای هوشمند اتریوم و dApps با آن نوشته می‌شود و نسبتاً ساده طراحی شده است. الگوهای رفتاری و ارتباطی انسان را شبیه سازی می کند و تلاش می کند در ترکیب بندی پیکره خود گویاتر و کاربرپسندتر باشد. شما این زبان کاربرپسند و قوی را دارید که به دستگاه می گوید چه کاری انجام دهد.قراداد های هوشمند چیستماشین مجازی اتریوم قطعی(متعین)است برنامه زمانی قطعی که خروجی یکسانی را برای مجموعه ورودی های یکسانی ارائه می دهد. این که کد چند بار اجرا شده مهم نیست چون برنامه های غیرمتمرکز یا dApps در اتریوم ممکن است تراکنش های مالی شامل مقادیر زیادی پول را در هر زمان انجام دهند. بنابراین، بسیار مهم است که بدانید کد در هر مرحله از اجرا چه واکنشی نشان خواهد داد.تعین گرا بودن و قطعیت برای ماشین مجازی اتریوم ضروری است.ماشین های مجازی اتریوم حفاظت شده استیکی دیگر از ویژگی های قرارداد هوشمند جداسازی برای حفاظت آن است. جداسازی و حفاظت نیز با استفاده از کانتینر های داکر و ماشین مجازی اتریوم تسهیل و عملی می شوند و چون کانتینر های داکر قطعی نیستند ، اتریوم با کمک ماشین مجازی خود این امکان را تکمیل می کند.جدا سازی به دلیل مواردی مانند هک ها و باگ هایی که ممکن است در قرارداد هوشمند باشند مهم اند و این ایزوله کردن باعث می شود که چنین حوادثی تاثیری در پروتکل اصلی نداشته باشند.ماشن مجازی اتریوم پایان پذیر استهمانطور که در بخش های بالا در مورد کامل بودن تورینگ ذکر شد، EVM یک تورینگ کامل است، به این معنی که قراردادهای هوشمند آن می تواند هر نوع مشکلی را، حداقل به صورت فرضی، حل کند. اما هیچ راهی برای تشخیص اینکه آیا چنین قراردادهای هوشمندی می توانند تمام عملیات داده شده را در یک چارچوب زمانی خاص به پایان برسانند وجود ندارد. بنابراین، قرار دادن یک مکانیسم&quot; فسخ &quot;برای ایجاد محدودیت های دقیق ضروری است. در اتریوم از مفهوم &quot;گس&quot;برای تسهیل ترافیک استفاده می شود. گس بخشی از مکانیسم تشویقی شبکه نیز هست که بر مبنای هزینه های گس(فی گس) در تعیین انتخابی عملکرد ها برای اجرا و اولویت بندی ها استفاده می شود. محدودیت های گس در ابتدا تعیین شده و در زمان اتمام  محدودیت ها ، ماشین به سادگی عملیات یا پردازش خود را متوقف می کند.اقتصاد EVMEVM یک اقتصاد ایجاد می کند. بامشوق های &quot;گس&quot; نظیر به نظیر دستگاه تورینگ کامل خود را تقویت می کند و از منابع جهان برای ساختن اقتصاد خود بهره می برد و به این ترتیب به دیدگاه&quot;کامپیوتر جهانی&quot;عمل می کند.چگونهEVM  به پروتکل ملتزم است؟ماشین مجازی هوشمند این امکان را ایجاد می کند که هر کسی از هر جایی به شبکه متصل شود و بدون نیاز به اعتماد سازی طرفینی کد خود را بسازد که این نتیجه گارانتی قراردادهای هوشمند کاملا قطعی است.(در بالا و ذیل مزیت های EVM توضیح داده شده است)با راهی برای محاسبه هزینه های &quot;گس&quot; برای یک قرارداد هوشمند، پروتکل، دریافت هزینه قبل از اجرای برنامه را ضمانت می کند و سیستم حق تقدم و مشوق ها را پشتیبانی می کند. اتریوم دارای اعتبارسنجی هائی است که اطلاعات همه تراکنش ها در شبکه را ضمانت می کند.(گارانتی همه تراکنش ها در اتریوم) تا از کافی بودن دارایی های فرستنده برای تامین اعتبار قرارداد هوشمند مطمئن شود و EVM در فرایند عملکرد خود با استثناء روبرو نشده است.معاملات هوشمند بدون دخالت و نیاز شخص ثالث در اتریوم </description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>م  پاکدل تبریزی</author>
                <pubDate>Fri, 03 Oct 2025 09:02:07 +0330</pubDate>
            </item>
                    <item>
                <title>چرا توی پانداز کسی از .query() استفاده نمی‌کنه؟</title>
                <link>https://virgool.io/codenevis/%DA%86%D8%B1%D8%A7-%D8%AA%D9%88%DB%8C-%D9%BE%D8%A7%D9%86%D8%AF%D8%A7%D8%B2-%DA%A9%D8%B3%DB%8C-%D8%A7%D8%B2-query-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D9%86%D9%85%DB%8C-%DA%A9%D9%86%D9%87-zzaqbzntjgpn</link>
                <description>این میخوای دیتات رو با دو تا شرط، فیلتر کنی. از کدوم این راه‌ها استفاده می‌کنی؟# Without .query()
result = df[(df[&quot;age&quot;] &gt; 18) &amp; (df[df[&quot;city&quot;] == &quot;Tehran&quot;])]
# With .query()
result = df.query(&quot;age &gt; 18 and city == &#039;Tehran&#039;&quot;)معمولا اولی، مگه نه؟ ولی خب متد query() توی پانداز میتونه به نوشتن کد خوانا‌تر کمک کنه. نوشتنش رو هم راحت‌تر می‌کنه. چشم‌نوازتر هم هست. دیگه چی می‌خوای؟خیلی ساده: کوئری چیکار می‌کنه؟با استفاده از این متد، میتونیم شرط‌هایی رو که برای فیلتر کردن داده داریم، مشابه همون سینتکسی که توی SQL دیده می‌شه، روی دیتافریم اعمال کنیم:df.query(&quot;name = &#039;Reza&#039;&quot;)و اگر منطق پیچیده‌تری داشتیم، با استفاده از عملگرهای منطقی مختلف، از جمله and و or با هم ترکیب کنیم:df.query(&quot;name = &#039;Reza&#039; and age &gt; 23&quot;)اگر توی اسم یک ستون، فاصله یا علائم خاص دیگه وجود داشت چی؟df.query(total sales &gt; 100&quot;)اگر نیاز بود توی فیلتری که داریم، از یک متغیر دیگه توی همون نوت بوک/کد استفاده کنیم، چه کنیم؟threshold = 5
df.query(&quot;col &gt; @threshold&quot;)محدودیت‌های متد query() چیا هستن؟اگر می‌خوایم یه فیلتر پیچیده رو اعمال کنیم، مثلا این مورد:mask = (df[&quot;col&quot;] &gt; 5) &amp; (df[&quot;city&quot;].str.startswith(&quot;T&quot;)) 
df = df[mask]استفاده از query() دیگه جزو گزینه‌هامون نیست. این متد هرچند که کار رو خیلی وقتها راحت‌تر می‌کنه، اما با خودش محدودیت‌هایی هم میاره.کجا این، کجا اون؟سوالی که پیش میاده اینه که بچسبیم به همون روش قدیمی که کاملتره از نظر کاربرد، اما ناخوانا‌تره؟ نه لزوما. توی این مواقع بهتره از query() استفاده کنیم:می‌خوایم شرط‌های ساده اما پرتعدادی رو اعمال کنیم.توی نوت‌بوک/EDAهایی که میخوایم سریع یه سری چیز رو بررسی کنیم.توی این موارد بهتره که از این روش استفاده نکنیم:اسامی ستون‌های دیتافریم تر و تمیز نیستن و کاراکتر خاص زیاد دارن.کدی رو داریم توسعه می‌دیم که برای محیط پروداکشن قراره استفاده بشه، نه توی نوت‌بوک و .EDAمنطق کد پیچیده‌ست و استفاده از query() دوباره کد رو ناخوانا می‌کنه.اینجا چه خبره؟من رضا ام و هر از گاهی مطالب مرتبط با پایتون و تحلیل‌داده منتشر می‌کنم. اینجا منو دنبال کن تا بعدی‌ها رو از دست ندی.</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>رضا کشاورز</author>
                <pubDate>Wed, 01 Oct 2025 16:27:25 +0330</pubDate>
            </item>
                    <item>
                <title>قسمت ۱ : استفاده از آردینو به عنوان پروگرمر</title>
                <link>https://virgool.io/codenevis/%D9%82%D8%B3%D9%85%D8%AA-%DB%B1-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A2%D8%B1%D8%AF%DB%8C%D9%86%D9%88-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%D9%BE%D8%B1%D9%88%DA%AF%D8%B1%D9%85%D8%B1-lm8awdvqzwkt</link>
                <description>اگر از علاقه مندان به آردینو هستید و آماده اید تا خودتون رو از محدودیت های برد و محیط برنامه نویسی آردینو رها کنید و به برنامه نویسی بدون واسطه برای میکروکنترلرها بپردازید، اولین ابزاری که برای آپلود کدهای خود بر روی میکروکنترلر نیاز دارید یک پروگرمر ISP programmer خواهد بود و اولین قدم در این مسیر تهیه این ابزار، از بازار و یا استفاده از همان برد آردینویی که در اختیار دارید به عنوان پروگرمر هستش.در این قسمت از سری مقالات برنامه نویسی C برای AVRها، مراحل مورد نیاز برای استفاده از برد آردینویی که دارید به عنوان پروگرمر، طرز سیم کشی بین آردینو و میکروکنترلر و تفاوت بین استفاده از بوتلودر آردینو و فلش مستقیم کد رو به طور کامل بررسی میکنیم و در نهایت نکاتی درباره فیوزهای میکروکنترلر مرور میکنیم که باعث میشن نتونید تراشتون رو خراب کنید.چرا به ISP نیاز داریم؟برنامه نویسی داخل سیستمی (ISP:In-system programming) روشی برای برنامه نویسی میکروکنترلرها هستش برای وقتی که میکروکنترلرها در مدار قرار دارند، برای همین بهش &quot;درون سیستمی&quot; میگن. این روش از یک پروتکل سریال بر روی پین های SPI برای ارتباط بین پروگرمر و میکروکنترلر هدف استفاده میکنه، که باعث میشه بتونید بدون برداشتن تراشه، امضای دستگاه رو بخونید، فیوز ها رو تغییر بدید و نرم افزار جدید رو روی تراشه مورد نظر آپلود کنید.بخشی از تنوع مدل های AVRولی چرا از ISP و C بجای برنامه نویسی در محیط راحت تر آردینو استفاده میکنیم ؟۱. بدون سربار (overhead) بوت لودربوتلودر آردینو علاوه بر اشغال کردن حدود ۲ کیلوبایت از حافظه محدود و ارزشمندی که روی میکروکنترلر در اختیار داریم، باعث ایجاد تاخیر در راه اندازیش هم میشود. این تاخیر و حجم اشغال شده موقع کار با C خالص و استفاده از ISP وجود ندارند و میتوانید از تمام فضای تراشه برای کدهای خود استفاده کنید.۲. انعطاف پذیری بیشترآردینو در مدل های مختلفی برای خرید ارائه شده است ولی این تنوع نسبت به تنوع میکروکنترلرهای AVR خیلی چشم گیر نیست. برای مثال تراشه ATmega16 که در این سری از آن استفاده خواهیم کرد در مدل های ۲۸ و ۳۲ و ۴۰ و ۴۴ پین در دو مدل smdو dip موجود است که محیط برنامه نویسی آردینو از هیچ کدام آنها پشتیبانی نمیکند.۳. مقرون به صرفههزینه خرید یک پروگرمر ساده به همراه یک میکروکنترلر Atmega328 که در آردینو استفاده میشود، باز هم نسبت به خرید آردینو مقرون به صرفه تر خواهد بود، در حالی که امکان استفاده از پروگرمر را با تراشه های مختلف و در پروژه های دیگر بدون هزینه اضافی خواهید داشت. همچنین امکان انتخاب دقیق تراشه با توجه به نیاز های پروژه خود در هنگام تولید انبوه محصول میتواند هزینه های تولید انبوه را به حداقل برساند.استفاده از آردینو به عنوان ISPقبل از هرکاری مطمعن شوید که مراحل مورد نیاز را انجام داده اید و وسایل مورد نیاز را تهیه کرده اید.سری ابزار مورد نیاز برای برنامه نویسی AVR که در قسمت ۰ نصب کردیم.avr-gcc, make, avrdudeیک برد آردینو برای تبدیل کردن به پروگرمر (برد شما خراب نمیشود و این پروسه قابل بازگشت است)نرم افزار آردینو Arduino IDEیک میکروکنترلر AVR (ما از ATmega16 استفاده میکنیم)یک برد بورد و تعدادی سیم برای اتصالاتیک خازن 10μF الکترولیتیمرحله ۱: آماده کردن آردینونرم افزار آردینو رو باز کنید و سپس از بخش مثال ها، ArduinoISP را باز کنید.File &gt; Examples &gt; 11.ArduinoISP &gt; ArduinoISPبرد خود را انتخاب کنید و فایل باز شده را بر روی آن آپلود کنید.تمام! برد شما آماده استفاده به عنوان پروگرمر است.مرحله ۲: غیرفعال کردن ریست خودکار آردینوتصویر مدار پس از اتصالاتخازن 10μF الکترولیتی که تهیه کردید را بین پایه های RESET و GND روی برد آردینو قرار بدهید.اهمیت این کار این است که برد های آردینو موقع مشغول شدن توسط نرم افزار هایی مثل avrdude ریست میشن ولی ما داریم از این برد به عنوان پروگرمر استفاده میکنیم و برد آردینومون تمام مدت باید هشیار باشه که خازن جلوی این فرمان ریست رو میگیره.مرحله ۳: تشخیص پایه های تراشهبرای برنامه نویسی با ISP پروگرمر نیاز به تشخیص ۴ پایه روی تراشمون داریم.SCK, MOSI, MISO, RESETتصویر نتیجه برای عبارت ATmega16 pinoutبرای تشخیص این ۴ پایه، میتونید اسم تراشتون رو به همراه عبارت pinout گوگل کنید و داخل تصاویر دنبال این پایه ها بگردید.همچنین باید ۲ تا پایه vcc, AVCC و دو پایه GND تراشتون رو هم از داخل تصویر پیدا کنید.مرحله ۳: سیم کشی بین برد و تراشهشماتیک مدار بین آردینو و میکروکنترلرشماره پایه های گفته شده در این مرحله مربوط به ATmega16 هست و در صورت استفاده از تراشه ای غیر از اون میتونید از طریق مرحله قبل پایه های مربوطه رو پیدا کنید.+5 ولت آردینو به AVCC و VCC ( پایه های ۱۰ و ۳۰)پایه منفی آردینو به GND ها (پایه های ۱۱ و ۳۱)پایه ۱۰ آردینو SS/Reset به شماره ۹ تراشه RESETپایه ۱۱ آردینو MOSI به پایه ۶ تراشه MOSIپایه ۱۲ آردینو MISO به پایه 7 تراشه MISOپایه ۱۳ آٰردینو SCK به پایه ۸ تراشهSCKاگر تراشه شما دسته دو هست و فیوزهای اون قبلا برای استفاده از کلاک خارجی آماده شدن، برای استفاده از اون نیاز به وصل کردن کریستال مورد نظرتون به پایه های XTAL1 و XTAL2 (شماره ۱۲ و ۱۳) دارید ولی در این مرحله از آموزش برای تراشه های نو نیاز به این کار نیست و تراشه ها به صورت پیش فرض از کلاک ۱MHz داخلی استفاده میکنند.مرحله ۵: روشن کردنآردینو را به کامپیوتر خود متصل کنید تا هردو تراشه روشن بشوند. سپس برای اطمینان از صحت اتصالات میتوانید از قطعه کد زیر در ترمینال خود استفاده کنید و خوانده شدن صحیح امضای دستگاه به معنی درست بودن سیم کشی ها میباشد. کارمون همینجا تمومه و توی قسمت بعدی قراره اولین برناممون رو آپلود بکنیم!avrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -vمقدار m16 مربوط به atmega16 هست و در صورت استفاده از مدل های دیگه باید مدل میکروکنترلر خودتون رو جایگزینش کنید.فیوز AVR چیه و چطور تراشمون رو خراب نکنیمفیوزها تنظیمات ثابت سخت افزاری هستند که با مقادیر خودشون مشخص میکنند که تراشمون برای مثال از چه فرکانس خارجی یا داخلی ای استفاده میکنه، رفتارش با eeprom موقع آپلود کد و تنظیمات دیگه رو تعیین میکنه.این فیوز ها از حافظه های فلش و eeprom جدا هستند.برای ATmega16 این فیوزها وجود دارند و میتونید از داخل دیتاشیت اون بیشتر دربارشون بخونید.فیوز پایین (LFUSE)وظیفه کنترل کلاک و تعیین استفاده از نوسان داخلی یا خارجی و سرعت اون رو بر عهده داره. برای مثال مقدار 0xE1 به معنی فرکانس 8MHz داخلی این مدل هستش.فیوز بالا (HFUSE)مقدار ۰یا۱ برای SPIEN امکان آپلود کد از طریق SPI رو فعال و غیرفعال میکنه.مقدار BOOTSZ حجم کد بوت رو مشخص میکنه. مقدار 0x00 به معنی کل حافظه فلش به عنوان بوت لودر هست.تغییر RSTDISBL به ۱ به معنی استفاده از پین ریست به عنوان ورودی و خروجی و عدم استفاده به عنوان پین ریست هست!تغییر BODLEVEL برای تعیین رفتار تراشه در صورت افت ولتاژبرای خواندن وضعیت فعلی فیوزها از روی تراشه میتوانید از فرمان زیر استفاده کنید.avrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:hبرای تنظیم کردن فیوز ها به مقادیر جدید میتوانید از کد زیر استفاده کنیدavrdude -c arduino -p m16 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xE4:mچطور تراشمون رو تبدیل به آجر نکنیم!همیشه قبل از تغییر فیوزها، اول مقادیر فعلی اونها رو بخونید و ازشون پشتیبان بگیرید تا در صورت وجود مشکل بتونید برگردید.از ماشین حساب های آنلاین مثل Engbedded محاسبه مقادیر فیوزها برای محاسبه استفاده کنید تا جلوی اشتباهات محاسباتی رو بگیرید.به فیوز RSTDISBL دست نزنید! تغییر مقدار اون باعث میشه که تراشتون از روش های معمولی قابل برنامه نویسی نباشه.روشن کردن BODLEVEL باعث میشه که تراشتون در صورت وجود افت ولتاژ خودش رو ریست بکنه.در صورت نیاز به تغییر فیوزها ، اونها رو یکی یکی تغییر بدید و توی هر مرحله تست کنید که آیا تراشتون سالمه یا نه.مشکلات رایج استفاده از avrdude و ArduinoISPحتی با اتصالات بی نقص هم ممکنه به مشکلاتی بر بخورید که اینجا مرورشون میکنیم.avrdude: stk500_getsync(): not in sync: resp=0x00programmer not respondingاحتمالا خازن 10μF به درستی بین پایه های reset و gnd آردینو قرار داده نشده است.یا ممکن است که مقدار baudrate (-b 19200) با مقدار ArduinoISP متفاوت باشد که میتوانید از داخل اسکچ مقدار درست را بررسی کنید.avrdude: Yikes! Invalid device signatureمقدار اشتباه برای مدل تراشه در دستور avrdudeاشتباه در سیم کشی (معمولا miso و mosi)خاموش بودن تراشه هدف ( اتصالات مثبت و منفی را چک کنید)avrdude: error: could not find USB deviceپورت اشتباهی را در avrdude انتخاب کرده اید، برای پیدا کردن مقدار صحیح در لینوکس از lsusb و در ویندوز از Device Manager استفاده کنید تا پورت درست را پیدا و جایگزین مقدار dev/ttyACM0 در دستورات کنید.avrdude: verification errorکد فلش شده است ولی تایید نمیشود. میتوانید سرعت ارتباط را از 19200به مثلا 9600 کاهش دهید.rc=-1 یا no responseفیوزها رو تغییر دادید و باید از کریستالی که در فیوزها مشخص کردید استفاده کنید.Permission deniedدسترسی کافی به avrdude داده نشده است. داخل لینوکس از sudo و در ویندوز از run as admin استفاده کنید.سرعت آپلود کد ها کم هستسرعت ارتباط پایین هستش و در صورت کشش و ثابت بودن ارتباط میتونید از مقادیر بالاتر مثل 115200 استفاده کنید. برای این کار، داخل اسکچ آردینو مقدار رو مشخص کنید و موقع صدا کردن avrdude از مقدار جدید استفاده کنید.در صورت نبودن مشکل شما در لیست بالا میتونید از -v برای نمایش جزییات avrdude استفاده کنید و با استفاده از خطاهای موجود سوالتون رو مطرح کنید.صبور باشید! بیشتر مشکلات معمولا به سیم کشی یا تنظیمات برمیگردن و وقتی که کار کنن دیگه چیزی جلودارتون نیست :)جمع بندی و قسمت بعددر این مقاله یاد گرفتیم که چطور از برد آردینویی که داریم به عنوان پروگرمر ISPاستفاده کنیم، به جزییاتش مثل تنظیمات و سیم کشی ها و مشکلات رایجش پرداختیم و گفتیم که فیوزها اصلا چی هستن و به چه درد میخورن.در مقاله بعدی یاد میگیریم که پورت و رجسیتر ها چی هستن، بعدشم کد یک LED ساده چشمک زن (لذت بخش ترین کد ممکن)‌ رو با avr-gcc کامپایل و با استفاده از avrdude اون رو روی تراشمون فلش می کنیم.led و مقاومتاتون رو آماده کنید که قسمت بعدی مقاله قراره با جادو روشنش کنید.</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>KAYT33N  | کیان</author>
                <pubDate>Wed, 01 Oct 2025 14:36:37 +0330</pubDate>
            </item>
                    <item>
                <title>یه ایده یه استارتاپ ..... پروژه سنج</title>
                <link>https://virgool.io/codenevis/%DB%8C%D9%87-%D8%A7%DB%8C%D8%AF%D9%87-%DB%8C%D9%87-%D8%A7%D8%B3%D8%AA%D8%A7%D8%B1%D8%AA%D8%A7%D9%BE-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%B3%D9%86%D8%AC-i0fqc4uziloj</link>
                <description> 💬 یکی از چالشهای همیشگی ما برنامه نویس ها، قیمت گذاری پروژه هاست. واقعیت اینه که هیچ فرمول قطعی برای تعیین نرخ وجود نداره و معمولاً یا بر اساس تجربه شخصی و عرف بازار یه قیمت داده میشه.🔊 برای اینکه لازم نباشه هر بار ماشین حساب برداری و حساب کتاب کنی، یه ابزار آنلاین ساختیم به اسم پروژه سنج🍂 کافیه نرخ پایه و ضریب های پروژه (مثل پیچیدگی، تعداد نفرات یا مدت زمان) رو وارد کنی تا  هزینه کل پروژه محاسبه بشه.✨البته مثل هر فرمول دیگه ای، تجربه شخصی هم همچنان مهمترین عامل تصمیم گیری هست. 🚀🌳 شما چه جوری برای یه پروژه هزینه و زمان رو برآورد می کنید ؟🌳 چه پیشنهادی برای بهتر شدن این ابزار دارید؟همین الان می توانید  به صورت رایگان از این ابزار استفاده کنید 👍 یا 👎 ؟شــــــ🌱ـــــروع</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>شروع</author>
                <pubDate>Tue, 30 Sep 2025 20:24:40 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده‌سازی فایل سیستم CD-ROM بر روی رزبری پای پیکو</title>
                <link>https://virgool.io/codenevis/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%81%D8%A7%DB%8C%D9%84-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-cd-rom-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B1%D8%B2%D8%A8%D8%B1%DB%8C-%D9%BE%D8%A7%DB%8C-%D9%BE%DB%8C%DA%A9%D9%88-v2vxk7fj4t8k</link>
                <description>هفته پیش برای کاری، مبدل یو اس بی به شبکه رو تست می‌کردیممبدل USB به Ethernetاین مبدل‌ها معمولا یه تراشه RTL8152/8153 از RealTek  دارند یا AX88772/88179 از ASIX  نکته‌ای که توجه‌ام رو جلب کرد و البته در یکی دو مورد دیگه هم دیده بودم، این بود که با اتصال USB به لپتاپ، درایوی مشابه CD-ROM باز می‌شد که درایور مورد نیاز سخت‌افزار همراهش بود.به نظرم ایده خوبی اومد و سعی کردم روی یه Raspberry Pi Pico پیاده‌سازی کنم که با اتصال Raspberry Pi Pico به لپتاپ از راه USB یه فایل و برنامه بتونه اجرا شه برای کار با دستگاه.رزبری پای پیکویه مشکل این بود که برای برنامه‌ ریختن روی رزبری پیکو هم از USB OTG استفاده میشه و باید این کارکرد ۲گانه حفظ می‌شد. یعنی در کنار اینکه خود رزبری به عنوان درایو USB DISK شناخته می‌شد، باید جداگانه به عنوان CD-ROM شناخته می‌شد که اجازه تغییر هم نده و فقط خواندنی باشه.ملاحظه بعدی RAM پایین دستگاه بود264KB of on-chip SRAM2MB of on-board QSPI Flashبرای فایل سیستم  FAT12 انتخاب شد که سبکتر بود.ساختار صحیح فایل‌سیستم FAT12برای اینکه کامپیوتر بتونه درایو ما را بخونه، باید یک فایل‌سیستم معتبر روی آن ایجاد می‌شد. فایل‌سیستم کلاسیک FAT12 را انتخاب کردم که برای درایوهای کوچک بهینه است. ساختار FAT12 فقط مجموعه‌ای از بایت‌ها نیست، نقشه دقیق و منظمیه که شامل بخش‌های زیر می‌شود:Boot Sector (بوت سکتور): شناسنامه دیسک که اطلاعات حیاتی مانند حجم سکتور و تعداد کلاسترها را در خود دارد.FAT Tables (جداول تخصیص فایل): قلب فایل‌سیستم که وضعیت هر کلاستر (آزاد، اشغال‌شده، یا خراب) را مشخص می‌کنه.Root Directory (پوشه ریشه): اطلاعات فایل‌ها و پوشه‌ها مانند نام و آدرس کلاستر شروع آن‌ها درش ذخیره میشه.Data Area (ناحیه داده‌ها): محتوای واقعی فایل‌ها در این بخش قرار می‌گیرد.این ساختار باید با دقت و بایت به بایت در حافظه فلش پیکو شبیه‌سازی می‌شد.پیاده‌سازی نگاشت صحیح کلاستر به سکتوردر FAT12، داده‌ها در واحدهایی منطقی یا در حافظه به نام «کلاستر» (Cluster) سازماندهی می‌شن، اما روی دیسک بصورت فیزیکی به نام «سکتور» (Sector) ذخیره می‌شن. یک چالش مهم، تبدیل آدرس منطقی کلاستر به آدرس فیزیکی سکتور بود. برای مثال، کلاستر شماره ۲ (اولین کلاستر قابل استفاده برای داده) باید به سکتور شماره ۴ نگاشت می‌شد. ذخیره‌سازی فایل‌های چند سکتوری با زنجیره‌سازی کلاسترهایک فایل ممکن است بزرگ‌تر از یک کلاستر باشد و در بخش‌های مختلف دیسک پراکنده شود. فایل‌سیستم FAT12 از یک روش هوشمندانه برای پیوند دادن این بخش‌ها استفاده می‌کند که به آن «زنجیره‌سازی کلاستر» (Cluster Chaining) می‌گویند که در واقع یک فهرست پیوندی یا Linked List هست. در جدول FAT، هر ورودی به کلاستر بعدی که حاوی ادامه فایل است، اشاره می‌کند. نکته فنی جالب در FAT12 این است که هر ورودی ۱.۵ بایت (۱۲ بیت) فضا اشغال می‌کند! مدیریت این ساختار نامتعارف برای اطمینان از خوانده شدن کامل فایل‌های بزرگ، یکی از نکات مهمه.رعایت الزامات فرمت نام‌گذاری ۸.۳فایل‌سیستم FAT محدودیت‌های خاصی برای نام‌گذاری فایل‌ها دارد که به فرمت «۸.۳» معروفه:۸ کاراکتر برای نام و ۳ کاراکتر برای پسوند. چالش کامپایل و کتابخانهچون مدتیه کدهای embedded رو در حد امکان با Rust می‌نویسم سر استفاده از کتابخانه معروف  Adafruit TinyUSB و هم چنین کامپایل خروجی Rust با فرمت uf2 فرمت UF2 یا USB Flashing Formatمعمولا برای فلش کردن و برنامه ریختن به ابزارهایی مثل J-Link و ST-Link و ... نیازه.برای ساده کردن فرایند برنامه‌ریزی روی زربری پای پیکو و برخی انواع دیگه بوردها و میکروکنترلرها، فرمت UF2 ابداع شده که کار رو بصورت کپی کردن ساده فایل روی بورد تبدیل کرده.قبل اتصال بورد به کامپیوتر، دکمه BOOTSEL یا انتخاب بوت‌لودر رو نگه می‌دارید تا بورد هنگام اتصال یه درایو USB عادی شناخته بشه. بعد از کپی فایل پسوند uf2. اگه فایل درست باشه، بورد بعد مدت کوتاهی ری‌استارت میشه و برنامه جدید اجرا میشه.</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>عباس پالاش</author>
                <pubDate>Tue, 30 Sep 2025 18:24:17 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی لاراول (Laravel): محبوب‌ترین فریم‌ورک PHP در ایران و جهان</title>
                <link>https://virgool.io/codenevis/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-laravel-%D9%85%D8%AD%D8%A8%D9%88%D8%A8-%D8%AA%D8%B1%DB%8C%D9%86-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-php-%D8%AF%D8%B1-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D9%88-%D8%AC%D9%87%D8%A7%D9%86-ayemzzllpuur</link>
                <description>در سال‌های اخیر، فضای توسعه وب در ایران تغییرات زیادی را تجربه کرده است. یکی از مهم‌ترین این تغییرات، ظهور و محبوبیت گسترده‌ی فریم‌ورک لاراول (Laravel) بوده است. لاراول که اولین بار در سال ۲۰۱۱ معرفی شد، اکنون به یکی از پرکاربردترین ابزارهای توسعه وب تبدیل شده است.لاراول بر اساس معماری MVC ساخته شده و به همین دلیل نظم و ساختار مشخصی به پروژه‌های وب می‌دهد. این ویژگی برای تیم‌های توسعه، به‌خصوص در پروژه‌های بزرگ، اهمیت بسیار زیادی دارد.مزایای اصلی لاراول:Eloquent ORM برای مدیریت ساده و سریع دیتابیسBlade Template Engine برای طراحی رابط کاربری جذابسیستم Authentication داخلی و ایمنمقیاس‌پذیری بالا برای استارتاپ‌ها و کسب‌وکارهای در حال رشدچرا لاراول در ایران محبوب است؟با توجه به رشد استارتاپ‌ها و نیاز به توسعه سریع و امن، لاراول در میان برنامه‌نویسان ایرانی به شدت محبوب شده است. بسیاری از فروشگاه‌های اینترنتی، سامانه‌های رزرو آنلاین، وبسایت‌های آموزشی و حتی سیستم‌های دولتی با این فریم‌ورک ساخته می‌شوند.آینده لاراول در ایرانبا روند رو به رشد دیجیتالی شدن کسب‌وکارها، پیش‌بینی می‌شود لاراول در سال‌های آینده نقش پررنگ‌تری در صنعت وب ایفا کند.پس اگر به دنبال ورود جدی به دنیای توسعه وب هستید، یادگیری لاراول یک انتخاب هوشمندانه است.HelloDev | هلودِوبرنامه نویسی و توسعه وب</description>
                <category>روزمرگی های برنامه نویسان 🌿</category>
                <author>MrSDTs</author>
                <pubDate>Tue, 30 Sep 2025 08:50:54 +0330</pubDate>
            </item>
            </channel>
</rss>