• Джун QA - это про потенциал и обучаемость, или - когда нужен Мидл с низким окладом?

    saboteur_kiev
    @saboteur_kiev Куратор тега IT-образование
    software engineer
    Вы должны понимать, что дело сейчас не в джуниор/мидл первая работа.
    Это вообще вход в профессию. Ваши вопросы по большей степени вообще не относятся к работе, а к какой-то виртуальной реальности.

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

    Насколько быстро найти первую работу - СУГУБО индивидуально. Кто-то с первого раза, кто-то за 2 года не может. Нет никаких сроков, есть рекомендации что учить и как готовиться.

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

    Оформляют на работу по разному, что оф. оформление, что самозанятость - дело не в этом, а в том, что за компания, и преференции у них могут быть разные
    Пенсия вас реально интересует прямо сейчас? Или вы считаете что от того, что вас сейчас оформят официально, у вас как-то изменится пенсия?
    Стаж у ИП также само идет, вы работаете на себя, платите пенсионный. За свою жизнь еще успеете поработать в разных вариантах, с разной зарплатой. Это вообще неважный вопрос.

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

    Менторство это не обучение, а кураторство, чтобы было у кого спросить куда копать.
    Недостаток по теории это не незнание теории а недостаток в конкретной области.
    Думающие - это знающие ребята, у которых уже поставлена "база", и думающему подсказать гораздо проще, чем неумехе, который еще и не знает ничего.

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

    Простите, но вы перечислили настолько базовые вещи...
    SQL базовый это маст хев
    топология сетей - ну это же блин база
    DNS кешируется - ну просто все
    веб и бэкенд мало чем отличается в 90% современных приложениях

    Ну то есть как-то ощущение, что вы хотите не на джуна, а в первый класс.

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

    Вы бы пошли делать простую хирургическую операцию, типа удаление аппендикса к такому специалисту, как вы в ИТ? Если нет, то думайте.
    Разница между хирургом и ИТ в первую очередь заключается в том, что практика и знания ИТ реально получить дома, сидя у монитора, без общения с реальными пациентами и наработки практики в моргах. Но сами знания все равно должны быть.
    Ответ написан
    Комментировать
  • Надо ли скачивать SQL, если моя программа работает с ним?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Да, нужно будет устанавливать и настраивать SQL сервер. Да, можно автоматизировать - пишется скрипт, конфигурация и/или приложение делающее нужное. Если приложение десктопное - можно взять что-то типа SQLite, например. Если приложение предназначено для использования одним пользователем в один момент времени - то проще всего хранить все данные в простом файле (json, yml, xml и т.п.), БД тут не нужна. БД имеет смысл применять когда у вас многопользовательское приложение - чат, сетевая игра, форум и прочее.
    Ответ написан
    1 комментарий
  • Как сделать аутентификацию на сайте через телеграм?

    CoDeR2006
    @CoDeR2006 Автор вопроса
    TS
    И так, для меня в будущем, и для тех кто это нагуглил:

    Дело в том что без виджета на начало 2024 сделать авторизацию практический не возможно, вот реально правильное решение если у вас похожий стэк, и вы планируете делегировать саму регистрацию на сервер, а не делать все через front.

    Интегрируем виджет в приложение react + ts:
    (это если вам надо что бы был не редирект, а вызов функции со стороны telegram)
    import { useEffect } from 'react'
    import { ITelegramUser } from '../../../../types/telegram/api-telegram-user.ts'
    
    declare global {
      interface Window {
        onTelegramAuth: (user: ITelegramUser) => void
      }
    }
    
    export const ButtonTelegramAuth = () => {
      useEffect(() => {
        const button = document.createElement('script')
        button.async = true
        button.src = 'https://telegram.org/js/telegram-widget.js?22'
        button.setAttribute('data-telegram-login', 'name_bot')
        button.setAttribute('data-size', 'large')
        button.setAttribute('data-radius', '20')
        button.setAttribute('data-onauth', 'onTelegramAuth')
    
        document.body.appendChild(button)
    
        window.onTelegramAuth = function (user) {
          alert(
            'Logged in as ' +
              user.first_name +
              ' ' +
              user.last_name +
              ' (' +
              user.id +
              (user.username ? ', @' + user.username : '') +
              ')'
          )
        }
    
        return () => {
          document.body.removeChild(button)
        }
      }, [])
    
      return <div id="telegram-widget-container"></div>
    }


    если нужен все таки редирект мы добавляем такое поле:
    script.setAttribute('data-auth-url', 'https://site.pw');

    и удаляем это:
    button.setAttribute('data-onauth', 'onTelegramAuth')
    
    declare global {
      interface Window {
        onTelegramAuth: (user: ITelegramUser) => void
      }
    }
    
     window.onTelegramAuth = function (user) {
          alert(
            'Logged in as ' +
              user.first_name +
              ' ' +
              user.last_name +
              ' (' +
              user.id +
              (user.username ? ', @' + user.username : '') +
              ')'
          )
        }


    И так объясняю в чем задумка:
    В ваше приложение react интегрируется все тот же виджет, но правильным образом. После нажатия на виджет происходит авторизация пользователя (он вводит свои данные / просто нажимает войти). Потом телеграм передает все его данные вам (в функцию - №1 способ / по get параметрам в url). Если вы делегируете
    регистрацию на сервер (а так правильно) то выбираете 2 способ. Сервер получает данные валидирует их и заносит в БД, затем делает редирект вашего пользователя к вам обратно на front, и заносит token (или что там еще не разобрался) в HttpOnly Ckookie. Ну а далее в моем случае Guard будет проверять есть этот token или нет, годен он или нет.

    Передаю привет Максиму в будущем. Как дела Макс ?
    Ответ написан
    9 комментариев
  • Как разработчики пользуются Git в компаниях?

    @alexalexes
    В серьезных компаниях невозможно состояние гонки релизов, которую вы описали.
    Во-первых, информационная система используется не в одном экземпляре. Всегда есть как минимум продакшен экземпляр, предпродакшен и девелоп экземпляры системы. В предпродакшен и девелоп версии могут загружаться не только разные релизы кода, но и гонятся разный набор данных для отладки и тестирования.
    К этим экземплярам и набору данных имеют доступ разные работники, с разным уровнем допуска и ответственностью. Рядовой разработчик не будет иметь доступ в продакшен и предпродакшен, для него вышестоящий работник сформирует девелоп версию и подготовит нужный набор данных, который нужен именно для решения его рабочей задачи. Также рядовой разработчик не будет иметь полный доступ к действиям в репозитории, он может действовать только в рамках своей дев ветки, никто ему не даст прав сливать в мастер.
    Для каждой новой разработанной функции пишутся автоматические тесты, как минимум с одним тестом, что она включается, эти тесты пишет отдельный контингент работников.
    Прежде чем код попадет в продакшен, он будет просмотрен вышестоящим работником, его функционал будет протестирован сначала на тестовых данных, потом на боевых, с каждого теста будут сняты метрики не только по возникающим ошибкам, но и по производительности.
    Уже на основе всех этих данных и будет принято решение компетентным работником вливать ваш функционал в прод или нет. Вместе с этим будет принято решение на слияние в мастер в репозитории.
    Ответ написан
    Комментировать
  • Почему из-за одной буквы вызывается ошибка?

    @alexalexes
    F12 в браузере, далее вкладка "Сеть". Смотрите ответ на запрос /api/clients, там у вас что-то еще пришло помимо JSON.
    Ответ написан
    Комментировать
  • Что не так с функцией на C++?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    error C2835: user-defined conversion 'operator`double'' takes no formal parameters

    Он говорит тебе о том, что такая перегрузка: operator double (int limit) невозможна. Вторая ошибка -- это следствие первой.

    Определим в объекте Group две функции с одинаковым именем, например double Age(); и double Age(int limit);.

    Так бы и сделал, зачем оператор для этого перегружать?
    Ответ написан
    Комментировать
  • Как добавить метод и свойство массива для прототипа конструктора Array?

    MrDecoy
    @MrDecoy Куратор тега JavaScript
    Верставший фронтендер
    Array.prototype.last = function() { 
      return this[this.length-1] 
    }
    // [1,2,3].last()
    // 3

    Но модификация прототипа - плохая практика.

    метод и свойство массива

    Метод это и есть свойство. Просто это псевдоним, который говорит, что свойство хранит в себе функцию.

    Но если всё же нужно чтобы было без круглых скобок, то это через дескриптор get нужно объявлять.
    https://learn.javascript.ru/property-accessors
    Object.defineProperty(Array.prototype, 'last', {
      get: function() {
        return this[this.length-1] 
      },
      enumerable: false,
      configurable: false
    })
    
    // [1,2,3].last
    // 3
    Ответ написан
    4 комментария
  • Пишу первый раз на реакте, в чем проблема?

    Aetae
    @Aetae
    Тлен
    Вот это вот:
    root.render(
        <Header/>
    );

    Это магия под названием jsx. Она будет работать только если использовать специальные механизмы сборки, которые превратят сие непотребство в нормальный javascript.

    Если же ты хочешь просто вставить свой код на страницу без предвариательных танцев, то тебе придётся писать на чистом javascript, условно так:
    <script src="index.js" type="module"></script>
    import Header from './Header.js';
    
    const domContainer = document.querySelector('#container');
    const root = ReactDOM.createRoot(domContainer);
    root.render(
      React.createElement(Header)
    );

    function Header() { 
      return React.createElement('div', null, 'hsas')
    }
    export default Header;
    Ответ написан
    4 комментария
  • Возможно ли в конструктор класса добавить несколько массивов и как это сделать?

    @LJ322
    class Lorem {
            constructor(ipsum, isnit) {
              
            }
          }

    В твоём примере будет ошибка, аргумент с троеточием это rest params
    Ответ написан
    Комментировать
  • Попросили проверить код, на что смотреть нужно?

    apavlyut
    @apavlyut
    www.apavlyut.ru
    Все комментаторы совершили одни и те же ошибки управления потому что, при всем уважении, скорее всего за эти ошибки (в стратегировании) они не платят из своего кармана.

    На пальцах отвечаю на ваш вопрос:

    1) По структуре - при проверки качества кода / решения / задачи / продукта / настройки сервера и так далее нужно проходить по списку (чеклист) критериев контроля качества - обычно они выглядят как списки определенных параметров которые может замерить третье лицо или сама система - формат проверяемого параметра прямо вот соответсвует / не соответсвует. На сколько процентов пройден чеклист - на столько процентов результат "качественный"
    2) Почему ребята ошиблись - потому что стали приводить конкретные списки. Дело в том что у каждого проекта / сиутации / команды / набора компетенций - свои наборы таких чеклистов на разные ситуации. В больших командах сущесвтует основной чеклист который регламентирует CodeReview - и за него отвечает как правило тим лид - он его обновляет, развивает, обосновывает внесенные правила и следит за тем чтобы ПЕРЕД началом разработки все разработчики были ЗАРАНЕЕ ОЗНАКОМЛЕНЫ с этим порятком проверки качества, а все потому что:
    3) Количество стайлгайдов и критериев в приципе существует огромное количество - и то как каждому в одной части света / компании удобно делать одно дело - не регламентирует ни разу что именно так же другому человеку в другой ситуации применять эти правила к своему контексту. В виде открытых стайлгайдов они существуют для накопления практик и навыков в первую очередь для их же развития (процесс формулировки наводит порядок в голове) а также дают возможность "на них конкретно" нанизать точечные ответы огромного сообщества людей, и получить те самые разные взгляды на ситуации, и по возможности опять же привести к общему знаменателю. Но это все мелочи жизни, а в вашем случае вы совершите серьезную ошибку если прямо сейчас возьметесь (примите на себя ответственность) проверять чужой код на предмет оценки, потому что:
    4) Вас явно используют как внешнего эксперта на которого можно сослаться, от которого можно получить якобы аргументацию для давления на свою позицию при решении какой-то возникшей ситуации во взаимоотношениях клиент-разработчик на проекте куда вас приглашают за экспертизой.
    Если вы, не предупредив, о том что "качество кода" начинается с декларации этого качества (в случае если речь идет о проверке этого внутреннего качества в рамках сотрудничества, а не самих задач которые поставлены перед создаваемой системой - фичесов) - любая ваша оценка будет недостоверна контексту ее применения (вы напишете про строки или еще что-то - а у человека будут либо взыскивать деньги / либо недоплатят за работу / или инкапсулируют в договоренности пост фактум за те же деньги работу над соотвествием определенным стилям - это все работа которая должна быть оплачена). Поэтому вот вам вилка ваших дейсвтий:

    1) Если у вас просто просят менторства молодые коллеги - дайте им ссылку на гугл и ключевое словосочетание php style guide github
    2) Если вас спрашивают (либо вы сами являетесь таким заказчиком который ищет за что зацепиться в коде чтобы продавить свою позицию) - нет критериев качества кода ДО начала работ подписанных на бумаге / пересланных по почте - никакие критерии не могут быть применены к текущим отношениям - только к следующей итерации за следующие деньги.
    3) Если вы все же разработчик и вас попросили оценить код - донесите данную ситуацию до стадии корректного закрытия текущего этапа работ - но дальше предложите уже введение стайл гайда если оно того требует. Я полагаю что на самом деле нет. Дав сейчас ответ на вопрос в виде оценки качества кода вы сделаете только одно - абсолюно необоснованно дадите агрумент в явно перекошенном споре, и просто возьмете на себя еще один мешок кармогрязи которую будуете еще сколько-то положенного времени отрабатывать.

    Подумайте хорошо на эту тему - придется выбрать свою сторону.
    Ответ написан
    Комментировать
  • Как найти участки кода несовместимые с PHP 8.1 версии?

    pxz
    @pxz
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    Есть специальная тулза для этого — Rector.

    Позволяет выбрать целевую версию PHP и покажет в отчёте места, н совместимые или написанные в стиле старых версий. Также позволяет большинство участков кода отрефакторить автоматически.

    https://github.com/rectorphp/rector
    Ответ написан
    3 комментария
  • Как использовать провайдер контекста с отслеживанием состояния для фильтрации элементов?

    daniel_pr
    @daniel_pr
    Вы неправильно используете контекст.
    https://reactjs.org/docs/context.html

    Вы должны обернуть в провайдер те компоненты, которые будут использовать ваш контекст, то есть
    const Context = createContext();
    
    function ContextProvider({ children }) {
      const [active, setActive] = useState(false);
      return <Context.Provider value={{ active, setActive }} >{children}</Context.Provder>
    }
    
    function App() {
      return (
        <ContextProvider>
           <MyComponent />
        </ContextProvider>
      )
    }
    
    function MyComponent() {
      const { active, setActive } = useContext(Context);
      ...
    }
    Ответ написан
    1 комментарий
  • Как правильно взаимодействовать с каналами?

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

    Лучше сделать так
    package main
    
    import (
    	"bufio"
    	"fmt"
    	"os"
    	"sync"
    )
    
    func main() {
    	urls := make(chan string)
    	go fillChannel(urls)
    
    	// создаем группу для ожидания, того, что все воркеры завершены
    	wg := &sync.WaitGroup{}
    
    	for i := 0; i < 5; i++ {
    		// при запуске каждого воркера, увеличиваем счетчик в группе на 1
    		wg.Add(1)
    		go requestWorker(urls, wg)
    	}
    
    	// ждем, пока счетчик в группе не будет равен 0
    	wg.Wait()
    }
    
    func requestWorker(channel <-chan string, wg *sync.WaitGroup) {
    	// По завершении воркера счетчик в группе будет уменьшен на 1
    	defer wg.Done()
    	// Заодно пишем сообщение о завершении воркера
    	defer println("Worker stopped")
    
    	// Постоянно читаем из канала новые сообщения
    	// цикл автоматически завершится, когда канал закроется и буфер будет пуст
    	for url := range channel {
    		println(url)
    	}
    }
    
    func fillChannel(channel chan<- string) {
    	file, err := os.Open("data.txt")
    	defer file.Close()
    
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    
    	fileScanner := bufio.NewScanner(file)
    	fileScanner.Split(bufio.ScanLines)
    
    	for fileScanner.Scan() {
    		channel <- fileScanner.Text()
    	}
    
    	// закрываем канал, когда данные кончились
    	// в го принято, чтобы канал закрывал только тот, кто в него пишет
    	close(channel)
    }



    Этот паттерн называется worker pool. Мы пишем в канал все нужные данные и закрываем канал, когда данные кончились. Благодаря тому, что воркеры читают из канала через range, цикл просто выходит, когда канал закрыт и воркеры завершаются.
    WaitGroup используется для того, чтобы подождать, пока воркеры доработают последние данные.
    Ответ написан
    Комментировать
  • Как сделать такой поиск?

    Natebash
    @Natebash
    React, Vue, Angular, Navite JS, Python / Node JS
    В header добавляете иконку, на иконку событие клика которое скроет header и покажет вместо нет строку поиска.
    Когда будете заполнять поиск, на инпут вешаете дебаунс, и выполняете поиск элементов. Выводите их. При закрытии поиска вызывается хэндлер на закрытие поиска и показ header
    Ответ написан
    2 комментария
  • Почему не работает функция в с++ пытаюсь вызвать, а она не вызывается?

    @res2001
    Developer, ex-admin
    Вот это void BubbleSort(vector<int> v); не вызов функции. Это ее объявление. В коде предварительные объявления функций могут встречаться где угодно, синтаксически это верно, потому компилятор и не ругается. Но вызова не происходит, потому что его нет.
    Ну и учтите замечание 12rbah
    Ответ написан
    Комментировать
  • Почему не работает функция в с++ пытаюсь вызвать, а она не вызывается?

    @12rbah
    return 0;
        menu_for(v);
    Казалось бы, что могло бы пойти не так, попробуйте поменять местами return и menu_for
    Ответ написан
    Комментировать
  • Можно ли в пропсах указать длину элементов?

    TMProject
    @TMProject
    Frontend developer React/Redux
    Передай в пропсы количество и циклом сгенерируй это нужное количество
    Ответ написан
    Комментировать
  • Как преобразовать массив в под массив + объект?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    «С методами» это в одну строку:
    arr.map(item => Object.fromEntries([item]))

    Разжёванный учебный костыль «без методов»
    const resultArr = [];
    for (let i = 0; i < arr.length; i++) {
      const item = arr[i];
      const obj = {};
      obj[item[0]] = item[1];
      resultArr.push(obj);
    }

    или покороче
    const resultArr = [];
    for (let [prop, value] of arr) {
      const obj = { [prop]: value };
      resultArr.push(obj);
    }
    Ответ написан
    1 комментарий
  • Как подключить .env файл в проект php?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    Почти всё правильно.
    Только при инициализации нужно указывать не файл, а директорию.
    Если файл у вас имеет название по умолчанию, то есть .env, то без второго параметра

    $dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__));


    При такой записи файл .env должен располагаться на один уровень выше файла, в котором вы это написали.

    Если хотите по другому файл назвать, то новое имя следует передать во втором параметре, без точки.

    $dotenv = Dotenv\Dotenv::createImmutable(dirname(__DIR__), 'my_env');


    Теперь файл должен располагаться там же, но называться .my_env
    Ответ написан
    Комментировать
  • Есть ли простейшие генераторы статических сайтов для SPA?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    да
    https://qna.habr.com/q/579529
    Вот этот самый плагин
    @dreysolano/prerender-spa-plugin
    устанавливайте именно этот, с официальным проблемы
    Ответ написан
    1 комментарий