• «Шакал»: сжимаем фронтенд

      Привет! Я — Ваня, лид платформенной команды в Тинькофф Бизнес.

      Мое любимое занятие — открывать вкладку DevTools и проверять, сколько весят артефакты сайта. В этой статье расскажу, как мы сократили вес приложения на 30% силами платформенной фронтенд-команды за один день без изменения кода сайта. Никаких хитростей и регистраций — только nginx, docker и node.js (опционально).


      Читать дальше →
    • Отказоустойчивая IPoE сеть из подручных средств

      Здравствуйте. Значит есть сеть из 5к клиентов. Недавно вылез не очень приятный момент — в центре сети и у нас стоит Brocade RX8 и он начал слать много unknown-unicast пакетов, так как сеть поделена на вланы — то частично это не проблема НО есть спец вланы для белых адресов и т.д. и они растянуты во все стороны сети. Так вот теперь представьте входящий поток на адрес клиента, который бордером не учится и этот поток летит в сторону радио линка на какоето (а так на все) село — канал забит — клиенты злые — печаль…

      Читать дальше →
    • Гигиена удалённой работы или о пользе телепатии

        Приходилось ли вам запинаться в работе? Вот берёте таск: зафигачить красивый отсчитыватель времени "До конца супер предложения осталось всегда 2 часа". Открываете редактор… и щёлк: а как делать-то? Вроде я что-то слышал, что мы лэндинги начали на Vue делать. Или тут еще реакт?


        Хорошо, когда вы в опенспейсе сидите через два стола. Всегда можно встать, и тихо спросить соседа "Напомни, мы Vue для всех теперь берём?". Хуже, если ТЛ в другом часовом поясе. Тот же вопрос — но ответ завтра. А если он закрутился, то послезавтра. И всё, вместо 1 минуты — двое суток задержки.


        Или того хуже. Сидите вы, никого не трогаете, и тут вдруг тихий шепот на 3 этажа с вопросом выше. Отвечаешь быстренько, и опять восстанавливать контекст. А ведь всего-то надо было, в вику заглянуть...

        А в конце статьи -- сюрприз
      • Хватит качать и хранить нули

          Скачиваемый файл заполнен нулями


          "Нуль-блоками" я называю блоки (части файла), заполненные нулевыми байтами. Можно заранее посчитать их хеши и не запрашивать эти блоки у источников, а сразу помечать их уже загруженными.


          Нуль-блоки не надо хранить на диске. Благодаря sparse флагу, операционная система просто помечает этот участок файла как заполненный нулями и не хранит эти нули на диске.


          Свойства файла заполненного нулями

          Файл размером 16MB занимает на диске 4KB


          Также, показывая что участки скачиваемого файла заполнены нулями, можно мотивировать пользователя отказаться от скачивания и распространения битого файла. В моей версии Shareaza эти участки помечаются красной полосой сверху на полосе прогресса загрузки файла.


          Откуда берутся нуль-блоки в файле


          1. Раздающий не дождался полного скачивания и проверки файла и выложил неполный(partial) файл.
          2. Результат повреждения сектора диска раздающего.

          Это те варианты, которые пришли в голову.


          Почему эти файлы продолжают распространяться


          1. Видео/аудио файл может иметь нуль-блок в середине и спокойно воспроизводится, просто перескакивая то место, где попался нуль-блок. Тем самым он может казаться целым.
          2. Образ диска также может иметь нуль-блоки в разных местах и это проявит себя только при попытке чтения файлов из этих блоков.
          Читать дальше →
        • Главное не попасть в торговом центре под сверку часов


            Парковка «Меги Химки» и люди, ждущие, когда их пустят обратно в здание

            Сегодня пошла очередная волна эвакуаций из торговых центров и всяких других общественных мест (пруф Интерфакса). У нас эвакуировали 4 точки: Мегу Химки, Принц Плазу (это торговый центр на Тёплом стане), ТЦ Улей и внезапно наш домик-клуб в Сокольниках у входа (потому что вместе с остальным парком).

            На офисную почту пришло вот такое интересное письмо:
            05.02.2019, 11:00, «laki kak» <laki.kak@mailfence.com>:
            Добрый день! Хотя какой он для вас добрый после этого письма.
            Не будем философить. В одном из ваших корпусов заложена бомба! Бомба без запаха, корпус из пластика, металлодетекторы не обнаружат, собаки не учуют.
            Таймер автоматически активировался с момента открытия письма. Закладка бомбы производилась за несколько дней ранее.
            До взрыва осталось N-количество минут. У бомбы так же есть дистанционный пульт, мы можем отключить, а можем и раньше окончания таймера вас ВСЕХ взорвать!!!
            Гуд бай!!!
            Круче всех эвакуация выглядит в Мегах. Там сначала объявляют какой-то не очень значимый код, который звучит как что-то будничное для посетителей. Например, «код тысяча» — это угроза пожара или задымления, по сути — сработка датчика, то есть начало подготовки к эвакуации. Если его за примерно 10 минут не отменяют, уже объявляют пожарную тревогу. Как его объявляют и отменяют, вы, возможно, слышали. Сегодня в Меге объявили «сверку часов», это код террористической угрозы.
            Читать дальше →
          • Анонимный Дед Мороз 2018-2019: пост хвастовства новогодними подарками

              Логотип АДМ 2018

              Анонимный Дед Мороз 2018-2019 набирает обороты: каждый пятый участник отметил подарок отправленным, а несколько человек даже нашли в себе силы встать из-за компьютера и забрать посылку на почте.

              Что же именно дарят Хабравчане своим Хабравнукам, Хабравнучкам и тем, кто не заполняет поле «Пол» в Хабрапрофиле? Давайте зайдем в комментарии и все у них разузнаем!

              С НАСТУПАЮЩИМ НОВЫМ 2019 ГОДОМ!

              Ваши iCTPEJlOK и kafeman
            • Клуб анонимных Дедов Морозов 2018-2019 на Хабрахабре

                Картинка для привлечения внимания

                В жизни можно ставить любые цели, и потом упорно искать пути их достижения. Если в ваших планах было что-то вроде «стать волшебником», то поспешите. У вас еще есть возможность реализовать свою мечту и стать настоящим Дедом Морозом до конца этого года!
                Прочитать письмо из Хогвартса
              • Vim по полной: Менеджер плагинов без фатальных недостатков

                  Оглавление


                  1. Введение (vim_lib)
                  2. Менеджер плагинов без фатальных недостатков (vim_lib, vim_plugmanager)
                  3. Уровень проекта и файловая система (vim_prj, nerdtree)
                  4. Snippets и шаблоны файлов (UltiSnips, vim_template)
                  5. Компиляция и выполнение чего угодно (vim-quickrun)
                  6. Работа с Git (vim_git)
                  7. Деплой (vim_deploy)
                  8. Тестирование с помощью xUnit (vim_unittest)
                  9. Библиотека, на которой все держится (vim_lib)
                  10. Другие полезные плагины

                  Я пользовался, наверно, всеми популярными менеджерами плагинов для Vim и у меня не было ни малейшего желания писать свой собственный, так как эти меня вполне устраивали, но было небольшое но, о котором я расскажу в этой статье.

                  Интересно? Беги скорей под кат!
                • Микроэлектроника для космоса и военных

                    Возможное, многие из вас думали после ситуации с Фобос-Грунтом — что такого особенного в микросхемах для космоса и почему они столько стоят? Почему нельзя поставить защиту от космического излучения? Что там за история с арестом людей, которые микросхемы экспортировали из США в Россию? Где все полимеры?

                    На эти вопросы я и попробую ответить в этой статье.

                    Disclaimer: Сведения получены из открытых источников и могут быть не вполне точными. Я лично с военной электроникой не работаю, а кто работает — те статьи писать не могут. Буду рад дополнить и исправить статью.
                    Читать дальше →
                  • Как не потерять деньги, желая сэкономить. Правила интернет покупок из-за рубежа

                          Давно собирался написать эту статью, но все не находил на это время. Последней каплей, подтолкнувшей меня к изложению аккумулированного за шесть лет опыта покупок за рубежом стали две статьи о массовом разводе дешевыми Киндлами, изложенные на хабре. Случай, когда такое количество человек попало на обычный для Ебея развод показал, что эта тема освещена недостаточно и людям не хватает базовых знаний в вопросе безопасности покупок.
                          Ниже, я попытаюсь изложить то, что почерпнул за годы покупок как на своем опыте, так и из жалостливых писем с мольбами о помощи от коллег покупателей на профильных форумах. Все нижеизложенное я считаю тем минимумом, который необходимо усвоить ДО того, как пытаться что либо купить за рубежом. Более тонкие вещи можно почерпнуть на соответствующих тематических форумах.

                      Итак, начнем. Заранее прошу прощения за большое количество текста и излишнее словоблудие.
                      Читать дальше →
                    • Ускорение загрузки Windows for fun and profit

                        image Пожалуй, начну с того, что если перегружаться 15 раз в год, то любой «тюнинг» процесса загрузки отнимает больше времени, чем будет выиграно на перезагрузках за все время жизни системы. Однако, спортивный интерес берет свое, тем более, что люди интересуется процессом оптимизации быстродействия. А загрузка оказалась самым очевидным кандидатом в примеры того, как на мой взгляд должен выглядеть этот самый процесс. Сразу скажу, что грузиться будем с 5400 rpm винта, грузиться будем в «рабочую» систему: помимо недобитой вендорской крапвари там стоит еще куча всякого типа вижуал студии, антивируса, скайпа, стима, гуглапдейтера и пр…

                        Про то, почему отключение pagefile-а скорее вредно, чем полезно — как нибудь в другой раз, а пока…
                        Под катом много однообразных картинок и немножко унылого текста
                      • Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в степень

                          Пусть мы хотим вычислить десятимиллионное число Фибоначчи программой на Python. Функция, использующая тривиальный алгоритм, на моём компьютере будет производить вычисления более 25 минут. Но если применить к функции специальный оптимизирующий декоратор, функция вычислит ответ всего за 18 секунд (в 85 раз быстрее):


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

                          Эта статья расскажет о том, в каких случаях и каким образом декоратору удаётся делать подобные оптимизации. Также вы сможете сами скачать и протестировать библиотеку cpmoptimize, содержащую данный декоратор.
                          Читать дальше →
                        • Обновился HTTP/1.1

                            Вот так неожиданно, через 15 лет после начальной публикации, обновилась спецификация HTTP/1.1
                            Обновлений много, я бы даже сказал, дофига. Добавили много проясняющего текста, разбили спецификацию на 6 RFC (раньше было 2), добавили новый статус 308, стандартизировали X-Forwarded-For (теперь он просто Forward), и еще много всего.

                            Неполный спискок изменений:
                            • Новый статус 308 — Permanent Redirect, но с отправкой этих же самых данных. Т.е. запрос не меняется на GET, как раньше.
                            • Новый заголовок Forward, который призван заменить X-Forwarded-For и X-Forwarded-Proto
                            • Убрано ограничение на 2 подключения к серверу
                            • Убрана поддержка HTTP 0.9
                            • Убрана кодировка ISO-8859-1 по умолчанию
                            • Убран заголовок Content-MD5
                            • Запрет использования Content-Range на POST-запросах
                            • Добавлено кеширование кодов 204, 404, 405, 414 и 501
                            • Изменена документация кодов 301 и 302 таким образом, чтобы позволить перенаправлять метод с POST на GET. Т.е. задокументировали текущую реализацию всех браузеров.
                            • Добавлены разграничения между запретом отправки referer и случаем, когда referer нет. Теперь следует отправлять Referer: about:blank, если referer-а не было.
                            • Location теперь может перенаправлять на ссылку с хештегом.
                            Читать дальше →
                          • ARM-ы для самых маленьких

                            • Tutorial


                            Пару дней назад я опубликовал и потом внезапно убрал в черновики статью о плане написать про создание своей ОС для архитектуры ARM. Я сделал это, потому что получил много интересных отзывов как на Хабре, так и в G+.

                            Сегодня я попробую подойти к вопросу с другой стороны, я буду рассказывать о том, как программировать микроконтроллеры ARM на нарастающих по сложности примерах, пока мы не напишем свою ОС или пока мне не надоест. А может, мы перепрыгнем на ковыряние в Contiki, TinyOS, ChibiOS или FreeRTOS, кто знает, их там столько много разных и интересных (а у TinyOS еще и свой язык программирования!).

                            Итак, почему ARM? Возиться с 8-битными микроконтроллерами хотя и интересно, но скоро надоедает. Кроме того, средства разработки под ARM обкатаны долгим опытом и намного приятнее в работе. При этом, начать мигать светодиодами на каком-то «evaluation board» так же просто, как и на Arduino.

                            Читать дальше →
                          • Повышаем безопасность закрытых ssh-ключей

                            • Translation
                            Вы когда-нибудь интересовались механизмом работы ssh-ключей? Или тем, насколько безопасно они хранятся?

                            Я использую ssh каждый день много раз — когда запускаю git fetch или git push, когда развертываю код или логинюсь на сервере. Не так давно я осознал, что для меня ssh стал магией, которой я привык пользоваться без понимация принципов ее работы. Мне это не сильно понравилось — я люблю разбираться в инструментах, которые использую. Поэтому я провел небольшое исследование и делюсь с вами результатами.

                            По ходу изложения встретится много аббревиатур. Они не помогут понять идеи, но будут полезны в том случае, если вы решите погуглить подробности.

                            Итак, если вам доводилось прибегать к аутентификации по ключу, то у вас, скорее всего, есть файл ~/.ssh/id_rsa или ~/.ssh/id_dsa в домашнем каталоге. Это закрытый (он же приватный) RSA/DSA ключ, а ~/.ssh/id_rsa.pub или ~/.ssh/id_dsa.pub — открытый (он же публичный) ключ. На сервере, на котором вы хотите залогиниться, должна быть копия открытого ключа в ~/.ssh/authorized_keys. Когда вы пытаетесь залогиниться, ssh-клиент подтвержает, что у вас есть закрытый ключ, используя цифровую подпись; сервер проверяет, что подпись действительна и в ~/.ssh/authorized_keys есть открытый ключ, и вы получаете доступ.

                            Что же хранится внутри закрытого ключа?

                            Читать дальше →
                          • Создание и хранение резервных копий баз данных в MS SQL. Практические советы

                            По роду деятельности я немного администратор баз данных. Так или иначе мне приходится обслуживать несколько десятков БД.
                            Наткнувшись на статью, опубликованную недавно, посчитал нужным дополнить ее некоторыми практическими рекомендациями. То что затрагивалось в прошлой статье, в этой опускалось.

                            1. Размер резервной копии


                            Оценить размер резервной копии можно с помощью хранимой процедуры sp_spaceused

                            К примеру вот такой запрос:

                            USE your_database;
                            GO
                            EXEC sp_spaceused @updateusage = N'TRUE';
                            GO

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

                              Просматривая одно из обучающих видео "Школы разработки интерфейсов" Яндекса, наткнулся на ссылку на офигенный труд израильской веб-программистки Тали Гарсиэль (Tali Garsiel) "How browsers work" (Как работают браузеры).

                              Она в течение нескольких лет отслеживала всю издаваемую информацию о внутреннем устройстве браузеров, изучала исходный код WebKit и Gecko и, в конце концов, собрала все воедино. Вот что пишет сама Тали:
                              Когда на 90% компьютеров был установлен IE, приходилось мириться с тем, что это загадочный «черный ящик», однако теперь, когда более половины пользователей выбирает браузеры с открытым исходным кодом, пришло время разобраться, что скрывается у них внутри, в миллионах строк программного кода на C++...
                              Пролистав, я был поражен — отличная работа. Внутреннее устройство браузеров, алгоритмы разбора — все хорошо иллюстрировано, доступно и понятно. И без излишних подробностей, страниц на 30-40. Как раз то, что нужно. Решил — это надо обязательно перевести. Покопался еще немного — оказалось перевод уже как 1,5 года есть!

                              Возможно для кого-то это давно уже не новость, но, надеюсь, для тех, кто не слышал, будет полезно (на хабре упоминаний не нашел).

                              Под катом содержание перевода, чтобы решить стоит ли читать.
                              Читать дальше →
                            • Комикс Xkcd на 13 гигапикселов



                                Вчерашний комикс Xkcd Click and Drag — это настоящий квест, на прохождение которого может уйти целый день. Комикс целиком занимает 165.888 x 79.872 px, то есть 13 гигапикселов. Если распечатать его с разрешением 300 dpi, то получится плакат 14 х 6,75 метра.
                                Читать дальше →
                              • Создание регулярных выражений из диапазонов мобильных телефонных номеров

                                Привет!

                                Я много работаю с VoIP-сетями. С коммерческим оборудованием, конечно тоже, но и очень много с OpenSource (статья пишется в контексте использования Asterisk PBX).

                                В телефонии часто возникает простая задача, разделить маршруты на определённые направления. Ну например, направить вызовы на городские номера в сторону оператора 1, МГ — в сторону оператора 2, МН — в сторону оператора 3.
                                Задача, в общем-то тривиальная, и реализуется на Asterisk легко:

                                ;Местная городская связь: 7 знаков (в разных регионах РФ от 3-х до 7-ми знаков), и номера экстренных служб.
                                exten => _0X,1,dial(SIP/itsp1/${EXTEN})
                                exten => _0XX,1,dial(SIP/itsp1/${EXTEN})
                                exten => _XXXXXXX,1,dial(SIP/itsp1/${EXTEN})
                                ;Междугородняя и мобильная связь: код выхода на МГ связь (в РФ - "8") + 10 знаков.
                                exten => _8[348]XXXXXXXXX,1,dial(SIP/itsp2/${EXTEN})
                                exten => _89XXXXXXXXX,1,dial(SIP/itsp2/${EXTEN})
                                ;Международная связь: код выхода на МН связь (в РФ - "810") + номер телефона в международном формате.
                                exten => _810X.,1,dial(SIP/itsp3/${EXTEN})


                                Однако иногда возникает необходимость предоставить абоненту доступ только к мобильным телефонам его области, и здесь простым "_89XXXXXXXXX" не отделаешься.
                                Читать дальше →