• Вакцина «Спутник V»: инструкция, как испортить хорошее дело

      Давайте на минуту отбросим все предубеждения и стереотипы об отечественной медицине и попробуем объективно разобраться в том, что сделано правильно, а что неправильно с "первой в мире вакциной от COVID" — Спутник V от «НИИ эпидемиологии и микробиологии им. Н. Гамалеи».


      Поговорим о том, как устроена современная наука в целом и доказательная медицина в частности, и при чем тут пиар.


      image

      Читать дальше →
    • Функциональное программирование на TypeScript: полиморфизм родов высших порядков

        Привет, Хабр! Меню зовут Юрий Богомолов, и вы (возможно) можете меня знать по моей работе над серией #MonadicMondays в твиттере, по каналу на ютьюбе или статьям на Medium или dev.to. В русскоязычном сегменте интернета очень мало информации по функциональному программированию на TypeScript и одной из лучших экосистем для этого языка — библиотеке fp-ts, в экосистему которой я достаточно активно контрибьютил некоторое время назад. Этой статьей я хочу начать рассказ о ФП на TypeScript, и если будет положительный отклик от хабрасообщества, то продолжу серию.


        Думаю, ни для кого не станет откровением то, что TypeScript является одним из самых популярных надмножеств JS со строгой типизацией. После включения строгого режима компиляции и настройки линтера на запрет использования any этот язык становится пригодным для промышленной разработки во многих сферах — от CMS до банковского и брокерского ПО. Для системы типов TypeScript были даже неофициальные попытки доказательства полноты по Тьюрингу, что позволяет применять продвинутые техники тайп-левел программирования для обеспечения корректности бизнес-логики при помощи техник «making illegal states unrepresentable».


        Всё вышеперечисленное дало толчок к созданию для TypeScript замечательной библиотеки для функционального программирования — fp-ts за авторством итальянского математика Джулио Канти. Одна из первых вещей, с которой сталкивается человек, желающий ее освоить, — весьма специфичные определения типов вида Kind<URI, SomeType> или interface SomeKind<F extends URIS> {}. В этой статье я хочу подвести читателя к пониманию всех этих «сложностей» и показать, что на самом деле всё очень просто и понятно — стоит только начать раскручивать этот паззл.

        Поехали!
      • Заглавные и строчные буквы

          Я собрал здесь некоторые не очень очевидные факты о заглавных и строчных буквах, с которыми может столкнуться программист в работе. Многие из вас переводили строки во «все заглавные» (uppercase), «все строчные» (lowercase), «первую заглавную, а остальные строчные» (titlecase). Ещё более популярна операция сравнения без учёта регистра. В мировом масштабе такие операции могут быть весьма нетривиальны. Пост построен в виде «сборника заблуждений» с контрпримерами.

          1. Если я переведу строку в uppercase или lowercase, число Unicode-символов не изменится.

          Нет. В тексте могут попасться строчные лигатуры, которым не соответствует один символ в верхнем регистре. Например, при переводе в uppercase: fi (U+FB00) -> FI (U+0046, U+0049)

          2. Лигатуры — изврат, ими никто не пользуется. Если их не учитывать, то я прав.

          Нет. Некоторым буквам с диакритикой нет точного соответствия в другом регистре, поэтому приходится использовать комбинированный символ. Скажем, в языке африкаанс есть буква ʼn (U+0149). В верхнем регистре ей соответствует комбинация из двух символов: ʼN (U+02BC, U+004E). Если вам попадётся транслитерация арабского текста, вы можете столкнуться с (U+1E96), которой в верхнем регистре также нет односимвольного соответствия, поэтому придётся заменять на (U+0048, U+0331). В ваханском языке есть буква (U+01F0) с аналогичной проблемой. Вы можете возразить, что это экзотика, однако на африкаанс в википедии 23000 статей.

          3. Ну хорошо, но давайте считать комбинированный символ (с участием modifying или combining code points) одним символом. Тогда длина всё же сохранится.

          Нет. Есть, например, в немецком языке буква «эсцет» ß (U+00DF). При переводе в верхний регистр, она превращается в два символа SS (U+0053, U+0053).
          Читать дальше →
        • Сохраняем музыку на C#

          image
          В 2020ом мы пользуемся разными музыкальными сервисами, но как реликт ушедшей эпохи, в забытом профиле ВК, у многих хранится музыка. Функции для загрузки нет, но что если позарез нужно спасти аудиозапись?
          Поскольку такого софта в открытом доступе не обнаружилось, кроме парочки веб-сервисов требующих авторизацию через ВК (что не очень то и безопасно), под катом мы рассмотрим процесс создания self-hosted утилиты на современном C# для загрузки своих аудио, не сливающей данные профиля сторонним сервисам.
          Читать дальше →
        • Настройка Webpack 5 с нуля

          • Translation


          Узнайте, как использовать вебпак для сборки JavaScript, изображений, шрифтов и стилей, а также как запускать сервер для разработки

          Если вы раньше использовали вебпак 4, вот некоторые отличия от 5 версии:

          • команда «webpack-dev-server» теперь выглядит как «webpack-serve»
          • отдельная установка file-loader, raw-loader и url-loader больше не требуется, вы можете использовать встроенные загрузчики ресурсов (asset modules)
          • полифилы для Node.js больше не поддерживаются, поэтому если, например, вы получили ошибку для stream, необходимо добавить пакет «stream-browserify» в качестве зависимости и { stream: «stream-browserify» } в качестве алиаса в настройки вебпака

          Что такое вебпак?


          По большей части, сайты больше не пишутся на чистом HTML с небольшим количеством JavaScript — часто они создаются только с помощью JavaScript. Поэтому возникает необходимость в сборке, минификации и транспиляции кода. Вот где вебпак приходит на помощь.

          Вебпак — это сборщик модулей. Он служит для упаковки кода для использования браузером. Он позволяет использовать последние возможности JavaScript с помощью Babel или использовать TypeScript и компилировать его в кроссбраузерный минифицированный код. Он также позволяет импортировать статические ресурсы в JavaScript.

          Для разработчиков вебпак также предоставляет сервер для разработки, который умеет обновлять модули и стили на лету при сохранении файла. Инструменты командной строки, такие как «vue create» и «react-create-app» используют вебпак за сценой, но вы легко можете создать собственную настройку вебпака для указанных фреймворков.

          Вебпак также умеет делать много других вещей, но данная статья посвящена основам его настройки и использования.
          Читать дальше →
          • +15
          • 18k
          • 4
        • Локальное хранилище или куки? Безопасное хранение JWT на клиенте

          • Translation
          JWT (JSON Web Token) — это замечательный стандарт, основанный на формате JSON, позволяющий создавать токены доступа, обычно используемые для аутентификации в клиент-серверных приложениях. При использовании этих токенов возникает вопрос о том, как безопасно хранить их во фронтенд-части приложения. Этот вопрос нужно решить сразу же после того, как токен сгенерирован на сервере и передан клиентской части приложения.



          Материал, перевод которого мы сегодня публикуем, посвящён разбору плюсов и минусов использования локального хранилища браузера (localStorage) и куки-файлов для хранения JWT.
          Читать дальше →
        • Детальный разбор структуры зарплат IT-специалистов в Кремниевой Долине

          О чем пойдет речь


          image

          В рамках пятничного безумия, давайте представим, что у Вас волшебным образом появилось разрешение на работу в США, и Вы уже готовы после завтрака телепортироваться в самый центр Маунтин-Вью, чтобы моментально найти работу в крупной IT-компании и начать зарабатывать свой первый взнос на дом в Кремниевой Долине. Но прежде, давайте попробуем разобраться из чего состоит заработная плата разработчика программного обеспечения, что обычно включено в социальный пакет IT-специалиста, и какие дополнительные льготы получают сотрудники крупных технологических компаний в США. Все эти знания пригодятся Вам, чтобы продать себя дороже, жить комфортнее и быстрее заработать на сарайчик в пригороде Сан-Франциско.

          Если Вам проще воспринимать информацию на слух или в режиме видео-ролика, то специально для Вас готово 28-минутное видео с тайм-кодами в комментариях.

          Три главных компонента


          Итак, инженер по разработке программного обеспечения в США — профессия довольно
          престижная. Конечно, это не анестезиологи, не хирурги, не ортодонты, не дантисты, не терапевты, не педиатры, и даже не пилоты, которые по официальной статистике министерства труда США зарабатывают куда больше разработчиков. Но ведь зона ответственности и риски у последних гораздо выше.

          Так вот, в первую очередь нужно понимать, что сумма, которую заплатит Вам работодатель
          формируется из трех компонентов:

          1. Сash — это деньги, которые Вы получаете непосредственно на карточку два раза в
            месяц (или же их присылают Вам бумажным чеком, который потом можно либо обналичить, либо положить на Ваш банковский счет.
          2. Non-cash — это акции в различных вариациях: RSA, RSU, PSU, PSA или ESPP.
          3. Benefits — все косвенные затраты работодателя на Вас, с которых Вы также имеете
            выгоду.

          Когда речь заходит о зарплате, тут принято говорить о сумме за год до уплаты налогов. Эта сумма называется Total Compensation (TC) и включает в себя Cash и Non-cash компоненты.
          Читать дальше →
        • Как стать долларовым миллионером за 30 лет, лежа на диване



            На Хабре недавно вышел пост ״Новичкам фондового рынка: честные разговоры о трейдинге״. Этот пост, опубликованный в одном из самых читаемых блогов Хабра, вводит людей в заблуждение и создает у них ложное представление о том, что игра на бирже — хороший способ заработка. Это вынудило меня написать комментарий, постепенно переросший в целую статью, с детальным разбором того, почему трейдинг — это не способ разбогатеть, а способ потерять деньги, и о том, как на самом деле заработать на инвестициях.
            Поехали!
          • Пора на свалку


              Никогда не думал, что это случится со мной, но, похоже, я выгорел. А ещё мне стрёмно. Да, это ещё одна статья про выгорание.


              Я тут на днях смотрел на свою RSS-читалку и заметил, что под тегом «C++» у меня где-то три сотни непрочитанных статей. Я не прочитал ни одной статьи по плюсам с прошлого лета, и мне офигенно. Я не написал ни строчки осмысленного кода на плюсах за последние три месяца, с тех пор, как распустили отдел, где я работал, и мне просто супер. Я позволил себе хотеть больше никогда не писать на плюсах, и у меня появились крылья.


              Только стало страшно, потому что это давно уже стало куском моей самоидентификации. Я писал на плюсах лет 17, это почти две трети моей жизни, и как-то очень стрёмно всё это выкидывать. Всё моё сеньёрство-помидорство, львиная часть моего опыта — она там, в наступании на плюсограбли. Кто я без своего костюма?


              Короче, да, я выгорел. И я не знаю, что делать дальше.

              Читать дальше →
            • Юлия → Iuliia. Всё о транслитерации

              Транслитерация


              Транслитерация — это запись кириллических слов латиницей (Анна → Anna, Самара → Samara). Её используют в загранпаспортах, водительских удостоверениях, трансграничной доставке, библиотечных каталогах и множестве других международных процессов.


              Так вышло, что я недавно окунулся в эту тему, а в Википедии она раскрыта слабо. Поэтому расскажу, что к чему (спойлер — если вы думаете, что с транслитерацией всё плохо, то на самом деле всё ещё хуже).


              И конечно, поскольку это Хабр — предложу open-source библиотеки для решения проблемы.

              Читать дальше →
            • Коронавирус: опасная иллюзия неопасности

              Развитые страны прошли пик смертей, можно понемногу расслабляться? Увы, два долгожданных и три недавних результата делают картину мрачнее. Что показывают свежие исследования на антитела, подсчёт отбираемых вирусом лет жизни и "потерянных" статистикой смертей, анализ картины заболевания и графики роста заражений в России?


              image


              Тесты на антитела указывают на высокую летальность

              Читать дальше →
            • Почему так чертовски сложно построить хорошую модель распространения COVID-19?

              • Translation


              И вот мы здесь, во время пандемии, смотрим наружу из наших окон, как аквариумные рыбки. Все думают об одном: насколько плохо всё кончится? И сразу же вторая мысль: серьёзно, сколько мне ещё жить в такой тесноте?

              Нам всем нужны ответы. Учитывая объём исследований и собираемых данных о новом коронавирусе, кажется, что ответы просто обязаны появиться.

              И ответы действительно есть. Проблема в том, что в них царит раздрай. К примеру, центры по контролю и профилактике заболеваний США используют модели, судя по предсказаниям которых в лучшем случае от вируса погибнет 200 000 американцев. Тем временем отчёт Имперского колледжа Лондона попал в заголовки газет со своим ужасным сценарием, по которому погибнет 2,2 млн американцев, если никто не будет менять своего повседневного поведения.
              Читать дальше →
              • +18
              • 5.3k
              • 5
            • Смертность, летальность, коронавирус и матан

                Для начала, давайте разберемся с двумя важнейшими эпидемиологическими понятиями: смертностью и летальностью. Сразу оговорюсь, что в википедии (как русской, так и английской) приведено ошибочное определение летальности, которое сбивает с толку.

                Летальность — это вероятность умереть, если у пациента диагностирована болезнь. Вот цитата из научной статьи:
                one of the most important epidemiologic quantities to be determined is the case fatality ratio—the proportion of cases who eventually die from the disease.

                Смертность — это отношение числа умерших от болезни к размеру популяции за какой-то промежуток времени. Обычно, считают сколько смертей на 100 тыс. населения за единицу времени. Смертность непосредственно связана с летальностью: это произведение вероятности заболеть (за определенный временной период) на летальность. В самом деле, для того, чтобы умереть от болезни надо сначала ей заразиться, а потом уж, если не повезет…
                Читать дальше →
              • Коронавирус: почему надо действовать прямо сейчас

                • Translation
                • Tutorial

                Вступление


                Учитывая всё, что происходит с коронавирусом, может оказаться очень сложно принять решение, что делать прямо сейчас. Стоит ли подождать, пока станет больше информации? Надо ли предпринять что-то уже сегодня? Если да, то что?

                В этой статье со множеством графиков, данных и моделей из большого числа источников мы постараемся ответить на вопросы:

                • Сколько людей заболеют коронавирусом в вашем регионе?
                • Что случится, когда они начнут заболевать?
                • Что вы должны делать?
                • Когда?

                Когда вы закончите читать статью, вы придёте к следующим выводам:

                • Коронавирус приближается к вам.
                • Он приближается с экспоненциальной скоростью: сперва постепенно, а потом внезапно.
                • Это вопрос нескольких дней. Может быть, неделя или две.
                • Когда это случится, ваша система здравоохранения будет перегружена.
                • Ваши сограждане будут лечиться в коридорах.
                • Изможденные медицинские работники сломаются. Некоторые погибнут.
                • Им придётся решать, кто из пациентов получит лечение, а кто умрет.
                • Единственный способ предотвратить это — социальная изоляция уже сегодня. Не завтра. Сегодня.
                • Это значит держать как можно больше людей дома, начиная с сегодняшнего дня.

                Если вы политик, общественный деятель или руководитель, у вас есть власть и ответственность, чтобы предотвратить описанное выше.

                Сейчас вы можете опасаться: что, если это избыточная реакция? Не станут ли люди смеяться надо мной? Вдруг они разозлятся на меня? Не буду ли я выглядеть глупо? Не лучше ли подождать, пока другие сделают первые шаги? Что, если это слишком навредит бизнесу?

                Однако через 2-4 недели, когда весь мир будет закрыт и изолирован, когда окажется, что несколько драгоценных дней социальной изоляции, которые вы организовали, спасли жизни, вас больше не будут критиковать. Люди будут благодарить вас за то, что вы приняли правильное решение.

                Итак, давайте разбираться.
                Много графиков и длинный текст
              • Борьба с утечками памяти в веб-приложениях

                • Translation
                Когда мы перешли от разработки веб-сайтов, страницы которых формируются на сервере, к созданию одностраничных веб-приложений, которые рендерятся на клиенте, мы приняли определённые правила игры. Одно из них — аккуратное обращение с ресурсами на устройстве пользователя. Это значит — не блокировать главный поток, не «раскручивать» вентилятор ноутбука, не сажать батарею телефона. Мы обменяли улучшение интерактивности веб-проектов, и то, что их поведение стало больше похоже на поведение обычных приложений, на новый класс проблем, которых не существовало в мире серверного рендеринга.


                Читать дальше →
                • +32
                • 10.7k
                • 2
              • Стоит ли хранить Google Fonts на своём сервере?

                • Translation
                В последние несколько недель, по стечению обстоятельств на работе и в сторонних проектах, я узнал много о веб-шрифтах, а также много нового о Google Fonts в частности. Благодаря этому я могу дать более развернутый ответ на вопрос, который в прошлом мне казался простым: стоит ли вам хранить Google Fonts на своём сервере?

                Говоря объективно, признаю, шрифты — не моя сильная сторона. Я предпочитаю более практичный подход и не зацикливаюсь на дизайне (посмотрите на этот сайт и убедитесь, что так и есть) и прежде не чувствовал необходимости в использовании нестандартных шрифтов. Конечно, они выглядят немного приятнее и «брендируют» текст. Но для основного текста толку в них мало. Я никогда не оценивал статью (или иначе относился к её содержанию), только потому что для её подачи использовался красивый шрифт. Тем не менее, мне было полностью понятно негативное влияние дополнительных шрифтов на производительность и скорость загрузки страницы, так что, возможно, из-за этого я предвзят.

                Тем не менее, многие со мной могут не согласится, да и шрифты, важны они лично для меня или нет, регулярно используются многими другими разработчиками, и часто у них просто нет выбора. Давайте посмотрим, что можно сделать, чтобы и в скорости сайта не потерять, и дизайнеров довольными оставить.
                Читать дальше →
              • Налогообложение ИП в Казахстане: как быть фрилансеру?

                  Рассказывая на IT тусовках и в интернете о том, как посчитать и заплатить налоги дизайнерам, программистам и другим фрилансерам меня часто просили написать об этом простой и понятный пост. Простого в налогообложении мало, но я постарался чтобы он был хотя бы понятным. ПОд катом информация для тех кто живет в Казахстане и хочет спать спокойно.

                  image
                  Читать дальше →
                • Еще раз о passport.js

                    Недавно мне передали на поддержку проект на express.js. При изучении кода проекта я обнаружил немного запутанную работу с аутентификацией/авторизацией которая базировалась, как и 99,999% случаев, на библиотеке passport.js. Этот код работал, и следуя принципу «работает — не трогай», я оставил его как есть. Когда через пару дней мне дали задание добавить еще две стратегии авторизации. И тогда я начал вспоминать, что уже делал аналогичную работу, и это занимало несколько строк кода. Полистав документацию на сайте passport.js, я почти не сдвинулся с места в понимании того, что и как нужно делать, т.к. там рассматривались случаи, когда используется ровно одна стратегия, для которой, для каждой в отдельности, и даются примеры. Но как соединить несколько стратегий, зачем нужно использовать метод logIn() (что то же самое, что login()) — по-прежнему не прояснялось. Поэтому, чтобы разобраться сейчас, и не повторять тот же поиск еще и еще раз, — я составил для себя эти заметки.
                    Читать дальше →
                  • Будущее WebAssembly в виде «дерева навыков»

                    • Translation
                    Некоторые люди как-то неправильно поняли WebAssembly. Есть те, кто считает, что раз браузеры уже поддерживают выполнение WebAssembly (ещё с 2017 года), значит всё уже готово. Даже и близко ещё нет, готов лишь MVP (минимально жизнеспособный продукт). Я могу предположить откуда произрастает корень этого заблуждения: после релиза MVP его разработчики пообещали поддерживать обратную совместимость на уровне «любой написанный сейчас код будет работать и в будущем». Но это ведь не значит, что разработка WebAssembly закончена, совсем нет! Множество фич разрабатывается прямо сейчас и планируется к разработке в ближайшем будущем. И когда они будут реализованы — всё очень сильно изменится.

                    Все эти фичи можно попробовать представить себе в виде дерева навыков в какой-нибудь игре. У нас есть пару «базовых» (уже реализованные фичи) и целое дерево со множеством веток и листьев, которые будут со временем открываться, давая нам всё больше и больше могущества.
                    image
                    Давайте посмотрим на то, что у нас уже есть сейчас и что нам ещё предстоит открыть.
                    (Под катом много картинок, трафик)
                    Читать дальше →
                  • История переезда системного администратора в Германию. Часть вторая: переезд и первые шаги

                      Всем привет.

                      Я наконец-то изыскал время и написал вторую часть своей истории об IT-эмиграции. Первую часть можно прочитать тут — История переезда системного администратора в Германию. Часть первая: поиск работы и виза. В этой части я опишу подробно, как мы с сестрой обустраивались на новом месте, какие ошибки при этом допускали и сколько нам эти ошибки стоили.

                      Итак, поехали.

                      У нас было два загранпаспорта, национальная виза, контракт на работу, договор на учебу и целое множество вещей всех сортов и расцветок, а также лысый кот, длинный список дел, норовящая развалиться машина и несколько тысяч евро. Не то чтобы всё это было так уж необходимо для переезда в Германию, но если уж начал эмигрировать из России, то становится трудно остановиться. Единственное, что вызывало у меня опасение — это жилье. Ничто в мире не бывает более беспомощным, безответственным и порочным, чем поиск квартиры во Франкфурте. Я знал, что рано или поздно мы столкнемся и с этим.

                      Читать дальше →