• Должен ли программист выполнять роль девопса на сервере заказчика?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В реальности фриланса, вы являетесь и бизнес аналитиком и проджект менеджером и тимлидом и девопсом и бухгалтером и много много других вещей.
    Клиенту же нужен "продукт". То есть в большинстве случаев клиент подразумевает что вы настроите и запустите все.

    Так что настройте и на будущее при переговорах это обсуждайте, и вопросы примерно следующие:

    * Формат поставки
    * Операционная система
    * Доступы
    * Права на исходный код
    * Порядок приемки кода
    * Прочее

    То есть чем более точно вы все опишите в ТЗ и договоре, тем меньше у вас будет проблем
    Ответ написан
    3 комментария
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Нужно поставлять свои решения с развертыванием в докере. Компоуз файл ему отдаете и говорите. что дальше не ваша забота. Может он на QNX каком-нибудь или OS/2 решил бы все завести. Это его проблемы.
    Ну а то, что вы не согласовали заранее требования к платформе и окружению, не оговорили в каком виже будет поставка и какие вы готовы обеспечить работы по развертыванию - это теперь ваши обоюдные роблемы.
    Если вы уже отдали ему исходники, то он может попытаться свалить с ними под предлогом, что вы ничего не развернули на его железе.
    То. что не оговорено в договоре, будет геморроем. Ну а там уж только меряться кому геморрой длиннее покажется.
    Ответ написан
    Комментировать
  • Должен ли программист выполнять роль девопса на сервере заказчика?

    @vitaly_il1
    DevOps Consulting
    По-моему, ответ простой - что было записано в договоре, то и обязан.
    Т.е. если речь шла о коде - то только код. Если договаривались о "запустить на сервере" - то надо ставить на сервер. Но вот о том, что для вебсервера используют Мак, я еще не слышал :-)
    Ответ написан
    11 комментариев
  • Как сделать плавающую кнопку без срипта?

    delphinpro
    @delphinpro Куратор тега CSS
    frontend developer
    Делается элементарно.
    Фиксированно позиционированная кнопка. По клику выезжают еще кнопки, абсолютно позиционированные.
    Скриптов - пара строк.
    Функциональных стилей - с десяток строк.
    Плюс оформление.
    Ответ написан
    4 комментария
  • Как выставить шанс функции Math.random?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    const phones = [
      { p: '9171857450', c: 1 },
      { p: '9880735438', c: 10 },
      { p: '9880735439', c: 100 },
      { p: '9880735779', c: 2 },
      { p: '9170997305', c: 2 },
      { p: '9170997493', c: 2 },
      { p: '9880634879', c: 5 },
      { p: '9170996154', c: 1 },
      { p: '9880728447', c: 1 },
    ];
    const chancesTotal = phones.reduce((acc, { c }) => acc + c, 0);
    const selected = Math.floor(Math.random() * chancesTotal);
    let phone;
    for (let i = 0, sum = 0; i < phones.length; i++) {
      sum += phones[i].c;
      if (selected < sum) {
        phone = phones[i].p;
        break;
      }
    }
    const randomUrl = `https://wa.me/${phone}?text=Привет!%20Пришлите%20мне%20цены%20на%20рыбку!`;
    Ответ написан
    5 комментариев
  • Какой стек использовать для разработки SPA?

    @rPman
    Для обучения нужно работать с минимумом фрейморков в идеале вообще без них, буквально
    Чтобы было понимание 'как это работает на самом деле'

    Без этого понимания любой фреймворк для тебя будет черным ящиком, и любые даже минимальные проблемы решить самостоятельно не сможешь!
    Ответ написан
    3 комментария
  • Как сгенировать массив из времени с интервалом?

    Удобно работать с объектами Date.
    const makeDate = HHMM => {
      const [H, M] = HHMM.split(':').map(Number);
      const D = new Date();
      D.setHours(H);
      D.setMinutes(M);
      D.setSeconds(0);
      return D;
    };
    
    const oo = n => n.toString().padStart(2, '0'); // 5 => '05'
    
    const fillTime = (startHHMM, finishHHMM, intervalMinutes) => {
      let startDate = makeDate(startHHMM);
      let finishDate = makeDate(finishHHMM);
      if (startDate > finishDate) { // объекты Date можно так сравнивать
        [startDate, finishDate] = [finishDate, startDate]; // поменять местами
      }
    
      const dates = [];
      const D = new Date(startDate);
      while (D <= finishDate) {
        dates.push(new Date(D));
        D.setMinutes(D.getMinutes() + intervalMinutes);
      }
    
      return dates.map(D => [D.getHours(), D.getMinutes()].map(oo).join(':'));
    };
    
    console.log(fillTime('15:56', '18:15', 17));
    // [ "15:56", "16:13", "16:30", "16:47", "17:04", "17:21", "17:38", "17:55", "18:12" ]
    Ответ написан
    1 комментарий
  • Как объединить объекты, у которых совпадает значение определённого свойства, суммируя другие свойства?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const groupSum = (arr, idKey, ...sumKeys) =>
      Object.values(arr.reduce((acc, n) => (
        acc[n[idKey]] ??= sumKeys.reduce((group, k) => (group[k] = 0, group), { ...n }),
        sumKeys.forEach(k => acc[n[idKey]][k] += n[k]),
        acc
      ), {}));
    
    
    const result = groupSum(arr, 'product', 'price', 'selling_price', 'quantity');
    Ответ написан
    2 комментария
  • Почему так популярны телеграм боты?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Ботов писать относительно просто, порог вхождения минимальный по сравнению с программированием под iOS и андроид, да и проще написания десктопных приложений с GUI, а в использовании боты проще, чем утилиты командной строки.
    Зато в результате может получиться довольно функцинальная штука. Легко настроить многоэтапную диалоговую коммуникацию с пользователем, получить для обработки изображения и фото, возвращать ссылки на скачивание результатов.

    Так вооот! Из-за этого невысокого порога вхождения развелось куча "курсов" программирования для чайников, которые первым упражнением, полезность которого удается легко показать ученикам, выбирают написание бота.
    И так у этих коуч-питонистов легко всё получается (ещё бы, надо де продать курс с первого бесплатного занятия), что у незадачливых школьников появляется неиллюзорная вера в себя и они бегут повторять увиденное на ютубе, а потом, когда, конечно же, то-то идёт не так как показано в видосе, они бегут сюда спрашивать как всё надо сделать, чтобы работало.

    В общем все хотят всё и сразу, и чтоб легко, бесплано и не надо было учиться.
    Ответ написан
    Комментировать
  • Как написать функцию, которая возвращает массив индексов элементов, у которые значение равно value?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    возвращает массив индексов элементов, у которые значение равно value.

    const findIndex = (arr, value) => arr
      .map((v, i) => ({ v, i }))
      .filter(({ v }) => v === value)
      .map(({ i }) => i);
    Каждый элемент массива переделать в объект, где v: элемент, а i: индекс в массиве.
    Затем отфильтровать, оставив только те, где бывш.элемент === value
    В конце вернуть вместо каждого оставшегося элемента только его индекс i
    Ответ написан
    2 комментария
  • Как заставить JS нормально работать с кодировкой?

    Seasle
    @Seasle Куратор тега JavaScript
    const textDecoder = new TextDecoder('windows-1251');
    const response = await fetch(...);
    const buffer = await response.arrayBuffer();
    const text = textDecoder.decode(buffer);
    Ответ написан
    2 комментария
  • Как PHP получить получить JSON из JAVASCRIPT?

    @zkrvndm
    Софт для автоматизации
    Вообще все неправильно делаешь.

    Отправляешь данные из браузера на сервер вот так:
    (async function() {
        var result = await $.post('api/index.php', { raz: 'Привет, мир!' } );
        console.log('Ответ сервера:', result);
    })();

    Открой консоль CTRL + Shift + J, чтобы посмотреть ответ выведенный через console.log

    На сервере все что ты отправил будет лежать внутри суперглобального массива $_POST

    Можешь записать его в файл и посмотреть, что было внутри:
    <?php
    
    header('Content-Type: text/plain; charset=UTF-8');
    
    $json = json_encode($_POST, JSON_UNESCAPED_UNICODE);
    
    file_put_contents('POST.json', $json);
    
    echo 'Данные получены и записаны в файл POST.json -> смотри его.';
    Ответ написан
    Комментировать
  • Как определить положение текста с помощью JS?

    Seasle
    @Seasle Куратор тега CSS
    Можно посчитать насколько блок Б (.hint) пересекается с блоком А (основным текстом), и после, с использованием полученного и порогового (задаёте сами), можно решить, что делать с блоком.
    const clamp = (min, max, value) => Math.max(min, Math.min(max, value));
    
    const calculateIntersection = (a, b) => {
        const aRect = a.getBoundingClientRect();
        const bRect = b.getBoundingClientRect();
        const top = clamp(aRect.top, aRect.bottom, bRect.top);
        const right = clamp(aRect.left, aRect.right, bRect.right);
        const bottom = clamp(aRect.top, aRect.bottom, bRect.bottom);
        const left = clamp(aRect.left, aRect.right, bRect.left);
        const width = right - left;
        const height = bottom - top;
    
        const totalArea = bRect.width * bRect.height;
        const intersectionArea = width * height;
        const intersectionRatio = intersectionArea / totalArea;
    
        return intersectionRatio;
    };


    Ответ написан
    Комментировать
  • Как правильно находить готовые коды, плагины на разных языках?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    Мда. С такой грамотностью далеко не уйдёшь... ПредпрИниматель...
    Я дам простой ответ - предприниматель сам должен уметь находить ответы на вопросы, которые ты здесь задаёшь.
    Ты занимаешься не своей работой."Куски кода искать" должен не руководитель, а разработчик, это его работа и его профессия, за это ты платишь ему деньги
    Ответ написан
    5 комментариев
  • Как правильно находить готовые коды, плагины на разных языках?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Люди всё правильно говорят. Это не тот вопрос, которым следует заниматься способному в лучшем случае к NoCode управленцу. Так-то найти куски кода, который делает что-то, не так сложно. По ключевым словам легко найти практически что угодно на гихабе, хабре, stackoverflow, куче форумов, в документации к конкретным языкам и библиотекам. Сейчас ещё и расплодились агрегаторы кода, которые по ключевым словам выдёргивают фрагменты кода из кучи опенсурсных проектов, иногда бывают полезны, но чаще раздражают....

    Но даже если найти кусок кода или название библиотеки (на что уйдёт пять минут) - а что дальше? Чтобы понять, что делает этот кусок кода, какие у него достоинства и недостатки, какие ограничения - это нужна уже компетенция квалифицированного программиста. А вдруг этот код или эта библиотека жалко помрёт, если вместо скромных 100 байт из тестового набора скормить мегабайт осмысленных данных?

    Программист намного более эффективно проведёт отбор вариантов (сразу выкинув лишь кажущиеся перспективными, но совершенно бестолковые варианты, делающие не то, что надо, или не так, как это разумно), а затем более квалицифированно разберёт всё, что осталось. Конечно, можно ему сказать "я тут видел XXX и YYY, которые кажутся интересными" (и это не запрещено - почему бы и не сказать?), но программист всё равно сделает этот же поиск с нуля ещё раз и выберет ZZZ, который управленец выкинул при отборе, потому что ошибочно посчитал, что он тут не годится.

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

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Одинаковая структура при разных реализациях - это больно и малореально. Существуют css\html-only дизайн системы, которые можно брать и реализовывать на любом фреймворке, но это тот ещё геморрой без особого выхлопа.

    Мне кажется вам стоит решить чего вы будете-придерживаться впредь, а что легаси, и вынести таки все компоненты одной актуальной версии(vue2 или vue3) в библиотеку, скомпилировав её в режиме web-components. Веб компоненты вы сможете подключать куда угодно, ценой лишних 100кб на непрофильный vue-runtime в случае несовпадения.
    Ответ написан
    1 комментарий
  • HTML, помощь новокеку?

    delphinpro
    @delphinpro Куратор тега HTML
    frontend developer
    нужно создать форму

    <form action="receive_data.php" method="post">
      <input name="username">
      <button type="submit">Send</button>
    </form>


    В файле receive_data.php, получить переданные данные и, например, отправить их вам на почту.
    А потом сделать редирект на другую страницу.

    <?php
    
    $name = $_POST['username'];
    $to      = 'nobody@example.com';
    $subject = 'the subject';
    $message = 'hello '.$name;
    $headers = 'From: webmaster@example.com';
    mail($to, $subject, $message, $headers);
    
    header('Location: /other_page.php');
    Ответ написан
    Комментировать
  • Как убрать границу лесенкой?

    @pvshvb Автор вопроса
    Нашёл решение
    outline: 1px solid transparent;
    Ответ написан
    Комментировать
  • Как сделать такую кнопку?

    Fragster
    @Fragster
    помогло? отметь решением!
    button {
      height: 64px;
      width: 256px;
      border-top-left-radius: 5px 50%;
      border-top-right-radius: 5px 50%;
      border-bottom-left-radius: 5px 50%;
      border-bottom-right-radius: 5px 50%;
      border: none;
    }
    Ответ написан
    Комментировать
  • Как получить первый и последний индексы элемента в отсортированном массиве за логарифмическую сложность?

    0xD34F
    @0xD34F
    Два раза поиск делайте, отдельно для первого и последнего индексов:

    function search(nums, target, searchMin) {
      for (let iMin = 0, iMax = nums.length - 1; iMin <= iMax; ) {
        const index = (iMin + iMax) / 2 | 0;
        const num = nums[index];
    
        if (num === target && num !== nums[index + (searchMin ? -1 : 1)]) {
          return index;
        } else if (num <= target - (searchMin ? 1 : 0)) {
          iMin = index + 1;
        } else {
          iMax = index - 1;
        }
      }
    
      return -1;
    }
    
    function searchMinMax(nums, target) {
      const iMin = search(nums, target, true);
      return iMin === -1
        ? []
        : [ iMin, search(nums, target, false) ];
    }
    Ответ написан
    Комментировать