<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های کمیل کمال</title><link>https://virgool.ir/feed/@kamal.komeil</link><description>Technical Team Lead at myket.ir</description><language>fa</language><pubDate>2026-11-10 19:25:59</pubDate><image><url>https://files.virgool.ir/upload/users/9302/avatar/avatar.png</url><title>کمیل کمال</title><link>https://virgool.ir/@kamal.komeil</link></image><item><title>بررسی مشکل غیر-فعال شدن دکمهٔ Install در اندروید</title><link>https://virgool.ir/myket-appstore/install-button-disable-ussvgmtefbqi</link><description>کاربران مایکت، از مدتی پیش گزارش‌هایی از مشکلی عجیب در فرایند نصب برنامه‌ها در دستگاه‌های اندرویدی خود دادند. کاربران در نصب برنامه‌ها از منابع غیر رسمی (Third party source) یعنی استورهایی به غیر از Google Play مشکل داشتند. سناریوی مشکل به این صورت بود که پس از دانلود برنامه و در هنگام نصب، دکمهٔ «نصب» یا &#34;Install&#34;، غیر-فعال یا خاکستری رنگ دیده می‌شود و امکان لمس آن را وجود ندارد، در نتیجه فرایند نصب کامل نمی‌شود.عجیب بودن این مشکل اینجا بود که بعضی از کاربران مایکت ادعا می‌کردند که مثلا صبح‌ها این مشکل را ندارند و در ساعات بعد از ظهر و شب این مشکل به وجود می‌آید! کاربری گزارش کرده بود که: «زمانی که در محل کارم حضور دارم با این مشکل مواجه نمی‌شوم ولی زمانی که به منزل می‌آیم، نمی‌توانم برنامه‌ها را روی دستگاه خود نصب کنم!»با بررسی‌های انجام شده متوجه شدیم که همه چیز به LUX Applications مربوط می‌شود. این برنامه‌ها که کاربران معمولا با هدف تنظیم نور/رنگ صفحه نمایش روی دستگاه خود نصب می‌کنند باعث این اختلال می‌شود. نحوهٔ کار این‌گونه برنامه‌ها به این صورت است که لایه‌ای مجازی (Overlay) روی صفحه نمایش دستگاه شما ایجاد می‌کنند و مثلا با خاکستری کردن رنگ این لایه، نور صفحه نمایش شما را کم‌تر نشان می‌دهند. در زیر برخی از عناوین این برنامه‌ها را می‌توانید ببینید:Screen Adjuster, Darker, Easy Eye, Twilight, Brightness Adjustment, Battery-Saving, ...سیستم‌عامل اندروید برای جلوگیری از رفتار برنامه‌های مخرب (Malicious Apps)، در صورتی که در صفحهٔ «نصب برنامه» این لایهٔ مجازی را مشاهده کند، به صورت اتوماتیک دکمهٔ «نصب» یا &#34;Install&#34; را غیر-فعال می‌کند. در واقع این یک برخورد امنیتی عامدانه توسط سیستم‌عامل است (Security Function). غیر-فعال کردن دکمهٔ نصب باعث می‌شود تا برنامه‌های مخرب نتوانند، برنامهٔ مخرب دیگری را در دستگاه شما، به صورت خودکار نصب کنند.برای حل این مشکل دو راه حل پیشنهاد می‌شود:راه حل اول:در دستگاه خود این برنامه‌ها را شناسایی کنید و سپس آن‌ها را حذف یا غیر-فعال (Force Stop) نمایید.راه حل دوم:در صورتی که در صفحهٔ «نصب برنامه» دکمهٔ برنامه‌های اخیر (Recent Apps) که معمولا دکمهٔ مربعی شکل کنار دکمهٔ Home (دکمهٔ دایره‌ای) است را لمس کنید و سپس مجدد همین صفحه (صفحهٔ نصب برنامه) را انتخاب کنید، دکمهٔ «نصب» یا &#34;Install&#34; فعال می‌شود. توجه کنید که ممکن است این راه‌حل در همهٔ دستگاه‌ها کارساز نباشد.حالا باید متوجه شده باشید که چرا مشکل کاربران به ساعات شبانه‌روز مربوط می‌شد. LUX Applicationهایی که بعد از ظهر نور صفحه را کم می‌کنند و در این ساعات فعال می‌شدند، این مشکل را به وجود آورده بودند :) </description><category>کمیل کمال</category><author>کمیل کمال</author><pubDate>Sat, 08 Jun 2019 13:46:09 +0430</pubDate></item><item><title>ماجرای درایورِ شبکه بهداد اسفهبد</title><link>https://virgool.ir/@kamal.komeil/behdad-qa4qcyd6593u</link><description>بهداد اسفهبددوستان خواستند که ماجرای درایورِ شبکه رو بنویسم...حوالیِ سالِ ۱۳۸۰ بود. من سالِ اول / دوّم بودم. من و روزبهِ پورنادر تو مرکز محاسباتِ دانشگاهِ شریف رو پروژه‌ی فارسی‌وب کار می‌کردیم. پنج‌شنبه‌روزی به ما یه کامپیوترِ جدید دادن که از ماشین‌هایی که داشتیم خیلی بهتر بود. تنها چیزی که گفتند این بود که قبل از اینکه پلمب‌ش رو بشکونین، تِست کنین اگه خرابه پس بفرستیم. تست کردیم، درایوِ فلاپی‌ش خراب بود، ولی برامون مهم نبود.مهم این بود که کارتِ شبکه‌ش درایور نیاز داشت و درایور روی فلاپی بود، و البته روی اینترنت هم بود، ولی رویِ خودِ ماشین نصب نبود و موجود نبود، در نتیجه به شبکه نمی‌تونستیم وصل شیم و کارتِ شبکه رو نمی‌تونستیم تست کنیم و یعنی نمی‌تونستیم پلمب رو بشکونیم و هارددیسک‌هامون رو بذاریم و خلاصه باید تا شنبه صبر می‌کردیم که یا ماشین رو پس بفرستیم، یا یه نفر که سی‌دی‌رایتِر داره پیدا کنیم این فایلِ DLL درایور رو روی سی‌دی بزنیم که بتونیم رو ماشین نصب کنیم. خلاصه فاز نمی‌داد. نیمه‌شب بود و ما کِرم‌مون گرفته بود که ماشین رو راه بندازیم تا صبح و جمعه بشینیم پاش و حالِش رو ببریم.گفتیم چه کنیم چه نکنیم، وات توو دوو وات نات توو دوو، یادِ یه تکنولوژیِ ماقبلِ کارتِ شبکه افتادیم: کابلِ لینک. خودِ کابل رو که نداشتیم ولی گفتیم درست کنیم. کابلِ لینکِ سریال ۴ / ۵ تا سیم بیشتر نمی‌خواد. جزئیاتش تو راهنمای Quick Basic بود! یه تیکه سیمِ شبکه رو لُخت کردیم و کردیم تو سولاخای پورتِ سریالِ ماشینه و یه ماشین دیگه، ولی نتونستیم ارتباط برقرار کنیم. احتمالن به خاطرِ این بود که ویندوز ۲۰۰۰ یا اون حدود داشتیم، و می‌خواستیم با nc تحتِ DOS لینک کنیم که احتمالا ویندوزِ ۲۰۰۰ اینا دوست ندارن، لاقل نه بدونِ تشریفات. به‌هرحال، از کابلِ لینکِ ناداشته هم ناامید شدیم.گفتیم تایپ کنیم. هر دو هم تاچ‌تایپیست بودیم و زیپ‌شده‌ی فایل ۴۰ کیلوبایت بود؛ چیزی نیست. تِست زدیم؛ اولا که ۴۰ک میشه ۸۰ک مبنای ۱۶ (hex)، و ۸۰ک میشه ۴۰ صفحه‌ی پر از اون صفحه‌های DOS. دوّم اینکه، با متوسط سرعتِ ۲۰۰ حرف در دقیقه، میشه ۴۰۰ دقیقه، یعنی ۷ ساعت! تازه بدونِ استراحت و به شرطِ اینکه اونی که قراره بخونه دهنش کف نکنه خفه شه! سِیُّم و مهم‌ترین اینکه، اون ۲۰۰ حرف‌دردقیقه سرعتِ تایپِ متنِ انگلیسی هست که شدیدن «زائد» (redundant) است، نه داده‌ی عملا تصادفی (خروجیِ زیپ)! خلاصه اینم خورد تو دیفال.دیگه راهِ استانداردی نمونده بود. نیمه‌شب شده بود و وقتِ این بود که بیخیال شیم بریم بخوابیم. امّا علی‌آقا هم دیگه بسته بود و کلّا فاز نمی‌داد کوتاه بیایم. رفتم پشتِ ماشین رو وارسی کردن، ببینم سولاخ دیگه چی داره! چیزی که جای انگول کردن داشته باشه یکی بیشتر پیدا نکردم، ولی همون یکی آمّا جای انگول داشت: کارتِ صدا!یه نگاه انداختم اونور اتاق رو میزِ بچه‌ها از این بلندگو جدیدا بود که ساب‌ووفر داشت. کابلِ ورودیِ صدا از کامپیوتر به این ساب‌ووفِرها از هردو طرف جدا میشد و کلّه‌گی‌ش متقارن بود. رفتم کندم کابل رو آوردم، یک سر زدم تو خروجیِ صدای ماشین بغلی، اون یکی سر تو ورودیِ صدای ماشینِ موردِ نظر. خلاصه ۵۰٪ِ قضیه حل شد، موند نرم‌افزار! یا به عبارتی موند درایور برا کارتِ صدا-تبدیل‌شده‌به-شبکه‌مون، که باهاش درایورِ کارتِ شبکه‌ی واقعی رو منتقل کنیم. «We need to go deeper»خُب اوّل گفتم ظرفیتِ انتقال صدا رو برقرار و تست کنیم. یه هایده اون‌ور با Windows Media Player پخش کردیم، این‌ور با Windows Voice Recorder ضبط کردیم. درست اومد و پخش شد. تنظیمات ضبط رو هم گذاشتیم ۴۴۱۰۰هرتز مونو ۸بیت. فایل خروجی هم WAV بود که یه هِدِرِ ساده‌ست و داده‌ی خام. این از این.به عنوانِ المپیادیِ متعهد CD توربوپاسکال و ابزارهای متفرقه همیشه همرام بود. کامپایلر رو راه انداختیم رو هر دو سیستم.قسمت بعد تبدیلِ داده‌ی ورودی (فایلِ زیپ‌شده‌ی درایورِ شبکه) به فایلِ صوتی بود برای انتقال، و البته دریافت و بازیافت‌ش طرفِ دیگر!یه گوگلِ مختصر کردم (اون موقع هنوز «گوگل کردن» واردِ لغت‌نامه نشده بود!) و ۳۰ خط کد نوشتم که به ازای هر بیت (bit) از فایل ورودی، ۱۰۰ تا نمونه‌ی (sample) خروجی تولید کنه: اگه بیتِ ورودی صفر بود، خروجی همه صفر، وگرنه خروجی نُتِ «لا» مرجع، یعنی موجِ سینوسی با فرکانس ۴۴۰ هرتز. این از این.یه جمله تست زدیم، فرستادیم اونور. روزبه اونور نشسته بود پشتِ پاسکال و من دیکته می‌کردم براش. گفت من بیلمیرم چیکارش کنه این داده رو، گفتم تو تایپ کن: یه مشتق میگیریم اول: اختلاف هر نمونه با قبلیش رو حساب کن؛ بعد اگه قدرمطلقش از ۴ بزرگ‌تر بود بنویس یک، وگرنه بنویس صفر. بعد هر صد تا نمونه رو بگیر، «اکثریت» (majority) بگیر و بنویس تو خروجی. این میشه داده‌ی ما، اگه همه چی مثِ آدمیزاد بی‌نقص(!!) منتقل می‌شد این جواب بود. «اگه»...مشکلِ اول این بود که ابتدای داده رو از کجا پیدا کنیم. در نتیجه یه چندین بیت ۰ و یه ۱ سرِ داده گذاشتم که علامتِ شروع باشه،و تو دیکُدِر (decoder) دنبالِ این الگو گشتم. مشکلِ دوم این بود که دو سه بیت درست دیکُد میشد بعد گاطی‌پاتی میشد. برای اینکه قابلیتِ اطمینان بالا بره، هر بیت رو کردم ۲۰۰ نمونه به جای ۱۰۰ تا، و برای تسهیلِ تقطیع (!!) هر طرفِ هر بیت ۱۰۰ تا نمونه هم صفر زدم. اون طرف هنوز همون مثِ قبل دیکُد می‌کردیم، ولی حالا برای هر بیت، چهار بیت می‌رسید که انتظار داشتیم اولی و آخری صفر باشن (جداکننده‌ها)، و دوتا وسطی داده‌مون، و انتظار داشتیم دوتاشون یه مقدار داشته باشن. توی کد ولی، اگه هرکدوم از وسطی‌ها روشن بود، خروجی رو روشن اعلام می‌کردیم.تِست زدیم. چند کلمه می‌رفت بعد قاطی می‌شد. برای اینکه بفهمم چه خبره، قبل از اون تبدیلِ آخر، خروجی رو با حروفِ 0 و 1 نوشتم و نگاه کردم. دیدم این ترکیبی که باید چنین جوری باشه:01100000000001100110011001100110011000000000011000000110011000000110011000000110...یعنی از هر چهارتا، اولی و آخری صفر باشه و دوتا وسط یه‌جور، بعد از چند خط شیفت پیدا میکنه، یعنی مثلا میشه:011000000000011001100110011001100110000000000110000001100110000001100110000001100000110011001100000011000000110000001100...این معنی‌ش اینه که فرکانس کارتِ صدای ماشینی که می‌خونه، با اونی که ضبط می‌کنه هردو دقیقن ۴۴۱۰۰ هرتز نیست. در واقع که خوب هیچ‌کدوم دقیقا اون نیست، ولی به‌هرحال، این‌که فرکانسِ دوتا فرق فیل‌کالینززججگگ‌ایناف که ما باید تو درایورِمون لحاظ کنیم.اون جداکننده‌ها که اضافه کرده بودیم و الکی زمانِ صدا رو دوبرابر کرده بودن حالا به کار میان: از هر چهار حرف، اولی و آخریش باید صفر باشه. دیکُدِر رو دست زدم که هروقت غیر از این دید خودش رو تنظیم کنه. یعنی اگه حرف اول خدای‌ناکرده یک بود، بفهمه که تُند رفته و حرفِ دوّم رو خونده عملا، پس یه حرف کم‌تر بخونه، و برعکس برای حرفِ چهارم.با این کار چند جمله تست‌مون بی‌نقص رفت، پس «رفتیم که داشته‌باشیم» درایورِ شبکه رو! یه حسابِ سرانگشتی:۴۰ * ۱۰۲۴ * ۸ * ۱۰۰ * ۴ ÷ ۴۴۱۰۰ ÷ ۶۰ ≈ ۵۰پنجاه دقه چُرت زدیم تا ماشینِ اوّل براش خوند و ماشینِ دوّم با جون و دل نُت ورداشت و به یاد سپُرد. فایل رو گرفتیم، آن‌زیپ کردیم، وا نشد، خطا داد. حالا چی؟!یه وارسیِ چشمی کردیم فایل رو تو nc، دیدیم کلیت‌ش درست منتقل شده و اول و آخرش هم می‌خونه، پس نشستیم غلط‌هاشو درآریم! نشستیم دونفری پای دو ماشین، من دیکته کردم، دوتایی تایپ کردیم: ۲۰ خط کد که یه فایل و دو تا عددِ شروع و پایان بگیره و جمعِ بایت‌های فایل از شروع تا پایان رو بنویسه.بعد شروع کردیم به جستجوی دودوئیِ بایت‌هایی که فایلِ من با روزبه فرق داشت... اینطور که من یه شروع و پایان می‌گفتم، جمعش رو با هم مقایسه می‌کردیم، اگه فرق داشت بازه رو دو نیم میکردیم و از اول (recurse).در کل سه بیت غلط یافتیم؛ با دست درست کردیم و فایل آن‌زیپ شد. درایورِ شبکه نصب و کارتِ شبکه تِست شد! کابلِ صدا رو به بلندگویی که بهش تعلق داشت برگردوندیم، ماشینِ جدیدمون رو خاموش کردیم، چاییِ آخر رو زدیم، و چون دیگه ۷ِ صبح شده بود، از مرکز زدیم بیرون که بریم بخوابیم.این بود ماجرای درایوِرِ شبکه. چند نکته‌ی آموزشی از این داستان به نظرِ من (پس از پونزده سال) درباره‌ی حل کردنِ مسئله:۱. من نه مامانم تاحالا درایورِ مودِم نوشته بود نه بابام نه درسش رو خونده بودم نه چیزی، روزبه هم احتمالا همین‌طور. ولی با برخوردِ سیستماتیک، مسئله رو خورد کردیم به تیکه‌هایی که هرکدوم رو می‌دونستیم چه‌جوری حل کنیم.۲. هنگام دیباگ کردنِ یه مسئله، شدیدا کمک می‌کنه اگه بتونی ویژوآلیزِیشِنِ (visualization) درست درآری. در اینجور مواقع، قدرتِ سیستمِ بینائیِ انسان تو کسری از ثانیه ناشی به درکی میشه که بدونِ این روش می‌تونه به‌دست‌آوردنش ساعت‌ها طول بکشه.۳. شاید خیلی پایه‌ای تر، مهمّه که یاد بگیرین هر بار که گفتین «کار نمیکنه»، چجوری پیش برین. در واقع همیشه این کار به این می‌انجامه که قسمتی که کار نمیکنه رو به تکه‌های متعدد تقسیم کنین و یکی‌یکی اون‌ها رو تست کنین تا دایره‌ی ظنّ رو کاهش بدین تا وقتی که مشکل بدیهی بشه.۴. هر راه‌حلّی یه مصالحه (tradeoff) هست. در این مورد، ما بینِ پیچیدگی و درنتیجه زمانِ پیاده‌سازیِ الگوریتم‌های coder و decoder از یک‌طرف، و طولِ فایلِ صوتیِ حاصل تعادل برقرار کردیم. طوری که وقتی راه‌حل به جایی رسید که فایلِ صوتی پنجاه دقیقه شد، به جای اینکه سه ساعت وقت بذاریم از پنجاه دقیقه بکنیم‌ش ۵ دقیقه، قبول کردیم که سریع‌تره که همین ۵۰دقه‌ای رو بفرستیم بره. لازم نبود کوتاه‌ترین باشه، لازم بود فقط به‌اندازه‌ی کافی کوتاه باشه!یه گریزی هم این وسط بزنم: دوستی داشتیم که تو شرکتش ترجیحن دانشگاه آزادی استخدام می‌کرد و شریفی استخدام نمیکرد، پرسیدیم چرا، گفت چون شریفیه یه مسئله میدی بهش میگی دوهفته‌ای حل کن، بعدِ یه هفته حل میکنه میاره، بعدِ یه هفته دیگه میاره دو برابر سریع‌ترش کرده، بعدِ یه هفته دیگه میاره دو برابر کوچیک‌ترش کرده، بعدِ یه هفته دیگه میاره دو برابر قوی‌ترش کرده، ... دانشگاه آزادیه یه مسئله میدی بهش میگی دوهفته‌ای حل کن، بعدِ دو هفته میاره تحویل میده مسئله‌ی بعد رو میگیره میره. :))۵. ابزارِ درست رو داشتن فرقِ بینِ موفقیت و شکسته. خیلی‌ها رو میبینم که یه خروار کد رو می‌خوان دیباگ کنن، بعد اصلا ابزار و محیطِ اجرا و خلاصه مقدماتِ اینکه بتونن مسئله رو بشکونن به اجزای کوچیک‌تر ندارن. فقط می‌تونن کُلِّش رو اجرا کنن و بگن «کار نمی‌کنه».نکته: اگه به طورِ روزمرّه با کامپیوتر سروکار دارین، ابزار نوشتن باید یکی از عادات‌تون باشه. حالا ابزار می‌تونه ماکروی اِکسل باشه یا اسکریپتِ شِل یا پایتون یا کدِ سی. می‌تونه یه‌بارمصرف باشه، یا بیست سال استفاده شه. می‌تونه فقط مالِ شما بمونه، یا هزاران کاربر پیدا کنه.۶. در نهایت، شاید تایپ می‌کردیم هم همونقدر طول می‌کشید. و اصلا مهم نبود تا شنبه نفهمیم کارتِ شبکه سالمه یا نه! ولی لذّتی که تو اون شب تا صبح بردیم، تا امروز برای من تو حلِّ کمتر مسئله‌ای تکرار شده، و پونزده سال بعد دارم با جزئیات براتون می‌نویسم.۷. هروقت خواستی بگی «نمیشه»، به این فکر کن که چرا نمیشه؟ می‌تونی ثابت کنی که نمیشه؟ یکی از چیزهای دیگه که تو این پونزده سال یاد گرفتم اینه که وقتی بقیه میگن «نمیشه»، به حرف‌شون توجه نکنم. در اکثر موارد نتیجه این شده که نشون دادم که میشه.۸. من بیشتر با این‌جور بازی‌ها و کِرم‌ها چیز یاد گرفتم تا سرِ کلاسِ درس!حدودِ ده سال بعد از این ماجرا، روزبه یه تی‌شرت با طرحِ زیر برام فرستاد، دستش درد نکنه، خوب روزایی بودمنبع: https://www.facebook.com/behdad/posts/10156172852130604</description><category>کمیل کمال</category><author>کمیل کمال</author><pubDate>Sun, 19 May 2019 17:20:45 +0430</pubDate></item><item><title>بررسی خطای Blocked By Play Protect در هنگام نصب برنامه در اندروید</title><link>https://virgool.ir/myket-appstore/google-play-protect-bza4txlf75sv</link><description>سپر ایمنی Play مقدمهاز چندی پیش با توجه به به‌روز شدن قوانین نصب برنامه‌ها در گوگل‌پلی و بررسی برنامه‌ها توسط Play Protect (سِپر ایمنی پلی)، گزارش‌هایی از توسعه‌دهندگان و کاربران دریافت کردیم و بر آن شدیم که این مطلب را برای کمک بیشتر به توسعه‌دهندگان ایرانی منتشر کنیم.هدف Play Protect امن کردن برنامه‌هایی است که روی دستگاه‌های اندرویدی در دنیا در حال نصب شدن است. می‌توان گفت گوگل یک سامانهٔ جامع برای مبارزه با برنامه‌ها، وب‌سایت‌ها و هر چیز مخربی که دستگاه‌های اندرویدی رو تهدید می‌کند، ایجاد کرده که این فضا رو برای کاربرانش امن‌تر نماید.مایکت هم برنامه‌هایی که با این‌گونه خطاها مواجه می‌شوند را در فرایند بررسی (قبل از انتشار برنامه) و با گزارش کاربران (بعد از انتشار برنامه)، رد یا غیرفعال می‌کند و به توسعه‌دهندگان اطلاع می‌دهد که این مشکل را حل کنند.بررسی انواع خطاهادر حال حاضر نحوهٔ بررسی برنامه‌ها در این سیستم شفاف نیست و ممکن است برنامهٔ شما بدون هیچ قصد و منظوری در لیست سیاه قرار بگیرد. به طور کلی بررسی برنامه‌ها توسط Play Protect به دو روش انجام می‌گیرد: خطاهای هنگام نصب: این دسته از خطاها معیارهای کلی گوگل‌پلی را در لحظه نصب با بررسی apk برنامهٔ شما، نقض می‌کند و بلافاصله  به کاربر خطا می‌دهد. به عنوان مثال خطای «توسعه‌دهنده ناشناخته» از این دسته است که در ادامه بیشتر توضیح داده می‌شود.خطاهایی که با مرور زمان به وجود می‌آیند: این دسته از خطاها پس از نصب برنامه روی چندین دستگاه و رصد برنامه در طول زمان به وجود می‌آید. حتی مشاهده شده که برنامه‌ای بعد از ۲۰ هزار نصب شامل نقض قوانین شده. همچنین ممکن است که این خطاها با گزارش کاربران به گوگل رخ بدهد و برنامه‌ای که مدت‌ها بدون مشکل فعال بوده، وارد لیست سیاه سپر ایمنی Play شود. به عنوان مثال برنامه‌هایی که اطلاعاتی را از دستگاه کاربر برای سروری ارسال می‌کنند، مورد بررسی قرار می‌گیرند و پس از مدتی با این خطا مواجه می‌شوند.برخورد Play Protect با خطاها، متفاوت است. مثلا بعضی خطاها فقط هنگام نصب نمایش داده می‌شود، برخی را با دکمهٔ Install anyway می‌توان نصب کرد، در بعضی از موارد از طریق نوتیفیکیشن به کاربر خبر می‌دهد و حتی در موارد محدودی گوگل به صورت خودکار برنامه‌ را از دستگاه کاربرانش حذف می‌کند (تلگرام طلایی و ...).برای آشنایی بیشتر با نحوهٔ ساز و کار این سرویس مستند Play Protect را از اینجا ببینید.خطای توسعه‌دهنده ناشناخته (Unknown Developer)«سپر ایمنی Play، برنامه‌نویس این برنامه را نمی‌شناسد. برنامه‌هایی که برنامه‌نویس ناشناخته دارند، گاهی اوقات می‌توانند ناامن باشند» یکی از شایع‌ترین موارد، خطای توسعه‌دهنده ناشناخته یا Unknown Developer است که در دستهٔ خطاهای  لحظه‌ای در هنگام نصب به شمار می‌آید. در این خطا گوگل حساب توسعه‌دهندگی شما نمی‌شناسد و به کاربر اطلاع می‌دهد که این برنامه توسط توسعه‌دهندهٔ ناشناس روی دستگاه شما در حال نصب است.ابتدا دقت کنید که سپر ایمنی Play توسعه‌دهنده‌ها را از روی امضای (Sign) برنامه‌ها می‌شناسد، بنابراین در مرحلهٔ ساخت امضا موارد زیر را رعایت کنید:همهٔ فیلد‌های فرم ساخت امضا در Android Studio را با دقت پر کنید:صفحهٔ ساخت امضا در اندروید استودیوفیلد Alias: نام مستعارفیلد Password: رمز کلیدفیلد Confirm: تایید رمز وارد شدهفیلد Validity: تاریخ انقضافیلد First and Last Name: نام و نام خانوادگیفیلد Organizational Unit: سمت سازمانیفیلد Organization: نام سازمان یا شرکتفیلد City or Locality: محل سکونتفیلد State or Province: استانفیلد Country Code: کد کشور را IR وارد نمایید.به طور کلی دو روش برای رفع این مشکل وجود دارد:۱. در صورتی که برنامهٔ خود را با همین امضا روی Google Play قرار دهید، امضای شما شناخته می‌شود و این مشکل به وجود نمی‌آید. این راه مطمئن‌ترین و قطعی‌ترین راه ممکن است ولی برای همهٔ توسعه‌دهندگان مقدور نیست.۲. می‌توانید با استفاده از فرم Play Protect Appeals امضای خود را به گوگل معرفی کنید.Play Protect Appealsفیلد Email address: آدرس ایمیلفیلد Developer name: نام توسعه‌دهندهفیلد Application package name : نام بستۀ برنامهفیلد URL to download your APK file: آدرس لینک مستقیم دانلود برنامه. در این فیلد باید apk برنامهٔ خود را در جایی آپلود کنید تا تیم بررسی گوگل بتواند فایل برنامه شما را دانلود کند. بهتر است از دامین برنامهٔ خود استفاده کنید ولی در صورتی که وب‌سایت ندارید از سرویس‌های نظیر فایل استفاده کنید.فیلد Additional information to support your appeal: توضیحی در مورد برنامه به زبان انگلیسیبعد از تکمیل اطلاعات و Submit کردن فرم باید پیامی مشابه زیر دریافت کنید:&#34;We have successfully received the appeal for your app, Our team will review the app an any information you have provided&#34;توجه کنید که بررسی برنامه شما ممکن از تا یک هفته طول بکشد. در این مدت Sign و Package Name برنامه خود را تغییر ندهید و منتظر بمانید. همچنین پس از بررسی، گوگل به شما هیچ خبری نمی‌دهد و باید بعد از چند روز نصب برنامه خود را در دستگاهی که به اینترنت متصل است و سرویس Google Play Protect فعال دارد، تست کنید.نکاتی که باید رعایت کنید:به صورت کلی باید موارد زیر را رعایت کنید:مقدار targetSdkVersion برنامهٔ خود را بزرگ‌تر مساوی با 26 (اندروید 8.0) نگه دارید. در صورتی که از API پایین‌تر از 26 استفاده می‌کنید، این مقدار را به 26 یا بیشتر ارتقا دهید. توجه کنید که قبل از تغییر این مقدار، مستندات تغییر رفتار اندروید در نسخه‌های مختلف را مطالعه کنید. در اینجا می‌توانید مستند تغییر به targetSdkVersion نسخهٔ 26 را ببینید.هیچ URL با پروتکل HTTP در برنامه به کار نبرید و تمام ارتباط‌های خود را با HTTPS برقرار کنید. برای اطلاعات بیشتر اینجا را ببینید.دسترسی‌ها (Permissions) برنامهٔ خود و کتابخانه‌هایی که استفاده می‌کنید را بررسی کنید و در صورت امکان دسترسی‌های اضافه را حذف نمایید.از کتابخانه‌های ناشناس استفاده نکنید و پس از استفاده از هر کتابخانه‌ای Manifest نهایی برنامهٔ خود را مرور کنید. برای نحوهٔ مشاهدهٔ Manifest نهایی اینجا را ببینید.حساسیت زیادی به برنامه‌های Multi-Process وجود دارد. چک کنید که در صورت امکان برنامهٔ شما Single-Process باشد. برای آشنایی بیشتر اینجا را ببینید.در برنامهٔ خود از دستورات Root و Unix Commands استفاده نکنید. گوگل حساسیت زیادی به کدهای بدون APIی مجاز دارد.برنامهٔ شما نباید شامل برنامهٔ دیگری باشد و یا برنامهٔ دیگری را دانلود و یا نصب کند.برنامهٔ شما نباید بدون اجازهٔ کاربر Shortcutی برای اجرای برنامهٔ خود یا دیگر برنامه‌ها در دستگاه کاربر ایجاد کند.نتیجه‌گیریبا توجه به اینکه اخیراً رفتار برنامه‌های اندرویدی بیشتر رصد می‌شود، نیاز است تا توسعه‌دهندگان این حوزه حساسیت بیشتری در رعایت اصول و قوانین گوگل نشان دهند. همچنین باید کتابخانه‌ها، SDKها و... را قبل از پیاده‌سازی بیشتر بررسی کرد تا رفتار آن‌ها در کنار برنامهٔ شما از دید گوگل مشکوک به نظر نرسد. توجه کنید که به‌روز نگه داشتن targetSdkVersion هم می‌تواند کمک زیادی برای حل این‌گونه مشکلات بکند.</description><category>کمیل کمال</category><author>کمیل کمال</author><pubDate>Mon, 13 May 2019 19:08:02 +0430</pubDate></item><item><title>فرار از تحریم داکر با کمک کشور چین!</title><link>https://virgool.ir/fsf-linux/docker-mirror-lf3lb5ujlyhf</link><description>همان‌طور که می‌دونید داکر ایران رو تحریم کرده. هر چند که در دوران پسابرجام روزنه‌های امیدی برای رفع این تحریم پیدا شد، ولی با توجه به وضعیت فعلی، امیدی به حل شدن این مشکل نیست. از طرفی هم گزارش‌های زیادی از اینکه استفاده از Proxy سرعت دانلود Imageهای رو کم می‌کنه و کلا فرایند Pull کردن رو با مشکل مواجعه کرده، داشتم. خلاصه تصمیم گرفتم که تجربهٔ خودم رو قالب این پست منتشر کنم.من از Mirror Server کشور چین (https://registry.docker-cn.com) استفاده می‌کنم و در حال حاضر (آذر ۹۷) این سرور، ایران رو تحریم نکرده:curl -I https://registry.docker-cn.com&#xA;HTTP/2 200&#xA;server: Tengine&#xA;date: Wed, 28 Nov 2018 09:15:53 GMT&#xA;content-type: text/plain; charset=utf-8&#xA;vary: Accept-Encoding cache-control: no-cacheبرای اضافه کردن این Mirror Server مراحل زیر رو دنبال کنید: فایل daemon.json را در آدرس /etc/docker/ ایجاد کنید:sudo touch /etc/docker/daemon.json۲. جزئیات زیر رو توی فایل بنویسید:{&#xA;    &#34;registry-mirrors&#34;: [&#34;https://registry.docker-cn.com&#34;]&#xA;}۳. دیمون systemctl رو Reload کنید:sudo systemctl daemon-reload۴. سرویس docker رو Restart کنید:sudo service docker restart</description><category>کمیل کمال</category><author>کمیل کمال</author><pubDate>Wed, 28 Nov 2018 15:17:25 +0330</pubDate></item></channel></rss>