• Mockанье зависимостей в node.js приложениях

      Mocks, fakes, and stubs — три столпа юнит тестирования. Конечно же все знают что это такое, как солить и когда есть. Я честно тоже так думал, пока не столкнулся с действительностью, под которую мне пришлось немного прогнуться.


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


      Component = proxyquire.noCallThru().load(‘../Component’, {
 
           ‘../../core/selectors/common': { getData }

      }).default;
      Читать дальше →
    • Скажи мне, где ты, и я скажу тебе, где ты

        В подмосковном Подольске, в микрорайоне Силикатная-2, есть один лайфхак — когда на дворе уже 9 вечера, и пиво в магазинах уже не продают — достаточно просто перейти дорогу, чтобы его купить. Через дорогу Москва — в ней желаемое до 11 найти можно.

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

        Исторически на этот вопрос отвечает «обратный геокодер»(reverse geocoder). Он важная часть практически всех картографических АПИ — Google, Яндекс, и даже OSM. Но в большинстве случаев его ответ предназначается человеку, и содержит исключительно текстовое описание локации.

        Это-не-технологично! И уж точно непрактично. Esosedi, кушали этот кактус пару лет, а потом просто сделали свой обратный геокодер. Главное как и зачем.

        Совсем недавно на хабре искали Смерть Кащееву (nested set и вложеность административных рубрик), ходили по районам(отображение данных регионов на карте), и (не)попадали на счетчик Яндекса (прямой геокодер). А теперь разберем, что такое обратный геокодер, и зачем он нужен. А потом разберем механики его работы.
        Читать дальше →
      • Как найти себе место на земле и не попасть на счетчик Яндекса

          … эта история началась давным-давно в далекой-далекой стране Краковия, чьи жители беспечно проживали свои жизни и не знали…

          Но сам я местный, и сегодня расскажу вам страшную историю, о том, что мешало спать (лично мне) долгие годы. И это не налоги (с ними все нормально), это — геокодер Яндекс.Карт!
          Геокодер — это один из HTTP-сервисов Яндекс.Карт, получающий в запросе текстовое представление адреса и возвращающий в ответе найденные на его основании объекты. Либо наоборот: получающий координаты и отвечающий адресом.

          Именно геокодер подскажет, где на карте находится чудная страна Краковия. И именно он будет главным героем этой истории, завязка которой была описана совершенно в другой книге — в древнем фолианте Пользовательское соглашение API Яндекс.Карт. Легенда гласит, что существует ограничение на количество запросов к функции геокодирования. Максимально допустимо делать в сутки не более 25 000 запросов к HTTP и JS геокодеру в сутки. Или овсянка, сэр.

          И буквально на днях это правило из обычных слов превратилось в угрозу работоспособности сайта. В клубе API Карт было опубликовано сообщение о массовых банах различных сервисов, превышающих лимиты.



          Что делать? Для наглядности достанем из кустов рояль — 8 лет назад на Хабре засветился проект «еСоседи» — «Карта интересных мест». Все эти годы я продолжаю работать над ним.
          Читать дальше →
        • Районы… Кварталы…

            Совсем недавно на хабре была статья от AirBnb — «Создавая карту мира». Хорошая и красивая статья про административное деление мира. Один минус — у статьи один комментарий, и то мой.
            Пользуясь случаем проведу опрос — хотели ли бы вы такую карту административных делений?
            А то она у меня есть:



            Вы наверное замечали, что Google.Карты умеют подсвечивать контура городов. С недавнего времени такое есть и на Яндекс.Картах. Мало кто знает, что геометрия есть и на eSosedi.

            А вот когда такая возможность появится на вашем сайте — теперь зависит только от тебя %username%.

            Для достижения эффекта достаточно зайти на data.esosedi.org или GitHub, ознакомиться с документацией библиотеки osmeRegions и начать использовать.

            P.S.: 3 признака того, что год минувший все сделал красиво: 1. Районы 2. Кварталы. 3. Детализация до «Жилые массивы» доступна для некоторых городов.
            Читать дальше →
          • Где смерть Кащеева?

              Привет ребят, давайте для начала проверим вашу память. Итак:
              «На море на океане есть остров, на том острове дуб стоит, под дубом сундук зарыт, в сундуке — заяц, в зайце — утка, в утке — яйцо» в яйце игла — смерть Кощея!

              А теперь, внимание, вопрос — как это формализовать?
              Как приатачить к яйцу иголку и какова временная сложность детача смертии моей. Как перенести сказку в быль, как это выглядит на B-деревьях и почему на самом деле нет разницы между 2D и 1D.
              А было все так: давным давно, в неком царстве, некотором государстве, на одном сервисе с шейрингом геолокации очень захотелось Иванушке Дурачку на уровне ЧПУ разделить Москву(/RU/MOW/) и Область(/RU/MOS/). И вообще навести порядок, чтобы все лежало по полочкам красиво и по алфавиту. Но не получалось ему сокровища свои посчитать, и аккуратно разложить. А Василису, хоть и дурак, к сбережениям не пускал.
              Но решение было найдено.
              Совсем недалеко над каким-то златом успешно чах Чахлик, еще и смерть он свою прятал по науке.
              И если задача определения региональной (точнее полигональной) принадлежности некой иголки к некому сундуку выходит за рамки данной статьи, то нам ничто не мешает погрузиться в глубины зайца и посмотреть как он устроен на табличном уровне.
              PS: и не спрашивайте почему зайца.
              Читать дальше →
            • W for Wikipedia

                Что такое «BigData»? Это те данные, которые нельзя просто так переварить. Или нельзя просто так приготовить. Или это вы думаете что нельзя.
                Особо сильный «перекос», в этом понимании бигдаты спрятался в web-картографии, в картах на различных сайтах.
                И так уж получилось — на протяжении нескольких лет я катался по различным конференциям, и рассказывал про организацию передачи данных с сервера на Карту. Иногда меня спрашивали — «а где же взять эти ваши много данных».
                Это не правильные вопросы, правильные вопросы это:
                — как данные хранить
                — какие данные, когда и почему передавать на клиент
                — что такое серверная кластеризация, как она выглядит и почему она нужна
                — что с данными делать
                — и зачем это все нужно %username%

                А насчет откуда взять данные… Есть один такой детский стишок

                Весь покрытый метками
                Абсолютно весь
                Остров Википедии
                В океане есть


                И на этом острове растет примерно десять миллионов геотегированных статей, которыми мы и воспользуемся.
                Но с флорой и фауной там не все так просто — статьи растут на разных языках, в разных местах, и их на само деле много…
                Поэтому мы, как настоящие герои, немного усложним задачу и добавим немного агрегатных функций, Левенштайна, Мorton кодов, esosedi и немного здравого смысла.

                Поехали!
              • Кешируем статику

                Существует мнение, что nginx — отличный инструмент для отдачи статики.
                Есть статьи, где описываются настройки sendfile или aio для «улучшения» отдачи.
                На Хабре есть чего почитать о настройке proxy_store с proxy_cache для минимизации проблем со стороны мозгов сайта.
                Еще в QA иногда возникают вопросы про кеширование картинок, например.
                Зачем заниматься этой ерундой! — говорят опытные пользователи — OS лучше вас знает как кешировать файлы! С кешем и префетчем в современных OS, точнее FS, проблем нет! Зачем плодить свои кеши и списки популярных материалов и все такое?...

                Есть только одно вредное «но» — в среде исполнения nginx (в общем случае Linux) понятие "файл" и вообще «файловая система» — просто понятие.
                И однажды, когда я, подмонтировав сервер по sshfs, обновил один скриптик, случилось волшебное:
                1. На каждой страничке стало на 4 картинки больше.
                2. Сервера сдохли.

                Что поделать — картинки хранились на glusterFS. Наступил полный FUSE.
                Читать дальше →
              • еСоседи — три года спустя

                  eSpsedi Три года назад произошло одно событие, которое мне до сих пор не дает покоя.
                  Три года назад хабр помог мне сделать eSosedi относительно популярным сайтом.
                  И про эти три года я и хочу немного рассказать.
                  Читать дальше →
                • Конфетки для Валерки

                    конфеткаВы никогда не сталкивались с проблемой как объяснить человеку, неиспорченному общением с железным другом, азы программирования?

                    Так уж получилось, что мы, работая в компании ГдеЭтотДом (я и anei), относительно часто ходим обедать в МуМу. Остаток от обеда обычно представляет собой фирменную конфетку. Которую мы не едим — вот такое несоответствие типов.

                    Но мы нашли выход, скармливая их Валерке.
                    Я, честно говоря, не знаю, причем тут программирование, Валерка и конфетки, но, в общем, однажды…
                    Подходит Александреску к Валерке и говорит:
                    Читать дальше →
                  • css Rotate. Возможен и в IE

                      Буду краток.
                      css свойство transform:rotate в ИЕ не доступно.
                      Но все знают что есть фильтр progid:DXImageTransform.Microsoft.Matrix, который конечно поворачивает изображение. Но скажем так не совсем правильно.
                      99% статей про использование этого фильтра содержат примерно такую фразу.
                      filter: матрица трансформации
                      left:?
                      right:?
                      *ps: left и right находятся эмпирически

                      На самом деле это не так.
                      Читать дальше →