هدف تسلا این نیست که یک شرکت خودروسازی رقابتی باشد. هدف ماسک برای تسلا به وضوح بیان شده است: برای تسریع انتقال به انرژی های تجدیدپذیر.

جمعه 29 مرداد 1400
11:00
علیرضا ایرانی

هدف تسلا این نیست که یک شرکت خودروسازی رقابتی باشد. هدف ماسک برای تسلا به وضوح بیان شده است: برای تسریع انتقال به انرژی های تجدیدپذیر.

برای موفقیت این هدف ، تسلا فقط باید تولیدکنندگان دیگر را مجبور کند تا به سراغ خودروهای برقی بروند ، زودتر از آنچه که خودشان می خواهند. به این امر آنها را مجبور می کند با نشان دادن این که پول زیادی از سرمایه گذاران به این قول می رسد. از این نظر ، مری و کارلوس پیشنهاد الون را انجام می دهند ، زیرا اکثر شرکت های بزرگ خودروسازی با عجله به برق تبدیل می شوند. تا زمانی که خودروهای برقی این کار را انجام دهند ، تسلا نیازی به کسب سهم قابل توجهی از بازار ندارد. این سیاره از شما تشکر می کند که اجازه داده اید حرص و طمع تنگ نظر شما شما را فریب دهد تا به همنوع خود کمک کنید. و اگر این استراتژی را درک می کنید ، به هر حال سرمایه گذاری کنید. این شگفت انگیزترین ترفندهای مخفیانه ای است که تا کنون کسی به نفع بشریت به کار برده است ، تماشای آن سرگرم کننده است و نمونه ای نادر از نیکوکاری واقعاً م .ثر است.


20 عکاس اینستاگرامی که باید در سال 2019 دنبال کنید
[ بازدید : 21 ] [ امتیاز : 3 ] [ نظر شما :
]

20 عکاس اینستاگرامی که باید در سال 2019 دنبال کنید

دوشنبه 14 تير 1400
13:50
علیرضا ایرانی

20 عکاس اینستاگرامی که باید در سال 2019 دنبال کنید

روزهایی که برای دیدن عکاسی الهام بخش و قابل تأمل مجبور به بازدید از یک گالری یا موزه هنری شدید ، گذشته است. در عوض ، افراد خلاق امروزی از شبکه های اجتماعی مانند اینستاگرام برای به اشتراک گذاشتن کارهای خود ، ایجاد مخاطبان خود و تعامل با طرفداران ، سایر هنرمندان و مارک ها استفاده می کنند.

حضور آنلاین به طور فزاینده ای ضروری است و اینستاگرام یک پلت فرم قابل دسترسی را ارائه می دهد که برای عکاسان واقعاً ارزشمند است. این نه تنها راهی آسان برای بازاریابی خود و کارهایشان به سازندگان ارائه می دهد ، بلکه به آماتورها و هنردوستان راهی مناسب برای کشف برخی از اصلی ترین قطعات به اشتراک گذاشته شده توسط عکاسان از سراسر جهان می دهد.

اگر شما به دنبال برخی از استعدادهای جدید برای افزودن به فید اینستاگرام خود هستید ، فهرست متشکل از عکاسان را که باید برای سال 2019 دنبال کنید ، بررسی کنید.

جورج بیرن (george_byrne)

در ابتدا با نگاهی به نظر می رسد تصاویر جورج بیرن عکاس ساکن لس آنجلس بیشتر شبیه نقاشی های انتزاعی مدرن است تا عکس. با خطوط نمایشی ، رنگهای زنده و جزئیات گرافیکی تمیز ، در مقیاس وسیع ترکیبات او الگوهای بصری را در سطح و مناظر برجسته می کند که بیشتر ما هر روز از آن چشم پوشی می کنیم - جزئیاتی که شاید برای یک تازه وارد متولد استرالیا بیشتر دیده شود ، و خانه جدید خود را با چشم تحلیلی یک مهاجر.

کارهای جورج در طیف وسیعی از نشریات بین المللی ، از جمله Vogue Australia ، گنجانده شده و در سراسر جهان به نمایش گذاشته شده است. هنوز هم بهترین راه برای همراهی با آنچه این عکاس خلاق از او عکس می گیرد دنبال کردن او در اینستاگرام است.

Humza Deas (humzadeas)

اگر همیشه می خواسته اید استفاده کنید با یک هلی کوپتر از شهر نیویورک ، پول خود را پس انداز کنید و به جای آن Humza Deas را دنبال کنید. این فیلمساز و عکاس نترس سالهاست که در NYC کاوش می کند - ابتدا با اسکیت بورد و حالا با دوربین - و مایل است برای گرفتن عکس مناسب ، از جمله مقیاس بندی ساختمان ها و پل ها برای رسیدن به زوایای گیج کننده ، خطر کند.

< p> از زمان طوفانی شدن اینستاگرام ، هومزا دیاس با مارک هایی مانند آدیداس ، بی ام و و نیویورک نیکس همکاری کرده و در جشنواره SXSW سال گذشته فیلمی با عنوان "حیوانات اجتماعی" را منتشر کرده است که ماجراهای او را در دنیای عکس های شهری دنبال می کند.

توبیاس هاگ (@ airpixels) - گرفتن تصاویر. تصاویر وی نه تنها مورد توجه بیش از 450 هزار فالوور اینستاگرام قرار گرفته است ، بلکه توسط افراد بزرگی در صنعت عکاسی مانند نشنال جئوگرافیک و Adobe مورد توجه قرار گرفته است.

و فریب نام کاربری وی را نخورید - در حالی که عکاسی از هواپیمای بدون سرنشین توبیاس هیچ چیزی ندارد ، بسیاری از عکسهای او در زمین جامد گرفته می شود.

KangHee Kim (tinycactus)

سوررئالیسم لازم نیست بیش از حد باشد تا دیدنی باشه KangHee Kim ، هنرمند کره ای یا همان tinycactus که در اینستاگرام شناخته شده است ، این را با تصاویر فریبنده و ساده کلاژ شده اش ثابت می کند - تصاویری که نظر مشتریانی مانند Santera Tequila ، American Express و Adidas و نشریاتی مانند Bloomberg Businessweek و The New York Times را به خود جلب کرده است. < /p>

KangHee با ایجاد عکسهای پیش پا افتاده از مناظر معمولی نیویورک با مناظر طبیعی و زیبا که در خارج از شهر یافت می شود ،مناظر و مناظر شهری که به نظر می رسد درست از رویا بیرون کشیده شده اند.

هنری پرستس (henrifilm)

جذاب و معمایی ، تصاویر سینمایی تاریک هنری پرستس مانند آنها به نظر می رسد به طور مستقیم از هیجان انگیز تعلیق کشیده شدند. هنری بعنوان یک عکاس هنرهای زیبا مستقر در جنوب اروپا ، فعالیت های خود را در نمایشگاه های گالری در سراسر جهان و توسط Adobe Lightroom و همچنین انتشارات مختلف برگزار کرده است.

خوراک اینستاگرام وی ، با نام کاربری henrifilm ، زیبایی شناسی را به نمایش می گذارد که می تواند مرموز و نوستالژیک باشد ، و استعداد او در استفاده حداکثر از منابع نور مصنوعی و محیطی را برای ایجاد یک فضای بسیار خاص و سازگار برجسته می کند.

Vanessa Rivera (the_life_of_aivax)

اگر به دنبال الهام هستید ، ونسا ریورا ناامید نخواهد شد. خوراک غریب او ، که در وهله اول سه فرزندش وجود دارد ، هر بار که پست می کند ، بینندگان را به یک ماجراجویی خلاقانه جدید می کشاند. او همچنین نویسنده ای با استعداد است و شعر او ، به طور معمول با عکس های زیبا از کوچولوهایش ، به طور برجسته در وبلاگ او ، زندگی Aivax ، برجسته می شود.

بیوگرافی Instagram ونسا شامل پیوندی به کانال YouTube او است ، جایی که او فیلم هایی با سرعت ویرایش را به اشتراک می گذارد که کمی از آنچه در پشت صحنه عکس های تخیلی او می گذرد را نشان می دهد. بنابراین ، نه تنها پیروان از کار خلاقانه او لذت می برند ، بلکه نکات و ترفندهایی را برای امتحان کردن تکنیک های او به تنهایی می آموزند.

کارن گکیوناسیان (fxzebra)

چیزی وجود دارد جذاب در مورد سادگی آشکار خوراک اینستاگرام کارن گکیوناسیان. این عکاس یونانی در طیف گسترده ای از نشریات آنلاین حضور داشته است ، و به همین دلیل - او از نظر رنگ ، ترکیب و الگوها چشم باور نکردنی دارد. کارن ترجیح می دهد خودش را به جای "عکس گیرنده" به عنوان "سازنده عکس" تصور کند ، تصاویر تجربی و دستکاری های دنیوی ایجاد می کند که زیبایی های معمولی و خارق العاده را به تصویر می کشد.

Tekla Evelina Severin (@ teklan)

واضح است که ، Tekla Evelina Severin عاشق رنگ است - علی رغم زندگی در استکهلم ، جایی که سبک سنتی اسکاندیناوی تحت سلطه سفید روشن است. با نام کاربری اینستاگرام teklan ، این معمار داخلی و طراح صحنه ، اشتیاق خود را کشف کرده و عکسهایی را به اشتراک می گذارد که رنگهای پر جنب و جوش را با اشکال هندسی جسورانه ترکیب می کند.

کار او ، که باعث شده عکس های سفارش داده شده او را با Urban Outfitters ، The Gourmand به دست آورد. ، و ایرفرانس ، احساس مبهمی دارد که یادآور کلیپ آرت دهه 1990 است - به بهترین وجه.

لوید مودل (loydmeudell)

آنهایی که خوش شانس نیستیم به اندازه کافی برای زندگی در کنار آب می تواند از طریق لوید مودل ، که سرگرمی اش گرفتن عشق او برای گشت و گذار در لنز دوربین خود بود ، به سختی زندگی کند. در حالی که بسیاری از سکانس های لوید در انتظار بی صبرانه شرایط مناسب می گذرد ، تصاویر بدست آمده وی کاملاً ارزش تلاش را دارد.

اکنون ، عکاس مستقر در استرالیا از خود به عنوان یک هنرمند اقیانوس یاد می کند و دیدن آن آسان است. چرا - تصاویر پویای او از موج های در حال سقوط ، انتزاع را نشان می دهد ، هم قدرت بسیار زیاد و هم زیبایی غیر قابل تغییر موج سواری را برجسته می کند.

یوشیتو هاساکا (@ _f7)

شهر پر انرژی توکیو یک زمین بازی برای عکاس و طراح ژاپنی یوشیتو هاساکا است ، که با نام کاربری _f7 در اینستاگرام پست می گذارد. عکس های او از شهر در شب مرز بین عکاسی را از بین می بردو تصویرگری ، در نتیجه عکسهای دقیق ، رنگارنگ ، تقریباً آینده نگرانه به نظر می رسد که پس زمینه مناسبی برای مانگا باشد.

اگر تا به حال می خواهید به دنیای فیلم هایی مانند ترون ، آکیرا ، یا Blade Runner ، پیمایشی از طریق خوراک اینستاگرام یوشیتو ممکن است فقط رفع نیاز شما باشد - با علائم نئون سبک ، کوچه پس کوچه های تاریک و چراغ هایی که مانند الماس در دود شهر می درخشند.

Zahava Hanuka (@ Golden2dew)

تماشای مردم یکی از لذت های کوچک زندگی است ، به ویژه در شهری مانند نیویورک. حتی از طریق لنز Zahava Hanuka ، که لحظات کاملاً متفکرانه ای را از خیابان های شهر به عنوان Golden2dew در اینستاگرام به اشتراک می گذارد ، حتی بهتر است. با لحن غنی ، بی صدا و پردازش ظریف الهام گرفته از پرنعمت ، تصاویر او احساس گرما و آشنایی می کنند. و نه تنها عکسهای زاهاوا نگاهی صمیمانه به شخصیت افراد با دقت انتخاب شده نشان می دهد ، بلکه شخصیت بی انتها و نمادین نیویورک را نیز خود به نمایش می گذارد.

Andria Darius Pancrazi (pancrazi)

مخفی نیست که آندریا داریوش پانکرازی به رنگ صورتی کشیده شده است - خبر فوری اینستاگرام او با آن پوشانده شده است. اما این روشی است که او با هنرآمیزی این رنگ امضا را به نمایش می گذارد و باعث می شود که عکس های اغلب اوضاع دو رنگش جالب باشد. با وجود لحن های تکراری ، هیچ دو تصویر یکسان به نظر نمی رسند.

پس از مدتی صرف بررسی دقیق ترکیبات و پالت رنگی جذاب آندریا ، احتمالاً خواهید دید که دیوارهای صورتی ، خطوط تمیز و سایه های دراماتیک به هر کجا که بروید.

مارک فوربس (_markforbes_)

عکاس استرالیایی برنده جایزه ، مارک فوربس ، با همکاری با مارک های معروف مانند سامسونگ ، مرسدس بنز و جگوار امرار معاش می کند ، اما او فید اینستاگرام خود را به عنوان "عکس هایی از فیلم در ذهن من" توصیف می کند. مارک با سبک سینمایی بسیار خود ، لحظاتی مستند مانند را به گونه ای ضبط می کند که فوراً یک داستان را با هم ارتباط برقرار می کند - اگر تصویری دیگر که به همان اندازه گیرا برای جلب توجه شما در کنار آن وجود نداشته باشد ، احتمالاً بدتان نمی آید بیشتر جستجو کنید. < /p>

یان هوورث (ihoworth)

در اینستاگرام با عنوان ihoworth شناخته می شود ، یان هوورث با استفاده از دوربین خود زیبایی ظریف روزمره را ثبت می کند - اما بدون اسراف در زندگی مدرن. در عوض ، یان با نگاهی نوستالژیک به دنیای پیش پا افتاده ، بر مضامین و خاطرات قابل تشخیص جهانی تمرکز می کند و آنها را به روشی ساده و سینمایی ثبت می کند. ایان با زیبایی شناسی به سبک قدیمی ، داستان های آشنایی را از طریق تصاویر درون نگرانه خود بیان می کند.

آلسیو آلبی (alessioalbi) برداشتن دوربین و توجه به جزئیاتی که از طریق این تجربه به دست آورد ، نتیجه داد. پرتره های قدرتمند آلسیو با نورپردازی دقیق ، سایه های چشمگیر و ترکیب بندی های خوش ساخت ، نگاهی صمیمی به زندگی و شخصیت سوژه های او فراهم می کند - و شاهدی بر استعداد مرد پشت لنز است.

هنری دو (henry_do) در حال حاضر ، هنری در سراسر جهان حرکت می کند و برای مشتریانی مانند CNN ، National Geographic ، Olympus ، Hilton ، Daniel Wellington ، BMW و Maverick Helicopters تیراندازی می کند. علاقه او به کاوش در مقصد جدید در تصاویر فریبنده ای که در اینستاگرام به اشتراک می گذارد و به او نشان می دهد ، منعکس می شودپیروان فرصتی برای گشت و گذار در دنیا از طریق صفحه نمایش تلفن های هوشمند خود دارند.

جیمز و کارلا موری (jamesandkarla)

این زوج زن و شوهر مظهر اهداف رابطه هستند. این زوج به عنوان عکاس معماری و داخلی و هنرمندان چند رسانه ای ، تعدادی کتاب میز قهوه خیره کننده را منتشر کرده اند که مورد تحسین منتقدان قرار گرفته اند و تصاویر شامل مجموعه های دائمی برخی از موسسات مهم هنری نیویورک است.

< p> و در اینستاگرام ، آنها عکسهای سری Store Store خود را به نمایش می گذارند - چهره ناپدید شده شهر نیویورک را مستند می کنند. مرور خوراک آنها مانند گشت و گذار در تاریخ رنگارنگ شهر است ، و احساس می کنید از تلاشی که برای حفظ آن انجام می دهند احساس سپاس می کنید.

Mária Švarbová (@ maria.svarbova)

عکاس اسلواکی معتبر بین المللی ، ماریا آواربوا سبک متمایزی از تصویرگری را توسعه داده است که با مفاهیم سنتی رنگ ، فضا و روحیه بازی می کند. به طور معمول ، تصاویر او فضاهای عمومی - به ویژه استخرهای شنای خشن - با اشاراتی از معماری دوران سوسیالیست را نشان می دهد ، با چشم مدرن و فضای خنکی جدا شده تقریباً رویایی به نظر می رسد ، حتی اگر عکس های او برخی از عناصر معمولی تر را نشان دهد زندگی روزمره.

Konsta Punkka (kpunkka)

Konsta Punkka ، عکاس و سخنران مقیم فنلاند ، زمزمه سنجاب خودآزاری است ، و راه او با حیوانات از بالا مشخص است پرتره های بسته و شخصی خرس ها ، جغدها ، روباه ها ، راکون ها و موارد دیگر که اکثر خوراک او را تشکیل می دهند. Konsta با نمایش این موجودات زیبا در زیستگاه های طبیعی خود ، چیزی فراتر از چهره های دوستانه آنها را به تصویر می کشد - او آنها را از طریق لنز دوربین خود زنده می کند.

تصاویری که وی از منظره شمال اروپا به اشتراک می گذارد به تنهایی الهام بخش است.

Signe Bay (signebay) خانه مادربزرگ احساس می شود - روستایی ، دنج ، و پر از غذاهای زیبا و زیبا و گل های زیبا. گرچه ممکن است مفهوم نوردیک hygge چند سال پیش کاملاً عصبانی باشد ، اما این سنت بی انتها و راحت از طریق سبک و خنک اسکاندیناوی و بافت های گرم که تصاویر Signe را بسیار مقاوم می کند ، ادامه می دهد.

به عنوان یک مدیر خلاق و صاحب سبک ، سیگن هنر ترکیب بندی را مانند پشت دست خود می داند و توانایی او در دستکاری نور هیچ چیزی نیست. بیشتر پست های جوی او در اینستاگرام - به طرز چشمگیری - از طریق آیفون شلیک شده است و او توانسته است توجه جهانی را به خود جلب کند افرادی که قصد دارند با کمی گرما و شادی اضافی متمایل به افراط شوند.

آیا هنوز احساس الهام می کنید؟ ؟ امیدوارم ، لیست ما برای تماشای عکاسان اینستاگرام به شما کمک کند تا زمانی را که شما در پلتفرم رسانه های اجتماعی می گذرانید جذاب تر ، پربارتر و لذت بخش تر شود. و اگر به دنبال روش هایی برای ایجاد خلاقیت خود هستید ، PHLEARN را برای دوز منظم محتوای تخیل دنبال کنید.

در اصل در phlearn.com منتشر شده است.


اینستاگرام ، یوتیوب و TikTok تمام کارهای سخت را انجام داده اند ، Weentar به سادگی اجازه می دهد افراد با نفوذ در این سیستم عامل ها ارزش بیشتری برای مارک خود بدست آورند.
[ بازدید : 22 ] [ امتیاز : 3 ] [ نظر شما :
]

اینستاگرام ، یوتیوب و TikTok تمام کارهای سخت را انجام داده اند ، Weentar به سادگی اجازه می دهد افراد با نفوذ در این سیستم عامل ها ارزش بیشتری برای م

دوشنبه 14 تير 1400
13:38
علیرضا ایرانی

اینستاگرام ، یوتیوب و TikTok تمام کارهای سخت را انجام داده اند ، Weentar به سادگی اجازه می دهد افراد با نفوذ در این سیستم عامل ها ارزش بیشتری برای مارک خود بدست آورند.

استراتژی Weentar ساده است. برنامه غیرمتمرکز رسانه های اجتماعی خود را راه اندازی کنید ، همه افراد محبوب را به برنامه بفرستید و با این کار فضای رمز ارز را بیشتر به جریان اصلی بکشید. این یک هدف بزرگ است و ما برای آن آماده هستیم ، در واقع با ظهور NFT ها و جریان اصلی تر این است که آنچه در این مرحله مورد نیاز است آنچه که ما ارائه خواهیم داد و این بازی سازی اکوسیستم است. گنگ کردن بسیار مورد نیاز که اجازه می دهد فضا با تعداد بیشتری از افراد معمولاً پر شود. این برنامه است.

هدف ما از سال 2021 راه اندازی یک برنامه و به دست آوردن اولین 500 سازنده است. آنها افراد مشهور و سازنده ای هستند که برنامه ما را برای مخاطبان عادی بیشتر نرمال می کنند. ما با این گروه نمونه آزمایش بتا خواهیم کرد. زیر و بم ما ساده است ، سازندگان به سادگی ارزش بیشتری برای زمان و خلاقیت در سیستم عامل Weentar کسب می کنند. از راه اندازی ارز دیجیتال خود در سیستم عامل با ثبت نام تا امکان تولید محتوای خود به عنوان NFT ، آنها می توانند اقتصاد خرد خود را ایجاد کنند که نه تنها برای خودشان بلکه برای پیروانشان نیز سود کسب کند. برنامه های محبوب رسانه های اجتماعی تمام کارهای سنگین را برای ما انجام داده اند زیرا انتخاب اولین تأثیرگذار آسان تر شده است.

به عنوان مثال ما با کایلی جنر شریک هستیم ، و او در مورد سیستم عامل ما با او صحبت می کند 200 میلیون پیرو ، به آنها امکان خرید ارز دیجیتال خود را می دهد و همچنین از حق محتوای خود مباهات می کند ، زیرا اکنون NFT است که در بلاک چین ما نوشته شده است. غیر منطقی نیست که ببینیم سازندگان از سرمایه بازار میلیارد دلاری بر روی سیستم عامل برخوردار هستند. سازندگان و جوامع آنها قدرت زیادی را در اختیار دارند و سپس می توانند در مورد چگونگی استفاده از این قدرت رای دهند. مشارکت در اینفلوئنسرها و فضاهای مشهور هالیوود. هدف این است که قبل از راه اندازی ، افرادی را که با چشم انداز آشنا هستند ، آشنا کنیم. اینگونه است که ما امیدواریم بازار را تسخیر کنیم. بنابراین ما تعجب نمی کند که یک پلتفرم که بتواند شکاف بین ارز رمزنگاری شده و افراد مشهور را برطرف کند در نهایت هیجان انگیزترین پلت فرم در این فضا برای آینده قابل توجه خواهد بود. همه در مورد پروژه خود صحبت می کنند ، اما با توجه به ماهیت فن آوری های موجود در دسترس ما و آنچه که امیدواریم بتوانیم با آن انجام دهیم ، مدل تبلیغاتی پرداخت تبلیغات متمرکز بصورت جزئی برای تأثیرگذاران در پلتفرمی مانند YouTube (اینستاگرام ، فیس بوک و توییتر به شما هیچ هزینه ای نمی دهد) فراتر از عجله دوپامین که یک نظر یا مانند آن است ، کمتر جذاب می شود. اینفلوئنسرها و طرفداران بیشتر به دست می آورندبرای وقت خود در یک برنامه غیرمتمرکز ارزش قائل شوید.

در حالی که ما سه مرحله پیش فروش را اعلام می کنیم ، برخی از مشارکت های فنی و مشهور را اعلام خواهیم کرد ، ما می خواهیم همه سرمایه گذاران ما بدانند که نه تنها قادر به تأمین هزینه های خود هستیم قول می دهم اما امیدواریم که در ماه های آینده آنها را پشت سر بگذاریم. بازار برای برخی از جریانهای اصلی پذیرفته شده است. ما می دانیم که پلتفرم ما بهتر از سایر برنامه ها این کار را انجام می دهد و باعث ایجاد آنچه ما رسانه های اجتماعی 3.0 می نامیم می شود.

با ساخت این آینده به ما بپیوندید.

پیش فروش Weentar به این ترتیب است در تاریخ 20 آوریل 2021 در وب سایت ما زندگی می کنند. با ما همراه باشید تا سفر خود را برای تمرکززدایی از شبکه های اجتماعی و ایجاد مشوق های اقتصادی بی نظیر برای کاربران و سازندگان آغاز کنیم.

وب سایت.

www.weentar.com

دستگیره های اجتماعی.

توییتر: https://twitter.com/WEENTARcom

اینستاگرام: https://www.instagram.com/weentar/

Tiktok : https://www.tiktok.com/@weentar

تلگرام: https://t.me/weentarcom


Open Sourcing IGListKit
[ بازدید : 26 ] [ امتیاز : 3 ] [ نظر شما :
]

Open Sourcing IGListKit

دوشنبه 14 تير 1400
13:37
علیرضا ایرانی

Open Sourcing IGListKit

امروز ، ما خوشحالیم که اعلام می کنیم یکی از چارچوب های اصلی اینستاگرام: IGListKit را در اختیار منبع قرار می دهیم این چارچوب نحوه دریافت داده ها از سرور و تبدیل آنها به لیست های سریع و انعطاف پذیر را تأمین می کند. برای انجام این کار ، ما یک معماری UICollectionView داده محور را با یک الگوریتم متفاوت پیشرفته ترکیب کردیم. با استفاده از این راه اندازی ، ابزاری ایجاد کردیم که به شما اجازه می دهد مهندسان با سطح مختلف تجربه به سرعت و با خیال راحت در اینستاگرام کار کنند. خارج از اینستاگرام ، IGListKit می تواند به هر کسی که در حال تهیه لیست است کمک کند تا از تنظیمات خسته کننده و مستعد خطا عبور کند و از یکی از سریعترین الگوریتم های موجود برای iOS استفاده کند.

سابقه

IGListKit بود ایجاد شده برای بهبود ثبات اینستاگرام و افزایش سرعت کار تیم مهندسی ما. قبل از IGListKit ، اینستاگرام با معماری معمول در برنامه های بزرگتر روبرو بود: کنترل کننده نمایش عظیم. علاوه بر این ، ما بیش از حد از ارث رنج می بریم. ایجاد یک تغییر واحد در یک شی sometimes گاهی اوقات نیاز به ایجاد تغییراتی در همه چیزهایی که از آن به ارث رسیده است. ">

ما در سال گذشته بسیاری از اجزای متصل شده خود را به اشیا smaller کوچکتر و قابل استفاده مجدد تقسیم کردیم. پس از این ، ما با نصب IGListKit قوی تر ، تنظیم سنتی UICollectionView خود را جایگزین کردیم. هر بخش در IGListKit توسط یک IGListSectionController طراحی می شود. این اشیا a یک پروتکل مورد نیاز ، IGListSectionType را با روشهایی که سلولها و رفتارهای بخش را تأمین می کنند ، پیاده سازی می کنند. به عنوان مثال ، بخشی با یک سلول منفرد توسط String data:

 class LabelSectionController: IGListSectionController، IGListSectionType {
  var object: رشته؟
  
  func numberOfItems () -> UInt {
    بازگشت 1
  } 
 func cellForItem (at index: Int) -> UICollectionViewCell {
    let cell = collectionContext! .dequeueReusableCell (از: LabelCell. self ،
        برای: خود ، در: شاخص) به عنوان! LabelCell
    cell.label.text = شی
    سلول بازگشتی
  } 
 func didUpdate (برای اعتراض: هرگونه) {
    self.object = شی as به عنوان؟ رشته
  } 
 //و غیره
} 

برای درایو UICollectionView پشتیبان ، IGListKit از شیئی به نام IGListAdapter برای تبدیل آرایه ای از داده ها به کنترل کننده های بخش استفاده می کند. IGListAdapter سلول هایی را که بعداً به نمای مجموعه ختم می شوند برمی گرداند. سپس پیاده سازی ها به منبع داده آداپتور متصل می شوند تا در صورت درخواست داده ها و بخش های کنترل کننده ، بازگردانده شوند:

 func objectsForListAdapter (listAdapter: IGListAdapter) -> [IGListDiffable] {
  //این می تواند هر چیزی باشد!
  Return ["Foo" ، "Bar" ، 42 ، "Biz"]
} 
 func listAdapter (listAdapter: IGListAdapter،
    sectionControllerForObject (شی: AnyObject) -> IGListSectionController {
  اگر اجازه _ = اعتراض به عنوان؟ رشته {
    Return LabelSectionController ()
  } دیگری {
    return NumberSectionController ()
  }
} 

معماری های بهتر

IGListKit با تقسیم مسئولیت ها به چندین لایه: کنترل کننده نمایش ، آداپتور لیست ، کنترل کننده بخش و سلول ، احتمال داشتن "کنترل کننده های دید گسترده" را کاهش می دهد. این طرح در ساخت لیست های شما با م componentsلفه های مستقل دارای یک اثر جانبی مثبت است ، به این معنی که در نهایت با کنترل کننده ها و سلول های بخش قابل استفاده مجدد استفاده می کنید. نتیجه یک جریان داده یک طرفه است ، که در آن هر جز component هیچ شناختی از والدین خود ندارد.

تفاوت

در اینستاگرام ، داده های ما می توانند تغییر زیادی کنند. به عنوان مثال ، داده های جدید می رسداز سرور هر بار که عکس را دوست دارید یا پیام مستقیم را در زمان واقعی دریافت می کنید. UICollectionView می تواند انواع به روزرسانی ها را حذف کند (حذف ، بارگیری مجدد ، جابجایی و درج) ، اما انجام آن به روزرسانی ها بدون خراب شدن می تواند کمی مشکل باشد. ما الگوریتمی با سرعت متفاوت متشکل از مقاله ای را منتشر کردیم که در سال 1978 توسط پل هکل منتشر شد. این الگوریتم تمام به روزرسانی های احتمالی مورد نیاز UICollectionView را در مدت زمان خطی (که O (n) است) پیدا می کند.

منبع باز

نسخه IGListKit که در Github مستقر شده همان نسخه ای است که ما در فیس بوک از آن استفاده می کنیم ، بنابراین پروژه منبع باز همیشه در استانداردهای صنعت آزمایش و نگهداری می شوند. اگر می خواهید مشارکت کنید ، این کارها را به عنوان نقطه شروع بررسی کنید. ما مشتاقانه منتظر کار با هم در این زمینه هستیم!

رایان نیستروم مهندس نرم افزار در تیم زیرساخت iOS در اینستاگرام نیویورک است.


تجزیه و تحلیل استاتیک در مقیاس: یک داستان اینستاگرام
[ بازدید : 21 ] [ امتیاز : 3 ] [ نظر شما :
]

مدولاسیون برنامه و بارگذاری تنبل ماژول در اینستاگرام و فراتر از آن

دوشنبه 14 تير 1400
13:37
علیرضا ایرانی

مدولاسیون برنامه و بارگذاری تنبل ماژول در اینستاگرام و فراتر از آن

اینستاگرام به داشتن یک برنامه ناب افتخار می کند. اما با افزایش تعداد مهندسان و ویژگی ها ، چالش های مربوط به اندازه نیز افزایش می یابد. ما با مسائلی مانند:

افزایش اندازه برنامه بارگیری شده از فروشگاه برنامه افزایش در زمان شروع سرد و به طور کلی ، افزایش زمان تعامل با سطوح مختلف داخل برنامه شروع می کنیم افزایش استفاده از فضای دیسک کاهش سرعت توسعه دهنده از افزایش پیچیدگی برنامه یا زمان ساخت

برای مقابله با این مشکلات ، اخیراً یک Instagram- ایجاد کردیم تلاش برای مدولاسیون کد گسترده برای ایجاد انزوای دقیق بین ویژگی ها. ما این کار را هم در Android و هم در iOS انجام می دهیم ، اما این پست در درجه اول روی Android متمرکز خواهد بود. هنگامی که یک ویژگی مدولار شد ، می توانیم این ویژگی را از فایل اجرایی اصلی خارج کرده و آن را در پرونده اختصاصی کامپایل کرده و در زمان اجرا بر اساس تقاضا ، با تنبلی بارگیری کنیم. بارگذاری تنبل می تواند ترکیبی از مزایا مانند بهبود زمان شروع سرد (به خصوص در Dalvik) و زمان کار کلی ، کاهش رد پای دیسک و سرعت بهتر توسعه دهنده را در صورت اجرای hotswapping ماژول به همراه داشته باشد. این پست به چگونگی نزدیک شدن به مدولاسیون و بارگذاری تنبل در اینستاگرام و چگونگی پیاده سازی آن در برنامه خود با چارچوب جدید منبع باز می پردازد.

مدولاسیون برنامه

چه مدولار شدن است

مدولار سازی فرآیند تفکیک و ایجاد مرزهای مشخص بین اجزای منطقی کد است. برای اینستاگرام ، ما روی مدولار کردن کد ویژگی متمرکز شده ایم زیرا این کد نمایانگر بخش بزرگی از کد کد است و هر ویژگی دارای مرزهای مشخصی است. کاهش وابستگی های متقابل ویژگی با مدولاسیون به ما کمک می کند تا چالش های یک برنامه در حال رشد را از چند طریق حل کنیم. یک فایده این است که به ما کمک می کند با افزایش مقدار کد در برنامه ، از زمان شروع برنامه خود در برابر رشد محافظت کنیم. قبل از مدولاسیون ، ممکن است زنجیره ای از ارجاع کد از یک ویژگی به ویژگی دیگر بارگذاری در تمام آن کد را در زمان شروع برنامه به خطر بیندازد. اما با جدا کردن این منابع با مدولاسیون ، می توان صبر کرد تا بارگذاری کد در صورت نیاز با استفاده از روش هایی مانند Lazy Loading (در زیر مشاهده کنید). علاوه بر این ، مدولاسیون مزایای مهم دیگری نیز برای سلامت کلی پایگاه کد ، زمان ساخت ، سرعت توسعه دهنده ، برنامه های فوری و غیره دارد.

نحوه مدولاسیون

هدف از مدولاسیون داشتن یک واضح است رابط تعریف شده که اجرای ویژگی را از کد خارج جدا می کند. با ممیزی تمام وابستگی های ورودی به ویژگی شروع کنید. برای هر وابستگی ، بفهمید که باید حذف شود یا نگهداری شود. از آنجا که هر مورد متفاوت است ، روش ساده ای برای انجام این ارزیابی وجود ندارد - اما در اینجا برخی از ملاحظات قابل ذکر است:

آیا این وابستگی نتیجه کد نادرست است؟ گاهی اوقات وابستگی وجود دارد زیرا یک روش کتابخانه مشترک یا یک روش نادرست در ویژگی وجود دارد که در واقع باید خارج از ویژگی زندگی کند. در این صورت ، کد ارجاع شده را از ویژگی خارج کرده و به مکان مناسب منتقل کنید. آیا راهی برای بازنویسی وابستگی وجود دارد تا عمومی تر باشد تا اینکه کد خاص ویژگی را به آن ارجاع دهد؟ آیا این وابستگی وجود دارد زیرا ما زودتر از زمان لازم به برخی از منطق های خاص ویژگی دسترسی پیدا می کنیم؟ اگربنابراین ، سعی کنید این منطق را به بعد موکول کنید. آیا منطق اطراف بیش از حد زیاد است؟ اگر چنین است ، منطق را در قسمت خاص ویژگی ساده کنید تا استدلال در مورد ضرورت وابستگی ساده تر شود. >

اگر پس از انجام این ملاحظات ، هنوز وابستگی لازم است ، پس از آن به عنوان بخشی از رابط ویژگی اگر مدولاسیون را به خوبی انجام داده ایم ، رابط ویژگی باید شامل فقط چند روش مهم باشد. برخی از مثالها عبارتند از:

روشهایی که امکان پیمایش به این ویژگی را می دهند روشهای چرخه زندگی که برای وقایع مربوط به چرخه زندگی در کل برنامه گوش فرا می دهند روشهایی که عملکرد اصلی ویژگی را نشان می دهند .

بارگذاری تنبل ماژول

بارگذاری تنبل چیست

در حالی که مدولاسیون یک ویژگی را از دنیای خارج جدا می کند و یک رابط تمیز برای ویژگی ایجاد می کند ، بارگذاری تنبل این کار را بیشتر می کند و ویژگی را از فایل اصلی اجرایی (dex) به یک فایل جداگانه dex کامپایل می کند. هر ویژگی تنبل بارگذاری شده در یک فایل جداگانه زندگی می کند ، که مزایایی از جمله این موارد را به همراه خواهد داشت: کد را از پرونده اجرایی اصلی بارگیری می کند ، که کوچکتر است و زمان شروع سرد بهتر را تضمین می کند. در Dalvik روش ها را از پرونده اصلی dex بارگیری می کند و باعث کاهش مجازات عملکرد multi dex می شود. > کد ویژگی خوشه بندی با هم در حافظه ، زیرا در یک پرونده زندگی می کند و از نظر دسترسی به حافظه بهینه ترین اجرا را می دهد اگر برخی از ماژولها بدون استفاده بمانند از فضای دیسک کمتری استفاده می کنند زیرا کد ویژگی هرگز فشرده نمی شود امکان داشتن یک برنامه سازگار با مجموعه های مختلف از ویژگی های ارسال شده به کاربران مختلف (به عنوان مثال کاربران غیر تجاری به ویژگی های تجاری نیاز نداریم) ، بنابراین از اندازه اولیه برنامه کاسته می شود >

و برای سرعت برنامه نویس ، ما پشتیبانی را برای تغییر مکان ماژول های تنبل بارگذاری شده اضافه کردیم ، این بدان معنی است که توسعه دهندگان می توانند بدون راه اندازی مجدد برنامه ، کدگذاری و دیدن تغییرات را ادامه دهند .

وقتی بارگذاری تنبل را شروع می کنیم

به طور کلی ماژولی را بارگذاری می کنیم که انتظار داریم در آینده نزدیک استفاده شود. پس از بارگیری ماژول ، تا شروع سرد بعدی در حافظه باقی می ماند. بارگذاری ماژول ممکن است تأخیر کمی داشته باشد (بسته به اندازه ماژول) ، بنابراین ممکن است روشهای مختلفی اعمال شود:

بارگیری یک ماژول در پس زمینه هنگامی که کاربر با یک کلیک فاصله با ماژول فاصله دارد. اگر کاربر تصمیم نگیرد روی آن ویژگی کلیک کند یا به عقب برگردد ، ممکن است این ماژول بدون استفاده باقی بماند. اما اگر احتمال کلیک کردن روی آن ماژول زیاد باشد ، راه حل مناسبی است. بارگیری یک ماژول پس از ورود کاربر به ماژول ، اگر تأخیر بارگیری برای اکثر موارد کوچک باشد (زیر 50 میلی ثانیه) (به عنوان مثال p99) ، پس ما می توانیم بارگیری را به راحتی مسدود کنیم و پس از اتمام کار به ویژگی بروید. در غیر این صورت می توان یک چرخنده ساده یا یک نوار پیشرفت را نمایش داد تا برنامه به صورت یخ زده به نظر نرسد. برخی از ماژول ها به طور ماهیتی ناهمزمان هستند ، که بارگذاری تنبل را آسان می کند زیرا بخشی از بارگذاری ناهمزمان خواهد بود. به عنوان مثال ، یک پخش کننده ویدیو است که در یک فرآیند ثانویه اجرا می شود. اینستاگرام در ابتدا در هنگام بارگیری در پس زمینه (اغلب بارها) ، تصویری از تصویر را نشان می دهداز شبکه واکشی می شود). بارگذاری تنبل در آن فرآیند ثانویه اتفاق می افتد و برای کاربران کاملاً شفاف است.

ما چارچوب خود را برای بارگذاری تنبل در ig-lazy-module-loader باز می کنیم تا سایر توسعه دهندگان بتوانند از آن در برنامه های خود استفاده کنند ، یا به سادگی از اجرای ما بیاموزید. اگر در Dalvik مجازات عملکرد multi-dex را بزنید یا ویژگی های زیادی داشته باشید که ممکن است توسط برخی از کاربران بدون استفاده باقی بماند و بخواهید فضای دیسک را ذخیره کنید ، مفید خواهد بود. ما اخیراً تیم های مهندسی زیرساخت تلفن همراه (iOS و Android) خود را به شهر نیویورک منتقل کرده ایم. اگر این پست وبلاگ شما را از کاری که انجام می دهیم هیجان زده کرد ، ما استخدام می کنیم - صفحه مشاغل ما را ببینید. مونا هوانگ و جولیان کرزمینسکی در اینستاگرام در Android کار می کنند.


تجزیه و تحلیل استاتیک در مقیاس: یک داستان اینستاگرام
[ بازدید : 25 ] [ امتیاز : 3 ] [ نظر شما :
]

تجزیه و تحلیل استاتیک در مقیاس: یک داستان اینستاگرام

دوشنبه 14 تير 1400
13:36
علیرضا ایرانی

تجزیه و تحلیل استاتیک در مقیاس: یک داستان اینستاگرام

سرور اینستاگرام کاملاً با پایتون کار می کند.

خب ، بیشتر اوقات. برخی از Cython نیز وجود دارد و وابستگی های ما شامل مقدار کافی کد C ++ در معرض Python به عنوان پسوند C است.

برنامه سرور ما یکپارچه است ، یک پایگاه کد بزرگ با چندین میلیون خط و چند هزار نقطه پایانی Django [ 1] ، همه بارگیری شده و با هم خدمت می کنند. چند سرویس از یکپارچه جدا شده است ، اما ما برنامه ای برای از بین بردن تهاجمی آن نداریم.

و این یک یکپارچه سریع است. ما صدها مهندس داریم که روزانه صدها متعهد را حمل می کنند. ما این تعهدات را به طور مداوم و هر هفت دقیقه مستقر می کنیم و معمولاً صد بار در روز تولید می کنیم. هدف ما این است که کمتر از یک ساعت تأخیر بین فرود آمدن در کارشناسی ارشد و تولید مستقیم زندگی کنیم. [2]

واقعاً دشوار است که این پایگاه کد گسترده یکپارچه ، صدها تعهد در روز ، از تبدیل شدن به یک هرج و مرج کامل ، آسیب دید. ما می خواهیم اینستاگرام را به مکانی تبدیل کنیم که تمام مهندسان ما بتوانند تولیدکننده باشند و ویژگی های مفید را به سرعت ارسال کنند!

این پست در مورد چگونگی استفاده از آستر کاری و بازسازی مجدد خودکار برای کمک به مدیریت مقیاس پایگاه کد پایتون است. در چند هفته آینده ، ما جزئیات بیشتری از سایر ابزارها و تکنیک هایی را که برای مدیریت جنبه های دیگر کیفیت پایگاه کد خود توسعه داده ایم ، به اشتراک خواهیم گذاشت.

اگر می خواهید برخی از ایده های ذکر شده را امتحان کنید در این پست ، ما اخیراً LibCST را به صورت منبع آزاد در اختیار شما قرار می دهیم که به عنوان قلب بسیاری از ابزارهای داخلی پرز و بازسازی خودکار ما عمل می کند.

[1] برای اطلاعات بیشتر در مورد نحوه استفاده از جنگو ، بحث "Django در اینستاگرام ”در کنفرانس Django Under the Hood در سال 2016 ارائه دادیم. [2] برای اطلاعات بیشتر در مورد استقرار مداوم ، بحث "آزاد کردن بزرگترین سایت پایتون جهان در هر هفت دقیقه" را که در PyCon 2019 ارائه دادیم مشاهده کنید.

لنت: مستندات درخواستی

پر کردن به توسعه دهندگان کمک می کند تا موارد یا الگوهای ضد الگویی را که ممکن است هنگام مواجهه با آنها اطلاع نداشته باشند ، پیدا و تشخیص دهند. این برای ما مهم است ، زیرا با وجود صدها مهندس انتشار این ایده ها به طور فزاینده ای دشوار می شود.

پر کردن فقط یکی از انواع تجزیه و تحلیل استاتیک است که ما در Instagram استفاده می کنیم. روش ساده لوحانه اجرای قانون پرز با بیان منظم است. عبارات منظم به راحتی قابل نوشتن هستند ، اما پایتون یک زبان منظم نیست ، بنابراین مطابقت قوی الگویی در کد با یک عبارت منظم دشوار است (یا گاهی اوقات غیرممکن است).

در انتهای دیگر طیف ، ما ابزارهایی مانند mypy و Pyre ، دو جستجوگر نوع استاتیک پایتون داریم که می توانند تجزیه و تحلیل کل برنامه را انجام دهند. اینستاگرام از Pyre استفاده می کند. این ابزارها قدرتمند هستند ، اما گسترش و سفارشی سازی آنها دشوار است.

وقتی در Instagram از پرزها صحبت می کنیم ، معمولاً به قوانین ساده پرینت درخت نحوی انتزاعی اشاره می کنیم. اینگونه است که ما معمولاً قوانین سفارشی lint را برای پایگاه کد سرور اینستاگرام می نویسیم.

وقتی Python ماژولی را اجرا می کند ، با اجرای تجزیه کننده روی کد منبع شروع می شود. این به طور ضمنی یک درخت تجزیه ، نوعی درخت نحو بتونی (CST) ایجاد می کند. این درخت تجزیه نمایشی بدون ضرر از کد منبع ورودی است.همه جزئیات مانند نظرات ، پرانتزها و ویرگولها در این درخت حفظ می شوند. ما می توانیم کد منبع اصلی را با استفاده از این درخت بازسازی کنیم.

درخت تجزیه پایتون (a متأسفانه ، این یک درخت پیچیده ایجاد می کند ، استخراج معناشناسی مورد علاقه ما را دشوار می کند.

Python درخت تجزیه را جمع می کند را به یک درخت نحوی انتزاعی یا AST تبدیل کنید. این یک تبدیل با ضرر است و جزئیات مربوط به "چیزهای بی اهمیت نحوی" مانند نظرات ، پرانتزها و ویرگول ها دور ریخته می شوند. با این حال ، معانی معنایی کد حفظ می شود. توسط ماژول ast.

در اینستاگرام ، ما LibCST را توسعه داده ایم که بهترین های هر دو جهان را ارائه می دهد. این یک نمایش بدون ضرر مانند یک درخت نحوی بتونی (CST) را ارائه می دهد ، اما با این وجود استخراج معناشناسی مانند یک درخت نحوی انتزاعی (AST) را آسان می کند.

نمایندگی درخت نحوی بتونی LibCST.

قوانین پرز ما از درخت نحوی LibCST برای مطابقت با الگوهای کد استفاده می کند. به عنوان یک نمایش سطح بالا ، درخت نحو به راحتی قابل بررسی است و مشکل برخورد با یک زبان غیر منظم را برطرف می کند.

بگذارید بگوییم به دلیل نوع آن وابستگی دایره ای در ماژول خود دارید. فقط واردات پایتون به شما امکان می دهد با قرار دادن واردات فقط نوع در پشت TYPE_CHECKING ، این مشکل را حل کنید: برای جلوگیری از وارد کردن چیزی در زمان اجرا ، از محافظت جلوگیری کنید.

 # value imports
از تایپ کردن وارد کردن TYPE_CHECKING
از help help_fn وارد کنید

# واردات فقط نوع
اگر TYPE_CHECKING:
    بعداً ، شخصی وابستگی نوع دیگر دیگری را به کد اضافه می کند و از آن محافظت می کند. با این حال ، ممکن است آنها متوجه نشوند که از قبل یک محافظ نوع در ماژول وجود داشته است. 

 # مقدار واردات
از تایپ کردن وارد کردن TYPE_CHECKING
از help help_fn وارد کنید

# واردات فقط نوع
اگر TYPE_CHECKING:
    از Circular_dependency وارد کردن CircularType

اگر TYPE_CHECING: # اوه! محافظ نوع تکراری!
    از other_package import OtherType 

ما می توانیم با یک قانون پرز از این افزونگی جلوگیری کنیم!

ما با شروع مقدمه ای از بلوک های بررسی نوع که با آن روبرو شده ایم ، شروع خواهیم کرد.

< pre> class OnlyOneTypeCheckingIfBlockLintRule (CstLintRule): def __init __ (خود ، زمینه: زمینه) -> هیچکدام super () .__ init __ (زمینه) self .__ type_checking_blocks = 0

سپس ، وقتی با یک شرط بررسی نوع مواجه شدیم ، شمارنده را افزایش می دهیم و بررسی می کنیم که بیش از یک نوع بلوک بررسی وجود ندارد. اگر این اتفاق بیفتد ، با تماس با راهنمای گزارش خود هشدار در آن مکان ایجاد خواهیم کرد.

 def visit_If (self، node: cst.If) -> هیچکدام:
    اگر node.test.value == "TYPE_CHECKING":
        خود .__ نوع_بستن_بلاکها + = 1
        if self .__ type_checking_blocks> 1:
            self.context.report (
                گره ،
                "بیش از یک" اگر TYPE_CHECKING "بخش!"
            ) 

این قوانین پرز با عبور از درخت LibCST و جمع آوری اطلاعات کار می کنند. در خط داخلی ما ، این کار با استفاده از الگوی بازدید کننده انجام می شود. همانطور که ممکن است متوجه شده باشید ، قوانین روشهای بازدید را رد می کنند و روشهای مرتبط با انواع گره را رها می کنند. آن بازدید کنندگانبه ترتیب خاصی فراخوانی شوید.

 کلاس MyNewLintRule (CstLintRule):
    def visit_Assign (خود ، گره):
        ... # ابتدا تماس گرفت

    def visit_Name (خود ، گره):
        ... # برای هر کودک تماس گرفت

    def ترک_تخصیص (خود ، نام):
        ... # بعد از همه بچه ها 
فراخوانی می شود روش های بازدید قبل از هر یک از از فرزندان گره بازدید می شود. روشهای ترک پس از بازدید از همه کودکان گره فراخوانی می شوند.

فلسفه ما در اینستاگرام این است که "ابتدا کار ساده را انجام دهیم". اولین قوانین پرینت سفارشی ما با استفاده از حالت اشتراکی در یک پرونده و با یک بازدید کننده واحد اجرا شد.

یک فایل منفرد ، با یک بازدید کننده ، با استفاده از حالت مشترک.

کلاس بازدید کننده منفرد باید از وضعیت و منطق همه قوانین مربوط به پرزهای ما آگاه باشد ، و همیشه مشخص نبود که کدام ایالت با چه قاعده ای مطابقت دارد. وقتی چند قانون پرز سفارشی داشته باشید ، این درست است ، اما ما تقریباً یک صد قانون پرینت سفارشی داریم که باعث می شود الگوی یک بازدید کننده غیرقابل حفظ شود.

فهمیدن اینکه چه وضعیت و منطقی با هر بررسی انجام می شود دشوار است.

البته ، یک راه حل ممکن برای این مشکل تعریف چندین بازدید کننده است و این که هر بازدید کننده هربار کل درخت را معکوس کند. با این حال ، این مجازات عملکرد بزرگی را متحمل می شود ، و ملافه باید سریع باقی بماند.

هر قانون پرز می تواند درخت را دوباره مرور کند ، و به ترتیب بر روی پرونده اجرا می کند. با این حال ، این مرور مجدد مکرر مجازات عملکرد بزرگی را متحمل خواهد شد.

در عوض ، ما از پرزهای موجود در اکوسیستم های زبان دیگر مانند ESLint جاوا اسکریپت الهام گرفتیم و یک رجیستری متمرکز بازدید کننده ایجاد کردیم.

یک رجیستری بازدید کننده متمرکز. ما می توانیم به طور کارآمد مشخص کنیم که کدام قانون پرزها به کدام گره ها اهمیت می دهد ، در وقت گره هایی که برای آنها مهم نیست صرفه جویی کنید. وقتی درخت را رد می کنیم ، تمام بازدیدکنندگان ثبت شده را جستجو می کنیم و آنها را صدا می کنیم. اگر روشی اجرا نشده باشد ، نیازی به فراخوانی آن نداریم.

این باعث کاهش هزینه محاسبه هر قانون جدید پرز می شود. اگرچه ما معمولاً linter را روی تعداد کمی از پرونده هایی که اخیراً تغییر کرده اند اجرا می کنیم ، اما می توانیم تمام قوانین جدید پرینت خود را به صورت موازی بر روی کل کد سرور اینستاگرام فقط در 26 ثانیه اجرا کنیم. در اینجا ، ما یک چارچوب آزمایشی ایجاد کرده ایم که برای اجرای بهترین روش ها نیاز به آزمایش هم برای مثبت و هم برای منفی کاذب دارد.

 کلاس MyCustomLintRuleTest (CstLintRuleTest):
    RULE = MyCustomLintRule
    
    معتبر = [
        معتبر ("عملکرد خوب_ (این نباید گزارش ایجاد کند")) ،
        معتبر ("foo.bad_function (" و نه باید این باشد "))) ،
    ]
    
    نامعتبر = [
        نامعتبر است ("عملکرد بد_ (" اما این باید ") ،" IG00 ") ،
    ] 

خستگی پرزها

با نزدیک به صد قاعده سفارشی ، پرزهای پدیتیکی می توانند به سرعت تبدیل به اتلاف وقت برایتوسعه دهندگان صرف وقت برای اصلاح سبک های سبک و کدگذاری های منسوخ ، مانع پیشرفت مهمتر می شود.

ما دریافته ایم که با تعداد زیادی نق ، مهندسان شروع به نادیده گرفتن همه پرزها ، حتی موارد مهم می کنند. در یک زمان خاص ، مهم نیست که چه توصیه خوبی ارائه می دهیم ، فقط نادیده گرفته می شود.

بیایید بگوییم که ما برای یک تابع با نام بهتر به نام "افزودن" لازم بود که یک تابع به نام "fn" را استهلاک کنیم . تا زمانی که توسعه دهندگان از این واقعیت که "fn" منسوخ شده است آگاه نشوند ، آنها نمی دانند که از آن استفاده نمی کنند. حتی بدتر ، آنها نمی دانند که چه چیزی را در عوض استفاده کنند. بنابراین ، می توانیم یک پرز ایجاد کنیم. اما هر پایگاه کد کافی کافی احتمالاً تعداد زیادی لامپ دیگر از قبل دارد. احتمال این است که این پرزهای مهم در سر و صدا از بین بروند.

باهم بسیاری از nitpicks ، سیگنال ممکن است در نویز از بین برود.

بنابراین ، چه کاری می توانیم در مورد آن انجام دهیم؟

ما می توانیم به طور خودکار بسیاری از مشکلات پیدا شده توسط پرز را برطرف کنیم. دقیقاً مانند اینکه پرزها مستندات مربوط به تقاضا هستند ، اصلاح کنندگان خودکار می توانند بر اساس تقاضا رفع اشکال کنند. با توجه به تعداد گسترده برنامه نویسان در اینستاگرام ، امکان آموزش همه بهترین اقدامات برای هر توسعه دهنده وجود ندارد. افزودن اصلاح کننده های خودکار به ما امکان می دهد تا توسعه دهندگان را در مورد بهترین روشهای جدید در صورت تقاضا آموزش دهیم. رفع کننده های خودکار همچنین به ما امکان می دهند تا با حذف تغییرات یکنواخت ، تمرکز توسعه دهنده را حفظ کنیم. اساساً ، رفع کننده های اتوماتیک از هشدارهای ساده پرز بسیار عملیاتی و آموزشی هستند.

بنابراین ، چگونه می توان یک رفع کننده خودکار ساخت؟ پرزهای مبتنی بر درخت نحو گره آزار دهنده را به ما می دهند. دیگر نیازی به تکرار منطق کشف نیست زیرا قانون lint از قبل وجود دارد! از آنجا که گره ای را که می خواهیم جایگزین کنیم ، می دانیم و محل آن را از منبع می دانیم ، می توانیم آن را با نام عملکرد به روز شده با خیال راحت جایگزین کنیم! این برای رفع نقض پرزهای منفرد در هنگام معرفی بسیار مفید است ، اما وقتی قانون جدید پرزها را معرفی می کنیم صدها مورد نقض موجود در آن وجود دارد. آیا می توانیم همه پرونده های موجود را به یک باره فعالانه به یک باره حل کنیم؟

رمزگذارها

کد رمز فقط یک روش قابل نوشتن برای یافتن مشکلات و ایجاد تغییر در کد منبع است. رمزگذار را به عنوان یک عامل بازدارنده بر روی استروئیدها در نظر بگیرید: این می تواند به سادگی تغییر نام یک متغیر در یک تابع یا به همان اندازه پیچیده باشد که بازنویسی یک تابع برای یک استدلال جدید پیچیده است. دقیقاً از همان مفهوم پرز استفاده می کند ، اما به جای هشدار به برنامه نویس ، می تواند به طور خودکار اقدام کند.

بنابراین ، چرا شما به جای پرز کد کد می نویسید؟ در این مثال ، ما می خواهیم استفاده از get_global را منسوخ کنیم. ما می توانیم از پرز استفاده کنیم ، اما زمان تعمیر محدود نیست و در چندین توسعه دهنده پخش می شود. حتی با نصب خودکار در محل ، ممکن است مدتی طول بکشد تا همه کد به روز شود.

ما می خواهیم استفاده از get_global را با استفاده از متغیرهای نمونه جایگزین نکنیم.

برای رفع این مشکل ، علاوه بر اینکه در برابر get_global قرار می گیریم ، می توانیم یک کد رمز نیز بنویسیم! در اینستاگرام ، ما معتقدیم که الگوهای منسوخ شده و API ها که به آرامی پژمرده می شوند ، تمرکز را از توسعه دهندگان می گیرند و خوانایی کد را کاهش می دهند. ما ترجیح می دهیم پیش فعالانه کد منسوخ شده را حذف کنیم تا اینکه اجازه دهیم آن از بین برودزمان. با توجه به حجم زیاد کد و تعداد توسعه دهندگان فعال ، این اغلب به معنای خودکار کردن استهلاک ها است. اگر بتوانیم به سرعت الگوهای منسوخ شده را از کد خود حذف کنیم ، همه اینستاگرام را مثمر ثمر نگه می داریم.

بسیار خوب ، بنابراین چگونه واقعاً کد نویسی می کنید؟ چگونه با حفظ نظرات ، فاصله و سایر موارد ، فقط متن مورد علاقه خود را جایگزین می کنید؟ شما می توانید از یک درخت نحوی بتونی مانند LibCST برای تغییر کد جراحی با حفظ نظرات و فاصله استفاده کنید. بنابراین ، اگر می خواستم نام "fn" را به "add" در درخت زیر تغییر دهم ، من گره Name را به روز می کنم تا به جای "fn" مقدار "add" داشته باشد و سپس درخت را به دیسک بنویسم!

ما می توانیم با به روزرسانی گره Name از "fn" به "add" قبل از نوشتن ، کد رمز را انجام دهیم درخت به دیسک برگردد. برای مثال دقیق تر ، اسناد LibCST را بررسی کنید.

اکنون که اطلاعاتی در مورد رمزگذارها کسب کردیم ، به یک مثال عملی نگاه می کنیم. اینستاگرام برای رسیدن به یک کد کد کاملاً تایپ شده سخت کار کرده است و ما با استفاده از کد رمزها پیشرفت زیادی کرده ایم.

با توجه به مجموعه ای از توابع تایپ نشده ، می توانیم با استنباط ساده انواع بازگشتی تولید کنیم! به عنوان مثال ، اگر یک تابع فقط یک نوع ابتدایی را بازگرداند ، آن را از نوع بازگشتی اختصاص می دهیم. اگر یک تابع نتیجه یک عمل بولی مانند مقایسه یا "isinstance" را برمی گرداند ، ما به آن یک نوع برگشت بول اختصاص می دهیم. ما دریافتیم که در عمل این یک عمل کاملاً ایمن است که می توان آن را در کل کد اینستاگرام انجام داد.

خوب ، اگر تابعی صریحاً برنگردد یا به طور ضمنی None را بازگرداند ، چه می کنید؟ اگر تابعی صریحاً یک نوع را برنمی گرداند ، به آن نوع None اختصاص دهید. برخلاف مثال آخر ، این امر به دلیل الگوهای رایج توسعه دهنده می تواند خطرناک تر باشد. به عنوان مثال ، ممکن است یک استثنای NotImplemented را در یک روش کلاس پایه بیاندازم و یک رشته را در همه جایگزین های زیر کلاس برگردانم. ذکر این نکته مهم است که همه این تکنیک ها ابتکاری هستند ، اما به نظر می رسد که آنها اغلب به درستی درست هستند که مفید هستند!

تقویت کد رمزها با استفاده از Pyre

بگذارید یک قدم جلوتر برویم. اینستاگرام برای تأیید انواع موجود در پایگاه کد ما ، از Pyre ، یک جستجوگر نوع استاتیک کامل برنامه مشابه mypy ، استفاده می کند. اگر از خروجی Pyre برای قدرتمندتر کردن این رمزگذار استفاده کنیم چه می کنیم؟ همانطور که در قطعه خروجی زیر Pyre مشاهده می کنید ، Pyre اساساً هر آنچه را که برای اصلاح خودکار حاشیه نویسی نیاز داریم به ما می دهد!

 $ pyre
 2 2 نوع خطا پیدا شد!
test /utils.py: 7: 0 حاشیه نویسی برگشتی [3]: بازگشت "SomeClass" اما هیچ نوع بازگشتی مشخص نشده است.
test /utils.py: 10: 0 حاشیه نویسی برگشتی [3]: برگرداندن `test.other.SomeOtherClass` اما هیچ نوع بازگشتی مشخص نشده است. 

هنگام اجرای pyre ، آنالیز دقیقی از جریان کنترل در هر تابع بنابراین ، گاهی اوقات می تواند حدس خوبی در مورد بازگشت عملکرد غیرمعمول داشته باشد. این بدان معنی است که اگر pyre فکر می کند که تابعی یک نوع ساده را برمی گرداند ، پس آن را از نوع بازگشتی اختصاص می دهیم. با این حال ، اکنون به طور بالقوه باید واردات را کنترل کنیم. این بدان معناست که باید بدانیم آیا چیزی از قبل وارد شده است یا به صورت محلی تعریف شده است. کمی لمس می کنمکمی در مورد چگونگی کشف بعداً آن

از افزودن خودکار انواع آسان برای استنباط چه فایده ای داریم؟ خوب ، انواع مستندات هستند! اگر یک عملکرد کاملاً تایپ شود ، توسعه دهندگان برای درک شرایط قبل و بعد از آن مجبور نیستند کد را بخوانند.

 def get_description (صفحه: WikiPage) -> اختیاری [str]:
    اگر page.draft:
        بازگشت هیچ
    Return page.metadata ["توضیحات"] # <- این نوع چیست؟ 

بسیاری از ما با کد پایتون مانند این روبرو شده ایم و کد اینستاگرام نیز از این قاعده مستثنی نیست. اگر get_description تایپ نشده باشد ، ممکن است مجبور باشم چندین ماژول منبع را جستجو کنم تا بفهمم این عملکرد دقیقاً چه چیزی را برمی گرداند. حتی برای توابع ساده تر که استنباط آنها آسان است ، خواندن تعاریف عملکرد با انواع آن برای انسان بسیار آسان تر است.

همچنین ، Pyre صحت ​​درون بدنه عملکرد را ارزیابی نمی کند مگر اینکه خود عملکرد کاملاً حاشیه نویسی شود. در مثال زیر ، خوب است بدانید که تماس ما با برخی از عملکردها قبل از شروع تولید خراب می شود.

 def some_function (in: int) -> bool:
    بازگشت به> 0

def some_other_function ():
    if some_function ("bla"): # <- باید نوع نقض داشته باشد
        print ("بله!") 

در این صورت ما راه سختی را یاد می گیریم زیرا برخی از عملکردهای دیگر حاشیه نویسی برگشتی ندارند! اگر با استفاده از روش ابتکاری خود نوع بازگشت "هیچ" را به طور خودکار استنباط کرده بودیم ، قبل از اینکه مشکلی ایجاد شود ، در مورد این موضوع اطلاعاتی کسب می کردیم. این مثال به وضوح ساخته شده است ، اما این مسئله همچنان برای Instagram مهم است. اگر میلیون ها خط کد داشته باشید ، در نهایت مشکلات ظاهراً واضحی از این دست را در حین مرور از دست خواهید داد.

در اینستاگرام ، این استنتاج های ساده باعث افزایش تقریباً 10 درصدی عملکردهای تایپ شده می شوند. این باعث می شود هزاران هزار عملکرد که انسان دیگر مجبور به رفع آنها نیست. مزایای کد تایپ بهتر آشکار است ، اما به مزیت دیگری نیز منجر می شود: داشتن یک کد کد کاملاً تایپ شده ، کد رمزهای پیشرفته تری را باز می کند.

اگر به حاشیه نویسی نوع خود اعتماد کنیم ، می توانیم از Pyre برای باز کردن امکانات اضافی استفاده کنیم. . بیایید به عنوان تغییر نام عملکرد خود نگاه کنیم. اگر تابعی که ما به آن تغییر نام می دهیم یک روش کلاس است نه یک تابع جهانی؟

اگر اطلاعاتی را که از pyre دریافت می کنیم با codemod تغییر نام دهیم ، می توانیم سایت های تماس و همچنین تعریف را به طور ناگهانی درست کنیم! در این مثال ، از آنجا که سمت چپ a.fn را می شناسیم ، می دانیم که تغییر نام به a.add ایمن است.

تجزیه و تحلیل استاتیک پیشرفته تر

پایتون دارای چهار نوع دامنه است: جهانی ، کلاس ، عملکرد و درک.

ما می توانیم قفل بیشتر را باز کنیم رمزگذارهای قدرتمند با تجزیه و تحلیل دامنه. این مشکل را از اوایل به خاطر می آورید ، جایی که افزودن نکات نوع به این معنی است که ما باید بالقوه واردات را اضافه کنیم؟ اگر تجزیه و تحلیل دامنه داشته باشید ، می دانید که انواع وارد شده در پرونده از طریق واردات وارد می شوند ، کدام یک به صورت محلی تعریف می شوند و کدام یک از آنها وجود ندارد. به همین ترتیب ، اگر می دانید که یک متغیر جهانی تحت سایه یک آرگومان تابع است ، می توانید از تغییر تصادفی آن جلوگیری کنیداگر به آن متغیر جهانی تغییر نام می دهید.

در تلاش برای رفع همه مشکلات در اینستاگرام یک چیز روشن شده است: یافتن کدی که می خواهیم اصلاح کنیم اغلب مهمتر از خود اصلاح است. غالباً ، افراد می خواهند کارهای ساده ای مانند تغییر نام تابع ، افزودن آرگومان به روشی یا تقسیم ماژول را انجام دهند. انجام هیچ یک از این کارها دشوار نیست ، اما با توجه به اندازه پایگاه کد ما ، یافتن هر خطی که نیاز به اصلاح دارد برای انسان غیرممکن است. به همین دلیل جفت شدن قابلیت کدگذاری با آنالیز استاتیک قوی بسیار مهم است. این به ما امکان می دهد که کدهایی را که باید در نظر بگیریم تا کد رمزها را ایمن تر و قدرتمندتر کنیم ، محدود کنیم.

با تشکر فراوان از اعضای تیم من: جنیفر تیلور (که به طور مشترک این مقاله را نوشت) ، مارک ویسمونته ، جیمی لای ، ری زنگ ، کارل مایر ، آنیرود پادمارائو ، کیت بلاها و لی بیرمن.

اگر می خواهید در مورد این کار اطلاعات بیشتری کسب کنید یا می خواهید به یکی از تیم های مهندسی ما بپیوندید ، لطفاً به ما مراجعه کنید صفحه مشاغل ، ما را در فیس بوک یا توییتر دنبال کنید.


دولت با اینستاگرام مشکل دارد
[ بازدید : 21 ] [ امتیاز : 3 ] [ نظر شما :
]

دولت با اینستاگرام مشکل دارد

دوشنبه 14 تير 1400
13:36
علیرضا ایرانی

دولت با اینستاگرام مشکل دارد

شبکه های اجتماعی ما را به مقامات خود متصل می کنند ، اما بسیاری از آنچه آنها می گویند برای تاریخ از دست خواهد رفت

عکس نوشته اسپنسر پلات /گتی ایماژ

در واشنگتن همیشه داستان هایی ناگفته باقی مانده است ، اما فراگیر بودن اجتماعی رسانه ها خلا is جدیدی در خاطرات جمعی ما ایجاد می کنند. سوابق دیجیتالی ایجاد شده توسط سیاستمداران امروز ممکن است از بین بروند ، مگر اینکه موسسات ما به روزرسانی اساسی انجام دهند.

در اینجا یک مثال آورده شده است: سیاستمداران جوان تر ، مانند ایلان عمر و الکساندریا اوکاسیو-کورتز ، اعضای منتخب کنگره ، اغلب با رای دهندگان خود ارتباط برقرار می کنند از طریق داستان های اینستاگرام. اما به روزرسانی هایی که آنها به اشتراک می گذارند پس از 24 ساعت برای عموم غیرقابل دسترسی می شود ، مگر اینکه ویژگی "موارد برجسته" برای ذخیره آنها روشن شود. وقتی اعضای جدید کنگره به پایتخت می آیند ، روش هایی که آنها با استفاده از سیستم های حال حاضر داستان های خود را بازگو می کنند ، ایجاد اضطراری تازه در مورد بایگانی سوابق تاریخی برای آینده است.

من یک حزب بی طرف نیستم این بحث من به عنوان معاون بنیاد نور خورشید ، از شرکت های فناوری خواستم که پرونده های تبلیغات سیاسی را به صورت آنلاین ایجاد و منتشر کنند و با قانونگذاران کنگره برای تهیه پیش نویس قانون صادقانه کار کردم.

در طول یک سال گذشته ، من ادامه دادم برای نظارت بر تلاش های خودتنظیمی مات صنعت فناوری ، جلب توجه به خلأ شفافیت تبلیغات در آمازون ، مایکروسافت ، اسنپ چت و سوگند.

غول های فناوری امروز ، این غول اجتماعی را ساخته یا اداره نکرده اند بسترهای رسانه ای با توجه عمومی به ذهن مردم.

نحوه استفاده سیاستمداران و دولتها از امور رسانه های اجتماعی. ما باید از آنها انتظار داشته باشیم كه این كار را بهتر انجام دهند ، با نگاهی به مشاركت مدنی ، شفافیت ، پاسخگویی و دسترسی. و ما باید به دنبال راه حل های قرن 21 برای رفع شکاف تا زمان انجام اصلاحات رسمی باشیم.

تا زمان کنگره ، پارلمان ها و مجالس قانونگذاری ، شرکت های فناوری که میادین عمومی زمان ما را اداره می کنند باید ساخت و نگهداری کنند پرونده ای با منافع عمومی به روزرسانی های سیاستمداران و دولت ها در مورد خدمات آنها.

حفره های حافظه در فضای دیجیتال نحوه دسترسی به مردم آنجا. و هر بار که این اتفاق می افتد ، این سیستم عامل ها ، که در وهله اول برای فعالیت های سیاسی یا دولتی طراحی نشده اند ، در ایجاد ویژگی های افشای و بایگانی ناکام می مانند. چنین ویژگی هایی شفافیت و پاسخگویی مورد نیاز دموکراسی های مدرن را امکان پذیر می کند.

در سال 2018 ، عموم مردم انتظار معقولی از دسترسی به سخنرانی مقامات ، نامزدها و سوابق عمومی دارند که فراتر از نامه ها ، قوانین است ، معاهدات ، اعلامیه ها و جزوه های چاپ شده هزاره گذشته.

اما ارتباطات انتخاباتی ، بیانیه های رسمی اعضای کنگره ، سوابق دادگاه و اسناد آژانس انتظارات مختلفی در مورد حفظ ، دسترسی یا حفظ دارند. < /p>

کتابخانه حقوقی کنگره Congress.gov را به عنوان مخزن اطلاعات قانونگذاری در کشور حفظ می کند. سپس ، ریاست جمهوری وجود دارد ، که توسط قانون سوابق ریاست جمهوری اداره می شود. مشاغل عمومی انجام شده در کاخ سفید باید حفظ شود ، از پیام های مستقیم ارسال شده توسط حساب رئیس جمهور توییتر تا حاشیه نویسی روی اسناد به وب سایت Whitehouse.gov ، اگر نه برنامه های وب جاسازی شده در آن. آژانس های فدرال باید از قانون سوابق فدرال پیروی کنند ،همانطور که بایگانی ملی در فوریه 2017 به مردم و سازمانها توصیه کرده است.

کنگره مشمول هیچ قانونی نیست. در عوض ، ترتیب دیگری تا سال 2018 ادامه داشته است که به سیاستمداران اختیار داده است که در مورد آنچه که حفظ شده و چگونه حفظ شده است. اسناد آنالوگ و دیجیتال تولید شده توسط کمیته های کنگره در حین انجام امور عمومی به عنوان سوابق رسمی تعیین شده و برای حفظ به مرکز بایگانی های قانونگذاری در سازمان اسناد و اسناد ملی منتقل می شوند.

مجلس نمایندگان ایالات متحده و با این حال ، قوانین سنا همچنان با سوابق عمومی تولید شده توسط اعضای کنگره و دفاتر آنها متفاوت رفتار می کند ، و این خود را به عهده اعضای کنگره می گذارد.

همانطور که کتابخانه حقوق در سال 2015 اشاره کرد ، "اعضا حفظ می کنند مالکیت سوابق ایجاد شده در طول خدمات کنگره آنها ، مسئولیت مدیریت موثر آنها را دارند و تعیین کننده نهایی این مقالات هستند. مقالات اعضا شامل سوابق متنی و الکترونیکی است و شامل مواردی مانند یادداشت های شخصی ، پرونده های تحقیق قانونگذاری ، عکس و مکاتبه با عوامل تشکیل دهنده است. "

در سال 2018 ، این" مقالات "اکنون اغلب شامل Facebook Live و Messenger ، Instagram Stories و Snapchat ، همراه با Twitter ، Facebook و YouTube - اما آنها را در بایگانی وب سایت های کنگره در کتابخانه کنگره پیدا نخواهید کرد.

در صورت عدم وجود صریح صلاحیت برای حفظ و روال برای حفاظت ، تنها بایگانی از فعالیتی که اعضای کنگره و کارکنان آنها پشت سر می گذارند در پشتیبان گیری های شرکت های فناوری که سیستم عامل های رسانه های اجتماعی را اداره می کنند وجود دارد.

متأسفانه ، غول های تکنولوژی امروز ساخته نشده اند یا با توجه به توجه عموم مردم این سیستم عامل های بزرگ را اداره می کند.

چرا زمان آن رسیده است که پرونده ای با منافع عمومی

در بهترین حالت ، شبکه های محلی رو به رشد مردم ، دستگاه های تلفن همراه ، رسانه ها ، و نهادهای عمومی نوع جدیدی را تشکیل می دهند o دموکراسی نظارتی ، اتصال مردم به اطلاعات.

در بدترین حالت ، ما می بینیم که جنبه تاریک طبیعت انسان در صفحه های درخشان ما منعکس شده است زیرا شرکت ها ، عوامفریب ها و جنایتکاران طعمه ترس و اعتماد ما هستند. در چنین شرایطی است که ما باید انتظارات خود را در مورد چگونگی استفاده سیاستمداران و کارمندان دولت خود برای استفاده از فناوری های جدید برای کار در دولت فراهم کنیم.

"به نظر می رسد در حال حاضر بی ضرر است زیرا آنها فیلم های سلفی جالبی را از طبخ غذا و شرکت در جهت گیری ، "در توییتی یک شیائو مینا ، یک تکنولوژى که تیم تولید را در میدن هدایت می کند ، توئیت کرد ،" اما چه اتفاقی می افتد وقتی آنها شروع به اعلام رسمی سیاست می کنند؟ " ، ما اولین فرقه استبدادی شخصیت را می بینیم که بر اساس داستان های IG و سایر رسانه های زودگذر بنا شده است؟ "

مینا ، نویسنده کتاب پیش رو از یادگاری ها به جنبش ها ، به من گفت که ما باید از شخصیت های عمومی پاسخگو باشیم اقدامات و وعده های آنلاین آنها در مورد رسانه های زودگذر ، و سرمایه گذاری در بایگانی فرهنگی و حفاظت از آنها.

"چه اتفاقی می افتد وقتی که ، یا در ایالات متحده یا جاهای دیگر ، شاهد اولین کیش شخصیت اقتدارگرا هستیم که بر اساس داستان های IG و سایر موارد ساخته شده است رسانه زودگذر؟ " مینا گفت. "بایگانی ها علی رغم اینکه برای درک بسیار مهم هستند ، احتمالاً برای تاریخ از دست می روند."

بایگانی البته کار سختی است ، زیرا ما بیش از هر زمان دیگری اطلاعات تولید می کنیم. ما هرگز این انتظار را نداشته ایم که هر مکالمه شخصی در تاریخ ثبت و به یادگار مانده باشد.کشف اینکه قوانین مربوط به سوابق عمومی چگونه می تواند یا باید با پیام های فوری ارتباط داشته باشد ، به روزرسانی کم ، متن و سایر رسانه هایی که هنوز ایجاد نشده اند ، کار سالهای طولانی برای نهادهای نظارتی و قانونگذاران در همه جا خواهد بود.

پاسخ می تواند " برای این است که ایمیل یا پیام های متنی را از دسترس قوانین سوابق عمومی معاف نکنید ، و همچنین نمی تواند مانند همه موارد داستانی مانند The Circle ، همه چیز را ضبط کند. در عوض ، ممکن است ما به مسئولیت مقامات منتخب و کارمندان دولت در نشان دادن کار خود فکر کنیم ، همانطور که ممکن است از دانشمندان یا روزنامه نگاران گزارش دهنده داده بخواهیم روش ها و نتایج خود را به اشتراک بگذارند.

"پویایی رسانه های زودگذر س questionsالات جدیدی را مطرح می کنند که اکنون پرسیدن آنها حیاتی است ، زیرا ما در آینده فقط با انطباق ارتباطات سیاسی با اقتصاد توجه و امکانات جدید رسانه های دیجیتال ، بیشتر شاهد این موارد خواهیم بود. "مینا".

اگرچه کارهای خارق العاده مورخان و بایگانی ها برای حفظ آثار دیجیتالی در موزه ها و دانشگاه های سراسر کشور به نمایش در آمده است ، از بایگانی وب کتابخانه کنگره تا UCLA ، آنها همه چیز را تصرف نمی کنند. به دلیل ظهور محتوای زودگذر ، برنامه ها ، پیامرسانی و تبلیغات شخصی در شبکه های اجتماعی ، حتی دستگاه Wayback شگفت انگیز Internet Archives نیز از آینده اثبات نمی کند.

هنوز هم برخی از راه حل های خاص به وجود آمده است. به عنوان مثال Politwoops ، توییت های پاک شده سیاستمداران را حفظ می کند ، حتی اگر قوانین بسیاری از کشورها به ذخیره آنها نیازی نداشته باشد. گرچه ما باید از سازمانهای غیر انتفاعی مانند Open State Foundation و ProPublica که توییتهای پاک شده را حفظ می کنند تعریف و تمجید کنیم ، اما تلاشهای آنها با چالشهای پایداری واقعی روبرو است.

یکی از راههای پرداختن به این واقعیت ، بدون اتکا به سازمانهای غیرانتفاعی ، خود شرکتهای فناوری هستند. برای ایجاد بایگانی عمومی و قابل خواندن توسط ماشین ، از تمام به روزرسانی های عمومی که کمپین ها ، مقامات و سازمان های دولتی در سیستم عامل های خود ارسال می کنند.

همانند قانون تبلیغات صادقانه ، ممکن است لازم باشد قانونگذاران بازنویسی و قوانین ما را به روشهایی اصلاح كنید كه انتظارات صریحی را برای شركتهای خصوصی كه میزبان سخنرانی سیاسی و محتوای دولتی هستند برای حفظ آن ایجاد كند.

اخیراً این رویکرد سابقه دارد: در پی مبارزات نفوذ روسیه در رسانه های اجتماعی در انتخابات ریاست جمهوری 2016 ، فیس بوک ، گوگل و توییتر همگی با درجات مختلف شفافیت نسخه های مختلفی از این نوع پرونده عمومی را برای تبلیغات پولی ایجاد کردند.

همین مدل مربوط به توییت ها است ، به روزرسانی های فیس بوک ، داستان های اینستاگرام ، عکس های ناگهانی یا سایر رسانه های سیاستمداران که پرداختی در بر ندارند.

Ocasio-Cortez به درخواست های من برای مصاحبه در مورد استفاده خود از رسانه های اجتماعی پاسخ نداد. فیس بوک ، صاحب اینستاگرام ، نیز به تلاش های مکرر من برای پاسخ به سوالات این پست پاسخ نداد. جای تأسف دارد ، زیرا بحث تولید مثبتی در مورد تعهداتی که شرکتهای فناوری برای حفظ منافع عمومی دارند ، فراتر از آنچه توسط انگیزه سود و سرمایه گذاران آنها انجام شده است ، انجام می شود.

این نوع بازتاب ، مشارکت سهامداران ، و خودتنظیمی یک تغییر خوشایند از رویکرد صنعت فناوری تاکنون است ، که متأسفانه لابی علیه مقررات موجود برای سلب مسئولیت و افشای اعمال شده در انتخابات آنلاین را نشان می دهد. نتیجه این شده است که پول تاریک فراهم شودانتقال به رسانه های تاریک اجتماعی بدون پاسخگویی یا انتساب ، ایجاد یک مشکل بزرگ و در حال رشد برای دموکراسی ما و سایر سیاست ها در سراسر جهان. برای بازنویسی و اصلاح قوانین ما به روشهایی که انتظارات صریحی را برای شرکتهای خصوصی که میزبان سخنرانی های سیاسی و محتوای دولت هستند برای حفظ آن ایجاد کند.

البته نباید فراموش کرد که سیستم عامل های شبکه های اجتماعی از قبل ارزشمند ایجاد کرده اند راه هایی برای تعامل سیاسی مردم. ویژگی های مدنی که فیس بوک در سال های اخیر اضافه کرده است فوق العاده است ، ما را به دولت های محلی و نمایندگان متصل می کند ، و با استفاده از یک دکمه محاوره ای می توان سالن های شهر مجازی را توزیع کرد. با این حال ، آنچه باید همراه این عبارات دیجیتالی جدید از روند سیاسی ما باشد ، انتظار صریح سیاستمداران برای حفظ و دسترسی به بیانیه های عمومی است.

شرکت های فناوری باید با همکاری دولت ها تلاش کنند تا با آموزش افراد منتخب ، سابقه را حفظ کنند. رهبران در مورد چگونگی بهبود اعتماد عمومی از طریق شفافیت و پاسخگویی - نه فقط نحوه پرداخت به آنها برای استفاده از تبلیغات هدفمند برای به دست آوردن یا حفظ قدرت.

پیش فرض باید برای حفظ باشد ، نه انقضا.


UI زیبا و کارآمد Android
[ بازدید : 20 ] [ امتیاز : 3 ] [ نظر شما :
]

UI زیبا و کارآمد Android

دوشنبه 14 تير 1400
13:35
علیرضا ایرانی

UI زیبا و کارآمد Android

در اینستاگرام ، ماموریت ما این است که به مردم کمک کنیم لحظه های جهان را ثبت و به اشتراک بگذارند. ما به لحظاتی که مردم در سیستم عامل ما به اشتراک می گذارند بسیار اهمیت می دهیم ، بنابراین افزایش دید مردم نسبت به این لحظات واقعاً مهم است. اینستاگرام اخیراً طراحی جدیدی را برای Explore ارائه کرده است که شامل "کانال های ویدیویی" است که در یک تجربه جدید و تمام صفحه و همهجانبه بازی می کنند. ما رابط کاربری خود را برای سهولت تماشای فیلم ها بهینه کرده ایم و این به عنوان یک مثال عالی در مورد نحوه ایجاد رابط کاربر در Android به کار می رود. ما روش و تکنیک های خود را به اشتراک خواهیم گذاشت ، و امیدواریم که آنها به شما کمک کنند تا ظاهر و احساس برنامه های خود را بهبود بخشید!

نمای کلی: نمایشگر همهجانبه

همانطور که در حال ساخت این نمایشگر ویدیو بودیم ، ما چندین هدف در ذهن داشتیم. ما می خواستیم یک تجربه کاربری جذاب را در جایی که می خواهید فیلم های خنده دار ، خلاقانه و جذاب از تعطیلات و رویدادهای خاص مانند هالووین ، شب سال نو و اسکار را "بنشینید و تماشا کنید" ارائه دهیم. بیننده در انتهای هر ویدیو به طور خودکار برای شما پیمایش می کند ، اما با این وجود می توانید بر روی بیننده کنترل کنید که می توانید با سرعت دلخواه پیمایش کنید (مانند خبرمایه). ما همچنین به بیننده غوطه وری جلوه ای جدید بخشیدیم تا آن را به تجربه ای متمایز از خوراک تبدیل کنیم. تفاوت های مهمی که باید توجه داشته باشید عبارتند از:

بیننده ویدیوی پخش شده را در وسط صفحه برای شما صفحه بندی می کند و مجبور نیستید پیمایش کنید. در فید ، باید دستی بکشید و مطمئن شوید که فیلم روی صفحه است. در بیننده ، تغییر به ویدئوی قبلی یا بعدی همانند ضربه زدن یا ضربه زدن ساده است. ما رابط کاربری غیرضروری (مانند نمادهای ویدیو و ابزار بازخورد) را حذف می کنیم تا حواس پرتی کمتری ایجاد شود. > برای اینکه احساس غوطه ور شدن در بیننده ایجاد شود ، از حالت تمام صفحه و پنهان کردن نوار وضعیت استفاده می کنیم. بیننده دارای یک موضوع تاریک است و فقط ویدیوی مرکزی برجسته شده است تا تمرکز در حالی که آسان تر است در حال پخش است.

نمایشگر غوطه وری به عنوان یک زیر کلاس از ListView ساخته شده است ، که ما کنترل رویداد لمسی سفارشی را با غلبه بر dispatchTouchEvent () به آن اضافه کردیم. این به ما امکان می دهد رویدادهای لمسی را از طریق GestureDetector به شنونده ژست خود تغییر مسیر دهیم ، و سپس مشخص می شود که آیا باید این رویدادها را مصرف کند یا یک عملکرد سفارشی را انجام دهد یا اینکه کاری انجام ندهید و فقط به ListView اجازه دهید آنها را کنترل کند. بیایید به عنوان مثال یک اقدام سریع انجام دهیم. هنگامی که یک ویدیو را در بیننده پخش می کنید ، شنونده اشاره ما آن را مصرف می کند و یک انیمیشن صفحه بندی سفارشی را آغاز می کند. عملکرد نرمال ListView آغاز نخواهد شد:

Override
بولی عمومی onFling (MotionEvent e1 ، MotionEvent e2 ، float speedX ، float speedY) {
  .. اگر سرعت Y آستانه صفحه بندی را برآورده می کند ، صفحه بندی را در جهت صحیح آغاز کنید ..
  .. دیگر ، سریع به ویدئوی فعلی برگردید ..
  
  بازگشت درست؛
} 

سایر اقدامات پیمایشی مانند کشیدن توسط شنوندگان اشاره ما مصرف نمی شود ، و در عوض به ListView ارسال می شوند تا همچنان بتوانید بیننده را همانطور که با ListView معمولی انجام می دهید بکشید.

UI زیبا: لذت بردن از کاربران با انیمیشن های ظریف و طبیعی

انیمیشن ها جالب هستند. به همین دلیل ، آنها هستنداغلب سو mis استفاده می شود وسوسه انگیز است که موارد پر زرق و برق اضافه کنید که در اولین دفعات مشاهده بسیار جالب به نظر می رسند ، اما به سرعت بیزار می شوند. بهترین انیمیشن ها فاصله بین عمل و واکنش را پاک می کنند ، و تغییرات عناصر UI را در پاسخ به یک ماشه خارجی یا داخلی (به عنوان مثال ورودی کاربر ، پخش ویدیو و غیره) روشن می کند. آنها سریع ، صاف و ظریف هستند. در واقع ، آنها آنقدر ظریف هستند که ممکن است توسط کاربر بصورت آگاهانه به عنوان انیمیشن ثبت نشوند ، بلکه باعث ایجاد یک احساس کلی لذت می شوند. برای بیننده همهجانبه ، از ترکیب انیمیشن های آلفا و مقیاس برای برجسته سازی برخی از عناصر UI در حین پیمایش استفاده کردیم. ما برای ایجاد احساس طبیعی در این انیمیشن ها ، به جای چند جمله ای ، از استحکامات مبتنی بر فنر استفاده کردیم.

آلفا انیمیشن

بگذارید بگوییم برای نمایش یا ناپدید شدن در رابط کاربری خود به نمایی نیاز دارید. برای دستیابی به این اثر ، معمولاً فقط قابلیت مشاهده آن را از طریق setVisibility (View.VISIBLE) یا setVisibility (View.GONE) تغییر می دهید. اما هنگام تست ، ممکن است کاملاً ناموزون باشد زیرا هیچ تغییری وجود ندارد اما رابط کاربری شما ناگهان تغییر می کند. انیمیشن های آلفا می توانند این تجربه را بسیار زیباتر کنند. ما از بسیاری از انیمیشن های آلفا در بیننده همهجانبه استفاده می کنیم ، از جمله:

محو /باز کردن سرصفحه ویدیو حاوی نام کاربری > > محو شدن /از بین بردن پوشش مبهم پوشش تار برای یک فیلم بیکار محو /در سایه های بالا و پایین برای ویدیوی مرکز هنگام ضربه زدن مضاعف برای پسندیدن

به عنوان نمونه سرآیند ویدیو ظاهر می شود ، در اینجا نحوه حرکت با و بدون انیمیشن آلفا هنگام رفتن به ویدیوی دیگر به نظر می رسد: چپ (بدون انیمیشن) ، راست (همراه با انیمیشن):

با از بین رفتن هدر فعلی و محو شدن هدر بعدی ، انیمیشن های آلفا این تجربه ها را طبیعی تر و روانتر می کنند. و خارج و UI احساس تزلزل می کند.

فیزیک بهار

Rebound کتابخانه ای است که توسط ویل بیلی (مهندس همکار اینستاگرام) ساخته شده است و کاربرد فیزیک بهار را در انیمیشن ها آسان می کند. ما برای بسیاری از انیمیشن ها در برنامه خود از Rebound استفاده می کنیم زیرا معتقدیم که پویایی بهاری باعث طبیعی تر نشان دادن آنها از درون یابی های چند جمله ای ارائه شده توسط کلاس های انیمیشن و انیماتور بومی Android است. همچنین ، Rebound به ما این امکان را می دهد که خصوصیات دنیای واقعی مانند سرعتی که کاربر انگشت خود را روی صفحه می چرخاند در حرکت فنر قرار دهد.

انیمیشن صفحه بندی به سرعت پرتاب احترام می گذارد به گونه ای که اگر آهسته می چرخید ، بیننده با سرعت پایین مربوطه صفحه بندی می شود. اگر سریع پرواز کنید ، بیننده با سرعت بالا مربوطه صفحه بندی می کند. این تجربه طبیعی به همین دلیل است که ما فنرها را برای هدایت انیمیشن در بیننده انتخاب کردیم. هنگام ساختن بیننده ، ما با یک فنر شروع به همگام سازی همه انیمیشن هایی که هنگام حرکت به طور موازی اجرا می شوند ، می کنیم: انیمیشن صفحه بندی و انیمیشن آلفا. ما این تصمیم را گرفتیم زیرا اگر به عنوان مثال ، انیمیشن صفحه بندی قبل از انیمیشن های آلفا به پایان برسد ، حتی بعد از اینکه حرکت آنها متوقف شود ، نماها همچنان تغییر می کنند. ساختار کد و مثال پرتاب:

شی پیمایشگر ما ، PagingListViewScroller ، فنر را محصور می کنداطلاعات را مانند موقعیت فعلی لیست فیلم مرکزی کار می کند و ردیابی می کند. ما همچنین دارای ListView ، اسکرابر و سایر اجزای سفارشی (به عنوان مثال قطعه) هستیم که به اعلان های پیمایشگر گوش می دهند. هنگامی که یک ویدیو را در بیننده پرتاب می کنید ، به شرح زیر عمل می شود: جبران شود. سپس هر وقت مقدار بهار به روز شود ، اسکرولر مطلع می شود که به نوبه خود پاسخ مناسب هر شنونده را برای اقدام فراخوانی می کند.

مقیاس های متحرک

از انیمیشن های مقیاس می توان برای ایجاد جلوه های دیداری مکمل رابط کاربر استفاده کرد. هنگام ورود به بیننده غوطه وری ، یک انیمیشن افتتاحیه داریم که در آن پس زمینه سیاه با ارتفاع صفر از وسط صفحه شروع می شود و سپس مقیاس بندی می شود تا کل صفحه را پر کند ، پس از آن در بیننده غوطه ور محو می شویم. انگیزه این کار تقلید از رفتار روشن کردن تلویزیون قدیمی و دادن حس سرگرم کننده و نوستالژیک به این انتقال بود. چپ (بدون انیمیشن) ، راست (با انیمیشن):

انتقال با انیمیشن بسیار نرمتر است و ما از تغییر ناگهانی UI که قبلاً با انیمیشن های آلفا بحث کردیم ، جلوگیری می کنیم.

رابط کاربری مجری: اختیاری نیست

ساخت رابط کاربر با انیمیشن های جالب و طراحی های زیبا از اهمیت برخوردار است ، اما اگر عملکردی نداشته باشد ، ارزش هیچ یک از آنها نیست. با انجام بهینه سازی های صحیح ، می توانیم طراحی و احساس رابط کاربری را بدون افت عملکرد کاهش دهیم. با استفاده از سلسله مراتب Viewer برای تجزیه و تحلیل زمان رندر مشاهده و زمان ردیابی به روش نمایه ، ما بیننده غوطه وری را بهینه کردیم تا تجربه ای روان فراهم کنیم.

کاهش تعداد بازدیدها

یک بهینه سازی ما ساخته شده به بیننده استفاده از حداقل تعداد بازدید بود. این چیزی است که باید در هر برنامه ای در نظر بگیرید. هرچه تعداد بازدیدها روی صفحه بیشتر باشد ، دستگاه شما برای ارائه آنها کار بیشتری انجام می دهد. علاوه بر این ، آنها حافظه و زمان را برای نمونه گیری می گیرند ، که می تواند به طور قابل توجهی حافظه را در دستگاه های پایین تر تحت تأثیر قرار دهد و سرعت بارگذاری UI را کاهش دهد. اولین اجرای ما در هر ویدئو چهار بازدید داشت:

پوشش تار تصویر روی جلد پوشش رنگ تیره >
    سایه بالا >
      پایین سایه

      ما این نماها را به یک ImageView سفارشی که منبع روی تصویر روی صفحه تاری تنظیم شده است ، کاهش می دهیم. سپس ما از روش onDraw () آن استفاده می کنیم تا رنگ را برای پوشش تیره رنگ و دو نقاشی ، یکی برای هر سایه ترسیم کنیم. در مراحل انیمیشن ، روی هر یک از این عناصر یک آلفای سفارشی تنظیم می کنیم و نمای را نامعتبر می کنیم ، بنابراین روش () onDraw آن فراخوانی می شود و وضعیت فعلی انیمیشن را منعکس می کند.

      بهینه سازی آلفا انیمیشن ها

      انیمیشن های متعدد آلفا در بیننده غوطه وری وجود دارد که هنگام پیمایش شما اتفاق می افتد ، بنابراین ما مجبور شدیم نحوه تغییر ویژگی آلفای عناصر را بهینه کنیم. روش های مختلفی برای تغییر ویژگی آلفا وجود دارد - یکی این همه setAlpha (شناور) در یک View است. این روش یک فرایند دو مرحله ای است که در آن مرحله اول اختصاص یک بافر خارج از صفحه در حافظه GPU به نام لایه سخت افزاری استو منظره را بر روی آن ترسیم کنید. سپس در مرحله دوم ، GPU پیکسل ها را از لایه سخت افزاری به صفحه کپی می کند و هر مقدار آلفایی را که تنظیم می کنیم ، اعمال می کند. مزیت این فرآیند دو مرحله ای این است که ترکیب آلفا روی همپوشانی محتوای صفحه صحیح است. با این حال ، نکته منفی قابل توجه این است که مرحله اول هزینه های اضافی زیادی را به شما اضافه می کند.

      دو روش برای بهینه سازی این روش وجود دارد ، اما هر یک از آنها دارای جابجایی است: LAYER_TYPE_HARDWARE ، null)؛

      یک روش این است که نوع لایه سخت افزار را روی نمای مورد نظر خود تنظیم کنید. این لایه سخت افزاری را حافظه پنهان کرده و مجدداً از آن استفاده می کند تا فقط یک بار مرحله اول را انجام دهیم. اگرچه این روش ترکیب آلفا را صحیح نگه می دارد و باعث انیمیشن آلفا می شود ، اما همچنان حافظه GPU را اشغال می کند ، بنابراین باید به خاطر داشته باشید که پس از استفاده از لایه ، لایه را آزاد کنید. همچنین ، اگر بازدید را بیش از حد نامعتبر کنید ، این روش بسیاری از عملکردهای خود را از دست می دهد زیرا مرحله اول با هر نامعتبر دوباره اجرا می شود. از این رو برای بیننده غوطه وری قابل استفاده نیست زیرا بیننده بر روی ListView ساخته شده است ، که به دلیل بازیافت و بازسازی مجدد مشاهده ، اغلب بازدیدهای فرزندان خود را بی اعتبار می کند.

      Override public boolean hasOvelappingRendering () { بازگشت نادرست ؛ }

      روش دیگر ایجاد یک نمای سفارشی و لغو این روش برای بازگشت نادرست است. با عبور از خاصیت آلفا ، این لایه از سخت افزار عبور کرده و مستقیماً به صفحه نمایش کشیده می شود. یک نکته منفی این است که ترکیب آلفا روی همپوشانی محتوا نادرست است ، اما این ممکن است بسته به برنامه شما مشکلی نداشته باشد. اگر می خواهید در چندین نمایش انیمیشن آلفا ایجاد کنید ، مانند مورد نمایشگر همهجانبه ، ممکن است مجبور شوید تعداد زیادی نمای سفارشی ایجاد کنید. مهمتر از همه ، این روش فقط در سطح 16 API و بالاتر پشتیبانی می شود.

      راه دیگر برای تغییر ویژگی آلفا فراخوانی setAlpha (int) در یک Drawable است. ما این روش را برای انیمیشن های آلفا در نمایشگر همهجانبه انتخاب کردیم زیرا هیچ یک از رویکردهای بهینه سازی بالا در مورد استفاده ما نیست. این ویژگی آلفای نمونه قابل ترسیم را تغییر می دهد ، برخلاف یک دیدگاه. همچنین از هیچ لایه سخت افزاری استفاده نمی کند ، بنابراین نقاشی مستقیماً روی صفحه کشیده می شود. در مقایسه با رویکرد hasOvelappingRendering () ، این در دو حساب بهتر است. این روش نه تنها در تمام سطوح API پشتیبانی می شود ، بلکه می توانیم به جای تعریف نمای سفارشی ، به راحتی خاصیت آلفای قابل ترسیم را که در نمای اصلی خود قرار دارد تغییر دهیم. نکته منفی این است که ترکیب آلفا روی همپوشانی محتوای نادرست خواهد بود. با این حال ، این برای بیننده قابل قبول است زیرا موارد بسیار کمی از مواردی که با هم تداخل دارند وجود دارد و ما حتی هنگام همپوشانی عناصر به 100٪ ترکیب صحیح آلفا نیازی نداریم.

      در اینجا یک مثال در بیننده غوطه وری وجود دارد که تفاوت را نشان می دهد در عملکرد بین دو روش setAlpha: چپ (setAlpha در نماها) ، راست (setAlpha در نمودارها):

      با تنظیم آلفا روی نماها ، بیننده شروع به لکنت می کند در حالی که پیمایش می کنیم و عملکرد آن با تخصیص لایه های سخت افزاری بدتر می شود. با تنظیم آلفا روی نقاشی ها ، بیننده صاف می مانددر سرتاسر ناوبری.

      بازنمایی نماهای خاص

      طراحی مجدد فقط نماهایی که تغییر کرده اند ، به ویژه در طول انیمیشن ها مهم است. برای ListView ، این به این معنی است که فقط نماهای کودک که خصوصیات آنها تغییر کرده است به جای فراخوانی notifyDataSetChanged () در آداپتور ، که به طور کلی کل ListView را ترسیم می کند ، نامعتبر می شود. در بیننده غوطه وری ، ما در طول انیمیشن های خود با notifyDataSetChanged () تماس نمی گیریم زیرا ما فقط می خواهیم تغییرات وضعیت UI در ویدیوی فعلی و ویدیوی بعدی را به جای کل لیست منعکس کنیم.

      Wrapping Up < /h1>

      برای هر یک از ویژگی های ما ، ما سعی در ارائه بهترین تجربه کاربر ممکن بدون پس گرفتن عملکرد داریم. بیننده غوطه وری از این قاعده مستثنی نیست. ما از انیمیشن های مختلف استفاده کردیم تا بازدید ویدئو در اینستاگرام را با لذت بیشتری جلب کنیم ، اما همچنین تلاش زیادی کردیم تا بهینه سازی عملکرد را انجام دهیم تا اطمینان حاصل شود که این لذت در میان همه کاربران نه تنها در کاربران با دستگاه های پیشرفته به اشتراک گذاشته شده است. ما امیدواریم که شما بتوانید برخی از رویکردهای ما برای ایجاد تجربیات زیبا و کارآمد را در توسعه Android خود قرار دهید!

      کوین یونگ مهندس نرم افزار در اینستاگرام است.


      پروفایل CPython در اینستاگرام
      [ بازدید : 19 ] [ امتیاز : 3 ] [ نظر شما :
      ]

پروفایل CPython در اینستاگرام

دوشنبه 14 تير 1400
13:35
علیرضا ایرانی

پروفایل CPython در اینستاگرام

اینستاگرام پایتون را در یکی از بزرگترین تنظیمات جهان به کار می گیرد ، با استفاده از آن برای پیاده سازی "منطق تجارت" مورد نیاز برای خدمت رسانی 800 میلیون کاربر فعال ماهانه. ما از پیاده سازی مرجع پایتون ، معروف به CPython ، به عنوان زمان اجرا برای اجرای کد خود استفاده می کنیم. همانطور که رشد کرده ایم ، تعداد ماشین آلات مورد نیاز برای تأمین امنیت کاربران ما کمک قابل توجهی در رشد نیازهای زیرساختی ما کرده است. این دستگاه ها به CPU متصل هستند و در نتیجه ، ما دقیقاً کارایی کدی را که می نویسیم و استقرار می دهیم ، دقیقاً مورد بررسی قرار می دهیم و بر ساخت ابزارهایی برای شناسایی و تشخیص رگرسیون عملکرد تمرکز کرده ایم. این همچنان به ما کمک می کند ، اما رشد پیش بینی شده در سطح وب ما را بر آن داشت تا منابع ناکارآمدی را در زمان اجرا بررسی کنیم.

شروع کار

برای تعیین آنچه برای بهینه سازی نیاز داریم و اینکه از کدام تکنیک ها باید استفاده کنیم ، باید بفهمیم:

حجم کار اینستاگرام از نظر مفسر چگونه است ، و جایی که مفسر وقت خود را می گذراند وقتی که ما را اجرا می کرد کد.

ما در هنگام اجرای کد سرور اینستاگرام با جمع آوری بیت های مختلف داده از CPython شروع کردیم. جای تعجب نیست که از دیدگاه مفسر ، حجم کار اینستاگرام به نظر یک شئ گرا و حجم کار وب سرور است: uli> حجم کار ما بی خطر نبود - 94٪ حلقه ها پس از چهار بار تکرار یا کمتر خاتمه یافت. دسترسی به ویژگی در رده بعدی کدپردازها قرار دارد که بیشترین میزان مصرف را دارد و 28٪ دیگر از زمان صرف شده در مفسر را به خود اختصاص داده است. بارهای صفات به ویژه چندشکلی نبودند. 85٪ بارها در سایتهای تک شکل رخ داده است.

بر اساس داده های بالا ، ما تصمیم گرفتیم برای کاهش هزینه محاسباتی تماس های عملکردی و دسترسی ویژگی ها تلاش کنیم.

روش جمع آوری داده

ما با استفاده از مترجمی که در محیط آزمایشگاه ما InstaLab در حال اجرا است ، تمام داده های خود را جمع آوری كردیم. InstaLab ترافیک تولید را به وب سرورهایی که در یک محیط جداگانه در حال اجرا هستند ، با استفاده از ترکیبی از درخواست ها که از پنج نمای اصلی گرفته شده است (با دستورالعمل CPU) دوباره بازی می کند. این یک روش برای جمع آوری داده های عملکرد نماینده بدون ترس از تأثیر منفی بر تجربه کاربر به ما ارائه می دهد. برای هر مجموعه داده مختلف ، ما از CPython استفاده کردیم ، یک مفسر جدید ساختیم و داده های مربوطه را از InstaLab جمع آوری کردیم.

توزیع فرکانس بایت کد

از دیدگاه مفسر ، اینستاگرام فقط دنباله ای از دستورالعمل های Bytecode برای اجرا. به عنوان اولین قدم در درک اینکه مفسر چه کاری انجام می دهد ، ما CPython را برای جمع آوری فرکانس های اجرای بایت کد تنظیم کردیم. ده دستورالعمل برتر براساس فرکانس در نمودار زیر نشان داده شده است:

< /img>

بلافاصله متوجه شدیم که LOAD_FAST تحت سلطه است. در حقیقت ، LOAD_FAST ، STORE_FAST و LOAD_CONST تقریباً 40٪ از کل کدهای اجرا شده را تشکیل می دهند. این انتظار می رفت - CPython یک ماشین پشته است و هر یک از این دستورالعمل ها مقادیر را به /از پشته operand منتقل می کنند. اگرچه این دستورالعمل ها ارزان هستند ، اما به طور مداوم اجرا می شوند و ترافیک حافظه ایجاد می کنند. این تکنیک های پیشنهاد شده برای از بین بردن بارها و ذخیره ها (به عنوان مثال تغییر به کد رجیستری مبتنی بر کد) یک بهینه سازی موثر است.وقتی کدهای کد بالا را استثنا کردیم ، می توانستیم درک بهتری از "کار واقعی" انجام شده توسط مفسر هنگام اجرای کد اینستاگرام داشته باشیم. نمودار زیر توزیع فرکانس اجرا را برای بیست کد برتر (از 120 مورد کل) نشان می دهد.

این دستورالعمل ها 90٪ از توزیع باقیمانده را تشکیل می دهند. ما آنها را به طور گسترده ای در دسته ها دسته بندی کردیم: YIELD_VALUE ، CALL_FUNCTION_KW ، SETUP_EXCEPT دستکاری کانتینر - BINARY_SUBSCR ، BUILD_TUPLE ، UNPACK_SEQUENCE Operand Stack Manipulation - POP_TOP ، LOAD_DEREF آنچه را که ما می توانیم مشاهده کنیم حجم کاری شی گرا ، وب سرور (برخلاف حجم کاری عددی).

زمان صرف شده برای اجرای کد بایت

نگاه کردن به فرکانس های اجرا فقط بخشی از داستان را بیان کرد. علاوه بر این که می دانستیم مفسر چه کاری انجام می دهد ، ما همچنین می خواستیم بدانیم که مفسر بیشتر وقت خود را در کجا سپری می کند. برای این منظور ، ما تعداد دستورالعمل های CPU را که هنگام اجرای هر کد کد با استفاده از API های perf_event بازنشسته شده اند ، اندازه گیری کردیم. ما با خواندن یک شمارنده دستورالعمل سخت افزاری ، هر بدنه کد در حلقه اعزام مفسر را براکت کردیم ، سپس دو مقدار را برای محاسبه "زمان" صرف شده برای اجرای کد کد کردیم. برای مواردی که تماس مجدداً به مفسر یا توابع C انجام می شود (به عنوان مثال خانواده کدگذارهای CALL_FUNCTION) ، ما مقدار "زمان" صرف شده در تماس گیرنده را از هزینه منسوب به کدگذار کسر می کنیم. نمودار زیر 10 کد کد برتر را بر اساس دستورالعمل های تجمعی CPU بازنشسته نشان می دهد.

این داده ها کمی متفاوت تر ترسیم می شوند ، زیرا فراخوانی عملکرد و بارگذاری ویژگی به سر توزیع پرش می کند. از نظر "زمان صرف شده" ، بیشترین رده های کد منبع ساز با منابع زیاد عبارتند از: uli> دستکاری پشته Operand - LOAD_FAST ، STORE_FAST ، LOAD_CONST

بر اساس داده های بالا ، به عنوان اولین قدم تصمیم گرفتیم زمان خود را برای بهینه سازی دسترسی ویژگی ها و کاهش سربار تماس عملکردی صرف کنیم.

< h1> تسریع دسترسی به ویژگی

یکی از تکنیک های تکرار شده برای تسریع دسترسی به ویژگی و ارسال روش در زمان استفاده از زبان پویا ، حافظه پنهان چند شکل است. حافظه نهان داخلی ، در ترکیب با ذخیره ویژگی متراکم (با استفاده از چیزی مانند کلاسهای پنهان) ، می تواند سرعت جستجوی ویژگی را به طرز چشمگیری تسریع کند. با این حال ، اثر آنها به درجه چند شکل بودن در سایت های تماس بستگی دارد. ما از CPython استفاده کردیم تا انواع مختلفی را که برای هر اجرای LOAD_ATTR مشاهده شده ثبت کند تا پتانسیل ذخیره سازی درون خطی را بسنجد. نمودار زیر توزیع LOAD_ATTR ها را بر اساس درجه چند شکل بودن نشان می دهد.

بر اساس داده های بالا ، ذخیره داخلی به نظر می رسد که این یک روش موثر برای تسریع دسترسی به ویژگی است. تقریباً 85٪ از LOAD_ATTR ها در سایت های یک شکل رخ داده اند. یک حافظه پنهان با اندازه چهار باید بتواند تقریباً 96٪ از بارهای مشخصه را کنترل کند.

حلقه بار کاری

آخرین س weالی که می خواستیم پاسخ دهیم این بود: "کد ما چقدر حلقه است ؟ " پاسخ به این س helpedال به ما کمک کرد تا مشخص کنیم بهینه سازی های موثر در کاهش سربار حلقه در سرعت بخشیدن به حجم کار ما چگونه است. ما از CPython استفاده کردیم تا تعداد تکرارهای انجام شده توسط هر نمونه از یک حلقه را ثبت کند. نمودار زیر نشان می دهدتوزیع نمونه های حلقه گروه بندی شده بر اساس تعداد تکرارهای انجام شده.

همانطور که می بینیم ، حجم کار ما کم نیست. در واقع ، 94٪ حلقه ها پس از چهار بار تکرار یا کمتر خاتمه یافتند.

نتیجه گیری

در نتیجه این تمرین ، ما دو منبع عمده عدم کارآیی برای بار کاری خود در CPython را شناسایی کردیم: فراخوانی عملکرد الزامات دسترسی سربار و ویژگی. داده های ما جمع آوری شده نشان می دهد که تکنیک های شناخته شده باید در کاهش ناکارآمدی موثر باشند. به عنوان مرحله بعدی ، ما از این اطلاعات برای هدایت تلاش های خود برای بهینه سازی CPython استفاده می کنیم.

مت پیج مهندس نرم افزار در تیم کارآیی و قابلیت اطمینان اینستاگرام است.


[ بازدید : 18 ] [ امتیاز : 3 ] [ نظر شما :
]
تمامی حقوق این وب سایت متعلق به گوشه تنهایی بلند رفقای گنگ در تابستان است. || طراح قالب avazak.ir
ساخت وبلاگ تالار اسپیس فریم اجاره اسپیس خرید آنتی ویروس نمای چوبی ترموود فنلاندی روف گاردن باغ تالار عروسی فلاورباکس گلچین کلاه کاسکت تجهیزات نمازخانه مجله مثبت زندگی سبد پلاستیکی خرید وسایل شهربازی تولید کننده دیگ بخار تجهیزات آشپزخانه صنعتی پارچه برزنت مجله زندگی بهتر تعمیر ماشین شارژی نوار خطر خرید نایلون حبابدار نایلون حبابدار خرید استند فلزی خرید نظم دهنده لباس خرید بک لینک خرید آنتی ویروس
بستن تبلیغات [X]