Задать вопрос
  • По какой причине проявляется ошибка внутри докера? как можно его пофиксить?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    А вот что именно должна делать команда

    ${WEBPACK_COMMAND:- ng build --configuration=production}


    и почему удивляет, что она завершается некорректно? Определена ли вообще переменная $WEBPACK_COMMAND? Почему при сборке вообще потребовалось брать название команды из внешней переменной? Тут вообще работают bash-евые подстановки в командах (подозреваю что нет, но не проверял)? Может, там и shell в базовом образе не bash, а классический sh?

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

    До кучи, тут CMD - это команда, запускаемая при старте контейнера. Но по логике этого докерфайал, эта команда предполагалась к запуску только при сборке образа. Чтоб это исправить, надо поменять CMD на RUN.

    Что будет при неуказании CMD запускаться в создаваемом на базе этого образа контейнере будет в таком случае унаследовано из FROM node:14-alpine, в данном случае видимо это запуск nginx. Если нужно запускать что-то своё вместо дефолта, то CMD надо переопределить на команду реального запуска приложения (типа CMD node /path/to/app.js или что там у вас в node.js принято делать для запуска?),

    Ну и делать внутри образа две копии приложения тоже немного странно. Лучше или собирать приложение сразу в конечном каталоге /usr/share/nginx/html, либо изменить конфиг nginx на использование другого каталога. Скорее всего, в этом образе - как и в официальном образе nginx - конфиг лежит в /etc/nginx/conf.d/default.conf.

    А ещё более хорошо и правильно освоить multi stage build в докере.
    Ответ написан
  • Какое лучшее приложение терминала (локального) для Android?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Есть терминалы под сам андроид, без какой-либо обвязки и утилит, что в системе есть - тем и пользуйся. Ничего сравнимого с Termux, у которого есть готовая мини-система, пакетная база и пакетный менеджер.

    Нужно ещё понимать, что с какого-то SDK Level приложения больше не могут делать exec и запускать другие приложения соответственно. А с более низким SDK Level больше невозможно пройти review у гугла. Поэтому Termux нынче распространяется через сайт в виде apk-файла, а не из магазина.

    А чем Termux не угодил? Всё остальное всё равно никак по фичам не дотягивает.
    Ответ написан
    Комментировать
  • Не работает удаление файла в python что делать?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смотрим в код программы:

    voice_input = record_and_recognize_audio()
    os.remove("microphone-results.wav")


    Если внутри функции record_and_recognize_audio случается исключение (speech_recognition.WaitTimeoutError) из-за ошибки, то файл не будет создан. Соответственно, удалять будет просто нечего.

    Как решать? Ну для начала можно просто не удалять файл. Всё равно он при каждом вызове функции перезатирается. Не самое плохое решение, на самом деле.

    А лучше проверять возвращаемое функцией значение, да и выявить и порешать исходную проблему тоже надо бы.

    Но ещё более правильно почитать учебник или какие-то уроки по основам языка. Программировать копипастами чужого кода без какого-либо понимания - так себе путь.
    Ответ написан
    Комментировать
  • Нужна помощь/совет - Telegram бот?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В pythonanywhere в бесплатном тарифе доступен ограниченный список сайтов https://www.pythonanywhere.com/whitelist/
    Ответ написан
    Комментировать
  • Как соответствовать LGPL для Qt?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Да, лицензия LGPL для того и придумана, чтобы можно было линковать закрытый код с открытым, при этом изменения в сам этот открытый код необходимо публиковать.
    Ответ написан
    Комментировать
  • Как читать сообщения из канала telegram программно?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Перед такими вопросами надо сначала гуглить.

    Мне потребовалось менее 5 минут, чтобы найти это:

    https://github.com/tdlight-team/tdlight-java
    https://github.com/Telegram4J/Telegram4J

    Оба проекта выглядят достаточно живыми.

    Вот до кучи пример самостоятельного использования tdlib в связке с Spring Boot: https://habr.com/ru/articles/738022/
    Ответ написан
    1 комментарий
  • Как управлять по сети загрузкой ОС?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нормальное решение - сетевая загрузка (PXE) и подсовывать нужный конфиг. Можно даже использовать загрузчики типа ipxe, которые умеют качать файлы по http. Но для одно компа это может оказаться чересчур.

    Как вариант, можно было бы настроить grub, чтобы он загружал систему из "saved", и тогда можно было бы менять командой grub-set-default, затем перезагружать. Но это сохраняется в файл, который из-под Windows будет недоступен.

    Думаю, проще одну из систем поставит в виртуалку в другой, тогда обе могут быть доступны постоянно.
    Ответ написан
    2 комментария
  • Как сделать автоматическое версионирование в GitLab, GitHub и т.п.?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно в gitlab CI использовать $CI_PIPELINE_ID или $CI_PIPELINE_IID. Наверняка в других тоже есть подобное.

    У нас тут автоматом вешается тэг v$CI_PIPELINE_ID в репе конфигов и сборок и дальше это является версией при деплое. Но ничто не мешает похожим образом делать тэг образа, имя файла, имя артефакта итд.
    Ответ написан
  • Как запусить две функции асинхронно?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Всё так и должно быть, ведь await означает ожидание завершения функции и получения её результата, вторая не будет запущена до этого.

    Можно например так:

    send_result = send()
    polling_result = dp.start_polling(bot)
    await send_result
    await polling_result


    Или так:

    send_result = send()
    polling_result = dp.start_polling(bot)
    await asyncio.gather(send_result, polling_result)


    Или даже так:

    await asyncio.gather(
         send(),
         dp.start_polling(bot)
    )
    Ответ написан
    Комментировать
  • Как динамически изменять InlineButton?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Существует метод bot.edit_message_text, которым можно отредактировать ранее отправленное сообщение. Соответственно, редактируем, передавая старый текст (если его не надо менять) и новую клавиатуру.

    Примеров в интернетах много, вон хотя бы в моём личном боте: https://github.com/shurshur/glagolitic-bot/blob/ma...
    Ответ написан
    Комментировать
  • Как отследить то, что самопроизвольно закрывает приложения NET в Ununtu?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если приложение, запущенное через &, попробует написать что-то в консоль, то при невозможности написать в эту консоль начнутся проблемы (приложение словит SIGHUP или SIGPIPE). Решение - перенаправить явно весь вывод в /dev/null:

    command > /dev/null 2> /dev/null &

    Вместо двух перенаправлений в /dev/null можно одно перенаправление в /dev/null и одно в другой:

    command > /dev/null 2>&1 &

    Так делать в подобной ситуации необязательно, но часто делают, и полезно знать. Также надо понимать, что запись:

    > file

    эквивалентна:

    >1 file

    А запись:

    < file

    эквивалентна:

    <0 file

    Всё потому, что стандартные файловые идентификаторы такие: 0 - stdin, 1 - stdout, 2 - stderr.

    Также бывают проблемы, когда приложение хочет что-то прочитать с консоли. Можно ему и на вход передать тоже /dev/null:

    command > /dev/null 2> /dev/null < /dev/null &

    Но даже в таком случае при закрытии консоли bash пошлёт висящему в фоне процессу SIGHUP. Чтобы это не случилось, нужно сделать disown сразу после выполнения команды, и это можно сделать в той же строке:

    command > /dev/null 2> /dev/null < /dev/null & disown


    Всё это можно сделать одной командой nohup, которая упрощает все эти действия и вывод записывет в файл nohup.out:

    nohup command &

    Подробнее в man, он довольно короткий и рассказывает всё в деталях.

    Иногда приложения не могут работать совсем без терминала, в этом случае их можно запускать в в screen/tmux или docker.

    Я не просто так рассказываю: понимать теорию очень полезно, в том числе теперь, надеюсь, не возникнет вопроса, почему длительные и просто даже критические к прерыванию операции настоятельно советуют запускать в screen, а не полагаться на то, что они успешно завершатся без отваливания консоли, и добавление & тут ничего не гарантирует!

    Но всё же, совет сразу же научиться использовать systemd (а в других операционных системах и дистрибутивах - возможно свои другие системы управления сервисами) - он ОЧЕНЬ ПРАВИЛЬНЫЙ. Это сложно только в первый раз :)

    Также в особых случаях можно ограничиться специализированными менеджерами типа supervisor или pm2. Особыми являются только случаи, когда подобные менеджеры уже используются для запуска других сервисов, с нуля их использовать при наличии универсального и хорошо работающего systemd практически лишено смысла.
    Ответ написан
    Комментировать
  • Как организовать передачу файлов с FTP сервера?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Самый простой и удобный способ - поднять рядом с ftp http-сервер. Можно даже с паролем (http basic auth).
    Ответ написан
    1 комментарий
  • Python какой хостинг подойдет, и в чем проблема?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В pythonanywhere в бесплатном тарифе ограничен список адресов, на которые можно ходить https://www.pythonanywhere.com/whitelist/ . Кроме того, браузер сам по себе очень тяжёлый, в бесплатных хостингах даже если и удастся его поставить, он упрётся в лимиты по памяти.

    Правильно арендовать VPS. Можно найти весьма недорогие, есть целый ряд сайтов с рейтингами и ценами хостеров. На пиво и сигареты в месяц больше уходит (кроме тех, кто не курит и не пьёт).
    Ответ написан
  • Есть ли сервисы по отправке SMS по API с тестовым периодом?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В настоящее время скорее нет, чем да.

    Сейчас все крупные мобильные операторы требуют регистрации имени с предоставлением документов о товарном знаке, имени сайта итд итп. У некоторых это требует абонентской платы (обычно порядка 2 тыс. рублей в месяц), у некоторых даже бесплатно, но ритуал соблюсти всё равно надо.

    Единственное что можно тут сделать - выяснить у поставщика, нет ли у него возможности отправки на какого-нить не очень крупного оператора (MVNO?), у которого купить симку и на этом номере тестироваться с каким-нить общим именем типа "sms info". Но в целом для выхода в прод регистрация имени всё равно потребуется.
    Ответ написан
    Комментировать
  • Персональный гугл, если ли?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для того, чтобы просканить интернет, нужно для начала иметь список интернет-сайтов и страниц на них. Это уже огромный объём информации, которую поисковики накапливали годами и поддерживают в актуальном состоянии.

    Но даже если такой список есть - по нему ещё надо пройтись. Потратив уйму времени на скачивания этих миллиардов страниц. И возможно в итоге получить 0 результатов. А на следующий запрос начинать скачивать всё то же самое заново повторно.

    Надеюсь, общий ход мысли теперь понятен? "Персональный поисковик" имеет смысл в лучшем случае для поиска по ограниченному подмножеству сайтов. Вероятно, узкоспециализированной тематики. Например, занимаешься вопросами производства изделий из титановых сплавов, заводишь себе список сайтов по тематике: форумы, блоги, сайты производителей, сайты научных журналов по теме... И даже для такого имеет смысл строить собственный поисковый индекс, а не качать тысячи страниц на каждый запрос.

    А искать по всему интернету в личных целях могут только настоящие поисковики. Ну вот можно разве пытаться их результаты обрабатывать и фильтровать, но это уже не будет поиск своими силами.
    Ответ написан
    1 комментарий
  • Что такое inline_query запрос и как отправить его боту?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    У ботов есть интерфейс, который помогает пользователю написать новое сообщение. Для этого надо ввести в любом чате имя бота в начале (@###bot) и какой-то текст, секунду спустя бот вернёт список вариантов для использования. Например, @vid "текст" сделает поиск видео на YouTube и покажет варианты. Пользователь может выбрать вариант и отправить его в текущий чат, а может не выбрать - бот об этом не узнает.

    Пример
    65c3cc74bef59374568860.png


    Как вариант, можно посмотреть моего бота glagolitic_bot, который помогает писать в чатах глаголицей, тифинагицей, коптицей и ивритицей. Ссылка на исходный код есть в описании бота.

    Чтобы бот мог работать в таком режиме, его надо включить у BotFather (Bot Settings - Inline Mode). Надо ещё не забывать, что Телеграм может кэшировать такие подсказки бота.
    Ответ написан
    Комментировать
  • Есть ли возможность перенаправить человека в telegram с заготовленным сообщением?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Такой возможности нет. Можно передать текст в аргумент команды start бота. Больше информации в официальной документации https://core.telegram.org/api/links

    Возможно, более разумным является веб-логин через Телеграм на самом сайте или, например, использование Web App в самом Телеграме. Но это надо существенно пересматривать всё взаимодействие с пользователем.
    Ответ написан
    Комментировать
  • Как выйти из двух пользователей в Linux, и при этом выполнить команду один раз?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    И не будет, ведь такая команда будет исполняться в одном shell, а не в двух разных. После первого exit дальше уже всё, остаток будет проигнорирован.

    Способы есть:

    1. Из суперпользователя убить shell пользователя. Некрасиво и неудобно, но закроет оба шелла.

    2. Переключение в суперпользователя оформить сразу с выходом, тогда выход из внутреннего сделает выход и из внешнего, например:

    sudo -i; exit

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

    3. Вместо предыдущего можно сделать exec, тогда запускаемая команда заместит текущий shell, а не будет запущена как дочерний процесс:

    exec sudo -i

    Недостаток тот же - если не ввести правильно пароль, то выкинет.

    Но в целом я не вижу во всём этом смысла. Выход можно делать комбинацией Ctrl-D. Нажать дважды Ctrl-D ничто не мешает, это даже удобнее.
    Ответ написан
    2 комментария
  • Как найти петлю в локальной сети?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если сеть на неупралвяемом оборудовании, то wireshark в лучшем случае позволит понять, какой мак-адрес больше всех флудит в сеть. Иногда даже по вендору мак-адреса можно угадать, что это. Но в целом это бесполезное занятие.

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Лет 20 назад коллеги сравнили реализации рекурсивного Фибоначчи на C и Java и Java оказалась быстрее (!!!). Декомпиляция показала, что gcc тех лет вставляет в тело каждой функции сохранение некоторых регистров типа push di; pop di; хотя в таком простом коде это вообще не имело смысла. А подобные мелочи могут реально съедать часть процессорного времени в достаточном количестве, чтобы показывать неожиданные результаты.

    Если скомпилировать какой-нить простой цикл с оптимизацией -O2 и тем более -O3, то нередко компилятор, например, заменит N итераций цикла на N/4 или N/8, в каждой из которых будет по 4 или 8 операций. Потому что в силу особенностей современных процессоров это может оказаться вычислительно эффективнее. Программист бы никогда так не написал, а компилятор улучшает его код и делает быстрее. Компиляторы в языки более высокого уровня и даже интерпретаторы байткода на таких мелочах иногда неожиданно выигрывают.

    Надо вникать, что именно получилось на выходе в обоих случаях. Может, рекурсия в go уже не рекурсия, а хвостовая рекурсия? Или вместо far call используются near call, которые быстрее? Или даже как таковых вызовов нет? А может там лишнее время съедает динамическая линковка при запуске, которая в go меньше выражена (а при сборке в статический бинарник вообще отсутствует)?
    Ответ написан
    Комментировать