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

    apavlyut
    @apavlyut
    www.pavlyut.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 комментарий
  • Зачем нужны интерфейсы в go?

    vabka
    @vabka
    Токсичный шарпист
    Интерфейсы нужны для полиморфизма.
    Конкретно в твоём случае да - разницы нет.
    Но чисто в теории ты бы мог сделать вот так:
    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 комментария
  • Как не позволить пользователю вставить html тег в div использую js?

    Dr_Elvis
    @Dr_Elvis
    В гугле забанен
    Учти что любой JS можно просто выключить у тебя на сайте и обойти. Тут нужно на стороне сервера обрабатывать и чистить от не нужного.
    Ответ написан
    Комментировать
  • Как из гита навсегда удалить файл?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Самый надёжный способ вычистить репозиторий от файла — использовать скрипт filter-repo
    # клонируем репозиторий в соседний каталог
    # иначе придётся использовать ключ --force
    git clone --no-local . ../clonerepo/
    # переходим в свежий клон
    cd ../clonerepo
    # чистим
    git filter-repo --path "path/to/file" --invert-paths
    # проверим что файл исчез
    git log --all --oneline --name-status -- "path/to/file"
    Ответ написан
    Комментировать
  • Как правильно передать указатель на переменную?

    Вместо того, чтобы объявлять

    type Forks []struct {
      ForkID           string      `json:"fork_id"`
      Income           float64     `json:"income"`
      Sport            string      `json:"sport"`
    ...............
      AliveSec         int         `json:"alive_sec"`
      ValuingData      ValuingData `json:"valuing_data"`
    }


    Вам нужно объявить тип элемента и тип массива разными типами
    type Fork struct {
      ForkID           string      `json:"fork_id"`
      Income           float64     `json:"income"`
      Sport            string      `json:"sport"`
    ...............
      AliveSec         int         `json:"alive_sec"`
      ValuingData      ValuingData `json:"valuing_data"`
    }
    
    type Forks []Fork


    Тогда сможете сделать так:
    func checkBet(body []byte, v *Fork) {
    ......
    Ответ написан
    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
    }
    Ответ написан
    Комментировать
  • А как тестировать handler?

    Если вы пишите Unit-тест - вместо CityRepository используйте мок, который будет проверять что в него пришел именно тот объект который вы ожидаете.
    Ответ написан
    Комментировать
  • Как заставить volumes Docker compose не затирать данные из контейнера?

    Ожидаю что файлы из директории var/www/html попадут на хост в ./www

    Нет. Наоборот. Монтируется что-то (папка или docker volume) внутрь контейнера, заменяя собой ранее существовавшую (если) в контейнере папку. Или индивидуальный файл.
    volumes: 
       - /папка_на_хосте:/папка_в_контейнере_1
       - имя_тома:/папка_в_контейнере_2
    После этого, если внутри контейнера в этой папке создаётся файл, он оказывается в папке_хоста или томе.

    WordPress при запуске смотрит, есть ли его файлы в папке. И если папка пуста — инсталлируется, распаковывает все свои файлы в неё.

    При этом, разумеется, раз смонтирована папка хоста — все файлы появляются в ней.

    Т.е. нет изначально никаких файлов в контейнере в /var/www/html — будь она папкой контейнера или смонтированной в него папкой хоста или томом докера. При запуске, если там пусто, файлы создаются / записываются контейнером.

    Если хочется так же, создайте баш-скрипт entrypoint.sh, в который поместите логику инициализации приложения, в т.ч. копирование-создание файлов. Укажите его как ENTRYPOINT контейнера.
    Ответ написан
    Комментировать
  • Возможно ли игнорировать файл/папку через .gitignore, которые уже есть в репозитории?

    sergey-kuznetsov
    @sergey-kuznetsov Куратор тега Git
    Автоматизатор
    Нет, если файл уже попал в репозиторий, то он будет отслеживаться до тех пор, пока ты его оттуда не удалишь.

    Игнор действует только на те файлы, которые ещё не отслеживаются. Помогает СЛУЧАЙНО не добавить файл. Но лаже игнор не запрещает принудительно загнать файл в репозиторий.

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

    Ещё есть трюк с временным игнорированием изменений в файле, ранее уже добавленном. Но он будет работать только в локальной копии репозитория и только после ввода команды
    git update-index --assume-unchanged файл
    Ответ написан
    Комментировать
  • Как вывести результат "на лету"?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Вместо click'а у кнопки обрабатывайте input у формы:

    - document.querySelector('.calculate').addEventListener('click', function () {
    + document.querySelector('form').addEventListener('input', function () {
    Ответ написан
    6 комментариев