• Как раньше делались онлайн чаты?

    romesses
    @romesses
    Backend инженер
    Технология Comet.
    Ответ написан
    Комментировать
  • Как массово обновить однотипные ключи?

    romesses
    @romesses
    Backend инженер
    Можно сканировать ключи командой SCAN со звездочкой в шаблоне и по найденным ключам сбросить значения командой MSET.
    Если можно одной командой, буду рад узнать тоже.
    Ответ написан
  • Где храннить данные для приложения quiz?

    romesses
    @romesses
    Backend инженер
    Веб-приложения обычно проектируют для работы с СУБД. Для начала сойдет и SQLite.
    Ответ написан
    Комментировать
  • Из-за чего постоянная перезагрузка операционной системы на виртуальной машине?

    romesses
    @romesses
    Backend инженер
    Общий совет при работе - попровать какой-нибудь safe mode при загрузке.
    Еще нужно читать логи в /var/log/ в Linux. Но это штука основана на Android и поэтому сильно другая нежели обычный desktop дистрибутив.
    А, вообще-то,
    Unsupported as of July 17, 2017
    Ответ написан
    Комментировать
  • Как синхронизировать пк на Линукс?

    romesses
    @romesses
    Backend инженер
    man rsync
    Ответ написан
    Комментировать
  • Как можно записать текст(который содержится в текстовом файле) в NoSql (По порядку)?

    romesses
    @romesses
    Backend инженер
    Можно разбить строки на составные части при помощи регулярных выражений.
    Вот, частичный вариант для затравки:
    /(Delphi\s\S+)\s(\S+\+?)$/gm
    где находятся пара Delphi XE и 2990+
    Остальное - сам.
    Ответ написан
    Комментировать
  • Должен ли бэкенд разработчик разрабатывать админку?

    romesses
    @romesses
    Backend инженер
    1. Бэкенд - это только REST API админки, сайта или чего-то другого. То есть без работы с HTML/JS/CSS вообще. По крайней мере, для меня именно так. Пусть другие называют бэкендом что-то другое или что хотят.
    А админка обычно подразумевает построение пользовательского интерфейса, работающего или поверх API (а значит, потребуется JS фреймворк) или же средствами шаблонов серверного языка.
    Поэтому, в понимании результата заказчика админка - это обычно работа, которая предназначена для одного крутого фуллстэк или же пара, бэкенд и фронтенд. Да и то, только если используются стандартные элементы интерейса из какой то библиотки. А то, вполне вероятно и вовлечение к работе и дизайнера интерфейса.

    2. Админка бывает очень разной по сложности! Осторожно с ней! Так как необходимо детально прорабатывать все интерфейсы и, следовательно, за каждое изменение требовать денег. За X время работы (формализации требований) с заказчиком тоже требовать денег.
    По-моему, нет принципиальной разницы между разработкой фронтальной части веб-сайта и back-office (админки). Фронтальная часть обычно должна быть проще для простого пользователя, а для админки такие требования обычно не соблюдаются. Обе могут быть по-своему сложны, а админка обычно больше напичкана всякими нужными для бизнеса вещами для контроля надо всеми бизнес-процессами, включая отчеты, оплату и многие другие хотелки заказчика.

    Итого, если есть достаточный опыт, время и желание работать с админкой - то пожалуйста. Но это уже не чистый бэкенд.
    Ответ написан
    Комментировать
  • Почему go get выдает ошибку при скачивании с git?

    romesses
    @romesses
    Backend инженер
    go get -v github.com/go-sql-driver/mysql
    все нормально скачалось?

    Теперь
    https://github.com/go-sql-driver/mysql#usage

    Затем
    go mod tidy
    Ответ написан
    2 комментария
  • Почему ломается кодировка в Python?

    romesses
    @romesses
    Backend инженер
    Python3
    with io.open("hello.txt", "r", encoding="utf-8") as f:
         s = f.read() # в строке будут декодированные кириллические символы
         print( s )
         print( s[:7] ) # используем срез
    Ответ написан
    Комментировать
  • Где найти логин и пароль от приватного проекта?

    romesses
    @romesses
    Backend инженер
    Нужно заменить протокол `https://` на `git://`
    git remote -v должен показывать типа
    origin	git@gitlab.com:my_org/my_repo.git (fetch)
    origin	git@gitlab.com:my_org/my_repo.git (push)

    После замены проверить так:
    ssh -T git@gitlab.com
    git fetch
    Ответ написан
    6 комментариев
  • Как скопировать миллионы строк из одной таблицы в другую?

    romesses
    @romesses
    Backend инженер
    INSERT INTO ... 
    SELECT ... 
    WHERE ...
    LIMIT ...

    https://www.w3schools.com/sql/sql_insert_into_sele...
    В зависимости от того насколько разные таблицы и какие поля NOT NULL может понадобиться заполнение какими-то данными. На малой выборке нужно сначала отладить запрос SELECT с необходимыми трансформациями и индексами. Как только SELECT будет работать исправно для разных случаев, запустить частичную миграцию, проверив как получается. Потом, опустошив целевую таблицу с TRUNCATE TABLE, запустить полную миграцию через Doctrine, при условии, что умеет генерировать подобный запрос корректно, конечно.
    На миллионах будет работать нормально.

    Добавил
    Для контроля дубликатов использовать
    https://www.mysqltutorial.org/mysql-insert-or-upda...
    - update или ignore
    Ответ написан
    3 комментария
  • Под каким пользователем работают ваши контейнеры?

    romesses
    @romesses
    Backend инженер
    Рекомендуется использовать не-root пользователя
    https://sysdig.com/blog/dockerfile-best-practices/

    Еще есть сканеры уязвимостей в образах Docker.

    Но на практике многим начихать на безопасность. Так что вы хотя бы постарайтесь приложить минимальные усилия.
    Ответ написан
    Комментировать
  • Как автоматом декодировать json с текстом в разных кодировках?

    romesses
    @romesses
    Backend инженер
    Нет никаких смешанных кодировок. У вас путаница в голове.
    Из вашего же отрывка кода (судя по всему, скопировано с отладочного вывода):
    >>> qq='content="summary_large_image" />\n<meta name="twitter:label1" content="Примерное время для чтения">\n\t<meta name="twitter:data1" content="1 минута">\n<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://streetclimate.ru/#organization","name":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442","url":"https://какой-то сайт.ru/","sameAs":[],"logo":{"@type":"ImageObject","@id":"https://какой-то сайт.ru/#logo","inLanguage":"ru-RU","url":"https://какой-то сайт.ru/wp-content/uploads/2018/12/3_White_logo_on_color1_269x67.png","width":269,"height":67,"caption":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442"},"image":{"@id":"https://какой-то сайт.ru/#logo"}},{"@type":"WebSite","@id":"https://какой-то сайт.ru/#website","url":"https://какой-то сайт.ru/","name":"\\u0421\\u0442\\u0440\\u0438\\u0442-\\u041a\\u043b\\u0438\\u043c\\u0430\\u0442","description":"\\u041f\\u0440\\u043e\\u0434\\u0430\\u0436\\u0430, \\u0443\\u0441\\u0442\\u0430\\u043d\\u043e\\u0432\\u043a\\u0430 \\u0438 \\u043e\\u0431\\u0441\\u043b\\u0443\\u0436\\u0438\\u0432\\u0430\\u043d\\u0438\\u0435 \\u043a\\u043e\\u043d\\u0434\\u0438\\u0446\\u0438\\u043e\\u043d\\u0435\\u0440\\u043e\\u0432, \\u0441\\u043f\\u043b\\u0438\\u0442-\\u0441\\u0438\\u0441\\u0442\\u0435\\u043c \\u0438 \\u0442\\u0435\\u043f\\u043b\\u043e\\u0432\\u044b\\u0445 \\u0437\\u0430\\u0432\\u0435\\u0441 \\u0432 \\u0421\\u041f\\u0431 \\u0438 \\u041b\\u0435\\u043d\\u0438\\u043d\\u0433\\u0440\\u0430\\u0434\\u0441\\u043a\\u043e\\u0439 \\u043e\\u0431\\u043b\\u0430\\u0441\\u0442\\u0438.",'
    >>> print(qq)
    content="summary_large_image" />
    <meta name="twitter:label1" content="Примерное время для чтения">
    	<meta name="twitter:data1" content="1 минута">
    <script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://streetclimate.ru/#organization","name":"\u0421\u0442\u0440\u0438\u0442-\u041a\u043b\u0438\u043c\u0430\u0442","url":"https://какой-то сайт.ru/","sameAs":[],"logo":{"@type":"ImageObject","@id":"https://какой-то сайт.ru/#logo","inLanguage":"ru-RU","url":"https://какой-то сайт.ru/wp-content/uploads/2018/12/3_White_logo_on_color1_269x67.png","width":269,"height":67,"caption":"\u0421\u0442\u0440\u0438\u0442-\u041a\u043b\u0438\u043c\u0430\u0442"},"image":{"@id":"https://какой-то сайт.ru/#logo"}},{"@type":"WebSite","@id":"https://какой-то сайт.ru/#website","url":"https://какой-то сайт.ru/","name":"\u0421\u0442\u0440\u0438\u0442-\u041a\u043b\u0438\u043c\u0430\u0442","description":"\u041f\u0440\u043e\u0434\u0430\u0436\u0430, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0434\u0438\u0446\u0438\u043e\u043d\u0435\u0440\u043e\u0432, \u0441\u043f\u043b\u0438\u0442-\u0441\u0438\u0441\u0442\u0435\u043c \u0438 \u0442\u0435\u043f\u043b\u043e\u0432\u044b\u0445 \u0437\u0430\u0432\u0435\u0441 \u0432 \u0421\u041f\u0431 \u0438 \u041b\u0435\u043d\u0438\u043d\u0433\u0440\u0430\u0434\u0441\u043a\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.",
    >>>

    "\u0421\u0442\u0440\u0438\u0442-\u041a\u043b\u0438\u043c\u0430\u0442"
    отлично раскодируется в JSON:
    Стрит-Климат


    Добавлено
    нельзя просто копировать из
    '{"hello": "\\u043f\\u0440\\u0438\\u0432\\u0435\\u0442"}'

    все что внутри одинарных кавычек. Для вывода на экран есть дополнительное экранирование обратных слэшей!

    А если попробовать так:
    s = json.dumps(d, ensure_ascii=True)
    print(s)

    То есть, JSON не содержит двойное экранирование юникода. А при выводе в IDLE в качестве строки добавляется дополнительное экранирование. Не нужно путаться!

    Вывод: если копировать с отладочного вывода, то предварительно выводить на отладку содержимое строки в кавычках.
    Ответ написан
    3 комментария
  • Что прописать в Procfile для развертывания проекта на heroku?

    romesses
    @romesses
    Backend инженер
    Есть демо-проект с Gradle, там же и Procfile:
    https://github.com/heroku/gradle-getting-started
    Ответ написан
    Комментировать
  • Как импортировать большой JSON (18гб) в MySQL?

    romesses
    @romesses
    Backend инженер
    Это файл формата JSONL.

    JSON - родной формат для MySQL 5.7+ и каждую строку можно заносить в JSON колонку БД как есть, без предварительного декодирования в PHP. Можно и во временную таблицу, а затем извлечь конкретные поля.

    То есть достаточно считывать строки и применяя yield, отправлять в буфер-коллектор. По достижению размера, скажем, 1000 строк, выполнять INSERT INTO ... VALUES (...), сбрасывая содержимое буфера.

    https://www.w3schools.com/sql/sql_insert.asp
    https://www.w3schools.com/sql/sql_insert_into_sele...

    Или же импортировать файл утилитой Mysql Shell.
    Ответ написан
    Комментировать
  • Как устранить зависания в запросах к БД Postgres?

    romesses
    @romesses
    Backend инженер
    К коду есть замечания:
    Свалено все в кучу (требуется рефактринг)
    Риск инъекций SQL. Используйте SQL query builder/ORM.
    Нет проверок результата работы с СУБД.

    Как решить:

    send_alert_to_mail синхронна и вызывает блокировку - сделать асинхронным вызовом и даже отправлять в очередь специально для отправки писем.

    Обвернуть все вызовы БД декоратором с замером времени исполнения. Обычно, проблема не в СУБД, а во взаимодействии с ней и всякими блокировками, как с send_alert_to_mail.

    Поптыка
    очепятка :-)
    Ответ написан
    2 комментария
  • Куда коммерческому решению уйти от текстовых логов?

    romesses
    @romesses
    Backend инженер
    Opensource - все делаете сами: разворачивание инфраструктуры, установка, настройка и поддержка.
    Filebeat (agent) + ElasticSearch (DB) + Kibana (UI)
    Graylog + ElasticSearch

    Коммерческие:
    Papertrail, Loggly, Logz.io, LogDNA

    Гигабайты за часы вам дорого обойдутся. Постарайтесь сократить объем информации, необходимой для журналирования. Периодически выполнять log rotation, настроив retention policy.

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

    romesses
    @romesses
    Backend инженер
    Ну вижу смысла выносить конкретное поле (флаг) в отдельную таблицу. Потому что ничего хорошего это частное отделение не даст:
    1. фактор неожиданности у коллеги: с какого перепугу была необходимость отделения конкретного флага?
    2. дополнительная таблица, для которой нужен JOIN.
    3. дополнительный код
    4. дополнительные миграции и поддержка


    На мой взгляд все эти настройки должны лежать в отдельной таблице product_settings, ну если уже в коде везде product, а не project. Так как по сути это настройки, а не прямая информация о продукте.

    Если уж отделять метаданные и настройки, так все сразу, а не ради одного флага. Тогда есть смысл в рефакторинге и приведении порядка.
    Ответ написан
    1 комментарий
  • Как это кодируется?

    romesses
    @romesses
    Backend инженер
    Это идентификатор UUID и он случайный. Только тот сайт обладает информацией о том какие идентификаторы используются и они хранятся с БД. Подбирать его не имеет смысла - в нем 128 бит для перебора.
    Ответ написан
    Комментировать
  • Можете накидать идеи для проектов на rust?

    romesses
    @romesses
    Backend инженер
    Открываете Гитхаб, Гитлаб и пр.
    Находите любой понравившийся проект с открытым кодом на Rust.
    Открываете Issues и анализируете проблему.
    Свяываетесь с авторами проекта и решаете вполне конкретную проблему, предлагая PR/MR.
    Тогда и сообщество и вы довольны.
    Ответ написан
    Комментировать