<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های جواد زبیدی زاده</title>
        <link>https://virgool.io/feed/@j.zobeidi</link>
        <description>برنامه نویس و توسعه دهنده نرم افزار های کاربردی تحت وب و موبایل</description>
        <language>fa</language>
        <pubDate>2026-06-10 14:06:12</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/226664/avatar/7T27cF.jpeg?height=120&amp;width=120</url>
            <title>جواد زبیدی زاده</title>
            <link>https://virgool.io/@j.zobeidi</link>
        </image>

                    <item>
                <title>رفع مشکل نام خلیج فارس  در پکیج فلاتر مپ(flutter_map)</title>
                <link>https://virgool.io/@j.zobeidi/%D8%B1%D9%81%D8%B9-%D9%85%D8%B4%DA%A9%D9%84-%D9%86%D8%A7%D9%85-%D8%AE%D9%84%DB%8C%D8%AC-%D9%81%D8%A7%D8%B1%D8%B3-%D8%AF%D8%B1-%D9%BE%DA%A9%DB%8C%D8%AC-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D9%85%D9%BEfluttermap-jghdubxuupqx</link>
                <description>وقتی از flutter_map که از نقشه openstreetmap استفاده میکنه توی پروژه هاتون استفاده میکنید میبینید نام خلیح فارس رو تغییر دادن این مشکل بیشتر از  زمانی رخ داد که (برخی کاربران ایرانی) شروع به خراب کاری توی نقشه کردند.حالا من میخواستم از این نقشه بجای گوگل مپ(گران و تحریم شده) توی نرم افزار استفاده کنم مشکل اساسی که وجود داشت این بود که نرم افزار ایرانی هستش و کاربران ایرانی میخوان از اون استفاده کنند و نام دیگه ای جای خلیج فارس هستش و این میتونه باعت ناراحتی خیلی ها بشهخب ما میتونیم از قابلیت OverlayImage در این پکیج استفاده کنیم و نام خلیج فارس رو به صورت سفارشی روی تصویر دیگه ای قرار بدیم میتونید در زیر کد کامل رو مشاهده کنید.نکته: شما باید یک تصویری ایجاد کنید و ادرسش رو در NetworkImage قرار بدید https://gist.github.com/javad-zobeidi/957df3e22c3e5dc57ea86156b963247f موفق باشید</description>
                <category>جواد زبیدی زاده</category>
                <author>جواد زبیدی زاده</author>
                <pubDate>Wed, 29 Jun 2022 12:39:25 +0430</pubDate>
            </item>
                    <item>
                <title>چطور یک تقویم شمسی بدون هیچ پکیجی ایجاد کنیم(فلاتر)</title>
                <link>https://virgool.io/flutter-community/%DA%86%D8%B7%D9%88%D8%B1-%DB%8C%DA%A9-%D8%AA%D9%82%D9%88%DB%8C%D9%85-%D8%B4%D9%85%D8%B3%DB%8C-%D8%A8%D8%AF%D9%88%D9%86-%D9%87%DB%8C%DA%86-%D9%BE%DA%A9%DB%8C%D8%AC%DB%8C-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%DA%A9%D9%86%DB%8C%D9%85%D9%81%D9%84%D8%A7%D8%AA%D8%B1-tjdl9vmqxrz4</link>
                <description>خب شاید به فکرتون رسیده  یک تقویمی برای خودتون بنویسید و توی برنامه های خودتون استفاده کنید و اون رو طبق سلیقه خودتون شخصی سازی کنید. ولی خب به هر دلیل نمیتونید اینکار بکنید توی این مقاله من میخوام بهتون بگم چطوری میتونید یک تقویم شمسی ایجاد کنید.اول باید بگم که این کد برای فلاتر هستش ولی خب میتونید با کمی تغییر در زبان های دیگه هم پیاده سازی کنید. من برای پایتون هم تستش کردم جواب داد.ابتدا 3تا متغیر ایجاد میکنیم به صورت زیر  static List&lt;String&gt; sortedDays = const [    &#039;شنبه&#039;,    &#039;یکشنبه&#039;,    &#039;دوشنبه&#039;,    &#039;سه شنبه&#039;,    &#039;چهارشنبه&#039;,    &#039;پنج شنبه&#039;,    &#039;جمعه&#039;,  ];    کار این متغیر بر گردوندن نام هر روز هفته هستش      static List&lt;String&gt; weekDay = const [    &#039;یکشنبه&#039;,    &#039;دوشنبه&#039;,    &#039;سه شنبه&#039;,    &#039;چهارشنبه&#039;,    &#039;پنج شنبه&#039;,    &#039;جمعه&#039;,    &#039;شنبه&#039;  ];حتما میدونید که روز های هفته توی تقویم میلادی از روی یک شنبه شروع میشه پس weekDay شماره روز رو برای ما بر میگردونه  static List&lt;String&gt; dayH = const [    &#039;ش&#039;,    &#039;ی&#039;,    &#039;د&#039;,    &#039;س&#039;,    &#039;چ&#039;,    &#039;پ&#039;,    &#039;ج&#039;,  ];     خب dayH هم معلومه دیگه برای چی هستش برای نمایش نام روز بالای تقویم خودمون هستش      List&lt;Widget&gt; _getDayHeaders() {    final List&lt;Widget&gt; result = &lt;Widget&gt;[];    for (String dayHader in dayH) {      result.add(ExcludeSemantics(        child: Center(child: Text(dayHader)),      ));    }    return result;  }  این تابع برای این هستش که هدر تقویم خودمون رو ایجاد کنیم همون حروف اول هر روز     final List&lt;Widget&gt; labels = &lt;Widget&gt;[];   یک لیستی از نوع ویجت ایجاد میکنیم      خب حالا میایم تابعی مینویسیم که بتونیم روز های یک ماه رو حساب کنیم    خب اولین روز یک ماه  از شنبه تا یک شنبه متغییر هستش بر اساس شماره هفته    days() {  // اینجا من اومدم به صورت static اولین روز ماه خرداد سال 1400 رو به صورت میلادی در تابع DateTime قرار دادم  // ما در این تابع میایم تاریخ ها را بر اساس تاریخ میلادی سیستم محاسبه میکنیم  // اگر تقویمی دم دست شما هستش میبینید که اولین روز خرداد ماه میشه 22/5/2021  var gdate = DateTime(2021,05, 22);     // خب حالا ما بر اساس متغیری که در بالا تعریف کردیم میایم شماره روز رو میگیریم  // اینجا گفتم اگر شماره برار 7 بود یعنی 7 روز هفته به میلادی که میشه یکشنبه برای ما 0 رو برگردون در غییر این صورت شماره اون هفته رو به ما بده  var daynum = gdate.weekday == 7 ? 0 : gdate.weekday;   // خب حالا میایم  اندیس اون روزی که در بالا گرفتیم رو از لیست weekDay میگیریم var startday = sortedDays.indexOf(weekDay[daynum]);      // حالا میایم و اون روز های که تابعش رو در بالا ایجاد کردیم برای نمایش در بالای تقویم خودمون هستش رو توی  متغیری label قرار میدیم  labels.addAll(_getDayHeaders());    // یک ایجاد میکنیم که تعداد روز های ماه رو بر گردونه  var daysInMonth = 31;    // یک متغیر برای بر گردوندن روزی که هستش(امروز)  int today = 27;    // متغییر بعدی هم روزی که توسط کاربر انتخاب شده اینجا به صورت static قرار میدیم  int selectedDay = 28;    // اینجا یک حلقه ایجاد کردیم که شرط اون برابر true هستش   // این حلقه تا زمانی که شمارنده کوچیکتر از تعداد روز های هفته هستش ادامه پیدا میکنه  for (int i = 0; true; i ++) {	// خب میایم چیکار میکنیم 	// میگم که شمارهنده رو بگیر از اون اندیسی که به عنوان  روز شروع ماه هستش کم کن و با 1 جمعش کن	final int day = i - startday + 1;	// اول باید یک شرطی بنویسیم بعد از عمل بالا که اگر عدد روز ما از تعداد روز های که بالا تعیین کردیم که 31 هستش بیشتر بود از حلقه خارج شو	if (day &gt; daysInMonth) break;	// شرط دوم هم برای چینش شماره روز ها هستش	// اینجا گفتیم اگر عدد روز  کمتر از 1 بود یک ویجت خالی اضافه کن	if (day &lt; 1) {		labels.add(Container());	}else{	// در غییر این صورت شماره اون روز رو برای ما قرار بده	// قبل از هرچیزی باید روزی که توش هستیم رو تعیین کنیم که میشه همون امروز	bool inToday = today == day;	// بعد روزی که کاربر انتخاب کرده رو باید رنگی کنیم	bool slected = day == selectedDay;		// حالا میایم رنگ روز ها رو تعیین میکنیم	// روزی که ما توش هستیم(امروز) رنگ قرمز میگیره	// روزی که کاربر انتخاب کرده خاکستری	// روزهای دیگه هم به رنگ آبی در میاریم	BoxDecoration decoration = BoxDecoration(color: inToday ? Colors.red : slected ? Colors.grey : Colors.blue, shape: BoxShape.circle);			// حالا یک ویجتی ایجاد میکنیم و شماره روز رو توی اون قرار میدیم	Widget dayWidget = Container(          margin: EdgeInsets.only(top: 5),          decoration: decoration,          child: Center(            child: Semantics(              label: &#039;$day, $day&#039;,              child: ExcludeSemantics(                child: Text(&amp;quot$day&amp;quot),              ),            ),          ),        );				// خب حالا میخوایم بگیم اون روزی که انتخاب شده دیگه قابل انتخاب نباشه و روز های دیگه قابل انتخاب باشند به صورت زیر عمل میکنیم		if (!slected) {          dayWidget = GestureDetector(            /span&gt;            onTap: () {              print(day);              setState((){                selectedDay = day;              });              },            child: dayWidget,          );        }				// و در نهایت ویجت رو به لیست ویجت های خودمون اضافه میکنیم		labels.add(dayWidget);	}  }} حالا یک کلاسی از نوع SliverGridDelegate ایجاد میکنیم تا بتونید توی GridView از اون استفاده کنیم توی خاصیت childrenDelegate از GridViewconst double _kDayPickerRowHeight = 32.0;const int _kMaxDayPickerRowCount = 6;class _DayPickerGridDelegate extends SliverGridDelegate {  const _DayPickerGridDelegate();  @override  SliverGridLayout getLayout(SliverConstraints constraints) {    const int columnCount = DateTime.daysPerWeek;    final double tileWidth = constraints.crossAxisExtent / columnCount;    final double tileHeight = math.min(_kDayPickerRowHeight,        constraints.viewportMainAxisExtent / (_kMaxDayPickerRowCount + 1));    return SliverGridRegularTileLayout(      crossAxisCount: columnCount,      mainAxisStride: tileHeight,      crossAxisStride: tileWidth,      childMainAxisExtent: tileHeight,      childCrossAxisExtent: tileWidth,      reverseCrossAxis: axisDirectionIsReversed(constraints.crossAxisDirection),    );  }  @override  bool shouldRelayout(_DayPickerGridDelegate oldDelegate) =&gt; false;}حالا میرسیم به اصل کاری و نمایش تقویمی که ایجاد کردیمم در گرید ویوconst _DayPickerGridDelegate _kDayPickerGridDelegate = _DayPickerGridDelegate();Directionality(          textDirection: TextDirection.rtl,          child: Center(              child: Container(                  width: 250,                  child: GridView.custom(                    gridDelegate: _kDayPickerGridDelegate,                    childrenDelegate: SliverChildListDelegate(labels,                        addRepaintBoundaries: false),                  ))))				  				  				  کار ما هم تموم شدهشما میتونید این تقویم رو بهینه تر کنید مرتبت کنید و ازش استفاده کنید نکته خیلی مهم یادتون باشه که برای گرفتن اولین روز هر ماه میتونید از پکیج های موجود که تاریخ شمسی رو به میلادی تبدیل میکنند استفاده کنید به صورت زیرشما بهش 1400/03/01 رو میدید و به میلادی بر میگردونید که تاریخ 2021/05/22 رو میده حالا میتونید توی DateTime قرار بدید و تقویم رو ایجاد کنیدمیتونید لیستی از سال ها و ماه ها رو هم ایجاد کنید و یک تقویم کاملی ایجاد کنیدخب امید وارم که این مقاله هم بدرد شما خورده باشهکپی میکنید هم اسم جواد زبیدی زاده رو به عنوان نویسنده ذکر کنید :)</description>
                <category>جواد زبیدی زاده</category>
                <author>جواد زبیدی زاده</author>
                <pubDate>Thu, 17 Jun 2021 11:09:57 +0430</pubDate>
            </item>
                    <item>
                <title>کدگزاری و رمز گشایی ویدئو ها (encryption/decryption video)</title>
                <link>https://virgool.io/@j.zobeidi/%DA%A9%D8%AF%DA%AF%D8%B2%D8%A7%D8%B1%DB%8C-%D9%88-%D8%B1%D9%85%D8%B2-%DA%AF%D8%B4%D8%A7%DB%8C%DB%8C-%D9%88%DB%8C%D8%AF%D8%A6%D9%88-%D9%87%D8%A7-encryptiondecryption-video-ugvlyl4g3fne</link>
                <description>خیلی ها دوستان دارند برنامه های شبیه به فیلیمو بنویسند ولی یکی از مهمترین چیز در این نرم افزار ها رمزگذاری(encryption)  کردن فیلم ها هستش جوری که شما بتونید یک فیلمی رو رمزگذاری(encryption) کنید تا کسی که فیلم را دانلود کرده نتواند فیلم را منتشر کند و فقط از طریق یک پلیر اختصاصی بشه فیلم را پخش کرد خب مسلما این کار #امنیت برنامه ما را بالا میبره ولی چطوری میتونیم این کار رو بکنیم ?برای این کار میتونیم از ffmpeg استفاده کنیم که پکیج اون برای فلاتر - اندروید - ios و حتی ویندوز و لینکوس هم موجود هستش به وسیله این lib میتوانیم خیلی راحت فیلم های خودمون رو رمزگذاری(encrypt) کنیم / رمزگشایی(decrypt) کنیمنحویه  encryption/decryption ویدئو   رو در اینجا قرار میدمffmpeg -i in-put-video -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key  &quot;32 bit key&quot; -encryption_kid &quot;32 bit key&quot; out-put-video_encryptedin-put-video =&gt; ویدئو ورودی32 bit key =&gt; یک کد 32 بیتی یونیک  برای کد گذاریout-put-video_encrypted =&gt; خروجی ویدئو کد شدهنمونه کدffmpeg -i in-put-video.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 out-put-video_encrypted.mp4نحویه دیکد کردن هم به صورت زیر می باشدffmpeg -decryption_key &quot;32 bit key&quot;  -i in-put-encrypted-video out-put-decrypted-video&quot;32 bit key&quot; =&gt; همون کد 32 بیتی که برای کد گذاری استفاده شدهin-put-encrypted-video =&gt; ویدئوی که کد شدهout-put-decrypted-video =&gt; خروجی دیکد شدهبرای پخش ویدئو های کد شده میتوانید از کد زیر استفاده کنیدffplay -decryption_key 76a6c65c5ea762046bd749a2e632ccbb -i ElephantsDream_encrypted.mp4برای پخش فایل کد گذاری شده به وسیله استیرم میتونید از کد زیر استفاده کنیدffmpeg -f dshow -decryption_key 76a6c65c5ea762046bd749a2e632ccbb -i MyEncrypted-Video -preset ultrafast -vcodec libx264 -tune zerolatency -b 900k -f mpegts My-Stream-URIامید وارم مفید باشه و بتونید از این آموزش  استفاده کنید.?کپی و انتشار آموزش  فقط با ذکر منبع مجاز می باشد.</description>
                <category>جواد زبیدی زاده</category>
                <author>جواد زبیدی زاده</author>
                <pubDate>Tue, 15 Jun 2021 11:49:36 +0430</pubDate>
            </item>
            </channel>
</rss>