<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Mahdi</title>
        <link>https://virgool.io/feed/@mtioji</link>
        <description>به دنیای برنامه نویسی من خوش اومدین! اینجا می‌نویسم تا هم چیزایی که یاد می‌گیرم رو ثبت کنم، هم باهاتون در ارتباط باشم</description>
        <language>fa</language>
        <pubDate>2026-04-15 06:47:04</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1342695/avatar/4tmadG.jpg?height=120&amp;width=120</url>
            <title>Mahdi</title>
            <link>https://virgool.io/@mtioji</link>
        </image>

                    <item>
                <title>🔹 پردازش زبان طبیعی (NLP) به زبان ساده</title>
                <link>https://virgool.io/@mtioji/%F0%9F%94%B9-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B7%D8%A8%DB%8C%D8%B9%DB%8C-nlp-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-vi8vpm8kjyyv</link>
                <description>⚡️ پردازش زبان طبیعی (NLP) چیه؟NLP شاخه‌ای از هوش مصنوعیه که به ماشین‌ها کمک می‌کنه زبان انسان‌ها رو بفهمن و پردازش کنن. از چت‌بات‌ها مثل من گرفته تا تحلیل متن و ترجمه ماشینی، همه‌جا ردپای NLP دیده می‌شه! توی این پست، ۱۵ مفهوم کلیدی NLP رو با زبون ساده توضیح می‌دم تا هم مبتدی‌ها لذت ببرن و هم حرفه‌ای‌ها نکات تازه‌ای یاد بگیرن. 🚀۱. کورپوس: کتابخونه عظیم متن‌ها 📚 ⚡️کورپوس یه مجموعه بزرگ و سازمان‌یافته از متونه (مثل کتاب، مقاله، یا توییت) که برای تحلیل زبان استفاده می‌شه. مثل یه کتابخونه دیجیتال که مدل‌های NLP ازش یاد می‌گیرن.مثال: پروژه گوتنبرگ (Gutenberg) یه کورپوس پر از رمان‌ها و شعرهای کلاسیکه.چرا مهمه؟ کورپوس داده خام برای آموزش مدل‌های زبانی و تحلیل الگوهای زبانیه.۲. توکن‌سازی: تکه‌تکه کردن متن 🔪⚡️توکن‌سازی متن رو به واحدهای کوچک‌تر و معنادار (مثل کلمات یا جملات) تقسیم می‌کنه. مثل اینه که یه پاراگراف رو به کلماتش خرد کنی.مثال: جمله &quot;من عاشق کتابم&quot; می‌شه: [&quot;من&quot;, &quot;عاشق&quot;, &quot;کتابم&quot;].چرا مهمه؟ این کار پایه تحلیل‌های بعدی مثل استخراج معنا یا ترجمه‌ست.۳. تأثیر توکن‌سازی: پل برای تحلیل‌های بعدی 🌉⚡️با تبدیل متن به توکن‌ها، مدل‌های NLP می‌تونن ساختار جمله و روابط بین کلمات رو بهتر بفهمن. مثلاً، برای تحلیل گرامر یا معنی جمله.مثال: توکن‌های [&quot;من&quot;, &quot;به&quot;, &quot;مدرسه&quot;, &quot;می‌روم&quot;] به مدل کمک می‌کنن تا نقش هر کلمه رو تشخیص بده.چرا مهمه؟ بدون توکن‌سازی، تحلیل متن مثل گشتن تو تاریکیه!۴. عبارات منظم (Regex): کارآگاه الگوها 🔍⚡️ عبارات منظم ابزارهایی برای پیدا کردن الگوهای خاص توی متنن، مثل ایمیل، شماره تلفن، یا تاریخ.مثال: برای پیدا کردن ایمیل (مثل ali@example.com) یا تاریخ (مثل 2025-10-19).چرا مهمه؟ Regex برای پیش‌پردازش متن و استخراج اطلاعات خاص عالیه.۵. Regex در مقابل توکن‌ساز: کدوم بهتره؟ ⚖️⚡️برای الگوهای خاص مثل کلماتی که عدد دارن (مثل &quot;A12B&quot; یا &quot;X5&quot;)، Regex بهتر از توکن‌سازهای استاندارده، چون دقیق‌تر الگوها رو پیدا می‌کنه.مثال: توکن‌ساز جمله رو به کلمات تقسیم می‌کنه، ولی Regex می‌تونه &quot;Room101&quot; رو سریع پیدا کنه.چرا مهمه؟ Regex برای داده‌های ساختاریافته و خاص یه ابزار قدرتمنده.۶. استاپ‌ورد‌ها: کلمات پرحرف، کم‌معنی 🗑️⚡️ استاپ‌ورد‌ها چیه؟کلمات رایجی مثل &quot;و&quot;، &quot;در&quot;، &quot;از&quot; که اطلاعات معنایی کمی دارن و توی متن زیاد تکرار می‌شن.چرا حذفشون می‌کنیم؟ چون نویز ایجاد می‌کنن و تمرکز رو از کلمات کلیدی می‌گیرن.مثال: توی &quot;من به مدرسه می‌روم&quot;، کلمه &quot;به&quot; ممکنه استاپ‌ورد باشه.چرا مهمه؟ حذف استاپ‌ورد‌ها دقت تحلیل‌های NLP رو بالا می‌بره.۷. خطر حذف استاپ‌ورد‌ها: گم کردن زمینه ⚠️⚡️بعضی وقتا استاپ‌ورد‌ها معنی جمله رو نگه می‌دارن. حذفشون ممکنه زمینه (context) متن رو خراب کنه.مثال: توی &quot;این خوب نیست&quot;، حذف &quot;نیست&quot; معنی رو کامل عوض می‌کنه!چرا مهمه؟ باید با دقت حذفشون کنیم تا معنی متن گم نشه.۸. ریشه‌یابی (Stemming): ساده‌سازی کلمات ✂️⚡️ریشه‌یابی کلمات رو با حذف پسوندها به شکل پایه تبدیل می‌کنه، بدون توجه به معنی.مثال: &quot;دویدن&quot;، &quot;دوید&quot;، و &quot;دوندگان&quot; به &quot;دوید&quot; تبدیل می‌شن.محدودیتش چیه؟ ممکنه کلمات غیرواقعی تولید کنه (مثل &quot;studi&quot; برای &quot;studies&quot;) که معنی‌شون گم می‌شه.چرا مهمه؟ ریشه‌یابی برای کاهش تنوع کلمات و ساده‌سازی تحلیل مناسبه.۹. لنکستر در مقابل پورتر: کدوم تهاجمی‌تره؟ 🥊⚡️هر دو ابزار ریشه‌یابی هستن، ولی لنکستر (Lancaster Stemmer) تهاجمی‌تره و کلمات رو کوتاه‌تر می‌کنه (مثل &quot;studies&quot; به &quot;studi&quot;). پورتر (Porter Stemmer) محافظه‌کارتره و ساختار کلمه رو بهتر حفظ می‌کنه.مثال: برای &quot;running&quot;، پورتر می‌گه &quot;run&quot;، ولی لنکستر ممکنه کوتاه‌تر کنه.چرا مهمه؟ انتخاب ابزار مناسب به نیاز تحلیل بستگی داره.۱۰. لماتیزیشن: ریشه‌یابی هوشمند 🧠⚡️لماتیزیشن کلمات رو به شکل معتبر لغت‌نامه‌ای (lemma) تبدیل می‌کنه، با توجه به زمینه و نقش دستوری (POS).تفاوتش با ریشه‌یابی؟ لماتیزیشن دقیق‌تره و کلمات واقعی تولید می‌کنه (مثل &quot;studies&quot; به &quot;study&quot;).مثال: &quot;رفتن&quot;، &quot;رفت&quot;، و &quot;رفته&quot; به &quot;رفت&quot; تبدیل می‌شن.چرا مهمه؟ برای تحلیل‌های معنایی که نیاز به کلمات واقعی دارن، لماتیزیشن بهتره.۱۱. چانکینگ: پیدا کردن عبارات معنادار 🧩⚡️چانکینگ کلمات رو به عبارات معنادار (مثل عبارات اسمی یا فعلی) گروه‌بندی می‌کنه.مثال: توی &quot;گربه سیاه روی دیوار&quot;، چانکینگ &quot;گربه سیاه&quot; رو به‌عنوان عبارت اسمی جدا می‌کنه.چرا مهمه؟ برای درک ساختار جمله و استخراج اطلاعات پیچیده‌تر لازمه.۱۲. هیپونیم و حیوانات: سگ و حیوان 🐶⚡️ هیپونیم چیه؟هیپونیم کلمه‌ایه که مفهوم خاص‌تری نسبت به یه دسته کلی‌تر (هایپرنیم) داره.مثال: &quot;سگ&quot; (dog) هیپونیم &quot;حیوان&quot; (animal) هست، چون حیوان دسته کلی‌تریه.چرا مهمه؟ این روابط در پایگاه‌های داده مثل WordNet برای تحلیل معنایی استفاده می‌شن.۱۳. ماشین و وسیله نقلیه: رابطه مشابه 🚗⚡️ رابطه &quot;car&quot; و &quot;vehicle&quot; چیه؟&quot;ماشین&quot; (car) هیپونیم &quot;وسیله نقلیه&quot; (vehicle) هست، چون ماشین یه نوع خاص از وسیله نقلیه‌ست.مثال: مثل رابطه &quot;سگ&quot; و &quot;حیوان&quot;، &quot;vehicle&quot; دسته کلی‌تریه.چرا مهمه؟ درک این روابط برای تحلیل معنایی و سازمان‌دهی داده‌های متنی ضروریه.۱۴. شناسایی موجودیت‌های نام‌دار (NER): پیدا کردن اسامی خاص 🏷️⚡️NER اسامی خاص مثل سازمان‌ها (&quot;گوگل&quot;)، مکان‌ها (&quot;پاریس&quot;)، یا تاریخ‌ها (&quot;ژانویه 2023&quot;) رو شناسایی می‌کنه.مثال: توی &quot;گوگل در پاریس دفتر باز کرد&quot;، NER &quot;گوگل&quot; و &quot;پاریس&quot; رو پیدا می‌کنه.چی جزو NER نیست؟ افعال (مثل &quot;running&quot;) چون خاص و ملموس نیستن.چرا مهمه؟ NER برای استخراج اطلاعات مشخص از متن کاربردیه.🎯 نکات کلیدی برای یادگیری NLPکورپوس منبع داده‌های متنی برای تحلیل زبانه.توکن‌سازی و چانکینگ پایه‌های تحلیل ساختار جمله‌ن.Regex برای الگوهای خاص مثل ایمیل و تاریخ عالیه.استاپ‌ورد‌ها رو با احتیاط حذف کن تا معنی متن گم نشه.ریشه‌یابی و لماتیزیشن برای ساده‌سازی کلماتن، ولی لماتیزیشن دقیق‌تره.هیپونیم‌ها و NER برای تحلیل معنایی و استخراج اطلاعات کلیدی استفاده می‌شن.⚡️ یه قدم جلوتر: کدهای عملی NLP!اگه دوست دارید این مفاهیم رو توی عمل ببینید، من یه سری نمونه کد پایتون برای توکن‌سازی، ریشه‌یابی، لماتیزیشن، و حتی NER آماده کردم! می‌تونید این کدها رو توی مخزن گیت‌هاب من پیدا کنید و خودتون تست کنید. 🚀👉 مخزن گیت‌هاب (https://github.com/Mahdi-Shabani/Ai-agent/tree/master/Ai-agent/chapter_1)😎📢 نظراتتون رو توی کامنت‌ها بنویسید و اگه سوالی دارید، بپرسید!</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Sun, 19 Oct 2025 14:03:29 +0330</pubDate>
            </item>
                    <item>
                <title>🔹کپسوله‌سازی (Encapsulation) در شی‌گرایی با فلاتر</title>
                <link>https://virgool.io/codenevis/%F0%9F%94%B9%DA%A9%D9%BE%D8%B3%D9%88%D9%84%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-encapsulation-%D8%AF%D8%B1-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-gutzsejgrgmc</link>
                <description>⚡️کپسوله‌سازی چیه؟کپسوله‌سازی یعنی پنهان کردن جزئیات داخلی کلاس (مثل داده‌ها) از بیرون و فقط اجازه دسترسی کنترل‌شده به اونا. مثل اینه که داده‌های مهم رو تو یه جعبه بذاری و فقط با کلیدهای خاص بتونی بازشون کنی. این کار امنیت و مدیریت کد رو بهتر می‌کنه و از تغییرات ناخواسته جلوگیری می‌کنه.⚡️چطور تو دارت/فلاتر کار می‌کنه؟مدیریت دسترسی: تو دارت، ویژگی‌ها و متدها به‌صورت پیش‌فرض عمومی (public) هستن.خصوصی (Private): با گذاشتن علامت _ (آندرلاین) قبل اسم، ویژگی یا متد رو خصوصی می‌کنی. یعنی فقط داخل همون کلاس یا فایل قابل دسترسیه.گتر و ستر (Getters &amp; Setters): برای دسترسی کنترل‌شده به ویژگی‌های خصوصی، از متدهای getter (برای خواندن) و setter (برای نوشتن) استفاده می‌کنی.نکته: تو دارت، خصوصی بودن بر اساس فایل هست (library-level)، نه کلاس.🚀مثال ساده:class BankAccount {
  double _balance; // خصوصی
  BankAccount(this._balance);
  double get balance =&gt; _balance; // getter
  set deposit(double amount) {
    if (amount &gt; 0) _balance += amount;
  }
}

void main() {
  var account = BankAccount(1000);
  account.deposit = 500;
  print(account.balance); // 1500
}⚡️کاربرد تو فلاتر:تو فلاتر، برای مدیریت حالت‌ها (state) و داده‌های ویجت‌ها استفاده می‌شه. مثلاً ویژگی‌های داخلی یه ویجت رو خصوصی کن تا بیرون نتونه مستقیم تغییرشون بده.مثال: تو کلاس‌های مدل داده (مثل کاربر یا محصول)، داده‌های حساس رو خصوصی کن و با getter/setter دسترسی بده تا اپت امن‌تر بشه.🎯 نکات کلیدی:جلوگیری از دسترسی مستقیم به داده‌ها (data hiding).getter/setter برای دسترسی کنترل‌شده.کد رو ماژولار و آسان‌تر برای نگهداری می‌کنه.تو فلاتر، کلاس‌های ویجت مثل StatefulWidget از این مفهوم برای مدیریت state استفاده می‌کنن.</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Mon, 29 Sep 2025 10:41:19 +0330</pubDate>
            </item>
                    <item>
                <title>🔹وراثت (Inheritance) در فلاتر</title>
                <link>https://virgool.io/@mtioji/%F0%9F%94%B9%D9%88%D8%B1%D8%A7%D8%AB%D8%AA-inheritance-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-geyn1pyiur0e</link>
                <description>⚡️وراثت (Inheritance) چیه؟وراثت یعنی یه کلاس (کلاس فرزند) بتونه ویژگی‌ها و متدهای یه کلاس دیگه (کلاس والد) رو به ارث ببره و اگه لازم بود، تغییر بده یا گسترش بده. مثل اینه که یه نقشه کلی برای ماشین داری (کلاس والد) و بعد نقشه یه ماشین خاص (مثل سدان) ازش می‌سازی (کلاس فرزند).⚡️چطور توی دارت/فلاتر کار می‌کنه؟کلمه کلیدی extends: برای ارث‌بری از یه کلاس استفاده می‌شه.بازنویسی متدها: می‌تونی متدهای کلاس والد رو با @override تغییر بدی.کاربرد تو فلاتر: ویجت‌های فلاتر (مثل StatelessWidget یا StatefulWidget) از وراثت استفاده می‌کنن.🚀مثال ساده:// کلاس والد
class Person {
  String name;
  Person(this.name);
  void introduce() =&gt; print(&#039;$name خودش رو معرفی می‌کنه!&#039;);
}

// کلاس فرزند
class Student extends Person {
  Student(String name) : super(name);
  @override
  void introduce() =&gt; print(&#039;$name یه دانشجوئه!&#039;);
}

void main() {
  var student = Student(&#039;علی&#039;);
  student.introduce(); // خروجی: علی یه دانشجوئه!
}⚡️چی شد اینجا؟کلاس Person: والد با ویژگی name و متد introduce.کلاس Student: از Person ارث می‌بره (extends) و متد introduce رو تغییر می‌ده (@override).super: برای پاس دادن name به سازنده والد.🎯 چرا تو فلاتر مهمه؟وراثت تو فلاتر برای ساخت ویجت‌های سفارشی (مثل StatelessWidget) و مدل‌های داده (مثل کاربر) استفاده می‌شه. باعث می‌شه کدت تمیز، مرتب و قابل‌استفاده‌مجدد باشه.📌 خیلی خلاصه مهم‌ترین بخش‌های وراثت (Inheritance) در فلاتر:extends: برای ارث‌بری کلاس فرزند از والد.override: بازنویسی متدهای والد برای تغییر رفتار.super: دسترسی به سازنده یا متدهای والد.کاربرد: ساخت ویجت‌های سفارشی (مثل StatelessWidget) و مدل‌های داده (مثل کاربر).چرا مهمه؟: کد تمیز، قابل‌استفاده‌مجدد و بدون تکرار.</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Sat, 27 Sep 2025 15:55:04 +0330</pubDate>
            </item>
                    <item>
                <title>کلاس و شیء در شی‌گرایی با فلاتر</title>
                <link>https://virgool.io/codenevis/%DA%A9%D9%84%D8%A7%D8%B3-%D9%88-%D8%B4%DB%8C%D8%A1-%D8%AF%D8%B1-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-nkbjat0qfw3k</link>
                <description>اگر تازه با فلاتر و برنامه‌نویسی شی‌گرا (OOP) آشنا شدی، احتمالا شنیدی که کلاس و شیء پایه‌های اصلی این نوع برنامه‌نویسی هستن. تو این پست کوتاه، قراره خیلی ساده بفهمیم این دوتا چی هستن و چرا توی فلاتر مهم‌ هستن.کلاس چیه؟کلاس مثل یه نقشه یا الگوئه. فرض کن می‌خوای یه ماشین بسازی؛ نقشش می‌شه کلاس! تو کلاس مشخص می‌کنی که یه چیز چه ویژگی‌هایی (مثل رنگ، مدل) و چه رفتارهایی (مثل حرکت کردن) داره.class Person {
  String name; // ویژگی
  int age;

  Person(this.name, this.age); // سازنده

  void sayHello() { // رفتار
    print(&#039;سلام، من $name هستم و $age سالمه!&#039;);
  }
}شیء چیه؟شیء همون چیزیه که از روی نقشه (کلاس) ساخته می‌شه. مثلا اگه کلاس Person یه نقشه باشه، یه نفر به اسم علی با سن 25 سال یه شیء از اون کلاسه.var person = Person(&#039;علی&#039;, 25); // ساخت شیء
person.sayHello(); // خروجی: سلام، من علی هستم و 25 سالمه!چرا تو فلاتر مهمه؟توی فلاتر، تقریبا همه‌چیز یه کلاسه! ویجت‌ها (مثل دکمه، متن، یا صفحه‌) همشون کلاس هستن. مثلا وقتی یه دکمه می‌سازی، داری یه شیء از کلاس ElevatedButton درست می‌کنی. حتی ویجت‌های سفارشی خودت هم با تعریف کلاس ساخته می‌شن:class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text(&#039;سلام دنیا!&#039;);
  }
}نکات کلیدی:کلاس: تعریف ویژگی‌ها و رفتارها.شیء: نمونه واقعی از کلاس که می‌تونی باهاش کار کنی.کاربرد: از ویجت‌ها گرفته تا مدیریت داده‌ها توی فلاتر، همه‌جا از کلاس و شیء استفاده می‌شه.این مفاهیم پایه‌های شی‌گرایی‌ان. اگه خوب اینا رو یاد بگیری، قدم بزرگی تو ساخت اپ‌های فلاتر برمی‌داری! 🚀</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Sat, 20 Sep 2025 19:05:20 +0330</pubDate>
            </item>
                    <item>
                <title>آشنایی با StatefulWidget در Flutter</title>
                <link>https://virgool.io/codenevis/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-statefulwidget-%D8%AF%D8%B1-flutter-rkt05vo7fwnd</link>
                <description>اگه بخوای توی Flutter UI زنده باشه و با کلیک/اسکرول/داده‌ی جدید عوض بشه، باید بری سراغ StatefulWidget.یه ویجت + یه State که مثل «حافظه‌ی کوتاه‌مدت» همون ویجته. باهاش می‌تونی داده نگه داری، UI رو آپدیت کنی و رفتار صفحه رو کنترل کنی.⚡️ StatefulWidget چیه؟StatefulWidget مثل چراغ مطالعه‌ست:خود چراغ عوض نمی‌شه (Widget immutable)ولی حالتش روشن/خاموش می‌شه (State تغییر می‌کنه)تو هم با یه دکمه (setState) می‌گی «وضعیت عوض شد، دوباره بساز!» 😎📌 مهم‌ترین بخش‌های StatefulWidget:🔹 1. createState()اتصال ویجت به کلاس State. همیشه یه کلاس State می‌سازی که منطق و وضعیت رو نگه می‌داره.class MyWidget extends StatefulWidget {
  const MyWidget({super.key});
  @override
  State&lt;MyWidget&gt; createState() =&gt; _MyWidgetState();
}🔹 2. کلاس Stateاینجا متغیرهای قابل تغییرت رو می‌ذاری و UI رو می‌سازی.class _MyWidgetState extends State&lt;MyWidget&gt; {
  int counter = 0;

  @override
  Widget build(BuildContext context) {
    return Text(&#039;$counter&#039;);
  }
}🔹 3. setState(() { ... })به Flutter می‌گه «وضعیت عوض شد» تا متد build دوباره اجرا بشه.🔹 4. initState - disposeinitState: یک‌بار برای مقداردهی اولیه (کنترلر، تایمر، استریم)dispose: جمع‌کردن منابع برای جلوگیری از Memory Leak🔹 5. build(context)خروجی UI بر اساس وضعیت فعلی. قرار نیست اینجا کار سنگین یا Side Effect انجام بدی.🔹 6. mountedمی‌گه State هنوز توی درخته یا نه. بعد از async قبل از setState چک کن.🔹 7. didUpdateWidget / didChangeDependenciesوقتی props والد عوض بشه یا Inheritedها تغییر کنن (Theme/Locale/MediaQuery)، اینا به کار میان.🚀 یک مثال کامل StatefulWidget:import &#039;package:flutter/material.dart&#039;;

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State&lt;MyHomePage&gt; createState() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {
  int _count = 0;
  late final TextEditingController _controller;
  bool _loading = false;
  String? _greeting;

  @override
  void initState() {
    super.initState();
    _controller = TextEditingController();
  }

  @override
  void dispose() {
    _controller.dispose(); // خیلی مهم!
    super.dispose();
  }

  Future&lt;void&gt; _sayHi() async {
    setState(() =&gt; _loading = true);

    // شبیه‌سازی درخواست غیرهمزمان
    await Future.delayed(const Duration(milliseconds: 800));

    final name = _controller.text.trim().isEmpty
        ? &#039;دوست عزیز&#039;
        : _controller.text.trim();

    if (!mounted) return; // جلوگیری از setState بعد از dispose

    setState(() {
      _greeting = &#039;سلام $name 👋&#039;;
      _loading = false;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text(&quot;مثال StatefulWidget&quot;)),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(16),
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              Text(&#039;$_count&#039;, style: const TextStyle(fontSize: 48)),
              const SizedBox(height: 8),
              ElevatedButton.icon(
                onPressed: () =&gt; setState(() =&gt; _count++),
                icon: const Icon(Icons.add),
                label: const Text(&#039;اضافه کن&#039;),
              ),
              const SizedBox(height: 24),
              TextField(
                controller: _controller,
                decoration: const InputDecoration(
                  labelText: &#039;اسم‌ت رو بنویس&#039;,
                  border: OutlineInputBorder(),
                ),
              ),
              const SizedBox(height: 8),
              _loading
                  ? const CircularProgressIndicator()
                  : ElevatedButton(
                      onPressed: _sayHi,
                      child: const Text(&#039;سلام بده&#039;),
                    ),
              if (_greeting != null) ...[
                const SizedBox(height: 8),
                Text(_greeting!, style: const TextStyle(fontSize: 18)),
              ],
            ],
          ),
        ),
      ),
    );
  }
}🎯 خروجی این کد:شمارنده‌ای که با هر کلیک آپدیت می‌شهیک TextField برای گرفتن اسمدکمه‌ای که بعد از یه تأخیر کوتاه سلام می‌ده (با رعایت mounted)همه‌چی داخل یک StatefulWidget مدیریت می‌شه✨ نکته‌ها و ترفندها:setState داخل build صدا نزن. اگه لازم شد کاری بعد از اولین رندر انجام بدی:WidgetsBinding.instance.addPostFrameCallback((_) {
  // مثلا نمایش SnackBar
});هر منبعی ساختی (Controller/Timer/AnimationController/StreamSubscription) رو تو dispose آزاد کن.وقتی props والد عوض می‌شه و باید State هماهنگ بشه، از didUpdateWidget با احتیاط استفاده کن.برای بهبود عملکرد، از const استفاده کن و UI رو به ویجت‌های کوچک‌تر بشکن تا محدوده‌ی rebuild کم بشه.وضعیت خیلی ساده داری؟ ValueNotifier + ValueListenableBuilder گزینه‌ی سبکه.وضعیت بین چند صفحه/بخش مشترک شد؟ برو سراغ Provider/Riverpod/BLoC.می‌خوای وضعیت یه تب حفظ بشه؟ از AutomaticKeepAliveClientMixin استفاده کن.🆚 کی Stateless و کی Stateful؟فقط نمایش داده از بیرون → StatelessWidgetوضعیت محلی و موقتی (فرم، شمارنده، انیمیشن کوتاه) → StatefulWidgetوضعیت اشتراکی/پیچیده → ابزار مدیریت وضعیتموفق باشید ✨📌 خیلی خلاصه مهم‌ترین بخش‌های StatefulWidget:createState: اتصال ویجت به کلاس Stateکلاس State: جایی برای متغیرهای قابل تغییر و ساخت UIsetState: اعلام تغییر وضعیت برای rebuildinitState و dispose: شروع و جمع‌کردن منابع (Controller/Timer/Stream)didUpdateWidget / didChangeDependencies: واکنش به تغییر props والد یا Inheritedهاmounted: قبل از setState بعد از async چک کنپ.ن— باتوجه به پست قبلی که در مورد آشنایی «pubspec.yaml» بود برای فعال‌کردن فارسی و راست‌به‌چپ، پکیج رسمی flutter_localizations (جزئی از خود Flutter) رو به dependencies اضافه کردم و بعد توی MaterialApp لوکال رو fa ست کردم:dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter✅ با همین چند خط، TextField و کل UI راست‌به‌چپ می‌شن.</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Mon, 15 Sep 2025 16:21:14 +0330</pubDate>
            </item>
                    <item>
                <title>🔹آشنایی با pubspec.yaml در Flutter</title>
                <link>https://virgool.io/codenevis/%F0%9F%94%B9%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-pubspecyaml-%D8%AF%D8%B1-flutter-nrdir7bfgx9f</link>
                <description>📌 pubspec.yaml مثل شناسنامه و دفتر تنظیمات پروژت هست.اسم پروژه، توضیحات و نسخهورژن Flutter و Dart مورد استفادهپکیج‌ها و کتابخونه‌های خارجی (dependencies)منابع پروژه مثل عکس‌ها، فونت‌ها، فایل‌های صوتی و …📌 بخش‌های مهم pubspec.yaml 1. اطلاعات پروژه(بالای فایل):name: my_app
description: A new Flutter project
version: 1.0.0+1name: اسم پروژهdescription: توضیح پروژهversion: نسخه اپ → اولی (1.0.0) برای نمایش، دومی (+1) برای build number2. محیط (Environment):مشخص می‌کنی این پروژه از چه ورژن Dart/Flutter استفاده می‌کنه:environment:
  sdk: &#039;&gt;=3.0.0 &lt;4.0.0&#039;3. dependencies (وابستگی‌ها):اینجا کتابخونه‌هایی که می‌خوای از pub.dev نصب بشن رو می‌نویسی:dependencies:
  flutter:
    sdk: flutter

  cupertino_icons: ^1.0.2
  provider: ^6.0.5
  http: ^1.1.0uses-material-design: true → یعنی از آیکون‌های متریال دیزاین استفاده کن.assets: → مسیر فایل‌هایی که می‌خوای استفاده کنی.fonts: → معرفی فونت‌های سفارشی.🚀 جریان کاری pubspec.yamlتغییراتت رو داخل فایل pubspec.yaml بنویس.توی ترمینال یا IDE بزن(تا dependencyها دانلود بشن):flutter pub get3. حالا می‌تونی توی اپلیکیشن از اون پکیج یا asset استفاده کنی⚡️ یه مثال واقعیname: shop_app
description: My first Flutter shop app
publish_to: &#039;none&#039;
version: 1.0.0+1

environment:
  sdk: &#039;&gt;=3.0.0 &lt;4.0.0&#039;

dependencies:
  flutter:
    sdk: flutter
  provider: ^6.0.5
  http: ^1.1.0
  shared_preferences: ^2.2.1

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true

  assets:
    - assets/images/
    - assets/data/

  fonts:
    - family: Yekan
      fonts:
        - asset: assets/fonts/Yekan-Bold.ttf🎯 خلاصهpubspec.yaml = قلب پروژه Flutterاینجا dependencyها، resourceها (عکس/فونت/فایل) و تنظیمات پایه رو می‌نویسی.بعد با flutter pub get همه چیز نصب و همگام میشه.</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Tue, 02 Sep 2025 15:49:57 +0330</pubDate>
            </item>
                    <item>
                <title>🔹آشنایی با SingleChildScrollView در Flutter</title>
                <link>https://virgool.io/@mtioji/%F0%9F%94%B9%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-singlechildscrollview-%D8%AF%D8%B1-flutter-uyhh4umnkyxj</link>
                <description>✨ چیه اصلاً؟همونطور که از اسمش معلومه، ویجتیه که به یک فرزند (child) اجازه میده همراه با امکان اسکرول شدن داخل صفحه بشه.یعنی اگه محتوای صفحه از اندازه‌ی نمایشگر بیشتر بشه و جا نشه، کاربر بتونه صفحه رو بالا پایین (یا چپ راست) کنه.📌 ساختار کلی:SingleChildScrollView(
  child: Column(
    children: [
      Text(&quot;آیتم ۱&quot;),
      Text(&quot;آیتم ۲&quot;),
      Text(&quot;آیتم ۳&quot;),
      // ... و همینطوری ادامه بده
    ],
  ),
)نکته: معمولاً داخل SingleChildScrollView باید ویجت‌هایی بذاری که بتونن محتوای زیادی تولید کنن (مثل Column).🔹 چرا لازم داریم؟یه موقع هست UI پر از ویجت میشه (فرم‌های طولانی، لیست، عکس‌ها ...). بدون اسکرول، وقتی صفحه پر شد: خطای Overflow (زرد/قرمز توی Flutter) می‌گیری.پس  SingleChildScrollView میاد این مشکل رو حل می‌کنه ---&gt; میگه خب حالا اجازه بده صفحه اسکرول شه.⚙️ پراپرتی‌های مهم:1- scrollDirection:SingleChildScrollView(
  scrollDirection: Axis.horizontal, // پیش‌فرض عمودی هست
  child: Row(
    children: [
      Container(width: 200, height: 100, color: Colors.red),
      Container(width: 200, height: 100, color: Colors.green),
      Container(width: 200, height: 100, color: Colors.blue),
    ],
  ),
)2- reverse:جهت اسکرول رو برعکس می‌کنه (پایین به بالا یا راست به چپ).3- padding:فاصله داخلی برای محتوا اعمال می‌کنه.4- physics:نوع رفتار اسکرول رو تعیین می‌کنه. مثلا:BouncingScrollPhysics (مثل iOS کشسان) --  ClampingScrollPhysics(مثل اندروید خشک)🚀 مثال کامل فرم اسکرول‌شونده:import &#039;package:flutter/material.dart&#039;;

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: MyFormPage(),
    );
  }
}

class MyFormPage extends StatelessWidget {
  const MyFormPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text(&quot;مثال SingleChildScrollView&quot;)),
      body: SingleChildScrollView(
        padding: const EdgeInsets.all(20),
        child: Column(
          children: List.generate(
            20,
            (index) =&gt; Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                decoration: InputDecoration(
                  border: const OutlineInputBorder(),
                  labelText: &quot;فیلد ${index + 1}&quot;,
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}📊 نتیجه:صفحه یک فرم با ۲۰ تکست‌فیلد دارهبدون SingleChildScrollView → خطای Overflow ⚠با SingleChildScrollView → صفحه اسکرول‌پذیر میشه، همه فیلدها نمایش داده میشن.✨ نکته‌ی مهم:SingleChildScrollView برای محتوای محدود خوبهاما اگه قراره لیست خیلی طولانی (مثلا ۱۰۰۰ آیتم) داشته باشی، باید از ListView استفاده کنی، چون SingleChildScrollView همه ویجت‌ها رو یکجا می‌سازه (مموری زیاد مصرف می‌کنه).</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Sun, 31 Aug 2025 17:01:51 +0330</pubDate>
            </item>
                    <item>
                <title>🔹 آشنایی با Row Widget در Flutter</title>
                <link>https://virgool.io/@mtioji/%F0%9F%94%B9-%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-row-widget-%D8%AF%D8%B1-flutter-i793kzl42uvn</link>
                <description>یکی از پایه‌ای‌ترین ویجت‌های Flutter برای چیدمان، Row هست.همون‌طور که Column بچه‌ها رو به صورت عمودی (زیرهم) می‌چیند، ویجت Row بچه‌ها رو به صورت افقی (کنار هم) می‌چیند.خیلی وقت‌ها برای ساختن UI لازم داری از ترکیب Row و Column استفاده کنی تا چیدمان حرفه‌ای‌تری داشته باشی.✨ ساختار کلی Row:Row(
  children: [
    Icon(Icons.star),
    Text(&quot;سلام&quot;),
    ElevatedButton(
      onPressed: () {},
      child: Text(&quot;کلیک&quot;),
    ),
  ],
)⚙️ پراپرتی‌های مهم Row:🔹 1. children:لیست ویجت‌هایی که قراره کنار هم (افقی) قرار بگیرن.🔹 2. mainAxisAlignment:از اونجایی که محور اصلی Row افقی هست، این پراپرتی مشخص می‌کنه بچه‌ها افقی کجا قرار بگیرن:MainAxisAlignment.start → بچه‌ها سمت چپ (پیش‌فرض)MainAxisAlignment.center → بچه‌ها وسط افقیMainAxisAlignment.end → بچه‌ها سمت راستMainAxisAlignment.spaceBetween → اولی چپ، آخری راست، بقیه فاصله مساوی بینشونMainAxisAlignment.spaceAround → فاصله مساوی، ولی فاصله بیرونی نصفMainAxisAlignment.spaceEvenly → همه فاصله‌ها کاملاً مساوی🔹 3. crossAxisAlignment:محور عمودی (یعنی بالا/وسط/پایین نسبت به Row).CrossAxisAlignment.start → بالای ردیفCrossAxisAlignment.center → وسط عمودی (پیش‌فرض)CrossAxisAlignment.end → پایین ردیف 🚀 مثال عملی Row:import &#039;package:flutter/material.dart&#039;;

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: RowExample(),
    );
  }
}

class RowExample extends StatelessWidget {
  const RowExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text(&quot;Row Widget&quot;),
        centerTitle: true,
        backgroundColor: const Color.from(
          alpha: 0.452,
          red: 1,
          green: 0.757,
          blue: 0.027,
        ),
      ),
      body: Center(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly, // فاصله مساوی افقی
          crossAxisAlignment: CrossAxisAlignment.center, // وسط‌ چین عمودی
          children: const [
            Icon(Icons.star, color: Colors.amber, size: 40),
            Text(&quot;سلام دنیا 🌍&quot;, style: TextStyle(fontSize: 20)),
            ElevatedButton(onPressed: null, child: Text(&quot;کلیک&quot;)),
          ],
        ),
      ),
    );
  }
}
📊 نتیجه اجرای کد:یک ردیف وسط صفحه ساخته میشه.آیتم سمت چپ: ستاره طلایی ⭐وسط: متن &quot;سلام دنیا 🌍&quot;سمت راست: دکمه‌ی &quot;کلیک&quot;چون spaceEvenly استفاده کردیم → فاصله‌ی بین همه‌ عناصر مساویه.🎯 نکته مهم:Row = بچه‌ها کنار هم افقیColumn = بچه‌ها زیر هم عمودیبرای چیدمان‌های پیشرفته (فرم‌، کارت‌ها، Layout پیچیده)، معمولاً Row و Column با هم ترکیب میشن.</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Sat, 30 Aug 2025 10:24:44 +0330</pubDate>
            </item>
                    <item>
                <title>🎨 آشنایی با Container Widget در Flutter</title>
                <link>https://virgool.io/@mtioji/%F0%9F%8E%A8-%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-container-widget-%D8%AF%D8%B1-flutter-ehrml2uapmto</link>
                <description>اگه بخوای توی Flutter فقط یک ویجت بهت بدن که باهاش همه‌کاره باشی، اون Container هست.استایل بدی، رنگ بدی، گوشه‌هاشو گرد کنی، سایه بندازی، بهش فاصله بدی، توش هرچیزی بذاری … خلاصه یک «جعبه‌ی همه‌فن‌حریف»!⚡️ Container چیه؟Container مثل یه جعبه تو خونه می‌مونه:می‌تونی چیزی داخلش بذاری (child).می‌تونی سایزشو کوچیک یا بزرگ کنی.می‌تونی رنگش کنی.حتی می‌تونی گوشه‌هاشو گرد کنی و براش قاب بگیری 😎📌 مهم‌ترین پراپرتی‌های Container:🔹 1. child (ویجت داخلی)هر چی بخوای می‌ذاری داخلش.Container( 
  child: Text(&quot;سلام دنیا 👋&quot;),
)🔹 2. width و height (عرض و ارتفاع)ابعاد جعبه رو مشخص می‌کنن.Container(
  width: 200,
  height: 100,
  color: Colors.blue,
)🔹 3. color (پس‌زمینه)می‌تونی مستقیم رنگ بدی.Container(
  color: Colors.red,
  child: Text(&quot;پس‌زمینه قرمزه!&quot;),
)🔹 4. padding (فاصله داخلی)این فاصله بین مرز جعبه تا محتوای داخلشه.Container(
  padding: EdgeInsets.all(20),
  color: Colors.green,
  child: Text(&quot;این متن از دیواره فاصله داره!&quot;),
)🔹 5. margin (فاصله بیرونی)فاصله Container با ویجت‌های اطرافش.Container(
  margin: EdgeInsets.all(30),
  color: Colors.amber,
  child: Text(&quot;من از بقیه فاصله گرفتم&quot;),
)🔹 6. decoration (استایل‌های حرفه‌ای)وقتی بخوای جذاب‌ترش کنی → گرد کردن گوشه‌ها، سایه، گرادیانت و …Container(
  width: 200,
  height: 200,
  decoration: BoxDecoration(
    color: Colors.orange,
    borderRadius: BorderRadius.circular(20),
    boxShadow: [
      BoxShadow(
        color: Colors.black45,
        blurRadius: 10,
        offset: Offset(5, 5),
      )
    ],
  ),
)🚀 یک مثال کامل Containerimport &#039;package:flutter/material.dart&#039;;

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(title: const Text(&quot;مثال Container&quot;)),
        body: Center(
          child: Container(
            width: 200,
            height: 100,
            alignment: Alignment.center, // متن وسط چین بشه
            margin: const EdgeInsets.all(20),
            padding: const EdgeInsets.all(10),
            decoration: BoxDecoration(
              color: Colors.blue,
              borderRadius: BorderRadius.circular(15),
              border: Border.all(color: Colors.white, width: 3),
            ),
            child: const Text(
              &quot;سلام دنیا 🌍&quot;,
              style: TextStyle(fontSize: 20, color: Colors.white),
            ),
          ),
        ),
      ),
    );
  }
}🎯 خروجی این کد:یک جعبه‌ی آبی خوشگل وسط صفحهگوشه‌های گرد و یک قاب سفید دورشمتن &quot;سلام دنیا 🌍&quot; داخلش وسط‌چین شدهو اطرافش هم یه فاصله‌ی قشنگ (margin) داره✨ نکته آخر:Container مثل یک پایه است برای طراحی UI:وقتی فقط اندازه یا فاصله می‌خوای → SizedBox ساده‌تره.ولی وقتی رنگ، حاشیه، تزئینات و امکانات کامل لازم داری → Container بی‌رقیب میشه. 💪موفق باشید✨ </description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Thu, 28 Aug 2025 10:59:13 +0330</pubDate>
            </item>
                    <item>
                <title>آشنایی با Column Widget در Flutter</title>
                <link>https://virgool.io/codenevis/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-column-widget-%D8%AF%D8%B1-flutter-igvvclcfba4f</link>
                <description>🎯 آشنایی با Column Widget در Flutterیکی از مهم‌ترین ویجت‌های چیدمان (Layout) در Flutter، ویجت Column هست.همون‌طوری که از اسمش معلومه، وظیفه‌ی Column اینه که بچه‌های خودش رو در یک ستون عمودی (از بالا به پایین) بچینه.Column(
  children: [
    Text(&quot;سلام&quot;),
    Icon(Icons.star),
    ElevatedButton(onPressed: () {}, child: Text(&quot;کلیک&quot;)),
  ],
)🔍 خروجی:اول متن &quot;سلام&quot; نمایش داده میشهزیر اون آیکون ستارهو در آخر یک دکمه⚙️ ویژگی‌های مهم Column1. childrenلیست بچه‌هایی که داخل ستون قرار می‌گیرن. (هر چیزی می‌تونه باشه: متن، آیکون، دکمه و …)2. mainAxisAlignmentچون محور اصلی ستون عمودی هست، این ویژگی مشخص می‌کنه بچه‌ها توی این ستون عمودی کجا قرار بگیرن:start → بالای ستون (پیش‌فرض)center → وسط ستونend → پایین ستونspaceBetween → فاصله مساوی بین بچه‌ها، ولی بالا و پایین ستون خالیspaceAround → فاصله‌ها مساوی، ولی فاصله‌ی بیرون نصف فاصله‌ی بین بچه‌هاspaceEvenly → همه‌ فاصله‌ها دقیقاً مساوی (بالا، بین، پایین)3. crossAxisAlignmentاین ویژگی تعیین می‌کنه بچه‌ها افقی در کجای ستون قرار بگیرن (یعنی ترازبندی در عرض):start → چپ‌چینcenter → وسطend → راست‌چین🚀 مثال کامل Column در عملimport &#039;package:flutter/material.dart&#039;;

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text(&quot;Flutter Column Example&quot;),
          centerTitle: true,
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center, // بچه‌ها در وسط عمودی
            crossAxisAlignment: CrossAxisAlignment.center, // بچه‌ها وسط افقی
            children: const [
              Text(
                &quot;سلام 😍&quot;,
                style: TextStyle(fontSize: 24),
              ),
              Icon(Icons.star, color: Colors.amber, size: 40),
              SizedBox(height: 20), // فاصله بین ویجت‌ها
              ElevatedButton(
                onPressed: null, // برای فعال‌سازی: ()=&gt;{}
                child: Text(&quot;کلیک&quot;),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
📊 نتیجه‌ی اجرای این کد:در بالای صفحه یک AppBar با متن نمایش داده میشه.در وسط صفحه یک متن &quot;سلام 😍&quot; قرار داره.زیر اون یک آیکون ستاره طلایی.در نهایت یک دکمه که روش نوشته &quot;کلیک&quot;.نتیجه‌ی اجرای این کد🔑 نکات پایانیستون همیشه بچه‌ها رو از بالا به پایین می‌چینه.برای کنترل جای عمودی بچه‌ها از mainAxisAlignment استفاده کن.برای کنترل افقی (تراز عرضی) بچه‌ها از crossAxisAlignment استفاده کن.وقتی تعداد بچه‌ها زیاده و توی صفحه جا نمی‌شن، باید Column رو داخل یک SingleChildScrollView بذاری.</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Wed, 27 Aug 2025 21:16:14 +0330</pubDate>
            </item>
                    <item>
                <title>کاهش ابعاد در علم داده</title>
                <link>https://virgool.io/@mtioji/%DA%A9%D8%A7%D9%87%D8%B4-%D8%A7%D8%A8%D8%B9%D8%A7%D8%AF-%D8%AF%D8%B1-%D8%B9%D9%84%D9%85-%D8%AF%D8%A7%D8%AF%D9%87-nehzslt91sma</link>
                <description>کاهش ابعاد چیست؟ما فاکتورهای زیادی داریم که کلاسه بندی نهایی بر اساس آن ها انجام می شود. این عوامل اساساً به عنوان متغیر شناخته می شوند. هرچه تعداد ویژگی ها بیشتر باشد ، تجسم مجموعه آموزش و سپس کار بر روی آن دشوارتر می شود. کاهش ابعاد را می‌توان به انتخاب ویژگی و استخراج تقسیم کرد.بعضی اوقات ، بیشتر این ویژگی ها با هم مرتبط هستند و لذا ویژگی زائد تلقی می شوند. این جاست که الگوریتم های کاهش ابعاد بکار گرفته می شوند.روش های کاهش ابعاد:تجزیه تحلیل مولفه اصلی (PCA)تفکیک کننده خطی (LDA)تعمیم تحلیل تمایزی (GDA)مزایای استفاده از کاهش ابعادفضا، زمان و ذخیره‌سازی مورد نیاز را کاهش می‌دهد.از بین بردن چند ستون، عملکرد مدل یادگیری ماشین را بهبود می‌بخشد.هنگامی که به ابعاد بسیار کم مانند 2D یا 3D تبدیل می‌شود، داده‌ها به راحتی قابل مشاهده است.معایب کاهش ابعاداساساً ممکن است منجر به از دست رفتن داده ها شود.اگرچه ، PCA تمایل دارد بین متغیرها همبستگی خطی پیدا کند ، که گاهی اوقات این کار نامطلوب است.همچنین ، PCA در مواردی که میانگین و کوواریانس برای تعریف مجموعه داده کافی نباشد ، موفق عمل نمی کند.بعلاوه ، ممکن است ندانیم که باید چند مولفه اصلی را نگه داریم – در عمل ، برخی قوانین سرانگشتی اعمال می شود.دو عامل کاهش ابعاد عبارتند از :۱-انتخاب ویژگی                   ۲-استخراج ویژگی۱-انتخاب ویژگی:انتخاب ویژگی روشی است که برای پیدا کردن یک زیر مجموعه از متغیرهای اصلی تلاش می‌کند.برای این عمل سه استراتژی وجود دارد: استراتژی فیلتر (به عنوان مثال افزایش اطلاعات)، استراتژی بسته‌بندی (به عنوان مثال جستجوهایی با دقت هدایت شونده) و استراتژی جاسازی شده (ویژگی‌ها برای ساختن مدل بر اساس اشتباهات پیش بینی، انتخاب می‌شوند تا اضافه شوند یا حذف شوند).۲-استخراج ویژگی:داده‌ها را در فضای با ابعاد بزرگ به یک فضای ابعاد کمتر تبدیل می‌کند. تحول داده‌ها می‌تواند خطی باشد، همان‌طور که در تجزیه و تحلیل مولفه اصلی (PCA)، اما بسیاری از تکنیک‌های کاهش اندازه غیر خطی نیز وجود دارد. برای داده‌های چند بعدی، نمایندگی تانسور را می‌توان در کاهش ابعاد از طریق یادگیری زیر فضای چند لاین استفاده کرد.روش های معمول برای انجام کاهش ابعاد:مقادیر از دست رفتههنگام جستجو در داده ها ، اگر با مقادیر از دست رفته مواجه شویم ، در اولین قدم باید دلیل آن را شناسایی کنیم. سپس باید مقادیر از دست رفته / متغیرهای حذف شده را با استفاده از روش های مناسب پیدا کرد.درخت تصمیماین روش، یکی از تکنیک های پرطرفدار است. ما می توانیم از آن به عنوان یک راه حل نهایی برای مقابله با چالش های متعددی مانند از دست دادن مقادیر ، داده های پرت و شناسایی متغیرهای مهم استفاده کنیم. متخصصین داده زیادی از درخت تصمیم استفاده کردند و نتایج خوبی گرفتند.جنگل تصادفیجنگل تصادفی مشابه درخت تصمیم است. فقط مراقب باشید که جنگل های تصادفی تمایل به متغیرهایی دارند که مقادیر مجزای بیشتری داشته باشد، یعنی متغیرهای عددی را نسبت به مقادیر باینری / دسته ای ترجیح می دهیم.همبستگی زیادابعادی که همبستگی بالاتری دارند می توانند عملکرد مدل را کاهش دهند. علاوه بر این ، داشتن چند متغیر از اطلاعات مشابه خوب نیست. برای شناسایی متغیرهای با همبستگی بالا ، می توانید از ماتریس همبستگی Pearson استفاده کنید.حذف ویژگی برگشتیدر این روش ، ما با تمام n بُعد شروع می کنیم. مجموع یک مربع خطا ( SSR )  را پس از حذف هر متغیر (n بار) محاسبه می کنیم. سپس ، متغیرهایی که حذف آنها کمترین افزایش را در SSR ایجاد کرده است، شناسایی می شوند. و درنهایت آن ها را حذف کرده و n-1 ویژگی ورودی را در اختیار ما قرار می دهد.تحلیل عاملیاین متغیرها را می توان براساس همبستگی هایشان گروه بندی کرد. در اینجا هر گروه، یک ساختار یا عامل اساسی واحد را نشان می دهد. این عوامل در مقایسه با تعداد زیادی ابعاد ، تعداد کمی دارند. با این حال ، مشاهده این عوامل دشوار است. در واقع دو روش برای انجام تحلیل عاملی وجود دارد:EFA ( تحلیل عاملی اکتشافی )CFA ( تحلیل عاملی تأییدی )تحلیل مولفه های اصلی ( PCA )به طور خاص ، در این مورد باید متغیرها را به مجموعه متغیرهای جدید تبدیل کنیم. از آنجا که این متغیرها، ترکیبی خطی از متغیرهای اصلی هستند، لذا این مجموعه متغیرهای جدید ، مولفه های اصلی نامیده می شوند. بعلاوه ، ما باید این موارد را به روش خاصی بدست آوریم. به عنوان اولین مولفه اصلی ، تغییرات احتمالی داده های اصلی را حساب می کنیم. پس از آن هر مولفه برنده، بالاترین واریانس ممکن را دارد.مولفه اصلی دوم باید عمود بر مولفه اصلی اول باشد. برای مجموعه داده های دو بعدی ، فقط دو مولفه اصلی وجود دارد. در شکل زیر، داده ها و اولین و دومین مولفه اصلی آن ها نشان داده شده است. با اعمال PCA بر روی مجموعه داده ها، داده ها معنای قبلی خود را از دست می دهند.برنامه‌های کاربردیتکنیک کاهش ابعادی که گاهی در علوم اعصاب استفاده می‌شود، ابعاد حداکثر آموزنده است که یک نمایندهٔ پایین‌تر از یک مجموعه داده را نشان می‌دهد تا اطلاعاتی که ممکن است در مورد داده‌های اصلی حفظ شود.#Iran-Ai</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Sat, 27 Nov 2021 10:16:37 +0330</pubDate>
            </item>
                    <item>
                <title>کتابخانه Numpy</title>
                <link>https://virgool.io/@mtioji/%DA%A9%D8%AA%D8%A7%D8%A8%D8%AE%D8%A7%D9%86%D9%87-numpy-dqarnelcjorb</link>
                <description>کتابخانه Numpy:اگر شما به دنبال انجام هر گونه ریاضیات پیشرفته به هر یک از مجموعه داده‌های خود هستید، پس باید کتابخانه اعداد را وارد کنید. به شدت در یادگیری عمیق و یادگیری ماشین استفاده می‌شود، این یک ضرورت مطلق برای هر الگوریتم و تجزیه و تحلیل سنگین محاسباتی است. آرایه‌های چند بعدی اعداد نیز مسائل پیچیده را به مراتب ساده‌تر از لیست‌های استاندارد می‌سازند.NumPy یک کتابخانه برای زبان برنامه نویسی پایتون (Python) است.با استفاده از این کتابخانه امکان استفاده از آرایه‌ها و ماتریس‌های بزرگ چند بعدی فراهم می‌شود. هم‌چنین می‌توان از تابع‌های ریاضیاتی سطح بالا بر روی این آرایه‌ها استفاده کرد. پیش از این‌که این آموزش را مطالعه کنید، می‌بایست دست‌کم اندکی با زبان برنامه‌نویسی پایتون آشنایی داشته باشید.در پردازش هایی که بر روی داده ها انجام میشود,مانند پردازش تصاویر یا کلیپ های صوتی یا پردازش های دیگر , معمولا داده ها را به شکل آرایه ای از اعداد در نظر میگیرند.برای مثال عکس های دیجیتال را میتوان یک آرایه دو بعدی در نظر گرفت که هر خانه آرایه یک پیکسل از تصویر را نشان میدهد که مقدار رنگ را در آن خانه نمایش میدهد.چرا از کتابخانه Numpy استفاده کنیم؟1. این کتابخانه برای ذخیره داده ها از حافظه خیلی کمتری استفاده می کند.2. این کتابخانه بسیار سریع است. و این همان موضوعی است که آرایه های Numpy را از لیست های پایتونی متمایز میکند. آرایه های این کتابخانه تا 50 برابر سریع تر از لیست های پایتونی هستند.3. در Numpyبه راحتی میتوانید یک ماتریس n*n بسازید که با آن زیاد سر و کار دارید.4. در این کتابخانه برای تمام محاسبات ماتریسی , تابع تعریف شده که با استفاده از آنها به راحتی میتوانید محاسباتتان را انجام دهید و اصلا نیازی به نوشتن کد های طولانی نیست.برای استفاده از کتابخانه Numpy آن را با کلمه کلیدی import در برنامه های خود وارد کنید.اما برای سهولت بیشتر کلمه کلیدی as باعث می شود بتوانیم از نامی که بعد از آن آمده به جای نام کتابخانه استفاده کنیم.import numpy as npتوابع مهم و کاربردی Numpy::arrayساخت آرایه مورد نظر. به عنوان ورودی این تابع میتوانید list یا tuple یا هر شیئ آرایه مانند دیگری بفرستید.A= np.array([1,2,3,4,5])
print(A):output[1,2,3,4,5]:fuulپر کردن همه خانه های یک آرایه با عددی مشخصB= np.full((4,2),2.3)
print(B):output[[2.3 2.3][2.3 2.3][2.3 2.3][2.3 2.3]]:insertدرج عنصر در ایندکس مشخص درآرایه. پارامتر های ورودی این آرایه به ترتیب نام آرایه, ایندکس درج و مقدار است.X= np.array([1,2,3,4,5,6,7,8,9,10])
inserted = np.insert(X,2,20)
print(X)
print(inserted):output[1,2,3,4,5,6,7,8,9,10][1,2,20,3,4,5,6,7,8,9,10]:deleteحذف عنصر از آرایه. پارامتر های ورودی این تابع نام آرایه و ایندکس حذف.the_array = np.array([[1, 2], [3, 4]])
print(the_array)
 
the_array = np.delete(the_array, [1, 2])
print(the_array):output[[1 2][3 4]][1,4]:typeمشاهده نوع آبجکت ها.A= np.array([1,2,3,4,5,6,7,8,9,10])
print(type(A)):output&lt;class &#x27;numpy.ndarray&#x27;&gt;:dtypeیک ویژگی هست برای مشاهده نوع عناصر موجود در یک آرایه.arrChar = np.array([&#039;a&#039;,&#039;b&#039;,&#039;c&#039;])
arrString = np.array([&#039;maryam&#039;,&#039;danial&#039;,&#039;arshia&#039;]) 
arrFloat = np.array([1.2,3.2,1.0]) 
print(arrChar) 
print(arrString)
print(arrFloat):output[&#x27;a&#x27; &#x27;b&#x27; &#x27;c&#x27;][&#x27;maryam&#x27; &#x27;danial&#x27; &#x27;arshia&#x27;][1.2 3.2 1. ]:astype(&#x27;datatype&#x27;)تغییر نوع عناصر یک آرایه. خروجی این تابع یک آرایه جدید است, پس یک متغیر جدا برای آن در نظر بگیرید.X= np.array([1.1,2.1,3.1])
newarray = arr.astype(&#039;i&#039;)
print(X)
print(X.dtype)
print(newarray)
print(newarray.dtype):output[1.1 2.1 3.1]float64[1 2 3]int32:indexدسترسی به عناصر یک آرایه.B= np.array([1,2,3,4])
print(B[0] + B[2] * B[3] / B[1]):output7.0:Slicingدسترسی به اعضا یک آرایه از یک ایندکس مشخص تا ایندکس دیگر.میتوانید با نوشتن [start : end : step] رو به روی اسم آرایه مورد نظر این کار را انجام دهیدتوجه داشته باشید:درصورت ننوشتن start , صفر در نظر گرفته میشود.درصورت ننوشتن end , سایز آرایه در نظر گرفته میشود.درصورت ننوشتن step , یک درنظر گرفته میشود.X= np.array([1,2,3,4,5,6,7]) 
print(X[1:5:2])
print(X[0:5])
print(X[4:])
print(X[:3]):output[2 4][1 2 3 4 5][5 6 7][1 2 3]:viewکپی گرفتن از آرایه. اما در نظر داشته باشید که اگر بعد از آن تغییری در آرایه اصلی ایجاد کنید آن تغییر روی آرایه کپی نیز اعمال میشود.A= np.array([1,2,3,4,5,6,7])
x= A.view
A[0] = 42
print(A)
print(x):output[42 2 3 4 5 6 7]&lt;built-in method view of numpy.ndarray object at 0x7f216f367870&gt;:for inپیمایش روی اعضا آرایه.A= np.array([1,2,3,4,5,6,7])
for x in A:
    print(x):output1234567:ndenumerateمشاهده ایندکس هر عضو از آرایه در کنارش, هنگام پیمایش.A= np.array([1,2,3,4,5,6,7])
for idx, x in np.ndenumerate(A):
     print(idx,x):output(0,) 1(1,) 2(2,) 3(3,) 4(4,) 5(5,) 6(6,) 7:concatenateوصل کردن چند آرایه به یکدیگر و تبدیل آن ها به یک آرایه. این تابع یک آرگومان ورودی axis دارد که در قسمت توابع آرایه دو بعدی به توضیح آن خواهیم پرداخت.A= np.array([1,2,3])
B= np.array([4,5,6])
C= np.concatenate((A,B))
print(C):output[1,2,3,4,5,6]:arry_splitشکستن یک آرایه به چند آرایه دیگر. آرگومان دوم این تابع تعداد (n)آرایه هایی که میخواهید آرایه اصلی به آن تقسیم شود را مشخص میکند.A= np.array([1,2,3,4,5,6,7])
newarr = np.array_split(A,3)
print(newarr)
print(newarr[2]):output[array([1, 2, 3]), array([4, 5]), array([6, 7])][6 7]:where (element or …)انجام عملیات جست و جو در آرایه.A= np.array([1,2,3,4,5,4,7])
x = np.where(A == 4)
print(x):output(,array([3, 5])):searchsorted(array, element, side)A= np.array([6,7,8,9])
x= np.searchsorted(A , 7 , side=&#039;right&#039;)
y= np.searchsorted(A , 7 , side=&#039;left&#039;)
print(x)
print(y):output21:sortمرتب سازی آرایه.num=np.array([3 , 2 , 0 ,1])
string = np.array([&#039;banana&#039;,&#039;cherry&#039;,&#039;apple&#039;])
boolean = np.array([True,False,True])
print(np.sort(num))
print(np.sort(string ))
print(np.sort(boolean )):output[0 1 2 3][&#x27;apple&#x27; &#x27;banana&#x27; &#x27;cherry&#x27;][False True True]:Filteringاین امر با استفاده از یک آرایه بولین صورت میگیرد.شما با استفاده از یک آرایه boolean, تمامی عانصر آرایه که ایندکس متناظر آنها در آرایه بولین true است را بدست می آورید. یعنی آرایه خود را فیلتر می کنید.A= np.array([3 , 2 , 0 ,1])
x= [True,False,True,False]
filteredarr = A[x]
print(filteredarr):output[3 0]آرایه دو بعدی:A= np.array([[1,2,3],[4,5,6]])
print(A):output[3 2 1]][[6 5 4]آرایه سه بعدی:A= np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
print(A):output[3 2 1]]][[6 5 4][3 2 1]][[[6 5 4]:reshapeبهتر است برای ساخت آرایه سه بعدی به بالا, ابتدا یک آرایه تک بعدی بسازید و سپس با این متد, بعد آن را تغییر دهید.A= np.array([1,2,3,4,5,6,7,8,9,10,11,12])
newarr1 = A.reshape(4,3)
newarr2 = A.reshape(2,3,2)
print(newarr1)
print(newarr2):output[3 2 1]][6 5 4][9 8 7][[12 11 10][2 1]]][4 3][[6 5][8 7]][10 9][[[12 11]:ndimچک کردن چند بعدی بودن یک آرایه.A= np.array(42)
B= np.array([1,2,3,4,5,6,7,8,9,10,11,12])
C= np.array([[1,2,3],[4,5,6]])
D= np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
print(A.ndim)
print(B.ndim)
print(C.ndim)
print(D.ndim):output0123:shapeتعداد عناصر در هر بعد آرایه را نمایش می دهد.A= np.array([1,2,3,4,5,6,7,8,9,10,11,12])
print(A.shape):output(,12):stackتبدیل آرایه های یک بعدی به یک آرایه چند بعدی.A= np.array([1,2,3])
B= np.array([4,5,6])
C= np.stack((A,B), axis=1)
newarr = np.stack((A,B),axis=0)
print(C)
print(newarr):output[4 1]][5 2][[ 6 3][3 2 1]][[6 5 4]معرفی ماژول random از کتابخانه numpy:from numpy import random:randایجاد یک عدد رندوم اعشاری بین 0 تا 1import numpy as np
A= np.random.rand()
print(A):output0.6320352681869909:randint (range, n)ایجاد یک آرایه n بعدی با عناصر بین 0 تا range.x = np.random.randint(100,size=(3,5))
print(x):output[7 47 9 67 18]][67 21 4 12 39][[2 64  50 50 67]برای اطلاعات بیشتر میتونید به سایت iran-ai.ir مراجعه کنید.#Iran-ai</description>
                <category>Mahdi</category>
                <author>Mahdi</author>
                <pubDate>Sat, 20 Nov 2021 09:00:16 +0330</pubDate>
            </item>
            </channel>
</rss>