<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات من توسعه‌دهنده‌ام</title>
        <link>https://virgool.io/Iamdeveloper/feed</link>
        <description>تجربه های برنامه نویسی و توسعه دهندگی من</description>
        <language>fa</language>
        <pubDate>2026-06-16 16:48:16</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/w9wlmriaxvyn/9nbkmj.jpg</url>
            <title>من توسعه‌دهنده‌ام</title>
            <link>https://virgool.io/Iamdeveloper</link>
        </image>

                    <item>
                <title>راهنمای توسعه‌دهندگان موبایل به سمت کهکشان: فصل هشتم</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D9%81%D8%B5%D9%84-%D9%87%D8%B4%D8%AA%D9%85-preifxdrirv8</link>
                <description>فصل هفتم را از این جا بخوانید.فصل هشتم: امنیت و حریم خصوصی (Security &amp; Privacy)نویسنده: دین چرچیل (Dean Churchill)کهکشان اپلیکیشن‌های موبایل، فراتر از مجموعه‌های (constellations) iOS، اندروید و چند پلتفرم گوشی هوشمند دیگر گسترش یافته است. اپلیکیشن‌ها بر روی مجموعه‌ای از دستگاه‌ها، که پیوسته در حال افزایش هستند، در حال توسعه و استقرار می‌باشند: کنسول‌های بازی، پلتفرم‌های تلویزیون، واقعیت مجازی/افزوده (virtual/augmented reality)، پهپادها (drones)، دستگاه‌های پوشیدنی (wearables)، دستگاه‌های آینه‌سازی صفحه نمایش (screen mirroring devices)، و صفحه‌های نمایش سرگرمی در خودرو (in-car infotainment screens). این اپلیکیشن‌ها به سرویس‌های ابری (cloud services) متصل شده و دستگاه‌های اینترنت اشیا (IoT devices) را مدیریت کرده و با آن‌ها تعامل دارند. فضای اپلیکیشن‌ها از بی‌ضررترین اپلیکیشن‌های چراغ قوه تا اپلیکیشن‌های حیاتی برای نظارت بر مکان، ایمنی و سلامت افراد مبتلا به بیماری‌های مزمن را شامل می‌شود. فراتر از کسب‌وکار، امور مالی و شبکه‌های اجتماعی، اپلیکیشن‌های موبایل سیستم‌های امنیتی و نظارتی خانه را کنترل می‌کنند، پهپادها را به پرواز درمی‌آورند و ابزارهای صنعتی را اجرا می‌کنند. با افزایش زنجیره ارزش اپلیکیشن‌های موبایل، تلاش‌های بی‌وقفه هکرها برای به خطر انداختن این سیستم‌های نرم‌افزاری به منظور سرقت پول، برهم زدن انتخابات، جاسوسی از رقبا، تعقیب، ارتکاب کلاهبرداری، و از کار انداختن یا به دست گرفتن شبکه‌ها نیز افزایش می‌یابد. همزمان، تنظیم‌کنندگان در سراسر جهان در حال تدوین قوانین جدیدی در مورد حفظ حریم خصوصی داده‌ها هستند که برد وسیعی دارند. این یک درام تعقیب دوگانه است: شما در خطر تعقیب هم توسط افراد بد و هم افراد خوب قرار دارید. مجرمان می‌خواهند داده‌های شما را بدزدند یا باج‌گیری کنند، در حالی که تنظیم‌کنندگان در صورت عدم امنیت و محافظت از داده‌های مشتریان، شما را جریمه خواهند کرد. بنابراین، اکنون بیش از هر زمان دیگری، باید بر طراحی راه‌حل‌های امن سرتاسری (end-to-end solutions) با استفاده از اپلیکیشن موبایل خود به عنوان یک نقطه پایانی (end point) و ارائه حفاظت از حریم خصوصی برای داده‌هایی که اپلیکیشن استفاده می‌کند، تمرکز کنید. این امر مستلزم در نظر گرفتن اپلیکیشن موبایل در زمینه خدمات ابری و بک‌اند (backend services) و دانستن محل و نحوه ذخیره داده‌های شما است.این راهنمای بسیار مختصر در مورد امنیت و حریم خصوصی به چند رویکرد برای مدل‌سازی تهدید (threat modeling)، مسائل کلیدی در مقررات حفظ حریم خصوصی (privacy regulations) و یک رویکرد برای آزمایش امنیت (security testing) می‌پردازد. در حالی که وظیفه ایمن‌سازی یک اپلیکیشن ممکن است دلهره‌آور به نظر برسد، اکثر حملات به اپلیکیشن‌ها، چه اپلیکیشن‌های وب، دسکتاپ یا موبایل، می‌توانند با تکنیک‌های ساده کدنویسی امن (secure-coding techniques) و آزمایش امنیتی اولیه (basic security testing) دفع شوند.مدل‌سازی تهدید (Threat Modeling)نقطه شروع برای طراحی‌های امن فناوری اطلاعات (IT designs) ایجاد یک مدل تهدید است. یک مدل تهدید با فهرست کردن تمام دارایی‌های (assets) مورد نگرانی محصول شما آغاز می‌شود. دارایی‌ها شامل تمام اجزای نرم‌افزاری (software components)، سخت‌افزار (hardware)، شمای داده (data schemas) و انباره‌های داده (data stores)، رابط‌های برنامه‌نویسی کاربردی (APIs)، میکروسرویس‌ها (microservices)، رابط‌ها (interfaces) و کانال‌های ارتباطی (communication channels) مورد نیاز برای عملکرد محصول شما هستند. سپس برای هر یک از این دارایی‌ها یک مدل تهدید ایجاد کنید. مدل‌های تهدید متعددی برای کمک به تحلیل وجود دارد.لیست «۱۰ مورد برتر موبایل OWASP» (OWASP Mobile Top 10)» تهدیدات غالب را برای پلتفرم‌های موبایل شناسایی کرده است: استفاده نادرست از پلتفرم (improper platform usage)، ذخیره‌سازی ناامن داده‌ها (insecure data storage)، ارتباطات ناامن (insecure communications)، احراز هویت ناامن (insecure authentication)، رمزنگاری ناکافی (insufficient cryptography)، مجوزدهی ناامن (insecure authorization)، کیفیت کد مشتری (client code quality)، دستکاری کد (code tampering)، مهندسی معکوس (reverse engineering) و عملکرد اضافی (extraneous functionality). OWASP مواد تکمیلی گسترده‌ای در مورد ماهیت تهدیدات، نحوه کدنویسی امن در برابر آن‌ها و آزمایش اپلیکیشن‌ها ارائه می‌دهد.«اتحادیه امنیت ابری» (Cloud Security Alliance (CSA)) بر تهدیدات مربوط به سرویس‌های ابری متمرکز است و آموزش و ابزارهایی را برای ارزیابی تهدیدات مربوط به رایانش ابری (cloud computing) ارائه می‌دهد. CSA یک «ماتریس کنترل‌های ابری» (Cloud Controls Matrix) رایگان ارائه می‌دهد که به ارزیابی خطرات یک ارائه‌دهنده ابری کمک می‌کند.مدل امنیتی «استراید» (STRIDE security model) توجه را بر طراحی نرم‌افزار متمرکز می‌کند تا در برابر تهدیدات خاص «جعل هویت» (Spoofing)، «دستکاری» (Tampering)، «انکار» (Repudiation)، «افشای اطلاعات» (Information disclosure)، «محرومیت از سرویس» (Denial of service) و «افزایش سطح دسترسی» (Escalation of privilege) محافظت کند. این مدل به همان اندازه برای نرم‌افزارهای سمت سرور (server-side software) و همچنین کلاینت‌های موبایل (mobile clients) کاربرد دارد.کنترل‌های امنیتی (Security controls) آن دسته از نرم‌افزارهایی هستند که نوشته شده‌اند و رویه‌هایی هستند که برای کاهش خطرات برای همه دارایی‌ها رعایت می‌شوند. به عنوان مثال، هر یک از تهدیدات برشمرده شده در مدل STRIDE می‌تواند با یک یا چند عنصر طراحی اپلیکیشن شما مقابله شود.جعل هویت (Spoofing)حملات جعل هویت دو نوع اساسی دارند. هویت یک کاربر ممکن است توسط یک هکر جعل شود، با وانمود کردن به اینکه او کسی است که نیست. اینجاست که احراز هویت قوی (strong authentication) برای اطمینان از اینکه کاربران اپلیکیشن شما همان کسی هستند که ادعا می‌کنند، وارد عمل می‌شود. کاربران ممکن است قربانی سرویس‌های جعلی نیز شوند. حمله کلاسیک فیشینگ (phishing attack) زمانی است که شما یک پیام جعلی (SMS، ایمیل، تماس صوتی) دریافت می‌کنید که از شما می‌خواهد وارد حساب بانکی خود در URL داده شده شوید. اغلب پیام حس فوریت را القا می‌کند. اما URL برای بانک مورد انتظار شما نیست، بلکه یک لینک به وب‌سایتی است که دقیقاً شبیه بانک به نظر می‌رسد. هکرها امیدوارند کسی نام کاربری و رمز عبور خود را در آنجا وارد کند، سپس آنها می‌توانند از آن اعتبارها (credentials) برای ورود به بانک واقعی و انتقال پول استفاده کنند.در حالی که نمی‌توانید هکرها را از ارسال پیام‌های جعلی به مشتریان خود بازدارید، می‌توانید سیاستی مبنی بر عدم تماس با مشتریان برای درخواست ورود به سیستم داشته باشید. به مشتریان خود بگویید که هرگز برای درخواست رمز عبور آنها با آنها تماس نخواهید گرفت یا ایمیل‌های ناخواسته حاوی URL به دامنه وب شما ارسال نخواهید کرد. در عوض، می‌توانید از آنها بخواهید اپلیکیشن موبایل شما را از یک فروشگاه اپلیکیشن عمومی (public app store) دانلود کنند و از طریق اپلیکیشن وارد سرویس شما شوند. این فرآیند جعل کردن را دشوارتر می‌کند، تا زمانی که هیچ اپلیکیشن مخربی در فروشگاه اپلیکیشن وجود نداشته باشد که شبیه اپلیکیشن شما باشد. برای این منظور، باید مراقب فروشگاه‌های اپلیکیشن باشید و مطمئن شوید که نام شرکت و مالکیت معنوی (intellectual property) شما توسط هیچ اپلیکیشنی که مجاز نکرده‌اید، استفاده نمی‌شود.دستکاری (Tampering)حملات دستکاری ممکن است علیه نرم‌افزار، داده‌ها، پایگاه‌های داده، فایل‌ها و شبکه‌های ارتباطی (communications networks) هدایت شوند. دستکاری بسته‌های نرم‌افزاری (software packages) با امضای دیجیتالی بسته‌ها (مانند فایل‌های IPA iOS و APK اندروید) جلوگیری می‌شود. اما پس از نصب بر روی دستگاه‌های موبایل، هکرها با گوشی‌های روت‌شده/جیل‌بریک‌شده (rooted/jailbroken phones) می‌توانند نرم‌افزار و داده‌ها را به دلخواه دستکاری کنند. آنها می‌توانند کتابخانه‌ها (libraries) را با کتابخانه‌های هک‌شده جایگزین کنند، محتویات حافظه را در زمان اجرا (run time) تغییر دهند، باینری (binary) را پچ (patch) کنند و به طرق دیگر اپلیکیشن را به نفع خود منحرف کنند.از این رو، طراحی شما نباید به دستگاه کاربر اعتماد کند. اقدامات متقابل شامل موارد زیر است: اسرار (رمز عبور، کلیدهای API، داده‌های حساس) را در فایل‌های IPA یا APK خود ذخیره نکنید، زیرا هکرها دسترسی کامل به تمام اطلاعات موجود در آن‌ها دارند. فایل Android Manifest در APKها و فایل Info.plist در فایل‌های IPA را بررسی کنید تا مطمئن شوید هیچ اسراری در آن‌ها وجود ندارد. به طور کلی، هر نوع محاسبات حساس، مانند شناسایی کاربر، احراز هویت و مجوزدهی، یا یک الگوریتم اختصاصی (proprietary algorithm)، باید در سمت سرور (server-side) انجام شود تا این توابع از دید هکرها دور بمانند. داده‌های حساس در صورت امکان نباید در دستگاه موبایل ذخیره شوند، در غیر این صورت از یک مکانیسم ذخیره‌سازی رمزگذاری‌شده (encrypted storage mechanism) مانند «کلیدشین» (keychain) موجود برای iOS و اندروید استفاده کنید. دستکاری داده‌ها در حافظه (storage) می‌تواند با استفاده از هش‌های رمزنگاری امن (secure cryptographic hashes) و امضاهای دیجیتالی (digital signatures) شناسایی شود.بسیاری از اپلیکیشن‌های موبایل از پایگاه داده‌ای (database) استفاده می‌کنند که روی دستگاه اجرا می‌شود و توسط اپلیکیشن راه‌اندازی شده است. هکرها نه تنها می‌توانند محتویات این پایگاه‌های داده را مشاهده کنند، بلکه می‌توانند داده‌ها و شمای (schema) آن را نیز برای اهداف خود تغییر دهند. بنابراین، داده‌های حساس را در پایگاه داده روی دستگاه ذخیره نکنید. کلاینت موبایل (mobile client) باید اعتبارسنجی کند که فیلدها و ردیف‌های داده‌های بازیابی شده از هر پایگاه داده (سمت کلاینت یا سمت سرور) با نوع، اندازه، کمیت و محدوده مقادیر مورد انتظار مطابقت دارند.دستکاری شبکه‌ها (networks) که از طریق حملات مرد میانی (man-in-the-middle attacks) مورد سوء استفاده قرار می‌گیرد، با استفاده از HTTPS، پین کردن گواهی (certificate pinning)، رمزگذاری سرتاسری (end-to-end encryption) و استفاده از VPNها قابل پیشگیری است. از گواهی‌های خودامضا (self-signed certificates) در اپلیکیشن‌های خود استفاده نکنید، مگر شاید در محیط توسعه.انکار (Repudiation)با «ورود به سیستم امن» (secure logging) شناسایی کاربر و اقدامات کاربران مقابله می‌شود، که به نوبه خود نیازمند توابع شناسایی کاربر، احراز هویت و مجوزدهی قوی (solid user identification, authentication and authorization functions) است. استفاده از احراز هویت دو عاملی (2-factor authentication) به طور فزاینده‌ای رایج شده است و این به کنترل دسترسی به اپلیکیشن‌ها کمک می‌کند. بسیاری از اپلیکیشن‌ها و سرویس‌ها از دستگاه موبایل به عنوان عامل دوم برای احراز هویت استفاده می‌کنند. سرویس یک پیام SMS به تلفن ارسال می‌کند که به عنوان مثال، یک توکن ۶ رقمی یک بار مصرف (one-time 6-digit token) را شامل می‌شود و کاربر آن توکن را در اپلیکیشن وارد می‌کند تا هویت کاربر را تأیید کند. اما در فضای اپلیکیشن‌های موبایل، اگر تلفن شما به سرقت رفته باشد و هکر رمز عبور شما را برای ورود به یک اپلیکیشن موبایل بداند، ارسال یک پیام SMS به تلفن سرقت شده هیچ محافظت اضافی ارائه نمی‌دهد. و البته، هکرهای مهندسی اجتماعی (social engineering hackers) نیز روی این عامل دوم تمرکز دارند.افشای اطلاعات (Information Disclosure)افشای اطلاعات مربوط به داده‌ها با رمزگذاری در حین انتقال (in transit) و در حافظه (in storage) مقابله می‌شود. اطمینان حاصل کنید که از استانداردهای رمزگذاری فعلی و صنعتی (current, industry-standard encryption standards) استفاده می‌کنید. تمام دستگاه‌های موبایل فعلی از رمزگذاری با AES و با اندازه‌های کلید ۱۲۸ و ۲۵۶ بیت پشتیبانی می‌کنند. اما سپس کلیدهای رمزگذاری باید به دقت محافظت شوند، زیرا یک کلید افشا شده به هکرها اجازه می‌دهد تا داده‌ها را رمزگشایی کنند.سیستم عامل iOS یک key store برای محافظت از داده‌های حساس دارد. اندروید دارای «API زنجیره‌ی کلید» (Keychain API) است. این کلیدخانه‌ها داده‌ها را به صورت رمزگذاری شده روی دستگاه ذخیره می‌کنند و حتی با دسترسی روت (root access) به دستگاه، سرقت آن اطلاعات را برای هکرها دشوار می‌سازند.خود نرم‌افزار به راحتی از یک اپلیکیشن موبایل افشا می‌شود. به ویژه اپلیکیشن‌های اندروید که در کاتلین (Kotlin) یا جاوا (Java) نوشته شده‌اند، به راحتی مهندسی معکوس می‌شوند تا کد منبع (source code) زیربنایی خود را آشکار کنند. ابزارهای مبهم‌سازی کد (Code obfuscation tools) را می‌توان برای دشوارتر کردن رمزگشایی کد استفاده کرد.محرومیت از سرویس (Denial of Service)حملات «محرومیت از سرویس» معمولاً در سمت سرور (server-side) مشاهده می‌شوند. «بات‌نت‌ها» (Botnets) یک مشکل مداوم هستند، زیرا به سرورها حمله می‌کنند و دسترسی اپلیکیشن‌های موبایل قانونی (legitimate mobile apps) را سلب می‌کنند. یکی از استراتژی‌ها برای کاهش خطر حملات «محرومیت از سرویس» استفاده از یک سرویس ابری تجاری (commercial cloud service) است. همه سرویس‌های ابری دارای محافظت در برابر «محرومیت از سرویس» هستند که در زیرساخت آن‌ها تعبیه شده است، بنابراین می‌توانید بیشتر بر روی عملکرد تجاری اپلیکیشن‌های خود تمرکز کنید.افزایش سطح دسترسی (Escalation of Privilege)«افزایش سطح دسترسی» ممکن است در زمینه مدل اتفاق بیفتد که در آن ترافیک شبکه ممکن است هک شود و سطح دسترسی یک کاربر ممکن است افزایش یابد تا به داده‌هایی دسترسی پیدا کند که کاربر نباید آن‌ها را ببیند. این بیشتر یک هک API است تا یک هک اپلیکیشن موبایل به معنای واقعی کلمه. اما خطر همچنان وجود دارد. شما با داشتن نقش‌های (roles) با تعریف خوب که توسط کنترل‌های دسترسی (access controls) اعمال می‌شوند، با خطر «افزایش سطح دسترسی» مقابله می‌کنید: حداقل کردن امتیازات (Minimize privileges) - هرچه نقش‌ها و امتیازات کمتر باشد، اپلیکیشن «سطح حمله» (attack surface) کمتری دارد.برخی از اپلیکیشن‌های موبایل چیزی بیش از یک آیکون (icon) نیستند که یک وب‌سایت را راه‌اندازی می‌کنند. اگر راه‌حل شما از خدمات وب (web services) و وب‌سایت‌ها استفاده می‌کند، آنگاه «۱۰ مورد برتر برنامه وب OWASP» یک لیست استاندارد از مسائل کلیدی است که باید نگران آن‌ها باشید.آزمایش امنیتهنگامی که اپلیکیشن خود را ساختید و تمام آزمایش‌های عملکردی (functional testing) ممکن را انجام دادید، زمان آن فرا رسیده است که یک آزمایش امنیتی (security test) انجام دهید. در حوزه اپلیکیشن‌های موبایل، می‌توانید فایل باینری (IPA یا APK) را به یک تیم آزمایش امنیتی جداگانه تحویل دهید یا خودتان آزمایش را انجام دهید. در اینجا یک چک‌لیست از آزمایش‌های امنیتی که می‌توانید اپلیکیشن خود را در برابر آن‌ها اجرا کنید، آورده شده است. این چک‌لیست به هیچ وجه جامع نیست، اما به شما ایده‌ای از دامنه مسائلی می‌دهد که باید پس از ساخت یک اپلیکیشن و آماده شدن برای آزمایش امنیت آن، بررسی کنید:شناسایی (Identification) - آیا اپلیکیشن شما کاربر اپلیکیشن را به درستی شناسایی می‌کند؟  برخی از اپلیکیشن‌ها، مانند اپلیکیشن چراغ قوه، برای استفاده توسط کاربران ناشناس (anonymous users) طراحی شده‌اند؛  در حالی که برخی دیگر، مانند اپلیکیشن‌های بانکی، نیاز به شناسایی منحصر به فرد هر کاربر دارند.احراز هویت (Authentication) - اگر کاربر نیاز به شناسایی دارد، آیا روش امنی برای احراز هویت دارید تا ثابت کنید کاربر همان کسی است که ادعا می‌کند؟  اطمینان حاصل کنید که هکرها نمی‌توانند فرآیند احراز هویت را دور بزنند. احراز هویت باید در سمت سرور (server-side) انجام شود - در ابر (cloud)، در یک مرکز داده (datacenter)، هر جایی به جز خود دستگاه موبایل، زیرا دستگاه موبایل قابل اعتماد نیست. استفاده از احراز هویت دو عاملی (2-factor authentication) را در نظر بگیرید. ما مدت‌هاست از دوره‌ای که سیستم‌ها می‌توانستند فقط با یک رمز عبور به طور قابل اعتماد ایمن شوند، گذشته‌ایم. هر کسی که در مکان عمومی وارد اپلیکیشن می‌شود، در معرض خطر حمله «شانه به شانه» (shoulder-surf attack) است - جایی که شخصی از شما در حال وارد کردن رمز عبور در اپلیکیشن فیلم می‌گیرد. و حملات فیشینگ (phishing attacks) همچنان در حال افزایش هستند - ایمیل‌ها، پیامک‌ها، سایر پیام‌ها که به شما می‌گویند روی این لینک کلیک کنید و وارد حساب بانکی خود شوید قبل از اینکه بسته شود یا دسیسه دیگری که به احساسات، فوریت یا تهدیدات متوسل می‌شود تا شما را وادار کند با رمز عبور و شناسه معتبر خود وارد یک سرویس جعلی شوید. احراز هویت عامل دوم (second-factor authentication) دسترسی هکرها به حساب‌های شما را تنها با یک رمز عبور سرقت شده دشوارتر می‌کند. اما اگر آن عامل دوم فقط یک پیامک به تلفن سرقت شده شما باشد، هیچ محافظت اضافی وجود ندارد.مجوزدهی (Authorization) - هنگامی که کاربر به درستی شناسایی و احراز هویت شد، آیا او مجوز استفاده از هر سرویسی که شما ارائه می‌دهید را دارد؟  اگر یک سرویس پولی است، باید آزمایش کنید که هکرها نمی‌توانند راهی برای استفاده رایگان از سرویس شما پیدا کنند. توابع مجوزدهی نیز باید در سمت سرور اجرا شوند.پاسخگویی (Accountability) - اگر کاربران بدین ترتیب شناسایی، احراز هویت و مجوزدهی شدند، آیا اپلیکیشن تراکنش‌های مهم (import transactions) را ثبت می‌کند تا هیچ حمله انکار (repudiation attacks) رخ ندهد؟  شما به اندازه کافی اطلاعات ثبت (log information) نیاز دارید، بدون به خطر انداختن حریم خصوصی کاربران، تا اگر یک بازرس دولتی برای دریافت اطلاعات در مورد اینکه چه کسی، چه زمانی و برای چه هدفی از اپلیکیشن شما استفاده کرده است، آمد، بتوانید به او بگویید. و اگر کاربر آمد و درخواست &quot;مرا فراموش کن&quot; (forget me) را داد، می‌توانید تمام داده‌های جمع آوری شده مربوط به آن کاربر را حسابرسی کرده و آن داده‌ها را به طور ایمن حذف کنید.کد اپلیکیشن و امنیت وب (App code and web security) - آیا اپلیکیشن در برابر حملات تزریق (injection attacks) از هر نوع مقاومت می‌کند؟  با پاکسازی ورودی از دامنه‌های نامعتبر (untrusted domains) (در اینجا به مدل تهدید خود مراجعه کنید) در برابر حملات تزریق محافظت کنید. تمام ورودی‌ها را از نظر اندازه، نوع، محدوده مقادیر و مقدار داده‌های مورد انتظار بررسی کنید. آنالیزورهای کد ایستا امن (secure static code analyzers) را برای یافتن مسائل امنیتی ظریف در کد خود اجرا کنید و آنها را برطرف کنید. دو فروشنده پیشرو برای اسکن کد منبع ایستا امن (secure static source code scanning) «چک‌مارکس» (Checkmarx) و «میکروفوکوس فورتیفای» (Microfocus Fortify) هستند. آیا جلسات (sessions) امن هستند، به طوری که APIها بدون احراز هویت مناسب قابل سوءاستفاده نباشند؟  ممکن است لازم باشد از یک ابزار تست نفوذ وب (web pen test tool)، مانند «HCL اپ‌اسکنز» (HCL Appscans) یا نرم‌افزار منبع باز «فورتیفای وب‌اینسپکت» (Fortify WebInspect) استفاده کنید تا مطمئن شوید خدمات بک‌اند شما امن هستند. از ابزارهای مبهم‌سازی کد (code obfuscation tools)، مانند «پروگارد» (ProGuard) برای دشوارتر کردن تحلیل اپلیکیشن خود استفاده کنید.امنیت بسته‌بندی (Packaging security) - مطمئن شوید که هیچ اطلاعات حساسی، مانند اطلاعات محیط آزمایش، رمز عبور، مستندات توسعه‌دهنده (developer documentation) را در بسته اپلیکیشن (app package) قرار نداده‌اید. اگر از کتابخانه‌های شخص ثالث (third party libraries) استفاده می‌کنید، بررسی کنید که از جدیدترین، پچ شده‌ترین و قابل اعتمادترین نسخه‌های آن بسته‌ها استفاده می‌کنید.امنیت داده (Data security) - اگر داده‌ای را به صورت محلی در دستگاه ذخیره می‌کنید، بدانید که توسط کسی با گوشی روت‌شده یا جیل‌بریک‌شده قابل مشاهده یا تغییر است. حتی اگر رمزگذاری شده باشد، اگر کلید رمزگذاری (encryption key) در دستگاه ذخیره شود، هکر را قادر می‌سازد تا آن اطلاعات را سرقت کند. بنابراین، بررسی کنید که هیچ اطلاعات حساسی را در پایگاه‌های داده یا فایل‌ها روی دستگاه ذخیره نکرده‌اید.امنیت حمل و نقل (Transport security) - هنگام اجرای اپلیکیشن، از «وایرشارک» (Wireshark)  (wireshark.org) یا یک ابزار پروکسی وب (web proxy tool)، مانند «پاروس» (Paros)  (sourceforge.net/projects/paros) یا «چارلز پروکسی» (Charles Proxy)  (charlesproxy.com)، برای ضبط ترافیک ورودی و خروجی اپلیکیشن استفاده کنید تا مطمئن شوید تمام اطلاعات حساس به صورت رمزگذاری شده و فقط به سرورهای مورد انتظار منتقل می‌شوند. حتی اطلاعات غیرحساس نیز باید رمزگذاری شوند تا یکپارچگی داده‌ها (integrity of the data) تضمین شود، مبادا هکر محتوای مخرب را به ترافیک شبکه تزریق کند. اگر می‌توانید، از هیچ پروتکل TLS (Transport Layer Security) قدیمی‌تر از TLS 1.2 پشتیبانی نکنید. پروتکل TLS 1.3  (ietf.org/blog/tls13) در آگوست ۲۰۱۸ توسط IETF به عنوان یک استاندارد تأیید شد که امنیت و عملکرد TLS 1.2 را بهبود می‌بخشد. «تست سرور SSL کوالیسیس» (Qualsys SSL Server Test) یک سرویس آنلاین رایگان است که تست امنیتی گواهی TLS را برای هر نام دامنه عمومی (public domain name) در اینترنت انجام می‌دهد. این سرویس اطمینان حاصل می‌کند که گواهی TLS منقضی نشده باشد، دارای یک زنجیره گواهی معتبر (trusted certificate chain) باشد، اکسپلویت‌های (exploits) امنیتی شناخته شده را علامت‌گذاری و شناسایی می‌کند، نشان می‌دهد کدام مجموعه‌های رمزنگاری (cipher suites) امن و کدام ضعیف هستند، و نام دامنه را با نام رایج (common name) روی گواهی مقایسه می‌کند. از این برای تست تمام دامنه‌های HTTPS که اپلیکیشن شما از آنها استفاده می‌کند، به ویژه آنهایی که مربوط به بسته‌های نرم‌افزاری شخص ثالث (3rd-party software packages) هستند - مانند سرویس‌های تبلیغات، معیارهای سنجش (metrics)، رسانه‌های اجتماعی، نقشه‌ها و غیره استفاده کنید. در اپلیکیشن‌های iOS، از تنظیمات «امنیت حمل و نقل اپ» (App Transport Security settings) برای اجبار استفاده از HTTPS در صورت امکان استفاده کنید.امنیت پروتکل (Protocol security) – مطمئن شوید که پروتکل‌های ورود و خروج (login and logout protocols) به درستی کار می‌کنند و قابل دور زدن نیستند. توابع خروج (Logout functions) باید تراکنش‌ها را به سرور ارسال کنند تا هرگونه جلسه امن (secure sessions) را ببندند – فقط به صفحه ورود به سیستم اپلیکیشن برنگردید. بررسی کنید که توابع بازنشانی رمز عبور (password reset functions) به راحتی قابل جعل نباشند. یک سیاست رمز عبور (password policy) تعیین کنید که رمز عبورهای پیچیده را الزامی کند.حریم خصوصی (Privacy) – مطمئن شوید که می‌دانید چه داده‌هایی در مورد کاربران شما جمع‌آوری می‌شود. آن داده‌ها را برای کاهش ریسک به حداقل برسانید. آیا به کاربر اطلاع‌رسانی حریم خصوصی (privacy notice) ارائه می‌دهید؟  آیا قابلیت‌های &quot;مرا فراموش کن&quot; (forget me) را برای برآورده کردن الزامات حریم خصوصی GDPR (مقررات عمومی حفاظت از داده‌ها) در آن تعبیه کرده‌اید؟برآوردن الزامات حریم خصوصیاکثر موارد بالا بر قفل کردن اپلیکیشن شما متمرکز هستند، به طوری که اطلاعات از طریق نظارت غیرفعال (passive surveillance) یا نفوذ فعال (active intrusion) به بیرون درز نکند. اما مقررات حریم خصوصی فعلی، مانند GDPR، نیازمند قابلیت &quot;فراموش شدن&quot; (to be forgotten) است، یعنی حذف ایمن داده‌های کاربر در سیستم، تضمین حق کاربر برای دسترسی به داده‌های خود، و اطلاع رسانی سریع در مورد نقض (breach). و همه اینها باید &quot;غیرقابل نفوذ&quot; (watertight) باشند. اکثر محصولات برای جمع‌آوری اطلاعات طراحی شده‌اند و معمولاً راهی ایمن برای حذف داده‌ها از سیستم ندارند، مگر اینکه به مدیر پایگاه داده و تیکت پشتیبانی برای تلاش برای حذف داده‌های یک نفر تکیه کنند. جریمه‌های عدم رعایت (non-compliance) می‌تواند سرسام‌آور باشد، و برد آن جهانی است - هر کجا که داده‌های شهروند اتحادیه اروپا پردازش می‌شود، GDPR اعمال می‌شود. رضایت (Consent) باید به زبانی واضح و ساده توضیح داده شود و پس گرفتن رضایت باید به همان آسانی دادن آن باشد. بنابراین اپلیکیشن‌های موبایل نه تنها باید از نظر امنیتی از نظر فنی عالی باشند، بلکه باید ابزارهای مدیریت داده (data management tools) موثری - سمت سرور و/یا سمت موبایل - را برای رعایت GDPR که خود به تنهایی یک منظومه شمسی از قوانین و مقررات حریم خصوصی است، پیاده‌سازی کنند.ایالت کالیفرنیا قوانین حریم خصوصی خاص خود را دارد، «قانون حریم خصوصی مصرف‌کننده کالیفرنیا» (California Consumer Privacy Act)، که از ۱ ژانویه ۲۰۲۰ به اجرا در می‌آید. سایر ایالت‌های ایالات متحده نیز در حال بررسی قوانین حریم خصوصی خود هستند. مطمئن شوید که از آنها مطلع باشید.بیشتر بیاموزیددر اینجا برخی منابع و مراجع مفید آورده شده‌اند که ممکن است به شما کمک کنند:اپل (Apple) راهنمایی کلی برای امنیت نرم‌افزار ارائه می‌دهد. این راهنما همچنین شامل چندین لینک به موضوعات دقیق‌تر برای پلتفرم آنها است.دوره‌های آموزشی تجاری (Commercial training courses) برای iOS و اندروید در دسترس هستند. «موسسه لنسلوت» (Lancelot Institute)  (lancelotinstitute.com) دوره‌های کدنویسی امن (secure coding courses) را برای iOS و اندروید ارائه می‌دهد.یک تست‌کننده SSL رایگان (free SSL tester) توسط «آزمایشگاه‌های کوالیسیس» (Qualsys Labs) ارائه شده است.راهنمایی‌های گسترده در زمینه امنیت اپلیکیشن (application security guidance) و ابزارهای آزمایش (testing tools) توسط OWASP ارائه شده است، از جمله «پروژه امنیت موبایل OWASP».سخن آخر (The Bottom Line)کهکشان اپلیکیشن‌های موبایل به طور فزاینده‌ای با جهان در حال گسترش خدمات ابری، دستگاه‌های IoT و پلتفرم‌های جدید و عجیب در هم تنیده شده است. اکنون بیش از هر زمان دیگری، این اپلیکیشن‌ها در معرض خطر کسانی هستند که می‌خواهند از آنها به صورت مخرب استفاده کنند، داده‌ها را از آنها سرقت کنند، داده‌ها را برای باج‌گیری نگه دارند، یا به سرویس‌ها و دستگاه‌های متصل حمله کنند. سطح مناسب امنیت اپلیکیشن (application security) چیزی است که باید به صورت سرتاسری (end-to-end) در نظر گرفته شود. در نهایت، اپلیکیشن شما و زیرساخت بک‌اند (backend infrastructure) و نقاط پایانی (endpoints) آن به حال خود رها خواهند شد و باید از خود در برابر هکرها و سایر تهدیدات مخرب دفاع کنند.زمان را برای یادگیری ویژگی‌های امنیتی و قابلیت‌های پلتفرم‌های موبایلی که قصد هدف قرار دادن آنها را دارید، اختصاص دهید. از تکنیک‌هایی مانند مدل‌سازی تهدید (threat modeling) برای شناسایی تهدیدات احتمالی مرتبط با اپلیکیشن خود استفاده کنید. بررسی کد (code reviews) را انجام دهید و روش‌های ثبت و اشکال‌زدایی (logging and debugging methods) غیرضروری را حذف کنید. یک ابزار تحلیل کد امن (secure code analysis tool) را روی کد موبایل خود اجرا کنید تا آسیب‌پذیری‌ها (vulnerabilities) را پیدا کنید. در نظر بگیرید که یک هکر چگونه کد شما را تحلیل می‌کند، سپس از تکنیک‌های مشابه، در یک محیط امن، در برابر اپلیکیشن خود استفاده کنید تا آسیب‌پذیری‌ها را کشف کرده و قبل از انتشار اپلیکیشن خود، این آسیب‌پذیری‌ها را کاهش دهید.خدمات و شرکای قابل اعتماد (trustworthy services and partners) را انتخاب کنید. اغلب ما برای خدمت‌رسانی به کاربران و ذینفعان خود به اشخاص ثالث (third-parties) متکی هستیم. رویکردهای آنها در مورد حریم خصوصی و همچنین رویه‌های آنها اهمیت دارد. استفاده از شرکت‌هایی که خود را به استانداردهای بالا ملزم می‌دانند و در مورد کارهایی که انجام می‌دهند - و انجام نمی‌دهند - شفاف هستند، می‌تواند به ما در محافظت از کاربران و ذینفعانمان کمک کند. و زمان را برای در نظر گرفتن پیامدهای حریم خصوصی برای هر داده‌ای که در مورد کاربر یا از طرف او جمع‌آوری می‌کنید، به ویژه اگر آن داده‌ها را در ابر ذخیره یا همگام‌سازی می‌کنید، اختصاص دهید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Wed, 21 May 2025 10:57:03 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای توسعه‌دهندگان موبایل به سمت کهکشان: فصل هفتم</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D9%81%D8%B5%D9%84-%D9%87%D9%81%D8%AA%D9%85-sow11m34bjpk</link>
                <description>فصل ششم را از این جا بخوانید.فصل هفتم: بازی‌های موبایل (Mobile Gaming)نویسنده: اسکار کلارک (Oscar Clark)اقتصاد بازی‌های موبایل (The Mobile Gaming Economy)موبایل همچنان یکی از هیجان‌انگیزترین پلتفرم‌ها برای توسعه‌دهندگان بازی امروزی است، حداقل وقتی صحبت از درآمد به میان می‌آید: از سال 2014 این بزرگترین بخش از بازار بازی‌های ویدیویی است که تخمین زده می‌شود 45 درصد از کل درآمدهای جهانی را در سال 2019 به خود اختصاص دهد.در همان زمان، بازی‌ها دسته غالب در فروشگاه‌های برنامه از نظر درآمد هستند: بازی‌ها 75 درصد از درآمد برنامه‌های موبایل را در سه‌ماهه دوم 2019 به خود اختصاص دادند.از نظر محتوا و برندها، ظهور بازی‌هایی مانند فورتنایت (Fortnite) و پابجی (PUBG) و همچنین بازی‌های کلاسیک رایانه شخصی مانند اولد اسکول رون‌اسکیپ (Old School Runescape) و روبلاکس (Roblox) شروع به به چالش کشیدن بازی‌هایی مانند کلش آو کلنز (Clash of Clans) و پوکمون گو (Pokemon Go!) کرده‌اند. در همان زمان، عناوینی مانند هوم‌اسکیپس (Homescapes) و مچینگتون منر (Matchington Manor) شروع به به چالش کشیدن سلطه کینگ (King) بر بازار بازی‌های کژوال (casual market) کرده‌اند. همچنین شاهد افزایش تعداد تیم‌های نسل دوم (و سوم) بوده‌ایم که با موفقیت زیادی وارد بازار شده‌اند، مانند فیوچرپلی (Futureplay) و نکست گیمز (Next Games).با وجود این، چالش‌های موفقیت در بازی‌های موبایل همچنان در حال افزایش است زیرا جذب کاربر (user acquisition) پرهزینه‌تر می‌شود. ساخت بازی‌هایی که روی چندین پلتفرم کار کنند آسان‌تر شده است. با نگاهی به 1000 بازی موبایل رایگان برتر در سال 2017، دریافتیم که 41 درصد به صورت بومی یا با استفاده از ابزارهای داخلی ساخته شده‌اند؛ 34 درصد از یونیتی (Unity) استفاده کرده‌اند؛ 18 درصد از کوکاس‌دو‌دی (Cocos2D)؛ 2.6 درصد از کورونا (Corona)؛ 2.2 درصد از آنریل (Unreal)؛ 1.2 درصد از مارمالاد (Marmalade) و 0.7 درصد از ابزارهای دیگری مانند گیم‌میکر (GameMaker)، وی-پلی (V-Play) و غیره استفاده کرده‌اند. هر موتور (engine) مزایا و دیدگاه‌های متفاوتی را برای توسعه‌دهندگان با انواع مهارت‌های مختلف ارائه می‌دهد تا به سرعت ایده‌های خود را تحقق بخشند و آنها را برای انتشار آماده کنند.زمانی که یک توسعه‌دهنده مستقل (indie-developer) تصادفی می‌توانست با تعداد کاربران دیوانه‌وار به ثروت برسد، اساساً به پایان رسیده است. در عوض، بازار بازی‌های موبایل به فضایی پیچیده با جنبه‌ها و چالش‌های مختلف تبدیل شده است و اکثر بازی‌ها همچنان شکست خواهند خورد. قبل از شروع ساخت بازی خود، باید به درک ماهیت بازار و مخاطبان توجه کنید. بخش اساسی این امر این است که این بازار به شدت رقابتی شده است، با تعداد زیادی تیم کوچک که حجم عظیمی از محتوا را تولید می‌کنند و میلیون‌ها دلار صرف توسعه و تبلیغات می‌کنند تا موقعیت خود را حفظ کنند.ساخت بازی مناسبایجاد تجربیات لذت‌بخش برای مخاطبان هدف شما به همان اندازه خلاقیت نیاز دارد، شاید هم بیشتر. توسعه‌دهندگان مختلف رویکردهای متفاوتی دارند. برای برخی با یک احساس شروع می‌شود (چگونه می‌خواهید بازیکن احساس کند)؛ برای برخی دیگر، در مورد گرفتن یک بازی که دوست دارند و تحقق آن به سبک منحصر به فرد خودشان است؛ همچنین کسانی هستند که با یک مکانیک (mechanic) یا یک سبک هنری (art style) شروع می‌کنند و گیم‌پلی (gameplay) از آنجا تکامل می‌یابد.ساخت بازی بر اساس عناوین موجود آسان به نظر می‌رسد، اما در عمل به ندرت موفق می‌شود مگر اینکه چیز خاصی را ارائه دهید که قبلاً انجام نشده است. به دنبال بازی‌های پلتفرمر (platform games) با اسکرول جانبی (sideways scrolling) با استفاده از پیکسل آرت (pixel art) بگردید و متوجه خواهید شد که این بازار چقدر اشباع شده است. انجام کاری کاملاً جدید نیز با ریسک خاص خود همراه است زیرا بازیکنان برای کمک به درک و ارتباط با نوآوری‌های شما به چیزی آشنا نیاز دارند. اسکات راجرز (Scott Rogers) در کتاب خود &quot;Level Up&quot; این را به عنوان &amp;amp;quot;مثلث شگفتی&amp;amp;quot; (Triangle of Weirdness) توصیف کرد. او ادعا کرد که بازی‌ها از یک جهان (world)، فعالیت‌ها (activities) و شخصیت‌ها (characters) تشکیل شده‌اند. ما می‌توانیم هر یک از اینها را برای ایده‌های جدید تغییر دهیم، اما نمی‌توانیم هر سه را بدون خطر از دست دادن مخاطب تغییر دهیم.برای من، نوع سرگرمی که ما در بازی‌ها به دنبال آن هستیم، چیزی است که زمانی اتفاق می‌افتد که بازیکن قادر به تعلیق ناباوری (suspend their disbelief) خود باشد و در تجربه‌ای که عاری از پیامدهای دنیای واقعی است، درگیر شود. ما کاملاً در مکانیک‌ها و روایت (narrative) تجربه غرق می‌شویم. جالب اینجاست که چالش و ناامیدی به همان اندازه انگیزه بازی هستند که دلایل بالقوه ترک تجربه هستند. اگر به تعادلی بین این حالات ذهنی دست یابیم، به حالت شادی می‌رسیم که همه طراحان بازی در مورد آن می‌دانند: &amp;amp;quot;جریان&amp;amp;quot; چیک‌سنت‌میهایی (Csikszentmihalyi’s Flow).ما باید به این نکته توجه کنیم که چه چیزی یک بازی را به طور خاص در یک دستگاه تلفن همراه سرگرم‌کننده می‌کند، متفاوت از کاری است که در پلتفرم‌های دیگر انجام می‌دهیم. به طور کلی، بازی‌های موبایل تمایل به ساده و در دسترس بودن دارند با عمق کافی و احساس هدف و پیشرفت برای حفظ توجه بازیکن. اما به این سادگی نیست. تلفن شخصی‌ترین دستگاه ماست و این بر نحوه بازی ما تأثیر می‌گذارد. همچنین جایگزین‌های زیادی وجود دارد؛ بازی‌ها باید برجسته باشند و از نظر احساسی ارتباط برقرار کنند تا بازیکنان و فروشگاه‌های برنامه آنها را انتخاب کنند. بخشی از فرآیند طراحی بازی، ایجاد پیش‌بینی کافی برای تشویق بازیکن به دانلود (حتی اگر رایگان باشد) و انتقال این آرزو است که خرج کردن پول، بازی را حتی بهتر می‌کند.نوع بازی که می‌سازید اهمیت دارد و برای کسانی که با اصول آن آشنا نیستند، برخی از آنها از مکانیک‌های نوظهور (emergent mechanics) توسعه یافته‌اند، با بلوک‌های سازنده‌ای که برای ایجاد نتایج شگفت‌انگیز یا استراتژیک، مانند شطرنج یا کلش آو کلنز، ترکیب می‌شوند. سپس بازی‌هایی وجود دارند که با استفاده از یک سری نقاط تصمیم‌گیری پیشرونده (progressive decision points) ساخته شده‌اند که هر کدام با مراحل خاص خود حل می‌شوند و به هم زنجیر شده‌اند تا داستانی مانند Episodes - Choose Your Story یا بازی کلاسیک Monkey Island را بسازند. ما حتی می‌توانیم بازی‌هایی بسازیم که خلاقیت بازیکن را در خود جای دهند، مانند روبلاکس یا ماینکرفت (Minecraft)، یا پازل‌های انتزاعی ساده مانند Merge Dragons یا Origame.هر مسیری که انتخاب کنیم، تعادل در قلب تفکر ما به عنوان یک توسعه‌دهنده قرار دارد. ما باید تصمیم بگیریم که بازی چقدر تحت تأثیر مهارت و چقدر تحت تأثیر شانس قرار می‌گیرد، تا چه حد بازی از یک روایت ثابت پیروی می‌کند یا توسط بازیکن هدایت می‌شود و البته پیچیدگی سیستم‌های داخلی، خواه در مورد توسعه شخصیت باشد یا یک اقتصاد منابع (resource economy). با بازی‌های رایگان (Free-To-Play) ما همچنین باید تأثیر پول خرج شده بر تجربه بازی را در نظر بگیریم.هر نوع بازی که باشد، حیاتی است که توسعه‌دهنده بر روی آنچه برای بازیکن اهمیت دارد تمرکز کند. مهم‌ترین سؤالی که باید بپرسیم این است که چرا بازیکن باید اهمیت بدهد. ما نه تنها به نصب آنها نیاز داریم، بلکه باید بازی ما را به سرگرمی انتخابی آنها تبدیل کنیم. بازی موبایل ممکن است در ابتدا به عنوان یک سرگرمی شروع شود، اما در نهایت، ما اغلب زمان بیشتری را صرف بازی با تلفن‌های خود نسبت به کنسول‌هایمان می‌کنیم. با این همه رقابت، باید بپرسیم چرا آنها باید بازی شما را بازی کنند؟ ما باید بتوانیم صادقانه به این سؤال پاسخ دهیم.درگیر کردن بازیکن موبایلهنگامی که ما بازی‌های موبایل را توسعه می‌دهیم، در حال ایجاد تجربه‌ای برای سرگرم کردن بازیکنان در نوع خاصی از دستگاه هستیم. تبلت‌ها و تلفن‌ها نیازهای متفاوتی را برآورده می‌کنند و نیازمند توجه به جزئیات در مورد نحوه استفاده خاص و متفاوتی هستند که برآورده می‌کنند. تلفن به طور کلی در مورد &quot;دقیقه بعدی&quot; است، چیزی است که وقتی انتظار داریم اتفاقی بیفتد یا به چیزی برای سرگرم کردن خود نیاز داریم، آن را بیرون می‌آوریم - و به طور فزاینده‌ای در حالت عمودی (Portrait) بازی می‌شود زیرا بازیکنان فوق‌العاده تمایلی به چرخاندن دستگاه خود به پهلو برای بازی در حالت افقی (landscape) ندارند. آن دسته از بازیکنانی که هنوز از دستگاه‌های تبلت خود استفاده می‌کنند، تمایل دارند برای مدت طولانی‌تری استراحت یا آرامش بازی کنند.این برای بازی‌ای که می‌خواهیم بسازیم چه معنایی دارد؟ بخشی از جذابیت هر بازی به دیدگاه متمایز، سبک بصری، روایت گیم‌پلی قانع‌کننده و نحوه طراحی تجربه برای تأثیرگذاری بر احساسات بازیکنان گره خورده است. این باید با ماهیت نحوه مصرف بازی مناسب باشد و در موبایل، ما باید محدودیت‌های ذاتی این دستگاه‌ها را درک کنیم. اندازه محدود صفحه، کنترل‌های صفحه لمسی، شتاب‌سنج‌ها، عمر باتری، قابلیت قطع شدن، سهولت بازیکنان در بیرون آوردن و کنار گذاشتن دستگاه، کیفیت محدود بلندگو، خروجی هدفون با کیفیت بالا و غیره همگی بر نحوه تعامل بازیکنان با دستگاه تأثیر می‌گذارند.تلفن‌های همراه (عمدتاً) به اینترنت متصل هستند و فراگیرترین دستگاه‌ها هستند زیرا ما همیشه آنها را با خود حمل می‌کنیم. برای نشان دادن منظورم، به نحوه پیاده‌سازی کنترل‌ها فکر کنید. صفحه‌های لمسی طیف وسیعی از حرکت را در یک صفحه دو بعدی امکان‌پذیر می‌کنند، اما پس از مدت کوتاهی پوست ما داغ می‌شود و ظرفیت خازنی (capacitance) خود را از دست می‌دهد که به این معنی است که کنترل‌ها کمتر قابل اعتماد می‌شوند. اگر به سادگی سعی کنیم یک سیستم کنترل دو استیکی (twin stick control system) را کپی کنیم (کاری که بازی‌های زیادی انجام داده‌اند) به زودی با مشکلاتی در تجربه بازی مواجه خواهیم شد. با این اوصاف، با ظهور بازی‌های تیراندازی اول شخص (first person shooters) در موبایل، به نظر می‌رسد که بسیاری از بازیکنان راه خود را از طریق محدودیت‌ها پیدا می‌کنند. با این حال، هنوز فرصت‌های زیادی برای طراحی مکانیک‌های بازی با کنترل‌هایی وجود دارد که به طور خاص برای ایجاد احساس خوب در فرآیند لمس یا تشخیص محدودیت‌های روش‌های موجود و تبدیل آن به بخشی از تجربه طراحی شده‌اند.سادگی همچنان یک عامل مهم برای هر طراحی است و دستیابی به آن فوق‌العاده دشوار است زیرا حتی در اینجا نیز باید دسترسی‌پذیری (accessibility) را با توانایی نگه داشتن افراد در بازی در طول زمان متعادل کنیم. این تفکر در چند سال گذشته زیرژانر (sub-genre) خاص خود را به وجود آورده است زیرا بازی‌های هایپرکژوال (HyperCasual games) با کاهش گیم‌پلی به یک مکانیک قابل تکرار مداوم، رونق گرفته‌اند.مفید است که مکانیک بازی را جدا از زمینه (context) - بخشی از بازی که به بازیکن دلیلی برای تکرار مکانیک می‌دهد - در نظر بگیریم. مکانیک‌ها اسکلت اصلی هر بازی هستند. حلقه‌های اصلی (core loops) اقدامات با شرایط اولیه، چالش، راه‌حل‌ها و پاداش. اینها کارهای واقعی هستند که بازیکنان در بازی انجام می‌دهند. زمینه، دلیل انجام دوباره آن است. این می‌تواند یک روایت، ساختار سطح یا حتی به سادگی راهی برای محدود کردن دسترسی به محتوا بر اساس عملکرد بازیکن باشد. اما باید احساس هدف و پیشرفت را ارائه دهد. بیش از آن، زمینه باید پس از پایان جلسه بازیکن، توجه او را جلب کند، به عنوان &quot;کار ناتمام&quot; در پس ذهن ما بنشیند و ما را وسوسه کند تا بعداً برای جلسه دیگری بازگردیم.بازی‌هایی مانند CSR و کندی کراش (Candy Crush) این روش طراحی بازی را به بازار موبایل معرفی کردند. یافتن راه‌هایی برای زنجیر کردن یک سری مکانیک‌های خسته‌کننده (grinding mechanics) برای حفظ قابلیت بازی در طول هزاران جلسه و در عین حال همیشه این حس را ایجاد می‌کند که اهداف قابل دستیابی هستند، جادویی است. این باعث ایجاد تعامل طولانی مدت می‌شود و بازیکنان را برای مدت طولانی‌تری درگیر بازی شما نگه می‌دارد، به شرطی که تجربه به اندازه کافی معنادار باشد.نگه داشتن بازیکنان برای مدت طولانی‌تر، تأثیر مستقیمی بر تمایل آنها به خرج کردن پول در بازی دارد. در یک نظرسنجی یونیتی در سال 2014⁵، میانگین هزینه گزارش شده توسط بازیکنانی که پول خرج می‌کنند و کمتر از یک ساعت در بازی وقت می‌گذرانند، 0.66 دلار است، اما برای کسانی که بیش از 10 ساعت وقت می‌گذرانند، این رقم به 15.15 دلار افزایش می‌یابد. (gamesindustry.biz)بازی هایپرکژوال، شکل «یکبار مصرف‌تری» از گیم‌پلی را معرفی کرد که تجربیات تکراری جذابی را در بازی‌های دور انداختنی ارائه می‌دهد، به بازیکنان امکان می‌دهد به سرعت راه‌اندازی مجدد کنند، تبلیغات زیادی را تماشا کنند و به عنوان بعدی بروند. با این حال، به نظر می‌رسد درآمدهای پایدار برای یک عنوان واحد هنوز به مدیریت چرخه عمر بازیکن (player life-cycle) متکی است.طراحی سفر بازیکندرک اینکه تعامل طولانی مدت اهمیت دارد، تأثیر عمیقی بر نحوه نگاه ما به طراحی بازی دارد. ایده یک بازی به عنوان یک مکانیک یا داستان، به این درک تبدیل می‌شود که نه تنها شخصیت قهرمان ما در حال سفر است، بلکه بازیکن ما نیز همینطور است. این سفر از چندین مرحله تشکیل شده است:1. کشفبازیکنان هنگام اولین برخورد با بازی شما، مجموعه خاصی از نیازها و آرزوها را دارند و واقعاً چیز زیادی فراتر از نماد و اولین جمله لیست فروشگاه برنامه شما برای ایجاد انگیزه در بازیکنان برای دانلود و بازی برای اولین بار وجود ندارد. با وجود این، تنظیم انتظارات صحیح ضروری است. اگر بازی از قبل هزینه دریافت می‌کند، به بازیکن اطلاع دهید که چرا باید آن را بخرد و اگر این کار را نکند چه چیزی را از دست خواهد داد. اگر بازی رایگان است، ما هنوز باید انتظاراتی ایجاد کنیم، اما همچنین باید به بازیکن نشان دهیم که چرا تبلیغات ارزش دردسر را دارد یا اگر خریدهای درون‌برنامه‌ای (in-app purchases) وجود دارد، چرا آن بازیکنان از خرید آنها احساس خوبی خواهند داشت. این یک هنر ظریف است.2. یادگیریهنگامی که آنها تصمیم به نصب بازی شما گرفتند، ما باید تعامل را تا حد امکان آسان کنیم. نماد و نام بازی را فوراً قابل تشخیص و در حالت ایده‌آل، وسوسه‌انگیز کنید، دلیلی برای شروع برنامه. در این مرحله ما نمی‌خواهیم آنها در مورد شخصیت‌هایی که بازی می‌کنند یا سطوحی که می‌خواهند انتخاب کنند - آنها هنوز نمی‌دانند. قبل از بازی از آنها نخواهید در فیسبوک ثبت نام کنند یا حسابی راه‌اندازی کنند - به آنها نشان دهید که بازی در مورد چیست. سپس آنها را شگفت‌زده کنید! من اغلب در مورد &quot;افتتاحیه باند&quot; (The Bond Opening) صحبت می‌کنم و این اولین بازی را با 5 دقیقه ابتدایی هر فیلم باند مقایسه می‌کنم. این ما را شگفت‌زده می‌کند و در عین حال همه چیزهایی را که باید در مورد داستان، مأموران فوق سری و دنیایی که داستان در آن اتفاق می‌افتد بدانیم، تنظیم می‌کند. اما بیش از این کار می‌کند، تضمین می‌کند که هرگز نمی‌خواهیم صندلی را ترک کنیم. این نقش دوگانه نشان دادن به جای گفتن است که انتظارات را برای بقیه فیلم تنظیم می‌کند و به خوبی در مورد بازی‌ها نیز صدق می‌کند. از آنجایی که این یک بازی است، ما نمی‌خواهیم نشان دهیم یا بگوییم، ما باید &quot;انجام دهیم!&quot;. بازیکنان باید با انجام دادن و احساس خوب در مورد دستاوردهای خود به سرعت در مورد بازی‌ها یاد بگیرند.3. درگیر شدناگر موفق شویم و انتظارات مناسبی را برای ادامه بازی آنها تنظیم کنیم، واقعاً فرآیند ایجاد تعامل طولانی مدت را آغاز می‌کنیم. در این مرحله بازیکن چالش و پیشرفت را درک می‌کند و قبلاً برای ادامه بازی برای جلسات بعدی بازگشته است. در این مرحله آنها همچنین باید ارزش سرمایه‌گذاری بیشتر زمان یا پول در بازی را درک کنند. فروش IAP (خرید درون برنامه‌ای) و استفاده از تبلیغات انتخابی (Opt-In Ads) برای بازیکنانی که قبلاً از مزایای بازی بهره‌مند شده‌اند، بسیار آسان‌تر است. با این حال، حفظ این امر در دراز مدت چالش برانگیز است. ما به اهداف &quot;قابل دستیابی&quot; بلندمدت و همچنین رویدادها و تعامل اجتماعی نیاز داریم تا بازیکنان را حفظ کنیم، و باید همه اینها را بدون پیچیده کردن بیش از حد بازی انجام دهیم.3.1. پتانسیل فوق درگیر شدن (SuperEngage)بازیکنان از نظر تمایل به خرج کردن پول در بازی شما، همه یکسان ایجاد نشده‌اند. برخی از بازیکنان به &quot;فوق طرفداران&quot; (Super-fans) تبدیل می‌شوند که فعالانه خواهان آیتم‌های بیشتر و بیشتری برای افزایش تجربه بازی خود هستند. بازی به &quot;سرگرمی&quot; آنها تبدیل می‌شود و چیزی است که ممکن است مایل باشند فراتر از قیمت یک فنجان قهوه برای آن سرمایه‌گذاری کنند. این به طور کلی تنها پس از درگیر شدن کامل آنها و زمانی که توسعه‌دهنده قادر به تمرکز بر ارائه ارزش برای آن بازیکن باشد، اتفاق می‌افتد. مهم است که این بازیکنان را با افرادی که معتاد هستند اشتباه نگیریم. اعتیاد (Addiction) جایی است که افراد اجباری دارند که بر رفتار منطقی آنها غلبه می‌کند. در عمل، اکثر طرفداران واقعی، افراد منطقی هستند که بازی شما را به سرگرمی اصلی خود تبدیل کرده‌اند. رفتار اعتیادآور همیشه برای فرد مضر است و ما باید هر کاری که می‌توانیم برای کمک به هر کسی با این نوع مشکلات انجام دهیم.3.2. درگیر کردن مجددبازیکنانی که درگیر شده‌اند همچنان یک چرخه عمر خواهند داشت؛ اما ممکن است بتوان آنها را با افزودن یک به‌روزرسانی جدید، محتوای جدید یا حتی رویدادهایی در داخل بازی دوباره درگیر کرد.4. ریزش (Churning)آخرین مرحله زندگی که باید به آن اذعان کنیم &quot;ریزش&quot; است. اجتناب‌ناپذیر است که در نهایت بازیکنان بازی ما را متوقف کنند. ما می‌خواهیم این را تا آنجا که ممکن است به تأخیر بیندازیم، اما عدم برنامه‌ریزی برای آن باعث مشکلات بیشتری برای ما خواهد شد.تجزیه و تحلیل و جریان بازیساخت یک بازی کمی شبیه طراحی یک آزمایش است؛ به خصوص در این دوران غنی از داده، متصل، توسعه ناب (lean development) و محصولات حداقلی قابل دوام (minimum viable products). ما یک فرضیه ایجاد می‌کنیم و آن را تا حد امکان به سادگی آزمایش می‌کنیم. ما می‌خواهیم در اسرع وقت بدانیم که آیا به چیزی دست یافته‌ایم یا نه، در حالت ایده‌آل قبل از صرف هزینه زیاد برای توسعه غیر ضروری. این بدان معناست که ما به تجزیه و تحلیل نیاز داریم تا به ما کمک کند بفهمیم در هر مرحله از زندگی چه اتفاقی می‌افتد.اول، ما مجبور نیستیم همه چیز را ضبط کنیم. انواعی از داده‌ها وجود دارند که ایستا هستند، اطلاعات مرجع. به عنوان مثال، موقعیت خاص در یک نقشه خاص. تا زمانی که نسخه نقشه مورد استفاده در آن زمان مشخص باشد، می‌توان از مختصات X، Y، Z به تنهایی برای ایجاد یک نقشه حرارتی (heat map) بعداً استفاده کرد. ما همچنین می‌توانیم داده‌های زیادی را از رویدادهای دیگر استنباط کنیم تا زمانی که اطلاعات ارتباطی وجود داشته باشد. به عنوان مثال، ما نیازی به ضبط سطحی که بازیکن برای آن بازی استفاده می‌کند در هر رویداد یا حتی لیستی از تمام بازیکنان در آن جلسه نداریم. ما می‌توانیم آن اطلاعات را با رویدادهای خاص &quot;شروع جلسه&quot; (Start Session) ضبط کنیم و از شناسه جلسه (session ID) مرتبط برای شناسایی همه چیزهایی که در آن جلسه بازی خاص اتفاق افتاده است استفاده کنیم. اکثر پلتفرم‌های تجزیه و تحلیل تجاری به طور خودکار مجموعه داده‌های رایج مانند تاریخ/زمان، X، Y، Z و غیره را در فرآیند جمع‌آوری رویداد خود ضبط می‌کنند.ما همچنین باید درک کنیم که داده‌هایی که جمع‌آوری می‌کنیم همیشه ناقص خواهند بود. به عنوان مثال، اگر باتری تمام شود یا بازیکن به تماس تلفنی تغییر وضعیت دهد - احتمالاً آخرین آپلود را دریافت نخواهیم کرد.ما وظیفه داریم با داده‌های بازیکن بسیار با دقت رفتار کنیم، باید اطمینان حاصل کنیم که بازیکنان ناشناس باقی می‌مانند. ما نمی‌خواهیم یا نیازی به جاسوسی از بازیکنان خود نداریم، اما باید بفهمیم که بازی در بین همه بازیکنان چگونه انجام می‌شود بدون اینکه با حفاظت از داده‌ها (به خصوص مربوط به کودکان) مغایرت داشته باشد. در صورت هرگونه شک، حتماً از مشاوره حقوقی واجد شرایط استفاده کنید.چه رویدادهایی را باید ضبط کنیم؟هنگام در نظر گرفتن اینکه کدام رویدادها را ردیابی کنید، آنها را از نظر جدول زمانی که بازیکن ممکن است با آنها روبرو شود، در نظر بگیرید. البته یک تجربه بازیکن برای اولین بار وجود خواهد داشت، اما همچنین می‌تواند مفید باشد که جریان جلسه بازیکن &quot;درگیر&quot; (Engaged player) را که بیشتر تجربه می‌شود، ترسیم کنید. ما لزوماً هر فشار دکمه را مستقیماً نگاشت نمی‌کنیم. در عوض، باید به دنبال لحظاتی باشید که انتخاب‌های معناداری وجود دارد.رویکردی وجود دارد که توسط صنایع غذایی به نام HACCP⁶ استفاده می‌شود. (develop-online.net: در اصل نکته این است که ما به دنبال &quot;خطرات&quot; در جریان تجربه بازیکن هستیم، مانند اینکه آیا آنها ریزش می‌کنند (یعنی بازی را ترک می‌کنند) اما همچنین نقاط ماشه‌ای (trigger points) برای اقدامات مثبت‌تر مانند پرداخت برای IAP یا تماشای تبلیغ ویدیویی.)برخی از رویدادهای معمولی که ارزش ردیابی دارند ممکن است شامل موارد زیر باشند:رویداد GameMenuLaunch (راه‌اندازی منوی بازی) AnonPlayerID (شناسه بازیکن ناشناس)؛ TimeIconLaunched (زمان راه‌اندازی آیکون)رویداد SessionLaunch (راه‌اندازی جلسه) TimeSessionLaunched (زمان راه‌اندازی جلسه)؛ AnonPlayerID(s)؛ SessionID (شناسه جلسه)؛ LevelIDSelected (شناسه سطح انتخاب شده)؛ OptionSelected (گزینه انتخاب شده)رویداد SessionStart (شروع جلسه) TimeSessionStarted (زمان شروع جلسه)؛ AnonPlayerID؛ SessionID؛رویداد ObjectiveSet (تنظیم هدف) TimeObjectiveSet (زمان تنظیم هدف)؛ AnonPlayerID؛ SessionID؛ ObjectiveID (شناسه هدف)؛رویداد ObjectiveMet (دستیابی به هدف) TimeObjectiveMet (زمان دستیابی به هدف)؛ AnonPlayerID؛ SessionID؛ ObjectiveID؛ Score (امتیاز)؛ Reward (پاداش)؛ XYZLocation (موقعیت X,Y,Z)رویداد TargetHit (ضربه به هدف) TimeTargetHit (زمان ضربه به هدف)؛ AttackerID(AnonPlayerID?) (شناسه مهاجم)؛ SessionID؛ TargetID(AnonPlayerID?) (شناسه هدف)؛ Damage (آسیب)، XYZLocationرویداد PlayerDeath (مرگ بازیکن) TimePlayerDeath (زمان مرگ بازیکن)؛ AnonPlayerID؛ SessionID؛ XYZLocationرویداد LevelComplete (تکمیل سطح) AnonPlayerID؛ SessionID؛ ObjectiveID؛ Score؛ Reward؛ XYZLocationبا ایجاد رویدادها به این روش، می‌توانیم اطلاعات زیادی را استنباط کنیم. به عنوان مثال، اگر بخواهیم درصد بازیکنانی را که یک سطح را تکمیل می‌کنند بدانیم، می‌توانیم تعداد رویدادهای &quot;GameMenuLaunch&quot; را با تعداد &quot;LevelComplete&quot; بشماریم. اما همچنین می‌توانیم با تجزیه و تحلیل خود هوشمندتر عمل کنیم. می‌توانیم بررسی کنیم که چند نفر یک ObjectiveID خاص را در یک &quot;LevelIDSelected&quot; خاص تکمیل کرده‌اند و آن را با تعداد &quot;LevelComplete&quot; در سطح بعدی مقایسه کنیم تا دریابیم که آیا نادیده گرفتن اهداف در سطوح قبلی تأثیر خاصی بر عملکرد بعدی دارد یا خیر.هنگامی که داده‌ها را داریم، باید بتوانیم از آنها استفاده کنیم و به طور مداوم صحت و سودمندی آنها را بررسی کنیم. پلتفرم‌های تجاری اغلب با ابزارهای گزارش‌دهی جامع از داشبوردهای اولیه با KPIهایی (شاخص‌های کلیدی عملکرد) مانند نرخ نگهداری D2/D7 (D2/D7 Retention)، کاربران فعال روزانه (DAU - Daily Active Users)، متوسط درآمد هر کاربر (ARPU - Average Revenue Per User) و حتی متوسط درآمد هر کاربر فعال روزانه (ARPDAU - Average Revenue Per Daily Active User) ارائه می‌شوند. دو ابزار ضروری وجود دارد که هر توسعه‌دهنده‌ای باید به استفاده از آنها توجه کند. اول، &quot;قیف‌ها&quot; (Funnels) هستند: ما رویدادها را به ترتیب عبور بازیکن از بازی تنظیم می‌کنیم تا ببینیم در کجای خط لوله بیشترین مشکلات را دارید. دوم، نقشه‌های حرارتی هستند که آن داده‌ها را به گونه‌ای در سطح شما قرار می‌دهند که به شما امکان می‌دهد دقیقاً بفهمید در داخل جلسه گیم‌پلی چه اتفاقی می‌افتد.رایگان در مقابل پولی (و اشتراک)بحث بین بازی‌های رایگان و پولی تقریباً در میان توسعه‌دهندگان بازی به یک امر قبیله‌ای تبدیل شده است و این سؤال مطرح می‌شود که آیا مدل‌های کسب‌وکار ماهیت طراحی بازی را خدشه‌دار کرده‌اند، حتی سؤالاتی در مورد اخلاق این طرح‌های متمرکز بر پول پرسیده می‌شود.از نظر اقتصادی، واضح است که وقتی عرضه افزایش می‌یابد، قیمت‌ها کاهش می‌یابند. با عرضه تقریباً نامحدود، قیمت به صفر می‌رسد. این دقیقاً همان چیزی است که اتفاق افتاده است و به همین دلیل است که بازی‌های رایگان (Free2Play) بسیار غالب هستند. اما صبر کنید، در مورد 7 درصد درآمد بازی‌های پرمیوم (premium games) در آی‌او‌اس چطور؟ بازی‌های پرمیوم موفق آنهایی هستند که توانسته‌اند با ارائه چیزی که به نظرشان ارزش بیشتری نسبت به بقیه بازی‌های موجود دارد، مخاطب جذب کنند. بازی‌هایی مانند Monument Valley یا The Room نشان داده‌اند که این هنوز هم ممکن است، و به دلیل قیمت‌گذاری پرمیوم خود مورد توجه قرار می‌گیرند. این به اندازه درآمدهای بازی‌های رایگان برتر نبوده است، علی‌رغم معرفی قابل توجه توسط فروشگاه‌های برنامه.ساده‌ترین راه برای درک بازی‌های رایگان این است که متوجه شوید این بازی‌ها به سادگی بخش خرده‌فروشی را به داخل بازی منتقل کرده‌اند. این بدان معناست که افرادی که بازی و بازیکنان آن را بهتر می‌شناسند (یعنی توسعه‌دهندگان) می‌توانند آیتم‌هایی را که بازیکنان دوست دارند و تجربه را تکمیل و تقویت می‌کنند، شناسایی کرده و مستقیماً به آنها بفروشند.حرکت به سمت رایگان، مسیر آسانی برای بسیاری از ارائه‌دهندگان بازی نبوده است و تلاش‌ها برای &quot;کلون کردن&quot; مدل‌های کسب‌وکار بازی‌هایی مانند کلش آو کلنز یا کندی کراش به ندرت حتی به سطح موفقیت قابل مقایسه‌ای دست یافته‌اند. این علی‌رغم اینکه فرمول در ظاهر بسیار ساده به نظر می‌رسد و می‌تواند به سرعت &quot;چندان سرگرم‌کننده نباشد&quot; و باعث ریزش بسیاری از بازیکنان شود. اگر بازیکن شما احساس کند که بازی صرفاً تمرینی برای باز کردن کیف پول من است، من به عنوان یک بازیکن چقدر درگیر خواهم شد؟تبلیغات نقش فزاینده‌ای در بازی‌ها ایفا می‌کند و جالب اینجاست که برخلاف سایر رسانه‌ها، به نظر نمی‌رسد تبلیغات در بازی‌ها مخاطبان را از بین ببرد. مشابه روشی که ما به خریدهای درون‌برنامه‌ای نگاه می‌کنیم، شاهد حرکتی هستیم که به دنبال یافتن راه‌هایی برای افزودن ارزش تبلیغات به تجربه کلی بازی است، به جای اینکه فقط مانع پیشرفت بازیکنان شود. استفاده از تبلیغات بنری (banner ads) در یک بازی، که می‌تواند به طور تصادفی کلیک شود و فضای با ارزش صفحه را اشغال کند، تا حد زیادی با تبلیغات بینابینی (interstitials) یا ویدیوی انتخابی (opt-in video) جایگزین می‌شود. ما همچنین شروع به دیدن معرفی تبلیغات مبتنی بر برند (brand based ads) کرده‌ایم که، شاید به طور شگفت‌انگیزی، به نظر می‌رسد سطحی از اعتبار را به کل تجربه اضافه می‌کند؛ ظاهراً دیدن تبلیغی از کوکاکولا (Coke) یا آئودی (Audi) باعث می‌شود بازیکنان بیشتر درگیر شوند.با ظهور سرویس‌های پخش جریانی (streaming) و اشتراک (subscription)، طیف وسیعی از فرصت‌های جدید برای توسعه‌دهندگان انواع خاصی از بازی‌ها به وجود آمده است. در زمان نگارش این متن، اپل آرکید (Apple Arcade) بر روی بازی‌های انحصاری به سبک &quot;پولی&quot; متمرکز شده است که به کتابخانه‌ای برای مشترکین اضافه می‌شوند تا از مدل &quot;هرچه می‌توانی بخور&quot; (all-you-can-eat) لذت ببرند - بسیار شبیه به مدل نتفلیکس. این احتمالاً یک مدل کسب‌وکار بسیار جالب برای بسیاری از توسعه‌دهندگانی خواهد بود که به سرعت منتشر می‌کنند یا بر روی عناوین تجربه تک‌نفره با کیفیت بسیار بالا (high quality single-play through experience titles) تمرکز دارند، اما برای همه مناسب نخواهد بود. به طور مشابه، اِستِیدیا و تعدادی از سایت‌های پخش جریانی بازی‌های رترو (retro-game streaming sites) با استفاده از مدل مشابهی معرفی می‌شوند؛ اما الزامات متفاوتی از نظر حفظ ارزش برای بازیکن در طول زمان وجود دارد. ریسک این مدل برای یک توسعه‌دهنده مشابه ریسک هنرمندان موسیقی در اسپاتیفای (Spotify) است؛ هرچه بازی‌های بیشتری پشتیبانی شوند، درآمد بیشتر تقسیم می‌شود و بیشتر بر روی کسی که در حال حاضر تبلیغ می‌شود تمرکز می‌کند. مدل‌های اشتراک &quot;هرچه می‌توانی بخور&quot; به همان اندازه اصطکاک ایجاد می‌کنند که بازی‌های &quot;پرداخت از قبل&quot; (Paid upfront)، حتی اگر دوره آزمایشی رایگان داشته باشید؛ و اگرچه می‌توانند درآمد مداومی ایجاد کنند، رشد بازی‌ها را به مخاطبان محدود می‌کنند - شما نمی‌توانید چیزهای بیشتری را به آنها ارائه دهید که درآمد هر کاربر را افزایش دهد، فقط حفظ کاربر (retention). روش‌های سبک &quot;بتل پس&quot; (Battlepass) همانطور که در فورتنایت دیده می‌شود، رویکردهای دوستانه‌تری را برای بازیکنان نشان داده‌اند که در آن یک پیشنهاد ارزش واضح ارائه می‌شود و بازیکنان می‌توانند ببینند چه چیزی را از دست می‌دهند. اما مهمتر از همه، شما همچنان می‌توانید چیزهای جدیدی را به آن بازیکنان، به خصوص از طریق رویدادها و به‌روزرسانی‌ها، بفروشید. بتل پس در حال حاضر اغلب انتخابی است تا انصرافی، اما به طور فزاینده‌ای شامل گزینه‌های اشتراک خواهد شد. طی چند سال آینده شاهد استفاده هوشمندانه‌تر از مدل‌های اشتراک برای افزایش تعامل و تکمیل سایر اشکال درآمد از جمله تبلیغات و IAP علاوه بر اشتراک خواهیم بود - اما فقط در جایی که بازیکنان ارزش فوق‌العاده‌ای دریافت کنند. و همه بازی‌ها از این مدل بهره‌مند نخواهند شد.هفت قانون طراحی کسب درآمد برای بازی‌هاقانون 1: مطلوبیت (Utility)همه چیز با مطلوبیت شروع می‌شود، یک اصطلاح اقتصادی که در این مورد برای بیان &quot;انتظار ارزش&quot; (expectation of value) برای بازیکن استفاده می‌شود. در بازی‌های رایگان، بازیکنان معمولاً &quot;سنگ‌های قیمتی&quot; (gems) یا هر ارزی (currency) که ممکن است استفاده کنید را نمی‌خرند چون خیلی براق هستند. خریداران با انتظار اینکه این آیتم‌ها چه گیم‌پلی‌ای را باز می‌کنند، هدایت می‌شوند. همین اصل حتی اگر برای دسترسی به بازی هزینه دریافت می‌کنید نیز صدق می‌کند. این تحویل فیزیکی یا اندازه دانلود نیست که بازیکنان برای آن ارزش قائل هستند، بلکه پیش‌بینی بازی است.در حالی که در بازی‌های پرمیوم قبل از اینکه کاربران واقعاً آن را تجربه کنند (به جز محتوای قابل دانلود (DLC) اضافی بالقوه)، پول در می‌آوریم، برای بازی‌های رایگان، چرخه عمر بازیکن پس از دانلود اولیه نقش مهمی در کسب درآمد دارد. با در نظر گرفتن این موضوع، اغلب مفید است که بازی خود را به سه بخش تقسیم کنید:مکانیک: عنصر اصلی بازی - معمولاً یک حلقه با نوعی چالش؛ راه‌حل و پاداش.زمینه: مکانیکی که برای ایجاد احساس هدف و پیشرفت استفاده می‌شود، از جمله روایت، درخت باز کردن قفل (unlock tree)، حالت‌های باس (boss modes) و غیره.متاگیم (Metagame): عناصری که مربوط به پیکسل‌ها نیستند، از جمله همکاری، سیستم‌های کلن (clan systems)، نحوه استفاده از دستگاه‌ها و غیره.هر یک از این مراحل ممکن است شامل فرصتی برای استفاده از تبلیغات درون بازی یا خرید درون‌برنامه‌ای (IAP) باشد. اهرم‌هایی که برای افزودن ارزش استفاده می‌کنیم معمولاً در این مراحل مختلف تجربه متفاوت خواهند بود. مواد مصرفی (Consumables) که به عنوان بخشی از مکانیک کار می‌کنند، ممکن است برای زمینه یا متاگیم نامناسب باشند. تقسیم تجربه به بخش‌ها به ما امکان می‌دهد بفهمیم ارزش واقعی کجاست و تمرکز را بر مزایای بازیکنان حفظ می‌کند.ما همچنین می‌توانیم از این طرز فکر برای بازنگری در نحوه استفاده از تبلیغات، به ویژه تبلیغات ویدیویی انتخابی، استفاده کنیم. آنها اکنون می‌توانند به روشی برای گسترش رفتار بازیکنان تبدیل شوند، به عنوان مثال، تماشای یک تبلیغ برای دریافت یک پاورآپ (power-up) رایگان که قبلاً امتحان نکرده‌اید. هنگامی که بازیکن آن را امتحان کرد، امیدواریم بیشتر تمایل به خرج کردن کمی پول برای یک بسته 10 تایی داشته باشد. هر تصمیم خرید بسته به جایی که در بازی رخ می‌دهد و همچنین چرخه عمر بازیکن، تأثیر متفاوتی دارد. استفاده از تجزیه و تحلیل و حتی یادگیری ماشین می‌تواند موفقیت ما را تا زمانی که آزمایش‌های معناداری راه‌اندازی کنیم، متحول کند.برای مشخص‌تر کردن عناصر کسب درآمدی که می‌خواهیم در طراحی بازی خود استفاده کنیم، ارزش دارد که آن را از دریچه جعبه ابزار طراحی بازی خود بررسی کنیم. با نگاهی به انواع کالاها (goods) در بازی‌ها شروع کنید:حیاتی (Sustenance): عناصری که برای ادامه بازی به آنها نیاز داریم چیست؟میان‌بر (Shortcuts): چه عواملی شانس موفقیت ما را افزایش می‌دهند یا تأثیر شکست را کاهش می‌دهند؟اجتماعی شدن (Socialisation): بازیکنان چگونه می‌توانند خود و پیشرفت خود را در بازی بیان کنند؟استراتژی (Strategy): آیا می‌توانیم گزینه‌های بازی جدیدی را (بدون شکستن بازی) معرفی کنیم؟آن کالاها همچنین در اشکال مختلفی عرضه می‌شوند:مصرفی (Consumable): یک آیتم یکبار مصرف.ظرفیت (Capacity): چیزی که رشد/بازی را محدود می‌کند.دائمی (Permanent): یک ارتقاء یا آیتم باز کردن قفل دائمی.مولد (Generators): افزایش در عرضه یک ماده مصرفی.هنگامی که نوع و شکل را ترکیب می‌کنیم، این یک راه قدرتمند برای ارزیابی مدل کسب درآمد بازی شما ایجاد می‌کند.بگذارید این را با یک مثال عینی نشان دهم: ما یک بازی رانندگی داریم که در آن از سوخت به عنوان مکانیک انرژی استفاده می‌کنیم؛ اما ممکن است تصمیم بگیریم که شما نمی‌توانید سوخت بخرید (نمی‌خواهیم احساس مالیات داشته باشد) اما به بازیکنان اجازه می‌دهیم هر 24 دقیقه یک بار یک تبلیغ انتخابی را برای سوخت‌گیری تماشا کنند. بازیکنان همچنین می‌توانند اندازه مخزن سوخت خود را ارتقا دهند که به این معنی است که قبل از تمام شدن سوخت، بازی‌های بیشتری دریافت می‌کنند. سپس می‌توانیم یک پمپ بنزین داشته باشیم که به این معنی است که آنها می‌توانند سوخت خود را سریعتر از قبل جایگزین کنند. در نهایت، ما ماشین بهتری داریم که به دلیل مزایایی که اضافه می‌کند، آن را می‌خواهیم؛ اما عواقبی نیز دارد، به عنوان مثال، استفاده بیشتر از سوخت، این را به یک انتخاب بازیگوشانه تبدیل می‌کند - نه فقط یک ارتقاء.قانون 2: پیش‌بینی (Anticipation)یک عنصر اساسی در طراحی کسب درآمد، نحوه انتقال مطلوبیت ایجاد شده به بازیکن است. به طور کلی چهار نیرو مانع از خرید بازیکن می‌شوند: عدم اطمینان از نتیجه، مسائل اجتماعی، هزینه‌های فرصت (Opportunity costs) و نیازهای خارجی. یک درس سخت از این موضوع این است که ما نمی‌توانیم مردم را مجبور به پرداخت کنیم؛ و اگرچه ممکن است بتوان در کوتاه‌مدت مردم را دستکاری کرد، اما این پایدار نیست، نتیجه معکوس دارد و اعتماد را برای همه از بین می‌برد. در عوض، ما باید شرایطی را ایجاد کنیم که مردم بتوانند به خودشان اجازه بازی بدهند. این بدان معناست که ما باید چهار عامل زیر را ایجاد کنیم: انتظار لذت، سرمایه اجتماعی (Social capital)، فراخوان به اقدام و نفی سایر اولویت‌ها.پیش‌بینی مورد نیاز برای خریدقانون 3: کمیابی (Scarcity)درست مانند اقتصاد دنیای واقعی، کمیابی نیز یک جنبه حیاتی از اقتصاد بازی شما است. با این حال، هنگام ایجاد کمیابی، قانون 1: مطلوبیت را فراموش نکنید. هرگونه استفاده از کمیابی باید معتبر باشد و بر لذت بردن از بازی تمرکز کند. افزودن تبلیغات ویدیویی انتخابی یا IAP باید گسترش طراحی کلی ما باشد و باید در نظر بگیریم که چگونه خرج کردن بر تعادل بازی تأثیر می‌گذارد تا از ایجاد مدل &quot;پرداخت برای برنده شدن&quot; (Pay To Win) (که بهتر است به عنوان یک بازی خراب توصیف شود) جلوگیری کنیم.حیاتی برای کمیابی این است که به فرصت‌های موجود در بازی و از طریق پرداخت برای به دست آوردن آن منابع و ارز کمیاب نگاه کنیم و اطمینان حاصل کنیم که &quot;چاله‌های منابع&quot; (resource sinks) مناسبی طراحی کرده‌اید که مستقیماً در مورد &quot;برنده شدن&quot; نیستند. ما به متغیرهای نرم موفقیت برای ارائه حداکثر مطلوبیت به بازیکن نیاز داریم.به بازی سنگ-کاغذ-قیچی (Rock-Paper-Scissors) نگاه کنید. تصور کنید ما دو ارتقاء &quot;مارمولک&quot; (lizard) و &quot;اسپاک&quot; (spock) داریم. از آنجایی که این اشکال جدید می‌توانند هم در برابر دیگران برنده شوند و هم ببازند، شانس واقعی موفقیت تصادفی بدون تغییر باقی می‌ماند. هیچ مزیت فنی وجود ندارد. با این حال، یک مزیت روانی و همچنین افزایش پیچیدگی وجود دارد که توانایی افراد را برای حدس زدن حریف خود محدود می‌کند.قانون 4: زمان‌بندی (Timing)نیازهای بازیکنان ثابت نیستند. این به ویژه در بازی‌های رایگان مهم است اما بر تمایل بازیکنان به خرید DLC در بازی‌های پرمیوم نیز تأثیر می‌گذارد. ما به عنوان توسعه‌دهنده باید در مورد چرخه عمر بازیکن و چگونگی تأثیر آن بر تمایل و علاقه بازیکنان به خرید فکر کنیم. همچنین مهم است که بازی از طریق تعامل با جامعه، رویدادها و به‌روزرسانی‌های منظم و قابل پیش‌بینی، زنده به نظر برسد.کشف: آیا بازیکن نصب و بازی خواهد کرد؟یادگیری: آیا بازیکن بازی را یاد می‌گیرد و آن را بخشی از برنامه روزانه خود می‌کند؟درگیر شدن: بازیکن به بازی متعهد است و به طور بالقوه مایل به خرج کردن است.فوق درگیر شدن بالقوه: آیا این بازیکنی است که مایل به سرمایه‌گذاری بیشتر از حد متوسط در این بازی است؟درگیر کردن مجدد: بازیکن در معرض خطر ریزش است؛ آیا می‌توانیم او را برگردانیم؟ریزش: بازیکن رفته است.اگر وضعیت بازیکن را درک کنیم، می‌توانیم در موقعیت بهتری برای درک آنچه برایشان ارزش دارد و چگونگی ارائه پیشنهاداتی که چرخه عمر و ارزش طول عمر (life-time value) آنها را افزایش می‌دهد، قرار بگیریم.قانون 5: تکرار (Repetition)اقدامات تکراری می‌توانند ذاتاً پاداش‌دهنده شوند و این همچنین می‌تواند به ایجاد عادات مثبت و همچنین ایجاد اعتماد با بازیکنان شما کمک کند که می‌توانند مطلوبیت مورد انتظار خود را از بازی شما به دست آورند. مکانیک‌های بازی بسیار تکراری برای موفقیت در کسب درآمد ضروری هستند، به خصوص در موبایل که می‌توانیم به طور مکرر در طول روز بازی کنیم.این در افزایش سریع تمایل بازیکن به خرج کردن بیشتر هرچه بیشتر با یک بازی درگیر شده باشد، منعکس می‌شود. در سال 2014 یونیتی اَدز (Unity Ads) یک نظرسنجی با 3000 شرکت‌کننده آنلاین انجام داد که همبستگی واضحی بین زمان بازی طولانی‌تر و افزایش درآمد نشان داد. این فقط خطی هم نبود.با این حال، اجتناب از خستگی بازیکن (player fatigue) نیز مهم است. این بدان معناست که به بازیکنان استراحت‌های طبیعی بدهید که در آن بتوانند بین &quot;ناامیدی&quot; و &quot;آرامش&quot;؛ از &quot;شدت&quot; به &quot;آرامش&quot; تغییر وضعیت دهند و احساس کنند که می‌توانند با دلیلی برای بازگشت بعداً از بازی جدا شوند. در غیر این صورت ممکن است خسته شوند. این می‌تواند نقش مهمی در قرار دادن و استفاده از فرمت‌های مختلف تبلیغات ایفا کند. تبلیغات مسدودکننده مانند بینابینی‌های تمام صفحه می‌توانند ناامیدکننده باشند، بنابراین در صفحاتی که بازیکن می‌تواند استراحت کند، بهترین عملکرد را دارند. از سوی دیگر، تبلیغات انتخابی کمتر ناامیدکننده هستند و ذاتاً به بازیکن در ازای درگیر شدن &quot;مطلوبیت&quot; ارائه می‌دهند، اما این یک مشکل طراحی دیگر ایجاد می‌کند. ما باید به این فکر کنیم که چه سودی برای بازیکن منطقی‌ترین است که آن تبلیغ را تماشا کند - این تقریباً گسترش تفکری است که برای IAP باید انجام دهیم.روشی که ما برای گیم‌پلی پرداخت می‌کنیم (یا زمان مبادله می‌کنیم) می‌تواند تأثیرات متفاوتی بر خستگی بازیکن داشته باشد و طیفی از کمترین تأثیر، یعنی تبلیغات برند درون بازی (In-Game-World Brand Ads) (پرداخت بر اساس بازدید)، کم‌تأثیرترین، تا ویدیوی پاداش‌دار (Rewarded Video)، ارز درون بازی (In-Game Currency)، بینابینی‌ها، IAPهای پولی و در نهایت، خرید اولیه اشتراک وجود دارد.یکی از کلیدهای حفظ علاقه در طول دوره‌های طولانی بازی، استفاده از عدم قطعیت قابل پیش‌بینی (predictable uncertainty) است. بازی The Trail از 22 Cans را در نظر بگیرید. در این بازی، آیتم‌هایی که ممکن است برای ساخت‌وساز (crafting) به آنها نیاز داشته باشیم، در فواصل زمانی ظاهراً تصادفی در طول مسیر ظاهر می‌شوند، ما فقط می‌توانیم مقدار مشخصی را در کیف خود حمل کنیم و هر بار که پیاده‌روی می‌کنیم باید تصمیم بگیریم که آیا آن آیتم‌هایی را که پیدا می‌کنیم برداریم یا خیر. اگر این کار را انجام دهیم، در معرض خطر نداشتن فضای کافی برای یک آیتم خاص که ممکن است برای پیشرفت به آن نیاز داشته باشیم، قرار می‌گیریم. قابل پیش‌بینی است که آن آیتم‌ها را دریافت خواهیم کرد؛ اما نامشخص است که چه زمانی، بنابراین بازیکن با زمانی که صرف جستجو می‌کند، سرگرم می‌شود، چه ظاهر شوند یا نه. عمل جستجو حتی اگر تکراری باشد، خسته‌کننده نمی‌شود زیرا حس پیش‌بینی برآورده نشده را حفظ می‌کند.به نظر می‌رسد بازی‌های هایپرکژوال قوانین مربوط به ناامیدی را زیر پا می‌گذارند، با این حال، این به این دلیل است که قبلاً آستانه پایینی از تعامل وجود دارد؛ نمایش تبلیغات مسلماً به نقطه آرامشی از گیم‌پلی شدید و تکراری تبدیل می‌شود.قانون 6: شواهد (Evidence)ما در مورد اهمیت داده‌ها صحبت کرده‌ایم. در اینجا مجموعه‌ای از مراحل عملی برای پیاده‌سازی تجزیه و تحلیل آورده شده است.تعریف هدف: بپرسید چرا این داده‌ها را می‌خواهید و اهداف روشنی را در مورد آنچه انتظار دارید داده‌ها به شما بگویند، تعیین کنید.شناسایی آنچه می‌توانید اندازه‌گیری کنید: شناسایی کنید که کدام نقاط داده به ما در پاسخ به سؤالات مطرح شده در اهدافمان کمک می‌کنند.شناسایی نقاط تصمیم‌گیری بازیکن: اقدامات ماشه‌ای را در بازی که نشان‌دهنده تصمیمات بازیکن هستند، شناسایی کنید.تعریف رویدادهای مشترک: چه چیزهایی را مجبور نیستیم به طور خاص جمع‌آوری کنیم و کدام نقطه داده به ما امکان مقایسه رویدادها را در سراسر بازی می‌دهد، به عنوان مثال، AnonPlayerID؛ SessionID/و غیره.شناسایی داده‌های مرجع: یعنی چه چیزهایی را مجبور نیستیم به طور خاص جمع‌آوری کنیم زیرا این نقاط داده در طول یک جلسه بازیکن تغییر نمی‌کنند (یعنی نیازی به ضبط مکرر آنها نداریم).انتخاب پلتفرم تجزیه و تحلیل خود: آیا خودتان می‌سازید یا از یک ارائه‌دهنده خارجی مانند Unity Analytics استفاده می‌کنید.بخش‌بندی داده‌های خود: گروه‌های سفارشی (custom cohorts) ایجاد کنید تا بتوانید بخش‌های مختلف مخاطبان خود یا ساخت‌های مختلف بازی خود و غیره را مقایسه کنید.ایجاد قیف‌ها، نقشه‌های حرارتی، تعریف KPIها: در صورت نیاز برای ردیابی عملکرد بازی‌های خود.ادامه تکرار و آزمایش فرآیند گزارش‌دهی و همچنین بازی خود.قانون 7: مقیاس (Scale)دردسر سازترین قانون؛ و شاید تنها قانونی که بر همه آنها حاکم است. مقیاس اهمیت دارد. ما به حجم عظیمی از بازیکنان نیاز داریم که روزانه تعداد قابل توجهی تبلیغات را تماشا کنند تا فقط از طریق تبلیغات درآمدهای قابل اندازه‌گیری ایجاد کنیم. معمولاً 30 تا 50 درصد از بازیکنان تماشای یک تبلیغ انتخابی را انتخاب می‌کنند. IAPها بسیار نادرتر هستند، اما ارزش آنها ملموس‌تر است. بازی‌های معمولی 2 تا 3 درصد از بازیکنان را می‌بینند که روی IAP از کل پایگاهی که بازی را دانلود کرده‌اند، هزینه می‌کنند. با این حال، این آمار واقعاً نکته را از دست می‌دهد. درصد افرادی که بیشترین پول را خرج می‌کنند، کسانی خواهند بود که طولانی‌ترین مدت در بازی شما باقی می‌مانند. در 30 روز انتظار داریم کمتر از 10 درصد از دانلودهای اولیه را ببینیم. اگر میانگین هزینه برای هر آیتم در بازی‌ها به اندازه 1 دلار باشد، این نیز به مقیاس بستگی دارد.مقیاس فقط مربوط به تعداد بازیکنان نیست. Puzzles and Dragons و Clash Royale به اندازه کندی کراش مخاطب ندارند اما درآمدهای هنگفتی را شاهد هستند. کلید مقیاس، جذب بازیکنان بیشتر، انجام کارهای بیشتر، بیشتر و برای مدت طولانی‌تر است. این صنعتی است که توسط جذب، حفظ و کسب درآمد هدایت می‌شود؛ اما اگر مطلوبیت، پیش‌بینی، کمیابی، زمان‌بندی، تکرار، شواهد و مقیاس را به کار بگیریم، می‌توانیم هوشمندتر باشیم.دیده شدناگر این دستورالعمل‌ها را دنبال کرده باشید، قبلاً طراحی بازی خود را به بهترین شکلی که مناسب مخاطبان شما باشد، درآورده‌اید و این خود (امیدوارم) به شما شانس مبارزه بدهد. با این حال، این به تنهایی کافی نیست. ما باید از هر مسیر ارتباطی ممکنی که می‌توانیم استفاده کنیم و این معمولاً نیاز به سرمایه‌گذاری دارد. هنوز هم ممکن است بدون صرف هزینه برای تبلیغات موفق شوید، اما باید برنده یک بلیط بخت‌آزمایی جهانی باشید. این در مورد بازی‌های موبایل و همچنین هر نوع برنامه موبایل دیگری صدق می‌کند. نکاتی در مورد نحوه بازاریابی نرم‌افزار خود را می‌توانید در فصل کسب درآمد و فصل ASO پیدا کنید. علاوه بر این، در اینجا استراتژی‌هایی وجود دارد که ممکن است بخواهید به خصوص برای بازی‌ها به آنها فکر کنید.مطبوعاتمورد توجه قرار گرفتن توسط مطبوعات می‌تواند کمک کننده باشد، به خصوص اگر در جوایز بازی مانند Big Indie Pitch پاکت گیمر (Pocket Gamer’s Big Indie Pitch)⁷ یا Indie Awards در Casual Connect⁸ شرکت کنید. اگر بتوانید توجه یوتیوبرها (YouTubers) را جلب کنید، این نیز ممکن است کمک کند. با این حال، سود این فعالیت‌ها به ندرت بر حسب دانلود اندازه‌گیری می‌شود. در عوض، آنها به شما اعتبار بیشتری می‌دهند، به خصوص در فروشگاه‌های برنامه.تبلیغاتصرف هزینه برای تبلیغات می‌تواند کمک کننده باشد، اما مهم است که بدانید با افراد زیادی و برخی بازیگران بزرگ که به دنبال مخاطبان زیادی هستند، رقابت می‌کنید. مهم است که به یاد داشته باشید هنگام ایجاد یک تبلیغ چه چیزی را می‌خواهید به دست آورید. دو انگیزه وجود دارد، ایجاد آگاهی (building awareness) و اقدام مستقیم (direct action) (یعنی دانلود بازی).در بازی‌ها ما می‌توانیم تبلیغات را در بازی‌ها و برنامه‌های دیگر در همان دستگاهی که می‌خواهیم بازیکنان بازی را تجربه کنند، قرار دهیم. هیچ چیزی بین تبلیغ و فروشگاه برنامه مانع نمی‌شود. یک کلیک و می‌توانید بازی را بخرید/دانلود کنید. این یک چیز شگفت‌انگیز است، هیچ رسانه دیگری چنین تجربه بدون اصطکاکی ندارد.نکته دیگری که باید از آن آگاه بود این است که هرچه دسترسی (محدوده بازیکنان) که به دنبال آن هستید بزرگتر باشد، هر یک از نصب‌ها گران‌تر خواهد بود. این به این دلیل است که خرید فضا در یک شبکه تبلیغاتی مبتنی بر یک فرآیند پیشنهاد قیمت (bidding process) است و نتایج بر اساس هزینه هر نصب (Cost Per Install - CPI)، هزینه هر هزار نمایش (Cost Per Mille - CPM) یا ترکیبی از این دو معروف به eCPM (effective CPM) و همچنین شبکه‌های تبلیغاتی مانند Chartboost.com یا https://www.google.com/search?q=AppFlood.com که تبلیغات متقابل (cross promotion) ارائه می‌دهند، محاسبه می‌شود.تبلیغات مبتنی بر ویدیو در حال رشد است و به بازیکن امکان می‌دهد فوراً ماهیت بازی نشان داده شده را درک کند. این اغلب، مانند یونیتی اَدز، Vungle.com و AdColony.com با مشوق‌هایی در داخل بازی - مانند ارز رایگان یا پاورآپ‌ها - ترکیب می‌شود. این نوع پاداش درون بازی با پیشنهادات خارجی خارج از پلتفرم که ممکن است در پلتفرم اپل محدود شوند، متفاوت است.رویدادهای درون بازی (In Game Events)رویدادهای منظم و ارتباط با جامعه به ما امکان می‌دهد مخاطبان خود را حفظ و رشد دهیم. با تکیه بر تجربیات اجتماعی واقعی، مانند ضبط ویدیوهای گیم‌پلی و اشتراک‌گذاری داده‌های جامعه (امتیازات بالا و غیره) بازیکنان می‌توانند از طریق فیسبوک، توییتر (Twitter)، Everyplay و یوتیوب به دوستان خود و سایر بازیکنان بالقوه دسترسی پیدا کنند.بازاریابی اینفلوئنسرها (Influencer Marketing)در سال‌های اخیر بازاریابی تأثیرگذار به طور فزاینده‌ای حرفه‌ای شده است و همکاری با شخصیت‌های یوتیوب همچنان تأثیر قابل توجهی بر پذیرش بازی‌ها، از جمله موبایل، دارد. به طور فزاینده‌ای، حتی تأثیرگذاران نسبتاً موفق نیز عواملی خواهند داشت که نه تنها از منافع آنها محافظت می‌کنند، بلکه به توسعه‌دهندگان نیز کمک می‌کنند تا با بهترین افراد برای برند بازی خود هماهنگ شوند. حتی در فرآیند طراحی بازی نیز حیاتی است که در نظر بگیرید چگونه بازیکن شما در حین بازی، برای مخاطبان خود خوب به نظر برسد. هر بازیکنی یوتیوبر نیست اما فکر کردن به تأثیر بصری تجربه به این روش، نه تنها سرگرم کردن بازیکنان شما را آسان‌تر می‌کند، بلکه به ایجاد آگاهی برای برند بازی شما نیز کمک می‌کند. هرگونه تعامل با یک یوتیوبر باید با دقت انجام شود زیرا رفتار ضعیف از طرف آنها نه تنها به شهرت خودشان آسیب می‌زند بلکه می‌تواند بر شهرت شما نیز تأثیر بگذارد - حتی اگر فقط در کوتاه‌مدت باشد.ورزش‌های الکترونیکی (eSports)در سال 2018 ورزش‌های الکترونیکی توجه نزدیک به 400 میلیون بیننده را در سراسر جهان به خود جلب کرد - و پلتفرم‌های کابلی و OTT (Over-the-Top) متوجه شدند و درآمدهای حقوق رسانه‌ای به بیش از 180 میلیون دلار رسید. کل درآمدهای ورزش‌های الکترونیکی در سال 2018 به 869 میلیون دلار رسید و طبق گزارش اکتبر 2018 گلدمن ساکس (Goldman Sachs) پیش‌بینی می‌شود تا سال 2022 بیش از سه برابر شود و به 2.96 میلیارد دلار برسد.سطح استعداد و حرفه‌ای بودن در بازار ورزش‌های الکترونیکی اکنون قابل توجه است و توسعه‌دهندگان بازی شروع به بررسی چگونگی تأثیر این امر بر طراحی بازی کرده‌اند. با این حال، هنوز هم تعداد بسیار کمی از بازی‌های موبایلی وجود دارند که می‌توانند به طور قانونی ادعا کنند که طرفداران به اندازه کافی قوی به دست آورده‌اند.به طور خلاصهدر نهایت، علی‌رغم همه تفاوت‌ها در جزئیات، موبایل مانند هر پلتفرم دیگری است. ما باید مخاطبان خود را جذب، حفظ و از آنها کسب درآمد کنیم. این تنها در صورتی اتفاق می‌افتد که بازیکنان را به روشی که برای دستگاه‌هایشان کار می‌کند، سرگرم کنیم. دستگاه‌هایی که شاید اجتماعی‌ترین و فراگیرترین دستگاه‌ها در تاریخ بشر باشند. بازی‌های موبایل علی‌رغم موانع در حال رونق هستند و درس‌های آموخته شده بر هر جنبه‌ای از توسعه بازی تأثیر خواهد گذاشت.فصل هشتم را از این جا بخوانید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Mon, 19 May 2025 22:36:12 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای توسعه‌دهندگان موبایل به سمت کهکشان: فصل ششم</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D9%81%D8%B5%D9%84-%D8%B4%D8%B4%D9%85-qewldxknldmi</link>
                <description>فصل پنجم را از این جا بخوانید.فصل ششم: وب موبایل (Mobile Web)تصویر فصل ششم کتابنویسنده: رودان اودونوگو (Ruadhan O&#x27;Donoghue)در حالی که موضوع این کتاب عمدتاً برنامه‌محور (app-oriented) است، بدون صحبت در مورد وب موبایل کامل نخواهد بود. در واقع، مرز بین برنامه‌ها و وب اغلب در اکوسیستمی که در آن برنامه‌ها می‌توانند به طور کامل با فناوری‌های وب ساخته شوند، می‌توانند داده‌ها و محتوای خود را از طریق درخواست‌های API وب دریافت کنند، یا می‌توانند به عنوان پوسته‌های برنامه ساده (app shells) برای چیزی که اساساً یک مرورگر (WebView) است عمل کنند، محو می‌شود. می‌تواند مفید باشد که به یک پیوستار وب-بومی (web-native continuum) فکر کنیم، با بومی (native) در یک انتها و وب (web) در انتهای دیگر، و مدل‌های هیبریدی (hybrid) مختلف در این بین.وب موبایل و برنامه‌های بومی اغلب به عنوان رقیب در مقابل یکدیگر قرار می‌گیرند. از بسیاری جهات اینطور است؛ اغلب هر دو رویکرد برای حل یک مشکل خاص مناسب خواهند بود. با این حال، به راحتی می‌توان در بحث‌ها گم شد؛ طرفداران قاطع و وسواسی در هر دو طرف وجود دارند. اما در حالی که برنامه‌ها و وب پلتفرم‌های رقیب هستند، این نیز درست است که آنها پلتفرم‌های مکمل (complementary platforms) هستند، که هر کدام مجموعه‌ای از نقاط قوت و ضعف خود را دارند. ما در اینجا بر روی بحث برنامه در مقابل وب تمرکز نخواهیم کرد. بلکه آنها را به عنوان فناوری‌های مکملی در نظر خواهیم گرفت که اغلب با هم تداخل دارند.با این اوصاف، با ویژگی‌های وب مدرن مانند APIهای دستگاه (Device APIs)، اعلان‌های فشاری (push notifications)، برنامه‌های قابل نصب (installable apps)، انیمیشن‌های 60 فریم در ثانیه (60 fps animations)، قابلیت کشف (discoverability)، وب موبایل یک پلتفرم هم توانا و هم قدرتمند است.استفاده از وب موبایلجهان قبلاً به نقطه عطفی رسیده است که زمان بیشتری در موبایل نسبت به دسکتاپ صرف می‌شود. و در حالی که کاربران زمان بسیار بیشتری را در برنامه‌ها نسبت به وب موبایل می‌گذرانند، فکر کردن به اینکه این تمام داستان است می‌تواند گمراه‌کننده باشد. وب موبایل مخاطبان بسیار بیشتری نسبت به برنامه‌های بومی دارد.میانگین مخاطبان ماهانه: 1000 برنامه موبایل برتر در مقابل 1000 دارایی وب موبایل برترداده‌ها از ایالات متحده، کاربران بالای 18 سال، منبع: comscore.comاکثر استراتژی‌های دیجیتال حداقل به نوعی با وب موبایل در تماس خواهند بود، اگر نگوییم آن را به طور کامل در آغوش می‌گیرند.دستگاه‌ها، مرورگرها و پراکندگیوب امروزه عمدتاً از طریق یک مرورگر (browser) در حال اجرا بر روی رایانه دسکتاپ یا دستگاه تلفن همراه تجربه می‌شود. اینجاست که کار برای توسعه‌دهندگان موبایل می‌تواند دشوار شود: اگر پیشینه توسعه وب دسکتاپ دارید و فکر می‌کردید توسعه و آزمایش برای همه مرورگرهای مختلف دسکتاپ سخت است، بهتر است بنشینید؛ اوضاع در موبایل به طور قابل توجهی پیچیده‌تر است.حداقل به همان تعداد مرورگر موبایل وجود دارد که در دسکتاپ وجود دارد. اما در موبایل، علاوه بر مرورگر روی دستگاه، باید نوع دستگاه و ویژگی‌ها و قابلیت‌های آن را نیز در نظر بگیریم. انواع ویژگی‌ها و قابلیت‌هایی که می‌توانند بر توسعه وب تأثیر بگذارند عبارتند از:ویژگی‌های اندازه صفحه مانند ابعاد فیزیکی، نسبت ابعاد (aspect ratio) و تراکم پیکسل (pixel density)انواع ورودی مانند صفحه‌کلیدها (keypads)، صفحه‌های لمسی (touchscreens)، قلم‌ها (styli)، میکروفون‌ها (microphones) و دوربین‌ها (cameras)حسگرهای فضایی مانند GPS، شتاب‌سنج‌ها (accelerometers)، قطب‌نماها (compasses) و ژیروسکوپ‌ها (gyroscopes)قابلیت‌های شبکه مانند WiFi، 3G، LTE و 5Gاین منجر به تعداد سرسام‌آوری از ترکیب‌های دستگاه-قابلیت و مرورگر می‌شود که بازدیدکنندگان شما ممکن است از آنها استفاده کنند. اگر می‌خواهید تجربه کاربری خوبی ارائه دهید، در حالت ایده‌آل می‌خواهید صفحات وب شما روی همه ترکیب‌های دستگاه-مرورگر کار کنند. این مقیاس مشکلات پراکندگی است که امروزه توسعه‌دهندگان وب با آن روبرو هستند.بالاخره مرورگر وب چیست؟مرورگر وب بخش مرکزی پلتفرم وب است. این یک نرم‌افزار پیچیده با نقش‌های متعدد است. فناوری‌های وب زیربنایی را هماهنگ می‌کند و آنها را در صفحات وب قابل استفاده ترکیب می‌کند. به عنوان یک پنجره و رابط به وب برای کاربر عمل می‌کند، اقدامات و ورودی‌های کاربر را تفسیر می‌کند و پاسخ خود را به صورت بی‌درنگ (real-time) رندر می‌کند.علاوه بر همه اینها، مرورگرهای اصلی با مجموعه‌ای از ابزارهای توسعه‌دهنده پیچیده همراه هستند که بینش‌های عمیقی را در مورد عملکرد داخلی، ساختار و عملکرد صفحات وبی که رندر می‌کند، ارائه می‌دهند. ویژگی‌های ابزار توسعه‌دهنده زیادی وجود دارد که به طور خاص به توسعه موبایل کمک می‌کند. بعداً در بخش تست (Testing) در مورد ابزارهای توسعه‌دهنده بیشتر خواهیم دید.هنگامی که یک صفحه وب می‌سازید، چیزی را برای مصرف توسط مرورگرها می‌سازید، و بنابراین باید از قابلیت‌ها، ویژگی‌های خاص و محدودیت‌های آنها، به خصوص در موبایل، آگاه باشید.مرورگرها و موتورهای رندر (Browsers and Rendering Engines)در قلب هر مرورگر، مؤلفه‌ای وجود دارد که مسئول چیدمان (laying out) و رندر کردن (rendering) محتوای یک صفحه است. این به عنوان موتور رندر (rendering engine) یا موتور چیدمان (layout engine) شناخته می‌شود.هر یک از مرورگرهای وب امروزی مبتنی بر یکی از تعداد کمی از موتورهای رندر است. دانستن اینکه یک مرورگر مبتنی بر کدام موتور رندر است می‌تواند به هدایت توسعه و آزمایش کمک کند، زیرا هر مرورگری که موتور رندر یکسانی را به اشتراک می‌گذارد اغلب به طور مشابه رفتار می‌کند: آنها به طور کلی از ویژگی‌های یکسانی پشتیبانی می‌کنند و در عین حال قربانی باگ‌های (bugs) یکسانی می‌شوند.گِکو (Gecko): یک موتور منبع باز که در مرورگر فایرفاکس (Firefox) موزیلا (Mozilla) استفاده می‌شود.وب‌کیت (WebKit): یک موتور پرکاربرد که سافاری (Safari) و همچنین تمام مرورگرهای اپ استور آی‌او‌اس و قبلاً کروم (Chrome) گوگل را قدرت می‌بخشد. توسط اپل در سال 2001 ساخته شد و در سال 2005 منبع باز شد.بلینک (Blink): در سال 2013 گوگل وب‌کیت را - که در کروم از آن استفاده می‌کرد - فورک (fork) کرد تا بلینک را ایجاد کند. بلینک اکنون کروم، اپرا (Opera)، مرورگر اج (Edge) مایکروسافت و تمام مرورگرهای مبتنی بر کرومیوم (Chromium) را قدرت می‌بخشد.پرِستو (Presto): (بازنشسته) قبلاً در اپرا استفاده می‌شد (اکنون توسط بلینک قدرت می‌گیرد) و هنوز در اپرا مینی (Opera Mini) استفاده می‌شود.اِج‌اِچ‌تی‌اِم‌اِل (EdgeHTML): (بازنشسته) قبلاً در مرورگر اج مایکروسافت استفاده می‌شد (اکنون توسط بلینک قدرت می‌گیرد).ترایدِنت (Trident): (بازنشسته) قبلاً در مرورگر بازنشسته اینترنت اکسپلورر (Internet Explorer) مایکروسافت استفاده می‌شد.برای چه مرورگرهایی باید توسعه دهید؟یکی از ثوابت وب، چشم‌انداز دائماً در حال تغییر مرورگرها است. محبوبیت مرورگر از بازاری به بازار دیگر و از مکانی به مکان دیگر متفاوت خواهد بود. شما باید از سهم بازار مرورگر در بازار هدف خود ایده داشته باشید تا بتوانید برای این مرورگرها اولویت‌بندی و بهینه‌سازی کنید. با این حال، گفته می‌شود، شما همچنین باید سعی کنید سازگاری مرورگر را در وسیع‌ترین طیف ممکن از مرورگرها به حداکثر برسانید، زیرا، به جز در شرایط بسیار محدود یا مقید، از قبل نمی‌دانید کاربر از چه مرورگر یا دستگاهی استفاده خواهد کرد.سهم بازار مرورگر موبایل در سراسر جهان ژوئن 2018-ژوئن 2019 منبع: gs.statcounter.comگزارش‌هایی مانند گزارش هوش وب موبایل DeviceAtlas (Mobile Web Intelligence Report) به صورت دوره‌ای تصاویری از چشم‌انداز دستگاه و مرورگر ارائه می‌دهند، داده‌های جالب سهم بازار مانند محبوب‌ترین سیستم‌عامل‌ها، تولیدکنندگان و اندازه‌های صفحه را برجسته می‌کنند و می‌توانند به هدایت تصمیمات مربوط به مرورگرها و هدف‌گیری مرورگر کمک کنند.اچ‌تی‌ام‌ال، سی‌اس‌اس و جاوااسکریپت: بلوک‌های سازنده وبتا اینجا فقط دستگاه‌ها و مرورگرها را پوشش داده‌ایم. اکنون بیایید به فناوری‌هایی که برای رندر کردن صفحات وب برای ما استفاده می‌شوند نگاه کنیم: HTML، CSS و جاوااسکریپت (JavaScript).زبان نشانه‌گذاری HTML: ساختاردهی محتوای وباچ‌تی‌ام‌ال زبان نشانه‌گذاری (markup language) وب است. برای ساختاردهی محتوای یک صفحه وب استفاده می‌شود. تغییرات زیادی در طول سال‌ها پدید آمده است. زبان‌های نشانه‌گذاری اولیه موبایل شامل WML و XHTML Mobile Profile هستند. جدیدترین تکرار، HTML5، به اندازه کافی بالغ شده است تا شامل نشانه‌گذاری معنایی (semantic markup)، عناصر سفارشی (custom elements) و APIهای دستگاه باشد و به خوبی در مرورگرهای وب موبایل پشتیبانی می‌شود.شیوه‌نامه‌ی CSS: استایل‌دهی محتوای وبسی‌اس‌اس مخفف Cascading Stylesheets (شیوه‌نامه‌های آبشاری) است و برای استایل‌دهی و چیدمان محتوای وب استفاده می‌شود. قوانین CSS ویژگی‌های مختلفی مانند رنگ را با هدف قرار دادن آن عناصر با یک انتخابگر (selector) به عناصر اعمال می‌کنند. انتخابگرها به شما امکان می‌دهند هر عنصر یا گروهی از عناصر را در یک صفحه مشخص کنید، به طوری که کنترل کاملی داشته باشید: CSS می‌تواند برای کارهای کوچک استایل‌دهی مانند تنظیم رنگ متن، تا کارهای بزرگ چیدمان که بر کل چیدمان صفحه تأثیر می‌گذارند، استفاده شود.سی‌اس‌اس مشخصات متعددی را پشت سر گذاشته است و به ماژول‌های (modules) زیادی تقسیم شده است که هر کدام مشخصات خاص خود را دارند و جنبه‌های متنوعی از CSS از انتخابگرها گرفته تا تبدیل‌ها و انیمیشن‌های سه بعدی (3D transformations and animations) را پوشش می‌دهند. CSS به اندازه‌ای پیشرفته شده است که اغلب می‌تواند تجربیات تعاملی کافی را بدون نیاز به جاوااسکریپت ارائه دهد. به طور کلی، برای عملکرد، باید در صورت امکان CSS را به جای جاوااسکریپت برای پیاده‌سازی تعاملات و انیمیشن‌ها انتخاب کنید.جاوااسکریپت: اسکریپت‌نویسی سمت کلاینت (Client-side Scripting)جاوااسکریپت یک لایه برنامه‌نویسی به وب اضافه می‌کند. برای آوردن تعاملات، انیمیشن‌ها و عملکردهای پیچیده‌تر به وب استفاده می‌شود و می‌توان از آن برای ساخت برنامه‌های وب و بازی‌ها استفاده کرد. جاوااسکریپت که در ابتدا فقط یک زبان اسکریپت‌نویسی سمت کلاینت بود، با تکامل مشخصات زیربنایی ECMA­Script خود، در طول سال‌ها رشد کرده و بالغ شده است. اکنون توسط یک جامعه عظیم و پر جنب و جوش و انبوهی از ابزارهای توسعه پشتیبانی می‌شود و به عنوان یک زبان برنامه‌نویسی اعتبار کسب کرده است و از طریق Node.js به عنوان یک زبان سمت سرور (server-side language) نیز در دسترس قرار گرفته است.هزاران کتابخانه جاوااسکریپت برای استفاده توسعه‌دهندگان منتشر شده است، و همچنین چارچوب‌های کامل فرانت‌اند (front-end frameworks) برای ساخت کل برنامه‌های وب، مانند Angular.js، React.js و Vue.js.کتابخانه‌ها و چارچوب‌های جاوااسکریپت می‌توانند منبع اصلی نفخ صفحه (page bloat) باشند که باعث عملکرد ضعیف و UX بد، به خصوص در موبایل می‌شوند. بنابراین، توسعه‌دهنده موبایل همیشه باید از افزودن کتابخانه‌های جاوااسکریپت به یک پروژه بدون دلیل خوب، محتاط باشد. بعداً در مورد عملکرد وب موبایل بیشتر خواهیم دید.اچ‌تی‌ام‌ال 5اچ‌تی‌ام‌ال 5 جدیدترین نسخه اصلی HTML است و با پشتیبانی خوب در موبایل، ویژگی‌های بسیاری را به ارمغان می‌آورد که تجربه کاربری وب موبایل را افزایش می‌دهد. اما اصطلاح HTML5 به چیزی بیش از زبان نشانه‌گذاری HTML اشاره دارد؛ همچنین به مشخصات فناوری وب مرتبط اشاره دارد که شامل CSS3 و بسیاری از APIهای مفید جاوااسکریپت است.از جمله APIهای جاوااسکریپت موجود در HTML5، ویژگی‌های مفید مرورگر مانند عنصر Canvas، رویدادهای لمسی (Touch Events) و ذخیره‌سازی وب (Web Storage) هستند، که تنها چند مورد را نام بردیم. آنها همچنین شامل APIهای دستگاه یا سخت‌افزار هستند که به ویژه در زمینه وب موبایل مفید هستند. APIهای دستگاه به مرورگر امکان دسترسی و کنترل ویژگی‌های سخت‌افزاری خاص دستگاه مانند دوربین، شتاب‌سنج و حسگر GPS را می‌دهند.اچ‌تی‌ام‌ال 5 مرورگر را به برابری ویژگی‌ها با برنامه‌های بومی نزدیک‌تر می‌کند—چیزهایی که زمانی فقط از طریق برنامه‌های بومی امکان‌پذیر بودند، اکنون با وب امکان‌پذیر هستند. با APIهای مبتنی بر مکان (location-based APIs) برنامه‌های وب می‌توانند بدانند دستگاه کاربر کجاست؛ از طریق APIهای حسگر (sensor APIs) می‌توانند به تصاویر دوربین و جهت‌یابی قطب‌نما دسترسی داشته باشند؛ با APIهای ذخیره‌سازی و کش (storage and caching APIs) می‌توانند به صورت آفلاین کار کنند. وب‌سایت‌ها حتی می‌توانند اعلان‌های فشاری انتخابی (opt-in push notifications) را برای کاربران ارسال کنند، حتی زمانی که وب‌سایت در مرورگر باز نیست. با HTML5، تجربه وب بسیار غنی‌تر شد.برخی از جالب‌ترین APIهای HTML5 از دیدگاه موبایل در زیر شرح داده شده‌اند.ای‌پی‌آی Geolocation API: این API دسترسی به قابلیت‌های موقعیت‌یابی جغرافیایی (geolocation) یک دستگاه را فراهم می‌کند، که می‌تواند شامل داده‌های مکان دقیق بر اساس حسگرهای دستگاه باشد. مکان می‌تواند بر اساس حسگرهای موجود دستگاه باشد و شامل روش‌های GPS، A-GPS، Wi-Fi و مثلث‌سازی مبتنی بر سلول (cell-based triangulation) است. داده‌های عرض جغرافیایی، طول جغرافیایی، ارتفاع، جهت (heading) و سرعت توسط API در معرض دید قرار می‌گیرند.ای‌پی‌آی Device Orientation API: مانند Geolocation API، این API اطلاعاتی در مورد رابطه فیزیکی دستگاه با جهان را برمی‌گرداند. در حالی که Geolocation API به مکانی در فضا مربوط می‌شود، Device Orientation API به جهت‌گیری (orientation) مربوط می‌شود. اطلاعات بر اساس حسگرهای جهت‌گیری مانند قطب‌نما، ژیروسکوپ و شتاب‌سنج است. داده‌های در معرض دید شامل جهت‌گیری در سه محور، شتاب و اطلاعات نرخ چرخش (rotation rate) است.ای‌پی‌آی Service Workers: سرویس ورکرها (Service workers) به صفحات وب اجازه می‌دهند اسکریپت‌ها را در پس‌زمینه اجرا کنند. آنها می‌توانند به عنوان یک سرور پراکسی (proxy server) برای صفحات وب عمل کنند، درخواست‌ها را رهگیری کرده و پاسخ‌ها را تولید کنند، و بنابراین قابلیت‌های آفلاین، همگام‌سازی پس‌زمینه (background syncing) و اعلان‌های فشاری را تسهیل می‌کنند.ای‌پی‌آی Push API: به صفحات وب اجازه می‌دهد پیام‌های فشاری دریافت کنند.ای‌پی‌آی Notifications API: به یک برنامه وب اجازه می‌دهد اعلان‌های شبیه به بومی (native-like notifications) را نمایش دهد. همراه با Push API و سرویس ورکرها، برنامه‌های وب می‌توانند اعلان‌های فشاری ناهمزمان (asynchronous push notifications) را به یک دستگاه ارسال و دریافت کنند.ای‌پی‌آی Web Payments API: وارد کردن اطلاعات پرداخت کارت اعتباری همیشه یک کار طاقت‌فرسا در وب بوده است، اما به خصوص در موبایل که ورودی دشوارتر است. Web Payments API قصد دارد این مشکل را حل کند، در حالی که همزمان نیاز به اشتراک‌گذاری جزئیات پرداخت شما با هر سایت تجارت الکترونیک شخص ثالث با اعتبار نامشخص را از بین می‌برد.ای‌پی‌آی Touch Events API &amp; Pointer Events API: اینها دو API مبتنی بر ورودی صفحه لمسی هستند که اطلاعاتی در مورد لمس‌ها، کشیدن‌ها (swipes) و غیره ارائه می‌دهند.ای‌پی‌آی WebRTC and media capture and recording APIs: به صفحات وب اجازه می‌دهد با حسگرهای رسانه‌ای دستگاه مانند میکروفون و دوربین برای ضبط، پخش جریانی (stream) و ضبط صدا و ویدئو تعامل داشته باشند.رویکردها به توسعه وب مدرنشیوه‌های توسعه وب مدرن باید دستگاه‌های تلفن همراه را در خود جای دهند و به مسائل پراکندگی که توسعه‌دهندگان وب موبایل با آن روبرو هستند، رسیدگی کنند. چندین رویکرد متمایز در سال‌های اخیر پدید آمده است.طراحی وب واکنش‌گرا (Responsive Web Design - RWD)طراحی وب واکنش‌گرا (RWD) رویکردی به طراحی وب است که صفحات وب مستقل از وضوح (resolution-independent) را ارائه می‌دهد—یعنی صفحات انعطاف‌پذیری که در اکثر اندازه‌های صفحه، از مرورگرهای دسکتاپ گرفته تا دستگاه‌های تلفن همراه با صفحه کوچک و هر چیزی در این بین، به خوبی کار می‌کنند. این بر اساس سه تکنیک است:یک شبکه انعطاف‌پذیر (flexible grid): تضمین می‌کند که چیدمان صفحه با وضوح صفحه مقیاس‌پذیر باشد، به جای استفاده از ابعاد ثابت.تصاویر انعطاف‌پذیر (flexible images): تصاویری که در یک شبکه انعطاف‌پذیر مقیاس‌پذیر خواهند بود.پرس‌وجوهای رسانه‌ای CSS (CSS media queries): قوانین CSS را بر اساس نقاط شکست (breakpoints) به محدوده‌های متمایز وضوح یا کلاس‌های دستگاه اعمال می‌کند.آر.دبلیو.دی محبوب شد زیرا انتظار می‌رفت یک صفحه HTML واحد که به این روش طراحی شده است، در طیف گسترده‌ای از دستگاه‌ها عملکرد نسبتاً خوبی داشته باشد. اساساً یک راه‌حل یکسان برای همه (one-size-fits-all) است که مزایا و معایبی دارد:مزایااستقلال از وضوح می‌تواند به معنای زمان کمتر برای پیاده‌سازی و نگهداری باشد.نیازی به نگهداری و ارائه نسخه‌های جداگانه برای کلاس‌های مختلف دستگاه نیست.ویژگی‌های مرورگر را می‌توان در سمت کلاینت شناسایی کرد.معایبفقط به استقلال از وضوح دست می‌یابد، اما نه تطبیق محتوا (content adaptation)، بنابراین محتوا برای همه دستگاه‌ها بهینه نشده است.بایت‌های بیشتری از حد لازم می‌توانند به دستگاه ارسال شوند که می‌تواند بر عملکرد تأثیر بگذارد.می‌تواند در دستگاه‌های پایین‌رده (low-end devices) عملکرد ضعیفی داشته باشد یا اصلاً کار نکند زیرا همان محتوا به هر دو دستگاه دسکتاپ و موبایل تحویل داده می‌شود.بهبود پیشرونده (Progressive Enhancement)بهبود پیشرونده تکنیکی است که از سال 2003 وجود داشته است. ایده این است که شما با یک صفحه پایه حداقلی که به هر دستگاه ارسال می‌شود، همراه با مقداری منطق بهبود جاوااسکریپت شروع می‌کنید. یک دستگاه پایین‌رده ممکن است بهبودها را نادیده بگیرد یا نتواند اجرا کند، اما همچنان یک تجربه عملکردی را برای کاربر ارائه می‌دهد. گوشی‌های هوشمند، تبلت‌ها و مرورگرهای دسکتاپ توانمندتر، بهبودهای جاوااسکریپت را به تدریج اجرا می‌کنند تا زمانی که صفحه به سطح بهینه‌ای برای دستگاه ساخته شود. این رویکرد در تقابل با ایده تنزل تدریجی (graceful degradation) قرار دارد، که در آن ابتدا عملکرد غنی ساخته می‌شود و سپس استثناها اضافه می‌شوند. این نیاز به کار اضافی دارد تا اطمینان حاصل شود که یک صفحه در غیاب هر گونه ویژگی پشتیبانی نشده، همچنان عملکردی است.در عمل، باید بهبود پیشرونده را به عنوان تکنیکی در نظر بگیرید که می‌تواند برای هموار کردن تفاوت‌ها در طیف وسیعی از دستگاه‌های تلفن همراه استفاده شود، نه به عنوان یک رویکرد کلی.مزایادر تئوری، محدودیتی برای ویژگی‌هایی که می‌توان به تدریج اضافه کرد وجود ندارد.می‌تواند طیف کاملی از دستگاه‌ها از پایین‌رده تا بالارده و دسکتاپ را پوشش دهد.معایباستفاده از یک پایه واحد برای همه دستگاه‌ها می‌تواند محدودکننده باشد.جاوااسکریپت بهبود پیشرونده واقعی زمان می‌برد تا اجرا شود و می‌تواند بر عملکرد تأثیر بگذارد.طراحی واکنش‌گرای موبایل-اول (Mobile-First Responsive Design)آر.دبلیو.دی موبایل-اول از اصول طراحی RWD و تکنیک‌های بهبود پیشرونده پیروی می‌کند. در این رویکرد، طراحی با یک نسخه بهینه‌سازی شده برای موبایل شروع می‌شود و از آنجا به بالا ساخته می‌شود.مزایادسترسی را نسبت به RWD خالص افزایش می‌دهد زیرا احتمال کارکرد آن در دستگاه‌های پایین‌رده بیشتر است.طراحان را مجبور می‌کند بر روی محتوا و عملکرد تمرکز کنند، و تعریف سلسله مراتب محتوا (content hierarchy) را با مهم‌ترین محتوا در بالا آسان‌تر می‌کند.معایباز همان مشکلات RWD رنج می‌برد.ممکن است نیاز به طراحی مجدد کامل سایت موجود داشته باشد، اگر سایت موجود از این رویکرد پیروی نکند.طراحی وب تطبیقی (تطبیق سمت سرور)تطبیق سمت سرور³ از یک راه‌حل تشخیص دستگاه (device detection solution) در سرور برای نگاشت هدرهای درخواست (request headers) دستگاه به پایگاه داده‌ای از قابلیت‌های دستگاه استفاده می‌کند. هنگامی که قابلیت‌های دستگاه مشخص شد، می‌توان صفحه‌ای را متناسب با قابلیت‌های دستگاه ساخت که منجر به صفحات بسیار بهینه می‌شود. راه‌حل‌های پیشرو شامل DeviceAtlas و ScientaMobile هستند.گاهی اوقات به عنوان &quot;تشخیص مرورگر&quot; (browser-sniffing) شناخته می‌شود، اثربخشی این تکنیک در پذیرش آن توسط اکثر برندهای بزرگ اینترنتی که حضور وب خود را جدی می‌گیرند، از جمله گوگل، آمازون، یوتیوب، فیسبوک و ای‌بی (Ebay)، مشهود است.(³ تعاریف مختلفی از طراحی وب تطبیقی وجود دارد؛ در اینجا منظور ما این است که برخی بهینه‌سازی‌های دستگاه در سمت سرور انجام می‌شود.)مزایادانستن قابلیت‌های یک دستگاه به این معنی است که می‌توان صفحات بسیار بهینه‌سازی شده را برای کلاس‌های مختلف دستگاه ارائه داد.بسیار قابل اعتماد و دقیق: راه‌حل‌های خوب دقت تشخیص دستگاه بیش از 99.5٪ را گزارش می‌دهند.عملکرد عالی زیرا صفحات را می‌توان برای دستگاه‌ها دقیق تنظیم کرد.معایبشامل توسعه و نگهداری الگوهای صفحه مختلف برای کلاس‌های مختلف دستگاه است.پایگاه داده قابلیت‌های User-Agent باید با دستگاه‌های جدید به‌روز شود.اکثر راه‌حل‌ها تجاری هستند.آر.ای.اس.اس: یک رویکرد ترکیبی (RESS: A Hybrid Approach)آخرین رویکردی که باید در نظر گرفت RESS (طراحی واکنش‌گرا با مؤلفه‌های سمت سرور - REsponsive design with Server Side components) است. RESS رویکردهای تطبیقی و واکنش‌گرا را ترکیب می‌کند تا راه‌حلی را ارائه دهد که بهترین‌های هر دو را ترکیب می‌کند. با استفاده از تطبیق سمت سرور، یک صفحه اولیه برای طیف وسیعی از دستگاه‌ها یا دسته دستگاه بهینه می‌شود. سپس، در هر دسته، محتوا را می‌توان با استفاده از تکنیک‌های واکنش‌گرا بیشتر در سمت کلاینت تطبیق داد. این رویکرد را می‌توان حتی بیشتر پیش برد، به طوری که ویژگی‌های به دست آمده از مرورگر می‌توانند به سرور بازخورد داده شوند تا تطبیق سرور را بیشتر تنظیم کنند.مزایابیشترین انعطاف‌پذیری و بالاترین درجه بهینه‌سازی را از بین همه راه‌حل‌ها ارائه می‌دهد.مزایای تطبیق سمت سرور با عملکرد بالا، همراه با توانایی تنظیم دقیق با ویژگی‌های به دست آمده در سمت کلاینت.معایبپیاده‌سازی دشوار، نیاز به پایگاه داده دستگاه.برای به دست آوردن بیشترین سود، نیاز به رفت و برگشت کامل (Full round-trip) است.برنامه‌های هیبریدی (Hybrid Apps)دسته دیگری از برنامه‌های کاربردی وب که ارزش ذکر کردن را دارد، برنامه‌های هیبریدی هستند. اینها اغلب، اما نه لزوماً، با فناوری‌های وب، HTML، جاوااسکریپت و CSS ساخته می‌شوند. برنامه‌های هیبریدی به عنوان برنامه‌های بومی کامپایل و بسته‌بندی می‌شوند و در فروشگاه‌های برنامه بومی توزیع می‌شوند. آنها مانند برنامه‌های بومی نصب می‌شوند، اما اساساً در داخل برنامه‌های وب هستند. به طور کلی، آنها از یک نمای وب تمام صفحه (full screen webview) یا یک پوسته برنامه بومی نازک و یک نمای وب تشکیل شده‌اند. نمای وب کار سنگین رندر کردن برنامه وب را انجام می‌دهد، در حالی که کتابخانه بومی به APIهای بومی و سخت‌افزار دسترسی می‌دهد.این رویکرد برای بسیاری جذاب است زیرا امکان استفاده از دانش توسعه وب برای برنامه‌های بومی بدون نیاز به یادگیری توسعه پلتفرم بومی وجود دارد. چارچوب‌های مختلف توسعه برنامه هیبریدی برای کمک به توسعه‌دهنده وجود دارد، از جمله آپاچی کوردوا و فون‌گپ، و ری‌اکت نیتیو. جدیدترین چارچوبی که در سال 2017 وارد این فضا شد، فلاتر (Flutter) گوگل است. این چارچوب که خود را به عنوان &quot;یک جعبه ابزار رابط کاربری برای ساخت برنامه‌های زیبا و کامپایل شده بومی برای موبایل، وب و دسکتاپ از یک پایگاه کد واحد&quot; توصیف می‌کند، در بین توسعه‌دهندگان بسیار محبوب شده است.امکان داشتن برنامه‌ای وجود دارد که با فناوری‌های وب ساخته شده باشد، اما برای پلتفرم به کد بومی کامپایل شود، به عنوان مثال با ری‌اکت نیتیو. مگر اینکه این برنامه از نمای وب استفاده کند، واقعاً یک برنامه هیبریدی نیست، حداقل به معنای سنتی. ری‌اکت نیتیو اساساً مرزهای آنچه به عنوان یک برنامه هیبریدی در نظر گرفته می‌شود را جابجا می‌کند. با ری‌اکت نیتیو، برنامه‌ها به کد بومی برای هر پلتفرم، آی‌او‌اس و اندروید، کامپایل می‌شوند و ویجت‌ها (widgets) به عنوان ویجت‌های پلتفرم بومی رندر می‌شوند، در حالی که برنامه‌های کوردوا/فون‌گپ از نماهای وب برای رندر کردن محتوای وب در یک پوسته برنامه بومی استفاده می‌کنند.برای اطلاعات بیشتر در مورد برنامه‌های هیبریدی و چند پلتفرمی، به فصل مربوط به برنامه‌های چند پلتفرمی مراجعه کنید.مزایاچند پلتفرمی: یک پوسته برنامه بومی از نمای وب برای رندر کردن محتوا از یک بک‌اند محتوای مبتنی بر وب استفاده می‌کند.نیازی به دانش توسعه عمیق چندین پلتفرم بومی نیست.توسعه و نگهداری آسان‌تر از برنامه‌های بومی متمایز برای هر پلتفرم بومی.استفاده از یک بک‌اند راه دور به این معنی است که برنامه را می‌توان بدون نیاز به ارسال مجدد به فروشگاه‌های برنامه به‌روز کرد.معایبعملکرد به خوبی یک برنامه بومی برای برنامه‌های کاربردی سنگین نیست.UX ممکن است به اندازه یک برنامه بومی کامل صیقلی نباشد، زیرا برای برآورده کردن محدودیت‌های چند پلتفرمی سازش‌هایی انجام می‌شود.برنامه‌های وب پیشرونده (Progressive Web Apps - PWAs)برنامه وب پیشرونده (PWA) اصطلاحی است که برای توصیف برنامه‌های وبی استفاده می‌شود که از ویژگی‌های مرورگر مدرن برای ارائه تجربیات غنی شبیه به برنامه استفاده می‌کنند. این اصطلاح اولین بار توسط الکس راسل (Alex Russell) در سال 2015 برای توصیف برنامه‌های وبی ابداع شد که معیارهای زیر را نشان می‌دهند:پیشرونده (Progressive): روی همه دستگاه‌ها کار می‌کنند و عملکرد به تدریج افزایش می‌یابد.واکنش‌گرا (Responsive): چیدمان انعطاف‌پذیر است و می‌تواند با فرم فاکتور دستگاه به طور مناسب تنظیم شود.مستقل از اتصال (Connectivity-independent): تحت شرایط شبکه ضعیف و حتی آفلاین کار خواهند کرد.شبیه به برنامه (App-like): مانند یک برنامه احساس می‌شود، با یک پوسته برنامه (app-shell) و عمدتاً بدون تازه‌سازی کامل صفحه (full page refreshes).تازه (Fresh): هر زمان که ممکن باشد محتوای جدید را دریافت می‌کند.امن (Secure): از طریق HTTPS ارائه می‌شود.قابل کشف (Discoverable): به عنوان یک برنامه قابل شناسایی است در حالی که توسط موتورهای جستجو در وب نیز قابل ایندکس شدن (indexable) است.قابل تعامل مجدد (Re-engageable): تعامل مجدد را با ویژگی‌هایی مانند اعلان‌های فشاری تحریک می‌کند.قابل نصب (Installable): می‌توان به صفحه اصلی (home screen) دستگاه اضافه کرد.پی.دبلیو.ای‌ها امکان‌پذیر هستند زیرا پلتفرم وب به اندازه کافی بالغ شده است تا چنین تجربیاتی را ارائه دهد. همانطور که در بالا ذکر شد، چندین API کلیدی HTML5، PWAها را امکان‌پذیر می‌کنند که از ویژگی‌هایی پشتیبانی می‌کنند که قبلاً فقط در برنامه‌های بومی یافت می‌شدند.با افزودن سافاری در سال 2018، PWAها اکنون در تمام سیستم‌عامل‌های اصلی دسکتاپ و موبایل پشتیبانی می‌شوند. پشتیبانی ویندوز 10، 700 میلیون کاربر فعال ماهانه را به 2.5 میلیارد دستگاه اندروید و 1.3 میلیارد دستگاه آی‌او‌اس که از PWAها پشتیبانی می‌کنند، اضافه می‌کند.پی.دبلیو.ای‌ها اکنون همچنین می‌توانند در هر یک از فروشگاه‌های اصلی برنامه پلتفرم منتشر شوند. این برای فروشگاه گوگل پلی و فروشگاه ویندوز مایکروسافت ساده‌تر از آی‌او‌اس است. برای اپ استور آی‌او‌اس، PWA قبل از ارسال باید از یک پوسته بومی مانند کوردوا استفاده کند.صفحات موبایل شتاب‌یافته (Accelerated Mobile Pages - AMP)پروژه AMP¹¹ گوگل یک فرمت انتشار مبتنی بر یک چارچوب مؤلفه‌های وب منبع باز با تأکید بر عملکرد است. AMP در ابتدا به عنوان پاسخی به پروژه‌های مقالات فوری (Instant Articles) فیسبوک و اخبار (News) اپل تصور شد، و بنابراین در ابتدا تأکید بر محتوای خبری و سبک وبلاگ بود. با این حال، از زمان راه‌اندازی آن در سال 2015، برای پشتیبانی از طیف بسیار گسترده‌تری از محتوا، با ویژگی‌های تعاملی مانند چرخ فلک‌ها (carousels)، گالری‌های تصاویر، منوهای تعاملی، و یک مدل برنامه‌نویسی که از ویژگی‌های پیچیده تجارت الکترونیک پشتیبانی می‌کند، تکامل یافته است.در ابتدا، AMP به عنوان پاسخی به عملکرد ضعیف صفحات موبایل ساخته شد و طوری طراحی شد که دانلود صفحه کمتر از 1 ثانیه طول بکشد. نام آن این تمرکز بر موبایل را منعکس می‌کرد و مخفف صفحات موبایل شتاب‌یافته (Accelerated Mobile Pages) بود. با گسترش تمرکز آن، تیم AMP مخفف را حذف کرده است، به طوری که پروژه به سادگی AMP نامیده می‌شود و صفحات موبایل شتاب‌یافته دیگر استفاده نمی‌شوند.ای.ام.پی دقیقاً چیست؟سه بخش وجود دارد که AMP را تشکیل می‌دهند:بخش AMP-HTML: نوعی از HTML5 که هم تگ‌هایی را که می‌توانید استفاده کنید محدود می‌کند و هم برخی تگ‌های جدید اضافه می‌کند.بخش AMP-JS: یک کتابخانه جاوااسکریپت که به عنوان زمان اجرای AMP (AMP runtime) عمل می‌کند و بارگیری و رندر بهینه صفحات AMP را هماهنگ می‌کند.بخش AMP-CACHE: یک کش ویژه برای صفحات AMP که امکان رندر فوری صفحات AMP را در برخی موارد فراهم می‌کند.شروع کار با AMP خیلی دشوار نیست زیرا صفحات AMP اساساً HTML هستند. هر صفحه AMP با مقداری کد بویلرپلیت (boilerplate code) استاندارد شروع می‌شود که شامل زمان اجرای AMP-JS است. هنگامی که زمان اجرای AMP صفحه AMP-HTML را تجزیه (parse) می‌کند و با هر مؤلفه AMP مواجه می‌شود، نشانه‌گذاری تولید شده را به DOM تزریق می‌کند تا جایگزین نشانه‌گذاری AMP-HTML شود؛ این چیزی است که در مرورگر رندر می‌شود.صفحات AMP کانونیکال (Canonical AMP Pages)تمام صفحات AMP معتبر باید شامل یک تگ پیوند کانونیکال (canonical link tag) باشند که به نسخه غیر AMP صفحه، در صورت وجود، اشاره می‌کند. اگر معادل غیر AMP وجود نداشته باشد، پیوند کانونیکال باید به خود اشاره کند. این یک صفحه AMP کانونیکال است—یک صفحه AMP مستقل که هم به عنوان صفحه وب موبایل و هم دسکتاپ عمل می‌کند. از آنجایی که AMP از طراحی واکنش‌گرا و پرس‌وجوهای رسانه‌ای پشتیبانی می‌کند، می‌تواند به طور واکنش‌گرا برای پشتیبانی از ویوپورت‌های (viewports) بزرگ یا کوچک در صورت نیاز، مقیاس‌پذیر باشد.ترکیب AMP و PWAهاای.ام.پی و PWAها دارای نقاط قوت مکمل و نقاط ضعف متفاوتی هستند. بنابراین طبیعی است که ترکیبی از این دو را در نظر بگیریم. چندین الگوی مختلف شناسایی شده‌اند که سرعت AMP را با غنای PWAها ترکیب می‌کنند:الگوی AMP به عنوان PWA (AMP as PWA): در این الگو، صفحه AMP همان PWA است. از کتابخانه AMP استفاده می‌کند، به طوری که یک صفحه AMP معتبر می‌تواند از کش AMP ارائه شود و منجر به صفحات بسیار سریع شود. با این حال، هنگامی که پیوندها دنبال می‌شوند، کاربر به سرور اصلی هدایت می‌شود، جایی که اکنون می‌توان از یک سرویس ورکر استفاده کرد.الگوی AMP راه‌انداز PWA (AMP bootstraps PWA): در این مدل، صفحه AMP از یک مؤلفه ویژه، &lt;amp-install-serviceworker&gt;، برای نصب یک سرویس ورکر در پس‌زمینه روی دستگاه کاربر استفاده می‌کند. سپس سرویس ورکر می‌تواند با دانلود و کش کردن بخش‌های اولیه PWA، PWA را راه‌اندازی کند، به طوری که وقتی کاربر پیوندی را به PWA کامل دنبال می‌کند، قبلاً دانلود شده و آماده نمایش است.داده‌های AMP تعبیه شده در PWA (AMP data embedded in PWA): در این الگو، صفحات AMP به عنوان بک‌اند محتوا، در یک پوسته PWA استفاده می‌شوند.وب فیزیکی (The Physical Web)وب فیزیکی، یک پروژه منبع باز است که هدف آن فعال کردن تعاملات سریع و یکپارچه با اشیاء و مکان‌های فیزیکی، از طریق بیکن‌های بلوتوث (Bluetooth beacons) است. اپل فناوری بیکن بلوتوث اختصاصی خود را به نام آی‌بیکن (iBeacon) دارد. آی‌بیکن با وب فیزیکی متفاوت است زیرا آی‌بیکن‌ها برنامه‌ها را فعال می‌کنند، در حالی که بیکن‌های وب فیزیکی URLهای وب را فعال می‌کنند.بزرگترین مزیت وب فیزیکی نسبت به آی‌بیکن‌ها این است که نیازی به برنامه نیست، در حالی که قبل از تعامل با آی‌بیکن باید برنامه‌ای نصب شده باشد. این به طور قابل توجهی مانع استفاده از وب فیزیکی را کاهش می‌دهد و دسترسی آن را، بدون هیچ گونه تنظیمات قبلی، به میلیاردها دستگاه مجهز به بلوتوث افزایش می‌دهد.شروع کار با وب فیزیکی به طرز شگفت‌آوری آسان است. فقط یک بیکن تهیه کنید، آن را طوری تنظیم کنید که به یک URL اشاره کند، تمام شد! سپس کاربرانی که دستگاه‌های مجهز به بلوتوث سازگار دارند، هنگامی که در نزدیکی هستند، اعلان‌هایی دریافت خواهند کرد. این یک ایده ساده است که طیف گسترده‌ای از برنامه‌های کاربردی مانند ماشین‌های فروش هوشمند (smart vending machines) و بازاریابی هدفمند در فضاهای فیزیکی را امکان‌پذیر می‌کند.گوگل همچنین یک پلتفرم بیکن پیچیده‌تر با مدیریت ابری راه دور بیکن‌ها دارد که می‌تواند مقیاس‌پذیری و مزایای دیگری را برای استقرارهای بزرگ بیکن ارائه دهد.عملکرد وب و چرایی اهمیت آناکثر توسعه‌دهندگان به طور شهودی می‌دانند که عملکرد وب مهم است؛ هیچ کس دوست ندارد منتظر بارگذاری یک صفحه بماند. اما داده‌های تجربی زیادی برای اثبات حیاتی بودن عملکرد، به خصوص در موبایل، وجود دارد:آزمایش‌های والمارت (Walmart) نشان داد که به ازای هر 1 ثانیه بارگذاری سریع‌تر صفحه، 2٪ افزایش در نرخ تبدیل وجود دارد.تحقیقات آمازون نشان داد که افزایش 100 میلی‌ثانیه‌ای تأخیر منجر به 1٪ فروش کمتر می‌شود.مطالعه‌ای توسط گوگل گزارش داد که 53٪ از بازدیدکنندگان قبل از بارگذاری صفحه اگر بیش از 3 ثانیه طول بکشد، آن را ترک خواهند کرد.بسته به گزارشی که می‌خوانید، اگر سایت شما کند باشد، بیش از نیمی از بازدیدکنندگان خود را از دست خواهید داد؛ آنها فقط منتظر بارگذاری آن نخواهند ماند و شما فرصتی برای نشان دادن آنچه ارائه می‌دهید نخواهید داشت. شما مخاطبان سختی برای راضی کردن دارید و تنها راه موفقیت، ارائه یک تجربه کاربری خوب است؛ و برای انجام این کار، باید یک سایت سریع ارائه دهید.برای نشان دادن این موضوع، در اینجا چند آمار در مورد کاهش سرعت صفحه بر نرخ پرش (bounce rates) آورده شده است:تأثیر کاهش سرعت صفحه بر نرخ پرش (بر اساس نوع دستگاه) منبع: blogs.akamai.comاهداف عملکرد ایده بودجه عملکرد (performance budget) چند سالی است که وجود دارد؛ در طول برنامه‌ریزی، &quot;بودجه‌ای&quot; برای جنبه‌های مختلف نحوه عملکرد یک صفحه تعیین می‌شود و شما سعی می‌کنید در طول توسعه به این بودجه پایبند باشید. ابعاد خاص یک بودجه عملکرد ممکن است شامل محدودیت‌هایی در وزن صفحه (page weight)، تعداد درخواست‌های HTTP، زمان بارگذاری صفحه (page load time)، زمان تا تعامل اولیه (time to initial interactivity) و غیره باشد. اگر نمی‌توانید بودجه را برآورده کنید، باید دارایی‌ها یا ویژگی‌هایی را که بودجه را منفجر می‌کنند، در نظر بگیرید. به عنوان مثال، آیا واقعاً به آن چرخ فلک تصویر فانتزی یا کتابخانه جاوااسکریپت نیاز دارید؟آر.ای.آی.الگوگل رویکرد و مجموعه‌ای از اهداف را برای عملکرد وب به نام RAIL تعریف می‌کند: پاسخ (Response)، انیمیشن (Animation)، بیکار (Idle)، بارگذاری (Load). اهدافی که دنبال می‌کند عبارتند از:پاسخ: 100 میلی‌ثانیه—بازخورد فوری به ورودی کاربر بدهید.انیمیشن: 10 میلی‌ثانیه—هنگام پیمایش یا متحرک‌سازی، فریم‌ها را در کمتر از 10 میلی‌ثانیه تولید کنید تا به 60 فریم در ثانیه برسید.بیکار: 50 میلی‌ثانیه—عملیات غیر بحرانی نباید بیش از 50 میلی‌ثانیه طول بکشد تا برنامه سریع به نظر برسد.بارگذاری: 1 ثانیه—محتوای تعاملی را در کمتر از 1000 میلی‌ثانیه تحویل دهید تا کاربران را درگیر نگه دارید.همیشه امکان دستیابی به همه این اهداف با هم وجود ندارد، به خصوص در دستگاه‌های پایین‌رده، بنابراین گاهی اوقات لازم است این اهداف را اولویت‌بندی کنید، به عنوان مثال ابتدا بر روی بارگذاری و پاسخ تمرکز کنید.تجزیه و تحلیلتجزیه و تحلیل برای درک بازدیدکنندگان و ترافیک شما حیاتی است. می‌تواند به خصوص در موبایل برای کمک به شما در درک اینکه کاربران شما از چه دستگاه‌هایی استفاده می‌کنند مفید باشد. با این حال، برای بسیاری، تجزیه و تحلیل با نصب یک اسکریپت گوگل آنالیتیکس (Google Analytics) شروع و متوقف می‌شود. اما گوگل آنالیتیکس تنها نمایش در شهر نیست.ابزارهای تجزیه و تحلیل می‌توانند داده‌های خود را در سمت کلاینت یا سرور جمع‌آوری کنند. شایان ذکر است که اتکای صرف به تجزیه و تحلیل مبتنی بر جاوااسکریپت می‌تواند مشکل‌ساز باشد، به خصوص در موبایل. اگر دستگاهی نتواند اسکریپت تجزیه و تحلیل را اجرا کند—به عنوان مثال، اگر دستگاه قدیمی‌تری باشد—آنگاه شما اصلاً دیدی نسبت به این دستگاه نخواهید داشت و می‌تواند شما را به تمرکز بر روی دستگاه‌های اشتباه سوق دهد. علاوه بر این، بسیاری از مسدودکننده‌های تبلیغات (ad blockers) نیز تجزیه و تحلیل‌های سمت کلاینت مانند گوگل آنالیتیکس را مسدود می‌کنند. اگر در مورد تجزیه و تحلیل خود جدی‌تر هستید، می‌توان با استفاده از ترکیبی از تجزیه و تحلیل‌های سمت کلاینت و سرور، تصویر دقیق‌تری از داده‌های خود به دست آورد.ابزارهای محبوب شامل گوگل آنالیتیکس، KISSMetrics و Matomo هستند. برخی ابزارها، مانند wao.io، هر دو تجزیه و تحلیل سمت سرور و کلاینت را ارائه می‌دهند.تست A/Bتست A/B تکنیک بسیار مفیدی است که می‌تواند در توسعه وب برای ارزیابی عملکرد انواع مختلف طراحی رابط کاربری، پیام‌رسانی و چیدمان استفاده شود تا بتوانید تصمیمات آگاهانه‌ای در مورد UX ارائه دهید. اکثر ابزارهای اصلی تجزیه و تحلیل از تست A/B پشتیبانی می‌کنند، از جمله Google Optimize، Google Analytics (Experiments) و Matomo.نظارت بر کاربر واقعی (Real User Monitoring - RUM)آر.یو.ام شامل نظارت مداوم بر تعامل کاربر با یک برنامه وب به صورت بی‌درنگ است. این به صاحب وب‌سایت امکان می‌دهد به سرعت مشکلات مربوط به در دسترس بودن (availability)، عملکرد، واکنش‌گرایی (responsiveness) و غیره را شناسایی، اولویت‌بندی و برطرف کند. این، به نوبه خود، بینش‌های ارزشمندی را در مورد رفتار و رضایت کاربر ارائه می‌دهد و شما را قادر می‌سازد تا تجربه کاربری کلی را دقیق تنظیم کرده و بهبود بخشید.آر.یو.ام می‌تواند در سمت کلاینت یا سرور انجام شود و ابزارهای پلاگین مانند wao.io سون‌وال (Sevenval&#x27;s wao.io) می‌توانند معیارهای فرانت‌اند و بک‌اند را بدون نیاز به ایجاد هیچ گونه تغییر کدی در برنامه، مرتبط کنند.کسب درآمد (Monetization)تبلیغات (Ads)تبلیغات به طور سنتی یکی از رایج‌ترین راه‌ها برای کسب درآمد از یک وب‌سایت بوده است و در وب موبایل نیز کمتر از آن نیست. شبکه‌های تبلیغاتی (ad networks) زیادی برای انتخاب وجود دارد.مسدودکننده‌های تبلیغات (Ad blockers)اگر مدل کسب درآمد مبتنی بر تبلیغات را انتخاب می‌کنید، توجه داشته باشید که واکنش شدیدی علیه تبلیغات—به خصوص در موبایل—از زمانی که اپل پشتیبانی از مسدودکننده‌های تبلیغات را در سال 2015 به موبایل سافاری (Mobile Safari) اضافه کرد، رو به افزایش بوده است. تبلیغات به دلیل افزودن نفخ غیر ضروری صفحه و کاهش عملکرد وب، شهرت بدی دارند.مرورگرهای موبایل و دسکتاپ به طور فزاینده‌ای با مسدودکننده‌های تبلیغات داخلی و حفاظت از حریم خصوصی پیشرفته عرضه می‌شوند. حتی گوگل، شرکتی که جریان اصلی درآمد آن مبتنی بر تبلیغات است، یک مسدودکننده تبلیغات را در مرورگر کروم خود گنجانده است. بنابراین، اگر به درآمد تبلیغاتی متکی هستید، حتماً از خطرات و جنبه‌های منفی بالقوه آگاه باشید.هنگام انتخاب یک شبکه تبلیغاتی، یک شبکه قابل اعتماد را انتخاب کنید که به عملکرد سایت شما آسیب نرساند. یک تازه‌وارد نسبی در این زمینه AMP برای تبلیغات (AMP for Ads - A4A) است (همچنین این لینک را ببینید). اینها تبلیغاتی هستند که مبتنی بر فناوری AMP هستند، اما برای دسکتاپ نیز به خوبی کار می‌کنند. A4A قوانین سختگیرانه‌ای در مورد آنچه مجاز است دارد و تبلیغاتی که عملکرد را کاهش می‌دهند از صفحه حذف می‌شوند، بنابراین می‌توانید مطمئن باشید که تبلیغات باعث مشکلات UX یا عملکرد نمی‌شوند.تجارت الکترونیک (Ecommerce)راه‌های زیادی برای ساخت یک راه‌حل تجارت الکترونیک وب وجود دارد، از راه‌حل‌های آماده (off-the-shelf) گرفته تا توسعه‌های سفارشی. بسیاری از ارائه‌دهندگان خدمات پرداخت جدید و سنتی، مانند پی‌پال (PayPal) و استرایپ (Stripe)، پشتیبانی موبایل خوبی دارند و پیاده‌سازی آنها نسبتاً ساده است. علاوه بر این، نسل جدیدی از کیف پول‌های موبایلی مجهز به NFC، مانند اندروید پی (Android Pay)، اپل پی (Apple Pay) و سامسونگ پی (Samsung Pay)، به طور فزاینده‌ای می‌توانند در وب استفاده شوند.ای.پی.آی Payment Requestآخرین فناوری که باید مراقب آن بود، Payment Request API است. این ای.پی.آی یکی از ویژگی‌های جدید HTML5 است که هدف آن ارائه پرداخت‌های بدون اصطکاک در وب، به دو روش است:حذف نیاز به وارد کردن دست و پا گیر جزئیات پرداختحذف نیاز به اشتراک‌گذاری جزئیات کارت اعتباری خود با سایت‌های شخص ثالث با اعتبار نامشخصچندین مرورگر قبلاً از Payment Request API پشتیبانی می‌کنند، از جمله کروم برای اندروید، اج و سامسونگ اینترنت (Samsung Internet)، و در بیلدهای توسعه‌دهنده (developer (nightly) builds) فایرفاکس موجود است.لطفاً برای جزئیات بیشتر در مورد انواع مدل‌های کسب درآمد که می‌توان استفاده کرد، فصل کسب درآمد را ببینید.دستورالعمل‌های کلی UX و عملکردفضای کافی برای پرداختن به جزئیات عملی زیاد در اینجا وجود ندارد (برای چند نمونه گرافیکی به این سایت مراجعه کنید)، اما مجموعه کلی دستورالعمل‌ها برای توسعه وب موبایل شامل موارد زیر است.یو.ایکسبرای موبایل بهینه‌سازی کنید.نیازی به زوم با دو انگشت (pinch-to-zoom) نداشته باشید.تصاویر محصول را قابل بزرگنمایی کنید.اطمینان حاصل کنید که اهداف لمسی (tap targets) و پیوندها به اندازه کافی برای انگشتان &quot;چاق&quot; بزرگ هستند.فراخوان‌ها به اقدام (calls to action) را در جلو و مرکز نگه دارید.منوها را کوتاه نگه دارید.ناوبری بصری با یک پیوند برجسته به صفحه اصلی.از پاپ‌آپ‌های (pop-ups) مزاحم و بینابینی‌های (interstitials) بزرگ خودداری کنید.یک جستجوی سایت، با فیلترهایی برای محدود کردن نتایج در صورت امکان، بگنجانید.در صورت امکان، کلیک برای تماس (click-to-call) را بگنجانید.فقط در صورت نیاز، نه از قبل، درخواست مجوزهای ویژه مرورگر را بکنید. به عنوان مثال، هنگام ارسال اعلان‌های فشاری، زمانی که کاربر قبلاً تمایل خود را برای اشتراک، یا گفتن برای به‌روزرسانی‌های سفارش، نشان داده است، اجازه بخواهید و موقعیت‌یابی جغرافیایی فقط در صورت نیاز برای نقشه‌برداری یا آدرس.به کاربران اجازه دهید به عنوان مهمان مرور کنند.به کاربران اجازه دهید به عنوان مهمان خرید کنند.در صورت امکان، ورودی‌های فرم را به طور خودکار پر کنید (Autofill).عملکردوزن صفحه را کم نگه دارید، از رسانه‌های غیر ضروری مانند تصاویر و فیلم‌ها خودداری کنید.تمام تصاویر را فشرده کنید.از تغییر مسیرها (redirects) خودداری کنید.تعداد منابع خارجی را کم نگه دارید تا درخواست‌های HTTP کاهش یابد.کش را پیاده‌سازی کنید.تصاویر و محتوا را در صورت نیاز به صورت تنبل بارگذاری کنید (Lazy load).منابع متنی را کوچک کنید (Minify).از چارچوب‌های جاوااسکریپت و CSS مگر در موارد ضروری خودداری کنید.از تعبیه‌ها (embeds) و گنجاندن‌های (includes) غیر ضروری خودداری کنید.از تبلیغات مسئولانه استفاده کنید و فقط از تبلیغات سبک استفاده کنید.یک بودجه عملکرد تعریف کنید و سعی کنید به آن پایبند باشید.تست برای وب موبایلتست در وب حیاتی است. و در وب موبایل، در حالی که شبیه‌سازها و حتی مرورگرهای دسکتاپ مفید هستند، قابل اعتمادترین تست، تستی است که روی دستگاه‌های واقعی انجام می‌شود.قبلاً در مورد پراکندگی دستگاه صحبت کردیم. این، همراه با تنوع مرورگرهای موجود در هر پلتفرم، هنگام تست صفحات وب شما باعث سردرد می‌شود. تست جامع روی همه مرورگرها و دستگاه‌ها تقریباً غیرممکن است. هیچ پروژه‌ای جز بزرگترین و با بودجه‌ترین پروژه‌ها قادر به نزدیک شدن به آن نخواهد بود. بنابراین، وقتی صحبت از تست وب موبایل می‌شود، باید اولویت‌بندی کنید.اگر بودجه شما اجازه می‌دهد، توصیه می‌شود چندین دستگاه در هر یک از پلتفرم‌های اصلی موبایل، اندروید، آی‌او‌اس و ویندوز تهیه کنید. دستگاه‌ها باید ترکیبی از بالارده و پایین‌رده باشند و در صورت امکان قابلیت جابجایی بین شبکه‌های تلفن همراه را داشته باشند.به طور کلی، تلاش تست بین تست عملکردی و رابط کاربری (functional and UI testing) از یک سو و تست عملکرد (performance testing) از سوی دیگر تقسیم می‌شود. تست عملکردی و رابط کاربری به تست منطق تجاری (business logic)، رابط کاربری، مؤلفه‌های رابط کاربری و قابلیت استفاده (usability) مربوط می‌شود. گاهی اوقات مشکلات فقط در برخی دستگاه‌ها در برخی پلتفرم‌ها ظاهر می‌شوند و این تست در موبایل را دشوار می‌کند. تست عملکرد بیشتر به این مربوط می‌شود که سایت چقدر خوب کار می‌کند: آیا سریع است، آیا سریع به نظر می‌رسد، آیا تحت شرایط شبکه ضعیف کار می‌کند؟تست دستی (Manual testing) احتمالاً اولین قدم در هر تست وب خواهد بود. در حالی که از طریق تست خودکار (automated testing) می‌توان به دستاوردهای کارایی بزرگی دست یافت، تست خودکار همیشه عملی نیست، شاید به دلیل اندازه کوچک پروژه، یا محدودیت‌های زمانی یا بودجه‌ای.خوشبختانه، ابزارهای زیادی برای کمک به تمام جنبه‌های تست وب موبایل وجود دارد.ابزارهای توسعه‌دهنده مرورگر (Browser Developer Tools)حتی برای وب موبایل، تست اولیه اغلب روی مرورگر دسکتاپ با ابزارهای توسعه‌دهنده داخلی آن انجام می‌شود. فقط برخی از ویژگی‌های ابزارهای توسعه‌دهنده مرورگر عبارتند از بازرسی DOM، بازرسی شبکه، پروفایل عملکرد:بازرسی DOM: امکان بررسی عناصر HTML که یک صفحه را تشکیل می‌دهند را فراهم می‌کند.تنظیم سرعت شبکه (Network throttling): برای شبیه‌سازی شرایط شبکه کند و ضعیف، مانند Edge، 2G، 3G و غیره.تنظیم سرعت پردازنده (CPU throttling): برای شبیه‌سازی گوشی‌های هوشمند بالارده یا پایین‌رده.نمودار آبشاری و خطوط زمانی (Waterfall chart and timelines): تجسم‌هایی از نحوه بارگذاری و رندر شدن یک صفحه در طول زمان ارائه می‌دهند.اشکال‌زدایی جاوااسکریپت: به توسعه‌دهنده امکان می‌دهد کد جاوااسکریپت را بررسی کند، نقاط شکست اضافه کند، رویدادها را مشاهده کند و کد را مرحله به مرحله اجرا کند.پروفایل پردازنده و حافظه (CPU and Memory profiling): نحوه عملکرد پردازنده و ردپای رم (RAM footprint) را در طول زمان ثبت می‌کند.سایر ویژگی‌هایی که به ویژه برای توسعه و تست وب موبایل مفید هستند عبارتند از:حالت طراحی واکنش‌گرا (Responsive design mode): ویوپورت‌ها را در اندازه‌های قابل تنظیم مختلف شبیه‌سازی می‌کند، به طوری که می‌توانید نحوه رفتار رابط کاربری را تحت ویوپورت‌های با اندازه‌های مختلف ببینید.آینه‌سازی صفحه (Screen mirroring): مرورگر دستگاه متصل به ابزارهای توسعه‌دهنده آینه می‌شود و می‌توان از طریق مرورگر دسکتاپ با آن تعامل داشت.اشکال‌زدایی از راه دور (Remote Debugging)تمام پلتفرم‌های اصلی موبایل از اشکال‌زدایی از راه دور دستگاه‌های تلفن همراه پشتیبانی می‌کنند. اشکال‌زدایی از راه دور به شما امکان می‌دهد یک دستگاه تلفن همراه را به یک دستگاه دسکتاپ متصل کنید و ابزارهای توسعه‌دهنده مرورگر آن دستگاه را برای تست و پروفایل صفحات وب در دستگاه تلفن همراه به کار بگیرید.اشکال‌زدایی از راه دور ابزار بسیار مفیدی است، زیرا به شما امکان می‌دهد روی دستگاه‌های واقعی و شبکه‌های واقعی تست کنید. البته، هنوز به دستگاه‌هایی برای تست نیاز دارید و این می‌تواند گران باشد. حداقل، باید به داشتن یک دستگاه پایین‌رده و بالارده در هر یک از سیستم‌عامل‌های اصلی موبایل نگاه کنید: اندروید، آی‌او‌اس و ویندوز. حتی در این صورت، شکاف‌های عمده‌ای در پوشش تست شما وجود خواهد داشت؛ اینجاست که آزمایشگاه‌های دستگاه (device labs) می‌توانند کمک کنند.ابزارهای تست عملکرد و UXسلنیوم وب‌درایور (Selenium WebDriver)سلنیوم وب‌درایور پیشرو در تست خودکار وب است. تست خودکار برای یافتن سریع مشکلات رابط کاربری بسیار مفید است و می‌توان از آن برای تست رگرسیون (regression testing) برای یافتن سریع تغییرات رابط کاربری مخرب استفاده کرد. سلنیوم علاوه بر این از تست موبایل در اندروید و آی‌او‌اس پشتیبانی می‌کند و هم تست شبیه‌ساز و هم دستگاه واقعی پشتیبانی می‌شود.وب‌پیج‌تست (WebPagetest)وب‌پیج‌تست یک ابزار تست عملکرد منبع باز و رایگان است که تست از راه دور را روی مرورگرهای واقعی دسکتاپ و موبایل در مکان‌های مختلف در سراسر جهان ارائه می‌دهد. نمودارهای عملکرد آبشاری و همچنین اندازه‌گیری معیارهای کلیدی عملکرد مانند زمان تا اولین بایت (time to first byte)، شاخص سرعت (speed index) و تعداد عناصر DOM را ارائه می‌دهد.موبی‌ردی (mobiReady)موبی‌ردی ابزاری رایگان برای توسعه‌دهندگان، طراحان و بازاریابان است که صفحات و سایت‌های وب را بر اساس بهترین شیوه‌ها و استانداردهای وب موبایل برای آمادگی موبایل (mobile-readiness) آزمایش می‌کند. تجزیه و تحلیل دقیقی برای یک صفحه برمی‌گرداند و توصیه‌هایی در مورد نحوه رسیدگی به هر گونه مشکل شناسایی شده ارائه می‌دهد. همچنین شامل موارد زیر است:تجسم‌های دستگاه در دستگاه‌های پایین‌رده، میان‌رده و بالارده، که نشان می‌دهد صفحه در اندازه‌های مختلف صفحه چگونه به نظر می‌رسد.تفکیک وزن صفحه برای هر کلاس دستگاه.گزارش محک‌زنی (benchmark report) از نحوه امتیازدهی صفحه شما در برابر 1000 سایت برتر الکسا (Alexa).موبی‌ردی همچنین یک API را در معرض دید قرار می‌دهد که می‌تواند برای تست خودکار کل سایت‌ها استفاده شود.لایت‌هاوس (Lighthouse)لایت‌هاوس یک برنامه وب را برای ویژگی‌های PWA ممیزی می‌کند، از جمله:آیا می‌تواند به صورت آفلاین یا تحت شرایط شبکه ضعیف بارگیری شود؟آیا سریع است؟آیا از یک URL امن ارائه می‌شود؟آیا بهترین شیوه‌های دسترس‌پذیری (accessibility best practices) را پیاده‌سازی می‌کند؟لایت‌هاوس به عنوان یک سرویس آنلاین، یک افزونه کروم، یک ابزار خط فرمان (command line tool) در دسترس است و با ابزارهای توسعه‌دهنده کروم ادغام شده است. نسخه خط فرمان برای تست خودکار مفید است.پیج‌اسپید اینسایتس (PageSpeed Insights)پیج‌اسپید اینسایتس ابزاری از گوگل است که عملکرد صفحه را برای بازدیدکنندگان موبایل و دسکتاپ اندازه‌گیری می‌کند. بهترین شیوه‌های عملکرد رایج را بررسی می‌کند و صفحات را از 100 رتبه‌بندی می‌کند. هنگامی که مشکلات شناسایی می‌شوند، توصیه‌هایی در مورد نحوه رفع آنها ارائه می‌دهد.آزمایشگاه‌های دستگاه (Device Labs)ایده آزمایشگاه دستگاه سال‌هاست که وجود دارد. آزمایشگاه دستگاه به سادگی مجموعه‌ای از دستگاه‌ها است که می‌توان از آنها برای توسعه و تست استفاده کرد. آزمایشگاه‌های دستگاه به دو دسته تقسیم می‌شوند: فیزیکی و راه دور.آزمایشگاه‌های راه دور بیشترین راحتی را ارائه می‌دهند: شما یک کلاینت را روی رایانه خود نصب می‌کنید و به شما امکان می‌دهد از طریق وب به دستگاه واقعی از راه دور دسترسی داشته باشید. از سوی دیگر، با یک آزمایشگاه فیزیکی، می‌توانید دستگاهی را مستقیماً به لپ‌تاپ خود متصل کنید و از ابزارهای اشکال‌زدایی از راه دور مرورگر استفاده کنید. این می‌تواند برای حل مشکلاتی که بر دستگاه‌های خاص تأثیر می‌گذارند مفید باشد.آزمایشگاه AWS Device Farmآزمایشگاه AWS Device Farm آمازون یک آزمایشگاه تست دستگاه پیشرفته است که دارای تست خودکار در برابر مجموعه بزرگی از دستگاه‌های واقعی در ابر AWS و همچنین دسترسی مستقیم از راه دور است که به شما امکان می‌دهد با کشیدن‌ها و ژست‌ها به صورت بی‌درنگ از مرورگر وب خود تعامل داشته باشید. AWS Device Farm شامل طیف گسترده‌ای از دستگاه‌های جدید و قدیمی آی‌او‌اس و اندروید است.آزمایشگاه AWS Device Farm از پرداخت به ازای استفاده (pay-as-you-go) و نرخ ثابت (flat-rate) پشتیبانی می‌کند. در مدل PAYG، 1000 دقیقه اول رایگان است، بنابراین می‌تواند راه خوبی برای امتحان سرویس قبل از تعهد به آن باشد.براوزراستک (BrowserStack)براوزراستک تست از راه دور را در انواع مرورگرهای دسکتاپ و موبایل و سیستم‌عامل‌های مختلف ارائه می‌دهد. دستگاه‌های تلفن همراه برای &quot;حداکثر پوشش بازار&quot; انتخاب شده‌اند و شامل مجموعه وسیعی از دستگاه‌های واقعی آی‌او‌اس و اندروید هستند. از تست خودکار از طریق تست ابری سلنیوم (Selenium cloud testing) پشتیبانی می‌کند. براوزراستک برای پروژه‌های منبع باز رایگان است و یک دوره آزمایشی رایگان برای پروژه‌های تجاری ارائه می‌دهد.آزمایشگاه تست راه دور سامسونگ (Samsung&#x27;s Remote Test Lab)آزمایشگاه تست راه دور سامسونگ تست رایگان از راه دور را روی دستگاه‌های سامسونگ ارائه می‌دهد. شما از طریق مرورگر وب خود به دستگاه‌های واقعی رزرو و متصل می‌شوید. لیست دستگاه‌ها شامل تلفن‌ها، تبلت‌ها و ساعت‌های قدیمی و جدید است—جای تعجب نیست که همه دستگاه‌های سامسونگ هستند—و در برندهای گلکسی (Galaxy)، زد (Z) (تایزن - Tizen) و گیر (Gear) آن پخش شده‌اند.آزمایشگاه SIGOS App Experienceآزمایشگاه SIGOS App Experience، که قبلاً با نام Keynote Mobile Testing شناخته می‌شد، و قبلاً با نام DeviceAnywhere (دنبال کردن سخت است!) یکی از اولین آزمایشگاه‌های دستگاه مجازی بود. علی‌رغم نام اخیر آن، SIGOS App Experience می‌تواند برای تست در وب نیز، روی بیش از 2000 دستگاه آن، استفاده شود. SIGOS هم از تست دستی و هم خودکار پشتیبانی می‌کند. به سرویس از طریق مرورگر دسکتاپ دسترسی پیدا می‌شود. یک دوره آزمایشی رایگان 7 روزه ارائه می‌دهد.پرفکتو موبایل (Perfecto Mobile)پرفکتو موبایل تست از راه دور پولی را روی دستگاه‌های واقعی ارائه می‌دهد. از تست دستی و خودکار روی چندین دستگاه پشتیبانی می‌کند. یک دوره آزمایشی رایگان نیز در دسترس است.آزمایشگاه دستگاه باز (Open Device Lab)آزمایشگاه دستگاه باز یک رویکرد اجتماعی به آزمایشگاه‌های دستگاه است. سازمان‌های شرکت‌کننده فضایی فیزیکی را ارائه می‌دهند که توسعه‌دهندگان می‌توانند به آنجا بروند و به صورت رایگان از آن استفاده کنند. در حال حاضر 154 آزمایشگاه دستگاه باز در 35 کشور وجود دارد که دسترسی رایگان به 4255 دستگاه را ارائه می‌دهند.منابع (Resources)سایت منبع برای طراحی و توسعه وب موبایل: mobiforge.comپشتیبانی و سازگاری ویژگی‌های مرورگر: caniuse.comطراحی وب‌سایت واکنش‌گرا با RESS در smashingmagazine.comاولین برنامه وب پیشرونده شما در developers.google.comبرنامه‌های وب آفلاین در udacity.comپروژه AMP: ampproject.orgوب‌اَمپ‌های پیشرونده در smashingmagazine.comپروژه وب فیزیکی: google.github.io/physical-webدیدگاه خوبی در مورد کیفیت نرم‌افزار و تست با استفاده از مرورگرهای وب در mobiletestingblog.comوب موبایل با عملکرد بالا - بهترین شیوه‌ها برای بهینه‌سازی برنامه‌های وب موبایل³⁶، توسط مکس فیرتمن (Max Firtman) (O&#x27;Reilly Media، 2016) قابل دسترس در این جا.فصل هفتم را از این جا بخوانید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Sat, 10 May 2025 00:02:32 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای توسعه‌دهندگان موبایل به سمت کهکشان: فصل پنجم</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D9%81%D8%B5%D9%84-%D9%BE%D9%86%D8%AC%D9%85-xxkozumykasc</link>
                <description>فصل چهارم را از این جا بخوانید.فصل پنجم: توسعه چند پلتفرمی (Cross-Platform Development)تصویر فصل پنجم کتابنویسنده: رابرت ویرکوس (Robert Virkus)با وجود اینکه اندروید (Android) و آی‌او‌اس (iOS) تنها بازیگران اصلی هستند، چرا باید استفاده از یک چارچوب توسعه چند پلتفرمی (cross-platform development framework) را در نظر بگیرید؟ به این ترتیب حتی یک تیم کوچک می‌تواند به هر دو پلتفرم خدمات ارائه دهد. و حتی ممکن است به راحتی سایر فرم فاکتورها و رسانه‌ها مانند رایانه‌های شخصی، کنسول‌های بازی و وب‌سایت‌ها را هدف قرار دهید.تفاوت‌های کلیدی بین پلتفرم‌هااگر می‌خواهید برنامه خود را در پلتفرم‌های مختلف ارائه دهید، باید بر برخی موانع غلبه کنید. غلبه بر برخی چالش‌ها آسان‌تر از سایرین است:زبان برنامه‌نویسی: کاتلین (Kotlin) و جاوا (Java) برای اندروید، سوئیفت (Swift) برای آی‌او‌اسرابط کاربری (UI) و تجربه کاربری (UX): سبک و الگوهای تعامل در هر پلتفرم متفاوت است.ادغام با دسکتاپ/لانچر (Desktop/Launcher Integration): در آی‌او‌اس فقط می‌توانید یک نشان (badge) با یک عدد به نماد برنامه خود اضافه کنید، در حالی که در اندروید می‌توانید یک ویجت دسکتاپ کامل (full-blown desktop widget) اضافه کنید که ممکن است داده‌های دلخواه را نمایش دهد و از هر تصویری استفاده کند.ادغام با صفحه قفل (Lock Screen Integration): باز هم، راه‌های مختلفی برای ادغام در صفحه قفل وجود دارد.چند وظیفگی (Multitasking): اندروید و آی‌او‌اس گزینه‌های مختلفی برای اجرای سرویس‌های پس‌زمینه (background services) دارند.پراکندگی (Fragmentation): اکوسیستم اندروید بسیار پراکنده است، آی‌او‌اس بسیار همگن‌تر است.خدمات پلتفرم (Platform Services): مانند پوش (push)، خرید درون‌برنامه‌ای (in-app-purchase) و تبلیغات درون‌برنامه‌ای (in-app-advertisement) در هر پلتفرم متفاوت هستند.مزایا و معایب چارچوب‌های چند پلتفرمیبا توجه به تفاوت‌های بالا، چرا باید استفاده از یک چارچوب چند پلتفرمی را در نظر بگیرید؟استفاده مجدد از کد، پیچیدگی و در نتیجه منابع بالقوه باگ را کاهش می‌دهد.داشتن عمدتاً یک منبع کد، زمان ورود به بازار و مقرون به صرفه بودن پروژه شما را نیز افزایش می‌دهد.از برابری ویژگی‌ها (feature parity) بین پلتفرم‌ها لذت خواهید برد.تیم شما به تخصص پلتفرم کمتری نیاز دارد و تشکیل آن آسان‌تر می‌شود.استفاده از اجزای رابط کاربری یکسان منجر به سازگاری رابط کاربری (UI consistency) می‌شود که به نوبه خود تلاش برای پشتیبانی شما را کاهش می‌دهد.با این حال:برخی از ویژگی‌ها به ادغام‌های بومی (native integrations) نیاز دارند، در این صورت، پیچیدگی بیشتری دارید زیرا باید همزمان با چارچوب خود، کد خود و سیستم‌عامل هدف سروکار داشته باشید.استفاده از رابط کاربری یکسان ممکن است منجر به کاهش تجربه کاربری شود که برای سیستم‌عامل هدف بهینه نیست.بسته به چارچوب انتخاب شده، کد شما ممکن است کندتر از کد بومی باشد.هنگامی که نسخه‌های جدید سیستم‌عامل با ویژگی‌های جدید وجود دارد، ممکن است لازم باشد منتظر بمانید تا چارچوب انتخابی شما به‌روز شود.استراتژی‌های چند پلتفرمیاین بخش برخی از استراتژی‌هایی را که می‌توانید برای پیاده‌سازی برنامه‌های خود در پلتفرم‌های مختلف به کار بگیرید، تشریح می‌کند.پشتیبانی مستقیم (Direct Support)می‌توانید با داشتن یک تیم تخصصی برای هر پلتفرم هدف، از چندین پلتفرم پشتیبانی کنید. در حالی که این می‌تواند منابع‌بر باشد، به احتمال زیاد بهترین ادغام و تجربه کاربری را در هر سیستم به شما می‌دهد. یک مسیر ورود آسان این است که با یک پلتفرم شروع کنید و سپس پس از اینکه برنامه شما در دنیای واقعی خود را ثابت کرد، به پلتفرم‌های دیگر پیشرفت کنید.کتابخانه‌های مؤلفه (Component libraries) می‌توانند به شما در سرعت بخشیدن به توسعه بومی کمک کنند، مؤلفه‌های تجاری و منبع باز بسیاری برای همه پلتفرم‌ها در دسترس هستند.اشتراک‌گذاری دارایی (Asset Sharing)هنگامی که چندین تیم را برای پلتفرم‌های مختلف نگهداری می‌کنید، همچنان می‌توانید با اشتراک‌گذاری برخی از ساختارهای برنامه، تلاش زیادی را صرفه‌جویی کنید:مفهوم و دارایی‌ها (Concept and assets): عمدتاً این کار را به طور خودکار انجام خواهید داد: ایده‌ها و مفاهیم برنامه، جریان رابط کاربری، ورودی و خروجی و طراحی و دارایی‌های طراحی برنامه را به اشتراک بگذارید (اما از نیاز به پشتیبانی از ساختارهای رابط کاربری خاص پلتفرم آگاه باشید).ساختارهای داده و الگوریتم‌ها (Data structures and algorithms): با اشتراک‌گذاری ساختارهای داده و الگوریتم‌ها در بین پلتفرم‌ها یک قدم فراتر بروید.اشتراک‌گذاری کد مدل کسب‌وکار (Codesharing of the business model): با استفاده از کامپایلرهای چند پلتفرمی (cross-platform compilers) می‌توانید مدل کسب‌وکار را نیز بین پلتفرم‌ها به اشتراک بگذارید. روش دیگر، می‌توانید از یک مفسر (interpreter) یا یک ماشین مجازی (virtual machine) و یک زبان مشترک در انواع پلتفرم‌ها استفاده کنید.انتزاع کامل (Complete abstraction): برخی از ابزارهای چند پلتفرمی به شما امکان می‌دهند مدل کسب‌وکار، نما (view) و کنترل (control) برنامه خود را برای پلتفرم‌های مختلف کاملاً انتزاعی کنید.پِلِیِر و ماشین‌های مجازی (Player And Virtual Machines)مفاهیم پِلِیِر (Player concepts) معمولاً مجموعه‌ای مشترک از APIها را در پلتفرم‌های مختلف ارائه می‌دهند. نمونه‌های معروف شامل Xamarin.com و Lua.org هستند. این رویکرد توسعه را بسیار آسان می‌کند. با این حال، شما برای ویژگی‌های جدید به ارائه‌دهنده پلتفرم وابسته هستید و چالش در اینجا زمانی است که آن ویژگی‌ها فقط در یک پلتفرم در دسترس هستند. گاهی اوقات مفاهیم پلیر از رویکرد &quot;کمترین مخرج مشترک&quot; (least common denominator) برای ویژگی‌های ارائه شده استفاده می‌کنند تا مشترکات بین پیاده‌سازی‌ها برای پلتفرم‌های مختلف حفظ شود.کامپایل چند زبانه (Cross-Language Compilation)کامپایل چند زبانه امکان کدنویسی به یک زبان را فراهم می‌کند که سپس به زبان دیگری، خاص پلتفرم، تبدیل می‌شود. از نظر عملکرد، این اغلب بهترین راه‌حل چند پلتفرمی است، با این حال، ممکن است تفاوت‌های عملکردی در مقایسه با برنامه‌های بومی وجود داشته باشد. این می‌تواند به عنوان مثال، زمانی که ساختارهای برنامه‌نویسی خاصی نمی‌توانند به طور بهینه از زبان مبدأ به زبان هدف ترجمه شوند، اتفاق بیفتد.سه رویکرد رایج برای کامپایل چند زبانه وجود دارد: ترجمه مستقیم منبع به منبع (direct source to source translation)، غیرمستقیم با ترجمه کد منبع به یک زبان انتزاعی میانی (intermediate abstract language) و کامپایل مستقیم به فرمت باینری (binary format) پلتفرم. رویکرد غیرمستقیم معمولاً کد کمتر خوانایی تولید می‌کند. این یک مشکل بالقوه است زمانی که می‌خواهید توسعه را در پلتفرم هدف ادامه دهید و از کد منبع ترجمه شده به عنوان نقطه شروع استفاده کنید.برنامه‌های وب (هیبریدی) ((Hybrid) Web Apps)توسعه وب هیبریدی (Hybrid web development) به معنای تعبیه یک نمای وب (web view) در یک برنامه بومی است. استاندارد برای برنامه‌های هیبریدی، ابزار منبع باز آپاچی کوردوا (Apache Cordova) (که قبلاً با نام فون‌گپ (PhoneGap) شناخته می‌شد) است. این رویکرد به شما امکان می‌دهد از درون بخش‌های وب برنامه خود به عملکردهای بومی دسترسی داشته باشید و همچنین می‌توانید از کد بومی برای جنبه‌های حیاتی عملکرد یا تجربه کاربری برنامه خود استفاده کنید. برنامه‌های هیبریدی به شما امکان می‌دهند بخش‌های توسعه وب را در پلتفرم‌های انتخابی خود مجدداً استفاده کنید. برای کسب اطلاعات بیشتر در مورد توسعه وب موبایل، فصل وب را بخوانید.کد ANSI Cدر حالی که HTML و برنامه‌نویسی وب از یک انتزاع بسیار بالا شروع می‌شوند، می‌توانید مسیر مخالف را با استفاده از ANSI C انتخاب کنید. می‌توانید کد ANSI C را در تمام پلتفرم‌های مهم مانند اندروید، آی‌او‌اس و ویندوز (Windows) اجرا کنید. مشکل اصلی این رویکرد این است که نمی‌توانید از درون ANSI C به APIهای خاص پلتفرم یا حتی کنترل‌های رابط کاربری دسترسی داشته باشید. استفاده از C بیشتر برای الگوریتم‌های پیچیده مانند رمزگذارهای صوتی (audio encoders) مرتبط است. سپس کتابخانه‌های مربوطه می‌توانند در هر پروژه برنامه برای یک پلتفرم استفاده شوند.چارچوب‌های محبوبدر اینجا برخی از چارچوب‌های محبوبی که برای توسعه برنامه‌های چند پلتفرمی استفاده می‌شوند، بدون ترتیب خاصی آورده شده‌اند.زامارین (Xamarin)زامارین از هر دو سیستم موبایل و دسکتاپ پشتیبانی می‌کند و به ویژه به دلیل پشتیبانی از C# و XAML UI برای توسعه‌دهندگان ویندوز جذاب است. به طور سنتی، رابط کاربری با استفاده از مؤلفه‌های بومی ایجاد می‌شد، اما اکنون مؤلفه‌های رابط کاربری عمومی چند پلتفرمی نیز پشتیبانی می‌شوند. کتابخانه‌های بومی را می‌توان به راحتی ادغام کرد.کوردوا (Cordova)کوردوا که قبلاً با نام فون‌گپ شناخته می‌شد، یک رویکرد HTML/JS ارائه می‌دهد که ایجاد برنامه‌های موبایل را برای توسعه‌دهندگان وب بسیار آسان می‌کند. رابط کاربری توسط عناصر مرورگر رندر می‌شود، بنابراین شما یک تجربه وب کامل خواهید داشت. کد بومی را می‌توان با استفاده از رویکرد پلاگین ادغام کرد.فلاتر (Flutter)فلاتر یک چارچوب نسبتاً جدید است که رابط کاربری خود را کاملاً مستقل از رابط کاربری بومی سیستم‌عامل رندر می‌کند. علاوه بر پلتفرم‌های موبایل، از دسکتاپ‌ها و وب نیز پشتیبانی می‌کند. کد بومی را می‌توان با استفاده از مفهوم کانال (channel concept) فلاتر ادغام کرد.ری‌اکت نیتیو (React Native)با ری‌اکت نیتیو شما در JS کدنویسی می‌کنید در حالی که رابط کاربری از عناصر بومی تشکیل شده است و از یک تجربه بومی کامل اطمینان حاصل می‌کند. کد بومی را می‌توان با استفاده از پلاگین‌ها ادغام کرد.یافتن چارچوب چند پلتفرمی مناسبدر اینجا چند سؤالی وجود دارد که باید هنگام ارزیابی ابزارهای چند پلتفرمی بپرسید. ممکن است همه آنها برای شما مرتبط نباشند، بنابراین گزینه‌ها را به طور مناسب وزن‌دهی کنید. ابتدا نگاهی دقیق به ایده برنامه خود، محتوا، مخاطبان هدف و پلتفرم‌های هدف بیندازید. همچنین باید رقابت در پلتفرم‌های مختلف، بودجه بازاریابی و دانش فنی تیم توسعه خود را در نظر بگیرید.زنجیره ابزار چند پلتفرمی (cross-platform toolchain) شما چگونه کار می‌کند؟ از چه زبان برنامه‌نویسی و چه API می‌توانم استفاده کنم؟آیا می‌توانم به عملکردهای خاص پلتفرم دسترسی داشته باشم؟ اگر بله، چگونه؟آیا می‌توانم از مؤلفه‌های رابط کاربری بومی استفاده کنم؟ اگر بله، چگونه؟آیا می‌توانم از یک ساخت خاص پلتفرم (platform-specific build) به عنوان پایه‌ای برای توسعه مداوم خود استفاده کنم؟ کد منبع ترجمه شده/تولید شده چگونه به نظر می‌رسد؟آیا ادغام با دسکتاپ در دسترس است؟آیا می‌توانم چند وظیفگی را کنترل کنم؟ آیا سرویس‌های پس‌زمینه وجود دارد؟این راه‌حل با سرویس‌های پوش چگونه کار می‌کند؟چگونه می‌توانم از خرید درون‌برنامه‌ای و تبلیغات درون‌برنامه‌ای استفاده کنم؟این چارچوب چگونه با نسخه‌های جدید سیستم‌عامل همگام می‌شود؟عملکرد این راه‌حل چگونه است؟آخرین اما نه کم‌اهمیت‌ترین، برای بازی‌سازی، استفاده از یک راه‌حل چند پلتفرمی امری بدیهی است، زیرا ایجاد بازی محتوامحور است و بازی‌ها نیازی به ادغام عمیق در هر پلتفرم ندارند.فصل ششم را از این جا بخوانید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Mon, 05 May 2025 22:38:09 +0330</pubDate>
            </item>
                    <item>
                <title>MCP در مقابل A2A: درک پروتکل‌های زمینه برای سیستم‌های هوش مصنوعی</title>
                <link>https://virgool.io/Iamdeveloper/mcp-%D8%AF%D8%B1-%D9%85%D9%82%D8%A7%D8%A8%D9%84-a2a-%D8%AF%D8%B1%DA%A9-%D9%BE%D8%B1%D9%88%D8%AA%DA%A9%D9%84-%D9%87%D8%A7%DB%8C-%D8%B2%D9%85%DB%8C%D9%86%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D9%87%D8%A7%DB%8C-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-qppdml7mymn9</link>
                <description>این مقاله به بررسی و مقایسه‌ی دو پروتکل مهم در مدیریت زمینه (Context) برای سیستم‌های هوش مصنوعی می‌پردازد: پروتکل زمینه‌ی مدل (Model Context Protocol - MCP) و پروتکل عامل به عامل (Agent-to-Agent - A2A). با پیچیده‌تر شدن مدل‌های هوش مصنوعی، به ویژه مدل‌های زبانی بزرگ (Large Language Models - LLMs)، توانایی درک و حفظ زمینه در طول تعاملات برای ارائه پاسخ‌های منسجم و مفید اهمیت فزاینده‌ای پیدا کرده است. رویکردهای سنتی مدیریت زمینه اغلب ناکارآمد و ناسازگار بوده‌اند. پروتکل‌هایی مانند MCP و A2A با ارائه چارچوب‌های ساختاریافته برای مدیریت و تبادل اطلاعات زمینه‌ای، به رفع این چالش‌ها کمک کرده و امکان توسعه‌ی برنامه‌های هوش مصنوعی پیچیده‌تر، منسجم‌تر و توانمندتر را فراهم می‌کنند. این راهنما به تفصیل به بررسی MCP و A2A، اهداف، معماری‌ها و کاربردهای واقعی آن‌ها می‌پردازد.در این مطلب ترجمه‌ی بخش 1 تا 4 این مقاله را می‌خوانیم. MCP در مقابل A2A: درک پروتکل‌های زمینه برای سیستم‌های هوش مصنوعی01. مقدمهپروتکل‌های استاندارد شده برای مدیریت زمینه، چارچوب‌های ساختاریافته‌ای را برای مدیریت و تبادل اطلاعات زمینه‌ای فراهم می‌کنند که امکان ایجاد برنامه‌های کاربردی هوش مصنوعی (AI) پیچیده‌تر، منسجم‌تر و توانمندتر را می‌دهد.با پیچیده‌تر شدن مدل‌های هوش مصنوعی، توانایی آن‌ها در درک و حفظ زمینه در طول تعاملات به طور قابل توجهی بر سودمندی و قابلیت اطمینان آن‌ها تأثیر می‌گذارد. این امر به ویژه در مورد مدل‌های زبانی بزرگ (LLMs) صادق است که برای تولید پاسخ‌های منسجم، مرتبط و مفید به شدت به زمینه متکی هستند. رویکردهای سنتی برای مدیریت زمینه اغلب موقتی (ad hoc) و ناسازگار بوده‌اند، که منجر به اکوسیستم‌های پراکنده‌ای شده است که در آن هر برنامه زمینه را به روش خود مدیریت می‌کند. این پراکندگی چالش‌هایی را برای توسعه‌دهندگان ایجاد می‌کند، قابلیت همکاری (interoperability) بین سیستم‌ها را محدود می‌کند و در نهایت پتانسیل برنامه‌های کاربردی هوش مصنوعی را محدود می‌سازد.تصویر نمودار جریان را نشان می‌دهد که تکامل مدیریت زمینه را از رویکردهای اولیه تا پروتکل‌های پیشرفته‌تر مانند MCP و A2A به تصویر می‌کشد.برای پرداختن به این چالش‌ها، پروتکل‌های استاندارد شده برای مدیریت زمینه پدیدار شده‌اند. دو نمونه قابل توجه، پروتکل زمینه‌ی مدل (MCP) و پروتکل عامل به عامل (A2A) هستند. این پروتکل‌ها چارچوب‌های ساختاریافته‌ای برای مدیریت و تبادل اطلاعات زمینه‌ای فراهم می‌کنند و امکان ایجاد برنامه‌های هوش مصنوعی پیچیده‌تر، منسجم‌تر و توانمندتر را می‌دهند.این راهنمای جامع، هر دو پروتکل MCP و A2A، اهداف، معماری‌ها و کاربردهای واقعی آن‌ها را بررسی می‌کند. چه شما توسعه‌دهنده‌ای باشید که به دنبال پیاده‌سازی این پروتکل‌ها در پروژه‌های خود هستید، چه مدیر محصولی باشید که مزایای بالقوه آن‌ها را ارزیابی می‌کنید، یا صرفاً در مورد آینده مدیریت زمینه هوش مصنوعی کنجکاو هستید، این راهنما درک کاملی از این فناوری‌های مهم را به شما ارائه می‌دهد.تا پایان این راهنما، شما موارد زیر را درک خواهید کرد:پروتکل‌های MCP و A2A چه هستند و چرا اهمیت دارندمفاهیم اصلی و معماری هر پروتکلنحوه کارکرد داخلی این پروتکل‌هاموارد استفاده و کاربردهای واقعیتفاوت‌های کلیدی و جنبه‌های مکمل MCP و A2Aجهت‌گیری آینده پروتکل‌های زمینه در هوش مصنوعیبیایید با بررسی اینکه پروتکل زمینه‌ی مدل (MCP) چیست و چرا پیشرفت قابل توجهی در مدیریت زمینه هوش مصنوعی محسوب می‌شود، شروع کنیم.02. پروتکل MCP چیست؟پروتکل زمینه‌ی مدل (MCP) یک پروتکل استاندارد شده است که برای مدیریت و تبادل داده‌های زمینه‌ای بین کلاینت‌ها (clients) و مدل‌های زبانی بزرگ (LLMs) طراحی شده است. این پروتکل یک چارچوب ساختاریافته برای مدیریت زمینه فراهم می‌کند، که شامل تاریخچه مکالمه (conversation history)، فراخوانی‌های ابزار (tool calls)، وضعیت‌های عامل (agent states) و سایر اطلاعات مورد نیاز برای تعاملات هوش مصنوعی منسجم و مؤثر است.&quot;پروتکل MCP به یک چالش اساسی در برنامه‌های کاربردی هوش مصنوعی می‌پردازد: چگونه زمینه را به روشی سازگار، قابل اعتماد و مقیاس‌پذیر (scalable) حفظ و ساختاربندی کنیم.&quot;پروتکل MCP در هسته‌ی خود به یک چالش اساسی در برنامه‌های کاربردی هوش مصنوعی می‌پردازد: چگونه زمینه را به روشی سازگار، قابل اعتماد و مقیاس‌پذیر حفظ و ساختاربندی کنیم. قبل از MCP، توسعه‌دهندگان مجبور بودند راه‌حل‌های سفارشی برای مدیریت زمینه ایجاد کنند که منجر به رویکردهای پراکنده و قابلیت همکاری محدود بین سیستم‌ها می‌شد.جدول زیر اصطلاحات کلیدی MCP را تعریف می‌کند:ویژگی‌های کلیدی MCP:ساختار استاندارد شده: MCP یک قالب استاندارد برای اشیاء زمینه تعریف می‌کند که ایجاد، به‌روزرسانی و تبادل زمینه بین اجزا را آسان‌تر می‌سازد.ادغام ابزار: این پروتکل شامل مکانیسم‌هایی برای تعریف ابزارها، انجام فراخوانی‌های ابزار و پردازش پاسخ‌های ابزار به روشی سازگار است.مدیریت حافظه: MCP ساختارهایی برای حفظ تاریخچه مکالمه و سایر اشکال حافظه در طول تعاملات فراهم می‌کند.پشتیبانی از فراداده (Metadata): این پروتکل شامل پشتیبانی از فراداده است که اطلاعات اضافی در مورد زمینه و تعامل را ارائه می‌دهد.سریال‌سازی/دی‌سریال‌سازی (Serialization/Deserialization): MCP فرمت‌های استانداردی را برای تبدیل اشیاء زمینه به و از فرمت‌های سریال‌شده برای انتقال بین اجزا تعریف می‌کند.توجه: MCP یک استاندارد در حال تکامل استدر حالی که این مقاله مروری بر مفاهیم و کاربردهای MCP ارائه می‌دهد، این پروتکل هنوز در حال تکامل است. برای اطلاع از به‌روزترین مشخصات، مستندات رسمی را بررسی کنید.تصویر نمودار معماری سطح بالا را نشان می‌دهد که جریان داده و روابط اجزا را در یک سیستم مبتنی بر MCP به تصویر می‌کشد.03. چرا MCP اهمیت دارد؟پروتکل زمینه‌ی مدل چندین چالش حیاتی در توسعه‌ی هوش مصنوعی را برطرف می‌کند و آن را به پیشرفتی قابل توجه هم برای توسعه‌دهندگان و هم برای کاربران برنامه‌های کاربردی هوش مصنوعی تبدیل می‌کند. درک این مزایا به توضیح اینکه چرا MCP در جامعه هوش مصنوعی مورد توجه قرار گرفته است کمک می‌کند.مدیریت زمینه پیچیدهبرنامه‌های کاربردی هوش مصنوعی مدرن اغلب شامل تعاملات پیچیده‌ای هستند که نیازمند حفظ انواع مختلف زمینه می‌باشند:تاریخچه مکالمه: ردیابی آنچه قبلاً گفته شده است برای حفظ گفتگوهای منسجم.ترجیحات و تنظیمات کاربر: به خاطر سپردن اطلاعات خاص کاربر برای شخصی‌سازی تعاملات.وضعیت وظیفه: پیگیری پیشرفت در وظایف یا گردش‌های کاری چند مرحله‌ای.اطلاعات خارجی: گنجاندن داده‌ها از پایگاه‌های داده، APIها و سایر منابع.استفاده از ابزار: مدیریت تعاملات با ابزارها و خدمات خارجی.پروتکل MCP یک روش ساختاریافته برای مدیریت همه‌ی این انواع زمینه فراهم می‌کند و ساخت برنامه‌های کاربردی پیچیده‌ای را که می‌توانند تعاملات منسجم و مفیدی را حفظ کنند، آسان‌تر می‌سازد.استانداردسازی و قابلیت همکاریقبل از MCP: چالش‌هاپراکندگی: سیستم‌های مختلف از رویکردهای ناسازگار برای مدیریت زمینه استفاده می‌کردند.تکرار تلاش: توسعه‌دهندگان بارها و بارها مشکلات مدیریت زمینه مشابهی را حل می‌کردند.چالش‌های ادغام: دشواری در اتصال اجزای مختلف هوش مصنوعی به دلیل فرمت‌های زمینه ناسازگار.با MCP: مزایااجزای قابل همکاری: بخش‌های مختلف یک سیستم هوش مصنوعی می‌توانند زمینه را به طور یکپارچه تبادل کنند.توسعه اکوسیستم: ابزارها و خدمات شخص ثالث می‌توانند به راحتی با سیستم‌های سازگار با MCP ادغام شوند.کاهش زمان توسعه: توسعه‌دهندگان می‌توانند به جای اختراع مجدد مدیریت زمینه، بر ویژگی‌های خاص برنامه تمرکز کنند.تصویر نموداری را نشان می‌دهد که چگونه استانداردسازی MCP رویکردهای پراکنده را به یک اکوسیستم منسجم تبدیل می‌کند که شامل اجزای قابل همکاری، ادغام شخص ثالث و کاهش زمان توسعه است.ادغام ابزاریکی از قدرتمندترین قابلیت‌های سیستم‌های هوش مصنوعی مدرن، توانایی آن‌ها در استفاده از ابزارها و خدمات خارجی است. MCP این ادغام را از طریق رویکردهای استاندارد شده ساده می‌کند.این رویکرد استاندارد شده برای ادغام ابزار، ساخت برنامه‌های کاربردی هوش مصنوعی را که می‌توانند با دنیای خارج تعامل داشته باشند، به اطلاعات دسترسی پیدا کنند و از طرف کاربران اقداماتی را انجام دهند، آسان‌تر می‌کند.بهبود تجربه کاربریدر نهایت، مزایای فنی MCP به بهبودهای ملموس در تجربه کاربری تبدیل می‌شود.تعاملات منسجم‌تر: سیستم‌های هوش مصنوعی می‌توانند زمینه را به طور مؤثرتری حفظ کنند، که منجر به مکالمات طبیعی‌تر و مفیدتر می‌شود.قابلیت‌های پیشرفته: ادغام با ابزارها و خدمات خارجی، آنچه را که سیستم‌های هوش مصنوعی می‌توانند برای کاربران انجام دهند، گسترش می‌دهد.شخصی‌سازی: مدیریت بهتر زمینه امکان تجربیات شخصی‌سازی‌شده‌تر بر اساس تاریخچه و ترجیحات کاربر را فراهم می‌کند.قابلیت اطمینان: رویکردهای استاندارد شده برای مدیریت زمینه، خطاها و ناسازگاری‌ها را در رفتار هوش مصنوعی کاهش می‌دهد.نکته کلیدیبا پرداختن به این چالش‌های اساسی در توسعه هوش مصنوعی، MCP امکان ایجاد برنامه‌های کاربردی هوش مصنوعی پیچیده‌تر، منسجم‌تر و توانمندتر را فراهم می‌کند که می‌توانند نیازهای کاربران را بهتر برآورده سازند.در بخش بعدی، مفاهیم اصلی MCP را با جزئیات بیشتری بررسی خواهیم کرد و درک عمیق‌تری از نحوه عملکرد پروتکل و اجزای آن ارائه خواهیم داد.04. مفاهیم اصلی MCPپروتکل زمینه‌ی مدل (MCP) حول چندین مفهوم کلیدی ساخته شده است که با هم کار می‌کنند تا یک چارچوب جامع برای مدیریت زمینه فراهم کنند. درک این مفاهیم اصلی برای پیاده‌سازی و استفاده مؤثر از MCP در برنامه‌های کاربردی هوش مصنوعی ضروری است.شیء زمینه (Context Object)شیء زمینه عنصر مرکزی MCP است و به عنوان ظرفی (container) برای تمام اطلاعات مورد نیاز مدل هوش مصنوعی برای تولید پاسخ‌های مناسب عمل می‌کند.تعریف: یک شیء داده ساختاریافته که تمام زمینه‌های مرتبط برای یک تعامل هوش مصنوعی را کپسوله (encapsulate) می‌کند.هدف: اطلاعات مورد نیاز مدل هوش مصنوعی برای درک وضعیت فعلی مکالمه و تولید پاسخ‌های مرتبط را فراهم می‌کند.اجزا: شامل فراداده، تاریخچه/حافظه، ابزارها، منابع (resources) و پرامپت (prompt) فعلی است.شیء زمینه به عنوان یک منبع واحد حقیقت (single source of truth) برای مدل هوش مصنوعی عمل می‌کند و تمام اطلاعاتی را که برای حفظ تعاملات منسجم و متناسب با زمینه نیاز دارد، در بر می‌گیرد.زنجیره‌های حافظه / رشته‌ها (Memory Chains / Threads)تعریف و هدفتعریف: دنباله‌های مرتب شده از پیام‌های رد و بدل شده بین کاربر و هوش مصنوعی.هدف: هوش مصنوعی را قادر می‌سازد تا به بخش‌های قبلی مکالمه ارجاع دهد و پیوستگی را حفظ کند.ساختار: معمولاً شامل محتوای پیام، مُهرهای زمانی (timestamps) و اطلاعات نقش (کاربر یا هوش مصنوعی) است.{
  &amp;quotmemory&amp;quot: {
    &amp;quotmessages&amp;quot: [
      {
        &amp;quotrole&amp;quot: &amp;quotsystem&amp;quot,
        &amp;quotcontent&amp;quot: &amp;quotYou are a helpful assistant.&amp;quot
      },
      {
        &amp;quotrole&amp;quot: &amp;quotuser&amp;quot,
        &amp;quotcontent&amp;quot: &amp;quotWhat&#039;s the weather like today?&amp;quot,
        &amp;quottimestamp&amp;quot: &amp;quot2024-03-24T14:30:00Z&amp;quot
      },
      {
        &amp;quotrole&amp;quot: &amp;quotassistant&amp;quot,
        &amp;quotcontent&amp;quot: &amp;quotI need to check that for you.&amp;quot,
        &amp;quottimestamp&amp;quot: &amp;quot2024-03-24T14:30:05Z&amp;quot
      }
    ]
  }
}(نمونه‌ای از یک زنجیره حافظه در قالب MCP)زنجیره‌های حافظه به هوش مصنوعی اجازه می‌دهند تا پیوستگی را در مکالمات حفظ کند، به اظهارات قبلی ارجاع دهد و بر اساس تعاملات قبلی بنا کند.فراخوانی‌های ابزار و پاسخ‌های ابزار (Tool Calls &amp; Tool Responses)فراخوانی‌ها و پاسخ‌های ابزار، مدل‌های هوش مصنوعی را قادر می‌سازد تا با سیستم‌های خارجی تعامل داشته باشند و قابلیت‌های خود را فراتر از داده‌های آموزشی‌شان گسترش دهند.نموداری که جریان فراخوانی‌های ابزار و پاسخ‌ها را در چارچوب MCP نشان می‌دهد. این نمودار تعامل بین مدل هوش مصنوعی، لایه MCP و ابزار خارجی را با مراحل درخواست، اجرا، بازگرداندن نتیجه و تولید پاسخ نهایی به تصویر می‌کشد.فراخوانی‌های ابزارتعریف: درخواست‌های ساختاریافته از هوش مصنوعی به ابزارها یا خدمات خارجی.اجزا: نام ابزار، پارامترها و زمینه اجرا (execution context).مثال استفاده: کوئری‌های پایگاه داده، درخواست‌های API، عملیات فایل.پاسخ‌های ابزارتعریف: داده‌های بازگردانده شده از ابزارهای خارجی به هوش مصنوعی.اجزا: داده‌های نتیجه، فراداده، اطلاعات خطا.ادغام: برای پردازش بیشتر در زمینه گنجانده می‌شود.این رویکرد استاندارد شده برای ادغام ابزار، مدل‌های هوش مصنوعی را قادر می‌سازد تا به طور یکپارچه با پایگاه‌های داده، APIها و سایر سیستم‌های خارجی تعامل داشته باشند و قابلیت‌های آن‌ها را به طور قابل توجهی گسترش می‌دهد.وضعیت‌های عامل / زمینه اجرا (Agent States / Execution Context)وضعیت‌های عامل وضعیت فعلی و پیشرفت عامل هوش مصنوعی را ردیابی می‌کنند:تعریف: اطلاعات مربوط به وضعیت فعلی عامل هوش مصنوعی و وظایف آن.هدف: هوش مصنوعی را قادر می‌سازد تا پیشرفت را ردیابی کند، وظایف چند مرحله‌ای را مدیریت کند و از اهداف آگاه باشد.اجزا: اهداف فعلی، پیشرفت وظیفه، تاریخچه تصمیم‌گیری و اطلاعات برنامه‌ریزی.این مفهوم به ویژه برای وظایف چند مرحله‌ای مهم است که در آن هوش مصنوعی نیاز به حفظ آگاهی از پیشرفت و مراحل بعدی خود دارد.فراداده و تاریخچه (Metadata &amp; History)این فراداده به هوش مصنوعی کمک می‌کند تا زمینه گسترده‌تر تعامل را درک کند و می‌تواند برای شخصی‌سازی پاسخ‌ها بر اساس ترجیحات و تاریخچه کاربر استفاده شود.سریال‌سازی/دی‌سریال‌سازی (Serialization/Deserialization)سریال‌سازی و دی‌سریال‌سازی فرآیندهای حیاتی برای تبدیل اشیاء زمینه به و از فرمت‌های مناسب برای ذخیره‌سازی یا انتقال بین اجزای سیستم هستند.جنبه‌های کلیدیتعریف: تبدیل اشیاء زمینه به فرمت‌های سریال‌شده (مانند JSON) و بالعکس.هدف: امکان ذخیره‌سازی زمینه، انتقال بین اجزا و بازسازی آن در صورت نیاز.پیاده‌سازی: MCP فرمت‌ها و رویه‌های استانداردی را برای سریال‌سازی و دی‌سریال‌سازی تعریف می‌کند.// Serialization example
const contextObject = {
  metadata: { sessionId: &amp;quotsess-123&amp;quot, userId: &amp;quotuser-456&amp;quot },
  memory: { messages: [...] },
  tools: [...],
  currentPrompt: &amp;quotWhat&#039;s the weather like?&amp;quot
};

// Convert to JSON string for transmission
const serialized = JSON.stringify(contextObject);

// Deserialization on receiving end
const deserializedContext = JSON.parse(serialized);(مثال سریال‌سازی و دی‌سریال‌سازی)این فرآیندها برای حفظ زمینه در اجزای مختلف یک سیستم هوش مصنوعی و برای پایدارسازی زمینه بین جلسات ضروری هستند.نموداری که شیء زمینه MCP و اجزای آن را نشان می‌دهد، از جمله فراداده، تاریخچه/حافظه، ابزارها، منابع و پرامپت فعلی، و نحوه ساختاربندی انواع مختلف اطلاعات در داخل زمینه را به تصویر می‌کشد.نکته کلیدیاین مفاهیم اصلی با هم اساس پروتکل زمینه‌ی مدل را تشکیل می‌دهند و چارچوب جامعی برای مدیریت زمینه در تعاملات هوش مصنوعی فراهم می‌کنند. با استانداردسازی این مفاهیم و روابط آن‌ها، MCP امکان ایجاد برنامه‌های کاربردی هوش مصنوعی پیچیده‌تر، منسجم‌تر و توانمندتر را فراهم می‌کند.در بخش بعدی، معماری MCP را بررسی خواهیم کرد و نحوه پیاده‌سازی این مفاهیم در عمل و تعامل اجزای مختلف یک سیستم مبتنی بر MCP را بررسی می‌کنیم.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Mon, 05 May 2025 22:33:33 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای توسعه‌دهندگان موبایل به سمت کهکشان: فصل چهارم</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D9%81%D8%B5%D9%84-%DA%86%D9%87%D8%A7%D8%B1%D9%85-br7nw4q1ngsj</link>
                <description>فصل سوم را از این جا بخوانید.فصل چهارم: توسعه آی‌او‌اس (iOS Development)تصویر فصل چهارم کتابنویسندگان: سوئن هوتاپ (Swen Hutop) و دنیس کلوگه (Dennis Kluge)در سال 2007، اپل (Apple) آیفون (iPhone) را معرفی کرد و به طور قابل توجهی نحوه درک و تعامل ما با تلفن‌های همراه را تغییر داد. علاوه بر خود دستگاه، دو عامل دیگر سهم قابل توجهی در موفقیت آن داشتند. اولاً، سیستم‌عامل جدید آی‌او‌اس (iOS)، که به طور رادیکال برای تعامل مبتنی بر ژست (gesture-based interaction) طراحی شده بود و اطمینان حاصل می‌کرد که سخت‌افزار و نرم‌افزار به طور یکپارچه با هم ادغام می‌شوند. ثانیاً، اپ استور (App Store) پلتفرم را باز کرد و امکان نصب برنامه‌های شخص ثالث (third-party apps) را ایجاد کرد که منجر به بازاری پر رونق شد که انتخاب عظیمی را در اختیار کاربران قرار می‌دهد.با گذشت زمان، سیستم‌عامل اصلی گوشی هوشمند از یک اکوسیستم زمانی بسته، تحول شدیدی را پشت سر گذاشته است. اکنون شامل چندین شکل است: آی‌او‌اس برای گوشی‌های هوشمند، آی‌پداواس (iPadOS) برای تبلت‌ها، واچ‌اواس (watchOS) برای ساعت‌های هوشمند و تی‌وی‌اواس (tvOS) برای تلویزیون‌ها. همه مشتقات از همان پایه فنی استفاده می‌کنند و عناصر خاصی را برای ایجاد برنامه‌ها ارائه می‌دهند. این برنامه‌ها با استفاده از اکس‌کد (Xcode) به عنوان محیط توسعه (development environment) توسعه می‌یابند.هنگام مقایسه آی‌او‌اس با اندروید (Android)، یکی از مزایای کلیدی آن عدم پراکندگی (fragmentation) در مقایسه با اندروید است: ده ماه پس از انتشار آی‌او‌اس 12، قبلاً روی بیش از 80 درصد دستگاه‌ها نصب شده بود. در مقایسه، نسخه 9 اندروید تنها در عرض یک سال کامل پس از انتشار به 10 درصد رسید. نه تنها نسخه‌های آی‌او‌اس اساساً سریع‌تر پخش می‌شوند، بلکه طول عمر آیفون‌ها نیز شگفت‌انگیز است. دوره به‌روزرسانی حدود چهار سال است: حتی آیفون 6s که اولین بار در سال 2015 با آی‌او‌اس 9 عرضه شد، هنوز هم می‌تواند به آی‌او‌اس 13 به‌روز شود.جنبه دیگری که اپل اهمیت زیادی به آن می‌دهد، امنیت و حریم خصوصی است. به عنوان مثال، در آی‌او‌اس 13، می‌توانید از اپل آیدی (Apple ID) شخصی خود برای ورود ایمن به وب‌سایت‌ها استفاده کنید، همانطور که با لاگین فیسبوک (Facebook login) نیز ممکن است. تفاوت قابل توجه در اینجا این است که فقط داده‌های تولید شده به صورت تصادفی در اختیار برنامه‌ها قرار می‌گیرد.توسعه برنامه‌های آی‌او‌اساول از همه، برای توسعه برنامه‌های آی‌او‌اس، به رایانه‌ای نیاز دارید که مک‌اواس (macOS) را اجرا کند. اپل دسترسی به ابزارهای توسعه خود را محدود می‌کند، زیرا این ابزارها فقط در پلتفرم آن قابل استفاده هستند. قبل از شروع کدنویسی، لازم است یک اپل آیدی و یک حساب توسعه‌دهنده ایجاد کنید. اگر قصد انتشار برنامه یا تحویل آن به گروه تست بتا (beta test group) را دارید، باید در برنامه توسعه‌دهندگان اپل (Apple Developer Program)⁴ مشترک شوید. هزینه‌های سالانه 99 دلار است.معماری سیستم‌عامل آی‌او‌اس در لایه‌های مختلفی (برای نمونه به این لینک مراجعه کنید) ساخته شده است. با Core OS شروع می‌شود که دسترسی به سخت‌افزار، حسگرها و غیره را مدیریت می‌کند. Core Service و Media لایه‌های میانی هستند که به عنوان مثال تصاویر، ویدئو و صدا را مدیریت می‌کنند. و در نهایت Cocoa Touch، که چارچوب اصلی مورد استفاده توسعه‌دهندگان است. این لایه ایجاد رابط کاربری (UI creation)، ورودی لمسی (Touch Input) و غیره را مدیریت می‌کند. هر لایه انتزاع خاصی را اضافه می‌کند که مدیریت منطق زیربنایی را بسیار آسان‌تر می‌کند.انتخاب ابزار مناسب برای توسعه نسبتاً آسان است. با اکس‌کد، اپل یک محیط توسعه یکپارچه (Integrated Development Environment - IDE) رایگان ارائه می‌دهد که به شما امکان می‌دهد برنامه خود را ایجاد، آزمایش و توزیع کنید. اگر به دنبال جایگزینی هستید، توصیه می‌کنیم نگاهی به اَپ‌کُد (AppCode) جت‌برینز (JetBrain&amp;amp;#x27;s AppCode) بیندازید.اکس‌کد به شما امکان می‌دهد به راحتی یک پروژه جدید ایجاد کنید؛ چندین الگو (templates) برای برنامه‌های آی‌او‌اس، آی‌پداواس و واچ‌اواس در دسترس هستند. پس از انتخاب هدف خود، باید یک شناسه برنامه (App ID) ارائه دهید. این شناسه منحصر به فرد برای تمایز برنامه شما از دیگران استفاده می‌شود. می‌توان آن را از طریق پورتال توسعه‌دهندگان اپل (Apple Developer Portal) ایجاد کرد. علاوه بر این، لازم است کلیدهایی برای امضای برنامه خود ایجاد کنید. این فرآیند اطمینان حاصل می‌کند که برنامه از شما، به عنوان یک توسعه‌دهنده تأیید شده، نشأت گرفته است. امروزه اکس‌کد کل این رویه امضا کردن (signing procedure) را به طور خودکار مدیریت می‌کند.زبان اصلی برنامه‌نویسی برنامه، سوئیفت (Swift) است. این یک زبان چند پارادایمی (multi-paradigm language) نسبتاً جدید است که در سال 2014 توسط اپل منتشر شد و در سال‌های اخیر کشش زیادی ایجاد کرده است. سلف آن آبجکتیو-سی (Objective-C) بود، یک تفسیر شیءگرا (object-oriented) از زبان C.الگوی اصلی مورد استفاده برای توسعه MVC – Model View Controller است. با این حال، رویکردهای متفاوتی مانند MVVM (Model-View-ViewModel) یا حتی برنامه‌نویسی واکنشی (reactive programming) امکان‌پذیر است. دومی پس از انتشار SwiftUI و چارچوب Combine توسط اپل، کشش بیشتری پیدا کرد. هر دو در یک زیرفصل بیشتر توضیح داده شده‌اند.بسیاری از برنامه‌های آی‌او‌اس به خاطر رابط‌های کاربری تمیز و زیبایشان شناخته شده‌اند. این‌ها را می‌توان با استفاده از اینترفیس بیلدر (Interface Builder) توسعه داد، ابزاری که توسط اکس‌کد ارائه شده و به شما امکان می‌دهد نمای (view) خود را به صورت تعاملی پیکربندی کنید. راه دیگر، اعلان رابط کاربری در کد سوئیفت شما است. هر دو روش اثبات شده و کافی هستند. دستورالعمل‌های رابط انسانی (Human Interface Guidelines) اپل قوانین و استانداردهایی را برای برنامه‌ها و رابط‌های کاربری آنها ارائه می‌دهد. خواندن آن، به خصوص برای مبتدیان، ارزشمند است.یک پلتفرم عظیم مانند آی‌او‌اس مزیت یک اکوسیستم توسعه‌دهنده بزرگ را به همراه دارد. بسیاری از کتابخانه‌ها منبع باز هستند و می‌توانند در برنامه شما ادغام شوند. کوکوپادز (Cocoapods) ابزاری است که به شما امکان می‌دهد کد شخص ثالث را در پروژه آی‌او‌اس خود ادغام کنید. به عنوان مثال، اگر نیاز به اضافه کردن Instagram API در برنامه جدید خود دارید، یک پاد (pod) برای آن وجود دارد.برنامه‌ها را می‌توان روی دستگاه آیفون یا از طریق شبیه‌ساز (simulator) آزمایش کرد. اکس‌کد ابزاری را ارائه می‌دهد که به شما امکان می‌دهد کد آی‌او‌اس خود را روی مک‌اواس اجرا کنید. شما قادر به انتخاب بین نسخه‌های مختلف سیستم‌عامل و انواع دستگاه هستید. این به طور کامل جایگزین آزمایش روی خود دستگاه نمی‌شود، اما یک گردش کار راحت را فراهم می‌کند. به خصوص زمان انتظار را کاهش می‌دهد زیرا اکس‌کد باید هر بار که می‌خواهید پس از ایجاد تغییر، آزمایشی را شروع کنید، برنامه را کامپایل و بسته‌بندی کند.جنبه‌های زیادی وجود دارد که باید در حین توسعه یک برنامه پوشش داده شوند. این شامل مواردی مانند تست واحد (unit testing) و اندازه‌گیری عملکرد (performance measuring) است. با XCTest و Profiler، اپل ابزارهایی را ارائه می‌دهد که قبلاً این جنبه‌ها را پوشش داده‌اند.ما یک زیرفصل کامل را به جنبه‌های توزیع و کسب درآمد اختصاص داده‌ایم، زیرا راه‌ها و روش‌های مختلف زیادی وجود دارد. درک این نکته مهم است که برخی محدودیت‌ها و دستورالعمل‌های روشنی وجود دارد.شروع توسعه آی‌او‌اس با برخی موانع ورودی همراه است. اینها شامل دانش سوئیفت و مقداری درک کلی در مورد نحوه توسعه برنامه‌های رابط کاربری است. خوشبختانه، طیف گسترده‌ای از منابع باز قبلاً وجود دارد. اینها در بخش دیگری پوشش داده شده‌اند. ارزش تلاش برای تبدیل شدن به بخشی از یکی از جالب‌ترین بازارهای امروز را دارد.آی‌پداواس (iPadOS)با اولین نسخه آی‌پداواس، که در پاییز 2019 به صورت عمومی منتشر شد، تبلت اپل نوع سیستم‌عامل بسیار خاص خود را دریافت کرد - که قبلاً همان سیستم‌عامل دستگاه‌های آیفون را اجرا می‌کرد. با آی‌پداواس، اپل موفق شده است به آی‌پد (iPad) اجازه دهد تا جهش بزرگی در زمینه استفاده حرفه‌ای داشته باشد. اول و مهمتر از همه، گزینه‌های چندوظیفگی (multitasking) به شدت گسترش یافته‌اند. علاوه بر تصویر در تصویر (Picture-in-Picture) و نمای تقسیم‌شده (Split View)، قابلیت Slide Over همچنین امکان جابجایی بسیار سریع بین برنامه‌ها را فراهم می‌کند. یکی دیگر از ویژگی‌های مورد انتظار طولانی مدت، گزینه دسترسی مستقیم به هارد دیسک‌های USB و کارت‌های SD متصل از طریق برنامه بومی فایل‌ها (Files app) است.سایر ویژگی‌های جدید مهم آی‌پداواس 13 عبارتند از:چند پنجره‌ای (Multiple Windows)پشتیبانی از چند پنجره برای آی‌پدها امکان باز کردن همزمان چندین پنجره از یک برنامه را در آی‌پد معرفی کرد. به عنوان مثال، می‌توانید به سادگی نماد برنامه‌ای را از داک (dock) به کنار صفحه منتقل کنید تا پنجره‌های موجود را انتخاب کنید یا یک پنجره جدید باز کنید. سیستم دو نوع پنجره مختلف ارائه می‌دهد: پنجره اصلی (primary window)، که می‌تواند شامل چندین شیء برنامه باشد و توسط کاربران در یک دوره طولانی‌تر استفاده می‌شود. و ثانیاً، پنجره کمکی (auxiliary window). این فقط می‌تواند شامل یک شیء واحد از یک برنامه باشد. معمولاً، فقط برای انجام یک عمل واحد قبل از بستن پنجره کمکی استفاده می‌شود. به عنوان مثال، در برنامه ایمیل (Mail app)، پنجره اصلی می‌تواند برای نمایش صندوق ورودی استفاده شود، در حالی که پنجره کمکی فقط برای نوشتن یک ایمیل استفاده می‌شود.کشیدن و رها کردن (Drag &amp; Drop)یکی از بزرگترین پیشرفت‌ها در آی‌پداواس، علاوه بر چندوظیفگی، فعالیت کشیدن و رها کردن است. در آیفون این فقط در یک برنامه امکان‌پذیر است. در آی‌پد، داده‌ها، متن و تصاویر حتی می‌توانند در بین برنامه‌ها جابجا شوند. می‌توانید هر تعداد فعالیت کشیدن که می‌خواهید شروع کنید. این به طور قابل توجهی فرصت‌های موجود برای استفاده مولد از آی‌پد را افزایش می‌دهد.برنامه مبدأ و مقصد برای داده‌هایی که باید جابجا شوند به صورت موازی اجرا می‌شوند و متوقف نمی‌شوند، به طوری که می‌توانید به استفاده از آنها ادامه دهید. همچنین می‌توانید داک را فراخوانی کرده و برنامه دیگری را در نمای تقسیم‌شده باز کنید.از دیدگاه توسعه‌دهندگان، امکان توسعه/طراحی برنامه در اینجا وجود دارد به طوری که کاربر به طور متوالی آیتم‌های کشیدن (Drag Items)، یعنی چیزهایی که می‌خواهد جابجا کند، را اضافه کند. سپس برنامه مقصد می‌تواند این آیتم‌ها را بپذیرد و ذخیره کند.نماهای متنی (Text views) و فیلدهای متنی (text fields) به طور خودکار از کشیدن و رها کردن پشتیبانی می‌کنند. نماهای مجموعه (Collection views) و جدول (table views) متدها و ویژگی‌های خاصی را برای انجام این کار ارائه می‌دهند. برای نماهای متنی، یک API ارائه شده است که امکان تنظیم رفتار کشیدن و رها کردن برای نماها را فراهم می‌کند. علاوه بر این، هر عنصر رابط کاربری سفارشی را می‌توان به منظور پشتیبانی از کشیدن و رها کردن پیکربندی کرد. یکی از نکات کلیدی این است که توسعه‌دهندگان نیازی به نگرانی در مورد امنیت انتقال داده‌ها بین دو برنامه ندارند، زیرا آی‌پداواس امنیت را در این زمینه پوشش می‌دهد.سوئیفت‌یوآی (SwiftUI)اپل سوئیفت‌یوآی را در کنفرانس سالانه توسعه‌دهندگان جهانی (WWDC - Worldwide Developers Conference) خود در سال 2019 معرفی کرد. این نشان‌دهنده رویکرد جدیدی برای توسعه رابط‌های کاربری برای همه پلتفرم‌های اپل است. در نتیجه، اکنون امکان توسعه رابط‌های کاربری سوئیفت‌یوآی برای واچ‌اواس و بنابراین برای کوچکترین نمایشگر اپل، تا تی‌وی‌اواس برای نمایشگرهای بزرگ تلویزیون وجود دارد.بنابراین، سوئیفت‌یوآی از یک سینتکس اعلانی (declarative syntax) استفاده می‌کند. این بدان معنی است که به توصیف آنچه پس از ورودی‌ها اتفاق می‌افتد و نحوه پاسخگویی رابط کاربری به این اقدامات کمک می‌کند. این کار کد نوشته شده را ساده می‌کند، درک را تسهیل می‌بخشد و خوانایی را افزایش می‌دهد. حتی انیمیشن‌ها نیز بسیار آسان‌تر در سوئیفت‌یوآی ادغام می‌شوند.اکس‌کد 11 شامل ابزارهای طراحی بصری جدیدی است که به توسعه‌دهندگان امکان می‌دهد از سوئیفت‌یوآی برای توسعه رابط‌های کاربری جدید استفاده کنند. تغییرات ایجاد شده در کد حتی می‌توانند مستقیماً در آنجا پیش‌نمایش شوند. به طور مشابه، تغییرات در پیش‌نمایش مستقیماً کد سوئیفت را دستکاری می‌کنند. این به برنامه‌نویسان امکان می‌دهد بخش‌هایی از برنامه را به صورت پویا تطبیق دهند، زیرا دائماً در حال کامپایل و اجرا هستند. در مقایسه با وضعیت فعلی، این یک گام بزرگ به جلو است. پیش از این، در مقایسه، برنامه باید پس از هر تنظیم برای مشاهده تغییرات به آیفون یا شبیه‌ساز منتقل می‌شد. سوئیفت‌یوآی و اکس‌کد 11 به شما امکان می‌دهند چندین پیش‌نمایش را همزمان باز کنید تا پیکربندی‌های مختلفی مانند اندازه‌های مختلف متن، زبان‌ها یا حالت تاریک را آزمایش کنید.کاتالیست (Catalyst)بازار پررونق دستگاه‌های تلفن همراه منجر به کاهش محبوبیت سیستم‌عامل دسکتاپ مک‌اواس اپل برای توسعه‌دهندگان شده است. در همان زمان، پایه فنی برای توسعه برنامه‌ها در پلتفرم‌های تلفن همراه و دسکتاپ به طور فزاینده‌ای از هم دور شده است. عامل تعیین کننده موفقیت آی‌او‌اس، یوآی‌کیت (UIKit) بوده است. این فناوری پایه و اساس تجربه رابط کاربری را که از اپل انتظار داریم، نشان می‌دهد. از سوی دیگر، برنامه‌های مک‌اواس هنوز بر اساس سلف یوآی‌کیت یعنی اَپ‌کیت (AppKit) هستند. این بدان معنی است که برنامه‌های آی‌او‌اس فقط با تلاش زیاد می‌توانستند به محیط دسکتاپ منتقل شوند. همه اینها منجر به کاهش محبوبیت مک‌اواس در بین توسعه‌دهندگان شده است.در طول WWDC در سال 2019، اپل برنامه اقدام خود را برای رسیدگی به این موضوع اعلام کرد: پروژه کاتالیست اکنون پلتفرم‌های تلفن همراه و دسکتاپ را متحد می‌کند. قرار است کاتالیست پورت کردن برنامه‌های آی‌پداواس به مک‌اواس را با تطبیق رابط کاربری و تفسیر ورودی‌ها آسان کند. به عنوان مثال، ژست‌های لمسی به طور خودکار به تعاملات ماوس ترجمه می‌شوند.به عنوان یک سرمایه‌گذاری در پلتفرم موبایل اپل، این بدان معناست که بازارها و هم‌افزایی‌های جدید با تلاش اضافی کمی ایجاد می‌شوند. ایجاد یک برنامه آی‌پد، به طور خودکار به این معنی است که یک برنامه مک‌اواس نیز می‌تواند ایجاد شود. همچنین به این معنی است که می‌توان گروه‌های هدف جدیدی را مورد خطاب قرار داد و کانال‌های کسب درآمد متفاوتی را باز کرد.واچ‌اواس (watchOS)واچ‌اواس همراه با اپل واچ در آوریل 2015 ارائه شد و مشتقی از آی‌او‌اس است که به ویژه برای این دستگاه طراحی شده است. الگوهای تعامل کاربر و کل رابط کاربری با صفحه نمایش کوچک سازگار شده است که امکان تعامل چند انگشتی را نمی‌دهد. به همین دلیل است که اپل ساعت را به یک تاج دیجیتال (digital crown) و یک دکمه کناری (side button) نیز مجهز کرده است. تاج به کاربران امکان می‌دهد در برنامه‌ها پیمایش و بزرگنمایی کنند. دکمه کناری به عنوان نوعی دکمه هوم (home button) اصلاح شده که از آیفون و آی‌پد شناخته شده است، عمل می‌کند.قلب رابط کاربری را صفحه‌های ساعت تعاملی (interactive dials) تشکیل می‌دهند. علاوه بر نشان دادن زمان، آنها همچنین اطلاعات یا گزینه‌های تعاملی مورد نظر کاربر را نمایش می‌دهند. این پیچیدگی‌ها (Complications) امکان دسترسی به برنامه‌ها یا نمایش داده‌ها را فراهم می‌کنند.اپل انواع مختلفی از صفحه‌های ساعت را ارائه می‌دهد. اینها از نمایش‌های مینیمالیستی تا تفسیرهای ساعت آنالوگ را شامل می‌شوند.اکوسیستم به کاربران امکان می‌دهد برنامه‌های شخص ثالث را نصب کنند. با این حال، تا واچ‌اواس 5، اینها با یک برنامه آی‌او‌اس برای آیفون همراه بودند. دلیل این امر این بود که بخش‌هایی از منطق روی گوشی هوشمند اجرا می‌شد. آیفون همچنین اتصال اینترنت را برای نسل‌های اول ساعت فراهم می‌کرد. از آی‌او‌اس 13، اپل اجازه برنامه‌های مستقل اپل واچ را می‌دهد. واچ‌اواس 6 یک اپ استور جداگانه برای این منظور معرفی کرد. این بدان معنی است که اپل واچ اکنون می‌تواند به عنوان یک دستگاه مستقل و خودکفا در نظر گرفته شود.برنامه‌های واچ را می‌توان با استفاده از زیرساخت توسعه ارائه شده توسط اپل ایجاد کرد. یک شبیه‌ساز ویژه در اکس‌کد برای این منظور وجود دارد. علاوه بر این، واچ‌کیت (WatchKit) به عنوان یک چارچوب (framework) ارائه شده است. از جمله موارد دیگر، دسترسی به حسگرها، ارسال اعلان‌ها و بسیاری موارد دیگر را فراهم می‌کند. چارچوب رابط کاربری آی‌او‌اس یوآی‌کیت (UIKit) نیز در ساعت موجود است.اپل به تکامل پلتفرم ساعت هوشمند خود با به‌روزرسانی‌های سالانه ادامه می‌دهد. خودکفایی روزافزون اپل واچ و تمرکز آن بر سلامت، بازار بزرگی ایجاد کرده است. اپل هیچ آمار فروشی را اعلام نمی‌کند اما این محبوب‌ترین ساعت است و اپل حتی امروزه از رولکس (Rolex) در این بخش از بازار پیشی گرفته است.توزیع، اپ استور و کسب درآمدتوزیع برنامه‌های آی‌او‌اس منحصراً از طریق اپ استور اپل انجام می‌شود. کاربران در حال حاضر سالانه تقریباً 120 میلیارد دلار برای برنامه‌های آی‌او‌اس هزینه می‌کنند. با این حال، دوران تب طلا (gold rush mode) روزهای اولیه به دلیل رقابت گسترده به پایان رسیده است: در حال حاضر بیش از 2 میلیون برنامه مختلف برای دستگاه‌های آی‌او‌اس در دسترس است.آپلود برنامه‌ها در اپ استور نیاز به عضویت در برنامه توسعه‌دهندگان اپل دارد. دو مدل مختلف در اینجا وجود دارد. برنامه توسعه‌دهندگان اپل، توزیع برنامه‌ها را در اپ استور آی‌او‌اس برای مخاطبان عمومی تسهیل می‌کند. با برنامه سازمانی (Enterprise Program)، اپل همچنین امکان توزیع برنامه‌ها را فقط برای یک پایگاه کاربر اختصاصی ارائه می‌دهد. این به ویژه برای شرکت‌هایی مهم است که می‌خواهند ابزارهایی را برای استفاده داخلی، فقط برای کارمندان خود، ارائه دهند.اپل بر کنترل دقیق محتوا و عملکرد هر برنامه‌ای که به فروشگاه ارسال می‌شود، اصرار دارد. آنها تمام ارسال‌های برنامه را بررسی می‌کنند تا خطر ارائه بدافزار (malware) به کاربران خود را کاهش دهند. برای شما به عنوان یک توسعه‌دهنده، این بدان معناست که باید دستورالعمل‌های بررسی اپ استور (App Store Review Guidelines) را به دقت بخوانید تا از رد شدن جلوگیری کنید. و آماده باشید کمی صبر کنید تا برنامه شما در دسترس کاربران قرار گیرد، زیرا فرآیند بررسی ممکن است مدتی طول بکشد. تأخیر حداقل 24 ساعته باید در نظر گرفته شود. اپل فرآیند جداگانه‌ای برای موارد اضطراری و اشکالات جدی ارائه می‌دهد.با کمک تست‌فلایت (TestFlight)، برنامه‌ها و به‌روزرسانی‌ها می‌توانند قبل از انتشار آزمایش شوند. تا 10000 آزمایش‌کننده را می‌توان دعوت کرد که می‌توانند به طور مستقل از اپ استور از برنامه استفاده کنند. با این حال، اپل هنوز این نسخه‌های آزمایشی را قبل از توزیع بررسی می‌کند.کسب درآمد مستقیم از برنامه‌های آی‌او‌اس اساساً بر اساس سه مدل مختلف است: خرید یک‌باره (one-time purchase)، خرید درون‌برنامه‌ای (in-app purchase) و اشتراک‌ها (subscriptions). برای کسب اطلاعات بیشتر در مورد این گزینه‌ها (و سایر استراتژی‌ها)، حتماً فصل کسب درآمد را در این کتاب بخوانید.در سال‌های اخیر، اپل به طور فزاینده‌ای به استفاده از اشتراک‌ها روی آورده است. در اینجا، کاربران می‌توانند در برنامه یا خدمات درون برنامه مشترک شوند. اپل 30 درصد از فروش را به عنوان کارمزد برای همه این مدل‌های کسب درآمد نگه می‌دارد. این میزان برای اشتراک‌هایی که بیش از 12 ماه طول می‌کشند به 15 درصد کاهش می‌یابد.در سپتامبر 2019، اپل یک مدل کسب درآمد جدید، شبیه نتفلیکس، به ویژه برای بازی‌ها راه‌اندازی کرد. اپل آرکید (Apple Arcade) اشتراک ماهانه‌ای را ارائه می‌دهد که دسترسی انحصاری به بازی‌های منتخب را فراهم می‌کند.بیشتر بیاموزیدمزیت یک پلتفرم بالغ مانند آی‌او‌اس، مستندات سخاوتمندانه و مجموعه منابع آن است. تعدادی وب‌سایت عالی در اینترنت برای یادگیری توسعه آی‌او‌اس وجود دارد.سایت Developer.Apple.com: شامل مرجع کامل و راهنماهای برنامه‌نویسی برای توسعه‌دهندگان برای یادگیری نحوه توسعه برنامه‌های آی‌او‌اس و مرجع کلاس تمام کلاس‌ها در چارچوب‌های عمومی آنها است. وب‌سایت کتابخانه بر اساس انواع منابع، موضوعات و چارچوب‌ها به علاوه توانایی جستجو سازماندهی شده است. یک سند مهم که باید قبل از طراحی اولین برنامه خود بخوانید، دستورالعمل‌های رابط انسانی آی‌او‌اس است. این شامل توصیه‌های مفیدی در مورد نحوه طراحی برنامه‌ها برای اطمینان از تجربه کاربری مثبت است.سایت Swift.org: خانه رسمی جامعه سوئیفت.سایت RayWenderlich.com: به یک سایت ضروری برای آموزش‌های رایگان آی‌او‌اس تبدیل شده است که توسط جامعه توسعه‌دهندگان او نوشته شده است با این هدف که &quot;جالب‌ترین و چالش‌برانگیزترین موضوعات را انتخاب کرده و آنها را برای همه آسان کند تا یاد بگیرند - تا همه ما بتوانیم برنامه‌های شگفت‌انگیزی بسازیم.&quot; این سایت به ارائه کتاب‌های برنامه‌نویسی و آموزش‌های ویدئویی (با عضویت پولی) گسترش یافته است. در پادکست هفتگی آنها برای آخرین اخبار مرتبط با توسعه‌دهندگان و مصاحبه با رهبران جامعه توسعه‌دهندگان آی‌او‌اس مشترک شوید.سایت iOSDevWeekly.com: یک جمع‌بندی هفتگی از بهترین پیوندهای توسعه آی‌او‌اس. دیو وِرور (Dave Verwer) این سایت را اداره می‌کند و آنها یک خبرنامه ایمیل هفتگی را هر جمعه منتشر می‌کنند.سایت Merowing.info: وبلاگی از توسعه‌دهنده/مربی/سخنران، کریستوف زابلوکی (Krzysztof Zablocki) که آموزش‌ها و بینش‌هایی را در مورد توسعه آی‌او‌اس از تجربه خود به عنوان مشاور ارائه می‌دهد. او همچنین در جامعه منبع باز فعال است و ابزارها و کتابخانه‌هایی را برای توسعه‌دهندگان آی‌او‌اس ایجاد می‌کند.سایت AshFurrow.com: یکی دیگر از وبلاگ‌نویسان/توسعه‌دهندگان محبوب آی‌او‌اس که با افتخار بیان می‌کند که هدف وبلاگ او &quot;کاوش در نقاط دردناک آی‌او‌اس&quot; است. او چندین کتاب توسعه آی‌او‌اس تألیف کرده است، سخنران فعالی است و در جامعه منبع باز مشارکت دارد.خبرنامه This Week in Swift: یک خبرنامه هفتگی شامل جالب‌ترین اخبار، پیشرفت‌ها، آموزش‌ها و نکات کلی مرتبط با سوئیفت مربوط به توسعه آی‌او‌اس.خلاصه و چشم‌اندازاز زمان انتشار اولیه آن در سال 2007، آی‌او‌اس از بسیاری جهات تغییر کرده و متنوع شده است. آی‌او‌اس که در ابتدا به عنوان یک سیستم‌عامل خالص گوشی هوشمند تأسیس شد، امروزه روی تبلت‌ها، ساعت‌ها و حتی تلویزیون‌ها اجرا می‌شود. فراتر از آن، توسعه نشان می‌دهد که اپل به طور فزاینده‌ای می‌خواهد آی‌او‌اس را به عنوان یک جایگزین کامل برای دسکتاپ تثبیت کند. دقیقاً، این با ایده آی‌پداواس تقویت می‌شود.علاوه بر این، تمرکز بر سطوح تعامل جایگزین در حال گسترش است. به عنوان مثال، سرمایه‌گذاری‌هایی در سیری (Siri) و ادغام رابط‌های کاربری صوتی (voice UIs) در برنامه‌ها انجام می‌شود. علاوه بر این، با ARKit، تمرکز بر برنامه‌های واقعیت افزوده (augmented reality applications) قابل مشاهده است. این فضا را برای گمانه‌زنی در مورد مشتقی از آی‌او‌اس برای عینک‌های واقعیت افزوده (AR glasses)، دستگاه‌های جدید اپل و بازارهای جدیدی که باز می‌شوند، ایجاد می‌کند.آخرین اما نه کم‌اهمیت‌ترین، واضح است که اپل به طور فزاینده‌ای یادگیری ماشین را مستقیماً در دستگاه‌های خود ادغام می‌کند. CoreML به توسعه‌دهندگان امکان می‌دهد به راحتی راه‌حل‌های هوش مصنوعی (AI) خود را پیاده‌سازی کنند.آی‌او‌اس یک پلتفرم حیاتی و فعال با یک اکوسیستم بالغ است. به این مهمانی بپیوندید.فصل پنجم را از این جا بخوانید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Sun, 04 May 2025 23:50:28 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای توسعه‌دهندگان موبایل به سمت کهکشان: فصل سوم</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D9%81%D8%B5%D9%84-%D8%B3%D9%88%D9%85-nlovcrz2wezr</link>
                <description>فصل دوم را از این جا بخوانید.فصل سوم: توسعه اندروید (Android Development)نویسنده: دانیل بُهْرس (Daniel Böhrs)تصویر فصل سوم کتاباکوسیستم (The Ecosystem)پلتفرم اندروید (Android) توسط اتحادیه گوشی باز (Open Handset Alliance) به رهبری گوگل (Google) توسعه یافته و از سال 2007 به صورت عمومی در دسترس قرار گرفته است. استفاده از آن توسط اکثر تولیدکنندگان سخت‌افزار، آن را به سریع‌ترین سیستم‌عامل گوشی‌های هوشمند در حال رشد تبدیل کرده است که امروزه بر بازار تسلط دارد: بیش از 75 درصد از سهم بازار سیستم‌عامل موبایل در سراسر جهان. در کنفرانس توسعه‌دهندگان آی/او (I/O) 2019، گوگل اعلام کرد که 2.5 میلیارد دستگاه اندرویدی فعال وجود دارد که شامل پوشیدنی‌ها (wearables)، تبلت‌ها، ست‌تاپ باکس‌ها (set-top boxes)، تلویزیون‌ها، تلفن‌ها و سیستم‌های سرگرمی خودرو نیز می‌شود.اصطلاح اندروید، اکوسیستم کاملی را در کنار خود سیستم‌عامل توصیف می‌کند. گوگل و چندین شرکت دیگر مانند آمازون (Amazon)، فروشگاه‌ها، برنامه‌های پیش‌فرض و سایر اجزایی را ارائه می‌دهند که مستقیماً با خود سیستم‌عامل همراه نیستند. تمام اجزای مورد نیاز ترکیب شده، سیستمی قابل توسعه برای استفاده روزانه را در اختیار کاربر قرار می‌دهند. هر دستگاهی که مجوز گوگل را داشته باشد، مجاز به استفاده از سرویس گوگل پلی (Google Play Service) و فروشگاه گوگل پلی (Google Play Store) است. این فروشگاه حدود 2.4 میلیون برنامه³ ارائه می‌دهد و بزرگترین فروشگاه برنامه‌های کاربردی موبایل در سراسر جهان است. سرویس‌های پلی (Play Services) اختصاصی، دسترسی به APIهای خود گوگل مانند گوگل مپس (Google Maps) و گوگل اسیستنت (Google Assistant) را فراهم می‌کنند.علاوه بر بازیگران بزرگی مانند گوگل و آمازون، رام‌های سفارشی (custom ROMs) به اصطلاح، که توسط جامعه اندروید یا شرکت‌های دیگر توسعه یافته‌اند نیز قابل استفاده هستند. این‌ها اغلب از فروشگاه‌های جایگزین برای ارائه برنامه‌ها استفاده می‌کنند. یک مثال، فروشگاه اف-دروید (F-Droid) است که فقط برنامه‌های منبع باز (open source) را مجاز می‌داند. استفاده از این‌ها به کاربران اندروید امکان می‌دهد در صورت تمایل، تجربه‌ای بدون گوگل داشته باشند. اکوسیستم اندروید یک سیستم عظیم و انعطاف‌پذیر برای نرم‌افزار روی دستگاه‌های سخت‌افزاری مختلف است.به دلیل تعداد زیاد تولیدکنندگان، دستگاه‌ها و اقتباس‌های اندروید، یکی از بزرگترین مشکلات این پلتفرم، پراکندگی (fragmentation) نسخه‌های مورد استفاده است. این منجر به عدم اطمینان در مورد اینکه آیا برنامه اندروید شما در همه جا اجرا می‌شود یا خیر و اغلب نیاز به کار اضافی توسط توسعه‌دهندگان دارد. علاوه بر این، تطبیق آخرین نسخه سیستم‌عامل در مقایسه با سایر پلتفرم‌های موبایل کندتر است. با این حال، در سال‌های اخیر گوگل تلاش‌ها برای کاهش پراکندگی را افزایش داده است و امروزه اگر تصمیم بگیرید نسخه 5.0 آب‌نبات‌چوبی (Lollipop) یا بالاتر را هدف قرار دهید، به حدود 90 درصد از پایگاه نصب دست خواهید یافت.داده‌های جمع‌آوری شده طی یک دوره 7 روزه منتهی به 7 می 2019. هر نسخه‌ای با توزیع کمتر از 0.1% نشان داده نمی‌شود و دستگاه‌های بدون برنامه‌های گوگل (مانند دستگاه‌های آمازون و بسیاری از تولیدکنندگان مستقر در چین) شمارش نمی‌شوند. تمام نسخه‌های قبل از اندروید 4.4 نیز به دلیل قدیمی بودن حذف شده‌اند.نسخه‌های اخیر (Recent Versions)هر سال یک بار گوگل نسخه جدیدی از اندروید را با ویژگی‌ها، بهبودها و رفع اشکالات امنیتی منتشر می‌کند. این همچنین به معنای امکانات و چالش‌های جدید برای توسعه‌دهندگان است. در آماده‌سازی برای به‌روزرسانی‌ها، توسعه‌دهندگان باید استفاده از توابع یا APIهای SDK منسوخ شده یا حذف شده را نیز بررسی کنند تا از ناسازگاری‌ها جلوگیری شود.(جدول توزیع نسخه‌های اندروید در صفحه 47 کتاب اصلی با مقادیر زیر در اینجا قرار می‌گیرد)کیت‌کت 4.4 (KitKat 4.4) - API: 19 - 6.9%آب‌نبات‌چوبی 5.0 (Lollipop 5.0) - API: 21 - 3.0%آب‌نبات‌چوبی 5.1 (Lollipop 5.1) - API: 22 - 11.5%مارشمالو 6.0 (Marshmallow 6.0) - API: 23 - 16.9%نوقا 7.0 (Nougat 7.0) - API: 24 - 11.4%نوقا 7.1 (Nougat 7.1) - API: 25 - 7.8%اوریو 8.0 (Oreo 8.0) - API: 26 - 12.9%اوریو 8.1 (Oreo 8.1) - API: 27 - 15.4%پای 9 (Pie 9) - API: 28 - 10.4%اندروید 9 (پای - Pie)اندروید 9 (با اسم رمز: پای) در آگوست 2018 منتشر شد. با ویژگی‌های باتری تطبیقی (Adaptive Battery) و روشنایی تطبیقی (Adaptive Brightness)، اندروید 9 به طور خودکار برنامه‌ها، سرویس‌ها و روشنایی را بسته به عادات کاربر تنظیم می‌کرد تا عمر باتری را بیشتر افزایش دهد. همچنین App Actions را معرفی کرد: با قدرت یادگیری ماشین (machine learning)، اندروید سعی می‌کند رفتار کاربر را پیش‌بینی کند و میانبرهایی را بر اساس الگوهای استفاده فردی شناسایی شده ارائه دهد. مدل تعامل برای برنامه‌های اخیر (recent apps)، که به کاربران امکان می‌داد به سرعت بین برنامه‌ها جابجا شوند، یکی دیگر از ویژگی‌های جدید اندروید پای بود. درست مانند آی‌او‌اس (iOS)، اندروید نیز از این نسخه به کاربران اجازه می‌دهد تا بر زمان صفحه نمایش (screen time) خود نظارت کنند: یک داشبورد برای تجسم تعداد دفعات استفاده از برنامه‌ها اضافه شد. کاربران همچنین می‌توانند زمان استفاده از برنامه‌ها را محدود کرده و حالت خاکستری (grayscale) یا حالت مزاحم نشوید (Do Not Disturb) را به صورت خودکار فعال کنند.از آنجایی که طراحی‌های سخت‌افزاری ناچ (notch) بیشتر و بیشتر مورد توجه قرار می‌گیرند، اندروید 9 اولین نسخه اندرویدی بود که از آن پشتیبانی می‌کرد. از دیدگاه توسعه‌دهندگان، مهم‌ترین اخبار در اندروید 9 شامل ویژگی‌های جدید ناوبری داخلی با استفاده از موقعیت‌یابی داخلی با Wi-Fi RTT و اعلان‌های پیشرفته، به عنوان مثال کلاس جدید Person، که امکان ارائه اطلاعات غنی‌تر را فراهم می‌کند، بود. اکنون همچنین امکان دسترسی همزمان به دوربین‌ها و ایجاد، به عنوان مثال، استریم‌هایی با محتوای تصویر در تصویر (picture in picture) وجود دارد. یک رمزگشای تصویر جدید (image decoder)، کلاسی برای انیمیشن‌های تصویر، کدک‌ها (codecs) و APIهای رسانه‌ای بهتر با هدف ارائه گزینه‌های بیشتر به توسعه‌دهندگان برای ایجاد برنامه‌های چندرسانه‌ای بهینه شده است. API شبکه‌های عصبی (Neural Networks API) نیز برای ارائه عملیات بیشتر به‌روز شد.اندروید 10 (Android 10)با جدیدترین نسخه اندروید در سپتامبر 2019، طرح نامگذاری تغییر کرده است. گوگل مدت‌هاست که نرم‌افزار اندروید خود را به نام شیرینی‌ها نامگذاری کرده است. این دوران به پایان رسیده است. برای جلوگیری از سردرگمی، آخرین نسخه به سادگی اندروید 10 نامیده می‌شود بدون هیچ اسم رمز اضافی.اندروید 10 پشتیبانی از گوشی‌های تاشو (foldable phones) و همچنین پشتیبانی بومی از پوسته‌بندی (theming)، از جمله حالت‌های تاریک (dark modes) محبوب که برخی برنامه‌ها ارائه می‌دهند، را به ارمغان آورد. کاربران اکنون همچنین به یک ضبط کننده صفحه نمایش (screen recorder) بومی و یک پنل تنظیمات شناور (floating settings panel) کاملاً جدید دسترسی دارند.یکی دیگر از ویژگی‌های جالب از دیدگاه کاربر، گزینه اشتراک‌گذاری جدید است: اندروید 10 میانبرهای خاصی را برای اشتراک‌گذاری مستقیم محتوا با مخاطبین ارائه می‌دهد.اگر برنامه شما برای دسترسی به داده‌های خاص کاربر نیاز به مجوز (permission) دارد، توجه داشته باشید که گوگل با محدود کردن دسترسی به موقعیت مکانی، امنیت را افزایش داده است. این امر مدیریت مجوز جدیدی را برای تعاملات پس‌زمینه (background interactions) اضافه می‌کند و دسترسی به شناسه‌های دستگاه (device identifiers) را محدود می‌کند.و اگر روی برنامه‌های رسانه‌ای کار می‌کنید، خبرهای خوبی برای شما وجود دارد: اندروید 10 از چندین کدک چندرسانه‌ای جدید پشتیبانی می‌کند و یک API میدی (MIDI API) بومی برای تعامل با کنترل‌کننده‌های موسیقی ارائه می‌دهد. اکنون همچنین امکان ضبط خروجی صوتی ارائه شده توسط برنامه‌های دیگر وجود دارد.اندروید 10 به توسعه‌دهنده امکان می‌دهد اتصالات شبکه همتا به همتا (peer-to-peer) را به عنوان مثال برای تنظیمات با سایر دستگاه‌ها فراهم کند. برای پیکربندی مواردی مانند شبکه یا صدا، می‌توان پنل تنظیمات شناور ذکر شده را توسط توسعه‌دهندگان فعال کرد تا امکان تغییر پیکربندی بدون ترک کامل زمینه برنامه فراهم شود.مدیریت بهینه‌سازی شده برای ایجاد فایل‌ها در حافظه خارجی اضافه شد که در مورد ایجاد در حال انتظار اطلاع می‌دهد یا به ذخیره انواع فایل‌های خاص در دایرکتوری مناسب کمک می‌کند. برای ارائه یک تجربه بی‌درنگ پیشرفته در حین بازی یا سایر تعاملات، می‌توان از حالت‌های عملکرد بالا (high-performance) و تأخیر کم (low-latency) وای‌فای استفاده کرد. در حین انجام این کار، API حرارتی (Thermal API) جدید به پیگیری دما و بار دستگاه کمک می‌کند.اقتباس‌های سخت‌افزاری (Hardware Adaptations)اندروید نه تنها یک سیستم‌عامل گوشی هوشمند است، بلکه یک سیستم سرگرمی خودرو و سیستم‌عامل برای پوشیدنی‌ها و تلویزیون‌ها نیز هست. برای انطباق با فرم فاکتورهای مختلف، کنترل‌ها و مناطق استفاده، و برای کاهش محدودیت‌های احتمالی، مانند عدم وجود ورودی لمسی، چندین تغییر در سیستم اندروید پیاده‌سازی شد.سیستم عامل Wear OSسیستم عامل Wear OS که قبلاً با نام اندروید وِر (Android Wear) شناخته می‌شد، اقتباس گوگل از اندروید برای ساعت‌های هوشمند است. این سیستم یک رابط کاربری ساده‌شده ارائه می‌دهد، زیرا ساعت‌های هوشمند نمایشگرهای بسیار کوچکتری نسبت به گوشی‌های هوشمند دارند. بنابراین، کنترل‌های صوتی (voice controls) نقش مهمی در این زمینه ایفا می‌کنند. Wear OS بیشتر در ترکیب با یک گوشی هوشمند متصل استفاده می‌شود، حتی اگر دستگاه‌های Wear OS از نظر فنی بتوانند به سیم کارت خود مجهز شوند. یک ویژگی کلیدی، اکوسیستم برنامه‌های گوگل فیت (Google Fit) است که از ردیابی دویدن و دوچرخه‌سواری، فعالیت قلب، شمارش گام و غیره پشتیبانی می‌کند. کاربران می‌توانند از ساعت خود برای کنترل تلفن خود - به عنوان مثال موسیقی - استفاده کنند. اعلان‌ها از طریق موتور لرزش (vibration engine) یکی دیگر از عناصر کلیدی هستند. این‌ها می‌توانند برای اعلان‌های گوگل ناو (Google Now) مانند یادآوری پرواز، هشدارهای ترافیکی، یادآوری جلسات و غیره استفاده شوند.اندروید تی‌وی (Android TV)اندروید تی‌وی اقتباسی از سیستم‌عامل را با توجه به صفحه‌های بزرگ و عدم وجود تعاملات لمسی ارائه می‌دهد. یک رابط کاربری بسیار بزرگتر با کنترل‌های ساده‌شده، قابل استفاده با کنترل از راه دور و کنترل‌های صوتی اضافه شد. همچنین امکان کنترل تلویزیون از طریق گوشی هوشمند وجود دارد. یکی از مهم‌ترین موارد استفاده از تلویزیون‌های اندرویدی، استفاده از برنامه‌های پخش جریانی (streaming apps) مانند یوتیوب (Youtube) و نتفلیکس (Netflix) است. برخی از تلویزیون‌های اندرویدی همچنین پشتیبانی مستقیمی از گیرنده کروم کست (Chrome Cast Receiver) ارائه می‌دهند، بنابراین کاربران می‌توانند صفحه نمایش خود را آینه کنند یا محتوا را مستقیماً از تلفن یا وب خود به دستگاه پخش کنند.برنامه‌های اندروید تی‌وی از همان ساختار برنامه‌های تلفن و تبلت استفاده می‌کنند. بنابراین، توسعه‌دهندگان می‌توانند از برنامه‌ها و دانش موجود خود برای هدف قرار دادن پلتفرم تلویزیون استفاده کنند. برای یادگیری نحوه انجام این کار به developer.android.com/tv مراجعه کنید.اندروید آتو (Android Auto)از آنجایی که گوشی‌های هوشمند اغلب به عنوان دستگاه‌های ناوبری استفاده می‌شوند، اندروید آتو به عنوان نسخه تنظیم‌شده‌ای از اندروید توسعه یافت که امکان نمایش محتوا را روی صفحه نمایش داخلی خودرو فراهم می‌کند. انجام این کار یک رابط کاربری ویژه را فعال می‌کند که بر ناوبری، ارتباطات و سرگرمی متمرکز است. تعاملات اغلب از طریق دستورات صوتی انجام می‌شود تا راننده بتواند روی جاده تمرکز کند.اقتباس‌های نرم‌افزاری (Software Adoptions)اکوسیستم اندروید به فروشندگان اجازه می‌دهد تا رفتار پیش‌فرض و طراحی ارائه شده توسط سیستم را از بسیاری جهات گسترش داده یا تغییر دهند. برخی از فروشندگان، مانند سامسونگ (Samsung) یا آمازون، اغلب یک رابط کاربری کاملاً سفارشی‌شده یا حتی پیاده‌سازی‌های متفاوتی از قابلیت‌های پایه را در دستگاه‌های خود ارائه می‌دهند. این منجر به اکوسیستم‌های خاص فروشنده و تجربیات کاربری متفاوت در سراسر اکوسیستم اندروید می‌شود. این امر دارای یک جنبه مثبت است، به عنوان مثال یکپارچگی بسیار محکم که تجربه شگفت‌انگیزی را برای کاربران فراهم می‌کند، و همچنین یک جنبه منفی، مانند افزایش پراکندگی اکوسیستم.گوگل یک رابط فروشنده (vendor interface) برای کاهش ناسازگاری‌ها ارائه می‌دهد، در حالی که به فروشندگان مقداری انعطاف‌پذیری نیز می‌دهد. این همچنین باید به کاهش زمان به‌روزرسانی (time-to-update) برای به‌روزرسانی‌های سیستم کمک کند. این رابط برای استفاده توسط فروشندگانی در نظر گرفته شده است که می‌خواهند ظاهر و احساس نسخه اندروید خود را تنظیم کنند، اما اگر تبدیل کاملی برنامه‌ریزی شده باشد، مانند کاری که آمازون با Fire OS انجام داد، امکان‌پذیر نیست.اندروید وان (Android One)اندروید وان تلاش گوگل برای ارائه یک تجربه اندروید خالص با آخرین به‌روزرسانی‌های نرم‌افزاری به مدت دو سال و به‌روزرسانی‌های امنیتی به مدت سه سال است. اندروید وان در سال 2014 معرفی شد و قرار است یک نسخه امن و سازگار اندروید برای همه باشد. این نسخه را می‌توان به عنوان اندروید وانیلی (vanilla Android) با برخی بهینه‌سازی‌های اضافی توسط گوگل در نظر گرفت.اندروید گو (Android Go)اندروید گو یک نسخه سبک وزن از اندروید است که برای ارائه عملکرد روان در دستگاه‌های پایین‌رده توسعه یافته است. این سیستم برای اجرا بر روی گوشی‌های هوشمندی طراحی شده است که دارای 1 گیگابایت یا کمتر رم هستند. حتی برنامه‌های موجود در فروشگاه پلی نیز برای این دستگاه‌ها بهینه‌سازی خواهند شد که عمدتاً بازارهای نوظهور مانند هند یا چین را هدف قرار می‌دهند. ویژگی‌های اصلی آن صرفه‌جویی در داده (data saving)، نیاز به فضای ذخیره‌سازی کمتر و عملکرد بهتر در دستگاه‌های پایین‌رده است.شروع به کارسیستم‌عامل اندروید مبتنی بر نرم‌افزار آزاد است و از هسته لینوکس (Linux kernel) به عنوان پایه استفاده می‌کند. مهم‌ترین لایه برای توسعه‌دهندگان، محیط زمان اجرای جاوا (Java Runtime Environment) بالای لایه سیستم‌عامل است. به اصطلاح زمان اجرای اندروید (Android Runtime - ART) امکان اجرای فایل‌های APK را فراهم می‌کند. این‌ها با کامپایل کد جاوا (Java) یا کاتلین (Kotlin) از طریق OpenJDK برای اندروید ایجاد می‌شوند. این روش اصلی برای ایجاد برنامه‌ها برای پلتفرم اندروید است. کد C یا C++ نیز از طریق کتابخانه‌های بومی (native libraries) امکان‌پذیر است. به ویژه اجزای پرمصرف مانند کدک‌های چندرسانه‌ای، موتورهای مرورگر و لایه‌های رمزگذاری پایگاه داده از این رویکرد استفاده می‌کنند.در طول کنفرانس گوگل آی/او 2019، کاتلین به عنوان زبان اصلی برای توسعه اندروید اعلام شد. قرار است جایگزین جاوا شود. با این حال، امکان ترکیب هر دو در یک پروژه نیز وجود دارد. زبان کاتلین توسط جت‌برینز (JetBrains)، سازندگان اینتلی‌جی آیدیا (IntelliJ IDEA) توسعه یافته است. این زبان رویکردی مدرن‌تر، ایمن‌تر و مختصرتر برای ایجاد برنامه‌های اندروید ارائه می‌دهد. کد کاتلین را می‌توان به بایت‌کد جاوا (Java byte code) و همچنین کد جاوااسکریپت (JavaScript code) کامپایل کرد.حتی اگر کاتلین به تدریج جایگزین جاوا می‌شود، جاوا هنوز یک پلتفرم کاملاً تثبیت شده برای توسعه برنامه‌های اندروید است. اما مراقب باشید، تنها زیرمجموعه‌ای از کتابخانه‌ها و بسته‌های جاوا پشتیبانی می‌شوند و APIهای خاص پلتفرم زیادی وجود دارند که با اندروید کار نمی‌کنند.می‌توانید پاسخ سؤالات &quot;چه چیزی و چرا&quot; خود را به صورت آنلاین در راهنمای توسعه‌دهندگان اندروید (Android&amp;amp;amp;#x27;s Dev Guide) و سؤالات &quot;چگونه&quot; خود را در مستندات مرجع (reference documentation) بیابید. علاوه بر این، گوگل دو بخش در مستندات خود به نام‌های &quot;Codelabs&quot; و &quot;Courses&quot; معرفی کرده است که به توسعه‌دهندگان جدید در یادگیری بهترین شیوه‌های مختلف برای جاوا و کاتلین کمک می‌کند. در اینجا می‌توانید در مورد اصول اولیه‌ای مانند ناوبری (navigation) و ارتباطات درون‌برنامه‌ای (inter-app communication)، و همچنین ویژگی‌های پیشرفته‌تری مانند دانلود هوشمند بیت‌مپ (intelligent Bitmap downloads) و بهینه‌سازی برنامه خود برای عمر باتری بهتر بیاموزید. توسعه‌دهندگان با تجربه می‌توانند گواهینامه توسعه‌دهنده اندروید همکار (Associate Android Developer Certification) را توسط گوگل دریافت کنند.برای شروع، به اندروید SDK نیاز دارید که برای ویندوز (Windows)، مک او‌اس ایکس (Mac OS X) و لینوکس (Linux) در دسترس است. این شامل ابزارهای مورد نیاز برای ساخت، آزمایش، اشکال‌زدایی و تجزیه و تحلیل برنامه‌ها است. توسعه در یک نسخه اقتباس شده از IDE اینتلی‌جی آیدیا انجام می‌شود. این ابزار اندروید استودیو (Android Studio) نامیده می‌شود و علاوه بر توسعه، امکان ساخت خودکار، بررسی سینتکس (syntax checking) و آزمایش را نیز فراهم می‌کند. جدیدترین نسخه‌های اندروید استودیو با تمام ابزارها و اجزای مورد نیاز برای شروع سریع توسعه اندروید همراه هستند.پشتیبانی IDEاندروید استودیو IDE رسمی برای اندروید است و مستقیماً با پشتیبانی گریدل (Gradle Support) و بسیاری از ویژگی‌هایی که به صراحت برای توسعه اندروید طراحی شده‌اند، ارائه می‌شود. این به عنوان یک دانلود از پیش بسته‌بندی شده شامل اندروید SDK در دسترس است. لیست ویژگی‌های توسعه‌یافته و همچنین مستندات کاربر نهایی را می‌توان در وب‌سایت رسمی اندروید استودیو یافت. خود اندروید استودیو با کد نمونه ارائه می‌شود و مستندات کد را برای تمام کلاس‌ها و متدهای سیستمی موجود ارائه می‌دهد. اندروید استودیو همچنین از آخرین ویژگی‌های توسعه کاتلین پشتیبانی می‌کند و توسعه‌دهنده را قادر می‌سازد تا از ویژگی‌های مدرن، ایمن و مختصر کاتلین استفاده کند.برای اندازه‌گیری عملکرد، پروفایلر اندروید (Android Profiler) به شما امکان می‌دهد تا میزان استفاده از پردازنده مرکزی + رم + پردازنده گرافیکی (CPU + RAM + GPU) را پیگیری کنید و پروفایلر شبکه (Network Profiler) به شما امکان می‌دهد بسته‌های ارسال شده از طریق اتصالات بی‌سیم خود را بررسی کنید.توسعه بومی (Native development)اندروید NDK (مجموعه توسعه بومی اندروید) امکان نوشتن اجزای بومی را برای برنامه‌های شما با استفاده از JNI (رابط بومی جاوا) برای فراخوانی متدهای بومی و استفاده از زیرکلاس‌های بومی که فراخوانی‌های برگشتی (callbacks) را به همتایان غیربومی خود ارائه می‌دهند، فراهم می‌کند. این برای توسعه‌دهندگان بازی و هر کسی که نیاز به پردازش کارآمد دارد، مهم است.پیاده‌سازیمعماری برنامه (App Architecture)برنامه‌های اندروید معمولاً شامل ترکیبی از اکتیویتی‌ها (Activities)، فرگمنت‌ها (Fragments)، جاب‌ها (Jobs)، سرویس‌ها (Services)، BroadcastReceiver، ContentProvider و موارد دیگر هستند؛ همه این‌ها باید در مانیفست (manifest) برنامه اعلام شوند. مانیفست همچنین شامل متادیتای (metadata) یک برنامه، مانند عنوان، نسخه و مجوزهای مورد نیاز آن است.یک اکتیویتی (Activity) بخشی از عملکرد با یک رابط کاربری متصل است. از فرگمنت‌ها (Fragments) می‌توان برای تقسیم اکتیویتی‌ها به بخش‌های کوچکتر و قابل استفاده مجدد استفاده کرد. یک سرویس (Service) یا جاب (Job) برای کارهایی استفاده می‌شود که در پس‌زمینه اجرا می‌شوند و بنابراین، مستقیماً به یک نمایش بصری گره نخورده‌اند. یک BroadcastReceiver پیام‌هایی را که توسط سیستم پخش می‌شوند و توسط برنامه شما یا برنامه‌های دیگر ارسال می‌شوند، مدیریت می‌کند. یک ContentProvider رابطی برای محتوای یک برنامه است که از مکانیزم‌های ذخیره‌سازی زیربنایی، به عنوان مثال SQLite، انتزاع می‌کند.یک برنامه ممکن است از چندین مورد از این اجزا تشکیل شود، به عنوان مثال، یک اکتیویتی برای رابط کاربری و یک سرویس برای کارهای طولانی مدت. ارتباط بین اجزا توسط اینتنت‌ها (Intents) یا فراخوانی‌های رویه‌ای راه دور (remote procedure calls) که توسط زبان تعریف رابط اندروید (Android Interface Definition Language - AIDL) مدیریت می‌شوند، انجام می‌شود.اینتنت‌ها داده‌هایی مانند موقعیت مکانی کاربر یا یک URL را با یک عمل (action) همراه می‌کنند. این اینتنت‌ها رفتارهایی را در پلتفرم فعال می‌کنند و می‌توانند به عنوان یک سیستم پیام‌رسانی در برنامه شما استفاده شوند. به عنوان مثال، اینتنت نمایش یک صفحه وب، مرورگر را باز می‌کند. یک جنبه قدرتمند این فلسفه بلوک ساختمانی این است که هر عملکردی می‌تواند با برنامه دیگری جایگزین شود، زیرا سیستم اندروید همیشه از برنامه ترجیحی برای یک اینتنت خاص استفاده می‌کند. به عنوان مثال، اینتنت اشتراک‌گذاری یک صفحه وب که توسط یک برنامه خبرخوان فعال می‌شود، بسته به برنامه‌های نصب شده و ترجیح کاربر، می‌تواند یک کلاینت ایمیل یا یک برنامه پیام‌رسانی متنی را باز کند: هر برنامه‌ای که اینتنت اشتراک‌گذاری را به عنوان رابط خود اعلام کند، ممکن است استفاده شود.رابط کاربری یک برنامه از کد در فایل‌های طرح‌بندی XML خاص اندروید جدا شده است. طرح‌بندی‌های مختلف را می‌توان برای اندازه‌های مختلف صفحه نمایش، محلی‌های کشور و ویژگی‌های دستگاه بدون دست زدن به کد واقعی ایجاد کرد. برای این منظور، رشته‌ها و تصاویر محلی‌شده در پوشه‌های منابع (resource folders) جداگانه سازماندهی می‌شوند. البته، شما همچنین قادر به تعریف و طراحی طرح‌بندی‌ها در کد هستید یا از هر دو استراتژی برای فعال کردن به‌روزرسانی‌های پویا رابط کاربری استفاده می‌کنید.اندروید جت‌پک (Android Jetpack)اندروید جت‌پک اجزایی را برای توسعه‌دهندگان گرد هم می‌آورد تا برنامه‌های سریع‌تر و قوی‌تری را برنامه‌نویسی کنند. این شامل ابزارها، کتابخانه‌ها و چندین جزء دیگر برای ساده‌سازی توسعه و ارائه سازگاری با نسخه‌های قدیمی‌تر اندروید است. برخی از بخش‌های اصلی، اجزای پایه (foundation components) هستند که پشتیبانی از زبان کاتلین و سازگاری با عقب را فراهم می‌کنند و اجزای معماری (Architecture components) که به شما کمک می‌کنند تا برنامه خود را به روشی اثبات‌شده ساختار دهید. همچنین اجزای رفتاری (Behavior components) مهم هستند، این‌ها دسترسی آسان و پایداری به سیستم مجوزهای اندروید و گوگل اسیستنت را فراهم می‌کنند. اجزای رابط کاربری (UI components) به شما کمک می‌کنند تا برنامه‌های زیباتری بدون نوشتن کد بیشتر ایجاد کنید.هر توسعه‌دهنده اندروید جدید و موجود باید حداقل نگاهی بیندازد که آیا برخی از اجزای طراحی شده ماژولار، که از طریق کتابخانه‌های androidx.* قابل استفاده هستند، می‌توانند برای پروژه‌های او مفید باشند.متریال دیزاین (Material Design)زبان طراحی پایه اندروید &quot;متریال دیزاین&quot; در سال 2014 معرفی شد. طراح ماتیاس دوارته (Matías Duarte) ایده اصلی را توضیح داد: &quot;برخلاف کاغذ واقعی، متریال دیجیتال ما می‌تواند هوشمندانه گسترش یابد و تغییر شکل دهد. متریال دارای سطوح و لبه‌های فیزیکی است. درزها و سایه‌ها در مورد آنچه می‌توانید لمس کنید، معنا می‌دهند.&quot;متریال دیزاین یک هویت بصری قوی و سازگار را به اکوسیستم اندروید آورد، موازی اما متمایز از طراحی تخت (flat design) آی‌او‌اس و طراحی مترو (Metro design) ویندوز. برای تشویق یک تجربه کاربری قوی و ظاهر سازگار برنامه‌های اندروید، گوگل مستندات جامعی برای زبان طراحی و یک راهنمای طراحی برای توسعه‌دهندگان ارائه می‌دهد. این راهنما با پرداختن به اهمیت طرح‌های رنگی، الگوهای طراحی و متریال دیزاین، جهت‌گیری عالی را هنگام ساخت برنامه‌ها برای اکوسیستم اندروید فراهم می‌کند.متریال دیزاین همچنین پایه و اساس رابط کاربری سیستم‌عامل و برنامه‌های سیستمی را تشکیل می‌دهد. علاوه بر این، کتابخانه‌های متنوعی پشتیبانی از متریال دیزاین را به پلتفرم‌های مختلف دیگر مانند وب آورده‌اند.پوسته‌بندی (Theming) نیز پشتیبانی می‌شود در حالی که همچنان به دستورالعمل‌های متریال دیزاین پایبند است. یک مثال برای این، پوسته بازیل (Basil theme) است.کیت توسعه نرم‌افزار (SDK) و پلاگین‌هابرای کمک به توسعه، ابزارهای زیادی در SDK در اختیار دارید که مهم‌ترین آنها عبارتند از:ابزار adb: برای پرس‌وجو از دستگاه‌ها (فیزیکی و مجازی) و اتصال و تعامل با آنها از طریق انتقال فایل‌ها، نصب برنامه‌ها و موارد مشابه.ابزار avdmanager: برای ایجاد و مدیریت دستگاه‌های مجازی از همه انواع.ابزار emulator: برای شبیه‌سازی ویژگی‌های تعریف شده یک دستگاه مجازی. به دلیل راه‌اندازی سریع عکس فوری (fast snapshot startups) و شتاب سخت‌افزاری (hardware acceleration)، شبیه‌ساز برای روال توسعه روزانه بسیار مفید است.ابزار sdkmanager: برای نصب و به‌روزرسانی اجزای اندروید SDK.این ابزارها به همراه بسیاری دیگر، از جمله ابزارهایی برای تجزیه و تحلیل گزارش‌های ردیابی متد (method trace logs)، بازرسی طرح‌بندی‌ها و آزمایش برنامه‌ها با رویدادهای تصادفی، در دایرکتوری tools در SDK یافت می‌شوند. اکثر آنها همچنین از طریق رابط کاربری اندروید استودیو IDE قابل دسترسی هستند.اگر از ویژگی‌هایی مانند ConstraintLayouts استفاده می‌کنید، حتماً بسته‌های مربوط به کتابخانه پشتیبانی/AndroidX (Support Library/AndroidX) را از گوگل اضافه کنید. آنها از طریق اجزای پایه اندروید جت‌پک در دسترس هستند. آنها توسعه‌دهندگان را قادر می‌سازند تا ویژگی‌های مدرن را در نسخه‌های قدیمی‌تر اندروید بدون مشکلات سازگاری مستقر کنند. در صورت امکان، همیشه از این اجزای سازگار با عقب به جای عناصر معمولی استفاده کنید تا از بروز مشکلات در دستگاه‌های اندرویدی قدیمی‌تر جلوگیری کنید.برای ارائه مقداری سازگاری با عقب به طور کلی، گوگل شروع به استفاده از چارچوب سرویس‌های گوگل پلی (Google Play Services framework) کرد که از طریق فروشگاه پلی به‌روز می‌شود و برخی کتابخانه‌های اصلی مانند آخرین نسخه گوگل مپس را اضافه می‌کند. به این ترتیب دستگاه‌های قدیمی‌تر قادر به دسترسی به APIها و اجزای جدیدتر زنجیره نرم‌افزار گوگل می‌شوند.علاوه بر سازگاری با عقب، تقریباً همیشه توصیه می‌شود که نسخه API اخیر اندروید را در فایل build.gradle خود هدف قرار دهید تا از ویژگی‌های جدید سیستم بهره‌مند شوید. اندروید استودیو شما نیز باید به‌روز باشد تا بتوانید از آخرین بهبودهای عملکرد و به‌روزرسانی‌های ویژگی در حین توسعه استفاده کنید.برای ارائه اعلان‌های فشاری (push notifications)، تجزیه و تحلیل‌ها (analytics)، قابلیت‌های یادگیری ماشین و گزارش‌های خرابی (crash reports)، گوگل فایربیس (Google Firebase) می‌تواند راه‌حلی ارزشمند برای بررسی باشد. فایربیس مجموعه عظیمی از توابع را ارائه می‌دهد که به راحتی در پروژه‌های اندروید استودیو ادغام می‌شوند.تست کردن (Testing)اولین قدم در تست یک برنامه، اجرای آن بر روی شبیه‌ساز یا یک دستگاه است. سپس می‌توانید آن را از طریق اندروید استودیو اشکال‌زدایی و تجزیه و تحلیل کنید.تمام نسخه‌های سیستم‌عامل اندروید برای اجرا بر روی دستگاه‌ها بدون تغییر ساخته شده‌اند، با این حال، برخی از تولیدکنندگان سخت‌افزار ممکن است بخش‌هایی از پلتفرم را تغییر داده باشند. بنابراین، تست بر روی ترکیبی از دستگاه‌ها ضروری است. برای اینکه ایده‌ای از محبوب‌ترین دستگاه‌ها داشته باشید، به لیست AppBrain مراجعه کنید.کتابخانه پشتیبانی تست اندروید (Android Testing Support Library) مجموعه‌ای از ابزارهای ماژولار را برای پوشش اکثر سناریوهای تست فراهم می‌کند. JUnit4 پایه و اساس تمام تست‌های واحد (unit tests) است، اسپرسو (Espresso) یک API بسیار سبک ارائه می‌دهد که به نوشتن سریع تست‌های رویه‌ای (procedural tests) برای رابط کاربری شما کمک می‌کند و AndroidJUnitRunner به شما در اجرای تست‌هایتان کمک می‌کند.تست‌ها را می‌توان با استفاده از فرمت استاندارد JUnit، با استفاده از اشیاء ساختگی اندروید (Android mock objects) که در SDK موجود هستند، نوشت. کتابخانه‌های اضافی مانند Mockito می‌توانند به افزایش عملکرد در حین ایجاد تست‌های واحد اندروید کمک کنند.برای خودکارسازی تست، اندروید SDK با برخی ابزارهای ابزار دقیق تست (testing instrumentation tools) توانمند و مفید ارائه می‌شود. UI Automator به اندروید 4.3 (سطح API 18) نیاز دارد و رابط دستگاه ضبط شده را شامل برخی اطلاعات در مورد نماهای ارائه شده به شما ارائه می‌دهد. اجرای تست‌ها نسبتاً آسان است: پس از نوشتن تست، می‌توان آن را مستقیماً از داخل اندروید استودیو ساخت، اجرا و به دستگاه یا شبیه‌ساز تحویل داد.ابزار MonkeyRunner یک ابزار اتوماسیون تست قدرتمند و قابل توسعه برای تست کل برنامه است. این تست‌ها را می‌توان هم بر روی دستگاه‌های مجازی و هم فیزیکی اجرا کرد. تست‌های نوشته شده در پایتون (Python) می‌توانند با ایجاد اسکرین‌شات‌ها و ارسال رویدادهای سیستمی مانند فشار دادن کلید، رابط کاربری را نظارت کنند. سپس تست‌های شما می‌توانند وضعیت برنامه شما را پس از وقوع این رویدادها بررسی کنند.چارچوب‌های تست منبع باز، مانند Robotium، می‌توانند تست‌های خودکار دیگر شما را تکمیل کنند. Robotium حتی می‌تواند برای تست فایل‌های APK باینری در صورتی که منبع برنامه در دسترس نباشد، استفاده شود. Roboelectric یکی دیگر از ابزارهای عالی است که تست‌ها را مستقیماً در IDE شما در JVM استاندارد/دسکتاپ شما اجرا می‌کند.تست‌های خودکار شما را می‌توان بر روی سرورهای یکپارچه‌سازی مداوم (continuous integration servers) مانند Jenkins یا Hudson اجرا کرد. Roboelectric در یک JVM استاندارد اجرا می‌شود و به محیط زمان اجرای اندروید نیاز ندارد. اکثر چارچوب‌های تست خودکار دیگر، از جمله Robotium، مبتنی بر چارچوب Instrumentation اندروید هستند و باید در JVM مربوطه اجرا شوند. پلاگین‌هایی مانند Android Emulator Plugin امکان پیکربندی و اجرای این تست‌ها را در Hudson و Jenkins فراهم می‌کنند.ساخت (Building)علاوه بر ساخت مستقیم برنامه خود در IDE انتخابی‌تان، راه‌های انعطاف‌پذیرتری نیز برای ساخت برنامه‌های اندروید وجود دارد. گریدل (Gradle) ابزار اتوماسیون ساخت رسماً پشتیبانی شده برای اندروید است. همچنین یک پلاگین مِیْوِن (Maven plugin) وجود دارد که به خوبی توسط جامعه پشتیبانی می‌شود. هر دو ابزار می‌توانند از وابستگی‌ها (dependencies) از مخازن مختلف مِیْوِن (Maven repositories)، به عنوان مثال، مخزن مرکزی مِیْوِن (Maven Central Repository) استفاده کنند.سیستم ساخت گریدل مجموعه عظیمی از امکانات پیکربندی را فراهم می‌کند. امکان استفاده از طعم‌های (flavors) مختلف برای ساخت، به عنوان مثال، یک نسخه رایگان و یک نسخه پولی از برنامه وجود دارد، در حالی که تمایز کلی بین ساخت‌های اشکال‌زدایی (debug builds) و انتشار (release builds) نیز امکان‌پذیر است. تقریباً همه چیز را می‌توان در فایل build.gradle شما پیکربندی کرد، که توسعه‌دهنده را قادر می‌سازد تا فرآیند ساخت را نیز خودکار کند.برای کوچک کردن اندازه برنامه‌ها و مبهم‌سازی (obfuscate) کد، می‌توان از کامپایلر جدید R8 مستقیماً در خط لوله ساخت گریدل شما استفاده کرد.برای کاهش بیشتر اندازه برنامه‌ها، گوگل بسته‌های برنامه اندروید (Android App Bundles) را معرفی کرد که حاوی کد کامپایل شده و منابع هستند، اما APKها را به طور خاص برای نیازهای دستگاه‌های درخواست کننده تولید و امضا می‌کنند. این اتفاق مستقیماً در گوگل پلی در صورت ارائه بسته برنامه رخ می‌دهد.امضا کردن (Signing)برنامه‌های شما همیشه توسط فرآیند ساخت امضا می‌شوند، یا با امضای اشکال‌زدایی یا انتشار. همان امضا باید برای به‌روزرسانی‌های برنامه شما استفاده شود - بنابراین مطمئن شوید که فایل keystore یا رمز عبور را گم نکنید. به یاد داشته باشید: می‌توانید از همان کلید برای همه برنامه‌های خود استفاده کنید یا برای هر برنامه یک کلید جدید ایجاد کنید.گوگل همچنین یک راه‌حل متمرکز برای امضا ارائه می‌دهد. امضای برنامه گوگل پلی (Google Play App Signing) بخش زیادی از کار را به زیرساخت گوگل واگذار می‌کند و می‌تواند مشکلات مربوط به مدیریت و ایمن‌سازی کلیدهای مورد نیاز را کاهش دهد.توزیع (Distribution)پس از ایجاد برنامه قاتل بعدی و تست آن، باید آن را در فروشگاه برنامه اندروید به نام &quot;پلی&quot; (Play) در play.google.com/apps/publish آپلود کنید. شما ملزم به ثبت نام در سرویس با استفاده از حساب گوگل چک‌اوت (Google Checkout Account) خود و پرداخت هزینه ثبت نام 25 دلاری هستید. پس از تأیید ثبت نام شما، می‌توانید برنامه خود را آپلود کنید، اسکرین‌شات‌ها و توضیحات را اضافه کنید، سپس آن را منتشر کنید.مطمئن شوید که یک versionName و versionCode در build.gradle خود و یک نماد، یک برچسب و مجوزهای مورد نیاز را در AndroidManifest.xml خود تعریف کرده‌اید.فروشگاه گوگل پلی، علاوه بر انتشار تولیدی (production rollouts)، تست آلفا و بتا (alpha and beta testing) به علاوه انتشار مرحله‌ای (staged rollouts) را نیز ارائه می‌دهد. این به شما امکان می‌دهد قبل از انتشار برنامه برای همه کاربران، مقداری تست کاربر دوستانه انجام دهید. علاوه بر این، می‌توانید با تنظیم پرچم‌های مناسب در کنسول توسعه‌دهنده (Developer Console)، کشورها و دستگاه‌های خاصی را هدف قرار دهید و آمار دقیقی را صادر کنید که به درک پایگاه کاربر شما کمک می‌کند. با استفاده از سرویس محلی‌سازی داخلی (inbuilt localization service)، می‌توانید به راحتی با پرداخت هزینه، زبان‌های جدیدی را به برنامه خود اضافه کنید - برای اطلاعات دقیق در مورد اهمیت این موضوع، حتماً چک لیست محلی‌سازی (Localization Checklist) را بررسی کنید.از آنجایی که برنامه‌های رقیب زیادی در اندروید پلی وجود دارد، ممکن است بخواهید از فروشگاه‌های برنامه جایگزین استفاده کنید. آنها روش‌های پرداخت متفاوتی را ارائه می‌دهند و ممکن است گروه‌های مصرف‌کننده خاصی را هدف قرار دهند. یکی از این بازارها، فروشگاه اپلیکیشن آمازون (Amazon Appstore) است که به صورت از پیش نصب شده بر روی خانواده تبلت کیندل فایر (Kindle Fire) ارائه می‌شود. اما باید به خاطر داشته باشید که فروشگاه‌های پلی جایگزین، کاربر را مجبور می‌کنند تا منابع ناشناس (unknown sources) را برای نصب برنامه فعال کند، که همیشه یک خطر امنیتی بالقوه است.و حتماً فصل مربوط به بهینه‌سازی اپ استور (app store optimization) را در این راهنما بخوانید تا راه موفقیت خود را هموار کنید.کسب درآمد (Monetization)گوگل پلی کانال توزیع اصلی و البته محبوب‌ترین پلتفرم برای توزیع برنامه‌های اندروید است. گوگل 25 دلار برای ثبت نام و کارمزد تراکنش 30 درصدی از درآمد شما دریافت می‌کند.اما فروشگاه پلی تنها گزینه شما نیست. برای اکوسیستم‌های خاص فروشنده، مانند سامسونگ اپس (Samsung Apps) یا فروشگاه اپلیکیشن آمازون، باید استفاده از SDKهای آنها را برای بهره‌مندی از مزایای کسب درآمد بهینه در نظر بگیرید.علاوه بر فروش یک برنامه در یکی از فروشگاه‌های برنامه متعدد موجود، چندین روش مختلف برای کسب درآمد از یک برنامه اندروید وجود دارد. یک راه مناسب استفاده از تبلیغات است که ممکن است مبتنی بر کلیک یا نمایش باشد و می‌تواند درآمد ثابتی را فراهم کند. غیر از آن، امکانات مختلف صورتحساب درون‌برنامه‌ای (In-App Billing) مانند سرویس خود گوگل که از فروشگاه گوگل پلی استفاده می‌کند یا SDK پرداخت‌های درون‌برنامه‌ای اسکوئر (Square&amp;amp;amp;#x27;s In-App Payments SDK) وجود دارد. اکثر سرویس‌ها در کارمزدهای مبتنی بر تراکنش و امکاناتی که ارائه می‌دهند، مانند اشتراک‌ها، پرداخت‌های موازی یا پرداخت‌های از پیش تأیید شده، متفاوت هستند.مطمئن شوید که روش پرداخت انتخابی شما با شرایط و ضوابط بازارهای مختلفی که می‌خواهید برنامه خود را در آن منتشر کنید، هماهنگ باشد. به خصوص برای دانلودهای دیجیتال، که قوانین متفاوتی برای آنها وجود دارد، ارزش بررسی دارد.باز هم: البته یک فصل اختصاصی در مورد کسب درآمد نیز در این راهنما وجود دارد. پس ادامه دهید و بیشتر بخوانید.فصل چهارم را از این جا بخوانید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Sat, 03 May 2025 23:46:34 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای توسعه‌دهندگان موبایل به سمت کهکشان: فصل دوم</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D9%81%D8%B5%D9%84-%D8%AF%D9%88%D9%85-q5hgf4vdyvls</link>
                <description>فصل اول را از این جا بخوانید.فصل دوم: از ایده تا نمونه اولیهنویسنده: آندری بالاز (Andrej Balaz)فصل دوم راهنمای توسعه دهندگان موبایلچه چیزی باعث موفقیت یک سرویس می‌شود؟ چرا بسیاری از استارتاپ‌ها، اغلب علی‌رغم برتری فناورانه خود، شکست می‌خورند؟ چرا بسیاری از محصولات در دام ساخت (Build trap) گیر می‌افتند و پر از ویژگی‌هایی می‌شوند که کمتر استفاده می‌شوند، اما هزینه قابل توجهی برای توسعه و نگهداری داشته‌اندیکی از بزرگترین دام‌ها در توسعه محصول، عدم درک چگونگی تناسب محصول شما با زندگی مردم است. ندانستن اینکه مشتریان شما هنگام انتخاب محصول شما به جای محصول دیگر، چه پیشرفتی را دنبال می‌کنند، می‌تواند تیم شما را به سمت ساخت محصول اشتباه یا مهندسی بیش از حد محصول با دامنه صحیح سوق دهد.این موضوع ممکن است در ابتدا متناقض به نظر برسد. کاملاً منطقی است که انتظار داشته باشیم شرکت‌ها روی ویژگی‌هایی که به ندرت مورد استفاده قرار می‌گیرند، سرمایه‌گذاری نکنند. متأسفانه، استارتاپ‌ها و شرکت‌های جاافتاده به طور یکسان، اغلب فاقد فرآیندی برای تحلیل دلایلی هستند که مشتریان در وهله اول محصول آنها را استخدام می‌کنند. در عوض، آنها اغلب راه میانبر را انتخاب می‌کنند و بر اساس نوعی &quot;ریمیکس بهترین شیوه‌ها&quot; از ویژگی‌های موفق رقبا یا ایده‌پردازی بدون اطلاعات، تصمیم می‌گیرند که چه چیزی را بعداً بسازند.ساختن و شکست خوردن سریع به خودی خود به عنوان یک هدف اشتباه تفسیر می‌شود. تیم‌ها فراموش می‌کنند که بهبودی از شکست می‌تواند دشوار باشد و تغییر مسیر (Pivoting) باید با دقت و با استفاده از نوع داده مناسب انجام شود (در ادامه بیشتر در این مورد صحبت خواهیم کرد). به نفع هر تیمی است که روش‌هایی را کشف کند که به آنها امکان می‌دهد بیشترین اطلاعات را در مورد زمینه‌ها، انگیزه‌ها و چالش‌های مشتریان خود با کمترین سرمایه‌گذاری ممکن قبل از شروع ساخت، کشف کنند.در این فصل به بررسی موارد زیر خواهیم پرداخت:  چرا مردم محصولات جدید می‌خرند.  چه داده‌هایی برای هدایت نوآوری مفید است.  چگونه تحقیقات مشتری عمل‌گرایانه را برای چارچوب‌بندی ارزش پیشنهادی محصول خود انجام دهید و کشف کنید چه چیزی را بسازید و چه چیزی را نسازید.  چگونه بینش‌ها را فرموله کنید و تیم خود را حول پیشرفتی که کاربران سعی در دستیابی به آن دارند، همسو کنید.  چگونه ایده‌های خود را با مشارکت مشتریان در هر مرحله، نمونه‌سازی و آزمایش کنید.در پایان این فصل، شما به یک دیدگاه قدرتمند و مجموعه‌ای از ابزارها مجهز خواهید شد که به شما در تلاش بعدی برای شروع ساخت سرویسی که مشتریان برای آن ارزش قائل هستند، کمک می‌کندچرا مردم محصولات می‌خرند؟مردم محصولات را نمی‌خرند، آنها نسخه‌های بهتری از خودشان را می‌خرند. برای توضیح منظور، این مثال را در نظر بگیرید:آخرین باری که برای پذیرایی از دوستانتان شراب خریدید را به یاد بیاورید. چقدر در مورد ویژگی‌ها و مشخصات شراب مانند سال تولید، نوع انگور، قیمت و غیره می‌دانستید و به آن اهمیت می‌دادید؟ اگر متخصص شراب نیستید، مطمئنم که زمینه دیدار آینده با دوستانتان نقش مهم‌تری در تصمیم شما نسبت به ویژگی‌های فردی شراب داشته است. قیمت و نوع انگور ممکن است به ذهنتان خطور کرده باشد، اما منطقه و سال تولید احتمالاً تأثیر چندانی در تصمیم شما نداشته‌اند. ممکن است به سادگی یک شراب خشک را انتخاب کرده باشید زیرا می‌دانید این چیزی است که بزرگسالان می‌نوشند. بسته به شدت تمایل شما برای تحت تأثیر قرار دادن دوستانتان، ممکن است شراب را از یک فروشگاه تخصصی شراب انتخاب کرده باشید تا مطمئن شوید که چیزی قابل احترامی را به دوستانتان ارائه می‌دهید. یا ممکن است به سوپرمارکت رفته باشید تا به سادگی مقدار بیشتری از آن تهیه کنید - می‌دانید، تا گفتگو سریعتر شروع شود. در هر صورت، شما شراب را بر اساس تمایل خود برای بهتر بودن به عنوان میزبان در آن موقعیت خاص انتخاب کردید. به زبان قیاس نرم‌افزاری، شما می‌خواستید &quot;نسخه&quot; میزبانی را که قبلاً بودید، ارتقا دهید. ویژگی‌های شراب تنها زمانی در تصمیم‌گیری شما نقش داشتند که توانستید آنها را در ذهن خود به این هدف مرتبط کنید. شراب به شما کمک کرد تا &quot;پیشرفت&quot; کنید - شما آن را برای کارِ بهتر کردن شما به عنوان میزبان استخدام کردید. بر این اساس، هنگامی که با مشتری در مورد یک محصول مصاحبه می‌کنید، فقط در مورد خود محصول صحبت نکنید، بلکه بر روی کاری که آنها با آن انجام می‌دهند تمرکز کنید. آنها محصول را برای پیشرفت در زندگی خود استخدام می‌کنند، نه فقط به خاطر ویژگی‌ها یا مشخصات آن. این انگیزه برای پیشرفت زمانی به وجود می‌آید که با موقعیتی روبرو می‌شوند که وضعیت فعلی آنها به اندازه کافی خوب نیست. ما می‌توانیم این شرایط و تمایل به پیشرفت را به عنوان یک کارِ انجام‌دادنی³ توصیف کنیم. &quot;کار&quot; به معنی پیشرفت مطلوبی است که یک فرد می‌خواهد انجام دهد. از آنجایی که این هنوز فقط یک آرزو است و هنوز واقعیت نیافته (برخی محدودیت‌ها مانع فرد می‌شوند)، این کار &quot;انجام‌دادنی&quot; (Job to be Done) است (برای کسب اطلاعات بیشتر در مورد دیدگاه نوآوری «کارهایی که باید انجام شوند»، این کتاب الکترونیکی رایگان نوشته آلن کلمنت را بخوانید).پیشرفت فقط عملکردی نیست.توجه به این نکته مهم است که هنگام توصیف پیشرفت مشتری و کارهایی که آنها محصولات را برای آن استخدام می‌کنند، کافی نیست که فقط به صورت عملکردی فکر و صحبت کنیم (کاری که آنها می‌توانند با یک محصول انجام دهند). شراب مثال قبلی ما قطعاً باید استاندارد خاصی را برآورده می‌کرد تا به شما کمک کند به عنوان یک میزبان خوب برجسته شوید، با این حال، میزبان بهتر بودن اهداف عاطفی و اجتماعی را نیز در بر می‌گرفت. شما سعی می‌کردید دوستان خود را تحت تأثیر قرار دهید و احساس قدردانی کنید. از آنجایی که بیشتر تصمیم‌گیری‌ها و انگیزه‌های انسانی در نهایت عاطفی هستند، چارچوب‌بندی اینکه چگونه محصول شما به مشتریانتان کمک می‌کند تا بهبود یابند، همیشه شامل یک بعد عاطفی است (چگونه می‌خواهم احساس کنم و دیگران چگونه باید در مورد من فکر کنند). محصولات کار ندارند، مردم کار دارند.برای درک واقعی معنای &quot;کارِ انجام‌دادنی&quot;، باید درک کرد که مردم کار دارند، نه محصولات. نباید گفت که کارِ یک ماشین، جابجایی افراد از نقطه A به B است. در عوض، صاحب یک ماشین ممکن است کارِ رسیدن به موقع به محل کار یا گذراندن تعطیلات عالی در یک سفر جاده‌ای را داشته باشد. ماشین راه‌حلی است که برای این کار استخدام شده است و می‌توانست با بسیاری از راه‌حل‌های دیگر (مانند اشتراک خودرو یا هیچ‌هایکینگ: Hitchhiking) جایگزین شود تا به فرد کمک کند همان نوع پیشرفت را انجام دهد. همین محصول می‌تواند توسط افراد برای کارهای بسیار متفاوتی استخدام شود. کارها، وظیفه نیستند. مردم نمی‌خواهند وظایف را انجام دهند. یک تصور غلط رایج این است که مردم محصولات را برای انجام وظایف خاصی مانند کوتاه کردن چمن یا رانندگی استخدام می‌کنند. با توجه به آنچه قبلاً بیان کردیم، این دیدگاه نوآوری گمراه‌کننده است. این می‌تواند تیم‌ها را به سمت بهبود تدریجی ماشین‌های چمن‌زنی و خودروها سوق دهد و راه‌حل‌هایی را فراموش کنند که این وظایف را کاملاً غیرضروری می‌سازند.مردم علاقه‌مند به پیشرفت در زندگی خود هستند، نه انجام وظایفی که در حال حاضر برای آن پیشرفت ضروری است. اگر راه‌حلی پیدا کنند که به آنها امکان دهد چمن‌زنی را فراموش کنند و همچنان باغی قابل ارائه داشته باشند، بسیار مایل خواهند بود که ماشین چمن‌زنی خود را کنار بگذارند و تغییر دهند (برای مثال، آنها می‌توانند از چمن اصلاح‌شده ژنتیکی استفاده کنند یا همسایه را برای انجام این کار استخدام کنند). برای روشن‌تر شدن این موضوع، بیایید نگاهی دقیق‌تر به استعاره &quot;کارِ انجام‌دادنی&quot; بیندازیم. مردم محصولات را به همان روشی &quot;استخدام&quot; می‌کنند که یک مدیر کارمندی را برای انجام کاری استخدام می‌کند. مدیر مزایای کار شخص دیگری را می‌خواهد، بدون اینکه مجبور باشد خودش آن کار را انجام دهد. به هر حال، به همین دلیل است که آنها کسی را برای انجام کار استخدام می‌کنند. مردم محصولات را به همین روش استخدام می‌کنند. آنها می‌خواهند از مزایا لذت ببرند و کار خود را بدون انجام واقعی آن انجام دهند. مردم نمی‌خواهند کارها را انجام دهند، آنها مزایای انجام شدن آن کارها را برایشان می‌خواهند. بنابراین، بهترین رابط کاربری، عدم وجود رابط کاربری است.مشتریان رقابت را به همان شکلی که بسیاری از سازمان‌ها می‌بینند، نمی‌بینند.هنگامی که مشتریان تجربه می‌کنند که چیزی به اندازه کافی خوب نیست و شروع به جستجوی چیزی بهتر می‌کنند، طیف وسیعی از راه‌حل‌ها را در نظر می‌گیرند که ممکن است پیشرفت مورد نظر را ارائه دهند. اصطلاح راه‌حل‌ها ممکن است به محصولات و خدمات اشاره داشته باشد، اما شامل رفتارها، راه‌حل‌های موقتی، ترکیبی از موارد اخیر - گاهی اوقات حتی - انجام ندادن هیچ کاری نیز می‌شود. با ادامه مثال شراب ما، میزبان مهمانی که علاقه‌مند به سرگرم کردن مهمانان خود است، ممکن است استخدام شراب، گفتن به دوستان برای آوردن نوشیدنی‌های مورد علاقه خود یا اصلاً استخدام نکردن نوشیدنی و در عوض استخدام یک دی‌جی (DJ) را در نظر بگیرد. توجه کنید که چگونه مشتریان راه‌حل‌هایی را خارج از یک دسته محصول خاص (مانند نوشیدنی‌های الکلی) در نظر می‌گیرند  و چگونه این دیدگاه با روش سنتی نگاه به رقابت متفاوت است. هنگامی که شرکت‌ها با چالش نوآوری روبرو می‌شوند، اغلب بر روی نزدیک‌ترین رقبای خود (آبجو، نوشابه، سایر تولیدکنندگان شراب) تمرکز می‌کنند و در نهایت بهترین ویژگی‌های رقبا را در راه‌حل‌های یکسان برای همه ترکیب می‌کنند. شرکت‌ها با نادیده گرفتن این واقعیت که این رویکرد اغلب منجر به مهندسی بیش از حد راه‌حل‌های به اندازه کافی خوب می‌شود، نسبت به تلاش‌های مخرب از بازارهای دیگر کور می‌شوند. با پذیرش این دیدگاه که مشتریان راه‌حل‌هایی را برای پیشرفت و انجام کار استخدام می‌کنند و نه به خاطر ویژگی‌ها و عملکردشان، تیم خود را قادر می‌سازید تا آزادانه‌تر نوآوری کند و یاد بگیرید که بازار را به روشی که مشتریانتان انجام می‌دهند، دسته‌بندی کنید. به عنوان یک تولیدکننده شراب، ممکن است محصول اصلی خود (شراب) را در یک اکوسیستم خدماتی بگنجانید که به مشتریان شما کمک می‌کند تا میزبانان مهمانی آگاه و سرگرم‌کننده‌ای شوند. چرا درک تمایلات مردم برای پیشرفت برای نوآوری مهم است؟شرکت‌ها معمولاً تلاش‌های تحقیقاتی خود را بر درک کیفیت تجربه کاربران خود متمرکز می‌کنند.  آنها ممکن است تجزیه و تحلیل استفاده را در مراحل مختلف سفر کاربر جمع‌آوری کنند، مراحل فروش خود را تجزیه و تحلیل کنند، درخواست‌های مکرر ویژگی‌ها را جمع‌آوری و مرتب کنند و غیره. در حالی که این داده‌ها بسیار مفید هستند و قطعاً باید برای بهبود کیفیت تجربه کاربر جمع‌آوری شوند (برای کسب اطلاعات بیشتر در مورد این جنبه مهم، به فصل تجزیه و تحلیل مراجعه کنید)، باید درک کرد که این تنها داده‌ای نیست که یک شرکت باید جمع‌آوری کند، به خصوص زمانی که با چالش‌های توسعه محصول جدید، چالش‌های افزایش دامنه و رشد مواجه است. مشکل ناشی از سوگیری نمونه‌گیری (Sampling bias) ذاتی جمع‌آوری داده‌هایی است که فقط از تجزیه و تحلیل استفاده محصول فعلی نشات می‌گیرد. هنگامی که فقط با افرادی صحبت می‌کنید که قبلاً از نسخه فعلی محصول استفاده می‌کنند، به راحتی می‌توانید افرادی را که هنوز مشتری نیستند و ممکن است محصول را ترک کرده باشند (ترک‌کنندگان) فراموش کنید. این عمل تیم را به تمرکز بر بهبود آنچه در حال حاضر وجود دارد (بهینه‌سازی و نوآوری تدریجی) سوق می‌دهد، به جای فکر کردن به چیزی کاملاً متفاوت (به دانه‌های اصلاح‌شده ژنتیکی در مقابل ماشین چمن‌زنی بهبود یافته فکر کنید). این می‌تواند مانع رشد شود و منجر به محصولات متورم یا بسیار تخصصی برای گروه کوچکی از کاربران پر سر و صدا شود. جمع‌آوری تنها داده‌های به اصطلاح &quot;داده برای بهبود کیفیت&quot; به تیم‌ها اجازه نمی‌دهد فراتر از آنچه در حال حاضر وجود دارد فکر کنند و محصولات را به طور رادیکال بازنگری کنند، و فضایی را برای رقابت بی‌طرفانه و اختلال باز می‌کند.دیدگاه کارهای انجام‌دادنی راهی مفید برای تجزیه و تحلیل انگیزه‌های اساسی، اهداف، محدودیت‌ها و سایر عواملی که تقاضا برای یک محصول جدید را ایجاد و تحت تأثیر قرار می‌دهند، قبل از استفاده از محصول، فراهم می‌کند. این دیدگاه &quot;چرا&quot; پشت &quot;چگونه&quot; و مدل ذهنی مناسب برای نوآوری در بازار جدید را ارائه می‌دهد. ما می‌توانیم این نوع داده اضافی را که تحقیقات کارهای انجام‌دادنی فراهم می‌کند، &quot;داده برای رشد&quot; بنامیم. از &quot;داده‌های رشد&quot; می‌توان برای توضیح تجزیه و تحلیل‌ها، الهام بخشیدن به ایده‌پردازی راه‌حل‌های جدید و اطلاع‌رسانی موقعیت‌یابی در بازار استفاده کرد. تنها زمانی که &quot;داده برای بهبود کیفیت&quot; و &quot;داده برای رشد&quot; هر دو جمع‌آوری و درک شوند، یک تیم مجهز است تا حس کند چه زمانی باید بهینه‌سازی کند یا تغییر مسیر دهد و نوآوری کند.چرا مردم یک محصول خاص را می‌خرند؟ما ثابت کردیم که تمرکز بر کمک به مشتریان برای تبدیل شدن به نسخه‌های بهتر از خودشان هنگام ساخت محصولات جدید، مطلوب است. اما چگونه می‌فهمید که این نسخه بهتر چگونه به نظر می‌رسد؟ چگونه می‌فهمید که مشتریان شما محصول شما را برای چه کاری استخدام می‌کنند؟عملی‌ترین راه برای کشف آنچه به مردم انگیزه پیشرفت می‌دهد، تحقیق در مورد رفتار خرید و تصمیم‌گیری آنها در مصاحبه‌های کیفی است. این مصاحبه‌های به اصطلاح &quot;مصاحبه‌های تغییر&quot;⁶ به شما امکان می‌دهد بفهمید که آنها به دنبال چه پیشرفتی بودند و چه چیزی هنگام انتخاب یک محصول برایشان مهم بود. برای درک بهتر اینکه چگونه می‌توانیم کارهایی را که مردم ممکن است داشته باشند توصیف کنیم، بیایید به مدل داده زیر نگاه کنیم. مدل داده کارهای انجام‌دادنیهمانطور که مردم به دنبال یک راه‌حل جدید می‌روند، می‌خواهند به &quot;اهداف برآورده نشده&quot; برسند. این اهداف برآورده نشده‌اند زیرا برخی &quot;محدودیت‌ها&quot; وجود دارند که مانع از رسیدن مردم به آنها می‌شوند. مردم زمانی از اهداف و محدودیت‌های برآورده نشده خود آگاه می‌شوند که برخی &quot;کاتالیزورها&quot; اتفاق می‌افتند و آنها را تحریک می‌کنند. برای رسیدن به اهداف خود، آنها مجموعه‌ای از راه‌حل‌ها را استخدام می‌کنند که از بین آنها یک یا ترکیبی از چند مورد را انتخاب می‌کنند. ما این عنصر آخر را &quot;مجموعه انتخاب&quot; می‌نامیم. این چهار عنصر با هم تقاضا برای چیز جدیدی را ایجاد می‌کنند.  آنها &quot;کارِ انجام‌دادنی&quot; مذکور را در زندگی مردم ایجاد می‌کنند. درک آنها به ما کمک می‌کند تا آنچه را که مردم در یک محصول جدید به دنبال آن هستند توصیف کنیم و آن را بر این اساس طراحی کنیم. بیایید هر کدام را با جزئیات بررسی کنیم. اهداف برآورده نشدهاهداف برآورده نشده تجربیاتی را توصیف می‌کنند که ما می‌خواهیم یا بیشتر می‌خواهیم، اما در حال حاضر به دلیل محدودیت‌ها نمی‌توانیم داشته باشیم.  اهداف می‌توانند انواع مختلفی داشته باشند، به عنوان مثال:1. شایستگی: به جای احساس بی‌کفایتی و ناکارآمدی، در اعمال خود بسیار توانا و مؤثر شوید. 2. کنترل: رفتار چیزهای اطراف خود را تعیین کنید یا بر اجرای آنها نظارت کنید. 3.  ارتباط: به جای احساس تنهایی و بی‌توجهی، تماس صمیمی منظمی با افرادی داشته باشید که به شما اهمیت می‌دهند. 4.  خودشکوفایی: بهترین پتانسیل‌های خود را توسعه دهید و زندگی را معنادار کنید در مقابل احساس رکود و بی‌معنایی. 5.  امنیت: در زندگی خود ایمنی داشته باشید، به جای احساس عدم اطمینان و تهدید توسط شرایط خود. 6.  موارد دیگر شامل: نفوذ، شکوفایی فیزیکی، عزت نفس، لذت، ابراز وجود، شناخت، مراقبت، بینش، مهارت خود، مقیاس، صرفه‌جویی در زمان، کاهش‌دهنده ریسک، قابلیت اطمینان (برای اطلاعات بیشتر به «مدل داده‌ای کارهایی که باید انجام شوند» نوشته آلن کلمنت مراجعه کنید).محدودیت‌هامحدودیت‌ها مانع از برآورده کردن اهداف برآورده نشده و پیشرفت ما می‌شوند. آنها بین جایی که می‌خواهم باشم و جایی که اکنون هستم، اختلاف ایجاد می‌کنند. محدودیت‌ها معمولاً به طور مستقیم به اهداف برآورده نشده مربوط می‌شوند. انواع محدودیت‌ها می‌توانند باشند:1. اضطراب: نگرانی در مورد اتفاقات نامطلوب. 2. فقدان مهارت: نداشتن دانش برای درک چیزی یا نداشتن توانایی فیزیکی برای اجرا. 3. هزینه تغییر: این تصور که ایجاد تغییر تلاش بیش از حد می‌طلبد یا ارزشش را نخواهد داشت. 4. عادت: الگوهای ذهنی و رفتارهای فیزیکی که فرد به آنها عادت کرده است و ترک یا جدا شدن از آنها دشوار است. 5. مانع سازمانی: ویژگی‌های محیط کار فعلی که خارج از کنترل فرد است. 6. موارد دیگر شامل: وابستگی عملکردی، زمان، پول، مانع موقعیتی و غیره. کاتالیزورهاکاتالیزورها رویدادهایی هستند که اهداف برآورده نشده، محدودیت‌ها و مجموعه انتخاب را ایجاد یا تحت تأثیر قرار می‌دهند. این رویدادها باعث می‌شوند مردم از کار نکردن چیزی آگاه شوند یا کاری انجام دهند. مواردی مانند:1. رویدادهای پیش‌بینی‌شده: انتظار اینکه چیزی اتفاق بیفتد، به عنوان مثال یک مهلت مقرر. 2. رویدادهای غیرمنتظره: چیزی که شما را غافلگیر کرد، به عنوان مثال خراب شدن یک چیز. 3. تبلیغات: محتوای تبلیغاتی با هدف اطلاع‌رسانی به شما در مورد یک محصول یا ترغیب شما به استفاده یا خرید آن، به عنوان مثال یک تخفیف. 4. تبلیغات دهان به دهان: اطلاعات دست اول به دست آمده از کسی که به او اعتماد دارید، به عنوان مثال توصیه یک دوست. 5. کارِ انجام‌دادنی سطح پایین‌تر: جستجوی پیشرفت در جای دیگری که باعث تمایل به پیشرفت در جای دیگر می‌شود، به عنوان مثال تسلط بر پخت یک دستور غذا برای درخشش در یک مهمانی شام. 6. موارد دیگر شامل: رویدادهای تکراری، استفاده مشاهده‌شده، تجربه مثبت با یک محصول، تجربه منفی با یک محصول، پیشرفت کردن، انجام شدن کار و غیره. مجموعه انتخابمجموعه انتخاب هر چیزی را توصیف می‌کند که مردم برای پیشرفت به سمت اهداف برآورده نشده یا غلبه بر محدودیت‌های خود، استخدام آن را در نظر می‌گیرند. اینها می‌توانند محصولات و خدمات باشند، اما همچنین رفتارها یا ترکیبی از محصولات و خدمات. تصور کنید می‌خواستید دوستانتان را در یک شام تحت تأثیر قرار دهید. ممکن است یک شراب خوب انتخاب کنید، اما می‌توانید یک سورپرایز یا یک داستان عالی نیز بیاورید. مصاحبه‌های تغییرصحبت با مشتریانی که به محصول شما روی آورده‌اند، راهی مؤثر برای کشف چرایی استخدام محصول شما توسط مشتریان و آشکار کردن اهداف برآورده نشده، محدودیت‌ها، کاتالیزورها و مجموعه انتخاب آنهاست. مصاحبه تغییر تماماً در مورد ثبت داستان خرید و تصمیم‌گیری مشتریان شما، درک همه علل و لحظاتی است که منجر به استخدام محصولی شده که می‌خواهید تجزیه و تحلیل کنید - محصول شما یا رقیبتان. در ادامه، به نحوه انجام این مصاحبه‌ها خواهیم پرداخت. تسلط بر این تکنیک به تیم شما کمک می‌کند تا مشکل طراحی سرویس خود را چارچوب‌بندی کرده و فرصت‌های نوآوری ارزشمندی را شناسایی کنید. شما مصاحبه خود را با پرسیدن سؤالاتی در مورد لحظه‌ای که مشتری محصول شما را خریداری کرده است (تغییر) آغاز می‌کنید. در طول مصاحبه، داستان را از زمان تغییر تا اولین فکرشان، زمانی که مشتری شما فکر کرد آنچه داشت دیگر به اندازه کافی خوب نیست، ردیابی می‌کنید. سپس سعی می‌کنید &quot;منِ قدیمی&quot; آنها را درک کنید، چه محدودیت‌هایی را سعی در غلبه بر آنها داشتند و چه کاتالیزورهایی در تحریک آن تقاضا برای تغییر نقش داشتند. شما در مورد اینکه چگونه تصور می‌کردند زندگی‌شان پس از یافتن راه‌حل جدید بهتر می‌شود، می‌پرسید، و بر اهداف برآورده نشده آنها نور می‌تابانید و ایده آنها از &quot;منِ جدید&quot; را فرموله می‌کنید. برای کمک به شما در این فرآیند مصاحبه گذشته‌نگر، در اینجا چند سؤالی وجود دارد که می‌توانید بپرسید: با تغییر شروع کنید:1. می‌توانید به ما بگویید چه زمانی به خرید یا ثبت‌نام در سرویس/نرم‌افزار ما فکر کردید؟ 2. یادتان می‌آید چرا تصمیم به تغییر گرفتید؟ 3. آیا خرید این محصول به مشکلی که داشتید مربوط می‌شد؟ یا یک ابتکار جدید؟ 4. آیا مجبور بودید کس دیگری را برای خرید محصول ما متقاعد کنید؟ 5. شما چند ماه قبل از اینکه واقعاً محصول ما را بخرید، شروع به فکر کردن در مورد خرید آن کردید. چرا تصمیم گرفتید در آن زمان بخرید؟ چرا یک ماه قبل نه؟ چرا چند هفته دیگر صبر نکردید؟ 6. به استفاده از چه محصولات دیگری به جای محصول ما فکر می‌کردید؟ در صورت لزوم، سؤالات بیشتری بپرسید تا تمام عناصر مدل داده را بدست آورید:1. فکر می‌کردید پس از داشتن محصول، اوضاع شخصاً برای شما چگونه بهتر می‌شود؟ 2. فکر می‌کردید اوضاع برای شرکت یا مشتریان شما چگونه بهتر می‌شود؟ 3. آیا در متقاعد کردن دیگران برای استفاده از محصول ما مشکلی داشتید؟ 4. در طول این بازه زمانی چه اتفاقات دیگری در شرکت شما رخ می‌داد؟ آیا تغییراتی در رهبری یا جهت‌گیری استراتژیک وجود داشت؟ آیا هیچ‌کدام از اینها بر تصمیم برای شروع استفاده از محصول ما تأثیر گذاشت؟ 5. هنگامی که شروع به استفاده از محصول کردید، چگونه فهمیدید که اوضاع طبق انتظارتان پیش می‌رود (یا نه)؟ هنگام جمع‌بندی مصاحبه، مطمئن شوید که اهداف برآورده نشده و محدودیت‌هایی را که فرد هنگام انتخاب محصول داشت، درک کرده‌اید. با آنها تکرار کنید که آیا درک شما برایشان درست به نظر می‌رسد یا خیر. نگران برجسته کردن تناقضات یا چیزهایی که هنوز برای شما روشن نیستند، نباشید. مصاحبه‌های تغییر، گفتگوهای جذابی هستند که بر سفر شخصی فرد تمرکز می‌کنند، نه محصول. هیچ پاسخ درست یا غلطی وجود ندارد. آخرین، اما نه کم‌اهمیت‌ترین، مطمئن شوید که به افراد برای وقتشان غرامت می‌دهید. بلافاصله پس از مصاحبه، جلسه توجیهی برگزار کنید و برای هر مصاحبه‌شونده یک پروفایل ایجاد کنید. از مدل داده استفاده کنید و آنچه را که برای هر دسته شنیدید جمع‌آوری کنید. در اینجا یک الگوی پروفایل تقاضا (Demand Profile template) برای کمک به شما وجود دارد [لینک کار نکرد].با چه کسی مصاحبه کنیممهم است که با افرادی صحبت کنید که قبلاً محصول شما را خریده و استفاده کرده‌اند و خاطره نسبتاً تازه‌ای از تمام مبادلات و شرایط مهمی که تصمیم آنها را شکل داده است، دارند. از آنجایی که مردم مستعد توجیه تصمیمات خود هستند، از صحبت با مشتریانی که فقط به خرید فکر می‌کنند اما هنوز متعهد نشده‌اند، خودداری کنید. به طور مشابه، صحبت با افرادی که محصولی را هدیه گرفته‌اند، هیچ بینش ارزشمندی را آشکار نخواهد کرد؛ این افراد برای فکر کردن در مورد محصول هیچ انرژی‌ای صرف نکرده‌اند. شما از داستان فرآیند خرید و تصمیم‌گیری به عنوان ابزاری برای شناسایی مشتریانی استفاده خواهید کرد که انگیزه‌هایشان آزمون واقعیت را پشت سر گذاشته است و دیدگاه واضح‌تری نسبت به اقدامات آنها در مقابل آرزوها و باورهایشان به دست می‌آورید. به عنوان راهنما: با مشتریانی که در 90 تا 120 روز گذشته به محصول شما روی آورده‌اند، مصاحبه کنید. آنها دیگر عاشق محصول کاملاً جدید نخواهند بود و فرصت ارزیابی اینکه آیا توانسته‌اند به پیشرفت مورد نظر برسند یا خیر، داشته‌اند. اگر محصول من هنوز مشتری ندارد چه؟مهم نیست که برنامه (یا ویژگی برنامه) شما قبلاً در بازار باشد یا نه. در حالی که مصاحبه با مشتریان فعلی برای مبتدیان آسان‌تر است، آنچه شما به دنبال آن هستید داستان تغییر است. هنگامی که مشتریان روش قدیمی انجام کارها را برای پیشرفت ترک می‌کنند (به عنوان مثال شروع به پرداخت برای ویژگی‌های پرمیوم)، می‌توان با آنها مصاحبه کرد. در صورتی که نرم‌افزار شما هنوز منتشر نشده است، می‌توانید به سادگی با افرادی که به محصول رقیب مشابهی روی آورده‌اند، مصاحبه کنید. در صورتی که نمی‌توانید به هیچ رقیبی فکر کنید یا برنامه شما رایگان است، با مشتریانی صحبت کنید که رفتار جدیدی از خود نشان می‌دهند که با پیشرفتی که سعی در فعال کردن آن دارید، همسو باشد. برای مثال: برای ایجاد سرویس جدیدی که به مردم کمک می‌کند میزبانان بهتری شوند، می‌توانید با افرادی مصاحبه کنید که شراب، دی‌جی، کلاس آشپزی استخدام کرده‌اند یا از برنامه دستور پخت جدیدی استفاده می‌کنند و ببینید چه چیزی به آنها انگیزه داده است. خلاق باشید و نسبت به کاری که مردم امروز برای بهبود به روش یا موقعیت مشابه انجام می‌دهند، حساس باشید. برای نکات بیشتر، لطفاً این مقاله را در مدیوم (Medium) بخوانید. تعریف مسئله: بیانیه کارپس از انجام 10 تا 15 مصاحبه تغییر، باید بتوانید الگوهای نوظهوری را در داده‌هایی که میل مشتریان به پیشرفت و تقاضا برای محصول جدید را شکل داده‌اند، تشخیص دهید. پروفایل‌هایی که پس از هر مصاحبه ایجاد کردید به شما کمک می‌کند تا داده‌ها را به منظور شناسایی مشترکات در رفتار و تصمیم‌گیری‌هایی که افراد نشان داده‌اند، تجزیه و تحلیل کنید. می‌توانید برای هر گروه از ترکیب‌های اهداف و محدودیت‌های برآورده نشده مشابه، یک فراپروفایل یا به عبارت دیگر، یک &quot;بخش تقاضا&quot; ایجاد کنید.علاوه بر این، خلاصه کردن این بینش‌ها به شیوه‌ای ساختاریافته و مختصر مفید است. این فرآیند ارتباط با تیم شما را ساده می‌کند و به شما کمک می‌کند تا ببینید کدام بخش‌های محصول شما ضروری هستند و کدام‌ها را می‌توانید کنار بگذارید. به اصطلاح &quot;بیانیه کار&quot; (Job Statement) به تیم شما کمک می‌کند تا یک چشم‌انداز سطح بالا برای پروژه خود ایجاد کند. این بیان می‌کند که مشتری شما با چه چیزی دست و پنجه نرم می‌کند و چه کاری را می‌خواهد انجام دهد. با ثبت بینش‌هایی در مورد وضعیت فعلی مشتری و انگیزه پیشرفت، فضایی را برای ایده‌پردازی باز می‌کند. و به شکل‌دهی ارزش پیشنهادی محصول شما و همسو کردن استراتژی شرکت شما حول یک هدف مشتری‌محور کمک می‌کند. یک بیانیه کار دو بخش دارد: 1. موقعیتی که در آن میل به پیشرفت به وجود می‌آید (&quot;منِ قدیمی&quot;) و آینده. 2. وضعیت مطلوب پس از انجام کار و دستیابی به پیشرفت (&quot;منِ جدید&quot;). برای یک برنامه خرید مواد غذایی، بیانیه کار ممکن است این باشد: &quot;مرا از استرس جستجوی مواد اولیه سالم رها کن (چالش)، تا بتوانم لذت آشپزی برای خانواده‌ام را دوباره زنده کنم (چالش حل شده است).&quot; یک بیانیه کار نباید شامل هیچ راه‌حل یا ویژگی‌ای باشد، در غیر این صورت پتانسیل خلاقیت تیم شما را محدود می‌کند. این بیانیه کار را که این قانون را نادیده می‌گیرد در نظر بگیرید: &quot;مواد غذایی را به خانه من تحویل بده، تا در زمان خرید صرفه‌جویی کنم.&quot; بیانیه دوم عملکرد یک برنامه خرید مواد غذایی را به خوبی توصیف می‌کند، اما فضایی برای تفکر گسترده‌تر فراهم نمی‌کند. راه‌حل‌هایی مانند جعبه‌های الهام‌بخش آماده فروخته شده در سوپرمارکت یا مجموعه‌های دستور پخت توسط آن ثبت نمی‌شوند. بیشتر مشاهده کنید که چگونه هدف بیانیه دوم از نظر خلاقیت محدودکننده است (&quot;تا در زمان خرید صرفه‌جویی کنم&quot;). &quot;صرفه‌جویی در زمان&quot; یک وضعیت آینده مطلوب، یک &quot;منِ جدید&quot; را توصیف نمی‌کند. این اثری است که ممکن است مشکلی را که افراد تجربه می‌کنند و مانع از لذت بردن آنها در حین آشپزی می‌شود (خرید زمان‌بر و استرس‌زا است) کاهش دهد، اما توصیف نمی‌کند که زندگی مشتری چگونه بهبود می‌یابد. برای نکات بیشتر در مورد نحوه فرموله‌بندی بیانیه‌های کار خود، به کتاب رایگان &quot;وقتی قهوه و کلم‌پیچ رقابت می‌کنند&quot; (When Coffee and Kale Compete) نوشته آلن کلمنت (Alan Klement) مراجعه کنید. تعریف موقعیت‌ها: داستان‌های کارپس از فرموله‌بندی بخش‌های تقاضا و چشم‌انداز سطح بالای محصول خود با استفاده از بیانیه کار، اکنون می‌توانید از داستان‌های کار (Job Stories) برای توصیف لحظات چالش‌برانگیز مشخص در زندگی مشتریان خود استفاده کنید. آنها تمام لحظات چالش‌برانگیز، زمینه‌ها، اضطراب‌ها، اهداف و احساسات مختلفی را که در طول مصاحبه‌های خود شنیده‌اید، ثبت می‌کنند. در حالی که بیانیه‌های کار و بخش‌های تقاضا به شما یک چشم‌انداز و تصویر بزرگ‌تری از انگیزه فرد می‌دهند، می‌توانید از داستان‌های کار برای چارچوب‌بندی مشکلات طراحی کوچک‌تر برای شروع فرآیند ایده‌پردازی برای یک محصول منفرد در محدوده یک سرویس یا یک ویژگی خاص استفاده کنید. داستان‌های کار توضیح می‌دهند که چگونه یک گروه خاص از مشتریان در یک موقعیت خاص و مشخص عمل کردند، چه کاری انجام می‌دادند، یک راه‌حل چه تأثیراتی در ذهن آنها باید داشته باشد و در چه جهتی می‌خواستند پیشرفت کنند. بیایید به یک داستان کار نمونه برای یک برنامه خرید مواد غذایی نگاه کنیم: وقتی از خرید مواد اولیه برای فرزندانم که ارگانیک نیستند احساس بدی دارم زیرا بازدید از چندین فروشگاه با فرزندان کوچکم بسیار خسته‌کننده است،من می‌خواهم راهی برای اجتناب از خرید در چندین مکان داشته باشم،تا بتوانم وعده‌های غذایی سالم را بدون معامله راحتی با کیفیت به خانواده‌ام ارائه دهم.  وقتی… موقعیتی را توصیف می‌کند که در آن مشکلی پیش می‌آید و فرد به دنبال تغییر است. چه اتفاقی افتاد؟  من می‌خواهم… انتظاراتی را که مشتریان در مورد اثرات یک راه‌حل هنگام استفاده از آن دارند، ثبت می‌کند. خود راه‌حل یا ویژگی‌های آن ذکر نشده است.  تا بتوانم… آنچه را که هنگام حل چالش اتفاق می‌افتد، توصیف می‌کند. این توصیف می‌کند که وقتی راه‌حل در انجام کار مؤثر باشد، زندگی چگونه خواهد بود. اگر با داستان‌های کاربر (User stories) آشنا هستید، تشخیص خواهید داد که داستان‌های کار از نظر ساختار کاملاً مشابه هستند. تفاوت مهم این است که داستان‌های کار سعی در بیان داستان پیشرفت دارند به جای توصیف نیازهای یک شخصیت (Persona) خاص برای رسیدن به یک هدف. دلیل این امر این مشاهده است که افراد بسیار متنوع می‌توانند در صورت قرار گرفتن در موقعیت مشابه، به طور مشابه عمل کنند. این مثال را در نظر بگیرید:یک تاجر ثروتمند حدود 25 دقیقه فرصت دارد تا از بازرسی امنیتی در فرودگاه عبور کند. او گرسنه است و می‌بیند که صف در ایست بازرسی بسیار کوتاه است. او فکر می‌کند که می‌تواند به سرعت یک اسنیکرز (Snickers) بردارد تا قبل از ورود به رویه ناخوشایند، انرژی بگیرد. او وارد یک کیوسک می‌شود، شکلات را برمی‌دارد و پولش را پرداخت می‌کند. او می‌داند که اسنیکرز بهترین انتخاب نیست و برخلاف توصیه متخصص تغذیه اوست، اما به هر حال از آن لذت می‌برد. حالا سعی کنید به این سؤال پاسخ دهید: کدام عناصر داستان تأثیر قوی‌تری بر تصمیم او داشتند؟ اینکه او ثروتمند، تاجر و نگران تغذیه خود بود یا اینکه خود را در فرودگاهی با پیشنهادات و زمان محدود و اشتهایی برای یک لقمه سریع یافت؟ مردم به سرعت ترجیحات و نگرش‌های بیان‌شده خود را هنگامی که با موقعیت یا زمینه اجتماعی مواجه می‌شوند که رفتار جایگزین را مطلوب‌تر می‌کند، نادیده می‌گیرند. این دلیل اصلی است که پرسیدن از مردم که چه کاری انجام می‌دهند یا چه می‌خواهند، چنین فعالیت مخاطره‌آمیزی است. مردم سازگار می‌شوند. این چیزی نیست که آنها هستند، بلکه جایی، زمانی و با چه کسی هستند که باعث رفتار آنها می‌شود. با این حال، بسیاری از تیم‌های توسعه نرم‌افزار با &quot;شخصیت‌ها&quot;، شخصیت‌های خیالی که بخش‌های خاصی از گروه هدف آنها را نمایندگی می‌کنند، کار می‌کنند. اما همانطور که قبلاً بحث کردیم، این چیزی نیست که مشتریان از نظر گروه جمعیتی و روانشناختی خود هستند، آنچه بیان می‌کنند می‌خواهند، چگونه به نظر می‌رسند، کجا زندگی می‌کنند یا چه برندهایی را ترجیح می‌دهند که باعث تغییر آنها می‌شود. در حالی که این داده‌ها می‌توانند با رفتار خاصی همبستگی داشته باشند، باعث آن نمی‌شوند. زمینه باعث آن می‌شود. بنابراین، بهتر است بینش‌های مشتری خود را حول موقعیت‌ها و رفتارها و مبادلاتی که ایجاد می‌کنند، چارچوب‌بندی کنید، نه حول شخصیت‌ها. به همین دلیل است که داستان‌های کار روشی بهبود یافته برای چارچوب‌بندی بینش‌ها در مورد انگیزه مشتری ارائه می‌دهند و می‌توانند به عنوان پایه‌ای در فرآیندهای توسعه چابک (Agile) استفاده شوند. در حالی که پرداختن عمیق به چگونگی تبدیل این بینش‌ها به یک نقشه راه کامل محصول فراتر از مرزهای این کتاب است، بیایید نگاهی به چند ابزار مفید بیندازیم که به تیم شما کمک می‌کند آنچه را که آموخته‌اید چارچوب‌بندی کند و شروع به ساخت کند: اگر تیم شما به کار با شخصیت‌ها عادت دارد، میزان داده‌های بی‌معنی را کاهش دهید و بر انگیزه مشتری تمرکز کنید.اینترکام (Intercom) کتاب‌های الکترونیکی رایگان در موضوعاتی مانند مدیریت محصول، کارهای انجام‌دادنی و راه‌اندازی استارتاپ ارائه می‌دهد. آنها همچنین فرمتی به نام اینترمیشن (Intermission) ارائه می‌دهند که می‌تواند به شما در شروع یک پروژه کمک کند. این یک پروژه مختصر است که داستانی از مشتری‌ای را روایت می‌کند که می‌خواهد پیشرفت کند و شامل چند داستان کار و راه‌هایی برای اندازه‌گیری پیشرفت تیم در جهت حل مشکل مشتری است. برای دیدن نحوه عملکرد این در زندگی واقعی، وبلاگ آنها را بخوانید.اریک ریس (Eric Ries) و روش استارتاپ ناب (Lean Startup methodology) او، ابزار و دیدگاه عالی را برای جلوگیری از ساخت ویژگی‌هایی که مشتریان استفاده نخواهند کرد و اطمینان از اینکه فرصت‌های بهبود را هنگام ساخت از دست نمی‌دهید، در اختیار شما قرار می‌دهند. ریس یک رویکرد علمی برای فرموله‌بندی فرضیه‌های مشتری‌محور، ساخت راه‌حل‌ها و نمونه‌های اولیه در اسرع وقت، آزمایش سریع آنها و تجزیه و تحلیل نحوه واکنش مشتریان با کمک معیارهای واضح را توصیه می‌کند. تعریف مورد استفاده: سفر مشتریقبل از اینکه به ساخت نمونه‌های اولیه پیچیده یا ترسیم وایرفریم‌ها (Wireframes) به صورت دیجیتالی بپردازید، ضروری است که با چند ورق کاغذ تا شده یا یک بلوک پست‌ایت (Post-it) بلند و هم‌اندازه صفحه بنشینید و سعی کنید نحوه استفاده مشتری از برنامه شما را ترسیم کنید. یک استوری‌بورد (Storyboard) ایجاد کنید که محیط فیزیکی کاربر، اینکه با چه کسی هستند و با چه چیزی در تعامل هستند را ثبت کند. اگر سرویس شما بیش از یک نقطه تماس دارد، به عنوان مثال اگر به مشتری امکان اشتراک‌گذاری سفر را می‌دهد و هم سواران و هم رانندگان یک برنامه دارند، باید در مورد تعاملات بین این دو نفر فکر کنید. هدف شما این است که داستان و تعاملات مختلف را درست انجام دهید. به این ترتیب، به سرعت متوجه ناسازگاری‌ها خواهید شد و آنها را بهبود می‌بخشید و احساسی از اینکه کدام بخش‌های سفر مشتری چالش‌برانگیزتر هستند، به دست خواهید آورد. توجه ویژه‌ای به آنچه خارج از مرزهای صفحه رخ می‌دهد، داشته باشید. در برخی شرایط، کاربران نمی‌توانند تلفن خود را در دست بگیرند، به عنوان مثال هنگام حرکت در فرودگاه‌ها با چمدان‌های زیاد. این به شما امکان می‌دهد تا تخیل خود را به سمت اشکال دیگر تعامل باز کنید. به یک سرویس اتوبوس فکر کنید. این سرویس نقاط تماس فیزیکی و همچنین دیجیتالی را ترکیب می‌کند که با هم به کاهش اضطراب مشتریان کمک کرده و آنها را در طول تجربه راهنمایی می‌کنند.  ایجاد رابط کاربری: نمونه‌های اولیه و طراحی بصریهنگامی که نحوه تناسب سفرهای فردی با تصویر بزرگتر را درک کردید، می‌توانید به سمت طراحی مشخص‌تری حرکت کنید. مهم نیست که بودجه زیادی دارید یا روی یک پروژه شخصی در آخر هفته کار می‌کنید، داشتن یک نمونه اولیه نسبتاً کامل از برنامه شما بهترین راه برای برقراری ارتباط با مفهوم خود و بحث در مورد آن با دیگران است. نمونه‌های اولیه معمولاً قبل از صرف زمان برای پیاده‌سازی کد و طراحی دقیق پیکسلی توسعه می‌یابند. یک راهنمای قابل کلیک توافق شده، مرجع مفیدی است که تیم‌ها می‌توانند بدون خطر خارج شدن بیش از حد از مسیر، به سمت آن کار کنند. یک نمونه اولیه تعاملی بهترین راه برای تجسم و ارزیابی تعاملات برنامه شما است. به اندازه کافی قابل استفاده است تا طراحی را منتقل کند، بنابراین نیازی به ارائه مستندات زیادی مانند حاشیه‌نویسی تصاویر ثابت ندارید. نمونه اولیه شما می‌تواند طراحی بصری اعمال شده داشته باشد و دقیقاً مانند پس از پیاده‌سازی به نظر برسد، یا می‌توانید در سطح وایرفریم یا طرح اولیه بمانید و بر روی عملکرد و محتوا تمرکز کنید. حتی کار با کاغذ، نمونه‌سازی اولیه ممکن است در مراحل اولیه یک گزینه مناسب باشد.  اسپرینت طراحی گوگل ونچرزروش اسپرینت طراحی توسط گوگل (Google Ventures Design Sprint) به شما کمک می‌کند تا در عرض 5 روز یک نمونه اولیه آزمایش شده را توسعه دهید. اگر از اسپرینت طراحی 2.0 توسط اِی‌جِی‌اند‌اسمارت (AJ&amp;Smart) پیروی کنید، می‌توانید آن را در 4 روز اجرا کنید. این روش قبل از شروع به تحقیقات کاربر نیاز دارد، اما اگر پیشنهادات ما را تا کنون دنبال کرده باشید، باید برای شروع آن آماده باشید. در ابتدای هفته در مورد دامنه و تجربه‌ای که می‌خواهید طراحی کنید تصمیم می‌گیرید، سپس به سمت ایده‌پردازی، طراحی اولیه و ساخت یک نمونه اولیه قابل آزمایش پیش می‌روید. تا پایان هفته ایده خود را با کاربران واقعی آزمایش کرده و بازخورد ارزشمندی در مورد ایده خود جمع‌آوری خواهید کرد. اسپرینت طراحی به شما یک نمای کلی خوب از روش‌های مفید مختلفی که می‌توانید برای نمونه‌سازی اولیه و طراحی اولیه به کار ببرید، می‌دهد. در بخش بعدی بیایید چند روش را برجسته کنیم که به شما کمک می‌کند ایده خود را به مفهومی منسجم‌تر تبدیل کنید.  ابزارهای نمونه‌سازی اولیه و وایرفریمینگدر حالی که کاغذ باید در طول کل فرآیند طراحی شما یک همراه وفادار باقی بماند، تیم‌هایی در سراسر جهان ابزارهای نمونه‌سازی اولیه عالی ایجاد کرده‌اند که به شما کمک می‌کنند ایده‌های خود را مستقیماً روی دستگاه آزمایش کنید و آنها را با دیگران به اشتراک بگذارید. آنها به شما امکان می‌دهند ایده‌های خود را بیشتر شرح دهید، مفاهیم را به سرعت آزمایش کنید و روی دستگاه‌های خود کار کنید. در زیر چند ابزار وجود دارد که به خوبی با هم کار می‌کنند. نمونه‌سازی اولیه سریع با اسکچ و این‌ویژن‌+کرافت یا مارولاسکچ (Sketch) یک ابزار طراحی برای مک است که به استاندارد واقعی برای طراحی رابط‌های کاربری تبدیل شده است. جامعه آن صدها پلاگین مفید ارائه می‌دهد و اسکچ به سرعت ابزار را بهبود می‌بخشد. اسکچ یادگیری آسانی دارد و به خوبی با ابزارهایی مانند این‌ویژن (InVision+Craft) یا مارول (Marvel) ادغام می‌شود. دومی به شما امکان می‌دهد نمونه‌های اولیه قابل کلیک سبک وزنی بسازید که می‌توانند مستقیماً روی دستگاه شما پیش‌نمایش شوند و فرآیند طراحی شما را تسریع کنند (به خصوص به لطف بسیاری از ویژگی‌های مفید وارد کردن داده‌های واقعی از کرافت توسط این‌ویژن). نمونه‌های اولیه برای ارتباط با مشتری شما (اگر دارید) و آزمایش قابلیت استفاده اولیه عالی هستند. توصیه می‌کنیم طرح‌های خود را در مراحل اولیه تعاملی کنید تا مشکلات مربوط به جریان تعامل را تشخیص دهید. مشاهده طرح‌های خود بر روی دستگاه، تنها راه برای تصمیم‌گیری صحیح در مورد طراحی بصری در مورد اندازه‌های فونت، فضای خالی و بسیاری ملاحظات دیگر قابلیت استفاده است.  اسکچ  این‌ویژن  مارول نمونه‌سازی اولیه با وفاداری بالا با فریمِر، پرینسیپِلاگر به دنبال نمونه‌سازی اولیه جریان‌ها و انتقال‌های متحرکی هستید که مانند چیز واقعی به نظر می‌رسند و برنامه‌ریزی شده‌اند، فریمِر (Framer) اولین انتخاب شما خواهد بود. فریمِر مبتنی بر ری‌اَکت (React) است، که یک چارچوب وب پیچیده با منحنی یادگیری تند است، اما بنابراین می‌تواند به راحتی نمونه‌های اولیه را به محیط دنیای واقعی منتقل کند. اگر ترجیح می‌دهید هرگونه کدنویسی را به تعویق بیندازید، پرینسیپِل (Principle) یک رابط کاربری ساده برای واقعی کردن نمونه‌های اولیه تعاملی در اختیار شما قرار می‌دهد. زمانی که نمونه اولیه شما به حالت‌های زیادی نیاز دارد، محدودیت‌هایی دارد، بنابراین آماده باشید که چیزها را زیاد &quot;جعل&quot; کنید. هر دو ابزار به خوبی مستند شده‌اند و به خوبی با اسکچ ادغام می‌شوند.  فریمِر  پرینسیپِل مرتب نگه داشتن مشخصات و دارایی‌ها با زپلین و این‌ویژن کرافتهنگام انتقال طرح‌های خود به توسعه، صادرات مشخصات و دارایی‌های رابط کاربری فرآیندی زمان‌بر و طاقت‌فرسا بوده است. زپلین (Zeplin) و همچنین این‌ویژن در این زمینه کمک می‌کنند و به شما امکان می‌دهند اطلاعات مربوط به حاشیه‌ها، مقادیر رنگ، قطعه‌های کد را با یک نگاه به صورت تعاملی مشاهده کنید. در حالی که این‌ویژن کرافت نیاز به مشخص کردن طرح‌ها را از بین می‌برد، زپلین با ساده‌سازی صادرات دارایی‌ها فراتر می‌رود. هر دو ابزار به شما امکان می‌دهند دارایی‌ها را در کتابخانه‌های مفیدی سازماندهی کنید که همکاری بین تیمی را بسیار بهبود می‌بخشد.  زپلین این‌ویژنویندوز: افینیتی دیزاینر، ادوبی ایکس‌دیاگر با رایانه ویندوزی کار می‌کنید، گزینه‌های شما کمی محدودتر هستند، اما تنها نیستید. افینیتی دیزاینر (Affinity Designer) یک برنامه عالی برای طراحی گرافیک است که به شما امکان می‌دهد رابط‌های کاربری را نیز ایجاد کنید. سریع، ارزان است و از اجزای قابل استفاده مجدد پشتیبانی می‌کند. اگر با ادوبی ایلوستریتور (Adobe Illustrator) و فتوشاپ (Photoshop) آشنا هستید، باید احساس راحتی کنید.اگر اشتراک کریتیو کلاود (Creative Cloud) را دارید، ممکن است ادوبی ایکس‌دی (Adobe XD) را امتحان کنید. در حالی که هنوز نسبتاً جدید است، در ایجاد و صادرات نمونه‌های اولیه رابط کاربری قابل کلیک سریعتر از هر برنامه ادوبی دیگری است و در عین حال دارای یک رابط کاربری آسان است. پیشرفت‌های زیادی در رسیدن به اسکچ داشته است، اما فاقد جامعه و اکوسیستم پلاگین آن است. افینیتی ادوبی ایکس‌دیطراحی بصریمگر اینکه در حال ساخت برنامه‌ای باشید که از رابط کاربری غیر بصری استفاده می‌کند، رابط کاربری برنامه شما به عناصر گرافیکی، انیمیشن‌ها، رنگ‌ها، تصاویر و تا حد زیادی به تایپوگرافی متکی خواهد بود. احتمالاً جنبه‌های مفهومی طراحی رابط کاربری را در مرحله نمونه‌سازی اولیه روشن کرده‌اید. شما در مورد محل قرار دادن عناصر رابط کاربری و متنی که باید بنویسید تصمیم گرفته‌اید تا کاربر بتواند با کمترین اصطکاک ممکن در برنامه پیش برود.همچنین تمرین خوبی است که در حین نمونه‌سازی اولیه و ایجاد وایرفریم‌ها به اندازه عناصر بصری و تایپوگرافی فکر کنید. اشتباهات رایج شامل کوچک کردن بیش از حد متن و به سختی خوانا بودن آن، شلوغ کردن صفحه‌ها با عناصر زیاد و عدم فکر کردن به انیمیشن‌ها و انتقال‌ها است. ابزارهایی مانند این‌ویژن یا مارول به شما کمک می‌کنند تا مستقیماً روی دستگاه وایرفریم ایجاد کنید و جریان ناوبری و تایپوگرافی خود را خیلی زود ساده کنید. علاوه بر مزایای آشکار قابلیت استفاده، یک رابط کاربری واضح و خوب طراحی شده، طراحی بصری کلیدی برای به یاد ماندنی و منحصر به فرد کردن برنامه شما است. اگر سرویس شما شامل چندین نقطه تماس باشد، پیروی از اصول طراحی یکسان در همه آنها اهمیت فزاینده‌ای پیدا می‌کند. یک تجربه ثابت و خوب طراحی شده بخش مهمی در نحوه درک مشتریان از برند شما است.هیچ مقدار پرداخت بصری نمی‌تواند یک رابط کاربری شلوغ یا یک محصول پر از اشکال را جبران کند. با پایبندی به اصول طراحی پلتفرم، ارائه تجربه‌ای بدون اصطکاک، متمرکز ماندن در ارائه بصری خود و ارائه عملکرد منحصر به فردی که به مردم کمک می‌کند در زندگی خود پیشرفت کنند، می‌توانید از تصور غلط رایج مبنی بر اینکه تجربه برند فقط از طریق رنگ‌ها، لوگوها و راهنماهای سبک قابل القا است، فراتر بروید.سازگاری بصری در سراسر جریان به کاربران کمک می‌کند تا رابط کاربری شما را درک کنند و تعاملات را سریعتر یاد بگیرند. در مورد رنگ اصلی اکشن تصمیم بگیرید و میزان تأکیدهایی را که صرفاً برای دلایل تزئینی استفاده می‌کنید، محدود کنید. کاربر شما باید همیشه بداند کدام اقدامات در هر نما مهم‌ترین و ممکن هستند. اصول کلاسیک طراحی گرافیک و دستورالعمل‌های طراحی پلتفرم به شما کمک می‌کند تا توجه کاربر را هدایت کرده و در سراسر برنامه حرکت کنید.بسته به اینکه برنامه شما برای کدام پلتفرم طراحی شده است، می‌تواند بسیار متفاوت به نظر برسد. مطمئن شوید که طراحی شما از شیوه‌های توصیه شده برای استفاده از فونت، نمادهای استاندارد و قراردادهای چیدمان پیروی می‌کند. برای یافتن اطلاعات بیشتر و پیوند به منابع خاص، به فصل‌های مرتبط با پلتفرم این راهنما مراجعه کنید.در نهایت، نماد راه‌اندازی اولین عنصر بصری است که برنامه شما با آن شناسایی و قضاوت می‌شود. آن را تمیز و به راحتی قابل تشخیص، حتی در اندازه‌های کوچک، جلوه دهید. لوگوی شرکت خود را شامل نکنید مگر اینکه آن را به یک نماد تبدیل کنید. آزمایش کاربربهترین راه برای اعتبارسنجی مفهوم رابط کاربری شما این است که آن را به محض اینکه کار شما به اندازه کافی برای دریافت بازخورد نماینده باشد، به کاربران نشان دهید. لازم نیست منتظر بمانید تا یک محصول تمام شده و صیقل داده شده داشته باشید. آزمایش زودهنگام می‌تواند در درازمدت باعث صرفه‌جویی زیادی در وقت شما شود. این کار مفاهیمی را که کار نمی‌کنند، در مراحل اولیه فرآیند آشکار می‌کند. هر چه زمان بیشتری برای توسعه طرح‌های خود سرمایه‌گذاری کنید، رها کردن آنها و شروع دوباره سخت‌تر می‌شود. پذیرش بازخورد در مورد چیزی که تقریباً تمام شده در نظر گرفته‌اید، دشوارتر از بازخورد در مورد یک نمونه اولیه قابل کلیک است که می‌توانید به سرعت آن را به‌روز کنید. فرضیات خود را در مورد تعامل، طراحی بصری و محتوا تا جایی که می‌توانید آزمایش کنید. این به شما کمک می‌کند تا فرآیند طراحی خود را ساده کنید، مشکلات را به سرعت کشف کنید و ایده‌های جدیدی ایجاد کنید. بهترین راه برای آزمایش طرح‌های خود این است که چند کاربر را دعوت کنید و آنها را در حال انجام وظایف آزمایشی خود تماشا کنید. به سرعت خواهید دید که کجا مشکل دارند و می‌توانید از ذینفعان دعوت کنید تا در آزمایش بنشینند یا ضبط زنده آن را تماشا کنند تا به اعضای تیم خود کمک کنید با مشتریانتان همدردی کنند. یک جلسه آزمایش کاربر معمولی حدود یک ساعت طول می‌کشد. در طول این مدت از کاربرانی که با محصول آشنا نیستند خواسته می‌شود وظایف خاصی را انجام دهند، معمولاً در مورد عملکردهای اصلی. در اینجا چند ابزار مفید وجود دارد که فرآیند شما را بسیار بهبود می‌بخشد: 1. یک نمونه اولیه قابل آزمایش بسازید 2. سخت‌افزار خود را برای ضبط تنظیم کنید. از رفلکتور 3 (Reflector 3) و کوییک‌تایم (QuickTime) یا لوک‌بَک (Lookback) برای ضبط صفحه‌ها و دوربین‌های خود استفاده کنید. سعی کنید دستگاه و چهره کاربر را برای تجزیه و تحلیل بعدی ضبط کنید. 3. یک مقدمه کوتاه برای شرکت‌کننده خود چاپ کنید. توضیحی شبیه به طول و سبک توضیحات موجود در اپ استور را تصور کنید. (ارزش پیشنهادی، کوتاه) 4. هر کار را روی یک برگه جداگانه برای خواندن شرکت‌کنندگان خود چاپ کنید. 5. شرکت‌کنندگان را استخدام کنید و آنها را دعوت کنید. هنگام جستجوی افراد برای مصاحبه، خوب است به توضیحات اصلی شخصیت‌ها مراجعه کنید و به دنبال کاربرانی باشید که با آن پروفایل‌ها مطابقت دارند. ارائه پاداش، یافتن نامزدهای مناسب را آسان‌تر می‌کند، اما هنگام انتخاب آنها مراقب باشید: شما نمی‌خواهید افراد به دلیل دریافت پول حاضر شوند، شما به افرادی نیاز دارید که با گروه هدف شما مطابقت داشته باشند و بازخورد صادقانه به شما بدهند. بنابراین، ارائه پاداش‌هایی را در نظر بگیرید که با گروه هدف شما مطابقت دارند، به عنوان مثال، یک کوپن چاپ عکس اگر در حال آزمایش یک برنامه عکس هستید. 6. خودتان را معرفی کنید، روشن کنید که هیچ پاسخ درست یا غلطی وجود ندارد و شخص باید با صدای بلند فکر کند. به آنها اطلاع دهید که می‌خواهید هر آنچه را که هنگام انجام کاری با نمونه اولیه شما فکر می‌کنند، بشنوید. ذکر کنید که نمونه اولیه کامل نیست و ممکن است برخی قسمت‌های ناتمام وجود داشته باشد. اگر تصور کنند شخصی که جلسه را برگزار می‌کند، نویسنده طرح است، ممکن است در ارائه بازخورد انتقادی محتاط باشند. به آنها اطمینان دهید که آزادند نظرات صادقانه خود را بیان کنند. به هر حال، تنها دلیل ترتیب دادن جلسه آزمایش، دریافت بازخورد مستقل بود. 7. اجازه دهید شرکت‌کننده شما مقدمه را بخواند و سپس تمام وظایف را انجام دهد. 8. کاربران را به هیچ نتیجه‌گیری هدایت نکنید. با آشکار کردن نحوه عملکرد چیزها به آنها کمک نکنید (مگر اینکه نتوانند آن را بفهمند و نتوانید با جلسه ادامه دهید) و سؤالات خود را به گونه‌ای بیان کنید که وقفه ایجاد نکند. 9. به شرکت‌کننده خود پاداش دهید. 10. بینش‌های کلیدی را مستقیماً پس از آزمایش با سایر اعضای تیم خود در میان بگذارید. چه چیزی خوب پیش رفت، چه چیزی بد پیش رفت، چه چیزی شگفت‌انگیز بود؟ همانطور که با 4 تا 8 شرکت‌کننده در طول آزمایش‌ها پیش می‌روید، الگوها شروع به ظهور می‌کنند. برای یک رویکرد قوی‌تر، از لوک‌بَک استفاده کنید که به کاربران شما امکان می‌دهد با دانلود ساده یک برنامه در دستگاه خود، در آزمایش شما شرکت کنند. نه تنها می‌توانید کارهایی را که کاربران شما انجام می‌دهند ضبط کنید، بلکه می‌توانید آزمایش‌های داخلی را انجام دهید، اجازه دهید کاربران آزمایش را به تنهایی انجام دهند (آزمایش بدون ناظر) یا با آنها وارد یک جلسه زنده شوید (آزمایش با ناظر). ابزارهای لوک‌بَک کامل و آسان برای استفاده هستند و می‌توانند باعث صرفه‌جویی زیادی در وقت شما و سر و کله زدن با تنظیمات خودتان شوند. اگر می‌خواهید در زمان استخدام و ضبط شرکت‌کنندگان خود صرفه‌جویی کنید، می‌توانید از پلتفرم‌هایی مانند usertesting.com برای تسهیل فرآیند آزمایش خود استفاده کنید. شما ضبط‌هایی از کاربران خود را در حالی که با نمونه‌های اولیه و وظایف شما مواجه می‌شوند، دریافت خواهید کرد. بزرگترین مزیت یوزرتستینگ.کام، مجموعه بزرگ کاربران بالقوه آن است که به شما امکان می‌دهد افرادی را از کشورهای مختلف و با ویژگی‌های جمعیتی متفاوت استخدام کنید. معیارهای استخدام به شما امکان نمی‌دهد افراد را بر اساس موقعیت‌ها، چالش‌ها یا رفتار تغییر آنها انتخاب کنید. اما نکته مثبت این است که امکان اجرای آزمایشات خود در آخر هفته، صرفه‌جویی زیادی در زمان است. نکته منفی این است که نمونه‌های اولیه شما باید دقیق‌تر از یک آزمایش حضوری باشند که در آن می‌توانید در صورت خراب شدن چیزی، نظارت کنید. هنگامی که بازخورد دریافت می‌کنید، می‌توانید طراحی خود را تکرار کنید و بخش‌هایی را که کاملاً کامل نبودند بهبود بخشید یا اگر بازخورد خوب بود به مرحله توسعه بروید. اگر هنوز در حال کاوش در مناطق جدید هستید و نمونه اولیه خودتان کاملاً آماده نیست، می‌توانید جلسات آزمایشی را روی برنامه‌های دیگری که قبلاً منتشر شده‌اند اجرا کنید. ممکن است شگفت‌زده شوید که دیگران چقدر در مورد برنامه‌ای که ممکن است هرگز به آن فکر نکرده باشید، متوجه می‌شوند. تکرار و یادگیری را ادامه دهیدهمانطور که محصول خود را می‌سازید، مهم است که فرضیات خود را به طور مکرر آزمایش کنید. نه تنها می‌توانید قبل از صرف مقادیر زیادی پول و زمان برای ساخت ویژگی‌های اشتباه، آنچه را که کار می‌کند و آنچه را که کار نمی‌کند کشف کنید، بلکه همدلی برای مشتریان خود را در تیم خود ایجاد خواهید کرد. کاربران، انگیزه‌ها، چالش‌ها و شرایط آنها به طور مداوم تغییر می‌کنند، بنابراین توسعه فرآیندهایی در شرکت شما برای جمع‌آوری بازخورد در سطوح مختلف فرآیند ایجاد، حیاتی است. نوآوری موفق لازم نیست حدس و گمان باشد، اما همیشه مطالعه پیچیدگی باقی خواهد ماند. هرچه زودتر فرآیند یادگیری و درک خود را توسعه دهید، زودتر می‌توانید بازخورد مشتریان خود را واجد شرایط کنید، تصمیمات بهتر در مورد دامنه بگیرید و مشتریانی را پیدا کنید که برای تلاش‌های شما ارزش قائل هستند. به سوی چالش! فصل سوم</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Sat, 03 May 2025 00:44:36 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای توسعه‌دهندگان موبایل به سمت کهکشان: فصل اول</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%DA%AF%D8%A7%D9%86-%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D9%81%D8%B5%D9%84-%D8%A7%D9%88%D9%84-w14qjlxtawdm</link>
                <description>کتاب «راهنمای توسعه‌دهندگان موبایل به کهکشان» (Mobile Developer&#x27;s Guide to the Galaxy) که در حال مطالعه نسخه هجدهم آن (ویرایش نوامبر ۲۰۱۹) هستید، یک پروژه اجتماعی و غیرانتفاعی است که با هدف به اشتراک‌گذاری دانش در زمینه فناوری‌های موبایل و تشویق افراد به ورود یا تعمیق دانش خود در این جامعه پویا شکل گرفته است. این کتاب که توسط نویسندگان، ویراستاران و طراحانی که به صورت رایگان همکاری می‌کنند تهیه شده است، یک نمای کلی مستقل و جامع از فناوری‌های موبایل برای توسعه‌دهندگان و تصمیم‌گیرندگان ارائه می‌دهد.این راهنما موضوعات مختلفی از جمله توسعه اندروید و iOS، توسعه چند پلتفرمی، وب موبایل، بازی‌های موبایل، امنیت و حریم خصوصی، دسترس‌پذیری، تست، کسب درآمد، بهینه‌سازی اپ استور (ASO)، جذب کاربر و مدیریت ارتباط با مشتری موبایل (mCRM) را پوشش می‌دهد. این پروژه که در سال ۲۰۰۹ آغاز شد، اکنون توسط Open-Xchange و Customlytics منتشر می‌شود و نسخه‌های چاپی و الکترونیکی آن به طور گسترده در سراسر جهان توزیع شده و حتی به عنوان منبع آموزشی در دانشگاه‌ها و مدارس مورد استفاده قرار گرفته است.در ادامه، ترجمه فصل اول این کتاب با عنوان «کهکشان موبایل» نوشته رابرت ویرکوس را مطالعه خواهید کرد. این فصل به بررسی چشم‌انداز کنونی دنیای موبایل، بازیگران اصلی آن و استراتژی‌های کلیدی برای موفقیت در این بازار رقابتی می‌پردازد. فصل اول: کهکشان موبایلنویسنده: رابرت ویرکوس (Robert Virkus)اگر به گذشته نگاهی کنیم، صحنه‌ی تلفن‌های همراه کمی شبیه اکوسیستم کامپیوترهای خانگی در دهه 1980 بود: بازیگران زیاد، سیستم عامل‌های زیاد، نوآوری‌ها و تغییرات فراوان. امروز با یک دو قطبی جهانی سروکار داریم: 98 درصد دستگاه‌های موبایل امروزی یا با اندروید (Android) یا آی‌او‌اس (iOS) کار می‌کنند (76٪ اندروید، 22٪ iOS، به این جا مراجعه کنید).  آیا این وضعیت تغییر خواهد کرد؟ بدون فشار سیاسی یا تغییر پارادایم، انتظار نداریم وضعیت در آینده قابل پیش‌بینی تغییر کند. با این حال، نگاهی به جزئیات، دنیای کوچک و هیجان‌انگیزی از گزینه‌ها، چالش‌ها و فرصت‌ها را آشکار می‌کند.بازیگران قابل توجهبسته به استراتژی بازار و دسته برنامه/بازی/خدمات خود، باید بازیگران زیر را به دقت زیر نظر داشته باشید. البته، هر یک از این بازیگران چیزهای بیشتری به جز محصولات و خدمات ذکر شده ارائه می‌دهند، اما این‌ها مرتبط‌ترین موارد در بخش موبایل هستند که در این راهنما پوشش می‌دهیم. برخی از این بازیگران، رهبران دیجیتال جهانی را تشکیل می‌دهند که با مخفف گافام (GAFAM) خلاصه می‌شوند که مخفف گوگل (Google)- اپل (Apple)- فیسبوک (Facebook)- آمازون (Amazon)- مایکروسافت (Microsoft) است.گوگلدر صنعت موبایل، سیستم عامل اندروید گوگل همچنان بازیگر اصلی گوشی‌های هوشمند است - هم از نظر تعداد و هم از نظر درآمد. اندروید دارای انواع مختلفی مانند اندروید گو (Android Go) برای گوشی‌های هوشمند پایین‌رده، اندروید وان (Android One) که به‌روزرسانی‌های امنیتی منظم به مدت سه سال و به‌روزرسانی‌های سیستم‌عامل به مدت دو سال را وعده می‌دهد+، Wear OS برای ساعت‌های هوشمند و اندروید تی‌وی (Android TV) برای تلویزیون‌های هوشمند، و یک گزینه ادغام برای خودروها به نام اندروید آتو (Android Auto) است. البته AOSP (Android Open Source Project یا پروژه منبع باز اندروید) - نیز وجود دارد که پلتفرم اصلی سیستم‌عامل اندروید را بدون خدمات اختصاصی گوگل ارائه می‌دهد. AOSP بیشتر در چین استفاده می‌شود اما همچنین اساس LineageOS را تشکیل می‌دهد. علاوه بر این، گوگل با اِستِیدیا (Stadia) وارد بازار نوظهور پخش بازی شده و با گوگل هوم (Google Home) و دستگاه‌های مجهز به گوگل اسیستنت (Google Assistant) از فروشندگان دیگر، سهم قابل توجهی از بازار بلندگوهای هوشمند را به خود اختصاص داده است. با سیستم عامل کروم (Chrome OS)، گوگل همچنین خود را به عنوان یک فروشنده مهم سیستم عامل رایانه شخصی تثبیت کرده است. پس از آمازون و مایکروسافت، گوگل سومین ارائه دهنده بزرگ خدمات ابری است. در نهایت، گوگل با فلاتر (Flutter) یک فریمورک چند پلتفرمی راه‌اندازی کرد که اندروید، آی‌او‌اس، ویندوز (Windows)، مک‌او‌اس (macOS) و وب را در بر می‌گیرد. فلاتر همچنین توسعه رابط کاربری را در سیستم عامل آینده مبتنی بر میکروکرنل تحقیقاتی خود به نام فیوشا (Fuchsia) قدرت می‌بخشد.اپلاپل به تنهایی بازار گوشی‌های هوشمند را در وهله اول با آیفون (iPhone) و به طور خاص با سیستم عامل آی‌او‌اس و اپ استور (App Store) به ترتیب در سال‌های 2007 و 2008 ایجاد کرد. اپل همچنین یک ارائه دهنده پیشرو تبلت است+ و بازار ساعت‌های هوشمند را با محصول اپل واچ (Apple Watch) خود رهبری می‌کند. در نهایت، آنها همچنین یک پیشنهاد چندرسانه‌ای قوی مبتنی بر اپل تی‌وی (Apple TV) با tvOS خود دارند. در مقایسه با اندروید، اپل سهم بازار نسبتاً کوچکتر اما بسیار سودآوری دارد.سامسونگسامسونگ (Samsung) به عنوان بزرگترین فروشنده گوشی‌های هوشمند، تا حد زیادی بر بازار تأثیر می‌گذارد. سامسونگ عمدتاً از اندروید استفاده می‌کند، اما آنها همچنین روی سیستم عامل تایزن (Tizen) کار می‌کنند - با این حال، تاکنون هر تلاشی برای تثبیت این سیستم عامل در بخش گوشی‌های هوشمند با شکست مواجه شده است. با DeX (تجربه دسکتاپ: Desktop eXperience)، سامسونگ با پشتیبانی از صفحه‌کلید، ماوس و مانیتورهای خارجی برای کار با سخت‌افزارهای منتخب مانند گوشی سامسونگ گلکسی نوت ۱۰ (Samsung Galaxy Note 10)، بازار تبلت و رایانه شخصی را ادغام می‌کند. سامسونگ همچنین فروشگاه گلکسی (Galaxy Store) را برای توزیع برنامه‌ها اداره می‌کند که می‌تواند جایگزین جذابی برای فروشگاه گوگل پلی (Google Play Store) باشد.هواویهواوی (Huawei) به دومین فروشنده بزرگ گوشی‌های هوشمند تبدیل شده است. مانند سامسونگ، هواوی از اندروید رسمی گوگل برای بازار بین‌المللی استفاده می‌کند. احتمالاً دولت ایالات متحده با وادار کردن هواوی به دور شدن از سیستم عامل اندروید مورد تأیید گوگل، موج جدیدی از نوآوری را آغاز کرد. هواوی سیستم عامل خود به نام هارمونی (Harmony) را در آگوست 2019 به عموم معرفی کرد. این سیستم عامل برای اجرا بر روی یک میکروکرنل طراحی شده است، اما نسخه اولیه آن بر یک هسته لینوکس (Linux) سنتی متکی است. با اپ گالری (App Gallery)، هواوی همچنین پلتفرم توزیع برنامه خود را اداره می‌کند که می‌تواند جایگزین جذابی برای گوگل پلی باشد.فیسبوکفیسبوک سیستم‌های پیام‌رسان موبایل پیشرو را با واتس‌اپ (WhatsApp)، فیسبوک مسنجر (Facebook Messenger) و اینستاگرام (Instagram) ارائه می‌دهد. فیسبوک مسنجر به طور خاص گزینه‌های توسعه آسان را برای توسعه‌دهندگان فراهم می‌کند در حالی که اینستاگرام اخیراً یک افزونه واقعیت افزوده به نام اسپارک اِی‌آر استودیو (Spark AR Studio را معرفی کرده است. فیسبوک همچنین بازیگر اصلی پروژه ارز دیجیتال لیبرا (Libra) است و ابزارهای توسعه‌دهنده مختلف دیگری را ارائه می‌دهد. فیسبوک به درستی به دلیل نقض‌های مختلف داده و حریم خصوصی تحت فشار است.آمازونآمازون با الکسا (Alexa)، که با استفاده از مهارت‌ها قابل توسعه است، ارائه دهنده پیشرو بلندگوهای هوشمند است. آمازون همچنین از نسخه اندروید خود FireOS برای تبلت‌های خود استفاده می‌کند و پلتفرم توزیع برنامه اندروید خود، یعنی فروشگاه اپلیکیشن آمازون (Amazon Appstore) را ارائه می‌دهد. آمازون همچنین پلتفرم ابری پیشرو را با AWS: Amazon Web Services ارائه می‌دهد.مایکروسافتمایکروسافت همچنان ارائه دهنده پیشرو سیستم عامل دسکتاپ است اما نتوانست با ویندوز فون (Windows Phone) و پیشنهادات موبایل بعدی خود موفقیتی کسب کند. با این حال، بازار دسکتاپ و بازی، ویندوز و ایکس‌باکس (Xbox) را به اهداف جذابی برای توسعه‌دهندگان تبدیل می‌کند. مایکروسافت همچنین با سونی (Sony) در بازار نوظهور پخش بازی با استفاده از پلتفرم ابری آژور (Azure) خود همکاری می‌کند.تنسنتبا وی‌چت (WeChat) و کیوکیو چت (QQ Chat)، تنسنت (Tencent) سومین و چهارمین پیام‌رسان بزرگ موبایل در سراسر جهان را ارائه می‌دهد. با مینی پروگرمز (Mini Programs)، وی‌چت گزینه مهمی برای کشف خدمات و بازی‌ها فراهم می‌کند. وی‌چت پی (WeChat Pay) یکی از سیستم‌های پرداخت موبایلی پیشرو در چین است.کای‌او‌اسکای‌او‌اس (KaiOS) یک سیستم عامل است که برای تلفن‌های ارزان قیمت (فیچر فون) طراحی شده و مبتنی بر فایرفاکس او‌اس (Firefox OS) است. این سیستم عامل در برخی مناطق، به ویژه بازارهای نوظهور، سهم بازار قابل توجهی به دست آورده است. با کای‌استور (KaiStore) می‌توانید به راحتی برنامه‌های HTML5 خود را توزیع کنید.سیل‌فیش او‌اسسیل‌فیش (Sailfish OS) مدتی است که وجود دارد و در حال حاضر در نسل سوم خود قرار دارد. تا کنون استقبال محدودی داشته است، اما به لطف سازگاری با اندروید، می‌تواند حداقل برخی از برنامه‌های اندروید AOSP را اجرا کند.برجسته شدن در بازار شلوغبا افزایش رقابت در فضای برنامه‌ها، جنبه‌های مختلفی وجود دارد که ارزش بررسی دارند:تجربه‌ها می‌توانند در طیف وسیعی از فرم فکتورها - خواه سیستم‌های داخل خودرو، تلویزیون‌ها، رایانه‌های شخصی، کنسول‌های بازی، واقعیت افزوده یا سیستم‌های خانه هوشمند فعال‌شده با صدا - منتقل شوند. از آنجایی که فناوری موبایل به بسیاری از سیستم‌ها منتقل شده است، می‌توانید از مهارت‌های توسعه برنامه موجود خود برای دستیابی به این فرم فکتورها استفاده کنید. اما مطمئن شوید که به بهترین شکل ممکن با هر پلتفرم سازگار شوید، خود را به کمترین وجه مشترک محدود نکنید!به نظر می‌رسد کاربران تمایل کمتری به امتحان و نصب برنامه‌های جدید دارند، بنابراین برنامه‌های موجود ویژگی‌های خود را افزایش می‌دهند - از دنیای برنامه‌های تک منظوره به دنیای برنامه‌های چند منظوره حرکت می‌کنند.با برنامه‌های چند منظوره، افزونه‌ها نقش مهمی ایفا می‌کنند. به جای ایجاد و نگهداری برنامه خود، می‌توانید برنامه‌های موجود مانند وی‌چت، فیسبوک مسنجر، گوگل اسیستنت، اپل سیری (Apple Siri)، مایکروسافت آفیس (Microsoft Office) یا افزونه‌های سیستمی مانند آی‌او‌اس فایل‌پروایدر (iOS FileProvider) یا افزونه‌های برنامه تودی (Today app extensions) را گسترش دهید. برای کسب اطلاعات بیشتر در مورد &quot;رابط کاربری صفر&quot; و &quot;برنامه‌های اتمیزه شده&quot; جستجو کنید.به ایجاد نقاط توسعه در برنامه خود نیز فکر کنید تا به دیگران اجازه دهید خدمات خود را وارد برنامه شما کنند.اعلان‌ها را جدی بگیرید و مطمئن شوید که گزینه‌های تعامل را به اعلان‌های خود اضافه می‌کنید.افزایش تعامل - مانند همیشه - حیاتی است. یکی از بزرگترین محرک‌ها برای برنامه‌ها، ارتباطات و اجتماعی شدن است - همچنین برای کسب اطلاعات بیشتر، فصل کاملاً جدید ما &quot;مدیریت ارتباط با مشتری موبایل&quot; را مقایسه کنید.تمرکز این کتاب بر توسعه برنامه‌های موبایل است که شامل تعدادی مرحله از جمله: برنامه‌ریزی و مشخصات، نمونه‌سازی اولیه و طراحی، پیاده‌سازی، آزمایش داخلی و استقرار، استقرار در فروشگاه برنامه، کشف توسط کاربران، نصب، استفاده و بازخورد است. در نهایت، ما می‌خواهیم کاربران از استفاده از برنامه‌های ما لذت ببرند و به ما رتبه‌های مثبتی بدهند تا سایر کاربران را نیز به انجام همین کار تشویق کنند.در حالی که برنامه‌های موبایل در طول توسعه ویژگی‌های مشترک زیادی با توسعه سایر نرم‌افزارها دارند، ویژگی‌های خاص خود را نیز دارند. در ادامه به برخی از این موارد خواهیم پرداخت.نحوه ارائه خدمات به دستگاه‌های موبایلچندین راه برای تحقق یک سرویس موبایل وجود دارد:برنامه‌های بومییک برنامه بومی (Native App) به زبانی مخصوص پلتفرم با APIهای مخصوص پلتفرم برنامه‌نویسی می‌شود. معمولاً از طریق فروشگاه برنامه مرکزی مخصوص پلتفرم خریداری، دانلود و ارتقا می‌یابد. برنامه‌های بومی معمولاً بهترین عملکرد، عمیق‌ترین ادغام و بهترین تجربه کاربری کلی را در مقایسه با گزینه‌های دیگر ارائه می‌دهند. با این حال، توسعه بومی اغلب پیچیده‌ترین گزینه توسعه نیز هست. هنگام شروع برنامه‌های جدید، باید به جای جاوا (Java) و آبجکتیو-سی (Objective-C)، از کاتلین (Kotlin) برای اندروید و سوئیفت (Swift) برای آی‌او‌اس استفاده کنید. اطلاعات بیشتر در مورد نحوه شروع کار را در فصل‌های اختصاصی اندروید و آی‌او‌اس بیابید.وب‌سایت‌ها و برنامه‌های وبوب‌سایت‌ها یا - به طور فزاینده‌ای - برنامه‌های تک صفحه‌ای (Single-Page Applications) به زبان‌های مختلفی نوشته می‌شوند و از HTML و CSS (Cascading Stylesheets) برای رندرینگ استفاده می‌کنند. استفاده از برنامه‌های وب پیشرو (Progressive Web App) را در نظر بگیرید و آنها را برای پین کردن دسکتاپ آی‌او‌اس (iOS desktop pinning) پیکربندی کنید. برنامه‌های وب بدون فروشگاه برنامه اجرا می‌شوند، بنابراین شما مستقل از فروشگاه‌های برنامه هستید که هم خوب است، زیرا توسط فروشگاه برنامه محدود نمی‌شوید و هم بد است، زیرا یافتن شما برای کاربران سخت‌تر است. البته، می‌توانید فصل اختصاصی توسعه وب موبایل را نیز در این کتاب بیابید.برنامه‌های چند پلتفرمیخدمات چند پلتفرمی متعددی وجود دارد که سناریوهای &quot;یک بار بنویس، همه جا اجرا کن&quot; (Write-once run-everywhere) را ارائه می‌دهند. حتی زمانی که فقط با دو پلتفرم غالب سروکار دارید، ابزارهای چند پلتفرمی می‌توانند به شما کمک کنند تا خدمات خود را با تلاش کمتری به‌روزرسانی و نگهداری کنید. فصل چند پلتفرمی را بخوانید تا گزینه‌های خود را در این زمینه درک کنید.جنگ‌های بیهودهما به عنوان توسعه‌دهنده، تمایل داریم نسبت به عزیزان منتخب خود تعصب داشته باشیم. با این حال، فراموش نکنیم که این فناوری‌ها فقط همین هستند - فناوری‌هایی که در یک زمان معین و در یک فضای معین مرتبط هستند، اما نه بیشتر. بله، جنگ‌های بیهوده سرگرم‌کننده هستند اما با نگاهی به گذشته، همیشه احمقانه به نظر می‌رسند. دست‌ها بالا آنهایی که در دهه 80 خوب و قدیمی بر سر آتاری (Atari) در مقابل آمیگا (Amiga) جنگیدند!  احتمالاً تعداد کمی از شما، اما مطمئناً متوجه منظور شدید. ابتکاراتی مانند فیرفون (FairPhone)، شیفت‌فون (ShiftPhone) یا گاردین‌پروجکت (GuardianProject) ممکن است در آینده مهم‌تر از سیستم عامل یا فروشنده مورد انتخاب شما باشند.اگر در فضای وسیع توسعه موبایل گم شده‌اید، نگران نباشید، آرام بمانید و به خواندن ادامه دهید. گزینه‌ها را بررسی کنید و مشکلی را که می‌خواهید حل کنید، مخاطبان هدف و دانش خود را در نظر بگیرید. تلاش زیادی برای طراحی تجربه خدمات خود بکنید، روی مشکل موجود تمرکز کنید و آن را ساده نگه دارید. بهتر است یک کار را خوب انجام دهید تا اینکه &quot;همه چیز&quot; را فقط متوسط انجام دهید. در طراحی و قابلیت استفاده راه حل خود سرمایه‌گذاری کنید. در نهایت، یافتن جایگاه مناسب اغلب بهتر از تلاش برای کپی کردن چیزی است که قبلاً موفق بوده است. این راهنما به شما کمک می‌کند تا تصمیمی آگاهانه بگیرید!فصل دوم</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Wed, 30 Apr 2025 00:44:22 +0330</pubDate>
            </item>
                    <item>
                <title>تجهیزات مورد نیاز برای ذخیره‌سازی ابری</title>
                <link>https://virgool.io/Iamdeveloper/%D8%AA%D8%AC%D9%87%DB%8C%D8%B2%D8%A7%D8%AA-%D9%85%D9%88%D8%B1%D8%AF-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A7%D8%A8%D8%B1%DB%8C-hx4a5ib7dtup</link>
                <description>شما داده‌های مجازی خود را کجا ذخیره می‌کنید؟ در وسیله‌ای فیزیکی مثل فلش و هارد یا جاهایی مثل تلگرام، سایت‌های آپلود، گوگل‌درایو و دراپ‌باکس؟ خب می‌دانیم که ما دیگر مثل مهندسان شرکت IBM در سال 1956 نیاز نداریم برای جابجایی پنج مگابایت از فایل‌های خود از هواپیما استفاده کنیم. اما از طرف دیگر این را هم می‌دانیم که داده‌های مجازی هر روز باکیفیت‌تر و حجیم‌تر می‌شوند و نیاز به تجهیزاتی حرفه‌ای‌تر برای ذخیره‌ی آنها داریم.البته این که ما هم هر روز بیشتر ترغیب می‌شویم که داده‌های خود را به شکل مجازی نگه‌داری کنیم مزید بر علت است. نمودار زیر نشان می‌دهد که هر سال مقدار داده‌ای که در فضای اینترنت جابجا می‌شود به چه سرعتی زیاد می‌شود. حجم داده‌های مجازی در جهان تا سال 2025 بر حسب زتابایت (10 به توان 12 * 2 به توان 30 بایت)حجم بالای داده‌ها فقط مربوط به شرکت‌ها نیست. افراد عادی هم بدون این که متوجه شوند به میزان زیادی از داده‌های مجازی استفاده می‌کنند. مثلن هر کاربر آمریکایی ماهانه در اینترنت از بیش از 300 گیگابایت اطلاعات استفاده می‌کند.میزان استفاده‌ی کاربران آمریکایی از اینترنت بر حسب گیگابایت از 2018 تا 2020برای ذخیره‌سازی حجم بالای داده می‌توان به وسایل فیزیکی مثل فلش و هارددیسک اکتفا کرد و یا سراغ راهکارهای ابری رفت. مشکل وسایل ذخیره‌سازی فیزیکی گرانی تهیه‌ی آنها و امکان گم‌شدن و آسیب‌دیدنشان است. اگر هم شرکتی دارید که در فضای مجازی فعال است مشکل لزوم استخدام نیروی حرفه‌ای برای پشتیبانی از تجهیزات فیزیکی و تامین امکاناتی مثل برق را هم باید اضافه کنید. بنابراین بهترین راهکار ذخیره‌سازی داده‌ها برای بیزینس‌ها خدمات ابری است. اگر هم دنبال ذخیره‌سازی داده‌های شخصی خود هستید باز هم فضاهای ذخیره‌سازی ابری گزینه‌های مناسبی هستند.فضای ذخیره‌سازی ابری چیست؟فرض کنید به جای خرید هارد اکسترنال برای ذخیره‌سازی داده‌های خود چند گیگابایت از سرور شرکتی بزرگ را اجاره کنید و فایل‌های خود را در آن ذخیره کنید و از طریق اینترنت به آنها دسترسی داشته باشید. فضای ذخیره‌سازی ابری چنین فضایی است. جایی که شما به شکل فیزیکی به آن دسترسی ندارید و روی فضای اینترنت قرار دارد. این فضا می‌تواند هرکدام از موارد زیر باشد:سرورهای تلگرامسرویس‌های غیرایرانی میزبانی فایل: گوگل‌درایو، دراپ‌باکس، آی‌کلاد، مگا، وان‌درایو و...سایت‌های ایرانی آپلود فایلفضاهای ذخیره‌سازی ابری ایرانی مثل پارس‌پکهرکدام از موارد بالا مزایا و معایب خود را دارند. انتخاب این که در کدام یک از این فضاها اطلاعات خود را ذخیره کنید بر عهده‌ی خودتان است. اما درباره‌ی سه مورد اول باید به نکات زیر توجه کنید:سرورهای تلگرام: ذخیره‌سازی فایل روی تلگرام به شکل نامحدود و رایگان (برای فایل‌هایی با حجم کمتر از 2 گیگابایت) ممکن است. مشکل این است که مطمئن نیستیم تلگرام تا چه زمانی حاضر به نگهداری رایگان فایل‌هاست و با این فایل‌ها چطور رفتار می‌کند. ممکن است در آینده تلگرام دسترسی به داده‌های آپلودشده را پولی کند یا فایل‌ها را برای اهداف تبلیغاتی پردازش کند (همان طور که اکنون برخی از امکاناتش را پولی کرده و چند وقت پیش هم پاول دورف از هدفش برای پولی‌کردن نام‌های خاص برای کانال‌ها حرف زد). طبقه‌بندی فایل‌ها هم در تلگرام کار آسانی نیست. عدم امکان تعریف سطوح دسترسی و عدم امکان ایجاد لینک دانلود عمومی برای فایل از مشکلات دیگر ذخیره‌ی فایل در تلگرام هستند.سرویس‌های غیرایرانی میزبانی فایل مانند گوگل‌درایو: این سرویس‌ها معمولن امکانات خیلی خوبی برای عمومی یا خصوصی کردن فایل‌ها و تعریف سطوح دسترسی، ایجاد لینک دانلود عمومی، طبقه‌بندی فایل‌ها و امنیت داده‌ها ارائه می‌دهند. اما همه‌ی این سرویس‌ها حجم رایگان محدودی دارند و برای خرید حجم بالاتر نیاز دارید پرداختی ارزی انجام دهید. ضمن این که سیاست شرکت‌هایی مانند گوگل هم ممکن است شامل دسترسی موتورهای هوش مصنوعی به فایل‌ها و ایجاد محدودیت در آنها بر حسب محتوایشان باشد. از طرف دیگر قرار داشتن سرور اکثر این سرویس‌ها در آمریکا این خطر را ایجاد می‌کند که کاربران ایرانی برای دسترسی به فایل‌هایشان دچار مشکل شوند.سایت‌های آپلود فایل: سایت‌های ایرانی و خارجی زیادی برای آپلود فایل وجود دارند. در این سایت‌ها هم به رایگان و هم با پرداخت پول می‌توانید فایل آپلود کنید. معمولن این سایت‌ها امکانات پیشرفته‌ای ندارند و حجم محدودی هم برای آپلود ارائه می‌دهند. همچنین همیشه این خطر وجود دارد که به علت کوچک بودن بیزینس آنها در آینده فایل‌های آپلودشده از دسترس خارج شوند. در مواردی هم دیده‌ام که به علت درست تنظیم نکردن دسترسی‌ها با جستجو در موتورهای گوگل می‌توان به فایل‌های شخصی آپلودشده مثل کارت ملی و شناسنامه‌ی افراد دسترسی یافت. تجهیزات ذخیره‌سازی ابریوقتی حرف از کلود استوریج (فضای ذخیره‌سازی ابری) می‌زنیم یعنی شما برای ذخیره‌سازی اطلاعات خود نیازی به تجهیزات فیزیکی ندارید. با تکنولوژی رایانش ابری، اطلاعات شما در فضای ابری ذخیره می‌شود و می‌توانید از هر جایی که به اینترنت دسترسی داشته باشد به فایل‌های خود دسترسی داشته باشیدسخن پایانیفضای ذخیره‌سازی ابری چه برای استفاده‌ی شخصی و چه استفاده‌ی سازمانی در مقایسه با فضای ذخیره‌سازی فیزیکی مناسب است. چه از لحاظ کیفیت و چه از لحاظ قیمت این دو فضا را مقایسه کنیم باز هم برنده فضای ابری است. منابععکس اول (هارد پنج مگابایتی 1956): The next webنمودار حجم داده‌ها در جهان: Statistaنمودار میزان استفاده‌ی کاربران آمریکایی از اینترنت: Statistaنمای پروتکل آمازون S3: سایت AWS</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Thu, 24 Apr 2025 20:00:54 +0330</pubDate>
            </item>
                    <item>
                <title>مسیری به سمت php 8.1</title>
                <link>https://virgool.io/Iamdeveloper/%D9%85%D8%B3%DB%8C%D8%B1%DB%8C-%D8%A8%D9%87-%D8%B3%D9%85%D8%AA-php-81-lvvijqkako66</link>
                <description>برنت (Brent) تهیه کننده ی سایت sitcher.io که مقالات و ویدئوهای جالبی درباره ی پی اچ پی منتشر می کند، یک خبرنامه‌ی ایمیلی 10 قسمتی درباره ی پی اچ پی 8.1 دارد. با عضویت در این خبرنامه طی 10 روز، 10 ایمیل درباره ی ویژگی های جدید این نسخه دریافت می کنید و سپس به صورت اتوماتیک عضویت شما لغو می شود و دیگر ایمیلی دریافت نخواهید کرد. من در این نوشته نگاهی به این ویژگی های جدید php 8.1 که در خبرنامه نام برده شده اند می اندازم.همچنین دقت کنید که این ها تنها ویژگی های جدید این نسخه نیستند. بلکه مواردی هستند که از نظر نویسنده مهم تر بوده اند. در زمان نوشتن این مطلب چون می خواستم مفاهیم ارائه شده را بهتر یاد بگیرم منابع دیگر را هم می دیدم و به نظرم یکی از بهترین منابع برای دیدن تغییرات php 8.1 سایت php.watch است که در این مطلب هم از آن استفاده کرده ام و ویژگی های بیشتری را هم توضیح داده است.پیشنهاد من این است که اگر می خواهید این مفاهیم را عمیق تر یاد بگیرید در خبرنامه عضو شوید یا سایتی را که معرفی کردم بخوانید.نکته: نسخه ی جدید خبرنامه، 6 قسمتی و مربوط به php 8.2 است.1. ویژگی Enumsفرض کنید متغیری دارید که چند مقدار مشخص می گیرد. مثلن یک مقاله می تواند در حالت «پیش نویس»، «منتشر شده» یا «بایگانی شده» باشد. برای چنین موردی می توانید از enum استفاده کنید:enum Status {
    case draft;
    case published;
    case archived;
}شما می توانید به enum متد هم اضافه کنید:enum Status
{
    case DRAFT;
    case PUBLISHED;
    case ARCHIVED;
    
    public function color(): string
    {
        return match($this) 
        {
            Status::DRAFT =&gt; &#039;grey&#039;,   
            Status::PUBLISHED =&gt; &#039;green&#039;,   
            Status::ARCHIVED =&gt; &#039;red&#039;,   
        };
    }
}می توانید مقادیر string یا integer به enum نسبت دهید:enum Status: string {
    case draft = &#039;draft&#039;;
    case published = &#039;published&#039;;
    case archived = &#039;archived&#039;;
}و در نهایت در کلاس از آنها استفاده کنید:class BlogPost
{
    public function __construct(
        public Status $status,
    ) {}
}

$post = new BlogPost(Status::draft);2. ویژگی First-Class Callablesکاربرد این ویژگی زیاد نیست. با این حال خوب است که در موردش بدانیم. فرض کنید می‌خواهیم کارکرد این تابع را به یک متغیر نسبت دهیم. تا الان باید چنین کاری می کردیم:$strlen = Closure::fromCallable(&#039;strlen&#039;);
echo $strlen(&#039;foo&#039;) //3حالا راه ساده تری وجود دارد:$strlen = strlen(...)
echo $strlen(&#039;foo&#039;) //3عبارت «...» جزئی از کد است (برای نوشتن توضیحات این بخش از این مقاله استفاده کردم).3. ویژگی Array Unpackingکاربرد این ویژگی مانند array_merge در ترکیب آرایه ها است. این ویژگی قبلن (از نسخه ی 7.4) فقط برای آرایه هایی با کلیدهای عددی وجود داشته است:$arrayA = [1, 2, 3];
$arrayB = [4, 5];
$result = [0, ...$arrayA, ...$arrayB, 6, 7];
// [0, 1, 2, 3, 4, 5, 6, 7]و حالا برای آرایه هایی با کلیدهای رشته ای هم اضافه شده است:$arrayA = [&#039;a&#039; =&gt; 1];
$arrayB = [&#039;b&#039; =&gt; 2];
$result = [&#039;a&#039; =&gt; 0, ...$arrayA, ...$arrayB];
// [&#039;a&#039; =&gt; 1, &#039;b&#039; =&gt; 2]4. ویژگی Pure Intersection Typesاز نسخه ی 8.1 پی اچ پی به بعد می توانید مشخص کنید که نوع (type) یک پارامتر، پراپرتی یا مقدار بازگشتی (return value) چه باشد و آن مقدار را برای همه ی تایپ های کلاس ها یا اینترفیس های مرتبط اجباری کنید. این ویژگی با Union Type (که در نسخه ی 8.0 معرفی شده بود) متفاوت است. اجازه بدهید کمی بیشتر توضیح بدهم:از نسخه ی 7.4 می توان برای پراپرتی ها تایپ مشخص کرد (سن باید از نوع عدد صحیح باشد):public int $age;از نسخه ی 8.0 می توان چند نوع تایپ ممکن را مشخص کرد (سن می تواند عدد صحیح یا اعشاری باشد):public int|float $age;اما ویژگی ای که از نسخه ی 8.1 اضافه شده مشخص کردن همزمان چند نوع تایپ است (ورودی تابع تست باید هم از نوع A و هم از نوع B باشد):function test(A&amp;B $foo) { /* … */ }اما چنین چیزی چطور ممکن است؟ فرض کنید دو اینترفیس داریم که یکی uuid دریافت می کند و یکی slug:interface WithUuid
{
    public function getUuid(): Uuid;
}
interface WithSlug
{
    public function getSlug(): string;
}حالا فرض کنید تابعی دارید که مقادیر ورودی آن آبجکت هایی هستند که هم uuid و هم slug دارند:function url($object): string { /* … */ }چطور می توانید مطمئن شوید آبجکت ورودی هم اینترفیس WithUuid و هم اینترفیس WithSlug را پیاده سازی کرده است؟ در نسخه های قبلی باید اینترفیس جدیدی می ساختید که هر دو اینترفیس قبلی را اکستند کرده باشد و بعد از تایپ آن برای آبجکت ورودی استفاده می کردید:interface WithUrl extends WithUuid, WithSlug
{}حالا نیازی به این کار نیست و می توانید همزمان هر دو نوع اینترفیس را به عنوان تایپ آبجکت ورودی مشخص کنید:function url(WithUuid&amp;WithSlug $object): string 
{ /* … */ }5. ویژگی Readonly Propertiesاز نسخه ی 8.1 به بعد اگر به پراپرتی یک کلاس ویژگی readonly را اضافه کنید، آن پراپرتی فقط یک بار می تواند مقداردهی اولیه شود و بعد از آن مقدارش را نمی توان تغییر داد:public readonly int $uid;چنین ویژگی ای می تواند باعث شود کدها کوتاه تر و تمیزتر نوشته شوند. برنت این موضوع را این گونه توضیح می دهد. قبل از نسخه ی 7.4 با ویژگی Data Transfer Object (DTO) می توانستیم چنین کلاسی بنویسیم:class BlogData
{
   /** @var string */
    private $title;
  
    /** @var State */
    private $state;
    
    public function __construct(string $title, State $state)
    {
        $this-&gt;title = $title;
        $this-&gt;state = $state;
    }
    
    public function getTitle(): string
    {
        return $this-&gt;title;    
    }
    
    public function getState(): State 
    {
        return $this-&gt;state;    
    }
}از نسخه ی 7.4 ویژگی پراپرتی های تایپ دار شده را داشتیم:class BlogData
{
    private string $title;
    
    private State $state;
    
    public function __construct(string $title, State $state)
    {
        $this-&gt;title = $title;
        $this-&gt;state = $state;
    }
    
    public function getTitle(): string
    {
        return $this-&gt;title;
    }
    
    public function getState(): State
    {
        return $this-&gt;state;    
    }
}از نسخه ی 8.0 می توانستیم پراپرتی ها را در خود سازنده تعریف کنیم:class BlogData
{
    public function __construct(private string $title, private State $state){}
    
    public function getTitle(): string
    {
        return $this-&gt;title;    
    }
    
    public function getState(): State 
    {
        return $this-&gt;state;    
    }
}و در نهایت از نسخه ی 8.1 می توانیم بدون نوشتن پراپرتی های private و توابع getter هدف مورد نظرمان را با ویژگی readonly پیش ببریم:class BlogData
{
    public function __construct(public readonly string $title, public readonly State $state) {}
}می بینید که کد در عین خوانایی چقدر کوتاه تر شد.6. ویژگی New in Initializersتا قبل از این نسخه می شد برای پراپرتی های کلاس مقدار پیش فرض تعریف کرد. کلاس قبلی را در نظر بگیرید. می توانیم بگوییم پیش فرض پراپرتی «عنوان» یک استرینگ خالی باشد:class BlogData
{
    public function __construct(public readonly string $title = &#039;&#039;, public readonly State $state) {}
}از نسخه ی 8.1 می توانیم برای پراپرتی هایی از نوع آبجکت هم مقدار پیش فرض تعیین کنیم. مثلن همین کلاس را با مقدار پیش فرض Draft() برای state بنویسیم:class BlogData
{
    public function __construct(public readonly string $title = &#039;&#039;, public readonly State $state = new Draft()) {}
}7. بهبود Performanceدر نسخه ی 8.1 نسبت به نسخه های قبلی تعداد درخواست بیشتری را در هر ثانیه می توان دریافت کرد. مثلن گفته اند یک اپلیکیشن ساده ی Hello, World! در سیمفونی با این نسخه 8% سریعتر از نسخه ی قبلی لود می شود. یکی از دلایل این بهبود عملکرد کامپایل و کش شدن کلاس های پی اچ پی به صورت جداگانه و کش شدن وراثتی (inheritance cache) است (گرچه توضیحات فنی این تغییر را نمی دانم).8. ویژگی Fibersاین ویژگی در سطوح عمیق تر پی اچ پی جای داده شده و برای همین ممکن است خیلی از اپلیکیشن ها به صورت مستقیم با آن درگیر نباشند. کتابخانه هایی که از asynchronicity (غیرهمزمانی) استفاده می کنند با فیبرها بیشتر درگیرند.فیبرها روشی برای انجام پردازش موازی روی یک پردازش فیزیکی یکسان هستند. در هنگام استفاده از فیبرها از پردازش های چند تردی (multiple threads) یا موازی واقعی استفاده نمی کنیم که یعنی چند بخش از کد شما همزمان اجرا نمی شود بلکه اجازه داده می شود که توسعه دهنده ها وقتی بخشی از کدشان در حال اجراست کار دیگری را انجام دهند. مثلن وقتی بخشی از کد منتظر یک فایل برای خواندن است می توانید دریافت فایل دیگری را شروع کنید.مثلن می توانید 10 درخواست http بفرستید و همزمان برای منتظر پایان همه ی آنها باشید به جای این که یکی یکی دریافتشان کنید. این ویژگی پیش از این هم با generator ها و yield وجود داشته اما فیبرها API راحت تری را ارائه داده اند. فیبرها مجموعه توابع سطح پایینی (low level) هستند که به پی اچ پی اجازه می دهند اجرای کدش را همزمان با انتظار I/O در پس زمینه انجام دهد. برنت توضیحات دقیق تری را در نوشته ای جداگانه داده است.9. ویژگی Never Typeنوع جدید اضافه شده به پی اچ پی (never) اجازه می دهد که برای یک تابع قانونی تعریف کنیم که هیچ وقت نتواند مقدار بازگشتی (return) داشته باشد. این ویژگی فرق ظریفی با تعریف بازگشت void دارد. با تایپ بازگشتی void می گوییم تابع نمی تواند چیزی برگرداند اما می توان در تابع return را به تنهایی تعریف کرد. اما در تابعی که تایپ بازگشتی never دارد به هیچ وجه امکان استفاده از کلمه ی کلیدی return وجود ندارد. در این تابع یا باید یک استثنا (exception) ایجاد کرد (throw) یا از کد خارج شد (exit):function redirect(string $uri): never
{
    header(&amp;quotLocation: {$uri}&amp;quot);
    
    exit;
}10. چند ویژگی دیگرتابع جدید array_is_list بررسی می کند که آرایه فقط شامل کلیدهای عددی و مرتب شده است یا نه.از این نسخه ثابت های کلاس (const) هم می توانند ویژگی final داشته باشند و کلاس های زیرمجموعه نمی توانند این ثابت ها را مقداردهی مجدد کنند.class Foo {
    final public const TEST = &#039;1&#039;;
}
class Bar extends Foo {
    public const TEST = &#039;2&#039;;
}تابع fsync تغییرات را در فایل همزمان می کند.در سیستم عددی هشت تایی (octal) از این به بعد دو مقدار 0o و 0O هم وجود خواهد داشت.echo 077; // 63
echo 0o77; // 63, PHP 8.1
echo 0O77; // 63, PHP 8.1دیگر نمی توان آرگیومنت های غیر قابل نال شدن را با null مقداردهی کرد.strlen(null); //Deprecated: strlen(): Passing null to parameter #1 ($string) of type string is deprecated in ... on line ...و ویژگی های دیگری که می توانید در این مطلب ببینید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Sat, 17 Jun 2023 14:16:09 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت سایت کوتاه‌کننده‌ی لینک با yourls در اوبونتو</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B3%D8%A7%D8%AE%D8%AA-%D8%B3%D8%A7%DB%8C%D8%AA-%DA%A9%D9%88%D8%AA%D8%A7%D9%87-%DA%A9%D9%86%D9%86%D8%AF%D9%87-%DB%8C-%D9%84%DB%8C%D9%86%DA%A9-%D8%A8%D8%A7-yourls-%D8%AF%D8%B1-ubuntu-1804-ula4b6axpgzj</link>
                <description>چه جوری می شه یه سایت «لینک کوتاه ساز» (URL Shortener) ساخت؟ مثل bit.ly (یا مرحوم goo.gl یا سایت ایرانی b2n.ir). سایتی که بتونیم لینک های بلندمون رو بهش بدیم و اون لینک کوتاهش رو بهمون بده؟ سایتی که نگران تعطیل شدنش هم نباشیم و مال خودمون باشه (مثل vrgl.ir که مال خود ویرگوله) و بتونیم به صورت خودکار برای صفحات سایتمون لینک کوتاه بسازیم.خب الان اگه در گیتهاب بگردید، شاید هزاران مخزن «لینک کوتاه ساز» وجود داشته باشه. من سراغ یکی از معروف ترین هاش رفتم: YOURLS که مخفف Your Own URL Shortener است. از این به بعد دوستمون رو یورلز (با این که تلفظ سختی پیدا می کنه) صدا می کنیم. مخزن یورلز خوب به روز می شه و آدمای زیادی توش مشارکت داشتند و خلاصه با استانداردهای گیتهابی، کد خوبی محسوب می شه. و طبیعتن متن باز و رایگانه. یورلز با php نوشته شده.من این جا می خوام تجربه ی خودم از نصب یورلز روی اوبونتوی 16.04 (که البته مشابه نصب روی اوبونتوی 18.04 و 22.04ه) از روی این منبع بگم و البته چیزایی رو بهش اضافه کنم.نکته: فرض بر اینه که شما به command line اوبونتوی خودتون به صورت ادمین دسترسی دارید. اما اگه دسترسی ندارید، می تونید اول هر کدوم از این دستورها از کلمه ی جادویی sudo استفاده کنید (و البته که باید پسورد sudo رو داشته باشید).گام صفر: خرید یک دامنه ی کوتاه و تنظیم دامنه روی سرورقاعدتا اول باید یک دامنه ی کوتاه بخرید و وصلش کنید به سرورتون که ربطی به این آموزش نداره. من از ابرآروان سرور گرفتم و دامنه رو هم از طلاهاست خریدم (اینا تبلیغ نیست! تجربه است). دامنه ی s1f.ir که کوتاه و خوشگل باشه!گام اول: به روز کردن و نصب چیزایی که لازمهبیایم اول مخازنمون رو آپدیت کنیم و افزونه های لازم php و cURL رو هم نصب کنیم:apt update
apt install -y php php-fpm php-cli php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmathگام دوم: نصب ماریا دی بیتوی این آموزش برای مدیریت دیتابیس از MariaDB استفاده می شه. شما می تونید از mySQL یا هر سیستم مدیریت پایگاه داده ی رابطه ای دیگه هم استفاده کنید. روش نصب ماریا این جا توضیح داده شده و به طور خلاصه این جوریه:apt-get install software-properties-common
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
add-apt-repository &amp;quotdeb [arch=amd64,arm64,ppc64el] http://mariadb.mirror.liquidtelecom.com/repo/10.4/ubuntu $(lsb_release -cs) main&amp;quot
apt -y install mariadb-server mariadb-clientبعدش از شما یه گذرواژه (پسورد) می خواد که دو بار می زنید و ست می شه اما اگه نخواست، باید این دستور رو بزنید:mysql_secure_installationو همون اول root password رو تعیین کنید. بقیه ی بخش های این دستور رو هم با زدن y می تونید رد کنید (که باعث می شه دیتابیس شما امن تر بشه).NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we&#039;ll need the current
password for the root user.  If you&#039;ve just installed MariaDB, and
you haven&#039;t set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from &#039;localhost&#039;.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named &#039;test&#039; that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you&#039;ve completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!حالا با دستور زیر می تونید وارد محیط مدیریت دیتابیس بشید (که بعد از زدن این دستور، ازتون پسورد mariaDB رو می خواد):mysql -u root -pو بعد دیتابیس مربوط به یورلز رو نصب کنید، یک کاربر با دسترسی کامل به این دیتابیس ایجاد کنید و برای این کاربر، یه رمز قوی انتخاب کنید:CREATE DATABASE yourls;
GRANT ALL PRIVILEGES ON yourls.* TO &#039;yourls&#039;@&#039;localhost&#039; IDENTIFIED BY &amp;quotStrongPassword&amp;quot
FLUSH PRIVILEGES;
QUITدقت کنید که می تونید اسم دیتابیس رو چیز دیگه ای بذارید، کاربر دیتابیس رو هم چیزی جز یورلز بنویسید و پسورد رو هم چیز دیگه ای بذارید.گام سوم: دانلود و تنظیم یورلزحالا وقتشه که اصل کاری رو نصب کنیم. توی این آموزش، یورلز رو توی پوشه ی srv گذاشته اما شما می تونید هر جای دیگه ای بذارید یا بذارید همون جای همیشگی: /var/www.cd /srv
git clone https://github.com/YOURLS/YOURLS.gitحالا فایل کانفیگ اصلی خودمون رو از روی فایل نمونه می سازیم:cd YOURLS/user
cp config-sample.php config.phpبا دستور زیر می تونیم فایل تنظیمات رو باز کنیم (من از ویرایشگر nano استفاده کردم که برای ما معمولیا ساده تره. شما اگه حرفه ای و خفن و گیک‌نما هستید از vi یا vim استفاده کنید).nano config.phpاز https://www.reddit.com/r/ProgrammerHumor/comments/838if8/nano_vs_vim/ توی این فایل، نام دیتابیس، نام کاربر دیتابیس، گذرواژه ی کاربر و پیشوند جداول دیتابیس رو می تونید تنظیم کنید. یعنی موارد زیر رو ویرایش کنید. *
 ** MySQL settings - You can get this info from your web host
 */

/** MySQL database username */
define( &#039;YOURLS_DB_USER&#039;, &#039;yourls&#039; );

/** MySQL database password */
define( &#039;YOURLS_DB_PASS&#039;, &#039;StrongPassword&#039; );

/** The name of the database for YOURLS */
define( &#039;YOURLS_DB_NAME&#039;, &#039;yourls&#039; );

/** MySQL hostname.
 ** If using a non standard port, specify it like &#039;hostname:port&#039;, eg. &#039;localhost:9999&#039; or &#039;127.0.0.1:666&#039; */
define( &#039;YOURLS_DB_HOST&#039;, &#039;localhost&#039; );

/** MySQL tables prefix */                                                                                                                            
define( &#039;YOURLS_DB_PREFIX&#039;, &#039;yourls_&#039; );در ادامه ی همین فایل باید اسم دامنه تون رو (همون دامنه ی کوتاه) بنویسید:/** YOURLS installation URL -- all lowercase, no trailing slash at the end.
 ** If you define it to &amp;quothttp://sho.rt&amp;quot, don&#039;t use &amp;quothttp://www.sho.rt&amp;quot in your browser (and vice-versa) */
define( &#039;YOURLS_SITE&#039;, &#039;http://xmp.ir&#039; );در ادامه ی فایل می تونید ساعت محلی رو تنظیم کنید (نسبت به ساعت گرینویچ). این بخش زیاد مهم نیست. فقط توی نمایش زمان توی پنل ادمین یورلز (و طبیعتن در ثبت در دیتابیس) اهمیت داره. این بخش ممکنه توی فایل تنظیمات نباشه و خودتون مجبور شید اضافه اش کنید:** Server timezone GMT offset */
define( &#039;YOURLS_HOURS_OFFSET&#039;, &#039;+3:30&#039; );و در ادامه ی فایل، چند تا نام کاربری و گذرواژه برای دسترسی به پنل ادمین یورلز بسازید:/** Username(s) and password(s) allowed to access the site. Passwords either in plain text or as encrypted hashes
 ** YOURLS will auto encrypt plain text passwords in this file
 ** Read http://yourls.org/userpassword for more information */
$yourls_user_passwords = array(
  &#039;admin&#039; =&gt; &#039;AdminPassword&#039;,
  &#039;jmutai&#039; =&gt; &#039;MyStrongPassword&#039;,
   // You can have one or more &#039;login&#039;=&gt;&#039;password&#039; lines
   );پسورد رو می تونید به صورت هش شده هم بنویسید اما اگه ننویسید هم خود یورلز بعدن تبدیلش می کنه (البته که «لا تبدیل لخلق الله»!)گام چهارم: نصب وب سرور انجین ایکسحالا باید یه وب سرور هم نصب کنید. می تونید از apache هم استفاده کنید اما توی این آموزش از nginx استفاده شده.sudo apt install -y nginxفایل تنظیمات مربوط به یورلز در انجین ایکس رو بسازید و بازش کنید:nano /etc/nginx/conf.d/yourls.confو توی فایل این ها رو بنویسید:server {
  listen 80;
  server_name example.com www.xmp.ir;
  root /srv/YOURLS;
  index index.php index.html index.htm;
  listen [::]:80;
  location / {
    try_files $uri $uri/ /yourls-loader.php$is_args$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
    include fastcgi_params;
  }
}مشخصه که داریم به انجین ایکس می گیم روی پورت 80 وب سرور رو راه بنداز و پوشه ی /srv/YOURLS رو وصل کن به دامنه ی xmp.ir.حالا چک می کنیم که انجین ایکس درست کار کنه:nginx -tکه باید این پاسخ رو بده:nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulحالا مالک پوشه ی یورلز رو وب سرور (www-data) قرار می دیم:sudo chown -R www-data:www-data /srv/YOURLSو nginx رو ریستارت می کنیم:sudo systemctl restart nginxگام پنجم: نصب یورلزخب دیگه کار تمومه. باید به آدرس xmp.ir/admin بریم، روی install YOURLS بزنیم:بذاریم پیش نیازها رو چک کنه: و بعد صفحه ی ورود رو بهمون نشون بده:حالا با یکی از همون نام کاربری و گذرواژه ها که توی فایل تنظیمات ست کردیم، وارد می شیم.و تمام!از این به بعد می تونید با این پنل لینک های کوتاه بسازید و آمار کلیک روی این لینک ها رو هم ببینید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Sun, 14 May 2023 13:01:26 +0330</pubDate>
            </item>
                    <item>
                <title>وزارت ارتباطات چقدر برای فیلترینگ هزینه می‌کند؟ محرمانه است!</title>
                <link>https://virgool.io/Iamdeveloper/%D9%88%D8%B2%D8%A7%D8%B1%D8%AA-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7%D8%A7%D8%AA-%DA%86%D9%82%D8%AF%D8%B1-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%81%DB%8C%D9%84%D8%AA%D8%B1%DB%8C%D9%86%DA%AF-%D9%87%D8%B2%DB%8C%D9%86%D9%87-%D9%85%DB%8C-%DA%A9%D9%86%D8%AF-%D9%85%D8%AD%D8%B1%D9%85%D8%A7%D9%86%D9%87-%D8%A7%D8%B3%D8%AA-s9zr7dway7b9</link>
                <description>پنج دی ۹۷ در سامانه‌ی انتشار و دسترسی آزاد اطلاعات از وزارت ارتباطات درخواست کردم بودجه‌ی در نظر گرفته‌شده برای فیلترینگ را از سال ۹۲ تا ۹۷ به تفکیک سال بیان کنند. در نهایت به درهای بسته‌ی فراوان خوردم و جواب‌های متناقضی شنیدم که در این مطلب آنها را می‌خوانید:۸ دی ۹۷ وزارت ارتباطات جواب داد: این سوال در حوزه فعالیت شرکت ارتباطات زیرساخت است. سوال را مفصل‌تر از زیرساخت پرسیدم. شرح درخواستم این بود:«1- در تاریخ 5 دی 97 از وزارت ارتباطات و فناوری اطلاعات پرسیده شد:  لطفا بفرمایید بودجه ی در نظر گرفته شده برای اجرای فیلترینگ اینترنت از سال ۹۲ تا امسال (۹۷) به تفکیک سال چقدر بوده است . این وزارتخانه امروز (مورخ 8 دی 97) پاسخ داد:  سوال مذكور در حوزه فعاليت شركت ارتباطات زيرساخت مباشد  (ش پیگیری 1545838776578). بنابر این طبق اعلام وزارتخانه، این سوال در حوزه فعالیت شرکت ارتباطات زیرساخت هست.2- طبق اعلام جناب آقای سجاد بنابی (عضو هیئت مدیره شرکت ارتباطات زیرساخت) در توئیتر:  ماده 21 قانون جرایم رایانه ای، اجرای فیلترینگ را بر عهده ارائه دهنگان خدمات اینترنتی قرار داده که تامین تجهیزات بر عهده آنهاست و نه وزارت ارتباطات (بند 7 مصوبه 2 جلسه 237 کمیسیون تنظیم مقررات) در دولت های قبل، سرمایه‌گذاری توسط دولت انجام شد. در سالهای 96 و 97 شرکت زیرساخت هیچ هزینه ای نکرده است. بنابراین طبق اعلام ایشان، در دولت های قبل، سرمایه گذاری فیلترینگ توسط دولت انجام می شده است. همچنین از فحوای کلام ایشان این طور برمی آید که در سال 92 تا 95 شرکت زیرساخت در این زمینه هزینه کرده استلطفا با توجه به این دو نکته، پاسخ سوالات زیر را بفرمایید:1- بودجه در نظر گرفته شده برای اجرای فیلترینگ اینترنت و سرمایه گذاری دولت برای فیلترینگ در شرکت ارتباطات زیرساخت (با نام قبلی: شرکت طرح و توسعه شبکه های مخابراتی) از سال 80 (تاریخ ابلاغ سیاست های کلی شبکه های اطلاع رسانی رایانه ای) تا امسال (97) به تفکیک سال چقدر بوده است؟ (به ویژه بودجه سال های 92 تا 95).2- به نظر می رسد فیلترینگ برخی امکانات اینترنتی (مانند تماس صوتی تلگرام) در حیطه اختیارات شرکت ارتباطات زیرساخت باشد. آیا شرکت ارتباطات زیرساخت این موضوع را تایید می کند؟ و در این صورت بودجه هزینه شده برای این گونه فیلترها (به طور مشخص: تماس صوتی تلگرام) چقدر بوده است».پاسخ وزارت ارتباطات به درخواست ارائه ی بودجه ی فیلترینگ: از زیرساخت بپرسیدبعد دیدم که در تاریخ های 12 و 18 دی 97 دو درخواست دیگر نیز در همین باره در سایت انتشار و دسترسی آزاد به اطلاعات از شرکت ارتباطات زیرساخت شده است.سوالاتی که دیگران در سامانه ی انتشار و دسترسی آزاد به اطلاعات از شرکت ارتباطات زیرساخت درباره ی بودجه ی فیلترینگ پرسیده اند.سوالاتی که دیگران در سامانه ی انتشار و دسترسی آزاد به اطلاعات از شرکت ارتباطات زیرساخت درباره ی بودجه ی فیلترینگ پرسیده اند.
18 دی 97 شرکت ارتباطات زیرساخت پاسخ داد: «بودجه هاي مزبور در سوال جنابعالي محرمانه مي باشد».پاسخ اولیه ی شرکت ارتباطات زیرساخت به درخواست ارائه ی بودجه ی فیلترینگ: محرمانه استهمان روز این شکایت را ثبت کردم:«1- طبق ماده 3 آیین نامه طرز نگاهداری اسناد سری (مصوب 1 دی 54) طبقه هر سند را مسئول واحد تهیه کننده سند مشخص می کند و موافقت رئیس سازمان یا مقام مادون او را نیز نیاز دارد. همچنین طبق مواد 13 تا 17 قانون انتشار و دسترسی آزاد به اطلاعات تقسیم بندی علل عدم انتشار اطلاعات مشخص شده است. لطفا با توجه به این قوانین بفرمایید که این اسناد بر چه اساسی و دقیقا بر اساس کدام ماده از قانون انتشار و دسترسی آزاد به اطلاعات طبقه بندی محرمانه پیدا کرده اند.2- مطابق با ماده 11 قانون انتشار و دسترسی آزاد به اطلاعات، تصمیمی که موجد حق یا تکلیف عمومی است قابل طبقه بندی به عنوان اسرار دولتی نیست و انتشار آن الزامی است. با توجه به تاثیر بودجه در زندگی عموم مردم، بر چه مبنایی این اطلاعات محرمان قلمداد شده است؟3- همچنین طبق ماده 57 قانون محاسبات عمومی  منظور کردن اعتبار تحت عنوان ( سری) در بودجه کل کشور جز در مورد وزارت اطلاعات و دستگاههای نظامی و انتظامی ممنوع است .4- همچنین طبق اصل 55 قانون اساسی جمهوری اسلامی ایران  دیوان محاسبات به کلیه حسابهای وزارتخانه ها، مؤسسات، شرکتهای دولتی و سایر دستگاه هایی که به نحوی از انحاء از بودجه کل کشور استفاده می کنند به ترتیبی که قانون مقرر می دارد رسیدگی یا حسابرسی می نماید که هیچ هزینه ای از اعتبارات مصوب تجاوز نکرده و هر وجهی در محل خود به مصرف رسیده باشد. دیوان محاسبات، حسابها و اسناد و مدارک مربوطه را برابر قانون جمع آوری و گزارش تفریغ بودجه هر سال را به انضمام نظرات خود به مجلس شورای اسلامی تسلیم می نماید. این گزارش باید در دسترس عموم گذاشته شود.حال شرکت محترم ارتباطات زیرساخت باید پاسخ دهد که بر چه مبنایی بودجه ی خود را محرمانه تلقی می کند؟»31 اردیبهشت 98 شرکت ارتباطات زیرساخت پاسخ داد: «شركت ارتباطات زيرساخت طي سالهاي 96 و 97 هيچ گونه سرمايه گزاري در موضوع فيلترينگ انجام نداده است. اطلاعات هزينه هاي ساير دستگاههاي كشور و بخش خصوصي در اختيار اين شركت نمي باشد. لذا اجراي پروژه هاي مربوط به سالهاي گذشته توسط ايشان صورت گرفته است».پاسخ شرکت ارتباطات زیرساخت به شکایتم نسبت به محرمانه تلقی کردن بودجه ی فیلترینگهمزمان از طریق سازمان بازرسی وزارت ارتباطات و سازمان بازرسی کل کشور نیز پیگیری می‌کردم.20 فروردین 98 سازمان بازرسی کل کشور نوشت: درخواست شما «توسط سازمان مورد بازرسی قرار خواهدگرفت». اما در همین مرحله متوقف شد و پاسخ دیگری نداد.نتیجه ی پرونده ی اول شکایت از عدم پاسخگویی شرکت ارتباطات زیرساخت در سازمان بازرسی کل کشور سه سال بعد در 1 مرداد 1401 باز هم درخواستم را در سایت سازمان بازرسی کل کشور مطرح کردم. این بار سه روز بعد (4 مرداد 1401) پاسخ دادند: «با توجه به محرمانه بودن گزارش از انتشار آن اقدامی ندارد».نتیجه ی پرونده ی دوم شکایت از عدم پاسخگویی شرکت ارتباطات زیرساخت در سازمان بازرسی کل کشورنتیجه‌ی پیگیری‌ام از سازمان بازرسی وزارت ارتباطات هم به جایی نرسید. گفتند بررسی کرده‌ایم و شرکت ارتباطات زیرساخت در سامانه‌ی انتشار و دسترسی آزاد به اطلاعات پاسخ شما را داده‌اند.پاسخ سازمان بازرسی وزارت ارتباطاتنتیجهنتیجه‌ی سه سال و نیم پیگیری من برای دریافت هزینه‌ای که دولت برای فیلترینگ می‌کند تاکنون به هیچ جا نرسیده است. گاهی می‌گویند هیچ هزینه‌ای نکرده‌ایم و گاهی می‌گویند محرمانه است.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Tue, 26 Jul 2022 13:19:03 +0430</pubDate>
            </item>
                    <item>
                <title>درباره‌ی هک سامانه‌های شهرداری تهران</title>
                <link>https://virgool.io/Iamdeveloper/%D8%AF%D8%B1%D8%A8%D8%A7%D8%B1%D9%87-%DB%8C-%D9%87%DA%A9-%D8%B3%D8%A7%D9%85%D8%A7%D9%86%D9%87-%D9%87%D8%A7%DB%8C-%D8%B4%D9%87%D8%B1%D8%AF%D8%A7%D8%B1%DB%8C-%D8%AA%D9%87%D8%B1%D8%A7%D9%86-qokk6d1f4dhu</link>
                <description>۱۲ خرداد ۱۴۰۱ گروهی به نام «قیام تا سرنگونی» اعلام کرد که موفق شده به سیستم های رایانه ای شهرداری تهران نفوذ کند. آنها ادعا کردند ابعاد این نفوذ به این شرح بوده است:از دسترس خارج شدن دوربینهای مراقبتی «مرقد امام خمینی»/ بهشت زهرا/ خیابانها و بزرگراههای تهراناز دسترس خارج کردن اتوماسیون داخلی شهرداریارسال پیامک ضد رهبران جمهوری اسلامی و درود بر رهبر منافقین (مجاهدین خلق) به بیش از ۵۰۰ هزار نفر از مردم تهراننفوذ به دوربین های  پلاک خوانهمچنین این گروه این اطلاعات را در قالب فیلم منتشر کرد:لیست سرورهای شهرداری تهران: این فهرست شامل ۲۱۸۵ ردیف بود. در هر ردیف نام پشتیبان سرویس، پشتیبان عملیات، نقش سرور، معاونت بهره بردار، آدرس آی پی، سیستم عامل و نام CI وجود دارد. فیلم دیگری نیز با عنوان «مشخصات فنی ۲۱۸۰ سرور شهرداری» منتشر شده که همین عناوین را دارد و شاید اطلاعاتش تکراری باشد.بخشی از فیلمی که گروه هکری به عنوان «لیست سرورهای شهرداری تهران» منتشر کرده استمشخصات ۱۷۰ دوربین: جدولی که در این فیلم نشان داده می شود نیز مانند فیلم قبلی است. بخشی از مشخصاتی که گروه هکری از «سرورهای کنترلی دوربین ها» منتشر کرده است.لیست و مشخصات ۱۳۷۶ دوربین نظارتی که در بزرگراهها استفاده می‌شوند: در این فیلم برای هر دوربین شماره ی دستگاه، شماره ی جاده، کد، نام دوربین، آی پی، طول و عرض جغرافیایی، کد پلیس و اطلاعات دیگری که مشخص نیستند وجود دارد.بخشی از اطلاعاتی که گروه هکری به عنوان فهرست دوربین های نظارتی بزرگراه ها منتشر کرده است.لیست و مشخصات ۳۲۲۲  دوربین مایل استون در  تهران:‌ این جدول برای هر دوربین آی پی سرور مدیریت، آدرس سرور ضبط، آی پی دوربین، مدل دوربین و پسورد دوربین را ذکر کرده است.بخشی از اطلاعاتی که گروه هکری به عنوان مشخصات دوربین های مایل استون تهران منتشر کرده است.گزارش مانیتورینگ ۲۷۳ دوربین در تاریخ ۲۹ اردیبهشت ۱۰۴۱: در این جدول اطلاعاتی مانند نام دستگاه، تاریخ و زمان کنترل، میانگین تردد، تردد ثبت شده امروز، آی پی، کد دستگاه، کد پلیس و نام شرکت وجود دارد.بخشی از اطلاعاتی که گروه هکری به عنوان گزارش مانیتورینگ دوربین منتشر کرده است.لیست و مشخصات ۲۶۹ دوربین کنترلی بهشت زهرا: اطلاعات این جدول نیز مانند جدول قبلی است.لیست کامل دوربینهای بهشت زهرا: این فیلم اسکرین رکوردی از نرم افزار مایل استون است که در سمت چپ آن فهرست دوربین ها قرار دارد.بخشی از فیلمی که گروه هکری با عنوان لیست کامل دوربین های بهشت زهرا منتشر کرده استیکی از تصاویری که گروه هکری جداگانه منتشر کرد: موقعیت دوربین های «مرقد امام خمینی»علاوه بر این ها گروه هکری تصاویری از دوربین های مختلف مراکز شهرداری (مانند «اتاق پشتیبانی فنی» و «اتاق کنترل») و همچنین خیابان های تهران (میدان جمهوری، کارگر- جمهوری، شریعتی- بهار، چمران- فاطمی، بلوار آزادی- توحید، مطهری- مفتح، نواب- هلال احمر و کارگر- کشاورز) را هم منتشر کرده است. تاریخ درج شده روی فیلم های خیابان های تهران 13 آوریل 2022 (24 فروردین 1401) و ساعت آنها بین 6:30 تا 7 صبح است.خبرهای مربوط به نفوذ در خبرگزاری‌های داخل ایرانپنجشنبه ۱۲ خرداد ۱۴۰۱:‌ روابط عمومی سازمان فناوری اطلاعات و ارتباطات (فاوا) شهرداری تهران اعلام کرد که «سامانه داخلی شهرداری تهران» برای دقایقی و به شکل «محدود» مختل شده و به جای آن «تصویری موهن» نمایش داده شده است. اما شهرآرانیوز این اختلال را شامل دوربین های نظارتی و وب سایت شهرداری اعلام کرد.جمعه 13 خرداد 1401: هادی محضرنیا (سرپرست سازمان فاوای شهرداری تهران) گفت: سامانه های نظارتی و خدماتی شهرداری بدون مشکل در حالت خدمت رسانی است. «طبیعتن در دقایقی از روز برخی از سرویس های ما توسط همکاران ما از دسترس خارج شدند و مجددن به چرخه بازگشتند و این روند در چند روز آینده ممکن است ادامه داشته باشد و تنها دلیلش هم ارتقای سطح امنیتی خدمات به شهروندان هست. خدماتی که شاید در مواجهه با آن ها نیاز هست سطح ارائه ی خدمات را در بالاترین سطح قرار بدهیم خدماتی از جنس دوربین های نظارتی یا خدمات رسانی در حمل و نقل همگانی و عمومی مثل مترو و اتوبوس یا سرویس هایی که مربوط به فروشگاه های مرتبط با شهرداری هست. همه ی این خدمات الان برقرار هستند و در این سطح از ارائه ی خدمات هیچ مشکلی وجود ندارد».شنبه ۱۴ خرداد ۱۴۰۱: سایت شهرداری تهران همچنان غیرفعال است. سید احمد علوی عضو شورای شهر تهران گفت سایت از روز دوشنبه شروع به کار می کند و شهرداری تهران «خط مقدم حمله دشمنان انقلاب» است. محمود کبیری معاون ارتباطات و امور بین الملل شورای شهر تهران نیز در توییتر از «دشمنان قسم خورده مدیریت شهری ششم» نوشت و حمله ی سایبری را کار آنها دانست. مهیار زاهد روزنامه نگار همشهری این هک را چندان پراهمیت ندانسته و نوشته است: «یک جوری نوشته، فیلم‌های تسخیر دوربین‌های بهشت‌زهرا، بزرگ‌راه و... انگار جنگ بوده ریختن زدن و گرفتن.  بابا نهایتا سامانه شهرداری رو هک کردی که اونم کارکنانش همین مردم هستن از فضا که نیومدن. نظامی هم نیستن».تاثیر هک بر مردماحمد صادقی (رئیس کمیته شفافیت و شهر هوشمند شورای اسلامی شهر تهران) 12 خرداد 1401 گفت این اختلال «در کیفیت زندگی مردم پایتخت تاثیر مستقیم دارد». آقای خلیلی پور 14 خرداد در توییتر نوشته است: «امروز صبح زنگ زدم ۱۳۷ برای یک مورد اطلاع رسانی کنم، گفتند سیستم های شهرداری هک شده اند و باید کلا برنامه های سیستمون از نو نوشته بشه و زمان زیادی میبره. بعد به سایت تهران من و کنترل کیفیت هوای تهران سر زدم فهمیدم که بله!». فرشته صادقی (خبرنگار) نیز نوشته است: «کارگاه ساختمان کناری از صبح اول وقت داشت داربست ساختمانی باز می کرد و از بالای برج می انداخت پایین. زنگ زدم ۱۳۷ شهرداری که مگر روز تعطیل  کار کردن ممنوع نیست؟ اپراتور شهرداری می گوید سیستم قطع است، ۲ ساعت دیگر زنگ بزن شکایت کن». کاربری این پاسخ اپراتور را در رابطه با هک شدن سیستم شهرداری دانسته است.احتمال‌های فنی مرتبط با هککاربری به نام «خان» در توییتر نوشته است:«زمانی که در سازمان فناوری اطلاعات شهرداری تهران بودم همیشه هشدار میدادم که استفاده از سیستم DotNetNuke بر بستر ویندوز هرگز امن نیست در هر نوبت بروزرسانی DNN با توجه به آشنایی که به مبحث امنیت داشتم پن تست انجام میدادم و گزارش رو به مسئول مربوطه اعلام می‌کردم اما درکمال تعجب با خنده عزیزان مواجه میشدم! و هربار همین وضع ادامه داشت.یک بار هم در زمان فعالیتم در سازمان هک محدود رخ داد که در اون زمان اومدن و از من خواستن تا نتایج بررسیم‌هام رو اعلام کنم تا جلوی تکرار هک گرفته بشه. البته اون حرکت هم نمایشی و با بستن چند مجوز دسترسی قضیه جمع شد. این اتفاقات در زمان آقای قائمی و شهرداری قالیباف رخ داد در زمان آقای محمود فرجود [1396 تا 1400] رویکرد مناسبی نسبت به کوچ از سرورهای ویندوز به سرورهای لینوکس صورت گرفت اما حجم سرور‌های سازمان و خدماتش به حدی بود که بطور کامل انجام نشد.البته این هک که انجام شده به احتمال زیاد توسط یک شل زیرو دی انجام شده که از حد توانایی‌های سازمان منافقین خارجه و به احتمال زیاد توسط اسرائیل انجام شده. هرچند که بررسی‌ها باید انجام بشه تا مشخص بشه که ایا عوامل داخلی بصورت لوکال در این هک نقش داشتن یا نه!فقط افسوس می خورم که اون زمان چقدر هشدار دادم.التماس کردم که فکری بحال سیستم نا امن بکنید ولی کسی جدی نگرفت! منفعت مدیران سازمان در شرکت‌های صوری ای بود که ایجاد کرده بودند.خودشون مزایده برگزار میکردند و خودشون هم شرکت‌های خودشون رو برنده اعلام میکردند. چندین باز گزارش این تخلفات رو به سازمان بازرسی شهرداری تهران گزارش کردم اما دریغ از یکبار توجه.این هک رو هم به گردن کسی نمیشه انداخت چون سالهاست این سیستم در گیر رانت هستش.زانتی که مانع بروز رسانی سیستم شهرداری و کوچ اون از سیستم مزخرف DNN میشد. من این هک رو دقیقا مثل فاجعه متروپل می‌بینم. فاجعه ای که از سال ها پیش قابل پیش بینی بود وکسی به هشدارهای افرادی مثل من توجه نکرده بود. ایمیل های من به آقای فرجود همگی موجود هستند که بارها به ایشون از بابت وجود مشکلات در سیستم رانتی سازمان فناوری اطلاعات شهرداری تهران هشدار دادم».</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Sat, 04 Jun 2022 19:31:23 +0430</pubDate>
            </item>
                    <item>
                <title>این نقاشی‌ها را هوش مصنوعی کشیده است</title>
                <link>https://virgool.io/Iamdeveloper/%D8%A7%DB%8C%D9%86-%D9%86%D9%82%D8%A7%D8%B4%DB%8C-%D9%87%D8%A7-%D8%B1%D8%A7-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%DA%A9%D8%B4%DB%8C%D8%AF%D9%87-%D8%A7%D8%B3%D8%AA-g32yx3fezz5o</link>
                <description>سم آلتمن (مدیرعامل شرکت OpenAI) چند روز پیش توئیتی هیجان‌انگیز برای تبلیغ سرویس جدید شرکتش کرد: هرکس دوست دارد یک جمله بنویسد و من آن را عینن به موتور هوش مصنوعی DALL.E 2 می دهم تا از آن جمله یک نقاشی بکشد. بعضی نتایج را در این مطلب با هم می‌بینیم.کار شرکت Open AI چیست؟شرکت Open AI شرکتی تحقیقاتی در آمریکا برای ارائه ی خدمات هوش مصنوعی است که با هدف ارائه ی این خدمات به همه ی افراد تاسیس شده است. بعضی از پروژه های مشهوری که از خدمات این شرکت استفاده می‌کنند گیتهاب (در پروژه‌ی Copilot که پروژه‌ای برای تولید کد بر اساس توضیحات متنی است) و Duolingo (برای تصحیح غلطهای دستورزبانی فرانسوی‌آموزان) هستند. بعضی امکانات جالب این شرکت این ها هستند:تولید متن بر اساس توضیح متنیخلاصه سازی متنمرتب سازی متنطبقه بندی نکات متنترجمه ی مبتنی بر هوش مصنوعیتولید کد برنامه نویسی بر اساس توضیح متنیپروژه‌ی DALL.E 2 چیست؟پروژه‌ی جدید شرکت Open AI پروژه‌ای برای کار با تصاویر است. در این پروژه می‌توان به موتور برنامه توضیحی متنی ارائه داد تا یک تصویر خلق کند. همچنین می‌توان تصاویر را با دقت بالایی ویرایش کرد. مثلن یکی از عناصر تصویر را حذف کرد. یا می‌توان تصویری را به برنامه ارائه داد تا تصاویر مشابه آن را تولید کند (مثلن پرتره‌ای مشابه از زوایای دیگر).نمونه ای از عملکرد پروژه ی دال.ای 2: تبدیل متن به تصویرنمونه ای از عملکرد پروژه ی دال.ای 2: تولید تصویری مشابه تصویر ورودیژانویه ی 2021 نسخه‌ی اول این پروژه ارائه شد و ژانویه ی 2022 نسخه‌ی دوم آن. شرکت Open AI می‌گوید نسخه‌ی دوم به مراتب بهتر از نسخه‌ی اول عمل می‌کند.این پروژه هنوز به صورت عمومی عرضه نشده است و در حال تست برای گروهی از کاربران است. سازندگان این پروژه می گویند آن را به شکلی محدود کرده اند که تصاویر آزاردهنده، سیاسی، خشونت آمیز یا مناسب بزرگسالان تولید نکند و همچنین از چهره ی افراد واقعی برای ساخت تصویر استفاده نکند. نقاشی‌های هوش مصنوعیاما برویم سراغ  توئیت سم آلتمن که در واقع هم تبلیغ این پروژه است و هم تست پروژه. این جا چند نمونه از پاسخ‌های او را می‌گذارم. در توئیتر او هم می‌توانید پاسخ‌های بیشتر خودش را بیابید هم تصاویری که در نسخه‌ی اول DALL.E تولید شده و دیگران گذاشته‌اند (و آلتمن ریتوییت کرده است).سم آلتمن در حال نوشیدن یک پینا کولادا در حالی که در حال موج سواری در غروب خورشید در یک efoil (تخته‌ی موج سواری) در سواحل هاوایی استسم آلتمن در حال نوشیدن یک پینا کولادا در حالی که در حال موج سواری در غروب خورشید در یک efoil (تخته‌ی موج سواری) در سواحل هاوایی استمنظره ای با جنگل های استوایی، پنل های خورشیدی، توربین های بادی و شهری آینده نگر در پس زمینهمنظره ای با جنگل های استوایی، پنل های خورشیدی، توربین های بادی و شهری آینده نگر در پس زمینهگربه دانا در حال مدیتیشن در هیمالیا در جستجوی روشنگریگربه دانا در حال مدیتیشن در هیمالیا در جستجوی روشنگریانسان و هوش مصنوعی عاشق می شوند و فرزندان آینده کهکشان راه شیری را خلق می کنند.انسان و هوش مصنوعی عاشق می شوند و فرزندان آینده کهکشان راه شیری را خلق می کنند.اندرویدها (رباتی با چهره ی انسانی) در رویای گوسفند برقیاندرویدها (رباتی با چهره ی انسانی) در رویای گوسفند برقیانسانی که در آفتاب مدینه فاضله «هوش جامع مصنوعی» غرق می شود.انسانی که در آفتاب مدینه فاضله «هوش جامع مصنوعی» غرق می شوددرخت بزرگ زندگی که انسان‌ها و حیوانات برگ های آن هستند.درخت بزرگ زندگی که انسان‌ها و حیوانات برگ های آن هستند.نقاشی با الهام از هنر بنکسی که تعامل انسان و ماشین را نشان می دهد.نقاشی با الهام از هنر بنکسی که تعامل انسان و ماشین را نشان می دهد.شومینه‌ای گرم در بالای ساختمانی، در شهری آخرالزمانی، به سبک استیمپانک (سبکی در ادبیات گمانه‌زن).شومینه‌ای گرم در بالای ساختمانی، در شهری آخرالزمانی، به سبک استیمپانک (سبکی در ادبیات گمانه‌زن).کارآگاه خرگوشی که روی نیمکت پارک نشسته و در محیطی ویکتوریایی مشغول خواندن روزنامه است.کارآگاه خرگوشی که روی نیمکت پارک نشسته و در محیطی ویکتوریایی مشغول خواندن روزنامه استمهمانی چایی فیل‌ها در چمنزار.مهمانی چایی فیل‌ها در چمنزارجمع‌بندیشرکت OpenAI شرکتی برای ارائه ی خدمات مبتنی بر هوش مصنوعی است. یکی از پروژه‌های این شرکت دال.ای 2 نام دارد که کار آن تبدیل توضیحات متنی به عکس یا ویرایش عکس بر اساس توضیحات متنی است. مدیرعامل شرکت در توئیتر برای تبلیغ و تست این پروژه، از کاربران خواست توضیحی بنویسند تا او آن توضیح را با این پروژه به نقاشی تبدیل کند. در این مطلب چند نمونه از این نقاشی ها را دیدیم.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Sun, 10 Apr 2022 01:54:30 +0430</pubDate>
            </item>
                    <item>
                <title>سه روش اضافه کردن TailwindCSS به پروژه</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B3%D9%87-%D8%B1%D9%88%D8%B4-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-tailwindcss-%D8%A8%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-qqs9et7fxa3f</link>
                <description>خلاصه: TailwindCSS یک فریم ورک CSSی است. ایده ی اصلی تیلویند، اضافه کردن ساده ی استایل‌ها به پروژه های وب است. من امروز شروع به یادگیری Tailwind با مجموعه ویدئوی Tailwind CSS: From Zero to Production در کانال یوتوب این مجموعه کردم: Tailwind Labs. این نوشته بر اساس ویدئوی دوم (01) این مجموعه است. این نوشته را بیشتر برای یادآوری خودم نوشتم. وگرنه شما به راحتی با مراجعه به این ویدئو یا صفحه ی «نصب» در مستندات تیلویند می توانید این روش ها را به شکلی مفصل تر یاد بگیرید. https://youtu.be/qYgogv4R8zg سه روش اصلی اضافه کردن TailwindCSS به پروژه این هاست:اضافه کردن مستقیم با CDNاضافه کردن با CLIنصب به عنوان افزونه ی PostCSSاضافه کردن مستقیم با CDNاز آسان ترین روش شروع می کنیم. در این روش که همان روش سنتی اضافه کردن فایل CSS به پروژه است، بدون دانلود تیلویند، آن را با نوشتن کد زیر در بخش head صفحه ی خود، می افزاییم (چون در آینده ممکن است محتوای این فایل تغییر کند یا نسخه های دیگری برای تیلویند عرضه شود، بهتر است آخرین لینک را از بخش مربوطه در مستندات تیلویند بگیرید):&lt;link href=&amp;quothttps://unpkg.com/tailwindcss@^2/dist/tailwind.min.css&amp;quot rel=&amp;quotstylesheet&amp;quot&gt;پروژه ی اصلی ما (index.html)، یک کد ساده ی html است (که من با نوشتن html:5 و سپس h1 با کمک emmet در visual studio آن را درست کرده ام):کد پروژه ی اصلیبعد از نوشتن این کد، با باز کردن فایل اصلی خود در مرورگر با چنین صفحه ای روبرو می شویم:صفحه ی اصلی پروژه قبل از افزودن تیلویندحالا تیلویند را به پروژه می افزاییم:کد پروژه ی اصلی بعد از افزودن تیلوینداگر حالا صفحه ی خود را در مرورگر رفرش کنیم، این تصویر را می بینیم:صفحه ی اصلی پروژه بعد از افزودن تیلویندبه نظر می رسد تیلویند کار را بدتر کرده است. نه؟ در واقع تیلویند همه ی استایل های پیش فرض را حذف می کند تا برنامه نویس بتواند کامل بر شرایط مسلط شود.حالا چند کلاس ساده ی تیلویندی به عنوان خود اضافه می کنیم:&lt;h1 class=&amp;quottext-4xl font-bold text-blue-500 text-center&amp;quot&gt;
    Hello World
&lt;/h1&gt;حالا صفحه ی ما به این شکل در می آید:صفحه ی اصلی بعد از اضافه کردن چند کلاس ساده ی تیلویندیمی بینید که کد چقدر خوانا است و شرایط هم تحت کنترل ماست (استایل های پیش فرض بر کار ما تاثیر نگذاشته است).اما استفاده از این روش، چند مشکل دارد. از جمله این که نمی توان قالب های پیش فرض تیلویند را شخصی سازی کرد، نمی توان استایل های استفاده نشده را حذف کرد و از امکانات دیگر تیلویند هم نمی توان استفاده کرد.اضافه کردن با CLIراهکار دوم، اضافه کردن تیلویند با CLI است. برای این کار نیاز است که npm را نصب داشته باشید. ابتدا در صفحه ی اصلی پروژه ی خود، یک فایل مرجع می سازیم. مثلن: css/tailwind.css و در این فایل این خطوط را می نویسیم:.hello {
color: blue;
}

@tailwind base;
@tailwind components;
@tailwind utilities;به جز سه خط اول که می دانیم کدهای CSS هستند، سه خط بعدی چه هستند؟ سه خط بعدی به فرمانی که در ادامه می نویسیم کمک می کند که فایل tailwind مد نظر ما را به درستی بسازد. ما با این سه خط گفته ایم که کلاس های پایه ای تیلویند را اضافه کن، بعد کامپوننت ها و بعد هم ابزارها را. کلاس های پایه ای همان کلاس هایی هستند که استایل های پیش فرض را خنثا می کنند و برای مثال در بخش قبلی باعث شدند h1 ما بدون هیچ استایلی به نمایش درآید. کامپوننت ها کلاس هایی مانند container هستند که در فریم ورک ها و کتابخانه های دیگر CSS نیز وجود دارند و قالب های کلی را می سازند. utility ها هم همان ابزارهایی هستند که قرار است خوانایی را به تیلویند اضافه کنند. مثل همان کلاس هایی که در بخش قبل به اچ1 اضافه کردیم و یک کد خوانا تولید کردیم.اما چرا سه خط اول را اضافه کردیم؟ برای این که بهتر متوجه چگونگی خروجی گرفتن در تیلویند با CLI شویم. سه خط بالا چون کد CSS هستند، به همین شکل در خروجی ما ظاهر خواهند شد.بعد از ساخت فایل بالا، باید این دستور را در ترمینال (در پوشه ی پروژه ی خود) اجرا کنیم:npx tailwindcss -i .\css\tailwind.css -o .\build\tailwind.cssدر بخش اول با سوئیچ i ورودی (همان فایل شش خطی که ساختیم) و در بخش دوم با سوئیچ o خروجی را (فایلی که قرار است برای ما ساخته شود) مشخص کرده ایم. با اجرای این دستور، فایل خروجی ساخته می شود.بخشی از فرایند خروجی گرفتن فایل تیلویند با استفاده از CLIبعد از اتمام کار، ما چنین ساختار در پروژه ی خود خواهیم داشت:ساختار پروژه بعد از ساخت فایل خروجیحالا اگر به فایل خروجی سر بزنیم، می بینیم که سه خط اول فایل ورودی، عینن در خروجی نوشته شده و بعد کلاس های تیلویند اضافه شده اند.کدهای ابتدای فایل خروجی تیلویندمشخص است که ما در پروژه ی واقعی خود نمی خواهیم از یک فایل 188 هزار خطی با حجم 3 مگابایت استفاده کنیم. به دو دلیل ساده: اول این که بسیاری از این خطوط به درد ما نمی خورند (ما از تعداد کمی از کلاس های تیلویند استفاده می کنیم) و دوم این که انی حجم از فایل، لود پروژه ی ما را بسیار کند و سخت می کند.نصب به عنوان افزونه ی PostCSSاما برویم سراغ روشی که در پروژه های واقعی (پروداکت) از آن استفاده می شود. اگر به صفحه ی نصب در مستندات تیلویند رفته باشید، می بینید که این روش در ابتدای این بخش نوشته شده است. در این صفحه راهنمای نصب تیلویند در فریم‌ورک‌ها و ابزارهای مرسومی مانند لاراول، ویو و ری اکت هم گفته شده است. این ابزارها هم در پس زمینه از PostCSS استفاده می کنند. ابزاری که باعث اتومات شدن رویه های CSS می شود.در این آموزش، از یک ابزار ساخت فرانت اندی به نام Vite استفاده می شود. این ابزار از index.html به عنوان نقطه شروع استفاده می کند، تیلویند را از طریق PostCSS اجرا می کند و یک سرور dev به ما می دهد که با هر بار تغییر در کد خود، تغییرات بدون نیاز به رفرش در صفحه ی پروژه (در مرورگر) ظاهر می شوند.برای کار با این روش، ابتدا لازم است یک فایل package.json بسازیم. اگر پیش از این با فریم ورک های فرانت اندی (مثل ری اکت یا ویو) کار کرده باشید می دانید که این فایل، راهنمای پروژه های Node است و در آن اطلاعاتی درباره ی پروژه (مانند نام، نسخه، توضیح، نویسنده و مجوز استفاده)، اسکریپت هایی که می خواهیم در پروژه ران کنیم و همچنین پکیج هایی که در پروژه نصب شده اند ارائه می شود. ساخت این فایل با اجرای دستور زیر امکان پذیر است:npm init -yبعد از ساخت فایل، سراغ نصب پکیج های لازم می رویم:npm install -D tailwindcss postcss autoprefixer viteبعد از نصب موفق این پکیج ها، ساختار پروژه ی ما چنین شکلی شده است:ساختار پروژه بعد از نصب پکیج های لازماگر فایل package.json را هم باز کنید، تغییراتی در این فایل می بینید. ما در این فایل هم تغییراتی را اعمال می کنیم که محیط کار خود را بهتر کنیم. در بخش scriptها به جای test می نویسیم dev و به جای متن دستور می نویسیم vite. به این ترتیب، شرایط را برای اجرای سرور dev فراهم کرده ایم. تغییر لازم در فایل package.jsonدر مرحله ی بعد تنظیمات اولیه ی تیلویند و PostCSS را با اجرای دستور زیر انجام می دهیم:npx tailwindcss init -pسوئیچ p در آخر این فایل برای ساخت فایل تنظیمات PostCSS است. بعد از اجرای این دستور، دو فایل جدید به پروژه ی ما اضافه می شود: tailwind.config.js و postcss.config.js. ساختارر پروژه بعد از اجرای دستور تنظیمات اولیه تیلویند و postCSSدر تنظیمات اولیه ی PostCSS گفته شده که از چه افزونه هایی در این ابزار استفاده شود. با تنظیمات اولیه ی تیلویند در ادامه ی این مجموعه ی آموزشی آشنا می شویم (منظورم مجموعه ی آموزشی یوتوبی است که در ابتدای نوشته گفتم. اگر خودم هم این مجموعه را ادامه دادم که همین جا می توانید بخوانید).حالا دیگر می توانیم پوشه ی build را پاک کنیم و در فایل اصلی خود (ایندکس) هم به css اصلی (css/tailwind.css) لینک بدهیم.فایل اصلی پروژه بعد از تغییر لینک تیلویندساختار پروژه بعد از پاک کردن پوشه ی بیبدحالا برای اجرای پروژه ی خود دیگر نباید مستقیم فایل index.html را باز کنیم. بلکه باید سرور dev خود را اجرا کنیم. برای این کار این دستور را در ترمینال می نویسیم:npm run devبا اجرای این دستور، یک پورت در لوکال هاست برای پروژه ی ما در نظر گرفته می شود. مثلن پورت 3000. با باز کردن این پورت (localhost:3000) در مرورگر، پروژه ی خود را مشاهده می کنیم.ترمینال بعد از اجرای دستور ران شدن سرورحالا می توانید ببینید که با هر تغییر در فایل اصلی و ذخیره ی فایل، تغییرات بدون نیاز به رفرش کردن در مرورگر ظاهر می شوند.خلاصهدر این آموزش درباره ی سه روش اضافه کردن فریم ورک تیلویند (که یک فریم ورک برای خوانایی و سرعت بالای نوشتن استایل های CSS است) به پروژه ی تحت وب خود صحبت کردیم. درروش اول با CDN تیلویند، این کار را کردیم. سپس با کمک CLI و در نهایت با کمک PostCSS.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Fri, 12 Nov 2021 21:16:59 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی دسترسی‌پذیری وبسایت</title>
                <link>https://virgool.io/Iamdeveloper/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D9%BE%D8%B0%DB%8C%D8%B1%DB%8C-%D9%88%D8%A8%D8%B3%D8%A7%DB%8C%D8%AA-lwfilvymawv2</link>
                <description>افراد زیادی در جهان هستند که مثل اکثریت مردم نمی توانند به کامپیوتر دسترسی پیدا کنند. افراد ناتوانی که مشکلات شنوایی، بینایی، حرکتی یا شناختی دارند. تخمین زده شده که حدود 200 میلیون نفر در جهان مشکلات شناختی داشته باشند. همچنین گفته می شود بین 650 میلیون تا یک میلیارد نفر در جهان یکی از انواع معلولیت‌ها را دارند (همه ی این افراد لزومن مشکلی در استفاده از کامپیوتر ندارند).یک دستگاه اسکرین ریدر: Screen Reader- عکس از Unsplash (Sigmund)متاسفانه بسیاری از این افراد معلول، امکان استفاده ی راحت از اینترنت را ندارند. امری که باعث می شود درصد کمتری از این افراد (نسبت به افراد سالم) به استفاده از اینترنت روی بیاورند (در سال 2017 در اروپا 73 درصد افراد سالم گفته‌اند به اینترنت پرسرعت دسترسی دارند اما در مقابل 52 درصد از افراد معلول این دسترسی را داشته‌اند. همچنین در گزارشی که سال 2021 از آمریکا منتشر شد، نشان داده شد که 26 درصد افراد معلول به اینترنت پرسرعت دسترسی دارند. در مقابل 44 درصد افراد سالم این دسترسی را داشته اند).اما اکنون دسترسی به اینترنت برای بسیاری از کارها ضروری شده است. کارهای اداری، سفارش غذا و ماشین، خواندن کتاب و اخبار و... اهمیت امکان استفاده از اینترنت برای همه ی افراد، هر روز بیش از دیروز می شود.یکی از راه هایی که همه ی افراد دخیل در وبسایت ها (اعم از توسعه دهنده ها، طراحان رابط و تجربه ی کاربری، مدیران و...) برای کمک به افراد ناتوان می توانند انجام دهند، رعایت استانداردهای دسترسی پذیری وبسایت است.خوب است که طراحان وبسایت (به ویژه توسعه دهنده های فرانت اند) دوره ی کوتاه «دسترسی پذیری» در Free Code Camp را بگذرانند و با مبانی این مسئله آشنا شوند. همچنین خوب است که وبسایت خود را از نظر سطح دسترسی‌پذیری بررسی کنیم. یکی از سایت های خوب برای چنین کاری، سایت WAVE است. در این سایت، با نوشتن یک آدرس اینترنتی، برخی نکات مهم در زمینه ی دسترسی پذیری را می توانید ببینید. مثلن در تصویر زیر، بررسی بخشی از وبسایت اسنپ فود را می بینید.بررسی بخشی از صفحه ی اصلی وبسایت اسنپ فود از نظر سطح دسترسی پذیریدر واقع در زمان طراحی وبسایت باید به این نکته توجه کنیم که تنها مخاطبان وبسایت ما، افراد سالم نیستند. خالی گذاشتن متن یک لینک (لینک کردن تصویر) باعث می شود افراد نابینا که برای دسترسی به وبسایت ما متکی به Screenreader هستند نتوانند به درستی با وبسایت کار کنند. رعایت نکردن استاندارد کانترست رنگ تصویر یا متن نسبت به رنگ بکگراند باعث می شود افرادی که مشکلاتی در تشخیص رنگ دارند، محتوای وبسایت ما را به درستی نبینند. ننوشتن کپشن و زیرنویس برای ویدئوها و صداهای وبسایت باعث ایجاد مشکل برای افراد ناشنوا می شود و...برخی از فریم ورک های css (مانند بوت استرپ و Tailwind) کلاس های خاص صفحه خوان ها را دارند (sr-only). استفاده از این کلاس ها باعث می شود محتوای نوشته شده در وبسایت نمایش داده نشود اما امکان استفاده ی افراد متکی به اسکرین ریدرها هم فراهم شود. ابزارهای دیگری هم برای بررسی دسترسی پذیری وجود دارند (مانند ابزار تشخیص کانترست مناسب بین رنگ ها یا ابزار شبیه سازی نمایش عکس برای کوررنگ ها).شما هم اگر ابزار یا راهکار دیگری می شناسید معرفی کنید.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Tue, 02 Nov 2021 11:09:32 +0330</pubDate>
            </item>
                    <item>
                <title>چطور فهرست سطح‌بندی‌شده‌ی واژه‌های ضروری انگلیسی را استخراج کردم؟</title>
                <link>https://virgool.io/Iamdeveloper/%DA%86%D8%B7%D9%88%D8%B1-%D9%81%D9%87%D8%B1%D8%B3%D8%AA-%D8%B3%D8%B7%D8%AD-%D8%A8%D9%86%D8%AF%DB%8C-%D8%B4%D8%AF%D9%87-%DB%8C-%D9%88%D8%A7%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D8%B6%D8%B1%D9%88%D8%B1%DB%8C-%D8%A7%D9%86%DA%AF%D9%84%DB%8C%D8%B3%DB%8C-%D8%B1%D8%A7-%D8%A7%D8%B3%D8%AA%D8%AE%D8%B1%D8%A7%D8%AC-%DA%A9%D8%B1%D8%AF%D9%85-dezt7cio7peg</link>
                <description>صورت مسئلهآکسفورد یک مجموعه ی 3000 واژه ای و یک مجموعه ای 5000 واژه ای دارد که «هر زبان آموزی باید آنها را بلد باشد». 3000 واژه ی اول مربوط به سطوح A1 تا B1 (از چارچوب مرجع اروپا یا همان CEFR) است و 5000 واژه، علاوه بر داشتن آن 3000 واژه، 2000 واژه ی دیگر هم مربوط به سطوح B2 و C1 دارد. این واژه ها هم شامل پرکاربردترین واژه‌های پیکره ی 2 میلیارد واژه‌ای آکسفورد هستند و هم شامل واژه‌های پرکاربردی که زبان‌آموزان در طول یادگیری زبان معمولن به کار می برند (توضیحات فهرست واژه های آکسفورد).فهرست 3000 واژه ای لانگمن هم مجموعه ای از واژه های پرکاربرد زبان انگلیسی است که از یک پیکره ی 390 میلیون واژه ای استخراج شده و 86 درصد زبان را پوشش می دهند. یعنی اگر کسی این 3000 واژه را بداند، می‌تواند 86 درصد واژه‌های متن‌ها و صحبت‌های انگلیسی را بفهمد (فایل پی دی اف توضیحات واژه‌های لانگمن).اما این واژه‌ها به ترتیب حروف الفبا مرتب شده اند. من برای یادگرفتن این واژه‌ها دنبال سطح هر واژه، تعریف آنها و مثال هایشان بودم تا بتوانم به مرور همه ی این واژه ها را یاد بگیرم.در آکسفورد و لانگمن، سطح هر واژه مشخص نشده است. برای همین از دیکشنری کمبریج استفاده کردم. در این واژه نامه، بعضی واژه ها سطح بندی شده اند و سطح آنها در کنارشان نوشته شده است (این سطح‌بندی لزومن با سطح بندی آکسفورد یکسان نیست).تعریف وازه ی defeat در دیکشنری کمبریج. سطح این واژه (B1) هم مشخص شده است.مراحل کارحالا که منابع مورد نیاز فراهم بود، باید به این ترتیب عمل می کردم:1- فهرست واژه های آکسفورد و لانگمن را استخراج می کردم.2- بین این سه فهرست (3000 واژه ی آکسفورد، 5000 واژه ی آکسفورد و 3000 واژه ی لانگمن) اجتماع می گرفتم.3- واژه های فهرست نهایی را در دیکشنری کمبریج جستجو می کردم و سطح آنها را استخراج می کردم.برای قدم اول از این مخزن استفاده کردم که واژه های این فهرست ها را در فایل تکست قرار داده است.برای قدم دوم، از pivot table اکسل استفاده کردم و با حذف واژه های تکراری به فهرستی شامل 5120 واژه رسیدم.بخشی از واژه های استخراج شده. برای هر واژه، مشخص است که در کدام فهرست ها قرار دارددر نهایت برای قدم سوم، با کمک کتابخانه ی simple_html_dom در php یک خزشگر ساده نوشتم. کار این خزشگر این بود که هر بار یک واژه را از فهرست می خواند، آن را در دیکشنری کمبریج جستجو می کرد و سطح واژه، تعریف واژه و مثال های آن را استخراج می کرد.ini_set (&#039;max_execution_time&#039;, &#039;3000&#039;); //50 minutes
require &#039;simple_html_dom.php&#039;;
$words = file &#40;&amp;quotwords.txt&amp;quot, FILE_IGNORE_NEW_LINES&#41;;
$defs = fopen&#40;&amp;quotdefs.txt&amp;quot,&amp;quotw&amp;quot&#41;;
foreach ( $words as $word ) {	
	$html = file_get_html(&amp;quothttps://dictionary.cambridge.org/dictionary/english/&amp;quot.$word);
	$line = $word.&amp;quot^&quot;	
	//if the word doesn&#039;t exist.
	if ($html-&gt;find(&amp;quottitle&amp;quot, 0)-&gt;plaintext === &amp;quotCambridge English Dictionary: Meanings &amp;
Definitions&amp;quot) {
		$line .= &amp;quot-^-^-&quot;
	}	
	//if the word exists.
	else {
		//add definition
		$line .= $html-&gt;find(&#039;.def.ddef_d.db&#039;, 0)-&gt;plaintext.=&amp;quot^&quot;		
		//add examples (if exists)
		if ( $html-&gt;find(&#039;.examp.dexamp&#039;, 0) !== null) {
			foreach ($html-&gt;find(&amp;quot.def-block.ddef_block&amp;quot, 0)-&gt;find(&#039;.examp.dexamp&#039;) as $example) {
				$line .= $example-&gt;plaintext.&amp;quot|&quot;
			}
			$line = substr ($line, 0, -1); //remove last &amp;quot|&amp;quot char.
		} else {
			$line.= &amp;quot-&quot;
		}
		$line .= &amp;quot^&quot;		
		//add level (if exists)
		if ($html-&gt;find(&amp;quot.epp-xref.dxref&amp;quot, 0) !== null) {
			$level = $html-&gt;find(&amp;quot.epp-xref.dxref&amp;quot, 0)-&gt;plaintext;
			$line .= $level;
		} else {
			$line .= &amp;quot-&quot;
		}
	}	
	//remove additional whitespaces.
	$line = preg_replace(&#039;/\s+/&#039;, &#039; &#039;, $line);
	fwrite($defs, $line.&amp;quot\n&amp;quot);
	echo $line.&amp;quot\n\n&quot;
}
fclose ($words);
fclose ($defs);نتیجهدر نهایت این آمار به دست آمد:واژه های سطح A1: تعداد 546 واژهواژه های سطح A2: تعداد 675 واژهواژه های سطح B1: تعداد 1080 واژهواژه های سطح B2: تعداد 1305 واژهواژه های سطح C1: تعداد 535 واژهواژه های سطح C2: تعداد 436 واژهواژه هایی که سطح بندی آن ها در کمبریج نبود: تعداد 534 واژهنمودار زیر واژه های سطح بندی شده را به تفکیک منبع فهرست واژه نشان می دهد.با این فهرست چه می شود کرد؟می توان این فهرست را در نرم افزارهای فلش کارت (مانند نرم افزار قوی Anki) وارد کرد و به مرور یاد گرفت.می توان از این فهرست برای تدریس موثرتر زبان انگلیسی استفاده کرد.خود واژه هاسطح A1a, about, above, ad, address, adult, after, afternoon, again, age, all, all right, also, always, an, and, animal, answer, any, anything, apple, april, arm, at, august, baby, bad, bag, ball, banana, band, bank, bar, baseball, basketball, bat, bath, bathroom, be, beach, bean, beard, beautiful, because, bed, bedroom, beer, before, begin, behind, below, best, better, between, big, bike, bird, birthday, biscuit, black, blue, boat, body, book, boot, bored, boring, both, bottom, box, boy, bread, breakfast, brother, brown, bus, business, but, butter, buy, bye, cafe, cake, camera, can, cannot, car, carry, cat, catch, CD, change, cheap, cheese, child, chip, chocolate, choose, city, class, clean, clever, clock, close, closed, clothes, coat, coffee, cold, colour, come, computer, conversation, cook, country, course, cow, cup, dad, dance, date, daughter, day, december, desk, dictionary, die, different, difficult, dinner, do, doctor, dog, dollar, door, draw, dress, drink, drive, driver, DVD, each, ear, early, easy, eat, egg, eight, eighteen, eleven, email, enjoy, evening, every, example, excited, exciting, expensive, eye, face, factory, family, famous, farm, fast, fat, father, favourite, february, feel, fifteen, film, find, fine, finish, first, fish, five, floor, flower, food, foot, football, for, four, fourteen, friday, friend, from, fruit, fun, funny, game, garden, get, girl, give, glass, go, good, good morning, good night, goodbye, grass, green, grey, group, guitar, hair, hand, happy, hat, he, head, hear, hello, help, her, here, hi, him, his, holiday, home, homework, horse, hospital, hot, hotel, hour, house, hungry, husband, I, ice cream, important, in, interesting, internet, into, invite, it, its, jacket, january, jeans, job, juice, july, june, key, kick, kitchen, knife, know, language, late, learn, leave, leg, lesson, letter, life, like, listen, little, long, look, lot, love, lunch, make, man, many, me, meal, meat, meet, message, milk, minute, mobile, mom, monday, money, month, more, morning, mother, mouth, movie, much, mum, museum, music, my, name, near, need, never, new, newspaper, next, nice, night, nine, nineteen, no, noise, nose, not, note, november, now, number, o’clock, o&#x27;clock, october, of, of course, often, oh, OK, old, on, one, only, or, orange, other, our, outside, page, paint, paper, parent, park, party, pay, pen, pencil, people, person, pet, phone, photo, picture, pig, pizza, place, plane, plant, plate, play, player, please, poor, possible, potato, practise, problem, put, question, radio, rain, read, reading, ready, red, refrigerator, remember, rice, ride, right, river, road, room, run, sad, safe, salt, same, sandwich, saturday, say, school, sea, second, see, send, sentence, september, seven, seventeen, she, sheep, shirt, shoe, shop, shopping, short, show, shower, sing, sister, sit, six, sixteen, skirt, slim, slow, small, smoking, snow, some, something, sometimes, son, soup, speak, sport, start, station, stay, stop, street, student, study, sugar, summer, sun, sunday, sweet, swim, table, talk, tall, taxi, tea, teach, television, tell, ten, tennis, test, than, thanks, that, the, their, them, then, there, they, thing, think, thirteen, this, three, thursday, ticket, tired, today, together, toilet, tomato, tomorrow, tonight, too, tooth, town, train, travel, tree, trousers, t-shirt, tuesday, tv, twelve, twenty, two, under, understand, university, until, us, use, vacation, vegetable, very, village, visit, wait, wake, walk, wall, want, warm, wash, watch, water, we, wear, weather, website, wednesday, week, weekend, well, what, when, where, which, white, who, why, wife, wind, window, wine, winter, with, woman, word, work, world, write, wrong, year, yellow, yes, yesterday, you, young, your, cellphone, chair, classroom, credit card, dancing, mobile phone, restaurant, supermarket, teacher, to, waiterسطح A2able, accident, across, actor, actually, add, adventure, advertisement, advice, afraid, afterwards, against, aged, ago, agree, air, airport, album, alcohol, almost, alone, along, already, ambulance, angry, another, any more, anyone, anyway, anywhere, apartment, appointment, around, arrive, art, artist, as, attractive, aunt, autumn, available, away, awful, badly, bake, balloon, battery, become, beginning, believe, belt, beside, bicycle, bill, biology, birth, bit, block, blonde, blood, boil, born, borrow, boss, bottle, bowl, boyfriend, brain, break, bridge, bring, broken, brush, build, building, businessman, busy, by, cabinet, calendar, camping, candy, cap, capital, careful, carefully, carpet, carrot, cartoon, cash, castle, ceiling, cent, centre, century, certainly, channel, chat, check, chef, chemistry, cheque, chicken, church, cigarette, cinema, circle, cleaner, clear, click, closet, cloud, club, colleague, collect, college, comfortable, company, comparative, complete, concert, congratulation, cooker, cookie, cooking, copy, corner, correct, cost, could, countryside, cousin, cover, crazy, cream, cross, crowd, crowded, cry, cupboard, curtain, customer, cut, daily, dancer, danger, dangerous, dark, dead, decide, deep, defence, delay, dentist, department, describe, desert, diary, difference, digital, dirty, discount, discuss, dish, document, double, down, downstairs, downtown, drawer, drawing, dream, dressed, drum, dry, duck, during, each other, earn, easily, east, eighty, electric, electricity, else, empty, end, engine, engineer, enough, enter, entrance, especially, euro, even, ever, everybody, everyone, everything, everywhere, exactly, exam, excellent, except, exercise, exit, explain, extra, fact, fall, fan, fantastic, far, farmer, fashion, few, field, fifth, fifty, file, fill, final, finally, finger, fire, fishing, flight, fly, follow, foreign, forest, fork, forty, fourth, fridge, friendly, front, full, furniture, garage, garlic, gate, geography, gift, girlfriend, glad, glove, goal, gold, golden, golf, gram, grammar, grandad, grandfather, grandma, grandmother, grandpa, grandparent, granny, great, grow, guess, guest, guy, gym, half, hall, handbag, happen, hard, hate, have, headache, health, healthy, heart, heating, heavy, helicopter, hers, herself, hey, high, highway, hill, himself, history, hit, hobby, hockey, hold, honey, hope, horrible, how, hundred, hurry, hurt, ice, idea, if, ill, immediately, improve, include, including, indoor, information, insect, instead, instrument, interested, international, invitation, island, itself, jam, jazz, jewellery, journey, jump, jumper, just, keep, keyboard, kill, kilometre, kind, king, kiss, lake, lamp, large, last, later, latest, laugh, lazy, leather, left, lemon, lend, less, library, licence, lie, line, lion, list, litre, lose, lost, loud, lovely, luck, lucky, lunchtime, machine, magazine, magic, mail, make-up, manager, map, married, match, may, maybe, mean, mechanic, meeting, member, menu, metre, middle, midnight, might, million, mine, mirror, missing, mistake, mix, modern, moment, moon, mosque, most, motorcycle, motorway, mountain, mouse, move, mushroom, musical, must, myself, national, nature, nearly, neck, neighbour, news, ninety, no one, nobody, noisy, noon, normal, north, notebook, nothing, nurse, occupation, ocean, offer, office, once, onion, online, open, opera, order, ours, ourselves, own, pack, pain, painter, painting, pair, pardon, part, passenger, passport, past, path, pepper, per, perfect, perhaps, petrol, photograph, photographer, photography, physics, piano, piece, pilot, pink, plan, plastic, pleasant, pleased, plus, pocket, police, policeman, polite, pop, popular, possibly, post, poster, pound, pray, prefer, prepare, present, president, price, printer, prize, probably, program, programme, pub, pull, pupil, purple, purse, push, quarter, queen, quick, quickly, quiet, race, railway, rat, real, reason, receipt, receive, record, rent, repair, repeat, return, rich, roof, round, rugby, runner, sailing, salad, sauce, sausage, science, screen, seat, secretary, sell, serve, seventy, several, shame, share, sheet, shelf, ship, should, shout, shut, sick, side, silver, simple, singer, singing, sixty, size, skiing, sky, slice, slowly, snake, so, soap, soccer, sock, soft, software, someone, somewhere, song, soon, sorry, sort, sound, south, space, special, spell, spelling, spend, spring, square, staff, stair, stamp, stand, star, steak, steal, still, stomach, storm, story, straight, strange, strong, such, suit, supper, suppose, sure, surprise, surprised, sweater, swimming, team, teenager, telephone, temperature, term, terrible, textbook, thank, theatre, theirs, themselves, thin, third, thirsty, thirty, thousand, through, throw, tidy, till, time, toast, toe, top, tour, tourist, towel, toy, traffic, trip, TRUE, try, tune, twice, type, tyre, umbrella, uncle, unfortunately, unhappy, uniform, unusual, up, upstairs, useful, usual, usually, various, video, visitor, war, way, weekly, west, wet, wheel, while, whilst, whole, wide, will, win, windy, winner, without, wonderful, wood, wooden, wool, worker, worried, worry, worse, worst, wow, yeah, yet, yours, yourself, zero, blanket, centimetre, clearly, download, elephant, elevator, envelope, laptop, mathematics, monkey, post office, somebody, spoonسطح B1ability, abroad, absent, absolutely, accent, accept, acceptable, access, accidentally, accommodation, accompany, according to, account, accountant, accurate, accurately, achieve, achievement, active, admire, admission, admit, advanced, advantage, advert, advertise, advise, afford, agency, ahead, aim, airline, alarm, alcoholic, alike, alive, allow, although, altogether, amazed, amazing, ambition, among, amount, amusing, ancient, angel, angrily, ankle, anniversary, announce, announcement, annoy, annoyed, annoying, annual, anxious, apart, apologize, apology, appear, application, apply, approach, approximately, architect, architecture, area, argue, argument, army, arrange, arrangement, arrest, arrival, article, ashamed, ask, asleep, assignment, assistant, athlete, attach, attack, attempt, attend, attention, attitude, attract, attraction, audience, author, average, avoid, awake, backwards, bacon, ballet, bargain, basic, basket, battle, bay, beat, beauty, bee, beef, behave, behaviour, bell, benefit, besides, beyond, bin, biography, bite, blame, blank, bleed, blind, blog, blow, bomb, bone, booking, border, bounce, brave, breast, breath, breathe, bride, brief, briefly, bright, brilliant, broad, bucket, bug, builder, bunch, burn, bury, butcher, button, buyer, cabin, calculator, call, calm, camp, canal, cancel, cancer, candle, captain, card, career, careless, case, casual, cattle, cave, celebrate, celebration, central, ceremony, certain, certificate, challenge, challenging, champion, championship, chance, chapter, character, charge, charity, charming, cheek, cheerful, childhood, choice, cliff, climate, clinic, coach, coast, coin, collar, collection, colourful, comedy, comfort, comic, comment, common, communicate, communication, compare, competitor, complain, complaint, completely, complicated, concentrate, condition, conference, confident, confirm, confused, confusing, connect, consider, contact, contain, contest, continent, continue, contract, control, convenient, convince, cool, corn, correction, correctly, cottage, cotton, count, couple, crash, create, creative, creature, crew, crime, criminal, crop, cruel, cultural, culture, curious, curly, currency, curriculum, cushion, custom, damage, deaf, death, decision, decorate, decrease, defeat, defend, definitely, delete, delicious, delighted, deliver, delivery, demand, depart, departure, depend, depressed, depth, description, deserve, design, designer, despite, destination, destroy, detail, detective, develop, development, diagram, diet, differently, difficulty, dig, direct, direction, directly, director, dirt, disabled, disadvantage, disagree, disappear, disappoint, disappointed, disappointing, disappointment, discover, discussion, disease, disgusting, disk, dislike, display, distance, district, dive, divide, divorce, divorced, documentary, doubt, dozen, drama, drop, due, dull, dust, duty, earth, eastern, economics, edge, education, effect, efficient, effort, either, elbow, elderly, election, electrical, electronic, elementary, embarrassed, embarrassing, embassy, emergency, employ, employee, employer, employment, encourage, ending, enemy, energy, engaged, engineering, enjoyable, enormous, entertain, entertainment, entry, environment, environmental, equal, equipment, escape, essay, essential, event, exact, exchange, excitement, excuse, exhibition, exist, expect, expedition, experience, experienced, experiment, expert, explanation, explode, explore, extraordinary, extremely, facility, fair, fairly, familiar, fancy, fare, fashionable, fasten, fault, fear, fee, feed, feeling, female, festival, fetch, fever, fiction, fight, figure, film-maker, financial, firefighter, firework, fit, fitness, fix, flag, flat, flavour, float, flood, flow, flu, fold, fond, fool, forecast, foreigner, forever, forget, forgive, former, fortnight, fortunately, forward, frame, freeze, freezer, frequent, frequently, fresh, friendship, frightened, frightening, frog, fry, fuel, full-time, fully, fur, further, future, gain, gallery, gap, garbage, gay, generation, generous, gentle, ghost, giant, glance, gorgeous, government, grab, grant, graphics, grateful, grave, greet, ground, guard, guide, guilty, gun, habit, hang, happily, happiness, harbour, hardly, headline, heat, heater, heavily, height, helpful, herb, hero, hidden, hide, hire, historic, historical, hole, honest, hopeful, hopefully, hopeless, huge, human, humour, hunger, hunt, illness, imagination, imagine, importance, impossible, improvement, inch, incorrect, increase, indeed, indoors, inform, ingredient, injure, ink, inquiry, insist, install, instructor, intelligent, intend, interest, intermediate, interrupt, interview, invent, invention, involve, iron, issue, item, jail, jet, join, joke, journalist, keen, kettle, kid, killing, kit, knee, knock, knowledge, lab, label, laboratory, lack, ladder, lady, lamb, landscape, lately, law, lawyer, leader, leaf, league, least, lecture, leisure, length, let, lift, light, likely, limit, limited, lip, liquid, literature, live, lively, loan, local, locate, location, lock, logo, lonely, lorry, loudly, lover, low, luckily, luxury, mad, madam, magnificent, main, mainly, male, mall, manage, marriage, marry, marvellous, mate, maximum, meaning, meanwhile, medicine, medium, membership, memory, mention, mess, messy, metal, method, mile, millimetre, mind, minimum, miserable, miss, monster, monthly, mood, mostly, murder, musician, mystery, narrow, nasty, natural, nearby, neat, necessary, neighbourhood, nervous, net, nightmare, no way, none, northern, notice, novel, nowadays, nowhere, object, obvious, obviously, off, oil, old-fashioned, onto, opinion, opportunity, option, orchestra, ordinary, organization, organize, original, otherwise, ought to, out, outdoor, outdoors, oven, over, overnight, owe, owner, packet, painful, palace, pan, parcel, parking, particularly, partly, part-time, pass, password, patient, penny, percent, perfectly, period, permanent, permission, permit, personal, personally, persuade, photocopy, pick, pie, pile, pill, pin, pipe, plain, planet, pleasure, plenty, plug, poem, poet, poetry, point, political, politician, politics, pollution, population, port, position, positive, possibility, postpone, pot, pour, powder, powerful, prayer, predict, pregnant, preparation, prepared, prescription, presentation, press, pretty, prevent, previous, previously, priest, prince, princess, principal, prison, prisoner, private, produce, product, profession, professor, progress, promise, pronounce, proper, property, protect, proud, provide, publish, pump, punish, pure, purpose, qualification, qualified, quality, quantity, questionnaire, queue, quietly, quit, quite, rail, raise, range, rare, rarely, rather, raw, reach, reader, realize, really, rebuild, recent, recently, recipe, recognize, recommend, recording, recover, recycle, reduce, refuse, region, register, registration, regular, relative, relax, relaxed, relaxing, reliable, religion, remain, remind, remove, replace, reply, report, reporter, request, require, rescue, research, reservation, reserve, resort, respect, responsible, rest, result, retire, revision, reward, rid, rise, rob, robot, rock, romance, romantic, rough, route, routine, row, rubbish, rude, rule, salary, sand, satisfied, save, scared, scary, scene, scientific, scientist, score, scream, sculpture, search, secondary, secret, section, security, seem, select, sensible, separate, serious, seriously, service, session, sew, sex, shade, shadow, shake, shall, shape, sharp, shave, shine, shiny, shock, shocked, shocking, shoot, shore, shoulder, shy, sight, sign, silence, silent, silk, silly, similar, sink, sir, site, situated, situation, ski, skill, skin, sleep, slip, smart, smell, smile, smoke, smooth, social, society, soldier, solution, solve, somehow, sore, southern, spare, speaker, spectacular, speech, speed, spicy, spider, spill, spite, spoil, spot, stall, statue, steep, step, stick, sticky, stir, stone, store, stranger, strawberry, stream, stress, strict, studio, stuff, stupid, style, subject, succeed, success, successful, suddenly, suffer, suggest, suggestion, suitable, sum, surprising, surprisingly, surround, switch, system, tablet, take, talent, talented, taste, tax, teaching, tear, technique, technology, teenage, temple, temporary, terrific, text, therefore, thick, thief, though, throat, tie, tiny, tissue, title, tongue, topic, total, totally, touch, tourism, tournament, towards, tower, trade, traditional, trainer, training, transfer, translate, translation, traveller, trend, trick, trouble, truck, trust, tunnel, twin, typical, ugly, unable, unbelievable, uncomfortable, underneath, underwear, unemployed, unemployment, unexpected, unfair, unit, universe, unknown, unless, unlikely, unnecessary, unpleasant, upper, urgent, used, useless, user, valley, valuable, value, van, variety, vehicle, vet, via, view, visa, voice, vote, wage, wardrobe, warn, warning, waste, wave, weak, web, wedding, weigh, weight, western, whenever, wherever, whether, whose, wildlife, willing, wing, wish, within, wonder, working, workout, worth, would, wrap, writer, writing, zone, celebrity, chemist, cruise, enquiry, farming, flour, frozen, grocery, hardware, located, lottery, pants, paragraph, phrase, pirate, provided, providing, rose, sailor, season, signature, spy, tent, thought, thumb, written, yardسطح B2abandon, abolish, absence, absolute, absorb, abstract, absurd, abuse, academic, accessible, accuracy, accuse, acid, acquire, act, action, activity, actual, adapt, addiction, addition, additional, additionally, adequate, adequately, adjust, adjustment, adopt, adoption, advance, advertising, affair, affect, affection, agent, aggressive, agreement, agriculture, aircraft, alter, alternative, aluminium, ambassador, ambitious, analyse, analysis, analyst, ancestor, anger, annually, anxiety, anyhow, apparent, apparently, appearance, appreciate, appreciation, appropriate, appropriately, approval, approve, approximate, armed, arrow, artificial, artistic, aside, aspect, assess, assessment, assist, assistance, association, assume, assure, astonishing, atmosphere, attachment, authority, automatic, automatically, availability, award, aware, awkward, back, background, backup, badge, balance, balanced, ban, bang, bare, barely, barrier, base, basement, basically, beam, bear, beg, behalf, belief, belong, bench, bend, beneath, beneficial, betray, billion, biological, bitter, bizarre, blade, board, boast, boiling, bold, bombing, bond, bonus, boost, bother, bound, bow, branch, brand, breakdown, breakthrough, breed, brick, broadband, broadcast, browser, budget, bullet, bump, burst, bush, cable, calculate, calculation, campus, candidate, capable, capacity, capture, carbon, care, cast, catalogue, category, cause, cautious, cease, cemetery, certainty, chain, chaos, characteristic, charm, chart, chase, cheat, cheer, chemical, chest, chief, choir, chop, circumstance, citizen, civilization, claim, classic, clause, client, climb, closely, cloth, clothing, clue, coastal, code, coincidence, collapse, collector, column, combination, combine, command, commerce, commercial, commit, commitment, committee, community, companion, comparison, compete, competition, competitive, complex, compose, composer, composition, compromise, compulsory, concentration, concept, concerned, concerning, concrete, conduct, confess, confession, confidence, confirmation, conflict, confuse, confusion, congratulate, connection, conscious, consequence, consequently, conservation, considerable, considerably, consideration, constant, constantly, construct, construction, consultant, consumer, container, contemporary, content, context, continuous, contrary, contrast, contribute, contribution, controversial, convenience, conventional, convert, convinced, cooperate, cooperation, cooperative, cope, copper, corporation, correspond, corridor, costume, council, counter, county, courage, court, courtesy, crack, craft, crawl, creation, creativity, credit, crisis, critical, critically, criticism, criticize, crucial, cure, curiosity, current, currently, curve, dairy, dare, darkness, darling, data, database, dawn, deadline, deadly, deal, dealer, dear, debate, debt, decent, decisive, deck, declare, decline, decoration, deeply, defender, define, definite, definition, degree, deliberate, deliberately, delicate, delight, democracy, democratic, demonstrate, dense, deny, dependent, depressing, depression, deprive, descend, desirable, desktop, desperately, destruction, detailed, determination, determined, device, devote, dialogue, diamond, differ, dilemma, dimension, dip, diplomat, disability, disagreement, disaster, disc, discipline, discourage, discovery, dishonest, disposal, disrupt, distant, distinction, distinguish, distract, distribute, disturb, diverse, division, domestic, dominate, donate, donation, dose, dot, draft, drag, dramatic, dramatically, drown, drug, dynamic, eager, earnings, earthquake, ease, ecological, economic, economy, edit, edition, editor, educate, educated, educational, effective, effectively, efficiency, efficiently, elect, electronics, elegant, element, elsewhere, embarrassment, emerge, emotion, emotional, emotionally, emphasis, emphasize, enable, encounter, encouragement, encouraging, endless, endure, enquire, ensure, entertaining, enthusiasm, enthusiastic, entire, entirely, entitle, episode, equality, equally, equip, era, error, essentially, establish, estate, estimate, eventually, evidence, evident, evil, evolution, examination, examine, exception, exceptional, existence, existing, exotic, expand, expansion, expectation, expected, expense, exploit, explosion, export, expose, express, expression, extend, extension, extensive, extent, external, extract, extreme, factor, fade, fail, failure, faith, FALSE, fame, fantasy, fascinating, fatal, fate, favour, favourable, feather, feature, feedback, fellow, fierce, fighting, finance, firm, firmly, firstly, fixed, flame, flash, flexibility, flexible, folk, following, forbid, force, form, formerly, forthcoming, fortunate, fortune, frankly, free, freedom, freely, frighten, frustration, function, functional, funeral, furious, furthermore, gambling, gang, gas, gasoline, gather, gaze, gear, gender, general, generally, generate, gentleman, gently, genuine, genuinely, global, god, govern, grade, gradually, graduate, graph, greatly, grief, grip, growth, guarantee, guidance, guilt, handful, handle, harm, harmful, harvest, haunt, headquarters, heal, hell, helmet, hesitate, highlight, highly, hint, hip, honestly, honesty, honour, hook, horror, host, household, however, hunting, ideal, ideally, identical, identification, identify, identity, idiot, ignore, illegal, illustrate, immediate, immigrant, immigration, impatient, implement, import, impress, impression, impressive, incident, income, increasingly, incredible, independence, independent, indicate, individual, industrial, industry, infection, inflation, influence, informal, inhabitant, initial, initially, injured, injury, inner, innocent, input, inside, inspector, inspiration, inspire, instant, instantly, institute, institution, insult, insurance, intellectual, intelligence, intensive, intention, interact, interactive, interfere, interior, internal, introduce, introduction, invade, invasion, invest, investigate, investigation, investigator, investment, investor, invisible, involvement, joint, joy, judge, jury, justice, justify, kingdom, known, land, landing, landlord, lane, lap, largely, laser, latter, layer, lead, leading, leaflet, leak, lean, learning, legal, legend, level, liberty, lick, lid, lifestyle, lifetime, link, literally, literary, litter, liver, living, load, logical, long-term, loose, loss, lower, loyal, loyalty, lung, lyric, magical, maintain, maintenance, major, majority, management, manner, manufacture, manufacturer, manufacturing, marathon, mark, marketing, mask, massive, master, material, mathematical, matter, mature, meaningful, means, meantime, measure, mechanical, medal, media, medical, medieval, melt, memorable, mental, mere, merely, military, minister, minor, minority, miracle, misery, misleading, mixture, modest, monitor, monument, moral, moreover, motivation, motive, motor, motorist, movement, moving, mud, muscle, mysterious, myth, nail, naked, nation, nationwide, native, naughty, necessarily, needle, negative, neighbouring, neither, network, nevertheless, newly, nicely, nod, nonsense, nor, normally, novelist, nuclear, nuisance, nursery, nut, obey, objection, objective, obligation, observation, observe, obsession, obtain, occasion, occasionally, occupy, occur, odd, offence, offend, offender, offensive, officer, operate, operator, opponent, oppose, opposite, optimistic, oral, organic, organized, organizer, origin, originally, outer, outstanding, overall, overcome, overlook, overseas, overtime, oxygen, pace, package, pale, panic, parade, parliament, partial, participate, particular, partner, passage, passion, passionate, passive, patience, pattern, pause, payment, peace, peaceful, peak, peculiar, penalty, pension, percentage, perform, performance, permanently, personality, phase, philosopher, philosophy, physical, pint, pitch, pity, planning, plot, poison, poisonous, policy, pond, pool, popularity, portrait, potential, potentially, poverty, power, practical, practically, practice, praise, precious, precise, precisely, predictable, prediction, preference, prejudice, presence, preserve, presidency, presidential, presumably, pretend, prevention, pride, primarily, primary, priority, privacy, probable, procedure, process, producer, production, productive, professional, profit, profitable, prohibit, project, promote, promotion, proof, proposal, propose, proposed, prospect, protection, protective, protest, prove, psychological, psychologist, psychology, public, publication, publicity, pudding, punch, punishment, purchase, qualify, query, racial, racism, rage, rape, rapid, rapidly, rate, ray, react, reaction, readily, realistic, reality, rear, reasonable, reasonably, rebel, recall, reception, recession, reckon, recommendation, recovery, reduction, referee, reference, reflect, reflection, refugee, regain, regard, regional, regret, regulation, reject, related, relation, relationship, relatively, release, relevant, relief, relieved, religious, rely, remaining, remains, remark, remarkable, remedy, remote, renew, representative, reputation, requirement, researcher, resident, resign, resource, respond, response, responsibility, restore, retired, retirement, reveal, revenge, revise, revolution, revolutionary, rhythm, ridiculous, ring, rip, risk, risky, robbery, rocket, role, roll, rope, roughly, royal, rub, rubber, ruin, rumour, rural, rush, sadly, safety, sail, sake, sale, sample, satellite, satisfaction, satisfy, saving, scale, scandal, schedule, scheme, scratch, script, secondly, secure, seed, seek, seize, seldom, selection, seminar, senior, sensation, sense, sensitive, separation, series, set, setting, settle, severe, severely, sexual, sexy, shallow, sharply, shed, shell, shelter, shooting, shortage, shortly, short-term, shrink, sigh, signal, significant, significantly, similarity, simply, simultaneously, since, single, skilled, slam, slash, slave, slide, slight, slightly, slope, smash, so-called, soil, solar, solid, solo, sophisticated, soul, source, specialist, specialize, species, specific, specify, spectator, spirit, spiritual, split, sponsor, spray, spread, squeeze, stab, stadium, stage, standard, stare, state, statement, statistic, steadily, steady, steam, steel, steer, stiff, stimulate, storage, straightforward, strain, strategy, strength, strengthen, stretch, strictly, strike, striking, string, stroke, strongly, structure, struggle, stunning, submit, substance, substantial, substitute, suburb, successfully, sudden, suffering, sufficient, suicide, summary, superb, supervise, supply, support, supporter, surely, surface, surgery, surrounding, survey, survival, survive, survivor, suspect, suspicion, suspicious, swallow, swear, sweep, swing, sword, symbol, sympathetic, sympathy, symptom, tackle, tail, tale, tap, target, task, technical, technological, temporarily, tempt, tend, tension, terminal, terribly, terrify, territory, terror, terrorism, terrorist, theft, theme, theory, therapy, thesis, thorough, thoroughly, thoughtful, threat, threaten, thrilled, throughout, thus, tide, tight, tighten, timing, tolerate, tone, tough, toxic, tradition, tragedy, tragic, trail, transform, transparent, transport, transportation, trap, tray, treasure, treat, treatment, tremendous, trial, tribe, tricky, trophy, tropical, truly, truth, tube, turn, typically, ultimate, unacceptable, unconscious, underground, understanding, undoubtedly, unfortunate, union, unique, united, universal, unlike, update, upgrade, upon, upset, urban, valid, vanish, variation, varied, vary, vast, venue, verse, version, victim, victory, viewer, violence, violent, virtually, virus, visible, vision, visual, vital, vitamin, volume, volunteer, wander, ward, weakness, wealth, wealthy, weapon, weird, welcome, whatever, wheat, whereas, whisky, whisper, whoever, whom, widely, widen, width, wild, willingness, wipe, wire, wisdom, wise, witness, worldwide, worm, worrying, worthwhile, wound, wrist, yell, youth, cell, cherry, cycle, decade, devil, drunk, economist, fence, found, heaven, heel, icon, impressed, journalism, lighting, mayor, partnership, platform, profile, programming, publisher, residential, root, seal, servant, shot, ton, widowسطح C1abortion, acceptance, accomplish, accordance, accusation, acknowledge, adaptation, administration, administrative, administrator, adviser, agenda, aggression, aid, alert, allegation, allocate, allowance, alongside, amateur, amid, angle, anticipate, appeal, appetite, applaud, appoint, arise, asset, assign, associate, assumption, assurance, attain, attendance, attorney, auction, authentic, authorize, awareness, basis, bet, boundary, broadly, brutal, bubble, bulk, burden, campaign, capability, cater, caution, cereal, civil, clarify, classify, clinical, coal, collaborate, collaboration, commodity, commonly, comparable, compensate, competence, competent, compile, completion, complication, comply, component, comprehensive, comprise, concern, conclude, conquer, consciousness, consent, conservative, constitute, constitution, consult, consume, consumption, continually, controversy, convention, convey, convincing, corporate, corrupt, corruption, counterpart, countless, coverage, criterion, critic, cultivate, debut, declaration, dedicated, dedication, defect, deficiency, deficit, delegate, demonstration, density, deposit, deputy, derive, desire, detect, deteriorate, determine, dictate, differentiate, diminish, diplomatic, directory, disastrous, discrimination, dismiss, dismissal, displace, disruption, distinct, distinctive, distress, distribution, diversity, domain, dominant, downwards, dual, dumb, duration, effectiveness, eligible, eliminate, elite, embrace, emission, empire, endeavour, enforce, engage, enhance, enrich, enterprise, equation, equivalent, establishment, ethnic, evaluate, evaluation, evolve, exaggerate, exceed, excess, excessive, exclude, exclusive, exclusively, executive, exhibit, exposure, fabric, facilitate, faculty, fairness, federal, fibre, filthy, flaw, flee, fleet, focus, formal, formally, format, formula, foundation, frustrated, frustrating, fulfil, fund, funding, fuss, gathering, gene, genetic, genius, gesture, glimpse, globalization, glory, grace, grand, grasp, gross, guideline, habitat, harassment, harsh, hatred, hazard, healthcare, hence, hilarious, historian, holy, homeless, horn, hostile, housing, humanity, humorous, illustration, imaginary, immense, impose, imprison, inability, inadequate, inappropriate, inclusion, incredibly, index, indication, inevitable, inevitably, infect, influential, infrastructure, initiative, injustice, innovation, innovative, insert, insight, inspect, inspection, installation, instance, instruct, insufficient, integral, integrate, integration, intense, interaction, interference, interpret, isolated, isolation, journal, labour, landmark, launch, lawn, lay, layout, leadership, legendary, lengthy, liable, liberal, liberation, limitation, listener, literacy, log, logic, long-time, lounge, machinery, magistrate, magnetic, march, market, mass, mechanism, memo, merit, migration, mild, miner, minimal, minimize, mining, ministry, mode, moderate, modification, modify, motivate, multiple, municipal, mutual, namely, naturally, necessity, neglect, negotiate, negotiation, neutral, newsletter, noble, nominate, nomination, nonetheless, norm, notable, notably, notify, notion, notorious, numerous, nutrition, obesity, oblige, obstacle, occasional, occurrence, odds, openly, operation, opposition, opt, organ, ounce, outcome, outlook, overwhelm, overwhelming, ownership, panel, partially, participant, peasant, perceive, personnel, perspective, phenomenon, portion, pose, possess, predator, pregnancy, preliminary, presently, preservation, prestigious, presume, principle, prior, privilege, probability, problematic, proceed, proceeding, productivity, progressive, projection, prominent, promising, proportion, proposition, prospective, prosperity, protein, provision, pulse, purely, pursue, quote, radiation, random, rank, rating, ratio, rational, realization, reassure, rebellion, reconstruction, recruit, recruitment, refusal, regardless, regulate, relevance, reliability, reluctant, remarkably, reminder, replacement, reproduce, republic, resemble, resist, resolve, respective, restrict, resume, retail, revenue, reverse, review, riot, rival, sack, sacred, sacrifice, saint, scare, scholar, scholarship, scope, sector, seemingly, selective, self, sensitivity, serial, settlement, sheer, shift, significance, similarly, simulation, sincere, sketch, skip, slavery, slogan, slot, soak, sole, solely, solicitor, solidarity, somewhat, spam, specifically, specification, speculation, sphere, spin, spine, spokesman, spokesperson, sponsorship, stability, stable, starve, statistical, status, stereotype, stock, strategic, straw, strip, subsequent, subsequently, subsidy, substantially, substitution, successor, sufficiently, summarize, superior, supervision, supervisor, supportive, supposedly, supreme, surge, surgeon, suspend, sustainable, swap, tactic, telly, tendency, texture, thankfully, therapist, thereby, thrive, tobacco, toll, trace, track, transaction, transformation, transmit, trigger, triumph, troubled, tuition, turnover, ultimately, uncertainty, undergo, undertake, unfold, unite, unity, upcoming, upwards, usage, utterly, vague, variable, vein, verify, versus, vertical, viewpoint, virtual, voluntary, warrior, weaken, well-being, whatsoever, widespread, wit, withdraw, workplace, workshop, worship, worthy, youngsterسطح C2accelerate, accountable, accumulate, accumulation, acre, adjacent, adolescent, adverse, advocate, albeit, allege, allegedly, alliance, allocation, ally, amend, amendment, analogy, anchor, anonymous, arbitrary, aspiration, assault, assemble, assembly, assert, attribute, backing, being, bias, bid, bind, blend, bureaucracy, burial, capitalism, capitalist, cargo, carriage, carve, casualty, chronic, circuit, circulation, civilian, clarity, clash, classical, classification, cling, closure, coincide, combat, commander, commence, complexity, conceal, concede, conceive, conception, concession, conclusion, condemn, confine, confront, confrontation, conscience, consecutive, consensus, consistent, consistently, constitutional, constraint, consultation, contemplate, contempt, contradiction, conversion, convict, conviction, core, corresponding, counselling, counsellor, coup, credibility, creep, crude, crush, crystal, custody, cynical, deem, defensive, defy, delegation, denial, dependence, depict, desperate, devise, diagnose, diagnosis, dignity, disclose, discretion, disorder, dispute, dissolve, disturbing, divert, dominance, donor, drain, drift, drought, dump, echo, elaborate, embody, empirical, endorse, entity, erupt, essence, ethic, ethical, execute, exile, expenditure, experimental, expire, explicit, explosive, extremist, fake, feat, filter, flawed, flesh, flourish, fluid, formation, formulate, founder, fraction, fragile, framework, fraud, fundamental, fundamentally, globe, goodness, grain, grin, gut, hail, handy, harmony, heritage, hierarchy, high-profile, hollow, horizon, hostage, hostility, humanitarian, humble, hypothesis, ignorance, illusion, image, imminent, immune, impact, implementation, implication, imply, imprisonment, incentive, inclined, incorporate, incur, indicator, indirect, indulge, inequality, infant, infer, inherent, inherit, initiate, injection, instinct, instruction, intact, integrity, intensify, intensity, intent, interim, interpretation, interval, intervene, intervention, intimate, intriguing, ironic, ironically, irony, judgment, junior, justification, kidney, lawsuit, leap, legacy, legislation, legitimate, lethal, lifelong, likelihood, likewise, linger, lobby, loom, lump, mainstream, margin, marginal, massacre, maximize, measurement, medication, melody, memorial, mercy, merge, merger, metaphor, missile, mission, model, momentum, monopoly, motion, mount, narrative, naval, nerve, nest, observer, official, offspring, ongoing, opening, opposed, optimism, orientation, originate, outbreak, outlet, outline, output, outrage, palm, parallel, patch, peer, perception, persist, persistent, philosophical, pioneer, pit, plea, plead, plunge, pole, portray, possession, practitioner, precede, precedent, predecessor, predominantly, premium, prescribe, pressure, prevail, prey, prime, print, profound, prompt, propaganda, prosecute, prosecution, prosecutor, province, provincial, provoke, pursuit, puzzle, quest, quotation, racist, radical, raid, rally, realm, reasoning, recognition, referendum, reform, refuge, regime, reign, reinforce, rejection, relate, relieve, render, renowned, repeated, reportedly, represent, representation, reproduction, residence, resignation, resistance, resolution, restriction, retain, retreat, retrieve, revelation, revival, revive, ritual, ruling, running, sanction, scan, scattered, scenario, sceptical, scrutiny, sentiment, sequence, shrug, sibling, sin, skull, slap, snap, soar, spark, specimen, spectrum, speculate, spending, spotlight, spouse, squad, stance, stimulus, strand, strive, structural, stumble, subtle, successive, suck, sue, summit, supplement, suppress, surplus, surrender, sustain, symbolic, systematic, tank, taxpayer, tenant, tender, testify, theoretical, thereafter, thread, threshold, timber, tin, tip, tolerance, torture, toss, trait, transition, transmission, trash, trauma, treaty, tribal, tribute, trio, troop, twist, underlying, undermine, unprecedented, uphold, urge, validity, venture, verbal, verdict, veteran, viable, vice, vicious, villager, virtue, vow, vulnerable, warehouse, weed, welfare, whereby, wholly, wicked, withdrawal, workforce, yieldبدون سطح بندیabundance, academy, accommodate, accomplishment, accordingly, accountability, accounting, accused, acquisition, activate, activation, activist, actress, acute, adhere, administer, aesthetic, affordable, aftermath, agricultural, ah, aide, aids, alien, align, alignment, animation, anybody, app, apparatus, appealing, applicable, applicant, architectural, archive, arena, arguably, arms, array, articulate, artwork, ash, aspire, assassination, assertion, associated, asylum, atrocity, audio, audit, auto, autonomy, await, backdrop, bacteria, bail, ballot, banner, barrel, based, bass, battlefield, beast, beforehand, beloved, benchmark, beneficiary, bent, bishop, blast, blessing, bloke, boiler, breach, breathing, broadcaster, buck, buddy, buffer, canvas, casino, chamber, chap, characterize, charter, chuck, chunk, circulate, cite, citizenship, civic, cleaning, clerk, clip, cluster, coalition, cocktail, cognitive, collective, collision, colonial, colony, coloured, columnist, commentary, commentator, commission, commissioner, communist, compassion, compel, compelling, compensation, complement, compliance, compound, compute, confer, configuration, congregation, congressional, connected, conserve, consist, consistency, consolidate, conspiracy, constituency, contend, contender, contention, contributor, coordinate, coordination, coordinator, cop, copyright, correlate, correlation, correspondence, correspondent, costly, councillor, covered, creator, credible, critique, cult, curved, cute, daddy, daft, dam, damaging, debris, decision-making, deed, default, denounce, deploy, deployment, descent, designate, destructive, detain, detection, detention, discard, discharge, disclosure, dispose, distort, divine, doctrine, documentation, driving, dub, dude, duo, editorial, ego, electoral, elevate, embark, emergence, empower, enact, encompass, endorsement, enforcement, engagement, engaging, enrol, ensue, enthusiast, entrepreneur, epidemic, erect, escalate, eternal, evacuate, everyday, evoke, excellence, exclusion, execution, exert, expertise, explicitly, exploitation, exploration, extensively, fabulous, faction, failed, feeding, feminist, finding, firearm, fixture, flying, footage, forge, forth, forum, fossil, foster, fragment, franchise, freeway, frequency, fundraising, gallon, gaming, generic, genocide, genre, gig, glorious, goods, gosh, governance, governor, graphic, gravity, greenhouse, grid, grind, guerrilla, halfway, halt, handling, have to, hearing, heighten, holder, holding, homeland, hurricane, hydrogen, ideological, ideology, imagery, incidence, included, indictment, indigenous, induce, infamous, inflict, inhibit, inject, insertion, insider, institutional, instrumental, intake, integrated, intended, interface, invoke, involved, irrelevant, isolate, judgement, judicial, junction, jurisdiction, kidnap, lad, large-scale, laughter, legislative, lens, lesbian, lesser, limb, linear, line-up, listing, long-standing, loop, magnitude, mainland, making, mandate, mandatory, manifest, manipulate, manipulation, manuscript, marine, marker, marketplace, martial, matching, math, maths, meditation, memoir, merchant, methodology, midst, militant, militia, mixed, mob, mobility, mobilize, mommy, monk, morality, mortgage, multiply, mummy, navigation, next to, niche, nil, nominee, non-profit, nope, nursing, obsess, offering, one another, operational, optical, organizational, ought, outfit, outing, outsider, overly, oversee, overturn, pad, parameter, parental, parish, parliamentary, passing, pastor, patent, pathway, patrol, patron, per cent, petition, physically, physician, placement, pledge, pointed, poll, post-war, preach, precision, premier, premise, preside, prevalence, printing, privatization, probe, proceeds, processing, proclaim, pronounced, properly, protocol, psychiatric, publishing, quid, quota, racing, radar, ranking, receiver, recipient, recount, refer, regularly, regulatory, rehabilitation, remainder, removal, rental, reporting, reside, residue, respectively, restoration, restraint, rhetoric, robust, rod, rotate, rotation, screening, secular, seeker, segment, senator, set-up, sexuality, shaped, shareholder, shatter, shipping, shove, simulate, socialist, sometime, sovereignty, span, specialized, spectacle, spokeswoman, sporting, stabilize, stake, standing, stark, stun, sublist, submission, subscriber, subscription, suburban, succession, suite, super, surgical, surveillance, suspension, tactical, tag, tape, teens, tenure, terminate, terms, terrain, testimony, testing, theatrical, thinking, thought-provoking, tile, timely, tonne, tool, trademark, trading, trailer, transcript, transit, transparency, tribunal, trillion, trustee, tsunami, turnout, undergraduate, unify, unveil, used to, utility, utilize, vessel, vibrant, violate, violation, vocal, voting, vulnerability, warfare, warming, warrant, washing, weave, whip, yep, bless, boom, chairman, contractor, crown, cue, cutting, demon, devastate, dictator, discourse, educator, embed, evolutionary, folding, info, inmate, legislature, license, lord, mentor, mill, mineral, participation, pipeline, portfolio, processor, protester, punk, regulator, rifle, screw, settler, spoken, stem, syndrome, synthesis, theology, vacuum</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Fri, 25 Jun 2021 11:20:25 +0430</pubDate>
            </item>
                    <item>
                <title>چطور سوره‌های قرآن را به ترتیب حروف الفبای متن آنها مرتب کردم؟</title>
                <link>https://virgool.io/Iamdeveloper/%DA%86%D8%B7%D9%88%D8%B1-%D8%B3%D9%88%D8%B1%D9%87-%D9%87%D8%A7%DB%8C-%D9%82%D8%B1%D8%A2%D9%86-%D8%B1%D8%A7-%D8%A8%D9%87-%D8%AA%D8%B1%D8%AA%DB%8C%D8%A8-%D8%AD%D8%B1%D9%88%D9%81-%D8%A7%D9%84%D9%81%D8%A8%D8%A7%DB%8C-%D9%85%D8%AA%D9%86-%D8%A2%D9%86%D9%87%D8%A7-%D9%85%D8%B1%D8%AA%D8%A8-%DA%A9%D8%B1%D8%AF%D9%85-fy6c2qzgsw16</link>
                <description>دوستی برای یک پروژه ی تحقیقاتی روی قرآن، می خواست سوره های قرآن را به ترتیب حروف الفبا (بر اساس حروف آیات اولیه ی هر سوره) مرتب کند. از من کمک خواست و من به این ترتیب به او کمک کردم:1- ابتدا کل آیه های قرآن را در قالب یک فایل تکست از پروژه ی تنزیل دانلود کردم. در فایل دانلودشده (با حجم 1.3 مگابایت شامل 6267 خط) هر آیه در یک خط آمده است. در ابتدای خط شماره ی سوره و سپس شماره ی آیه نیز نوشته شده است. مانند:1|1|بِسْمِ اللَّهِ الرَّحْمَـٰنِ الرَّحِيمِ
1|2|الْحَمْدُ لِلَّهِ رَبِّ الْعَالَمِينَ2- همه ی آیه ها را به یک فایل اکسل منتقل کردم. طبیعتن در ابتدای انتقال، کل موارد در یک ستون می آید. اما اگر از منوی Data گزینه ی Text to Columns را انتخاب کنیم، سپس گزینه ی Delimited را انتخاب کنیم و در مرحله ی بعد«|» را به عنوان Delimiter معرفی کنیم، می توانیم سه ستون «شماره سوره»، «شماره آیه» و «متن آیه» داشته باشیم.انتخاب «|» به عنوان جداکننده ی ستون هانتیجه ی جداشده ی ستون ها3- حالا بهتر است، داده های خود در اکسل را به حالت «جدول» (Format as Table) دربیاوریم (با انتخاب کل داده ها و انتخاب این گزینه از منوی Home). این جوری فیلترکردن و افزودن ستون های بعدی به آن راحت تر می شود.4- ما برای مرتب کردن به ترتیب حروف الفبا، فقط به آیه های اول نیاز داریم. پس ستون «شماره آیه» را Filter می کنیم و روی 1 قرار می دهیم. مشکل این جاست که آیات اولیه ی چندین سوره یکسان هستند. مثلن شش سوره با «الم» شروع می شوند (بقره، آل عمران، عنکبوت، روم، لقمان، سجده). پس لازم است که آیات دوم سوره ها را هم در تحلیل بیاوریم. برای این کار در ستون کنار «آیه»، یک ستون به نام «آیه بعدی» اضافه می کنیم و فرمول آن را جوری تنظیم می کنیم که آیه ی بعدی (ردیف بعدی) را بخواند. مثلن اگر آیه در خانه ی D2 است، در این ستون می نویسیم:=D3اگر در مرحله ی قبل فرمت داده ها را به شکل جدول درآورده باشیم، در این مرحله برای همه ی سوره ها در این ستون، آیه ی دوم را خواهیم داشت.5- باز هم یک مشکل داریم! در بعضی از سوره ها، دو آیه ی اول مشابه هستند (مانند زخرف و دخان که دو آیه ی اول هر دوی آنها این است: «بِسْمِ اللَّهِ الرَّحْمَـٰنِ الرَّحِيمِ حم وَالْكِتَابِ الْمُبِينِ» یا جاثیه و احقاف که دو آیه ی اول هر دوی آنها این است: «بِسْمِ اللَّهِ الرَّحْمَـٰنِ الرَّحِيمِ حم تَنزِيلُ الْكِتَابِ مِنَ اللَّهِ الْعَزِيزِ الْحَكِيمِ»). پس به آیه ی سوم هم نیاز داریم. از همان فرمول مرحله ی قبلی استفاده می کنیم با این تفاوت که دو خانه ی بعد را می خوانیم. مثلن اگر آیه در خانه ی D2 است در فرمول خانه ی D4 را می خوانیم.6- در ستون بعدی سه آیه را ترکیب می کنیم تا بتوانیم بر اساس آن ردیف ها را مرتب کنیم:=CONCATENATE(D2,&amp;quot &amp;quot,E2,&amp;quot &amp;quot,F2)7- چون مرتب سازی قرار بود بدون در نظر گرفتن «بسم الله الرحمن الرحیم» اول سوره ها باشد، یک ستون دیگر هم مانند ستون قبلی اضافه می کنیم که در آن این عبارت حذف شده است.8- کار تقریبن تمام است و می توانیم مرتب سازی سوره ها را بر اساس همین ستون آخر انجام دهیم. من فهرستی از سوره های قرآن را از «ویکی شیعه» گرفتم و در یک شیت دیگر اکسل قرار دادم. ستون آخری را که به دست آمده بود هم در این شیت قرار دادم. اما چون علائم «مصوت ها» (مانند فتحه، کسره و ضمه) قرار نیست در مرتب سازی بیایند، این علائم را حذف کردم (با Replace کردن این موارد با هیچ چیز).9- اگر قرار بود فقط عنوان سوره ها به ترتیب حروف الفبای متن آنها بیاید، کار در همین مرحله به پایان می رسید اما چون قرار بود خود متن قرآن هم بر همین اساس مرتب شود، یک پروژه ی کوچک لاراولی نوشتم که در آن بتوانیم چاپ متن را هم انجام دهم. برای این که سرعت مرتب سازی در این پروژه بالا برود، در اکسل، ستون آیه های اول را مرتب کردم و یک ستون به این جدول اضافه کردم که ترتیب سوره ها را به ترتیب حروف الفبا نشان می داد (alphabetical_id و alphabetical_without_bism_id). به این ترتیب، در طول چاپ متن سوره ها، چاپ بر اساس همین اعداد کافی است و نیاز نیست سه آیه‌ی اول مجدد بررسی شده و بر اساس حروف الفبا مرتب شوند.10- در پروژه ی لاراولی دو جدول ayahs و chapters ساختم که migration آنها به شکل زیر بود (همان موارد اکسل را به جداول دیتابیس منتقل کردم):Schema::create(&#039;ayahs&#039;, function (Blueprint $table) {
$table-&gt;id();
$table-&gt;foreignId(&#039;chapter_id&#039;)-&gt;constrained()-&gt;onDelete(&#039;cascade&#039;);
$table-&gt;integer(&#039;ayah_in_chapter&#039;);
$table-&gt;text(&#039;text&#039;);
});Schema::create(&#039;chapters&#039;, function (Blueprint $table) {
$table-&gt;id();
$table-&gt;string(&#039;title&#039;);
$table-&gt;integer(&#039;alphabetical_id&#039;);
$table-&gt;integer(&#039;alphabetical_without_bism_id&#039;);
$table-&gt;integer(&#039;wahy_id&#039;);
$table-&gt;string(&#039;wahy_location&#039;);
$table-&gt;integer(&#039;ayahs_count&#039;);
$table-&gt;text(&#039;first_three_ayahs&#039;);
$table-&gt;text(&#039;first_three_ayahs_without_bism&#039;);
});11- برای این که کار سریع پیش برود، یک route ساده ساختم که در آن صفحه ی اصلی تابع index از کلاس کنترلر «سوره» (Chapter) را می خواند:Route::get(&#039;/&#039;, [Chaptercontroller::class, &#039;index&#039;]);12- در نهایت در تابع index کنترلر Chapter آیه ها را چاپ کردم. در این جا، ترتیب سوره ها را از جدول «سوره‌ها» خواندم و خود آیه ها را از جدول «آیه ها» (چون می خواهیم آیه ها را با علائم نگارشی و مصوت‌ها داشته باشیم). همچنین شماره ی آیه ها را بین علامت آیه قرار دادم. این علامت‌ها در یونیکد به این شرح هستند: U+FD3E ﴾ و U+FD3F ﴿. همچنین چون در مرحله ی بعدی می خواستم متن به دست آمده را در «ورد» ببرم و فهرست سوره ها را هم داشته باشم، در ابتدای هر سوره، عنوان سوره را با تگ h1 نوشتم که در هنگام انتقال به ورد، این تگ به عنوان Heading1 تشخیص داده شود و ساخت فهرست خودکار آسان شود:public function index()
{
    // order by alphabetical_without_bism_id or alphabetical_id
    $chapters = Chapter::orderBy(&#039;alphabetical_without_bism_id&#039;)-&gt;get();
    foreach ($chapters as $chapter) {
        $print = &amp;quot&lt;h1&gt;&amp;quot.$chapter-&gt;title.&amp;quot&lt;/h1&gt;&quot;
        foreach ($chapter-&gt;ayahs as $ayah) {
            // ayah id is between ﴿ and ﴾.
            $print .= $ayah-&gt;text.&amp;quot ﴿&amp;quot.$ayah-&gt;ayah_in_chapter.&amp;quot﴾ &quot;
        }
        echo $print . &amp;quot&lt;br&gt;&quot;
    }
}13- در نهایت بعد از انتقال متن به دست آمده به ورد، فهرست سوره ها را ساختم (از تب References بخش Table of Contents) و فونت کل متن را هم «عثمان طه» انتخاب کردم.بخشی از نتیجه ی نهایی کارترتیب نهایی سوره ها به ترتیب حروف الفبای متن آنها (بدون در نظر گرفتن بسم الله ابتدای سوره ها) به این شرح شد:1- نحل2- انشقاق3- انفطار4- تکویر5- نصر6- منافقون7- زلزله8- واقعه9- ماعون10- انبیاء11- قمر12- علق13- حاقه14- کهف15- انعام16- سبا17- فاتحه18- فاطر19- محمد20- یونس21- یوسف22- حِجر23- هود24- ابراهیم25- الرحمن26- قارعه27- عنکبوت28- ال عمران29- فیل30- لقمان31- سجدة32- بقره33- روم34- شرح35- رعد36- اعراف37- تکاثر38- نوح39- کوثر40- قدر41- فتح42- توبه (برائت)43- مُلک44- فرقان45- مسد46- زمر47- جاثیه48- احقاف49- غافر50- فصّلت51- شوری52- دخان53- زخرف54- معارج55- اعلی56- حدید57- حشر58- صف59- اسراء60- نور61- ص62- نمل63- قصص64- شعراء65- طه66- عبس67- نبا68- ق69- مؤمنون70- مجادله71- فلق72- ناس73- جن74- اخلاص75- کافرون76- مریم77- بلد78- قیامه79- قریش80- بینه81- قلم82- غاشیه83- انسان84- تین85- ذاریات86- بروج87- طارق88- شمس89- صافات90- ضحی91- طور92- عادیات93- عصر94- فجر95- لیل96- مرسلات97- نازعات98- نجم99- همزه100- مطففین101- مائده102- ممتحنه103- حجرات104- مدثر105- مزّمّل106- نساء107- حج108- احزاب109- طلاق110- تحریم111- یس112- انفال113- جمعه114- تغابن</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Thu, 24 Jun 2021 21:07:31 +0430</pubDate>
            </item>
                    <item>
                <title>رفع مشکل صفحه سفید Moodle بعد از نصب افزونه</title>
                <link>https://virgool.io/Iamdeveloper/%D8%B1%D9%81%D8%B9-%D9%85%D8%B4%DA%A9%D9%84-%D8%B5%D9%81%D8%AD%D9%87-%D8%B3%D9%81%DB%8C%D8%AF-moodle-%D8%A8%D8%B9%D8%AF-%D8%A7%D8%B2-%D9%86%D8%B5%D8%A8-%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-u2hzg55qjcfb</link>
                <description>مشکل: بعد از به روزرسانی مودل و نصب افزونه ی Adobe Connect، با ورود به صفحه ی تنظیمات ادمین مودل (Site Administrator) با یک صفحه ی سفید روبرو شدیم. مودل رو با استفاده از سرویس IaaS ابرآروان نصب کرده بودیم که به شکل پیش فرض یه سرور Debian رو با استفاده از Bitnami (که یک نصب کننده ی بسته های نرم افزاری مختلف روی سروره) برای مودل تنظیم کرده بود.مودلشناسایی مشکلبرای شناسایی مشکل در مودل، باید حالت debug رو فعال کنیم. اما وقتی به تنظیمات سایت دسترسی نداریم چطور این حالت رو فعال کنیم؟1- اول از طریق ssh وارد سرور می شیم.2- بعد، وارد mysql می شیم (برای این دستور و همه ی دستورات بعدی، اگه کاربری که باهاش وارد شدیم، دسترسی ادمین یا SuperUser نداره باید در ابتدای دستور sudo رو هم بنویسیم):mysql -u root -p3- گذرواژه ی دیتابیس همون گذرواژه ی پیش فرضی است که bitnami برای کاربر admin (کاربر پیش فرض مودل) ساخته بود. اما اگه این گذرواژه رو نداشته باشیم، چه باید بکنیم؟ کافیه این دستور رو بنویسیم تا گذرواژه برامون نمایش داده بشه: cat /home/bitnami/bitnami_credentials4- وقتی وارد mysql شدیم، اول دیتابیس اصلی مودل رو انتخاب می کنیم: use bitnami_moodle;5- حالا از جدول mdl_config (که تنظیمات مودل رو نگه داری می کنه) مقدار debug رو به 2047 تغییر می دیم (حالت پیش فرض: 0):update mdl_config set value=&#039;2047&#039; where name=&#039;debug&#039;;و حالا حالت دیباگ در سایت فعال می شه. دیگه با وارد شدن به بخش تنظیمات سایت از طریق مرورگر، با صفحه ی سفید روبرو نمی شیم. به جاش خطای php رو می بینیم.بعد از فعال کردن این حالت، مشخص شد مشکل از سازگار نبودن افزونه ی Adobe Connect با نسخه ی مودل نصب شده ی ما بود. (نسخه ی مودل: 3.8، نسخه ای که ادوبی کانکت پشتیبانی می کرد: 3.1).رفع مشکلبرای رفع مشکل، کافیه کل پوشه ی افزونه ی ناسازگار (در این جا Adobe Connect) رو حذف کنیم:rm -r /opt/bitnami/apps/moodle/htdocs/mod/adobeconnectبه محل ذخیره ی افزونه دقت کنید. این جا، محل پیش فرضیه که Bitnami افزونه ها رو نگه داری می کنه.</description>
                <category>من توسعه‌دهنده‌ام</category>
                <author>امیرحسین مجیری</author>
                <pubDate>Wed, 23 Jun 2021 16:49:30 +0430</pubDate>
            </item>
            </channel>
</rss>