Задать вопрос
  • Как на GO послать сообщение в Телеграм (канал, лично) проще всего?

    1. Создать телеграм-бота, через @BotFather
    2. Получить в процессе создания токен.
    3. Админ должен нажать start в личке с созданным ботом (иначе бот ему не сможет отправлять сообщения).
    4. Используя библиотеку https://github.com/go-telegram-bot-api/telegram-bot-api послать сообщение админу (нужно знать юзерайди админа).
    Ответ написан
    1 комментарий
  • Как с помощью JQUERY перебрать и сложить значение нескольких select?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Функция суммирования:

    function sum(data, key = n => n) {
      const getVal = key instanceof Function ? key : n => n[key];
      let result = 0;
    
      for (const n of data) {
        result += +getVal(n) || 0;
      }
    
      return result;
    }

    Элементы могут быть представлены как jquery-объект, NodeList или HTMLCollection (ну и разумеется, обычный массив, если что, тоже будет обсчитан как надо):

    const $form = $('form').on('change', 'select', () => {
      $('#result').val(sum($form.find('select'), n => $(n).val()));
    });

    const input = document.querySelector('#result');
    const selects = document.querySelectorAll('form select');
    const onChange = () => input.value = sum(selects, 'value');
    selects.forEach(n => n.addEventListener('change', onChange));

    document.querySelector('form').addEventListener('change', function(e) {
      if (e.target.tagName === 'SELECT') {
        document.getElementById('result').value = sum(
          this.getElementsByTagName('select'),
          n => n.selectedOptions[0].getAttribute('value')
        );
      }
    });

    document.forms[0].onchange = ({ target: t }) => {
      if (t.matches('select')) {
        t.form.result.value = sum(
          t.form.querySelectorAll('option:checked:not(:disabled)'),
          n => n.attributes.value.value
        );
      }
    };
    Ответ написан
    1 комментарий
  • Можно ли использовать переменную типа string, как название функции и потом вызвать ее?

    Нет, так сделать нельзя, Го не скриптовый язык.

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

    https://go.dev/play/p/dkF1s6ENnjA
    func main() {
    	fn := some
    	fmt.Println(fn())
    	fn = other
    	fmt.Println(fn())
    }
    
    func some() int {
    	return 1
    }
    
    func other() int {
    	return 2
    }
    Ответ написан
    Комментировать
  • Как сделать автоматическое заполнение форм на сайте через скрипт Golang?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Можно использовать встроенную функцию, так будет надёжнее:
    formData := url.Values{}
    formData.Set("user_forms[0][name]", authDate.fName)
    ...
    resp, err := http.PostForm(postUrl, formData)


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

    Для решения такой задачи будет лучше использовать какой нибудь web scraping framework.

    Например:
    https://github.com/gocolly/colly
    https://github.com/anaskhan96/soup
    Ответ написан
    2 комментария
  • Зачем нужны интерфейсы в go?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    В вашем примере не хватает самого важного, чтобы стало понятно - вызова функции с параметром типа интерфейс.
    func someFunc(numbers NumberInterface) {
       numbers.Sum()
    }


    Если не будет интерфейсов - вы можете передать только конкретный тип Numbers.
    А если вы создадите тип Numbers2 - то вы не сможете передать его в туже функцию, у которой тип аргумента Numbers.
    Эта проблема отлично решается при помощи интерфейсов.
    Ответ написан
    4 комментария
  • Зачем нужны интерфейсы в go?

    Интерфейсы нужны для полиморфизма.
    Конкретно в твоём случае да - разницы нет.
    Но чисто в теории ты бы мог сделать вот так:
    type Numbers struct {
      Num1 int
      Num2 int
    }
    
    type ThreeNumbers struct {
      Num1 int
      Num2 int
      Num3 int
    }
    
    func (n Numbers) Sum() int {
      return n.Num1 + n.Num2
    }
    
    func (n ThreeNumbers) Sum() int {
      return n.Num1 + n.Num2 + n.Num3
    }
    
    func SumAll(numbers NumberInterface) int {
      return numbers.Sum()
    }

    Функция SumAll будет работать с любыми типами, которые реализуют интерфейс NumberInterface, причём даже если они сами об этом не в курсе, благодаря утиной типизации.
    Ответ написан
    3 комментария
  • Как заставить скрипт в Linux испольняться просто набрав его имя в терминале?

    @AVKor
    1. Добавить в самое начало скрипта шебанг: #!/usr/bin/env bash
    2. Дать права на выполнение: chmod +x /path/to/run.sh
    3. Поместить в файл ~/.bash_aliases строку alias run='/path/to/run.sh'
    Ответ написан
    3 комментария
  • С чего начать в 30 лет?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Фундаментальная проблема - в игрострой стоит очередь фанатов с горящими глазами. Людей, которые пишут игры, играют в игры, моддят игры, хакают игры..., начиная с возраста, когда они смогли дотянуться до клавиатуры (как ваш покорный слуга). При этом, у них столько мотивации, что они могут сами поставить себе задачу, сами нагуглить все, что нужно (Спасибо дяде Немнюгину за его учебник. Это все что нужно знать о DOS, чтобы закодить dOOm) и сами все напишут и нарисуют (работая над этим сутками. Не потому что над душей стоит босс с воплями о лишении премии, а потому что им это интересно).

    И вот теперь, Андрей, который уже устал хочет встать в очередь высоко мотивированных конкурентов и попросить себе оффер. Каковы его шансы на успех?

    В играх есть много специализаций программирования - хотите графику, придется учить одно (причем на 2d и 3d это одно будет разное), хотите игровую логику и скриптинг - это номер два, хотите системную часть и бэкенд - это будет третье.

    Для универсального развития, нужно начинать с простых фиговин вроде тетриса, арканоида, бильярда и прочего (в которых однако есть все столпы игростроя - графика + логика + системный движок, можно и добавить сеть, если подумать) и потом наращивать сложность - делать платформер или RTS.
    Ответ написан
    4 комментария
  • Дискретное преобразование Фурье для WAV файла. Как огрубить результат?

    gbg
    @gbg
    Любые ответы на любые вопросы
    1) нет, понимаете неправильно. То что получилось - это комплексное число (в википедию, если не ясно), в котором спрятаны амплитуда и фаза самой низкой частоты в преобразовании. Дальнейшие элементы массива - это тоже комплексные числа с амплитудами-фазами.

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

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

    2) А тут надо почитать базовые учебники по ML. Нишант Шакла, написал хороший, например.
    Ответ написан
    1 комментарий
  • Почему не работает sticky?

    Не знаю почему, но методом исключения заметил, что это свойство не работает из-за наличия следующего правила
    html, body {
        overflow-x: hidden;
    }

    P.S. Если задать его не обоим тегам сразу (HTML и body), а только одному (например, только body), то блок с position:sticky работает корректно
    5d8600e7e43c1399885343.png

    Результат, если это правило закомментировать (всё работает)
    https://codepen.io/hisbvdis/pen/BaBvKaa
    Ответ написан
    2 комментария
  • Bash-скрипт: как заменить данную строку в файле на переменную?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В данном конкретном случае намного более адекватным было бы использовать include в nginx.conf отдельного конфига, который генерировать скриптом.
    Ответ написан
    Комментировать
  • Какие права выставить на файл sqlite базы?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Лучше не "ставить из пакета". Это лишает смысла проверку целостности пакета по контрольным суммам, усложняет установку обновлений. Поэтому правильнее иметь некую "эталонную" базу, которую копировать в целевое размещение. Как вариант, в пакете держать .sql (.sql.gz) для инициализации базы. Саму инициализацию делать скриптом (как initdb в postgres) или описать в инструкции что куда скопировать/выполнить. К слову, для процесса обновления тоже может потребоваться механизм, так как структура данных может меняться в новых версиях. Процесс первичной инициализации и последующего обновления можно сделать частью post-install скрипта пакета.

    Базу следует класть не в /usr (в классической теории UNIX-систем /usr может вообще монтироваться в read-only, например, по nfs), а в /var, лучше /var/lib/имя_программы. Сделать специальную системную группу без пользователей вполне нормально, так делают. В инструкции следует описать, что пользователей надо в неё добавлять. Соответственно, на файл права 660, на каталог 770.

    Если пользователи будут работать с этой базой параллельно-одновременно, а не строго по очереди, то потребуется ещё механизм блокировок. В этом случае лучше рассмотреть полноценную СУБД или хотя бы вынести работу с базой в отдельный сервис, с которым программа будет взаимодействовать.
    Ответ написан
    7 комментариев
  • Как отсортировать массив пар [ключ, значение]?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const sorted = (arr, key) => arr
      .map(n => [ key(n), n ])
      .sort(([a], [b]) => a < b ? -1 : +(a > b))
      .map(n => n[1]);

    Так как сортировка сбивается из-за наличия нечисловых символов в начале некоторых строк, просто вырежем их:

    const sortedArr = sorted(arr, n => n[0].replace(/^\D+/, ''));

    Если же значения могут быть не только двухзначными, то сравнивать их как строки уже нельзя. Делаем из них настоящие числа, считаем сумму; если второе слагаемое отсутствует, используем первое повторно:

    const sortedArr = sorted(arr, n => {
      const d = n[0].match(/\d+/g);
      return +d[0] + +d.at(-1);
    });
    Ответ написан
    Комментировать
  • Как исправить нечитаемое имя отправителя и получателя почтового сообщения?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    ?utf-8? - исходная строка была в кодировке UTF-8.
    ?B? - закодировано в Base64.
    0KnQtdC/0LAg0KHQзtdGA0LPQtdC5 - сама строка в Base64.
    print base64_decode('0KnQtdC/0LAg0KHQзtdGA0LPQtdC5'); // Щепа Сергей

    Кроме Base64 может встретиться кодировка Quoted-printable, обозначаемая как ?Q?. В этом случае заголовок будет выглядеть как
    ?utf-8?Q?=D0=A9=D0=B5=D0=BF=D0=B0 =D0=A1=D0=B5=D1=80=D0=B3=D0=B5=D0=B9?=

    Ну и кодировка исходной строки может быть любая. Для перекодирования можно использовать iconv().
    Ответ написан
    Комментировать
  • Нужно ли открывать файлы стилей в роботс?

    ThunderCat
    @ThunderCat
    {PHP, MySql, HTML, JS, CSS} developer
    Вот вопрос - есть ли в этом логика и насколько сильно влияет на SEO?
    Любой современный робот оценивает юзабилити, в частности скорость загрзки, контент лэйаут шифтинг, расположение ключевых элементов и т.д., что можно посмотреть в том же гугл пэйджспид. Ясное дело что без цсс и жс он этого просто не увидит. И да, гугл учитывает все это в ранжировании.
    Ответ написан
    Комментировать
  • Существуют ли компании, где нет перерывов в работе?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    В нормальных компаниях не следят с секундомером за работой сотрудников. Если от вас ждут нажимания кнопок 40 часов в неделю, а не выдачу запланированного объёма продуктов/решений, то надо бежать.
    Ответ написан
    1 комментарий
  • Существуют ли компании, где нет перерывов в работе?

    Natebash
    @Natebash
    React, Vue, Angular, Navite JS, Python / Node JS
    Похоже на описание концлагеря) Сейчас большинство айтишных компаний практикуют удаленную работу, тем самым снижая финансовую нагрузку(условие наличия большого офиса, снеков, и прочего). У адекватной компании - вы закрываете таски - вы молодец, когда вы их закрываете - ваше дело. У нас условие - 4 часа пересечения общего времени с командой. К примеру я встаю в 5, в 6 уже на работе, в 2 заканчиваю работать. Далее "свободное время"

    Ищите компанию где не будет такого идиотизма)
    Ответ написан
    1 комментарий
  • Как защитить вёрстку своего макета от "плагиата"?

    DevMan
    @DevMan
    никак. принять как данность.
    Ответ написан
    Комментировать
  • Как убрать все вендорные префиксы?

    SmthTo
    @SmthTo Куратор тега CSS
    Все перепёлки мира будут оплакивать мою смерть.
    Прогоните CSS через Autoprefixer с параметром:
    >100%

    Тем самым получите на выходе вот такой результат:
    5c2ec261e28bc331351044.jpeg
    Ответ написан
    1 комментарий
  • Какой тег использовать, что бы получить структуру?

    type Event struct {
        Preview     Image      `json:"preview"`
        Images      []string   `json:"images"`
    }


    Ну или если очень хотите отдельный тип, то:
    type Image string
    Ответ написан
    Комментировать