<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد جواد فخار</title>
        <link>https://virgool.io/feed/@mjfakhar</link>
        <description>توسعه دهنده وب و iOS</description>
        <language>fa</language>
        <pubDate>2026-06-19 11:46:57</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/85537/avatar/jqIwOa.png?height=120&amp;width=120</url>
            <title>محمد جواد فخار</title>
            <link>https://virgool.io/@mjfakhar</link>
        </image>

                    <item>
                <title>اپ های موبایلی و CI/CD</title>
                <link>https://virgool.io/@mjfakhar/%D8%A7%D9%BE-%D9%87%D8%A7%DB%8C-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84%DB%8C-%D9%88-cicd-jqxuoxxfhweo</link>
                <description>دائما ادغام کردن یا (Continuous Integration) به مراحل ادغام کد برنامه نویسان بر روی کد اصلی گفته میشود. این امکان به برنامه نویسان کمک میکند که بتوانند به سهولت مشکلات خود را پیدا و رفع کنند.مارتین فاولر در مورد CI میگوید: CI ما را از خطاها خلاص نمیکند، اما یافتن و حل آن ها را به صورت چشمگیری آسان میکند.CI بازخورد یا فیدبک ها را با سرعتی بالا مشخص و سرعت توسعه را بالا میبرد. برای راه اندازی و توسعه ی اپ این نکته که &quot;هر چه مشکلات زودتر حل شود، هزینه های کمتری خواهد داشت&quot;، بسیار حائز اهمیت است.کارهایی که در بخش CI انجام می شود:دسترسی به سورس کنترل هایی شبیه gitlab و دریافت سورس.آنالیزهای استاتیک بر روی کد انجام میگیرد تا مشکلات مربوط به syntax را استخراج کند.عملیات build و کامپایل را انجام میدهد.تست های مختلف مثل Unit test, UI Test, Smoke test را اجرا میکند.موارد و مشکلات را به تیم گزارش می دهد.تحویل مدام یا (Continuous Delivery) افزونه ای برای CI می باشد. به عبارت دیگر، ارائه به کاربر نهایی در هر زمانی را محقق می سازد. مراحلی که در این بخش انجام خواهد شد به موارد بخش CI اضافه خواهد شد که عبارتند از:ساخت package اپلیکیشناگر نیاز به code sign داشته باشد، در این مرحله انجام خواهد شد.عرضه اپ در استورها و محیط های قابل انتشار.اگر مرحله CD به تیم نرم افزاری اضافه شود، کلیه مراحل تولید به صورت خودکار انجام خواهد شد و این یعنی ریسک پایین و همچنین هزینه کمتر در اجرا و نهایی سازی محصول.  در واقع شما با یک کلیک میتوانید محصول نهایی را در اختیار کاربر قرار دهید. اگرچه به طور معمول همیشه تغییراتی به صورت دستی برای عرضه نهایی محصول بایستی صورت گیرد، ولی در CD هیچ تغییری به صورت دستی انجام نمیشود، بلکه بعد از commit شدن سورس کد و اجرای مراحل CI، در مسیر تعریف شده یا استراتژی مجموعه، تا عرضه نهایی محصول مراحل طی خواهند شد.اصطلاحی در این تکنولوژی وجود دارد به نام CI/CD Pipelines. اجرای مراحل CI و CD به وسیله ی یکسری دستورات انجام می شود که در این بخش به آنها خواهیم پرداخت. CI/CD pipelines در اپ های موبایلی با وب اپ ها متفاوت است. این تفاوت به خاطر پیچیدگی در ساختمان و نوع پکیج های اپ های موبایلی می باشد. تفاوت های CI/CD در اپ های موبایلی و وب اپ ها به شرح ذیل می باشد:وب اپ ها در مرورگر ها عرضه می شوند در حالی که در اپ های موبایلی برای سیستم عامل های مختلف و بر روی دیوایس های مختلف با ورژن های مختلفی از سیستم عامل بایستی تولید و عرضه شود.در وب اپ ها، فایل های مورد نیاز آن ها در فضاهای سروری ذخیره می شود.در استفاده از ابزار و تکنولوژی با هم متفاوت هستند. مثلا برای وب اپ ها از تکنولوژی هایی مثل جاوا، جاوا اسکریپت استفاده میشود. اما در اپ های موبایلی از یک زبان برای تولید محصول استفاده می شود.برای عرضه اپ های موبایلی به امضا یا code sign نیاز دارید ولی در اکثر اپ های وبی به این مسئله نیازی نیست.نوع عرضه ی وب اپ ها از نوع قرار دادن بر روی سرور یا push-type است اما عرضه اپ های موبایلی با قرار داده بر روی استورهای عرضه اپ و با دانلود کاربر همراه است که اصطلاحا به آن pull-type می گویند و بایستی به صورت دستی بروز رسانی شود.چگونه یک CI/CD pipelines بسازیم؟یک نکته بسیار حائز اهمیت است که بدانید برای ساخت یک pipelines بایستی حتما از command line استفاده کنید. این دستورات در اپ های موبایلی بسیار پیچیده هستند و بایستی مراحل code sign و عرضه در استورها برای آنها پیاده سازی شود. در اپ های موبایلی نیاز به ابزاری برای build خودکار سورس کد خود دارید. ابزار build خودکار در iOS با نام Fastlane و در اندروید با نام  Gradle مورد استفاده قرار میگیرد. مراحل ساخت یک CI/CD pipelines به شرح زیر می باشد:آنالیز ایستای خودکاربررسی syntax پیاده سازی اپ بر اساس زبانی که انتخاب شده است. مثلا زبان swift. اگر خطای جدی در سورس مشاهده شود، عملیات fail شده و به مرحله build نخواهیم رفت.پردازش برای build خودکاراگر از مرحله قبل یعنی آنالیز استاتیک عبور کنید، به مرحله build و کامپایل می رسید. اپ های موبایلی برای build شدن، باید سورس و منابع مربوطه ی آنها کامپایل شوند. نتیجه ی نهایی خروجی فایل ipa در ios و فایل apk در اندروید خواهد بود. برای مثال برای ios بایستی از ابزار fastlane استفاده کرد. Command زیر عمل build را با استفاده از این ابزار محقق می سازد:bundle exec fastlane buildاجرای خودکار تستاجرا تست به صورت خودکار، تمام کننده و حائز اهمیت است. در صورت نبود این مرحله، نقص در کیفیت محصول نهایی را رقم خواهد زد. تست های خودکار می تواند برای سطح و متدهای مهم نوشته شود. مطابق command قبلی در ios، برای تست در ios نیز باید به صورت زیر عمل نمود:bundle exec fastlane testو پابلیشبرای آماده سازی CI/CD Pipelines اپ های موبایلی نیاز به امضای کد یا code sign خواهید داشت.ارسال notificationزمانی که مراحل build به اتمام می رسد، مطلع شدن تیم اجرایی کار از نتیجه ی مراحل CI/CD بسیار حائز اهمیت می باشد. توسعه دهندگان می توانند لاگ های ثبت شده را بررسی نمایند ولی ارسال وضعیت به ایمیل یا اسلک آن ها راحت تر خواهد بود.در پایان عملیات build، بایستی CI/CD Pipeline یک پیام به توسعه دهندگان ارسال کند.ابزار های CI/CD برای اپ های موبایلیابزارهای این تکنولوژی دو نوع هست:Self-hosted: در این نوع بایستی تمامی ابزارها و فرایندها پیاده سازی، نگهداری و بهینه سازی شود. ابزارهایی مثل  Jenkins, TeamCity, BuildKiteCloud-base: در این نوع نیازی به پیاده سازی و نگهداری نیست و به راحتی قابل پیاده سازی خواهد بود به خصوص مراحل code sign و پابلیش. برای این نوع می توان از  Nevercode, Bitrise, Travis CI, Circle CI نام برد.مثال زیر سه مرحله در CI را پیاده سازی کرده است. مراحل تست و بیلد و گرفتن screenshot برای پابلیش بر روی appStore:# Use the latest stable version of Semaphore 2.0 YML syntax:
version: v1.0

# Name your pipeline. If you choose to connect multiple pipelines with
# promotions, the pipeline name will help you differentiate between
# them. For example, you might have a build phase and a delivery phase.
# For more information on promotions, see:
# https://docs.semaphoreci.com/article/67-deploying-with-promotions
name: Tallest Towers

# The agent defines the environment in which your CI runs. It is a combination
# of a machine type and an operating system image. For a project built with
# Xcode you must use one of the Apple machine types, coupled with a macOS image
# running either Xcode 10 or Xcode 11.
# See https://docs.semaphoreci.com/article/20-machine-types
# https://docs.semaphoreci.com/article/161-macos-mojave-xcode-10-image and
# https://docs.semaphoreci.com/article/162-macos-mojave-xcode-11-image
agent:
  machine:
    type: a1-standard-4
    os_image: macos-xcode11

# Blocks are the heart of a pipeline and are executed sequentially. Each block
# has a task that defines one or more parallel jobs. Jobs define commands that
# should be executed by the pipeline.
# See https://docs.semaphoreci.com/article/62-concepts
blocks:
  - name: Run tests
    task:
      # Set environment variables that your project requires.
      # See https://docs.semaphoreci.com/article/66-environment-variables-and-secrets
      env_vars:
        - name: LANG
          value: en_US.UTF-8
      prologue:
        commands:
          # Download source code from GitHub.
          - checkout
          # Restore dependencies from cache. This command will not fail in
          # case of a cache miss. In case of a cache hit, bundle  install will
          # complete in about a second.
          # See https://docs.semaphoreci.com/article/68-caching-dependencies
          - cache restore
          - bundle install --path vendor/bundle
          - cache store
      jobs:
        - name: Test
          commands:
            # Select an Xcode version.
            # See https://docs.semaphoreci.com/article/161-macos-mojave-xcode-10-image and
            # https://docs.semaphoreci.com/article/162-macos-mojave-xcode-11-image
            - bundle exec xcversion select 11.4.1

            # Run tests of iOS and Mac app on a simulator or connected device.
            # See https://docs.fastlane.tools/actions/scan/
            - bundle exec fastlane test

  - name: Build app
    task:
      env_vars:
        - name: LANG
          value: en_US.UTF-8
      secrets:
        # Make the SSH key for the certificate repository and the MATCH_PASSWORD
        # environment variable available.
        # See https://docs.semaphoreci.com/article/109-using-private-dependencies
        - name: match-secrets
      prologue:
        commands:
          # Add the key for the match certificate repository to ssh
          # See https://docs.semaphoreci.com/article/109-using-private-dependencies
          - chmod 0600 ~/.ssh/*
          - ssh-add ~/.ssh/match-repository-private-key
          # Continue with checkout as normal
          - checkout
          - cache restore
          - bundle install --path vendor/bundle
          - cache store
      jobs:
        - name: Build
          commands:
            - bundle exec xcversion select 11.4.1
            - bundle exec fastlane build

            # Upload the IPA file as a job artifact.
            # See https://docs.semaphoreci.com/article/155-artifacts
            - artifact push job build/TallestTowers.ipa
  - name: Take screenshots
    task:
      env_vars:
        - name: LANG
          value: en_US.UTF-8
      prologue:
        commands:
          - checkout
          - cache restore
          - bundle install --path vendor/bundle
          - cache store
      jobs:
        - name: Screenshots
          commands:
            - bundle exec xcversion select 11.4.1
            - bundle exec fastlane screenshots

            # Upload the screenshots directory as a project artifact.
            # See https://docs.semaphoreci.com/article/155-artifacts
            - artifact push job screenshots</description>
                <category>محمد جواد فخار</category>
                <author>محمد جواد فخار</author>
                <pubDate>Sat, 13 Jun 2020 16:46:16 +0430</pubDate>
            </item>
                    <item>
                <title>فایربیس و دیگر هیچ</title>
                <link>https://virgool.io/@mjfakhar/%D9%81%D8%A7%DB%8C%D8%B1%D8%A8%DB%8C%D8%B3-%D9%88-%D8%AF%DB%8C%DA%AF%D8%B1-%D9%87%DB%8C%DA%86-eg5llvkkdb2h</link>
                <description>در این مقاله لیست سرویس های فایربیس با توضیحاتی مختصر (از داکیومنت های خود فایربیس) استخراج و ارائه شده است. در ادامه سعی شده توضیحات مختصری از هر سرویس با زبانی روان و قابل فهم برای توسعه دهندگان و مدیرانی که تجربه ی استفاده از این سرویس ها را نداشتند، آورده شود.برای بعضی از سرویس ها که برای خودم جذاب تر بودند، توضیحات بیشتری ارائه شده و بعضی سرویس ها کلا از لیست زیر حذف شدند چون توضیحات زیادی نداشتند و یا هنوز در حالت Beta یا آزمایشی هستند. Cloud Firestore: یک پایگاه داده انعطاف پذیر و مقیاس پذیر (Scaleable) برای توسعه اپ های موبایلی، وب و سرور می باشد. شبیه Firebase Realtime برای ذخیره سازی و واکشی دیتا بصورت Sync در اپ قابل استفاده است. از ویژگی های این بخش پشتیبانی در حالت آفلاین می باشد. به عبارت دیگر می توانید با استفاده از این امکان نگران قطعی های شبکه و اینترنت نباشید.ML kit: ماشین لرنینگ، سرویسی که در حالت نسخه ی آزمایشی عرضه شده و هنوز نهایی نشده است. با یک مثال، کار ماشین لرنینگ چیست؟ اگر شما از یک فروشگاه آنلاین که تنوع محصولات زیادی دارد، خرید کرده باشید، معمولا در بخشی از صفحه لیستی از محصولات به نمایش گذاشته شده اند که معمولا کالاهای مرتبط با کالای مد نظر شما را نشان میدهند. ماشین لرنینگ به صاحبان کسب و کار کمک میکند تا با ذخیره سازی پیمایش کاربر در این فروشگاه ها علاوه بر محصولات مرتبط با محصول مدنظر، محصولاتی که می تواند در سبد خرید شما قرار بگیرد را به شما پیشنهاد دهد. مثلا اگر شما دنبال لباس هایی با رنج قیمتی پایین هستید، در مراجعات بعدی شما به فروشگاه، در صورتیکه محصولی مناسب با سلیقه ی شما موجود باشد، در لیست پیشنهادات ارائه خواهد شد. البته این مثال، بخش کوچکی از قابلیت های ماشین لرنینگ محسوب می شود.Cloud Function: برای نوشتن API های لازم اپ، میتوانید بدون تهیه ی سرورهای شخصی در این سرویس وب سرویس های لازم را پیاده سازی کنید. برای این منظور باید پکیج های nodejs را نصب کنید و نوشتن Api ها را شروع کنید. کد جاوا اسکریپت یا تایپ اسکریپت شما در فضای ابری گوگل ذخیره می شود و در دسترس قرار میگیرد.Authentication:اکثر برنامه ها نیاز به احراز هویت کاربران یا لاگین دارند. دانستن هویت کاربر به یک برنامه اجازه می دهد تا داده های کاربر از دست نرود و تجربیات کاربر در تمام دستگاه ها یکسان باشد.قابلیت اعتبار سنجی کاربران به عنوان یک سرویس backend، هم روش استفاده ی آسانی را فراهم کرده و همچنین UI آماده ای را ارائه می دهد. سرویس احراز هویت، استفاده از گذرواژه‌، شماره تلفن‌، ارائه دهندگان هویت مانند Google ، Facebook و Twitter و موارد دیگر پشتیبانی می کند.این سرویس با سایر سرویس های Firebase ادغام می شود و از استانداردهایی مانند OAuth 2.0 و OpenID Connect بهره می برد.Hosting:این سرویس، میزبانی سریع و ایمن را برای برنامه وب، محتوای استاتیک و پویا و میکرو سرویس ها ارائه می دهد. Firebase Hosting میزبان محتوای وب برای توسعه دهندگان است. با یک دستور می توانید به سرعت برنامه های وب را مستقر کرده و محتوای استاتیک و پویا را با یک CDN ارائه دهید. همچنین می توانید با استفاده از Cloud Function یا Cloud Run، خدمات ساخت و میزبانی micro-service در Firebase عرضه کنید.Cloud Storage:این امکان برای توسعه ی برنامه هایی که نیاز به ذخیره سازی محتوا تولید شده مثل عکس و فیلم و … دارد، ساخته شده است. امکانی ساده و مقرون به صرفه که در مقیاس گوگل ساخته شده است. عملیات آپلود و دانلود فایلها در اپ، بدون در نظر گرفتن کیفیت شبکه را پشتیبانی می کند. قابلیت ذخیره تصاویر ، صدا ، فیلم یا سایر محتوای تولید شده توسط کاربر را فراهم آورده است.Crashlytics: گزارشی ساده و در لحظه از اپ شما تهیه میکند و با ردگیری، اولویت بندی به شما برای بهبود عملکرد اپ کمک میکند.Performance Monitoring:شما با استفاده از SDK بخش Monitoring Performance به جمع آوری داده و عملکرد برنامه خود می پردازید. سپس آن داده را در کنسول Firebase بررسی و تحلیل می کنید. نظارت بر عملکرد به شما کمک می کند تا متوجه شوید که عملکرد برنامه شما کجا و در چه زمانی می تواند بهبود یابد. یک امکان برای customize کردن این بخش وجود دارد با عنوان custom monitoring.custom monitoring: با اضافه کردن custom traces می توانیم بررسی کنیم که یک task یا مجموعه ای از تسک های خاص در چه مدت زمانی انجام می شود. مثلا زمانی که برای واکشی اطلاعات از پایگاه داده صرف می شود یا لود مثلا لیست پکیج ها. برای هر custom trace می توان معیاری مشخص کرد. معیار پیش فرض، مدت زمان اجرای تسک می باشد ولی می توان معیارهای مختلفی را اضافه کرد مثلا میزان استفاده از کش یا حافظه.HTTP/S network request traces: گزارش استفاده از API ها یا به طور کلی زمان اتصال اپ به سرور آنلاین ( زمانی که اپ شما درخواستی را به سرور ارسال میکند تا جواب به طور کامل باز میگردد ) را نگهداری میکند. این امکان سه معیار کلی دارد:Response time: از زمان ارسال درخواست تا دریافت کامل جواب از سرورPayload size: حجم دانلود و آپلود در هر درخواستSuccess rate: درصد موفقیت نتایج صحیح نسبت به کل درخواست ها Attribute:جدول زیر پیش فرض های دو نوع trace تعریف شده ی بالا را نمایش میدهد:می توان به لیست attribute های بالا ، مشخصات بیشتری اضافه کرد. در حقیقت می توانید یک custom trace تعریف کنید و برای آن، مشخصات خاصی به لیست مشخصات پیش فرض اضافه نمایید. بطور مثال در یک بازی، سطح یا امتیاز کاربر به عنوان یک مشخصه ارسال شود. چند نکته برای تعریف custom attribute حائز اهمیت است:از اطلاعات شخصی کاربر نمیتوانید استفاده کنید مثل نام، ایمیل یا شماره تلفن.حداکثر 5 attribute برای هر trace می توانید اضافه کنید.برای نام گذاری نباید از space یا _ استفاده نمایید.جمع بندی: مجموع اطلاعاتی که فایربیس به صورت پیش فرض در اختیار قرار میدهد به شرح زیر می باشد:General device information, such as model, OS, and orientationRAM and disk sizeCPU usageCarrier (based on Mobile Country and Network Code)Radio/Network information (for example, WiFi, LTE, 3G)Country (based on IP address)Locale/languageApp versionApp foreground or background stateApp package nameAn pseudonymous app-instance identifierNetwork URLs (not including URL parameters or payload content) and the following corresponding information:Response codes (for example, 403, 200)Payload size in bytesResponse timesDuration times for automated tracesTest Lab:یک زیرساخت ابری برای تست اپ می باشد. با یک عمل ، می توانید برنامه Android یا iOS خود را در طیف گسترده ای از دستگاه ها و تنظیمات مختلف آزمایش کنید و نتایج آن مثل گزارش ها ، فیلم ها و عکس های موجود برای هر صفحه را در کنسول Firebase مشاهده کنید.In-App messaging:پیام رسانی درون برنامه Firebase به شما کمک می کند تا با ارسال پیام های متنی و غیر متنی، کاربران فعال خود را به استفاده از ویژگی های اصلی برنامه تشویق کنید. به عنوان مثال ، می توانید یک پیام درون برنامه ارسال کنید تا کاربران بتوانند اشتراک خریداری و یک فیلم تماشا کنند ، یک دیتایی را تکمیل یا یک محصول را خریداری کنند. می توانید پیام ها را به عنوان کارت ، بنر یا تصویر تنظیم کنید که دقیقاً در زمانی که بیشترین سود را برای کاربران شما دارند ، ظاهر شوند.Google analytics:گوگل آنالیتیکس قلب Firebase است. یک ابزار رایگان و نامحدود برای آنالیز. Analytics در میان ویژگی های Firebase ادغام شده و گزارش نامحدودی را برای حداکثر 500 رویداد مجزا ارائه می دهد که می توانید با استفاده از SDK در اپ خود تعریف کنید. گزارش های Analytics به شما کمک می کند تا بطور واضح و روشن نحوه رفتار کاربران خود را درک کنید. این امر باعث می شود تصمیم گیری آگاهانه ای درباره بازاریابی برنامه ها و بهینه سازی عملکرد اپ خود انجام دهید.Predictions:پیش بینی های Firebase با یادگیری و تجزیه و تحلیل داده های ارسالی از اپ شما انجام می شود، تا بر اساس پیش بینی رفتار کاربران ، کاربران فعال ایجاد کند. این پیش بینی ها به طور خودکار با Firebase Remote Config و Notifications و Firebase In-App Messaging و A / B Testing در تعامل هستند.استفاده این بخش از Remote Config، بر اساس تجربه های گذشته و پیش بینی ها انجام شده، تغییراتی در ظاهر و رفتار اپ ایجاد میکند.می توانید از پیش بینی های انجام شده از بخش Notifications برای ارسال پیام یا کمپین های تکرار شونده استفاده کنید. به عنوان مثال ، می توانید به طور خودکار اعلانی را برای کاربرانی که پیش بینی می شود از اپ شما استفاده نکنند، ارسال کنید.با  A / B Testing می توانید اثربخشی کمپین های برگزار شده و یا نتیجه ی تغییر در رفتار و ظاهر اپ را مشاهده کرد.A/B Testing:با تحلیل اجرای اپ، تحلیل و مقیاس محصول و آزمایش های بازاریابی، به بهینه سازی اپ شما کمک میکند. این امکان را به شما می دهد تا تغییرات رابط کاربری UI ، ویژگی ها یا کمپین های برنامه خود را آزمایش کنید تا بتوانید ببینید نتیجه ای داشته یا نه؟Cloud Messaging:ارسال push notification به یک یا چند کلاینت، بدون هیچگونه هزینه از امکانات این بخش می باشد.Remote config:این امکان یک سرویس ابری است که به شما امکان می دهد بدون بروز رسانی اپ توسط کاربران، رفتار و ظاهر برنامه خود را تغییر دهید. هنگام استفاده از Remote Config، مقادیر پیش فرض درون برنامه ایجاد می کنید که رفتار و ظاهر برنامه شما را کنترل می کند. سپس می توانید از کنسول Firebase یا API های Remote Config استفاده کنید تا مقادیر پیش فرضی که ایجاد شده است را برای همه یا بخشی از کاربران تغییر دهید. برنامه شما تغییرات را کنترل، بررسی و آنها را با تأثیر ناچیز در عملکرد، اعمال می کند.Dynamic Links:مدیریت Deep link ها و هدایت شدن لینک ها برای باز شدن یا نصب شدن (هدایت شدن به سمت App Store) اپ تعریف شده را بر عهده دارد.به صاحبان کسب و کارهای کوچک پیشنهاد میدهم قبل از آنکه شتابزده به دنبال تیمهای بزرگ برای پیاده سازی ایده ها خود باشند، با هزینه های کمتر به صورت آزمایشی از نتیجه ی ایده های خود به صورت عملیاتی مطمئن شوند.و به صاحبان کسب و کارهای بزرگ پیشنهاد میدهم با استفاده از این ابزار و ابزارهای دیگر برای تحلیل رفتار کاربر، بهبود راه های تعامل با کاربر و خدمات رسانی کم نقص، وقت بیشتری بگذارند و تمام تمرکز خود را بر روی فروش محصولات خود قرار ندهند.</description>
                <category>محمد جواد فخار</category>
                <author>محمد جواد فخار</author>
                <pubDate>Mon, 08 Jun 2020 16:22:11 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با ابزارهای XCode (قسمت اول)</title>
                <link>https://virgool.io/@mjfakhar/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-xcode-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-koa5h3xyvjbp</link>
                <description>بخش اول: Time for Profilingاولین ابزار پر کاربرد Time Profiler هست، که برای اندازی گیری مدت زمان اجرای بخش های مختلف در هر thread استفاده می شود. همچنین امکان pause یا مکث در بین اجرای بخش های مختلف را هم محقق می سازد. نمونه ای از Time Profilerتصویر بالا نمونه ای از Call Tree می باشد. Call Tree زمان اجرای متد های مهم اپ را نمایش میدهد. هر ردیف، متدهای مختلف را نشان میدهد. زمان صرف شده برای هر متد را می توان از تعداد دفعاتی که Profiler متوقف می شود (به ازای هر متد) محاسبه کرد. برای مثال اگر 100 متد در فواصل زمانی 1 میلی ثانیه اجرا شده باشد و یک متد خاص 10 میلی ثانیه برای اجرای عملیات هزینه کرده باشد، در واقع 10% از کل هزینه مربوط به آن متد خواهد بود. به عبارت دیگر در هر ردیف از ستون سمت چپ، درصدی از زمان هزینه شده نوشته شده است، پس از آنکه وارد زیر شاخه ی آن می شوید، جزئیات هزینه ی زمانی هر متد به تفکیک قابل مشاهده خواهد بود. نکته: باید توجه داشته باشید، برای انجام این کار از دیوایس واقعی استفاده کنید. زیرا شبیه ساز از کل منابع mac استفاده میکند در حالیکه منابع موبایل واقعی محدودتر می باشد. برای تست اپلیکیشن خودتان، میتوانید در منوی اصلی XCode  به مسیر Product\Profile بروید. اگر دیوایس واقعی متصل نباشد، این گزینه غیرفعال خواهد بود.پس از انتخاب Profiler یا فشردن I+⌘، پنجره ای شبیه به تصویر بالا باز خواهد شد. گزینه ی Time Profiler را انتخاب کنید. پنجره ی بعدی به عنوان یه سند که قابل ذخیره سازی است، باز خواهد شد. با زدن دکمه ضبط یا record برنامه بر روی دیوایس متصل به سیستم اجرا خواهد شد.ادامه  دارد ...منبع: https://www.raywenderlich.com/397-instruments-tutorial-with-swift-getting-started#toc-anchor-002با کمی تغییرات جزئی</description>
                <category>محمد جواد فخار</category>
                <author>محمد جواد فخار</author>
                <pubDate>Sun, 07 Jun 2020 15:49:31 +0430</pubDate>
            </item>
                    <item>
                <title>پیاده سازی Feature toggle در سوئیفت</title>
                <link>https://virgool.io/@mjfakhar/%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-feature-toggle-%D8%AF%D8%B1-%D8%B3%D9%88%D8%A6%DB%8C%D9%81%D8%AA-uzb5bc9dnbn0</link>
                <description>اگر تصمیم دارید از Feature toggle در پروژه های ios خود استفاده کنید، حتما این مقاله رو بخونید. چند وقت پیش تصمیم گرفته شد که از این امکان در پروژه استفاده بشه. امروز فرصت کردم تا بررسی کنم و سایت هایی رو بخونم. گفتم نتیجه اشو برای شما بنویسم. نتیجه ای که قطعا در اجرای شما تاثیر خواهد داشت. وقتی میخواهید شروع کنید به پیاده سازی، باید به این فکر کنید که بهترین روش برای توسعه یک امکان جدید چیه؟ در این موارد یک مثال ساده بهترین راه برای رسید به بهترین روش هست. در گیف زیر تکه کدی از یک کلاس رو دیدم که خیلی گویا هست. در تصویر بالا جابجایی بین دو اکشن مختلف، با true یا false بودن یک مقدار صورت میگیره. با بررسی این مثال ساده میتونید مشکلات پیاده سازی استخراج کنیم. اول اینکه استفاده از if-else در فایل ها و کلاس های مختلف باعث میشه فهم و خوانایی کد پایین بیاد.دوم اینکه اگر فرض کنیم شرط Toggles.Vehicle.carsCanFly در بیش از یک فایل و کلاس استفاده بشه، چون Feature toggle باید به راحتی از سورس حذف بشه بدون اینکه به سایر بخش لطمه ای بزنه، پس بایستی به گونه ای طراحی و پیاده سازی بشه که این نوع مشکلات رو ایجاد نکنه.یکی از راه هایی که میتونه دو نکته ی بالا رو حل کنه استفاده از پروتکل (POP) برای پیاده سازی  Feature toggle هست. به تکه کد زیر توجه کنید: protocol CarFleetFeatureToggleLogic {    var fuelToUse: Fuel { get }    func transport(car: Car, to position: Position)}extension CarFleetFeatureToggleLogic where Self: CarFleet {    /**    Get the fuel to be used on cars.    - Toggle Options:        - Toggle on: return fuel type for rockets.        - Toggle off: return fuel type for cars.    */    var fuelToUse: Fuel {        switch Toggles.Vehicle.carsCanFly.enabled {        case true  : Fuel.rocket        case false : Fuel.car        }    }    /**    Transport cars to their destination.    - Toggle Options:        - Toggle on: Fly cars to destination.        - Toggle off: Drive cars to destination.    */    func transport(car: Car, to position: Position) {        switch Toggles.Vehicle.carsCanFly.enabled {        case true  : fly(to: location)        case false : drive(to: location)        }    }}به اکستنشن بخش دوم کد بالا دقت کنید. هر وقت از اکستنشنی به صورت where Self: x استفاده می کنید، یعنی برای کلاس x به صورت پیش فرض توسعه یا پیاده سازی انجام شده است. اصلاح شده ی مثال اول به صورت کد زیر پیاده سازی می شود: class CarFleet{//init class}extension CarFleet: CarFleetFeatureToggleLogic {    func moveCarsToPosition(cars: [Car], position: Position) {        cars.forEach({ transport(car: $0, to: position) })    }    func refuel(cars: [Car]) {        cars.forEach({ refuel(car: $0, using: fuelToUse) })    }    func refuel(car: Car, using: Fuel) {    }}برای حذف این Feature toggle کافیه این extension و پروتکل را از پروژه حذف کنید.نتیجه گیریبرای استفاده از این امکان حتما به قابلیت حذفش در کمترین زمان از کدتون هم فکر کنید. چون پیاده سازی اگر درست نباشه تبدیل به یک معضل جدی میشه. از دوستان تقاضا دارم اگر تجربیاتی در این خصوص دارن حتما کامنت بذارن و به همه منتقل کنند. </description>
                <category>محمد جواد فخار</category>
                <author>محمد جواد فخار</author>
                <pubDate>Tue, 02 Jun 2020 15:20:04 +0430</pubDate>
            </item>
                    <item>
                <title>پروتکل در سوئیفت</title>
                <link>https://virgool.io/@mjfakhar/protocolinswift-azh9hfagwyiv</link>
                <description>کار با پروتکل ها یه ویژگی بارز برای سوئیفت محسوب میشه. قواعد رو با پروتکل تعریف میکنید و اپ تون رو خیلی انعطاف پذیر و حرفه ای طراحی میکنید در این مقاله شما نحوه استفاده از پروتکل و مزایای اون رو یاد میگیرید.پروتکل چیه؟با چند تا سوال سعی میکنم پروتکل رو توضیح بدم. انسان ها غذا میخورن؟ جوابتون حتما مثبت هست و گرنه فرصتی پیدا نمیکنن که بخوان این مقاله رو بخونن. یه سوال دیگه! آیا غذا خوردن آدم ها شبیه آب خوردن شون هست؟ شاید فکر کنید این سوالهای بی ربط چیه!!! ولی بی ربط نیست. قطعا جواب تون مثبت هست که با هم متفاوت هست.مزایای پروتکل چیه؟حالا یه مثال برنامه نویسی میزنم. ازتون میخوام یه کلاس که معرف انسان باشه رو تعریف کنید. حالا عملیات غذا خوردن رو به صورت یه تابع تعریف کنید. سوالم رو یه جور دیگه تکرار میکنم. انسان فقط غذا میخوره؟ پس باید یه تابع دیگه بنویسید که آب خوردن آدم رو هم پیاده سازی کرده باشه. پس با این حساب باید برای همه ی مواد غذایی مختلف یه تابع توی این کلاس نوشته بشه!!! واقعا این کد نویسی افتضاحه!اینجا پروتکل در سوئیفت بهتون کمک میکنه که شما عملیات خوردن رو تعریف کنید و در مورد مواد غذایی مختلف فقط نوع خوردن رو تعریف کنید. مثال میزنم: شما میخواهید یه شی از کلاس انسان درست کنید که عملیات غذا خوردن رو انجام میده پس باید یه کلاس برای غذا درست کنید و نوع خوردن غذا رو توش تعریف کنید.برای دیدن مثال های عملیاتی به لینک مقاله سر بزنید </description>
                <category>محمد جواد فخار</category>
                <author>محمد جواد فخار</author>
                <pubDate>Sun, 03 Nov 2019 23:13:28 +0330</pubDate>
            </item>
            </channel>
</rss>