Задать вопрос
  • Как сделать эффект текста на кривой безье?

    @garbagecollected
    Математика трансформаций очень простая.

    Отрендерить текст на изображение можно используя
    https://opentype.js.org/

    Вы можете отрендерить каждую букву используя библиотеку, а далее уже отрендеренные буквы использовать на своем сайте без библиотеки.

    Либо использовать эту же библиотеку для того, чтобы получить path data для каждой буквы.

    Если ваша трансформация сводится к аффинным преобразованиям, то можно рассчитывать координаты не каждой точки изображения буквы, а только точки, которые участвуют в path data. Таким образом трансформируя все точки path data вы получите такую же path data, используя которую вы начертаете шрифты в любом месте на любом изображении. Это может дать очень выгодный прирост к производительности (потенциально до 1000х раз). Кроме того, линии path data "рисуется" с правильным расчетом межпиксельного пространства, и вам не надо будет делать ресамплинг, как при работе с трансформированием изображений.

    Но рисовать шрифты по безье - это не всегда можно свести к аффинным преобразованиям.

    На верхней иллюстрации у вас используется искажение по оси X: skewX()

    Получить координаты каждой точки можно умножив матрицу с исходными точками на матрицу CTM.
    https://www.w3.org/TR/SVG11/coords.html#TransformM...

    Сама матрица CTM - это произведение матриц всех трансформаций. То есть, чтобы не умножать матрицу точек на матрицы каждой трансформации, сначала вычисляется произведение матриц всех трансформаций, которое называется CTM.

    По ссылке выше вы найдёте матрицы с формулами аффинных преобразований в двухмерном пространстве. Матрицы имеют вид (3х3) из которых 6 чисел значимые, 3 числа - статичные (всегда [0, 0, 1]).

    Для 3D-преобразований используются матрицы 4х4 из которых 12 чисел значимые, 4 числа - статичные (всегда [0, 0, 0, 1]):
    https://drafts.csswg.org/css-transforms-2/#mathema...

    Для расчета 3d-трансформаций с учетом перспективы используются матрицы 8х8.

    На нижней иллюстрации у вас используются трехмерные искажения.

    Про математику 3D искажении с перспективой можно прочитать тут
    https://www.cs.cmu.edu/~ph/texfund/texfund.pdf
    Там рассматриваются и формулы получения координат на плоскости и ресамплинг (чтобы, например, не было пикселизации шрифтов после трансформации).

    Для перемножений матриц можно использовать функцию

    const multiply = (a, b) => a.map((_, r) => b[0].map((_, c) => a[r].reduce((s,_,i) => s + a[r][i] * b[i][c], 0)));


    Рассчитать координаты безье можно функциями (соответственно, квадратичная и кубическая безьё):

    // [p0x, p0x] - are coordinates of origin point
    // [p1x, p1y] - are coordinates of single control point
    // [p2x, p2y] - are coordinates of destination point
    // T - is number of points that needs to draw the curve
    const quadratic = ([p0x,p0y], [p1x,p1y], [p2x,p2y], T = 60) => {
      const x = t => (1 - t)**2 * p0x + 2 * (1 - t) * t * p1x + t**2 * p2x;
      const y = t => (1 - t)**2 * p0y + 2 * (1 - t) * t * p1y + t**2 * p2y;
      return Array.from({ length: T+1 }).map((_, t) => [x(t / T), y(t / T)]);
    };
    
    // [p0x, p0x] - are coordinates of origin point
    // [p1x, p1y] - are coordinates of first control point
    // [p2x, p2y] - are coordinates of second control point
    // [p3x, p3y] - are coordinates of destination point
    // T - is number of points that needs to draw the curve
    const cubic = ([p0x, p0y], [p1x, p1y], [p2x, p2y], [p3x, p3y], T = 60) => {
      const y = t => (1 - t)**3 * p0y + 3 * (1 - t)**2 * t * p1y + 3 * (1 - t) * t**2 * p2y + t**3 * p3y;
      const x = t => (1 - t)**3 * p0x + 3 * (1 - t)**2 * t * p1x + 3 * (1 - t) * t**2 * p2x + t**3 * p3x;
      return Array.from({ length: T+1 }).map((_, t) => [x(t / T), y(t / T)]);
    };
    Ответ написан
    1 комментарий
  • Полноценная Убунта поверх WSL?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Это https://apps.microsoft.com/detail/9pn20msr04dw?hl=... и есть полноценная Ubuntu внутри WSL.
    Для того, чтобы в ней запускались графические приложения - нужно обновить версию wsl до 2 https://learn.microsoft.com/en-us/windows/wsl/install последнего релиза
    https://github.com/microsoft/WSL/releases
    И она работает так же хорошо, как и отдельно стоящая ОС, а также решает проблемы с тормозами docker в Windows.
    Ответ написан
    7 комментариев
  • Вопрос по надежности ZFS. Как лучше делать датасеты: со сжатием или без?

    @elbrus56
    Не очень понятно: речь о сжатии или шифровании пула.

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

    ZFS надежнее, чем привычная нам ФС. Лечит сама себя. Если будут ошибки чтения/записи – она сама сообщит вам об этом и даже покажет, какие файлы могли пострадать. Надо только попросить.
    Ответ написан
    Комментировать
  • Как настроить WireGuard для нескольких клиентов на Микротике?

    @AlexVWill
    А ключи для каждого клиента (для каждого пира) уникальные? Проверь мануал, я точно не помню как там должно быть, давно не пользовался, но по идее пира только публичный ключ должен совпадать с интерфейсом, а приватные должны быть разные для всех клиентов. Просто если нет, подключение второго аналогичного может вышибать первый подключенный, если я верно проблему уловил.
    Ответ написан
    Комментировать
  • Как организовать отправку сообщений в множество микросервисных нод?

    Берете какой-нибудь брокер сообщений.
    Например, Rabbitmq.
    Там создаёте exchange с типом fanout. Туда будете слать сообщения из сервиса-отправителя.
    Каждый сервис-получатель будет подключаться к этому exchange и для каждого будет создаваться своя очередь, куда будут попадать все сообщения. И каждый сервис спокойно сам вычитает свою очередь. И даже если он упадёт, то дочитает их после того, как подымется.
    https://youtu.be/P_EtQ-s-hiU?si=tavSDSzTnGpqQrAY
    Ответ написан
    2 комментария
  • Какой отечественный linux выбрать для веб-разработки?

    @atabrakadabra
    любой линукс для десктопа не годится
    Ответ написан
  • Возможно ли переписать это на PowerShell?

    @d-stream
    Готовые решения - не подаю, но...
    вот скормил ии и он даже на cmd сотворил
    for %%F in ("%source_folder%\*") do (
        call rling "%%~fF" "%compare_folder%"
        type result.txt >> %output_file%
        del /q result.txt


    на powershell
    if (!(Test-Path $outputFile)) {
        New-Item -Path $outputFile -Force | Out-Null
    }
    Get-ChildItem -Path $sourceFolder -File | ForEach-Object {
        & rling $_.FullName $compareFolder
        Get-Content -Path '.\result.txt' | Add-Content -Path $outputFile
        Remove-Item -Path '.\result.txt' -ErrorAction SilentlyContinue
    }


    ну и да, если предварить каждую команду в исходном тремя буковками wsl - то тоже будет результат)

    p/s/ кстати интересная логика у ии)
    Ответ написан
    4 комментария
  • Домашний сервер или NAS - чем обойтись?

    @TheBigBear
    СтарОдмины мы
    Самое простое решение:
    Ставьте обычный, не серверный Windows - 10 или 11 - не важно, главное версия Pro а не Home
    1. Расшарьте нужную папку - у Вас появится сетевой ресурс, который Вы сможете подключить на ноуте как сетевую папку. У не серверной ОС ограничение на 20 одновременных подключений - вам хватит за глаза
    2. Параметры - Система - включить удаленный рабочий стол
    Это позволит подключаться к Вашему "серверу" удаленно по протоколу RDP с помощью программы "удаленный рабочий стол" и работать с установленными на нём программами как на своем компьютере
    3. Параметры - Система - дополнительные компоненты - другие компоненты Windows - добавить Hyper-V
    Получите виртуальный сервер и сможете установить на него Home Assistant. Ну или еще какие нужно серверы - лишь бы памяти хватило.
    4. iVMS от HiWatch или любую другую CMS (если камеры поддерживают ONVIF - непринципиально) - вот и сервер видеонаблюдения готов
    Ответ написан
    1 комментарий
  • Как создать навык для Алисы для проигрывания аудиопотока?

    the_house
    @the_house
    Full stack разработчик
    import logging
    from flask import Flask, request, jsonify
    
    app = Flask(__name__)
    
    @app.route('/api/v1/skill', methods=['POST'])
    def skill():
            request_json = request.json
            if 'request' in request_json:
                    command = request_json['request']['command']
            if 'Включи аудио стрим' in command:
                    response_text = 'Включаю аудио стрим'
                    url = 'http://you.site/stream.mp3'
                    return jsonify({
                            "version": request_json['version'],
                            "response": {
                                    "text": response_text,
                                    "tts": response_text,
                                    "buttons": [],
                                    "end_session": False
                            },
                            "session": request_json['session'],
                            "user_id": request_json['session']['user_id'],
                            "audio": {
                                    "url": url
                            }
                    })
            return jsonify({'status': 'error'})
    
    if __name__ == '__main__':
            app.run(host='0.0.0.0', port=5000)
    Ответ написан
    2 комментария
  • Установка прав доступа на все файлы?

    @rPman
    Правильное решение - не работать из под root, копирование файлов производить под тем же пользователем (или пользователем в той же группе что и скачивающий), тогда проблем с настройками прав не возникнет.

    p.s. на сколько я знаю в каких то ftp серверах была возможность принудительно задать пользователя, под которым сервер будет запущен и авторизован, а авторизация пользователя ftp не будет соответственно авторизации ОС, тогда запущенный под root сервер решил бы твою проблему, но это огромная дыра, так давно уже не поступают.

    p.p.s. ftp на столько устаревший протокол, что удобные решения для него уже мало кем поддерживаются (т.е. для галочки базовый сервер еще входит в репозитарии, но нафиг никому не нужен)

    пользуйтесь sftp/scp, который встроен по умолчанию в ssh сервер, который есть для любой ОС на планете, стандарт безопасного подключения, на столько многофункционален. что даже vpn через него поднять можно (штатным инструментом)
    Ответ написан
    Комментировать
  • Как вывести имя компьютера на экран входа в систему?

    VoidVolker
    @VoidVolker Куратор тега Windows
    Dark side eye. А у нас печеньки! А у вас?
    Да, это достаточно легко сделать. В любом формошлёпе клепаете простейшую форму и в ней выводите имя машины, окну ставите стиль ToolWindow (WS_EX_TOOLWINDOW), без бордера (а еще хорошо бы отключить системное меню и закрытие через Alt+F4). Устанавливаете вот этот Windows-logon сервис, а в настройках указываете ранее созданное приложение.
    Ответ написан
    9 комментариев
  • Как совместить traefik в докере и nginx на хосте?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    1. Не делайте expose port для докер контейнера
    2. Не запускайте контейнер с network=host
    и ваш контейнер не будет занимать порты nginx.
    Ответ написан
    Комментировать
  • Какая версия MacOs лучшая для MacBook Pro 2018?

    xez
    @xez
    TL Junior Roo
    Последняя лучшая
    Ответ написан
    Комментировать
  • Проблемы с ядром от ИСП РАН?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Возможно. Но будет:

    1) Высокая нагрузка в простое
    2) Характерный свист дросселей
    3) Не работать Wi-Fi
    Ответ написан
    Комментировать
  • Как соединить 3 роутера в одну локальную сеть?

    @Drno
    РОутеры перевести в режим свитча, отключить на них NAT и DHCP
    Задать роутерам IP из локальной подсети 1го роутера
    приходящий кабель вместо WAN воткнуть в LAN порт (2го и3го ) роутеров
    всё, будет 1 общая сеть
    Ответ написан
    4 комментария
  • Выбор одноплатника/роутера для домашнего http сервера?

    xenon
    @xenon
    Too drunk to fsck
    Раз вам нужен HTTP сервер (а еще, видимо, рядом потребуется и СУБД запустить и какие-нибудь приложения), да еще и обход блокировок (а для этого требуются разные средства, не факт, что то, что работает сегодня, будет подходить через год), то вам нужен не роутер, а компьютер. Можно не слишком быстрый, но все-таки компьютер. Какие бы сложные блокировки ни были, если для них будет возможность обхода - она наверняка будет работать на Linux, а вот будет ли работать на роутерах - это под вопросом.

    Одноплатники - стоят конские деньги для своей мощности, я бы их отмел. Я советую - мини-пк, которых сейчас много. Это все-таки настоящий компьютер, который можно как угодно конфигурировать, с полноценным обычным Linux внутри.

    У меня c Озона (с Китая) - "Findarling Мини-ПК T9 Plus (Intel Processor N100, RAM 16 ГБ, SSD 512 ГБ, Intel HD Graphics, Windows 11 Pro), черный"
    Я брал за 14 тыров, сейчас он 16 стоит. (есть варианты с SSD 256 и 1024).

    Чем нравится: Вы видите характеристики, вполне себе достойная машинка даже для работы. На ней даже по приколу WoT можно запустить. Внутри обычный дебиан поставил. Проц N100 - довольно-таки мощный.

    Бенчмарки:
    geekbench: 1138 / 2795
    UnixBench: 1706 / 4881

    Для сравнения мой Core i5-4570 по unixbench дает 5753. На 20% быстрее всего (ну так то i5, а там N100)

    И еще одна очень приятная фишечка именно этого вот мини-пк - ДВА ethernet порта! То есть, вполне пригоден в качестве файрвола, роутера.
    Большой диск - можно использовать как файлопомойку и медиа-сервер (чтобы крутить фильмы с него на ТВ или через DLNA или сразу через HDMI).

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

    Может быть вам какой-то другой мини-ПК подойдет, или вообще обычный в каком-нибудь micro-ATX корпусе (тогда вопрос ремонта-апгрейда еще проще будет). Но мой совет - смотреть в сторону более-менее современных, "настоящий" компьютеров, а не одноплатников. Чуть-чуть дороже, но гораздо-гораздо мощнее.
    Ответ написан
    Комментировать
  • Как запустить Proxmox внутри vm с минимальным оверхедом?

    opium
    @opium
    Просто люблю качественно работать
    А какая вам разница на оверхед , вы же не продакшен все равно
    Просто запускайте как умеете
    Ответ написан
    Комментировать