• Что делать, если контракт уже третий раз заморожен по вине заказчика?

    opium
    @opium
    Просто люблю качественно работать
    брать новый заказ, заказчику выложить ситуацию что так и так вина его, контракт заморожен, тебе надо дальше что то кушать и что у него второй приоритет будет, чтобы не удивлялся потом .
    Ответ написан
    1 комментарий
  • Что делать, если контракт уже третий раз заморожен по вине заказчика?

    @Stalinko
    PHP'шник и фрилансер до мозга костей
    Я считаю, следует ему сразу выложить всё как есть:
    "По правилам Upwork, я не могу вести работу по контрактам on hold. Пожалуйста активируй данный контракт, чтобы я мог продолжить. Если в ближайшие 2 дня контракт не будет активирован, то мне придётся переключиться на другой проект и приостановить все текущие работы до появления свободного времени."

    Специально закрывать проект я бы не советовал, т.к. большая вероятность получить недовольный отзыв. Гораздо лучше для вас, если он просто молча сольётся и проект останется незакрытым. В таких контрактах нет ничего страшного.
    Ответ написан
    2 комментария
  • Растянуть страницу на всю высоту?

    Seanyr
    @Seanyr
    Относительными единицами измерения. 1vh = 1% от высоты рабочей области (Viewport Height). 100vh = полная высота.
    Так же можно использовать внутри calc для более сложных вычислений, например
    height: calc(100vh - 50px);
    Ответ написан
    Комментировать
  • Почему не работает Workerman для wss соединения?

    @makenow
    В общем мучался-мучался, что я только не пробовал : )) В итоге всё оказалось очень просто: проблема в том, что сертификаты находятся "чертиде" /etc/letsencrypt/live/ и доступа к ним по сути у workerman нет, решение сделать линки на сертификаты и положить эти линки рядом со скриптом запуска.

    пример:
    sudo cp -l /etc/letsencrypt/live/my-domain.com/fullchain.pem /var/www/вашсайт/fullchain.pem

    sudo cp -l /etc/letsencrypt/live/my-domain.com/privkey.pem /var/www/вашсайт/privkey.pem

    и затем подключить

    $context = array(
      'ssl' => array(
        'local_cert'  => __DIR__.'/fullchain.pem',
        'local_pk'    => __DIR__.'/privkey.pem',
        'verify_peer' => false,
      )
    );
    
    // Create a Websocket server
    $ws_worker = new Worker("websocket://0.0.0.0:8084", $context);//0.0.0.0 - значит принимать соединения от любого ip
    $ws_worker->transport = 'ssl';


    и будет счастье :)
    Ответ написан
    2 комментария
  • Как настроить WSS для сайта, где https уже работает корректно?

    fzfx
    @fzfx
    18,5 дм
    пардон, но у вас для секции server, которая должна заниматься веб-сокетами, не задан server_name. оно, конечно, может и не важно было бы, если бы она нигде не была задана, да вот проблема: она задана в секции server ниже. и хоть для этой секции в свою очередь и не задан listen, но он зато задан вами глобально в самом конце, вне секций, что nginx'ом вроде бы даже и не поддерживается (если не ошибаюсь), но у вас в листинге конфига тем не менее присутствует. намешано у вас, я б сказал.
    вот, например, конфиг, который вполне работает у меня:
    server {
            listen 80;
            listen [::]:80;
    
            server_name semaf.example.com;
    
            return 301 https://$host$request_uri;
    }
    
    server {
            listen 443 ssl;
            listen [::]:443 ssl;
    
            server_name semaf.example.com;
    
            ssl_certificate /var/lib/dehydrated/certs/semaf.example.com/fullchain.pem;
            ssl_certificate_key /var/lib/dehydrated/certs/semaf.example.com/privkey.pem;
    
            location /.well-known/acme-challenge {
                    alias /var/www/.well-known/acme-challenge;
            }
    
    # сюда websocket'ы
            location ~ ^/ws/ {
                    proxy_pass                              http://localhost:3001;
                    proxy_http_version                      1.1;
                    proxy_set_header Upgrade                $http_upgrade;
                    proxy_set_header Connection             "upgrade";
                    proxy_read_timeout                      86400;
                    proxy_set_header Host                   $host;
                    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP              $remote_addr;
            }
    
    # сюда "обычный" http-трафик
            location / {
                    proxy_pass                              http://localhost:3001;
                    proxy_pass_header                       Server;
                    proxy_set_header Host                   $host;
                    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
                    proxy_set_header X-Real-IP              $remote_addr;
            }
    }


    websocket тут вынесен в отдельный URL scope, чтобы не перехватывать обращения пользователей на корневой УРЛ. проксируются и вебсокеты, и хттп в моём случае в одно и то же приложение, но это чисто моя специфика. лишние заголовки можете удалить.
    если будете править дальше свой конфиг - разберитесь с неоднозначностью по части того, в какую из server попадает ваш трафик, идущий по websocket. сдаётся мне, что сейчас - не в ту.
    Ответ написан
    5 комментариев
  • Как настроить Workerman для wss соединения?

    @YourQuestion Автор вопроса
    Проблему решил так:
    $context = array(
        'ssl' => array(
            'local_cert'  => 'ssl/server.crt',
            'local_pk'    => 'ssl/server.key',
            'verify_peer' => false,
        )
    );
    
    // Create a Websocket server with ssl context.
    $ws_worker = new Worker("websocket://domain.com:2346", $context);


    1. В директории со скриптом запуска сервера websocket (start.php) создал папку ssl где создал линки server.crt и server.key к реальным файлам сертификата и прописал путь к ним без __DIR__, через __DIR__ почему-то не работало.
    2. В строке js
    $ws_worker = new Worker("websocket://domain.com:2346", $context);
    прописал доменное имя вместо ip.
    Ответ написан
    Комментировать
  • Как правильно передать объект event?

    Seasle
    @Seasle Куратор тега JavaScript
    Просто
    size.addEventListener('change', priceRequestHundler);

    А Вы вызываете функцию. Если бы это была функция высшего порядка, сработало бы. Но была бы ошибка на e, т. к. в тот момент переменная еще не определена. А еще async/await не используют с then.
    Ответ написан
    1 комментарий
  • Разработчик недисциплинированно трекает время. Что делать?

    php666
    @php666
    PHP-макака
    Упаси бог работать в столь токсичной среде.
    Сидеть и отчитываться за каждую минуту/час.
    Идеальный информационный концлагерь.
    Ответ написан
    7 комментариев
  • Разработчик недисциплинированно трекает время. Что делать?

    Xuxicheta
    @Xuxicheta
    инженер
    Не выносить мозги разработчику своим трекингом и дать ему спокойно работать.
    Не справляется - увольняйте.
    Ответ написан
    9 комментариев
  • По какой причине ломается верстка?

    ArsenyMatytsyn
    @ArsenyMatytsyn Куратор тега JavaScript
    Руководитель frontend направления, предприниматель
    Есть такой восхитительный инструмент. Называется панель отладки\дебаггер и в большинстве браузеров вызывается с помощью F12. Именно он тебе и поможет, а так это будет попытка сыграть в вангу.

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

    0xD34F
    @0xD34F Куратор тега Vue.js
    data: () => ({
      items: Array.from(
        { length: 5 },
        (_, i) => Array.from(
          { length: 5 },
          (_, j) => i * 5 + j
        )
      ),
      active: null,
    }),
    watch: {
      active(val) {
        if (val) {
          this.$nextTick(() => this.$refs.input[0].focus());
        }
      },
    },

    <table>
      <tr v-for="(row, iRow) in items">
        <td v-for="(val, iCol) in row" @click="active = { iRow, iCol }">
          <input
            v-if="active && active.iRow === iRow && active.iCol === iCol"
            v-model="row[iCol]"
            @keypress.enter="active = null"
            ref="input"
          >
          <template v-else>{{ val }}</template>
        </td>
      </tr>
    </table>

    https://jsfiddle.net/grtsxoaf/
    Ответ написан
    Комментировать
  • Как при нажатии на кнопку перейти к следующему id?

    Keanor
    @Keanor
    Ведущий разработчик
    В первую очередь прочитать про SQL Injection, если вы этот сайт опубликуете то кто угодно вам все что угодно с вашей БД сможет сделать.

    Получить идентификаторы предыдущих и следующих записей нужно отдельными запросами.

    Для получения следующей записи запрос вида:
    SELECT * FROM projects WHERE id > " . $post_id . " ORDER BY id ASC LIMIT 1";


    Для получения предыдущей записи запрос вида:
    SELECT * FROM projects WHERE id < " . $post_id . " ORDER BY id DESC LIMIT 1";
    Ответ написан
    2 комментария
  • На чем писать кроссплатформенные десктопные приложения чтобы не было мучительно больно?

    @TAZAQ
    Выскажу непопулярное мнение - Delphi 10.3.*, под винду, мак, линь можно, вряд ли что-то проще есть, если для себя, то сами знаете что делать и с какого рутрекера брать (под линь, к сожалению, пока в Community нельзя, нужен Enterprise или Architect)
    Ответ написан
    2 комментария
  • На чем писать кроссплатформенные десктопные приложения чтобы не было мучительно больно?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    80% сидят на windows
    15% на маках
    5% процентов красноглазят

    Исходя из этого выбирайте размер аудитории и целесообразность заморочек. Сборка сетапа на WIX даст вам 50кб + ваша программа на C#
    C учетом того что Net Framework уже стоит у пользователей windows. Делайте выводы.

    PS кросплатформенность для десктопа это та шутка которая смешная еще с 2002 года.

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

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

    > Electron. Главный недостаток - считается аццкой машиной, которая будет тормозить на любом железе.
    В том и дело, что только считается. Если нормально готовить и не возлагать на него непосильные задачи, то всё будет ок.
    > С# - давным давно имел с ним дело. Недостатки - условно кроссплатформенный, возможно, сложнее двух предыдущих.
    Вполне кроссплатформенный, но с кроссплатформенным gui имеются некоторые проблемы. Из наиболее адекватного есть Avalonia, которая похожа на WPF, но чуть удобнее.
    Ещё как вариант есть Java с её JavaFX и swing, но это на любителя.
    Больше я более-менее рабочих кроссплатформенных вариантов не знаю. Вывод делать не буду, тк опыта с кроссплатформенным десктопом у меня нет
    Ответ написан
    1 комментарий
  • Переносимость Python?

    el777
    @el777
    Есть куча разных инструментов, чтобы можно было решить эту задачу. К сожалению, все неидеальны. Простое приложение собирают нормально, как более сложная вещь - так приходится попотеть.
    Статья как собирал Python 3 + PyQt5 - https://habrahabr.ru/post/264233/
    Получилось нормальное кросплатформенное приложение, писалось на маке, нормально работает на винде. Очень просто для пользователя - запускаешь 1 файл, он сам распаковывается во временную папку и работает. Можно сделать инсталлер, чтобы он установился в систему и запускался как обычная программа. Но это было не нужно.
    Ответ написан
    Комментировать
  • Как правильно работать с backend на PHP используя Vue?

    @dmx00
    Добавлю что если Вам не нужна авторизация через соц. сети не используйте токены (ни в каком виде OAuth jwt и т.п.) Пользуйтесь сессиями, да-да Обычными встроенными сессиями, единственная сложность в Laravel это что нужно получить csrf (для этого нужно внести один путь в исключения мидлвари) , если нет авторизации то и этой проблемы нет.

    Если хочется по модному то есть Laravel Airlock, где все сделано и документация написана, хотя лично я считаю что если сессии подходят (spa на том же домене что и бэк) то в пакете нет необходимости.

    Любые токены более, либо также опасны как сессии, а также более сложны в работе. При выборе токенов надо точно понимать зачем тебе это.
    Ответ написан
    Комментировать
  • Как работать с типом данных?

    Eridani
    @Eridani
    Мимо проходил
    $result_array = json_decode($result, true)

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

    i__dmitry
    @i__dmitry
    Weaving a web
    Возможно, конечно. Написать скрипт, который будет выбирать все задачи, срок которых истекает сегодня, и проставлять им новый статус. Скрипт запускать при помощи крона раз в сутки, например.
    Ответ написан
    7 комментариев