• Где же у него кнопка?! Как простому человеку выгрузить данные из Kibana и Elasticsearch и не напрягать при этом разрабов
    0
    Да, в кибане очень нетривиально сделать какие-то сложные выгрузки. В какой-то момент я отчаялся и сделал свой дашборд для ошибок при помощи выгрузки данных из эластика через кибану в рсубд (mysql, но можно что угодно другое). Апи там выходит не сложное, только проблема в том, что ломается при апгрейдах периодически. Если вам близок node.is, то можно посмотреть, как это делается в моём проекте. То, что касается именно выгрузки — в функции getData в этом файле. Использовать код прямо as is вряд ли выйдет, но даст нужное направление.
  • Мои шаги, успехи и ошибки в мире геймдева на примере игрового бота в Telegram
    0
    Насчёт поллинга — зависит только от реализации библиотеки для работы с телеграммом. У меня такие случаи были, но при этом мгновенно приложение реконнектилось.
  • Владельцы Sony Xperia XZ2 уже сейчас могут попробовать новейшую версию Android P
    +1

    Смущает, что при этом есть неофициальные прошивки на 7ке и даже уже на 8ке. А вот Sony не шмогла.

  • Владельцы Sony Xperia XZ2 уже сейчас могут попробовать новейшую версию Android P
    0

    Вот смотрю я на свой Z3 Compact Tablet, на котором так и остался Android 6.0.1 с security patch level от 01.05.2016… И подозреваю, что при таком наплевательском отношении к пользователям — XZ2 точно так же останется на Android 8. И никакой Project Treble не поможет.


    Кажется, Google собирается обязать выпускать апдейты именно такие недобросовестные компании, как Sony.

  • Go: ускоряем выборку больших таблиц из MySQL
    0
    Вроде бы статья должна называться «ускоряем Go драйвер под MySQL»?
  • Codeisok, или История code review в Badoo
    +1
    Да, атласиановские продукты не быстрые, тем более self hosted. Хотя джиру на 200 пользователей мне удавалось разогнать до довольно шустрой работы.

    А как насчёт gitlab community edition? Бесплатно, и я его использовал в двух компаниях без всяких проблем. Про то, как там работают пулл реквесты — честно говоря, не помню, но всегда можно допилить.
  • Codeisok, или История code review в Badoo
    0
    Хмм, забавно, но у нас в битбакете пулл реквесты работают так же, как у вас бранч диффы:

    1. Автоматические проверки начинаются при пуше в ветку. Никакой новой сущности придумывать не нужно — есть просто ветка…
    2. Для исправления ошибки делается пуш в ту же ветку, и пулл реквесты сами обновляются. Кстати, на гитхабе так же работает. Так что не знаю, откуда у вас взялась проблема с бюрократией и пересозданием пулл реквестов… Может, раньше так было?
  • Codeisok, или История code review в Badoo
    +4
    Глянул по диагонали — вроде нет отличий от того, как это в битбакета и гитлабе сейчас. Может, не заметил что-то? Было бы хорошо, кроме исторического обзора (который очень интересный, спасибо), ещё с современными аналогами сравнить.
  • Codeisok, или История code review в Badoo
    0
    Фактически, вы только что спросили «А зачем пулл реквесты?».
  • Codeisok, или История code review в Badoo
    +2
    Крупных изменений нужно стараться избегать. Или, по крайней мере, разносить изменения по разным коммитам, и комментировать в пулл реквесте, на что нужно или нет обращать внимание (регулярно так делаю со своими пулл реквестами). Ревью одной задачи у меня обычно занимает от 5 до 20 минут, обычно делаю за кофе.
    А ещё ревью занимаюсь не только я, но и сениоры команды — это помогает не допускать ситуаций, когда что-то «виснет» на ревью, да и вообще не закопаться насмерть.
    Насчёт глубины погружения в код на ревью — тут нужен баланс. С одной стороны, нельзя позволить себе закопаться, с другой — ревью должно приносить больше пользы, чем статический анализатор. У нас получается — часто просто засчёт того, что свежий взгляд подмечает проблемы, которых не видит автор.
  • Codeisok, или История code review в Badoo
    +3
    Это у вас какой-то странный случай. У нас на ревью непрерывно что-то интересное находится. Причём количество вопросов по ревью никак не соотносится с уровнем разработчика. Сениор это тоже человек, который может не выспаться, просмотреть описку, забыть поправить копи пейст, написать в горячке неоптимальный код, забыть про то, что происходит в параллельных задачах, и так далее. А цена его ошибки обычно выше, чем у джуниора.

    К слову, одна из вещей, которые я, как техлид, не пропускаю на ревью — это «нетривиальный код». Если мне надо думать, что и как делает какой-то код, то там почти наверняка что-то не так.
  • О чем я думаю, когда читаю роман «Червь» Wildbow
    +2

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


    Но "Червь" мне понравился гораздо больше. Прочитал примерно половину пока, больше спасибо за обзор — с него пришёл, читал несколько ночей подряд… Очень приятно видеть хорошо проработаный мир, внимание к деталям и вообще что-то хорошее и оригинальное на таком казалось бы избитом концепте.


    Так же приятно читать, поскольку я много лет играю в сторителлинговые игры. И понимаю, что мир настолько хорошо описан и сбалансирован, что по нему реально можно играть. Редко возникает такое чувство.


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


    В общем, спасибо вам и автору. Автору, кстати, задонейтил. Кто тоже хочет — ссылка.

  • Расширения для VS Code и программирование на JavaScript
    +5
    Вы что-то перепутали.
  • Расширения для VS Code и программирование на JavaScript
    +6
    Была же только что более полная статья на эту же тему.
  • PHP может стать еще лучше
    0
    «другая сторона» — это индийский аутсорс, что ли? Или эффективный менеджмент?
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    +1
    Вы правда ничего не поняли.
    Выкачать зависимости без включаемого в них мусора нельзя.
    Удаляется оно перед сборкой артефакта, который потом будет раскатан по серверам.
    Экономия в 100 мегабайт для каждого собираемого билда, с учётом, что мы собираем этак по 300 билдов в сутки — 30 гигабайт в сутки (на самом деле больше, так как это только для одного проекта). Плюс более быстрый деплой засчёт меньшего размера артефакта.
  • Установка и настройка OpenVPN сервера с помощью docker-compose
    +1
    Теоретически да. По факту — пока на это нет ни мощностей, ни указа сверху. А даже если они будут — есть всякие неплохие способы обхода этого.
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0
    Попробовать стоит — как минимум, написать его, написать куда-нибудь на медиум статью, закинуть нескольким авторитетным разрабочикам и создать issue в npm (вряд ли на них особо обращают внимание, но всё же).
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0

    Так если нужны редиректы, POST, PUT, и прочее прочее — никто не спорит.


    Но если мы говорим о модулях, в которых один(!!!) стандартный запрос, то получение версии пакета для update-notifier может выглядеть вот так:


    const https = require('https');
    
    function getPackageVersion(packageName) {
      return new Promise((resolve, reject) => {
        let rawData = '';
        https.get(`https://registry.npmjs.org/${packageName}`, (res) => {
          res.on('data', (d) => rawData += d)
            .on('error', (e) => reject(e))
            .on('end', () => {
            try {
              const parsedData = JSON.parse(rawData);
              resolve(parsedData['dist-tags'].latest);
            }
            catch (e) {
              reject(e);
            }
          });
        });
      })
    }
    
    getPackageVersion('diarrhea')
      .then((version) => console.log(`last version: ${version}`))
      .catch((err) => {
        console.log(`fetch error: ${err}`)
      });

    И это ещё и с промисами.
    Собственно, для полного варианта не хватает только переключения http/https и подстановки токена. И не надо никакую библиотеку тащить.

  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    +1
    А, понял. На отдельный пост вряд ли потянет, поэтому дам развёрнутый комментарий:

    1. Следует избегать динамических require() — то есть, тех, которые осуществляются не при подгрузке скрипта, а внутри функций.

    Потому что динамическими реквайрами вы замедляете приложение (ему приходится догружать модули в процессе работы), а так же делаете процесс загрузки потенциально различным. Чем это опасно:

    1.1 Если у вас не дай бог мутируют глобальные объекты или прототипы, то финальная мутация будет зависеть от последовательности загрузки.
    1.2. Очень легко в какой-то момент наступить на всякие противные вещи вроде циклических зависимостей — особенно если вы используете частичные экспорты.
    1.3 Может выйти так, что в какой-то момент у вас не подгружен или не инициализирован тот модуль, который вы считали уже работающим.

    2. Стоит избегать загрузки модулей из переменных. Это мало того, что небезопасно, но приводит к тем же проблемам, что и в пункте 1, плюс даёт возможность в какой-то момент не найти нужный модуль. Ну и у вас умирает половина возможностей по статическому анализу, включая линтинг, покрытие тестами, автоматический рефакторинг, подсказки IDE и так далее.

    3. Стоит избегать загрузки сущностей по строковым именам. Например, видел примеры фабрик, которые инстанциируют классы по переданным им строкой именам. Не надо так! Опасности в целом те же, что и в пункте 2.

    Ну и плюс к этому — практики 2 и 3 ведут к тому, что из вашего модуля нельзя собрать бандл — это может быть менее критично для бэка, но очень критично, если модуль может быть использован во фронте.

    Конечно, всегда могут быть исключения — например, если вы хотите сделать отложенную загрузку модулей для более быстрого старта приложений. Но надо осознавать, что этим вы втыкаете в проект костыль, на конце которого находятся грабли — и рано или поздно вы на это наступите. И вообще, если у вас слишком долго стартует приложение — это просто повод разбить его на несколько приложений.
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0
    Хотел его оптимизировать, но это оказалось небыстро — в бандл его не соберёшь, надо форкать и править. Будет время — обязательно это сделаю.
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0
    Всякий там request это офигительно удобно, когда у тебя огромный бэкенд проект, и надо в куче разных форматах обращаться к разным сервисам и обрабатывать ответ.

    Но в данном случае, когда у тебя всего полтора варианта запроса — всё именно так, как вы описали — наркомания.
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0

    Очень сурово оптимизирую, о чём честно написал в посте.


    Уведомление об апдейтах я оттуда полностью выпилил

    Будет время — может, соберу для демонстрации человеческую версию update-notifier, которая весит, сколько должна.

  • Бэкап переписки в telegram
    0
    Собственно, при помощи тех действий, которые я описал в посте. На каждый чат у вас в результате будет по файлику — в формате JSON или в формате обычной человеко-читаемой веб страницы.
  • Бэкап переписки в telegram
    0

    Вы меня запутали. Сначала говорите


    а можно ли так сохранять полностью чаты, а не просто переписку

    А потом


    Можно сохранить там всю переписку?

    Что именно и в каком виде вы хотите сохранить?

  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0
    Прошу прощения, не понял вопрос, уточните, пожалуйста.
  • Бэкап переписки в telegram
    0
    А что вы имеете в виду под «полностью чаты»?
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    +1
    1. Зачем тащить ещё и Go на свои сервера? Даже если в вида бинарника. Кстати, архив бинарника весит 640 килобайт, а разархивированный — 2 метра.
    2. Зачем править исходники на Go, когда есть внятная кастомизация на уровне модулей и опций cli?
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0

    Если честно, просто не нашёл node-prune. Но он какой-то совсем куцый, и вообще никак не настраивается, из самого важного:


    • Нельзя настроить шаблоны для удаляемых файлов
    • Нельзя прогнать в тестовом режиме и узнать, что ты удаляешь
    • Нельзя залогировать, что ты удалил
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0
    Да это вообще жесть, что для такой базовой вещи, как http запросы, приходится ставить сторонние модули. Причём в большом проекте обычно стоит пачка разных модулей и их версий в транзитивных зависимостях.
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    +1
    Посмотрел, как это делает update-notifier.
    1. В его зависимостях есть www.npmjs.com/package/latest-version
    2. latest-version делает это через www.npmjs.com/package/package-json
    3. А он обращается к регистри через www.npmjs.com/package/registry-url

    Для публичных модулей это всего лишь запрос к registry.npmjs.org/ — например, такой:
    registry.npmjs.org/diarrhea?version=3.0.5
    Для непубличных — да, чуть сложнее — надо подставить свой регистри и передать токен.

    Но это вот вообще не повод цеплять столько транзитивных зависимостей с таким весом.
    Как минимум, можно было бы собирать бандл.
    А я бы вообще их импортировал копи-пейстом, потому что очень важно минимизировать размер таких модулей.
  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0

    Почему-то все инструменты мне показывают разные результаты, так что сделал так:


    mkdir test
    cd test
    npm init
    npm i update-notifier --only=production
    du -sh --apparent-size ./node_modules/

    Выходит "1,2M ./node_modules/"


    Если что не так делаю — поправьте, пожалуйста.


    Насчёт "лезть в реестр" — ну блин, это ж один http запрос, который должен делаться нативными средствами.

  • Diarrhea для вашего бэкенда на Node.JS — уменьшаем вес сборки
    0
    Вот примерно это и думаю делать в будущем. Как уже сказал — вполне можно это делать с сурсмапами, отладка при этом не страдает. И вроде бы ничего не ломается при минификации. Вроде бы. Но, как опять же сказал, многие модули не готовы к сборке — то динамические зависимости, то ещё какая-то фигня. Но я знаю людей, которые успешно это делают в продакшне — а заодно это даёт им использовать все последние возможности JS вне зависимости от версии и поддержки Node.JS (правда, оптимальность таких транспиляций — это отдельный вопрос).

    И я не уверен, что webpack для этого оптимален, надо сверять различные инструменты. Например, свой хитрый минификатор есть у фейсбука — но у меня он с грохотом ломал всё на самых примитивных вещах.
  • Бэкап переписки в telegram
    0
    А на чём писали? Можете выложить? Я бы с удовольствием в MySQL импортировал.
  • Бэкап переписки в telegram
    0
    У меня успешно выгрузилась история переписки с контактом в 60к сообщений. Судя по тому, что репозитории не обновлялись с ноября 2017, вряд ли это было поправлено — скорее у меня более удачные зависимости.
  • Бэкап переписки в telegram
    0
    Багов на выгрузке нескольких лет своей истории не заметил — хотя может там внутри что-то и попорчено или пропущено.

    Если вы уже делали на Go — можете поделиться? Явно должно быть красивее, да и кроссплатформенно.
  • Бэкап переписки в telegram
    0
    Класс! Удивительно, что не нашёл поверхностным гуглингом. Эта штука умеет и документы сохранять, что приятно. Правда, без какого-либо GUI и с данными только в базе — думаю, она будет полезна только для разработчиков.
  • Бэкап переписки в telegram
    0
    Так это надо своего маленького клиента писать для выгрузки истории. Делается за пару часов работы, но проще было использовать уже готовый инструмент, раз он работает.
  • Роскомнадзор начинает войну против прокси и VPN
    0

    В идеале да. Но я подключаюсь из дома, с работы и с мобилки — так что увы.

  • Роскомнадзор начинает войну против прокси и VPN
    0

    Писал из метро, забыл добавить — ещё используйте авторизацию и не сливайте в паблик доступы.