Задать вопрос
  • Можно ли создавать и сохранять LaTeX-изображения в Node.js?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Многие приложения ещё лет 20 назад решали такое через внешний вызов tex, например, mediawiki и moodle.

    Покопался в интернетах, в основном все используют jsmath/mathjax/katex для того чтобы получить html-версию формулы. Также есть проекты, которые генерят pdf, в том числе с помощью нативного js-кода на базе трансляции web в js (texlive.js, latex.js). Сделал ли кто-то аналогичное для получения только картинок - я не нашёл, но может недостаточно глубоко искал.

    В этом видео предлагается делать screenshot формулы, отрендеренной mathjax. Такое себе...

    Возможно, имеет смысл зайти через MathML, если что-то умеет его рендерить и если есть конвертеры \TeX-а в MathML.

    Что интересно, решения для питона гуглятся сразу - например, sympy умеет \TeX-формулы.

    Материала для экспериментов и возможно дальнейшего поиска уже набралось. А вообще, \TeX{} не очень предназначен для встраивания~--- он всегда был "вещью в себе" для создания полноценных документов с его помощью.
    Ответ написан
    Комментировать
  • Какой функционал доступен у Whatsapp бизнес?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    WhatsApp Business - это обычный клиент WA для телефона со своим номером, только с дополнительными функциями для бизнеса. Подключать в него "обычные номера" нельзя. Клиент ставится на один телефон и только на одном и можно работать от имени бизнеса. Для маленьких бизнесов самое то, что ставится всего одно приложение и оно закрывает все потребности.

    Чтобы могли работать разные сотрудники, чтобы была история, аналитика, средства рассылок, интеграция с чат-ботом итд итп - это в сторону WhatsApp Business API и различным решениям под него. Их довольно много. Например, есть интеграции в битриксе или в живосайте.
    Ответ написан
    Комментировать
  • Почему с фильтром PostgreSQL выдаёт больше записей?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что time_start у некоторых, пришедших не в этом году, имеет invoice_id is null по старым записям. Раньше эти записи попадали в предыдущие года и давали min(time_start) в прошлом, а после дополнительного условия time_start у всех отобранных попадает уже в текущий год и min(time_start) попадает в условие отбора.
    Ответ написан
    Комментировать
  • Можно ли C/CD в гитлаб настроить на всю группу?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно в настройках репозитория указывать путь к внешнему gitlab-ci.yml в другом репозитории. Тогда он может быть один на всех и в каждую репу его добавлять не нужно и изменения файла можно делать только в одном месте.
    Ответ написан
    2 комментария
  • Как в LaTeX убрать пробел между системой и текстом?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В чём глубокий смысл использовать тут center? Формула и так по умолчанию будет центрирована, а убирание center решает проблему.
    Ответ написан
    1 комментарий
  • Как Telegram бот может отправить ссылку для отправки SMS?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно давать ссылку на http/https, который редиректит на sms.
    Ответ написан
    5 комментариев
  • Как в вашей компании обеспечивается установка пакетов и обслуживание репозиториев?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Делаются локальные копии основных репозиториев (reposync, debmirror и другие подобные инструменты), это может касаться и самих дистрибов с пакетами, и всяких менеджеров пакетов для языков типа pip, maven, npm. Либо, как вариант, доступ к ним прописывается через прокси с хорошо контролируемым списком хостов, куда разрешено ходить. Отдельные приложения (вне репозиториев или собственные разработки или свои кастомные сборки) можно класть в свои репозитории либо иногда норм даже просто положить архивом на http, который скрипт раскатки (ansible?) скачает и положит куда надо. Например, именно так у нас по хостам расползается jdk всех нужных версий (в тех проектах, где до контейнеризации нужно ещё космическое количество рефакторинга провести).

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

    Это вообще часть подхода, при котором инфраструктура имеет свой жизненный цикл, свои практики и инструменты, которые отделены от жизненного цикла конечных бизнес-приложений с их совсем другими методами раскатки, обновления, контроля работоспособности.
    Ответ написан
    7 комментариев
  • Как в oracle sql developer 21.2.1 открыть окно вывода sql команд?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Самое простое решение на случай, если чего-то дефолтно присутствующее потерялось:

    673f5705bc6cd794914270.png

    А так вообще в меню View порыться.
    Ответ написан
    Комментировать
  • Верификация номера телефона на сайте. Какие методы есть?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Я бы не стал пренебрегать вариантом с Telegram. Аккаунт в Telegram сейчас есть у значительной части пользователей. При этом в Telegram сейчас появился платный сервис Telegram Gateway для отправки кодов авторизации по номеру телефона. Либо можно использовать авторизацию бесплатно через бота либо виджет Telegram Login - так делают некоторые сайты уже давно. Через бота можно с помощью ссылки вида t.me/MyAwesomeBot?start=секретный_код, бот обработает код и запишет в профиль пользователя привязку к его Telegram user_id. Или попросить пользователя найти этого бота и ввести ему код вручную. Не очень удобно, и нет привязки к номеру, но зато это бесплатно.

    В WhatsApp можно легально использовать WhatsApp Business API, но надо быть бизнесом (хотя бы ИП), частному лицу не дадут зарегистрировать бизнес-аккаунт. Отправка только по шаблонам, которые модерируются при регистрации. Но для кодов может быть достаточно всего одного шаблона.

    Либо использовать нелегальный WhatsApp Web API, с которым работает Web-версия WhatsApp. Они это не любят и могут за такое номер забанить, поэтому если захочется рискнуть - следует по крайней мере использовать какой-нить новый ненужный номер, чтобы было не жалко и в случае потери.

    Есть ещё Viber, там тоже можно платно посылать сообщения от имени бизнеса по номеру телефона, но пользовательская база в России у Viber не очень большая.

    Также можно использовать регистрацию через соцсети (vk, facebook), в них всё же очень активно занимаются борьбой с авторегистрациями.

    Также можно использовать приложения типа Google Authenticator с авторизацией по одноразовым кодам, привязанным к аккаунту Google.

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

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

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Например, так:

    iptables -t mangle -N SPISOK
    iptables -t mangle -A SPISOK -d 10.9.0.0/24 -j RETURN
    iptables -t mangle -A SPISOK -d 10.11.0.0/24 -j RETURN
    iptables -t mangle -A SPISOK -d 10.14.0.0/24 -j RETURN
    iptables -t mangle -A SPISOK -j MARK --set-mark 4
    iptables -t mangle -A PREROUTING -i enp1s0 -s 10.8.0.0/24 -j SPISOK
    Ответ написан
    Комментировать
  • Если установленное приложение с вирусом используется через CrossOver или PlayOnMac, могут ли они заразить основную систему?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Приложению будут доступны все файлы, которые доступны запустившему его пользователю. Это значит, что оно может заразить exe-файлы, зашифровать документы, найти и угнать файлы с паролями, данные из браузера, а ещё оно может потенциально распознать, что это Linux/Mac и принести в систему зловредов под эти системы.

    НИКОГДА нельзя рассчитывать на то, что пронесёт. Если хочется проверить работу вирусов, то только виртуалка и лучше с наглухо отрубленной сетью.
    Ответ написан
    9 комментариев
  • Сложная маршрутизация на linux роутере. Как правильно готовить policy based routing?

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

    Если кратко, маршрутищация в iproute2 устроена так. Есть несколько таблиц маршрутизации, из которых 3 есть всегда (local, main, default), но можно создать ещё. По правилам (команда ip rule) перебираются таблицы, подходящие под условия, в соответствии с приоритетами (preference, первое число в выводе команды). И в каждой таблице есть свои маршруты. Таблицу local изменять нельзя и перед ней ничего маршрутизировать нельзя (это можно обойти через nat в PREROUTING, но это уже другой вопрос).

    Самый простой вариант - это source routing. Впервые мне это понадобилось, когда я подключил дома второго провайдера с внешним IP, и мне потребовалось отвечать с обоих внешних адресов со всего интернета. Делается так:

    1. В /etc/iproute/rt_tables описываем псевдонимы для новых таблиц (необязательно - можно использовать числовые идентификаторы - но так удобнее). Например, 10 - isp1, 20 - isp2.

    2. Задаём правила, которые приведут к выбору таблицы в зависимости от source address:

    ip rule add pref 10 from IP1 lookup isp1
    ip rule add pref 20 from IP2 lookup isp2

    3. В каждую таблицу добавим маршрут default через нужного оператора:

    ip route add default via GATEWAY1 table isp1
    ip route add default via GATEWAY2 table isp2

    4. В таблице main (которая используется по умолчанию, если не указать таблицу в команде явно) описываем маршрут "по умолчанию" - через того оператора, через которого будет идти исходящий трафик (не ответный на входящий), в данном случае пусть будет isp1:

    ip route add default via GATEWAY1

    Всё это иногда можно в той или иной степени засунуть в конфиги сети (зависит от дистрибутива Linux весьма существенно), а иногда приходится делать скриптами, в том числе, возможно, вызываемыми через hook системы инициализации сети (я, например, обновлял маршрутизацию через postup-хук dhcp-клиента и из скрипта, который поднимал pptp-vpn).

    В дальнейшем всё это обросло кучей других особенностей, например, ip rule fwmark по меткам, которые ставилилсиь в iptables по connmark и иногда другим условиям, но это уже следующий уровень сложности и более специфичне задачи. И LARTC HOWTO почитать всё равно рекомендую, ибо там основа основ и все гуру по нему учились.
    Ответ написан
    3 комментария
  • Как сделать так, чтобы кнопку в сообщение было видно определённым ролям?

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

    Как вариант, можно сделать отдельный служебный канал для пользователей с нужной ролью, пусть там делают все эти свои действия. Иногда это неплохое решение подобной задачи.
    Ответ написан
  • Как настроить webhook для бота aiogram 3 и nginx?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Код на python использует polling, причём тут вебхуки? Для вебхуков надо web app сделать, который их принимает. Вот в документации пример: https://docs.aiogram.dev/en/latest/dispatcher/webh... и там же есть образец настройки nginx.
    Ответ написан
    Комментировать
  • В чём смысл равного ограничения времени для разных ЯП в спортивном//олимпиадном программировании?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смысл в первую очередь в том, чтобы участник не написал алгоритм, который будет считать 10 часов или 10 суток или вообще 10 лет, что помешает закончить олимпиаду в разумные сроки. А ведь олимпиады, как правило, проводятся в реальном времени, прогоняются тесты и выдаётся результат прям вот сразу...
    Ответ написан
    Комментировать
  • Как импортировать контакты (клиентов из CRM) в группу Телеграм?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Такого способа нет. Поиск в Телеграме такого большого количества номеров гарантирует бан аккаунта. Кроме того, у многих пользователей номер может быть скрыт настройками приватности.

    Приавильное решение - разослать пользователем SMS со ссылкой на канал. Также канал пихать на сайт, в личный кабинет, письма о заказах, визитки менеджеров итд итп. Параллельно не забывать вести канал интересным контентом, не очень редко, чтобы канал не казался заброшенным, но не слишком часто, чтобы пользователей не задолбало и они не отписались (тем паче сейчас почти любой пользователь подписан как минимум на пару-тройку каналов заведомо интереснее вашего).
    Ответ написан
    Комментировать
  • Есть ли скрипт для изменения определённого текста в коде страницы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    magesypro.com##.active.mdpDeblocker-the-modal.mdpDeblocker-modal
    magesypro.com##body:remove-class(mdpDeblocker-blur)
    magesypro.com##.mdpDeblocker-wrapper
    magesypro.com##.mdpDeblocker-blackout


    Правила, после которых всё стало хорошо (использовал uBlock Origin в Firefox).
    Ответ написан
    1 комментарий
  • Насколько целесообразно использовать ленточную схд для продакшена?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Ленточная библиотека похожа на CD-changer: есть N кассет, и специальный механизм перемещает выбранную в считыватель, после чего начинается собственно считывание. Непосредственного доступа к данным на ленточках как на дисках нет. Одновременно читать несколько ленточек можно только если в ленточной библиотеке несколько считывателей (в частности, довольноо обычное дело когда там два считывателя). Одновременно читать несколько файлов с одной ленточки тоже нельзя, считывание происходит по очереди (и придётся в любом случае перемотать к нужному месту).

    При этом использующие ленточные библиотеки обычно имеют ленточек заметно больше, чем вмешается в библиотеку. Например, в библиотеке лежит 24 кассеты, а рядом на полке ещё 40 штук. Где-нибудь хранится информация, что на какой кассете лежит, и при необходимости достать что-то конкретное нужная кассета вручную помещается в библиотеку (вместо какой-нибудь другой).

    Обычно ленточки используют как раз для такого хранения информации, когда её нужно доставать редко и по запросу. Исходники старого продакшна - вполне себе неплохой пример. Ведь когда проект завершается и сдаётся - он в подавляющем большинстве случае нужен затем почти никогда. Но если в вашем случае надо доставать их часто и быстро, то ленточная библиотека вам точно не подойдёт.
    Ответ написан
    Комментировать
  • Как получить username пользователя имея id без использования telegram web, но используя Python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Получить id по username средствами Bot API нельзя. Его можно получить только вместе с событием, связанным с пользователем. Например, пользователь нажал кнопку /start, пользователь написал боту или в общую группу с ботом, пользователь вступил в группу...

    Telegram Bot API предполагает (и это абсолютно правильно!), что боты не могут писать произвольным пользователям и вообще знать об их существовании. Речь должна идти исключительно об инициативе пользователя начать коммуникацию. Иногда косвенно: например, вступая в группу, куда администратор добавил бот. Но случайных пользователей без их явно выраженного действия бот не может найти.

    Конечно, это можно обойти клиентским API (telethon выкидывает из-за того что его активно используют спамеры, но это тоже решаемо). Но я бы рекомендовал зайти с другой стороны: не надо вообще делать всякую фигню, на которую Bot API не рассчитан. Никакой пользы от неё нет.

    Например, если задача в том, чтобы получить список контактов для взаимодействия, то НЕ НАДО было собирать ссылки на профили пользователей. Вместо этого следовало просить их написать боту или вступить в группу. А там уже ботом словить информацию по ним и записать куда надо для ботовых задач.
    Ответ написан
    Комментировать
  • Как взять фото из SQLite и отправить через телеграм бота?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Для начала, картинки - бинарные файлы. Какой тип у поля в базе данных? Если текстовый - поздравляю, картинки уже побились необратимо.

    После пересоздания базы с нужным типом данных у этого поля (BLOB) придётся заново загрузить все файлы.

    А теперь самое главное: хранить файлы в базе - плохая идея. Правильно хранить их отдельно как файлы в файловой системе, а в базе хранить имя файла. Рекомендую сразу же переделать.
    Ответ написан
    3 комментария