<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های داریوش جوکار</title><link>https://virgool.ir/feed/@m_47202362</link><description></description><language>fa</language><pubDate>2026-11-11 23:46:01</pubDate><image><url>https://files.virgool.ir/upload/users/3727970/avatar/xSKnep.jpg</url><title>داریوش جوکار</title><link>https://virgool.ir/@m_47202362</link></image><item><title>وقتی flutter pub add بدون خطا انجام می‌شود اما flutter run شکست می‌خورد! (مشکل مخازن Gradle در ایران)</title><link>https://virgool.ir/@m_47202362/وقتی-flutter-pub-add-بدون-خطا-انجام-می-شود-اما-flutter-run-شکست-می-خورد-مشکل-مخازن-gradle-در-ایران-kr1agdw8i9gu</link><description>اگر توسعه‌دهنده Flutter باشید و در محیط‌هایی با محدودیت دسترسی به مخازن خارجی کار کنید، احتمالاً با این سناریو مواجه شده‌اید:ابتدا یک پکیج را به پروژه اضافه می‌کنید:flutter pub add package_nameهمه چیز بدون هیچ خطایی انجام می‌شود، اما هنگام اجرای پروژه:flutter runبا خطاهایی مانند موارد زیر روبه‌رو می‌شوید:Could not resolve all artifacts&#xA;&#xA;Could not find com.android.tools.build:gradle&#xA;&#xA;Could not resolve dependencyدر نگاه اول تصور می‌کنیم نسخه Gradle، Android Gradle Plugin یا حتی Flutter با یکدیگر ناسازگار هستند؛ اما همیشه مشکل از نسخه‌ها نیست.تفاوت flutter pub add و flutter runزمانی که دستور flutter pub add را اجرا می‌کنید، Flutter فقط وابستگی Dart را از مخزن  دریافت کرده و فایل pubspec.yaml را به‌روزرسانی می‌کند.در این مرحله Gradle هنوز وارد فرآیند ساخت پروژه نشده است.اما هنگام اجرای flutter run، Gradle شروع به ساخت پروژه اندروید می‌کند و تمام پلاگین‌هایی که به پروژه اضافه شده‌اند نیز باید وابستگی‌های Android خود را دریافت کنند.در این مرحله است که بسیاری از مشکلات مربوط به Repositoryها خودشان را نشان می‌دهند.نکته‌ای که کمتر به آن توجه می‌شودبسیاری از توسعه‌دهندگان تصور می‌کنند تنظیم Repositoryها فقط در پروژه اصلی انجام می‌شود، در حالی که اکثر پلاگین‌های Flutter نیز یک پروژه Android مستقل دارند.برای مثال تقریباً تمام پلاگین‌ها پوشه‌ای مشابه زیر دارند:package_name/&#xA;└── android/&#xA;    ├── build.gradle&#xA;    ├── settings.gradle&#xA;    └── ...این پروژه Android می‌تواند Repositoryهای مخصوص خودش را داشته باشد.برای نمونه:repositories {&#xA;    google()&#xA;    mavenCentral()&#xA;}یا در فایل‌های جدیدتر:pluginManagement {&#xA;    repositories {&#xA;        google()&#xA;        mavenCentral()&#xA;    }&#xA;}به همین دلیل حتی اگر پروژه اصلی شما از Mirror یا Repository دیگری استفاده کند، ممکن است یکی از وابستگی‌ها همچنان تلاش کند فایل‌های موردنیاز خود را مستقیماً از Google Maven یا Maven Central دریافت کند.اگر دسترسی به این مخازن وجود نداشته باشد، فرآیند Build متوقف می‌شود.چرا فقط بعضی از پکیج‌ها این مشکل را دارند؟همه پکیج‌ها ساختار یکسانی ندارند.برخی از آن‌ها کاملاً از تنظیمات پروژه اصلی پیروی می‌کنند، اما برخی دیگر Repositoryها یا نسخه‌های Gradle موردنیاز خود را در فایل‌های داخلی پلاگین تعریف کرده‌اند.در نتیجه ممکن است:ده‌ها پکیج بدون مشکل کار کنند.اما فقط یک پکیج باعث شکست کل فرآیند Build شود.چگونه متوجه شویم مشکل از خود پلاگین است؟اگر پروژه اصلی بدون مشکل تنظیم شده باشد اما بعد از اضافه کردن یک پکیج خاص Build با خطا مواجه شود، بهتر است فایل‌های Android همان پلاگین را بررسی کنید.تمام پکیج‌های Flutter بعد از دانلود در Pub Cache ذخیره می‌شوند.در ویندوز معمولاً مسیر آن‌ها به شکل زیر است:C:\Users\&lt;User&gt;\AppData\Local\Pub\Cache\hosted\pub.devسپس وارد پوشه همان پکیج شوید و فایل‌های Gradle موجود در پوشه android را بررسی کنید.در بسیاری از مواقع مشاهده خواهید کرد که Repositoryهای جداگانه‌ای در آن تعریف شده‌اند.راهکاراگر از Mirror برای دانلود وابستگی‌های Gradle استفاده می‌کنید، تنها تنظیم کردن Repositoryها در پروژه اصلی کافی نیست.تمام پروژه‌های Android موجود در وابستگی‌ها نیز باید بتوانند از همان Mirror استفاده کنند.در غیر این صورت، هنگام Build، هر پلاگین تلاش می‌کند وابستگی‌های خود را از Repositoryهایی که داخل فایل‌های خودش تعریف شده‌اند دریافت کند و همین موضوع باعث بروز خطا خواهد شد.به همین دلیل، هنگام مواجهه با خطاهای دانلود وابستگی، علاوه بر فایل‌های Gradle پروژه اصلی، فایل‌های Gradle موجود در خود وابستگی‌ها را نیز بررسی کنید.جمع‌بندیاگر با این وضعیت مواجه شدید که:flutter pub add بدون خطا انجام می‌شود.اما flutter run یا gradlew build با خطاهای مربوط به Gradle یا دانلود وابستگی‌ها شکست می‌خورد.قبل از تغییر نسخه Flutter، Gradle یا Android Studio، بررسی کنید که آیا خود وابستگی موردنظر دارای تنظیمات Gradle و Repository مستقل نیست.در بسیاری از موارد، مشکل نه از Flutter است و نه از نسخه Gradle؛ بلکه از این موضوع ناشی می‌شود که یکی از وابستگی‌ها همچنان از Repositoryهایی استفاده می‌کند که در محیط فعلی شما قابل دسترس نیستند.</description><category>داریوش جوکار</category><author>داریوش جوکار</author><pubDate>Thu, 23 Jul 2026 09:39:21 +0330</pubDate></item><item><title>آرایه در علم کامپیوتر: بررسی ساختار، حافظه و تفاوت‌های استاتیک و داینامیک</title><link>https://virgool.ir/@m_47202362/آرایه-در-علم-کامپیوتر-بررسی-ساختار-حافظه-و-تفاوت-های-استاتیک-و-داینامیک-zqiiimqcqpgh</link><description>آرایه یکی از مهمترین ساختمان دادهها در علم کامپیوتر است که برای ذخیرهسازی مجموعهای از دادهها در حافظه استفاده میشود. این دادهها بهطور پشت سر هم در حافظه قرار میگیرند، که باعث میشود عملیات دسترسی و پردازش دادهها سریعتر و بهینهتر باشد. اما نحوهی مدیریت حافظه و انعطافپذیری آرایهها در زبانهای برنامهنویسی مختلف تفاوت دارد. در این مقاله، به بررسی ساختار آرایهها در زبانهای استاتیک و داینامیک پرداخته و نحوهی مدیریت حافظه در هر یک را بررسی میکنیم.آرایههای استاتیکدر زبانهایی مانند C و C++ که به صورت استاتیک مدیریت حافظه را انجام میدهند، آرایهها دارای ویژگیهای زیر هستند:هنگام تعریف آرایه، اندازهی آن باید از قبل مشخص باشد.تمامی المانهای آن از یک نوع داده هستند.دادهها به صورت پشت سر هم در حافظه قرار میگیرند.اندازهی هر المان یکسان است، که باعث میشود پردازنده بتواند به راحتی با استفاده از یک offset مقدار مورد نظر را پیدا کند.مثال از تعریف آرایه در C++:char characters[3] = {&#39;C&#39;, &#39;A&#39;, &#39;T&#39;};در اینجا، حافظهی مورد نیاز برای ذخیرهی این آرایه از قبل مشخص شده و هر المان دقیقاً یک بایت فضا اشغال میکند. به دلیل همین ساختار، دیگر نمیتوان به آرایه مقداری اضافه یا کم کرد، زیرا برنامههای دیگر ممکن است از فضاهای مجاور در حافظه استفاده کنند.آرایههای داینامیکدر زبانهای داینامیک مانند Python و JavaScript، آرایهها انعطافپذیرتر هستند و ویژگیهای زیر را دارند:اندازهی آرایه میتواند تغییر کند (افزودن یا حذف المانها بدون محدودیت).هر المان میتواند از نوع دادهی متفاوتی باشد.دادهها به صورت اشارهگر به حافظه مدیریت میشوند، نه به صورت بلوکهای متوالی در حافظه.مثال از تعریف آرایه در /p&gt;let mix = [&#34;string&#34;, true, 8888];&#xA;mix.push(&#34;AnotherElement&#34;);مدیریت حافظه در آرایههای داینامیکوقتی یک مقدار جدید به آرایه اضافه شود، زبان برنامهنویسی ابتدا بررسی میکند که آیا در حافظهی فعلی فضای خالی وجود دارد یا نه:اگر فضا باشد، مقدار جدید به سادگی اضافه میشود.اگر فضا پر باشد، یک فضای جدید در حافظه اختصاص داده شده و تمام دادههای قبلی به آن منتقل میشوند.در برخی زبانها، هنگام افزایش اندازهی آرایه، ظرفیت آن دو برابر میشود تا از جابهجاییهای مکرر جلوگیری شود.برای مدیریت انواع مختلف داده در آرایههای داینامیک، زبانهایی مانند JavaScript معمولاً به بزرگترین سایز داده در آرایه نگاه میکنند و از یک مقدار ثابت برای اندازهی هر المان استفاده میکنند. مثلاً اگر بزرگترین مقدار ذخیرهشده در آرایه ۳ بایت باشد، زبان برنامهنویسی برای همهی المانها ۳ بایت در نظر میگیرد تا دسترسی به دادهها آسانتر باشد.مقایسهی دسترسی به دادهها در آرایههای استاتیک و داینامیکآرایههای استاتیک: دسترسی به هر مقدار زمان اجرای O(1) دارد، زیرا موقعیت هر مقدار را میتوان با استفاده از یک محاسبهی ساده در آدرس حافظه پیدا کرد.آرایههای داینامیک: دسترسی معمولاً O(1) است اما در برخی موارد میتواند کندتر باشد، زیرا اشارهگرهای حافظه باید پردازش شوند.نتیجهگیریآرایهها یکی از اساسیترین ساختمان دادهها هستند که در زبانهای برنامهنویسی مختلف به شکلهای متفاوت پیادهسازی میشوند. در زبانهای استاتیک، آرایهها ساختاری بهینهتر برای پردازش سریع دارند اما اندازهی آنها محدود است. در مقابل، در زبانهای داینامیک، انعطافپذیری بیشتری دارند اما هزینهی بیشتری از نظر مدیریت حافظه دارند. انتخاب نوع آرایه بستگی به نیاز پروژه و زبان برنامهنویسی مورد استفاده دارد.</description><category>داریوش جوکار</category><author>داریوش جوکار</author><pubDate>Thu, 27 Mar 2025 00:43:52 +0330</pubDate></item></channel></rss>