• Как эффективно хранить canvas попискельно в БД с последующим отображением?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Я сделал бы несколько иначе, сохранял в бд примерное следующее:

    1. кто, когда и как рисовал
    userID - идентификатор пользователя
    timeStamp - временная метка
    point - координата мышки

    2. информация о смене инструмента рисования (кисточки) и настроек инструмента
    userID - идентификатор пользователя
    timeStamp - временная метка
    toolType - тип инструмента (кисточки)
    toolSettings - JSON строка с параметрами инструмента(цвет, размер и т.д.) (у разных кисточек могут быть свои, уникальные наборы параметров, поэтому систематизировать не выйдет, и поэтому JSON строка)

    Имея такие записи в 2-х таблицах получим:
    - в большинстве случаев гораздо меньший объем сохраняемой информации
    - возможность undo как для своих действий, так и для действий других пользователей
    - возможность в последствии отобразить не только результат совместного творчества, но и сам процесс
    - возможность отключать на холсте с результатом как художества отдельных пользователей так и результат применения отдельных инструментов

    ЗЫ: от себя добавлю, что для этой задачи в том виде как ее описал я больше подойдут noSQL базы, в которых можно будет обойтись одной коллекцией и несколькими типами записей:

    1. запись о смене инструмента
    {"action": "changeTool",  userID: "xxxxxxx",  timeStamp: 0000000000000, toolType:"pen"}


    2. запись об изменении параметров инструмента
    {"action": "changeToolSettings",  userID: "xxxxxxx",  timeStamp: 0000000000000, setings: {
        тут у каждого инструмента что-то свое, общими наверно будут только цвет и размер
    }}


    3. запись об пути мазюкания инструментом
    {"action": "path",  userID: "xxxxxxx", path:[
        {timeStamp: 0000000000000, "x": 0, "y": 0},
        {timeStamp: 0000000000000, "x": 0, "y": 0},
        {timeStamp: 0000000000000, "x": 0, "y": 0},
        {timeStamp: 0000000000000, "x": 0, "y": 0},
        ....
    ]}
    Ответ написан
  • Как эффективно хранить canvas попискельно в БД с последующим отображением?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну как минимум за $table->string('color', 18); надо руки сразу отрывать
    То есть на координатах наэкономили, 4 байта в сумме, а потом хоба - в 4 раза больше на несчастный цвет. при том что цветов там явно не больше десятка. И это не говоря уже про нормализацию.

    По уму надо придумать простой бинарный протокол, который получает поток байт выравненными кусками
    2 байта х
    2 байта у
    1 байт цвет
    4 байта юзер (и нечего жадничать, никаких BigInteger. половины населения земного шара вполне хватит)
    то есть всего 9 байт.
    а не под сотню, как сейчас - ещё и завернутое в скобочки/кавычечки джейсона

    Если подумать, то можно юзера сразу не передавать. Всех юзеров никто смотреть не будет, а при наведении можно и отдельный запрос послать. Тогда можно и BigInteger оставить.
    Получится всего 5 байт на пиксель, то есть 10 метров на всю карту. Дофига, но подъемно.

    По пагинации это дурь какая-то. Зачем "офсет-лимиты" если уже есть четкая разбивка.
    Кто мешает запрашивать тупо построчно? Скажем, по 100 строк картинки? 10 запросов по мегабайту.
    id в этой таблице по сути вообще не нужно, только если лара без него не сможет. Но по уму первичный ключ - это ху.

    Из БД получать 2 лимона строк конечно тоже не сахар
    Но можно наверное увеличить строки, хотя бы виртуально.
    Вью или процедура, которая комбинирует скажем сто строк в одну

    Насчет других хранилищ я не уверен. Там же наверняка нужна будет выборка обновлений, по таймстампу.
    Но в целом с Редисом поэкспериментировать можно.
    Ответ написан
    1 комментарий
  • Почему не работает команда ping?

    fzfx
    @fzfx
    18,5 дм
    Серверу назначен IPv6 адрес, поэтому для тех доменных имён в интернете, для которых DNS-запрос, вызываемый пингом, возвращает AAAA-запись, происходит попытка пинга по IPv6-адресу. Но видимо чего-то для корректной работы IPv6 не хватает (не настроена маршрутизация / неверный IPv6-адрес сервера / ошибка конфигурирования IPv6 на стороне хостинга / что-то ещё), поэтому до целевого хоста пинг не доходит и вы получаете ответ о том, что адрес недоступен.
    "Как починить" зависит от того, какой вариант починки наиболее приемлим для вас. Варианты:
    - убрать со всех сетевых интерфейсов на сервере публичные IPv6-адреса, чтобы система стала IPv4-only, попытки пингов по IPv6-адресам должны будут прекратиться;
    - явно указать для утилиты ping использовать резолв только в IPv4-адреса, указав параметр -4 при вызове команды ping;
    - обратиться за помощью в настройке IPv6 к хостеру.
    Ответ написан
    Комментировать
  • Многопоточность в php?

    Alex_Wells
    @Alex_Wells
    PHP/Kotlin
    Лучше это: https://github.com/amphp/parallel

    Оно стабильней и лучше дебажится.

    Только что то, что другое - абсолютный кошмар, и если можно это не использовать - не используй.
    Ответ написан
    Комментировать
  • Многопоточность в php?

    @good_beginer
    Библиотека для PHP - Workerman. Создаёшь worker и даёш ему какое то задание. Она заточена под ТСП соединение тоесть из этого можно сделать всё что угодно. Как вариант... а так если речь идёт о многопоточности лучще смотреть в сторону других решений которые умеют работать с высокой нагрузкой. PHP для этого не подходит.
    Ответ написан
    1 комментарий
  • 404 для роутов или как настроить Nginx для подпапок?

    @dodo512
    location /sandbox/hello/ {
      try_files $uri $uri/ /sandbox/hello/index.php$is_args$args;
    }


    spoiler
    server {
      listen 80;
      listen [::]:80;
    
      root /var/www/example_com;
    
      index index.html index.php;
    
      server_name example.com;
    
      location / {
        try_files $uri $uri/ /index.php$is_args$args;
      }
    
      location /sandbox/hello/ {
        try_files $uri $uri/ /sandbox/hello/index.php$is_args$args;
      }
    
      location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
      }
    
      location ~ /\.ht {
        deny all;
      }
    }
    Ответ написан
    4 комментария
  • Как получить элемент в списке которого нет искомого значения?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    SELECT * FROM table 
      WHERE CONCAT(' ', list, ' ') NOT LIKE '% 111 %'
      ORDER BY id LIMIT 1

    Если использовать запятую, как разделитель, например, функция CONCAT_WS, то есть FIND_IN_SET.
    Ответ написан
    Комментировать
  • Как получить элемент в списке которого нет искомого значения?

    kocherman
    @kocherman
    Вам надо отделить list в отдельную таблицу.
    А условия в выборке ставить финциями агрегирования (погуглите SQL HAVING)
    infoblocks           showed             users
                                    
    id | value      info_id | user_id     id  | name 
    -----------     ------- | --------    --- | --------
    1  |  ...       111     | 333         111 | 333
    2  |  ...       333     | 222         333 | 
    3  |  ...       555     | 333         555 | 333
    4  |  ...       444     | 333         444 | 333
    5  |  ...       111     | 555         111 |
    Ответ написан
    Комментировать
  • Где можно поискать старые проекты?

    Adamos
    @Adamos
    Скачайте исходники Битрикса. Там копролиты десятилетней давности присутствуют до сих пор и, к сожалению, никак не закончат свой жизненный цикл.
    Ответ написан
    Комментировать
  • Где скачать старые версии chromedriver?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    смотришь матрицу

    chromedriver chrome
    2.46 71-73
    2.45 70-72
    2.44 69-71
    2.43 69-71
    2.42 68-70
    2.41 67-69
    2.40 66-68
    2.39 66-68
    2.38 65-67
    2.37 64-66
    2.36 63-65
    2.35 62-64
    2.34 61-63
    2.33 60-62
    ---------------------
    2.28 57+
    2.25 54+
    2.24 53+
    2.22 51+
    2.19 44+
    2.15 42+

    тебе нужен

    2.38 65-67

    2,38 находишь легко , например, тут
    https://chromedriver.storage.googleapis.com/index.html
    Ответ написан
    Комментировать
  • Как расположить блоки таким образом?

    Aetae
    @Aetae
    Тлен

    Можно кстати и обычной табличкой.)
    Ответ написан
    6 комментариев
  • Как правильно сделать поиск по названию?

    Может проблема в регистре букв? Попробуйте поиск без учёта регистра и если заработает, используйте решение из ответа
    https://stackoverflow.com/a/2876820
    Ответ написан
    7 комментариев
  • Как переписать эту функцию на PHP?

    TommyV888
    @TommyV888 Куратор тега PHP
    -
    function getColor(){ 
      return "hsl(" .  360 * ( rand() / getrandmax() ) . ',' .
                  (25 + 70 * ( rand() / getrandmax()) ) . '%,' .
                  (85 + 10 * ( rand() / getrandmax()) ) . '%)';
    }
    Ответ написан
    1 комментарий
  • Как переписать эту функцию на PHP?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    Встроенной функции нет, но можно использовать такой пример
    Ответ написан
    Комментировать
  • Почему PHP теряет популярность?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Никогда не ведитесь на уговоры разрабатывать какой то веб проект на каком то экзотичном языке, например Питоне или Яве, в результате вы получите костыльный долгострой и дефицит программистов которые будут готовы над ним работать.
    Это как в моде - есть всякое эпатажное дерьмо для показов на подиуме, а есть повседневные джинсы с рубашкой, все любят обсуждать эпатаж но носят джинсы.
    Ответ написан
    26 комментариев
  • Работают ли программы на Windows 10 когда компьютер заблокирован?

    Radjah
    @Radjah
    Работают. А куда они денутся? Службы в фоне выполняются. Окна на рабочем столе висят.
    Если удалённый доступ по RDP включен, можно даже по сети подключиться к заблокированной машине и продолжить работу.
    Ответ написан
    3 комментария
  • На какой зарубежной фриланс площадке можно быстро найти заказы?

    @Guccigang
    Без опыта и истории на фриланс площадках, будет крайне сложно быстро найти хоть какой-то заказ. Да и $300 за 5 дней - это уровень человека с опытом и прокаченным аккаунтом, у которого в загашнике всегда есть вариант подработать - вы явно в эту категорию не входите. Вот года через два работы на бирже, такие требования с вашей стороны по деньгам и срокам более достижимы.

    Попробуйте, лучше, потаксовать, если есть своя машина.
    Еще вариант кредит в банке. Если есть проблема с получением кредита, всегда можно воспользоваться услугами организаций микрокредитования. Вариант с ломбардом я так же не стал бы откладывать.
    Ответ написан
    5 комментариев
  • Почему php install composer не видит php?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Винда же, верно? Вам нужно добавить php в %PATH% ОС, чтобы можно было обращаться к нему по алиасу. Гуглите: windows add php to path
    Ответ написан
    Комментировать
  • Как на Python отправить email с mail.ru?

    @Tahir87
    Уже, я думаю, неактульно, но все же отвечу:
    заменить
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()

    на
    server = smtplib.SMTP_SSL('smtp.mail.ru', 465)
    Ответ написан
    2 комментария