• Типичные ошибки при работе с PostgreSQL. Часть 2

      Мы продолжаем публиковать видео и расшифровки лучших докладов с конференции PGConf.Russia 2019. В первой части доклада Ивана Фролкова речь шла о непоследовательном именовании, о constraints, о том, где лучше сосредоточить логику — в базе или в приложении. В этой части вас ждет разбор обработки ошибок, конкурентного доступа, неотменяемых операций, CTE и JSON.



      Расскажу такую историю. Наш клиент говорит: «Медленно работает база, а наше приложение занимается обслуживаем населения. Мы боимся, что нас тут поднимут на вилы». Выяснилось, что у них было очень много процессов в состоянии idle in transaction. Приложение начало транзакцию, ничего не делает, но и транзакцию не завершает. Если вы взаимодействуете с какими-то внешними сервисами, то, в принципе, это нормальная ситуация. Другое дело, что если у вас состояние idle in transaction длится долго (больше минуты уже подозрительно), то это плохо потому, что PostgreSQL очень не любит долгие транзакции: VACUUM не сможет почистить все те строки, которые он мог бы увидеть, и долго висящая транзакция эффективно блокирует VACUUM. Начинают разбухать таблицы, индексы становятся всё менее эффективными.

      Читать дальше →
    • Готовим полнотекстовый поиск в Postgres. Часть 2

        В прошлой статье мы оптимизировали поиск в PostgreSQL стандартными средствами. В этой статье мы продолжим оптимизацию с помощью индекса RUM и проанализируем его плюсы и минусы в сравнении с GIN.

        Читать дальше →
        • +36
        • 3,4k
        • 3
      • Работа с часовыми поясами в JavaScript

        • Перевод


        Недавно я работал над задачей добавления часовых поясов в JS-библиотеку календаря, которую ведёт моя команда. Мне было хорошо известно о никудышной поддержке часовых поясов в JavaScript, но я надеялся, что абстрагирование имеющихся объектов данных позволит легко решить большинство трудностей.

        Однако мои мечты пошли прахом. Когда я углубился в задачу, то понял, что в этом языке действительно трудно работать с часовыми поясами. Реализовать что-то сложнее простого форматирования отображения времени и вычисления даты с помощью комплексных операций (функции календаря) было чрезвычайно трудным делом. Я получил ценный опыт решения этой проблемы, и это повлекло за собой новые затруднения.

        В этой статье я хочу обсудить, с чем я столкнулся и как это решал. Пока я писал текст, осознал, что причиной всех невзгод было плохое понимание мной самой темы часовых поясов. В свете этого осознания я предлагаю сначала подробно поговорить об определении и стандартах, а уже потом переходить к JavaScript.
        Читать дальше →
      • JSON API – работаем по спецификации

          В последнее время веб-разработка разделилась. Теперь мы все не full-stack программисты — мы фронтендеры и бэкендеры. А самое сложное в этом, как и везде, это проблема взаимодействия и интеграции.

          Фронтенд с бэкендом взаимодействуют через API. И от того, какой это API, насколько хорошо или плохо бэкенд и фронтенд договорились между собой, зависит весь результат разработки. Если мы все вместе станем обсуждать, как сделать паджинацию, и потратим на её переделывание целый день, то можем и не добраться до бизнес-задач.

          Чтобы не буксовать и не разводить холивары по поводу названия переменных, нужна хорошая спецификация. Давайте поговорим о том, какой она должны быть, чтобы всем жилось легче. Заодно станем экспертами по велосипедным сараям.


          Читать дальше →
        • EcmaScript 10 — JavaScript в этом году (ES2019)

            Стандартизация JS перешла на годичный цикл обновлений, а начало года — отличное время для того чтобы узнать, что нас ждёт в юбилейной — уже десятой редакции EcmaScript!


            ES9 — актуальная версия спецификации.


            ES10 — всё ещё черновик.


            На сегодняшний день в Stage 4 # — всего несколько предложений.


            А в Stage 3 # — целая дюжина!


            Из них, на мой взгляд, самые интересные — приватные поля классов #, шебанг грамматика для скриптов #, числа произвольной точности #, доступ к глобальному контексту # и динамические импорты #.


             
            КДПВ: Жёлтый магнит с надписью «JS ES10» на экране монитора —  от kasper.green & elfafeya.art
                    Автор фото: kasper.green; Жёлтый магнит: elfafeya.art & kasper.green

            Читать дальше →
          • Не блокчейн

              Чуть больше 10 лет назад, 3 января 2009 года был создан genesis block Биткойна. Так началась история блокчейна, обещавшая перевернуть мир, создать новую экономику, сделать существующие банки реликтами прошлого.

              10 лет — достаточно долгий срок, чтобы подвести итоги, поговорить почему ничего подобного не произошло и, скорее всего, не произойдет.
              Читать дальше →
            • Подводные камни пользовательских CSS-свойств

                Автор курса Нетологии «HTML-верстка» Стас Мельников рассказал о нюансах, которые могут усложнить работу с пользовательскими CSS-свойствами.

                Правила синтаксиса названий пользовательских свойств


                Мы привыкли, что встроенные CSS-свойства нечувствительны к регистру. Поэтому следующие способы объявления свойства border дадут одинаковый результат:
                Читать дальше →
              • Паттерны и антипаттерны обоснования задач

                  Содержание



                  Когда вы заводите задачу, ее нужно обосновать. Вы должны убедить разработчика, что:

                  • это действительно баг;
                  • его необходимо исправить;
                  • его нужно исправить именно так, как мы сказали.

                  А то иногда читаешь баги (особенно баги новичков) и задаешься вопросом:

                  — Почему это баг??

                  Например, там написано: «Загружаем отчет, получаем 57,6. А должно быть — 57.9».



                  Если записать обоснование, это решит проблемы:

                  • Коллеги отвлекают с вопросами «А почему это баг?», вырывая из контекста.
                  • Спустя месяц ты сам забыл, а, собственно, почему это был баг…

                  См также:
                  Зачем нужно обоснование в баге — более подробно о том, зачем вообще обоснование.


                  Через меня прошли сотни начинающих тестировщиков (студентов). Вот как раз на их задачах я и начала задаваться вопросом «А почему это баг?»… Спрашиваешь ребят, а в ответ получаешь «Да это же очевидно!». Ну как-то не очень =))

                  Через кучу задач и вопросов «А почему?» стали вырисовываться паттерны ответов. Я выделила хорошие и плохие паттерны. О них и хочу рассказать.

                  Эта статья для:

                  • начинающих тестировщиков — узнайте, как грамотно объяснять свою точку зрения;
                  • тест-менеджеров — чтобы дать ссылку своим падаванам и потом ссылаться на антипаттерны без дополнительных объяснений.

                  1. Антипаттерны: плохое обоснование




                  Читать дальше →
                • Самые смешные поисковые запросы 2018 года

                    Компания «Яндекс» составила список самых забавных поисковых запросов 2018 года (см. под катом). Вдобавок, на подборке «смешных, трогательных и парадоксальных» запросов компания запустила «генератор предсказаний».



                    По нажатию на кнопку генератор просто выдаёт случайный запрос из подборки — и пользователю предлагают подумать, к чему бы это.
                    Читать дальше →
                  • Новогодний датасет 2018: открытая семантика русского языка

                      Открытая семантика русского языка, об истории создания которой вы можете прочитать здесь и здесь, получила большое обновление. Мы собрали достаточное количество данных, чтобы применить поверх собранной разметки машинное обучение и построить семантическую модель языка. Что из этого получилось смотрите под катом.


                      Читать дальше →
                    • Руководство по JavaScript, часть 9: обзор возможностей стандартов ES7, ES8 и ES9

                      • Перевод
                      • Tutorial
                      Сегодня, в девятой части перевода руководства по JavaScript, будет сделан обзор возможностей, которые появились в языке благодаря стандартам ES7, ES8 и ES9.

                      Часть 1: первая программа, особенности языка, стандарты
                      Часть 2: стиль кода и структура программ
                      Часть 3: переменные, типы данных, выражения, объекты
                      Часть 4: функции
                      Часть 5: массивы и циклы
                      Часть 6: исключения, точка с запятой, шаблонные литералы
                      Часть 7: строгий режим, ключевое слово this, события, модули, математические вычисления
                      Часть 8: обзор возможностей стандарта ES6
                      Часть 9: обзор возможностей стандартов ES7, ES8 и ES9


                      Читать дальше →
                      • +40
                      • 16,1k
                      • 7
                    • Почему революционерам нравится острая еда, или Как перец чили попал в Китай

                      • Перевод


                      В 1932 году СССР отправил одного из своих лучших агентов, Отто Брауна, бывшего школьного учителя и эксперта по контрразведке родом из Германии, в Китай. Его задачей было работать военным консультантом для китайских коммунистов, сражавшихся в отчаянной борьбе за выживание против националистов Чан Кайши.

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

                      У хитроумного вождя крестьян была одна грубоватая, даже немного недружелюбная черта. «К примеру, долгое время я не мог привыкнуть к еде с большим количеством специй, например, к острому перцу чили, традиционному для южного Китая, особенно для провинции Хунань, где родился Мао». Нежные вкусовые сосочки советского агента становились предметом насмешек Мао. «Еда истинного революционера – красный перец, — объявил Мао. – Тот, кто неспособен вынести красный перец, неспособен и сражаться».
                      Читать дальше →
                    • 4 мифа о PostCSS

                      Вы читаете перевод статьи PostCSS Mythbusting: Four PostCSS Myths Busted.

                      Когда появляется новый фронтенд-инструмент, мы всегда спрашиваем – а нужен ли он нам, что нового он может предложить? Стоит ли тратить время и усилия на его изучение?

                      С самого начала PostCSS столкнулся с интересной проблемой. Люди не понимали что это и как его использовать. Чтобы завоевать внимание, PostCSS приходилось соперничать с уже привычными подходами Sass и Less. Это соперничество породило некоторые заблуждения.

                      Давайте развеем некоторые из самых частых мифов о PostCSS и посмотрим, как с его помощью можно усовершенствовать ваш рабочий процесс.
                      Читать дальше →
                    • Тема бронелифчиков в культуре Востока и Запада

                        ......


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


                        Явление «бронелифчиков» существует уже довольно давно. Есть несколько вариантов названий, часто еще используется «бронетрусы», но смысл от этого не меняется. Бронелифчик это броня, которая предназначена для чего угодно кроме, собственно, защиты стратегически уязвимых мест.


                        Такая броня ужасно неудобна, она натирает и гарантирует носящему простуду в регионе со средним климатом и огромное количество укусов насекомых в регионах с теплым климатом. Ну и конечно же все колюще-режущие предметы которые в вас летят достигнут цели.


                        Но тем не менее героев и героинь часто изображают практически голыми в окружении врагов или покоряющими вершину какой-нибудь горы, или в битве с огромным существом, или… вариантов множество. Практически все они противоречат законам логики и здравомыслия, но несмотря на это бронелифчики не теряют популярности по всему миру.


                        Для начала я бы хотела внести небольшое уточнение. Современный игропром сейчас буквально поделен на два лагеря — «Восток» и «Запад». Под Востоком обычно подразумевается Япония, чуть реже Китай или Корея, история и культуры которых взаимодействовали и переплетались веками. Запад это, по сути, все страны современной Европы (там практически каждая побывала чьей-нибудь колонией или имела колонии, что способствовало культурному обмену).


                        Какое это имеет отношение к бронелифчикам?


                        Игровая индустрия сейчас тоже разделена на восточную и западную. Если выбрать любую японскую или корейскую игру и любую европейскую а потом попросить человека угадать какая где, то абсолютное большинство угадает с первого раза. Серия TES и серия Metal Gear Solid. World of Warcraft и, например, Perfect World или более современная Black Desert, Лара Крофт и Байонетта.

                        Читать дальше →
                      • Использование UTF-8 в HTTP заголовках



                          Как известно, HTTP 1.1 — это текстовой протокол передачи данных. HTTP сообщения закодированы, используя ISO-8859-1 (которую условно можно считать расширенной версией ASCII, содержащей умляуты, диакритику и другие символы, используемые в западноевропейских языках). При этом в теле сообщений можно использовать другую кодировку, которая должна быть обозначена в заголовке «Content-Type». Но что делать, если нам необходимо задать non-ASCII символы не в теле сообщения, а в самих заголовках? Наверное, самый распространенный кейс — это проставление имени файла в «Content-Disposition» заголовке. Это, казалось бы, довольно распространенная задача, но ее реализация не так очевидна.

                          TL;DR: Используйте кодировку, описанную в RFC 6266, для «Content-Disposition» и преобразуйте текст в латиницу (транслит) в остальных случаях.
                          Читать дальше →
                          • +25
                          • 7,4k
                          • 6
                        • Почему новый дизайн Gmail такой медленный?

                            image
                            Как известно, в 2018 году компания Google провела крупнейший редизайн интерфейса своего почтового сервиса Gmail. Как обычно, довольны им оказались далеко не все — и на этот раз есть вполне объективные причины для недовольства сервисом. Почему загрузка Gmail стала занимать очень много времени, а действия вроде удаления или архивирования цепочки писем могут выполняться 4-6 секунд?

                            Пару дней назад подобным вопросом задался пользователь Hacker News — и он получил ответ от анонимного сотрудника Google, хлестко проехавшегося по культуре разработки внутри компании и своим коллегам.

                            С его слов, все это происходит в силу того, что в Google не предусмотрено никаких наказаний за подобные «промахи».

                            В стенах компании активно поощряют запуски (launch) — публичные релизы чего-либо. И то, что продукты могут содержать лишь половину необходимых фич, не работать, работать только из-под Chrome и прочее — это никого не волнует, ведь их создателям за это ничего не грозит. Это — норма.
                            Читать дальше →
                          • Про выезд в туры



                              Один из самых хороших примеров, чем интересны туры, — это Доминикана. Два месяца назад недельный выезд на двоих стоил так: билеты — 230 тысяч рублей, а отель — 64 тысячи рублей. Если же покупать всё это в виде тура, то итоговая стоимость получалась 114 тысяч рублей. Треть от цены самостоятельной поездки. Главная причина — в том, что туда не было прямого рейса. Туроператор собирал достаточное количество туристов для чартера, нанимал самолёт — и всё получалось выгоднее. Сейчас прямой рейс появился, и если смотреть даты 20–27 ноября, то отель стоит 41 тысячу, билет — 118 тысяч, а тур — 121 тысячу. Разница всё равно есть.

                              Откуда ещё она может браться? Сейчас расскажу, как это устроено.
                              Читать дальше →
                            • Почему теорему Гёделя о неполноте сложно доказать: дело в формулировках, а не только в сути

                              • Перевод
                              Грубо говоря, теорема Гёделя о неполноте утверждает, что существуют истинные математические утверждения, которые невозможно доказать. Когда я был в 11-м классе, мы втроём с учителем геометрии г-н Олсеном и моим другом Умой Рой провели пять недель, читая оригинальное доказательство Гёделя. Почему так долго? Отчасти потому, что мы были ещё школьниками. Отчасти потому, что 24-летний Гёдель был не самым талантливым писателем. Но главным образом потому, что доказательство на самом деле довольно трудное.

                              Это может показаться удивительным, ведь всё доказательство по сути можно уместить в один абзац. Гёдель начинает с построения математического утверждения, по существу эквивалентного предложению,
                              Это утверждение невозможно доказать.
                              Затем Гёдель рассматривает, что будет в случае, если это утверждение ложно.
                              Читать дальше →
                            • Технологии продления жизни изменят природу человека



                                Бьется в светлых сердцах такая мысль: «Люди недостойны бессмертия, сперва им следует измениться». Что следует изменить в человеке – совершенно понятно. Нам не устают напоминать об этом. Наши литературные классики всегда лишь тем и занимались, что указывали на человеческие недостатки. Наши сатирики со сцены громко высмеивали общественные и личностные пороки. Эта деятельность — сеять разумное, доброе, вечное — популярна и сейчас.
                                Читать дальше →
                              • Оптимизация графики для веба: самое важное

                                • Перевод
                                Автор электронной книги — Эдди Османи, один из руководителей разработки Google Chrome

                                tl;dr


                                Cжатие изображений всегда должно быть автоматизировано


                                Оптимизацию графики обязательно надо автоматизировать. О ней легко забыть, рекомендации меняются, да и сам контент может легко проскользнуть мимо конвейера сборки. Для автоматизации при сборке используйте imagemin или libvips. Есть и много других.

                                Большинство CDN (например, Akamai) и сторонних решений вроде Cloudinary, imgix, Fastly Image Optimizer, Instart Logic SmartVision и ImageOptim API предлагают комплексные автоматизированные решения для оптимизации изображений.

                                На чтение статей и настройку конфигурации вы потратите время, которое дороже оплаты их услуг (у Cloudinary есть бесплатный тариф). Но если всё-таки не хотите отдавать работу на аутсорсинг по соображениям стоимости или из-за дополнительной latency, то выбирайте приведённые выше варианты с открытым исходным кодом. Проекты Imageflow или Thumbor предлагают альтернативу на собственном хостинге.
                                Читать дальше →