شرط بندی فوتبال : چگونه با خواندن RFC 1034 نیمی از روز هدر ندهیم


سایت شرط بندی فوتبال
بهترین سایت شرط بندی
سایت شرط بندی معتبر فوتبال

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

تنظیمات فعلی ما به خوبی کار می کند ، اما دارای دو عیب بزرگ است:

  • هر شاخه به ALB خاص خود نیاز دارد (این همان چیزی است که توسط منبع Ingress تولید می شود).
  • DNS است DNS است DNS است و بعضی اوقات طول می کشد تا تکثیر شود و ما نیاز به مدیریت یک رکورد (3-5 برای هر شاخه) داریم.

این خطاها بهم پیوسته است: اگر مجبور نباشم به هر شاخه ALB خود را بدهم ، می توانم از یک رکورد wildcard استفاده کرده و هر زیر دامنه را در دامنه اختصاصی شاخه خود به یک ALB هدایت کنم و اجازه دهم مسیر ALB کجا باشد آنها از طریق سرصفحه های میزبان تعلق دارند. این بدان معنی است که من می توانم بدون نیاز به همه آن ALB ها پس انداز کنم و می توانیم زمان DNS-DNS را به صفر برسانیم (و پیچیدگی های حاشیه نویسی و شرطی های خارجی-گسترش یافته در YAML ما).

(در حالی که چند دقیقه انتظار برای انتشار و حل DNS به نظر نمی رسد مشکل بزرگی باشد ، ما با بررسی اینکه واقعاً با استفاده از یک مسیر داخلی در نام میزبان جدید به محض اتمام ساخت استقرار ، باعث می شود که ما قبل از ایجاد رکورد و ذخیره سازی محلی دستگاه خود ، پاسخ NXDOMAIN را تا زمان انقضا TTL برای حل DNS حل کنیم.)

پیش از این ، این کار عملی بود ، اما به تلاش اضافی نیاز داشت که ارزش آن را نداشت – احتمالاً لازم است از طریق یک کنترل کننده سفارشی انجام شود که از اضافه کردن خدمات شما به یک شی object Ingress از طریق حاشیه نویسی های سفارشی مراقبت کند. این مسیر Fine ™ was بود (من حتی یک کنترل کننده اثبات مفهوم درست کردم که این کار را انجام داد) ، اما این بدان معنی بود که یک ابزار اضافی وجود دارد که اکنون باید مدیریت کنیم ، همراه با نیاز به ایجاد و مدیریت آن شی object اصلی Ingress .

وارد نسخه جدید کنترل کننده کنترل ورودی (و نام جدید آن است: aws-load-balancer-controller) که شامل یک جدید است IngressGroup ویژگی که دقیقا آنچه من نیاز دارم این مجموعه ای جدید از حاشیه نویسی را اضافه می کند که می توانم به Ingress خود اضافه کنم که باعث می شود همه منابع Ingress من قوانین هدایت یک ALB منفرد باشد نه ALB های منفرد.

“عالی!” با خودم فکر می کنم صبح که پروژه آزمایش نسخه جدید را شروع می کنم و می فهمم چگونه می خواهم این کار را انجام دهم (با استفاده از آن به عنوان فرصتی برای پاکسازی دسته ای از بدهی های فنی نیز).

من همه چیز را در جای خود قرار می دهم – من کنترل کننده aws-load-balancer-controller را در خوشه آزمایشی خود به روز کردم ، تمام سوابق ALIAS مخصوص شاخه را که برای ALB های قدیمی وجود داشت حذف کردم ، به خارجی-dns گفتم که دیگر منابع Ingress را مدیریت نکنید ، و یک کارت wildcal ALIAS راه اندازی کنید که با اشاره به ALB جدید من که همه این شاخه ها باید به اشتراک بگذارند

کار نمی کند

$ curl --header "Host: alb-v2.branch-deploy.com" https://alb-v2.branch-deploy.com
curl: (6) Could not resolve host: alb-v2.branch-deploy.com

اما اگر من مستقیماً با هدر میزبان مناسب با ALB تماس بگیرم ، این کار را انجام می دهد:

$ curl --header "Host: alb-v2.branch-deploy.com" --insecure https://internal-k8s-swiper-no-swiping.us-east-1.elb.amazonaws.com
<html><body>You are being <a href="https://alb-v2.branch-deploy.com/sign_in">redirected</a>.</body></html>

(╯ ° □ °) ╯︵ ┻━┻

من هیچ سرنخی ندارم که چه خبر است. من به وضوح می بینم که رکورد در Route53 وجود دارد ، اما من نمی توانم آن را به صورت محلی حل کنم ، و همچنین برخی از سرویس های تست DNS (. MX Toolbox) نمی تواند.

ممکن است گزینه “ارزیابی سلامت هدف” در کاراکتر وحشی باشد؟ آن را غیرفعال کرد و دوباره امتحان کرد ، هنوز چیزی نیست.

من کاملاً گیر افتاده و شروع به مرور سایت می کنم اسناد Route53 و این خط را پیدا کنید و فکر کنید این پاسخ به مشکل من است:

اگر رکوردی به نام * .example.com ایجاد کنید و سابقه.com ​​وجود ندارد ، مسیر 53 به درخواست های DNS برای مثال.com پاسخ می دهد با NXDOMAIN (دامنه ناموجود).

بنابراین ، من برای ایجاد رکورد برای branch-deploy.com می روم تا ببینم آیا شاید این باشد. اما هنوز این کار را انجام نمی دهد. این زمانی است که آن سطر را دوباره می خوانم و می فهمم که به هر حال برای من صدق نمی کند – من اولین بار آن را اشتباه خوانده بودم ، سعی نمی کنم شاخه-deploy.com را حل کنم. (خوانش اولیه من این بود که * .branch-deploy.com بدون وجود سابقه برای branch-deploy.com برطرف نمی شود).

Welp ، زمان کاوش در است RFC، چیزهای مبهمی وجود دارد که من اینجا گم کرده ام. تصور درست بود

RC های Wildcard اعمال نمی شوند:

– وقتی پرس و جو در یک منطقه دیگر است. یعنی ، نمایندگی پیش فرض های کارت وحشی را لغو می کند.

– هنگامی که نام پرس و جو یا یک نام بین دامنه wildcard و نام query وجود داشته باشد. به عنوان مثال ، اگر یک wildcard RR دارای نام مالک “* .X” باشد ، و این منطقه همچنین حاوی RR های متصل به BX باشد ، کارتهای wild برای درخواستهای نام ZX اعمال می شوند (با فرض اینکه هیچ اطلاعات صریح برای ZX وجود ندارد) ، اما نه به BX ، ABX یا X.

هوم ، آن گلوله دوم به نظر سرب می رسد. بگذارید به منطقه Route53 خود برگردم و نگاه کنم.

ノ (゜ – ゜ ノ)

آه ، من آن را می بینم.

یکی از ویژگی های سیستم استقرار شعبه ما این است که شما همچنین می توانید خط لوله نامه پستی ویژه شعبه خود داشته باشید. برای استفاده از آن ویژگی ، ایمیل می کنید yourself@your-branch.branch-deploy.com. برای ساخت آن کار ، هر شعبه یک رکورد MX در سایت-branch.branch-deploy.com شما بدست می آورد.

در اینجا مسئله نهفته است. اگر می توانید یک رکورد wildcard برای branch-deploy.com داشته باشید ، اگر یک رکورد MX (یا هر رکورد دیگری واقعاً) برای یک زیر دامنه مشخص وجود داشته باشد و سعی کنید از-branch.branch-deploy.com خود ، A / AAAA / بازدید کنید. وضوح CNAME از درخت به حیوان وحش صعود نمی کند. 🙃

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




سایت شرط بندی
سایت پیشبینی
سایت شرط بندی معتبر

شرط بندی فوتبال : افکار نوشتن یک اسکریپت Google App


سایت شرط بندی فوتبال
بهترین سایت شرط بندی
سایت شرط بندی معتبر فوتبال

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

Google Sheets یک بستر عالی برای افراد غیر برنامه نویس است

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

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

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

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

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

سخت ترین قسمت احراز هویت است

“منطق تجارت” در متن ها بسیار آسان بود. لیست اعضای موجود در کانال Slack خود را با اعضای ثبت شده در Patreon یا در لیست جداگانه خود مقایسه کنید. سپس از این مقایسه برای تولید لیست افرادی برای افزودن یا حذف از Slack استفاده کنید. تمام آنچه که لازم بود این بود که ایمیل ها را از لیست ها بیرون بکشید و چند عمل تفاوت را انجام دهید.

بخش اصلی دریافت لیست ها بود ، نه به معنای واکشی آنها از REST URL (که باز هم آسان است) ، بلکه برای جلب رضایت خدماتی است که اسکریپت برای دریافت این داده ها مجاز است. هر دو سرویس از OAuth برای مرتب سازی احراز هویت استفاده می کنند ، اما این استاندارد حتی با کتابخانه ای که اسکریپت های Google App ارائه می دهد هیچ نشانه ای از تمیز کردن و پخش آن نیست.

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

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

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

مستندات Google غیر صفر است

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

سازماندهی صفحه گسترده

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

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

این بسیار است که من می خواهم از پرونده های متنی جداگانه در یک برنامه خط فرمان استفاده کنم. به کاربر امکان می دهد داده های بارگیری نشده را مشاهده کند. من می توانم منطق برنامه را بدون بارگیری هر بار اجرا (و آزمایش) کنم. من می توانم یک برگه با داده های آزمون تنظیم کنم. یک جریان واضح و یک طرفه داده بین ورق ها و کد وجود دارد.

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

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

با شکار در اطراف API ، دیدم که بسیاری از عملیات صفحه گسترده به تعیین دامنه در صفحه گسترده بستگی دارد. من با استفاده از یک ردیف جدید اضافه می کردم
Sheet.appendRow، اما اگر محدوده ای را تعریف کنم (که می تواند کل صفحه باشد) ، می توانم استفاده کنم Range.setValues بجای. هنگامی که من این کار را کردم ، اضافه کردن ردیف ها به طور فوری انجام شد. من هیچ نکته ای در اسناد یا جای دیگری در وب برای آزمایش این مورد پیدا نکردم ، این مهم از آنجاست که کمبود این نوع اسناد مانع استفاده گسترده مردم از این سیستم عامل است.

به جستجوی API اجازه دهید چندین مقدار را جستجو کند

همانطور که در بالا ذکر کردم ، به دلیل مشکلات موجود در احراز هویت ، در نهایت از رابط REST برای داده های Patreon استفاده نکردم. اما دلیل دیگری برای حمایت از بارگیری CSV وجود داشت. Patreon API منبعی را شامل می شد که به من می گوید همه افرادی که طرفدار یک کمپین هستند ، برای این افراد شناسه Patreon و نام آنها را به من می دهد. اما برای بررسی صحیح لیست slack ، به ایمیل آنها نیز احتیاج داشتم. که من می توانم با گرفتن یک منبع نمایه شده توسط شناسه ، به دنبال آن باشم. با این حال لازم است که این کار را برای چند صد نفر انجام دهم ، و برای هر یک از آنها یک GET جداگانه لازم دارم.

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

من دوست دارم منطق برنامه را از صفحه گسترده IO جدا کنم

روش دستیابی به داده ها از صفحه گسترده استفاده از ستون و سطرهای مرسوم صفحه گسترده است (به عنوان مثال سلول “B22” یا دامنه “A2: E412”). این برای بسیاری از وظایف اسکریپت نویسی منطقی است ، زیرا برنامه نویسان در مورد دستکاری سلولهای صفحه گسترده به این مسئله فکر می کنند.

من تمایل دارم که چیزها را متفاوت ببینم ، داده هایم را به صورت ساختارهای اصلی داده های جاوا اسکریپت ترجیح می دهم ، به ویژه اینکه می توانم از JavaScript استفاده کنم خط لوله جمع آوری
اپراتورهای موجود در آنها

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

extractData(sheetName, firstCol, lastCol, mapper) {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(sheetName)
  const numRows = sheet.getLastRow()
  const range = `${firstCol}1:${lastCol}${numRows}`
  return sheet.getRange(range).getValues().map(mapper)
}

سپس می توانم از آن با کدی مانند این استفاده کنم:

const mapper = row => ({email: row[3], name: row[0], slackId: row[1]})
slackData = this.extractData("raw-slack-download", "A", "D", mapper)

هنگامی که آن را وارد آرایه کردم ، فهمیدم که نتایج آسان است ، اگرچه مجبور شدم یک مطلب ساده بنویسم Array.difference عملکردی که من به آن دسترسی نداشتم لوداش.

محیط توسعه قابل درک است

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

اگر کار پیچیده تری انجام می دادم ، در مورد ایجاد یک محیط بهتر تحقیق می کردم. یک احتمال این است که ببینم آیا می توانم اسکریپت را با استفاده از حالت عالی Tramp Emacs ویرایش کنم (که اجازه می دهد فایل های از راه دور را ویرایش کنید ، مثل اینکه آنها محلی هستند.) هنوز هم یک راه بهتر برای همگام سازی فایل های محلی با google drive ، به من اجازه می دهد تا آنها را حفظ کنم کد منبع در repo git. اما برای یک کار ساده مانند این ، حدود 150 خط کد ، ارزش بررسی این مسئله را نداشت که آیا این امکان وجود دارد.

خلاصه

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



سایت شرط بندی
سایت پیشبینی
سایت شرط بندی معتبر

شرط بندی فوتبال : Don’t Compare Averages


سایت شرط بندی فوتبال
بهترین سایت شرط بندی
سایت شرط بندی معتبر فوتبال

Imagine you’re an executive, and you’re asked to
decide which of your sales leaders to give a big award/promotion/bonus to.
Your company is a tooth-and-claw capitalist company that only considers
revenue to be important, so the key element in your decision is who has got
the most revenue growth this year. (Given it’s 2020, maybe we sell
masks.)

Here’s the all-important numbers.

nameaverage revenue increase (%)
alice5
bob7.9
clara5

And a colorful graph

Based on this, the decision looks easy. Bob, at just under 8%, has a
notably better revenue increase than his rivals who languish at 5%.

But lets dig deeper, and look at the individual accounts for each of our
salespeeps.

nameaccount revenue increases (%)
alice-121-3-1101381110
bob-0.5-2.5-6-1.5-2-1.8-2.380
clara374.55.54.855.2465

This account-level data tells a different story. Bob’s high performance
is due to one account yielding a huge 80% revenue increase. All his other
accounts shrank. With Bob’s performance based on just one account,
is he really the best salespeep for the bonus?

Bob’s tale is a classic example of one the biggest problems with
comparing any group of data points by looking at the average. The usual
average, technically the mean, is very prone to one outlier swinging the
whole value. Remember the average net worth of a hundred homeless people is
$1B once Bill Gates enters the room.

The detailed account data reveals another difference. Although Alice and
Clara both have the same average, their account data tells two very
different stories. Alice is either very successful (~10%) or mediocre (~2%), while Clara
is consistently mildly successful (~5%). Just looking at the average hides this
important difference.

By this point, anyone who’s studied statistics or data visualization is
rolling their eyes at me being Captain Obvious. But this knowledge isn’t
getting transmitted to folks in the corporate world. I see bar charts
comparing averages all the time in business presentations. So I decided to
write this article, to show a range of visualizations that you can use to
explore this kind of information, gaining insights that the average alone
cannot provide. In doing this I hope I can persuade some people to stop only
using averages, and to question averages when they see others doing that.
After all there’s no point eagerly collecting the data you need to be a
data-driven enterprise unless you know how to examine that data
properly.

A strip chart shows all the individual numbers

So the rule is don’t compare averages when you don’t know what the
actual distribution of the data looks like. How can you get a good picture
of the data?

I’ll start with the case above, when we don’t have very many
data points. Often the best way to go for this is a strip chart, which
will show every data point in the different populations.

show code
ggplot(sales, aes(name, d_revenue, color=name)) +
  geom_jitter(width=0.15, alpha = 0.4, size=5, show.legend=FALSE) +
  ylab(label = "revenue increase (%)") +
  geom_hline(yintercept = 0) +
  theme_grey(base_size=30)

With this chart we can now clearly see the lone high point for Bob,
that most of his results are similar to Alice’s worst results, and that Clara
is far more consistent. This tells us far more than the earlier bar chart,
but isn’t really any harder to interpret.

You may then ask, how to plot this nice strip chart? Most people who
want to plot some quick graphs use Excel, or some other spreadsheet. I
don’t know how easy it is to plot a strip chart in the average
spreadsheet, as I’m not much of a spreadsheet user. Based on what I see in
management presentations, it may be impossible, as I hardly ever see one.
For my plotting I use R, which a frighteningly powerful statistics
package, used by people who are familiar with phrases like “Kendall rank
correlation coefficient” and “Mann-Whitney U test”. Despite this fearsome
armory, however, it’s pretty easy to dabble with the R system for simple
data manipulation and graph plotting. It’s developed by academics as
open-source software, so you can download and use it without worrying about
license costs and procurement bureaucracy. Unusually for the open-source
world, it has excellent documentation and tutorials to learn how to use
it. (If you’re a Pythonista, there’s also a fine range of Python libraries
to do all these things, although I’ve not delved much into that
territory.) If you’re curious about R, I have a
summary
in the appendix of how I’ve learned what I know about it.

If you’re interested in how I generate the various charts I show
here, I’ve included a “show-code” disclosure after each chart which shows
the commands to plot the chart. The sales dataframes
used have two columns: name, and d_revenue.

What if we have a larger number of data points to consider? Imagine our
trio are now rather more important, each handling a couple of hundred
accounts. Their distributions still, however show the same basic characteristics, and we
can see that from a new strip chart.

show code
ggplot(large_sales, aes(name, value, color=name)) +
  geom_jitter(width=0.15, alpha = 0.4, size=2, show.legend=FALSE) +
  ylab(label = "revenue increase (%)") +
  geom_hline(yintercept = 0) +
  theme_grey(base_size=30)

One problem with the strip chart, however, is that we can’t see the
average. So we can’t tell whether Bob’s high values are enough to
compensate for this general lower points. I can deal with this by plotting
the mean point on the graph, in this case as a black diamond.

show code
ggplot(large_sales, aes(name, value, color=name)) +
  geom_jitter(width=0.15, alpha = 0.4, size=2, show.legend=FALSE) +
  ylab(label = "revenue increase (%)") +
  geom_hline(yintercept = 0) +
  stat_summary(fun = "mean", size = 5, geom = "point", shape=18, color = 'black') +
  theme_grey(base_size=30)

So in this case Bob’s mean is a bit less than the other two.

This shows that, even though I often disparage those who use means to
compare groups, I don’t think means are useless. My disdain is for those
who only use means, or use them without examining the overall
distribution. Some kind of average is often a useful element of a
comparison, but more often than not, the median is actually the better
central point to use since it holds up better to big outliers like Bob’s.
Whenever you see an “average”, you should always consider which is better:
median or mean?

Often the reason median is such an under-used function is because our tooling
doesn’t encourage use to use it. SQL, the dominant database query
language, comes with a built-in AVG function
that computes the mean. If you want the median, however, you’re usually
doomed to googling some rather ugly algorithms, unless your database has
the ability to load extension functions. If
some day I become supreme leader, I will decree that no platform can have
a mean function unless they also supply a median.

Using histograms to see the shape of a distribution

While using a strip chart is a good way to get an immediate sense of
what the data looks like, other charts can help us compare them in
different ways. One thing I notice is that many people want to use The One
Chart to show a particular set of data. But every kind of chart
illuminates different features of a dataset, and it’s wise to use several
to get a sense of what the data may be telling us. Certainly this is true
when I’m exploring data, trying to get a sense of what it’s telling me.
But even when it comes to communicating data, I’ll use several charts so
my readers can see different aspects of what the data is saying.

The histogram is a classic way of looking at a distribution. Here are
histograms for the large dataset.

show code
ggplot(large_sales, aes(value, fill=name)) +
  geom_histogram(binwidth = 1, boundary=0, show.legend=FALSE) +
  xlab(label = "revenue increase (%)") +
  scale_y_continuous(breaks = c(50,100)) +
  geom_vline(xintercept = 0) +
  theme_grey(base_size=30) +
 facet_wrap(~ name,ncol=1)

Histograms work really well at showing the shape of a single
distribution. So it’s easy to see that Alice’s deals clump into two
distinct blocks, while Clara’s have a single block. Those shapes are
somewhat easy to see from the strip chart too, but the histogram clarifies
the shape.

A histogram shows only one group, but here I’ve shown several together
to do the comparison. R has a special feature for this, which it refers to
as faceted plots. These kind of “small multiples” (a term coined by
Edward Tufte) can be very handy for comparisons. Fortunately R makes them
easy to plot.

Another way to visualize the shapes of the distributions is a density
plot, which I think of as a smooth curve of a histogram.

show code
ggplot(large_sales, aes(value, color=name)) +
  geom_density(show.legend=FALSE) +
  geom_vline(xintercept = 0) +
  xlab(label = "revenue increase (%)") +
  scale_y_continuous(breaks = c(0.1)) +
  theme_grey(base_size=30) +
  facet_wrap(~ name,ncol=1)

The density scale on the y axis isn’t very meaningful to
me, so I tend to remove that scale from the plot – after all the key
element of these are shapes of the distributions. In addition, since the
density plot is easy to render as a line, I can plot all of them on a
single graph.

show code
ggplot(large_sales, aes(value, color=name)) +
  geom_density(size=2) +
  scale_y_continuous(breaks = NULL) +
  xlab(label = "revenue increase (%)") +
  geom_vline(xintercept = 0) +
  theme_grey(base_size=30) 

Histograms and density plots are more effective when there are more
data points, they aren’t so helpful when there’s only a handful (as with
the first example). A bar chart of counts is useful when there are only a few
values, such as the 5-star ratings on review sites. A few years ago Amazon
added such a chart for its reviews, which show the distribution in
addition to the average score.

Boxplots work well with many comparisons

Histograms and density plots are a good way to compare different
shapes of distributions, but once I get beyond a handful of graphs then
they become difficult to compare. It’s also useful to get a sense of
commonly defined ranges and positions within the distribution. This is
where the boxplot comes in handy.

show code
ggplot(large_sales, aes(name, value, color=name)) +
  geom_boxplot(show.legend=FALSE) +
  ylab(label = "revenue increase (%)") +
  geom_hline(yintercept = 0) +
  theme_grey(base_size=30) 

The box plot focuses our attention on the middle range of the data, so
that half the data points are within the box. Looking at the graph we can
see more than half of Bob’s accounts shrank and that his upper quartile is
below Clara’s lower quartile. We also see his cluster of hot accounts at
the upper end of the graph.

The box plot works nicely with a couple of dozen items to compare,
providing a good summary of what the underlying data looks like. Here’s an
example of this. I moved to London in 1983 and moved to Boston a decade
later. Being British, I naturally think about how the weather compares in
the two cities. So here is a chart showing comparing their daily high
temperatures each month since 1983.

show code
ggplot(temps, aes(month, high_temp, color=factor(city))) +
  ylab(label = "daily high temp (°C)") +
  theme_grey(base_size=20) +
  scale_x_discrete(labels=month.abb) +
  labs(color = NULL) +
  theme(legend.position = "bottom") +
  geom_boxplot()

This is an impressive chart, since it summarizes over 27,000 data
points. I can see how the median temperatures are warmer in London during
the winter, but cooler in the summer. But I can also see how the
variations in each month compare. I can see that over a quarter of the
time, Boston doesn’t get over freezing in January. Boston’s upper quartile
is barely over London’s lower quartile, clearly indicating how much colder
it is in my new home. But I can also see there are occasions when Boston
can be warmer in January than London ever is during that winter month.

The box plot does have a weakness, however, in that we can’t see the
exact shape of the data, just the commonly defined aggregate points. This
may be an issue when comparing Alice and Clara, since we don’t see the
double-peak in Alice’s distribution in the way that we do with histogram
and density chart.

There are a couple of ways around this. One is that I can easily
combine the box plot with the strip chart.

show code
ggplot(large_sales, aes(name, value, color=name)) +
  geom_boxplot(show.legend=FALSE, outlier.shape = NA) +
  geom_jitter(width=0.15, alpha = 0.4, size=1, show.legend=FALSE) +
  ylab(label = "revenue increase (%)") +
  stat_summary(fun = "mean", size = 5, geom = "point", shape=18, color = 'black') +
  geom_hline(yintercept = 0) +
  theme_grey(base_size=30) 

This allows me to show both the underlying data, and the important
aggregate values. In this plot I also included the black diamond that I
used before to show the position of the mean. This is a good way to
highlight cases like Bob where the mean and median are quite different.

Another approach is the violin plot, which draws a density plot into
the sides of the boxes.

show code
ggplot(large_sales, aes(name, value, color=name, fill=name)) +
  geom_violin(show.legend=FALSE, alpha = 0.5) +
  ylab(label = "revenue increase (%)") +
  geom_hline(yintercept = 0) +
  theme_grey(base_size=30) 

This has the advantage of showing the shape of the distribution
clearly, so the double peak of Alice’s performance stands right out. As
with density plots, they only become effective with a larger number of
points. For the sales example, I think I’d rather see the points in the
box, but the trade-off changes if we have 27,000 temperature measurements.

show code
ggplot(temps, aes(month, high_temp, fill=factor(city))) +
  ylab(label = "daily high temp (°C)") +
  theme_grey(base_size=20) +
  labs(fill = NULL) +
  scale_x_discrete(labels=month.abb) +
  theme(legend.position = "bottom") +
  geom_violin(color = NA) 

Here we can see that the violins do a great job of showing the shapes
of the data for each month. But overall I find the box chart of this data
more useful. It’s often easier to compare by using significant signposts
in the data, such as the medians and quartiles. This is another case where
multiple plots play a role, at least while exploring the data. The box
plot is usually the most useful, but it’s worth at least a glance at a
violin plot, just to see if reveals some quirky shape.

Summing Up

  • Don’t use just an average to compare groups unless you understand
    the underlying distribution.
  • If someone shows you data with just an average ask: “what does the
    distribution look like?”
  • If you’re exploring how groups compare, use several different plots
    to explore their shape and how best to compare them.
  • If asked for an “average”, check whether a mean or median is better.
  • When presenting differences between groups, consider at least the
    charts I’ve shown here, don’t be afraid to use more than one, and pick
    those that best illustrate the important features.
  • above all: plot the distribution!

Acknowledgments

Adriano
Domeniconi, David Colls, David Johnston, James Gregory, John Kordyback, Julie Woods-Moss, Kevin Yeung, Mackenzie Kordyback, Marco Valtas, Ned Letcher, Pat Sarnacke, Saravanakumar Saminathan, Tiago Griffo, and Xiao Guo

commented on drafts of this article on internal mailing lists.

My experience learning R

I first came across R about 15 years ago, when I did a little work with
a colleague on a statistical problem. Although I did a lot of maths in
school, I shied away from statistics. While I was very interested in the
insights it offers, I was deterred by the amount of calculation it
required. I have this odd characteristic that I was good at maths but not
good at arithmetic.

I liked R, particularly since it supported charts that were hardly
available elsewhere (and I’ve never much liked using spreadsheets). But R
is a platform with neighborhoods dodgy enough to make JavaScript seem
safe. In recent years, however, working with R has become much easier due
to the work of Hadley Whickham – the Baron Haussmann of R. He’s led the
development of the “tidyverse”: a series of libraries that make R very
easy to work with. All the plots in this article use his ggplot2 library.

In recent years I’ve used R more and more for creating any reports that
make use of quantitative data, using R as much for the calculations as for
the plots. Here the tidyverse dplyr library plays a big role. Essentially
it allows me to form pipelines of operations on tabular data. At one level
it’s a collection pipeline on the
rows of the table, with functions to map and filter the rows. It then goes
further by supporting table-oriented operations such as joins and pivots.

If writing such excellent software isn’t enough, he’s also co-written
an excellent book to learn to use R: R for Data
Science
. I’ve found this to be a great tutorial on data analytics,
an introduction to the tidyverse, and a frequent reference. If you’re
at all interested in manipulating and visualizing data, and like to get
hands-on with a serious tool for the job, then this book is a great way to
go. The R community has done a great job with this and other books that help
explain both the concepts and tools of data science. The tidyverse
community has also built an first-rate open-source editing and development
environment called R Studio. I shall say no
more that when working with R, I usually use it over Emacs.

R certainly isn’t perfect. As a programming language it’s shockingly
quirky, and I’ve dared not stray from the tree-lined boulevards of simple
dplyr/ggplot2 pipelines. If I wanted to do serious programming in a
data-rich environment, I’d seriously consider switching to Python. But for
the kinds of data work I do, R’s tidyverse has proven to be an excellent
tool.

Tricks for a good strip chart

There’s a couple of useful tricks that I often reach for when I use a
strip chart. Often
you have data points with similar, or even the same values. If I plot
them naively, I end up with a strip chart like this.

show code
ggplot(sales, aes(name, d_revenue, color=name)) +
  geom_point(size=5, show.legend=FALSE) +
  ylab(label = "revenue increase (%)") +
  geom_hline(yintercept = 0) +
  theme_gray(base_size=30)

This plot is still better than that first bar chart, as it clearly
indicates how Bob’s outlier is different to his usual performance. But
with Clara having so many similar values, they all clump on top of each
other, so you can’t see how many there are.

The first of my tricks I use is to add some jitter. This adds some
random horizontal movement to the points of the strip chart, which allows
them to spread out and be distinguished. My second is to make the points
partly transparent, so we can see when they plot on top of each other.
With these two tricks, we can properly appreciate the number and position
of the data points.

Exploring the bin width for histograms

A histogram works by putting the data into bins. So if I have a bin
width of 1%, then all accounts whose revenue increase is between 0 and 1%
are put into the same bin, and the graph plots how many are in
each bin. Consequently the width (or amount) of bins makes a big
difference to what we see. If I make larger bins for this dataset, I get
this plot.

show code
ggplot(large_sales, aes(value, fill=name)) +
  geom_histogram(binwidth = 5, boundary=0,show.legend=FALSE) +
  scale_y_continuous(breaks = c(50,100)) +
  xlab(label = "revenue increase (%)") +
  geom_vline(xintercept = 0) +
  theme_grey(base_size=30) +
  facet_wrap(~ name,ncol=1)

Here the bins are so wide that we can’t see the two peaks of Alice’s
distribution.

The opposite problem is that if the bins are too narrow the plot
becomes noisy. So when I plot a histogram, I experiment with the bin
width, trying different values to see which ones help expose the
interesting features of the data.


سایت شرط بندی
سایت پیشبینی
سایت شرط بندی معتبر

سایت شرط بندی فوتبال : کار از راه دور یک بستر است


سایت شرط بندی فوتبال
سایت پیش بینی فوتبال
سایت شرط بندی معتبر

در اواسط دهه 90 ، دقیقاً همانطور که Netscape Navigator اولین نگاه خود را به ما نشان می داد دیداری اینترنت می تواند باشد ، طراحی وب به دو طعم رسیده است.

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

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

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

هنگامی که طراحان شروع به طراحی کردند ، وب بسیار عالی شد برای وب ، طرح های دیگر را ارائه نمی دهد به وب.

حمل و نقل چیزها بین سیستم عامل ها به ویژه هنگامی که چیز جدید کاملاً جدید باشد (یا سعی در افزایش کشش دارد) متداول است. در اواخر دهه 80 و اوایل دهه 90 مکینتاش بخار شد و ویندوز 3 در سال 1990 به بازار آمد ، تعداد زیادی از توسعه دهندگان ویندوز / رایانه شروع به ارسال نرم افزارهای خود به مک کردند. آنها نرم افزار Mac را ننوشتند ، آنها نرم افزار ویندوز را منتقل کردند. و شما می توانید بگویید – بسیار فریب بود. خوب است در زمانی که Mac به طور گسترده توسعه نیافته بود ، اما به وضوح منتقل شد.

وقتی چیزی منتقل شده است ، بدیهی است.

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

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

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

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

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

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

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

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

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

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

از راه دور کار کنید ، دفتر را بارگیری نکنید.


بهترین سایت شرط بندی
سایت شرط بندی معتبر فوتبال