• Кто-нибудь получал высшее образование в IT заочно и экстерном?

    agoalofalife
    @agoalofalife
    Team Lead
    Не могу написать вам в личку(ее тут нет вроде), как то удалось решить этот вопрос?
    Ответ написан
  • Вопрос по Laravel queue, как сделать чтоб очереди выполнялись друг за другом и не пересекались?

    agoalofalife
    @agoalofalife
    Team Lead
    Поделюсь опытом, готового решения в Laravel из коробки нет.
    Если надо остаться в рамках Laravel то есть несколько вариантов. Можно допилить функционал в самом Laravel, но код внутри не готов к такой кастомизации. (говорю заранее это будет жесткий костыль, он будет мешать нормальной работе очередей). Второй вариант, сделать еще одну базовую очередь.
    Что я имею в виду?
    Вариант №1
    Мы берем простой кэш или redis(сразу) с его очередью(вроде это lists) , и добавляем туда наши jobs, каждый раз когда когда job выполняется, она смотрит должна ли именно она сейчас выполниться и если нет, то скрипт ее возвращает обратно в обычную очередь.
    Соответственно запуск job регулируется другой очередью(то есть вы организуете добавление jobs в обычную очередь), из минусов, ваши jobs будут туда сюда гоняться скриптом и полезной работы не какой. Если например один уйдет в fail jobs - worker будет гонять туда сюда пока вы не выполните его и не восстановиться работа.

    Вариант №2
    Второй вариант сделать уже нормальную базовую очередь. К примеру, делаете таблицу в базе данных. Когда job в нормальном flow должен отправляться в очередь, вы отправляете его в эту таблицу. Дальше вы пишите своего демона(worker) который просматривает вашу таблицу на предмет выполнения.
    Если что то готово выполняться, он отправляет его в обычную очередь. Добавляете в эту таблицу статусы и вперед.
    Job добавилась в таблицу - "ready"
    Job ушла - "в процессе"
    Job выполнилась - "удалилась из таблицы или approved"
    Возможно еще есть колонки для группировки(например принадлежность какой нибудь группе), теперь ваш демон может запускать их по очереди даже в рамках групп.
    Соответственно все идут друг за другом, пока один "в процессе" остальные не берутся.
    Ответ написан
  • Как структурировать миграции Laravel, чтобы при миграции не указывать каждую папку отдельно?

    agoalofalife
    @agoalofalife
    Team Lead
    Я видел такую библиотеку но сам не пробывал
    Может быть у нее и нет тех проблем что вы описали
    Ответ написан
  • Валидация номера телефона?

    agoalofalife
    @agoalofalife
    Team Lead
    Попробуйте эту библиотеку она не раз меня выручала уже
    Ответ написан
    Комментировать
  • Как в данном случае написать Unit тест?

    agoalofalife
    @agoalofalife
    Team Lead
    На сколько я вижу это инфраструктурный код - поэтому проще его тестировать функциональными тестами (которые в папке Laravel называются Feature)
    1) Решается функциональным тестом, будет использоваться тот который укажете - подойдет просто оперативная память
    Имеется в виду - что вы просто отправляете запрос и ждете определенный результат
    2) Можно задать в тесте - а лучше в файле окружение env.testing
    3) Почему у вас ищет метод environment в Container без контекста сказать сложно, этот метод в классе Application
    Ответ написан
    Комментировать
  • Линейная алгебра для гуманитариев. Какой учебник посоветуете?

    agoalofalife
    @agoalofalife
    Team Lead
    Хороший учебник Lay Linear Algebra - учитывая что зарубежный - то с английским должны быть на "ты".
    Ответ написан
    Комментировать
  • Какую литературу почитать для изучения линейной алгебры?

    agoalofalife
    @agoalofalife
    Team Lead
    Могу порекомендовать Lay Linear Algebra
    Хорошо описано - только как и везде читать вдумчиво и решая упражнения
    Ответ написан
    Комментировать
  • Почему не формируется soap запрос?

    agoalofalife
    @agoalofalife
    Team Lead
    Могу предложить вам готовую библиотеку
    Все проблемы уже решены в ней
    Ответ написан
    Комментировать
  • Почему не работает SOAP запрос?

    agoalofalife
    @agoalofalife
    Team Lead
    Может смогу вам сэкономить время этой библиотекой
    Там уже реализовано все что нужно
    Ответ написан
    Комментировать
  • Что думаете о Livewire и Inertia.js?

    agoalofalife
    @agoalofalife
    Team Lead
    И тот и другой инструмент под свой круг задач вполне подходит.
    Livewire - как вам ответили выше, хорошо подходит mvp, небольших сайтов, где нет большой нагрузки и грандиозных планов.
    Хотя кто-то берет на себя риски и делает все на нем. Из подводных камней, это у вас связаны руки в js, так же на каждое действие, он будет слать запрос на сервер. То есть написали букву в input, запрос на сервер(хотя можно оптимизировать, но тем не менее), в итоге получается такой оверхед на все.
    Стоит иметь в виду о смеси ответственностей, точнее livewire будет вас постоянно склонять к этому, так как в классах php у вас постоянно логика фронта.
    Еще могут быть не очевидные проблемы, при синхронизации данных, и вам надо будет подставлять задержки.
    У меня была проблема с загрузкой файла, в кратце есть две настройки в вашем php.ini и отдельно в файле livewire, в каждом стоит свое максимальное значение размера файла.
    Так вот- грузил я картинку по событию change, после загрузки была написана валидация, в кратце файл не грузился и в блок с валидации было пусто.
    Проблема заключалось в том, что livewire не как об этом не сообщал и не намекал, просто не грузил файл и валидация не проходила.
    Так что будьте готовы решать такие нюансы.
    Мой субъективный опыт получился двоякий, с одной стороны мне понравилась скорость, с другой стороны что-то не работает, возможно это временно пока все шишки не набьешь.

    С Inertia опыт пока только теоретический, но он уже ближе к нормальному стеку. Просто вам не надо думать о роутинге, api, вывода ошибок.
    Врать не буду, ибо фраза:
    В теории нет разницы между теорией и практикой. А на практике есть

    Поэтому я дополню свой ответ позже - если посчастливиться его попробывать

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

    agoalofalife
    @agoalofalife
    Team Lead
    отвечу, может кому поможет
    у меня такая проблема была на мас os
    как вариант в конфигурации database.php поменять redis -> client с phpredis на predis
    и после сделать composer require predis/predis

    второй вариант утстановить через gihub расширение и добавить в php.ini
    вот как здесь
    Ответ написан
    Комментировать
  • Алгоритм разбитить массив на группы по датам?

    agoalofalife
    @agoalofalife
    Team Lead
    Обычно такие функции называются groupBy и реализованы во многих библиотеках например вот
    Если не хотите использовать библиотеку то вот пример со stackoverflow
    Вот например функция которая разбивает по дню
    function groupday(value, index, array){
       let byday={};
        let d = new Date(value['created_at']);
        d = Math.floor(d.getTime()/(1000*60*60*24));
        byday[d]=byday[d]||[];
        byday[d].push(value);
      return byday
    }
    
     data.map(groupday)
    Ответ написан
    Комментировать
  • Алгоритм решения данной задачи?

    agoalofalife
    @agoalofalife
    Team Lead
    Понравилась задача, расскажу как сделал в итоге я.
    Программа работает слева -> направо, сверху -> вниз.
    Первый кусок, нам известен.
    Берем правую сторону первого элемента, находим его связь, далее для следующего элемента надо найти элемент противоположной стороны.
    Для примера правая сторона вот такая:
    `left: { edgeTypeId: 38, type: 'outside' }`
    Надо искать где edgeTypeId :38 и type:'inside'.
    Элемент который будет найден, надо обратить внимание, на его сторону, и получить противоположный.
    К примеру мы нашли 38 и inside, оно лежало в элементе с id:33, сторона: top, нам надо искать след элемент который будет в bottom, так как он противоположный.

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

    function solvePuzzle(pieces) {
    	// initial
    	let result = [pieces[0].id];
    	let next = {
    			edgeTypeId: pieces[0].edges.bottom.edgeTypeId,
    			type: pieces[0].edges.bottom.type,
    	};
    
    
    	for(let rowIndex = 0, step = -10;rowIndex < 10;rowIndex++, step += 10) {
    		if (rowIndex !== 0) {
    			next = getDownPiece(result[step], pieces)
    			result.push(next.id)
    			next = next.edges.bottom
    		}
    		for(let i = 0;i < 9;i++) {
    			next = findNextEdge(next, pieces, i === 8);
    			result.push(next.id)
    		}
       }
      return result;
    }
    
    
    function findNextEdge(previousEdge, pieces, isLast = false) {
    	let typeOpposite = getTypeOpposite(previousEdge.type);
    	let result = {};	
    	for (var i = 0; i < pieces.length; i++) {
    		let nextEdge = Object.entries(pieces[i].edges).find(function(edge) {
    			let [, nextEdgeCandidate] = edge
    			return nextEdgeCandidate !== null && previousEdge.edgeTypeId === nextEdgeCandidate.edgeTypeId && nextEdgeCandidate.type === typeOpposite;
    		});
    		if (nextEdge !== undefined) {
    			[typeSide] = nextEdge
    			if (isLast === false) {
    				result = Object.assign(pieces[i].edges[getOppositePosition(typeSide)], {id:pieces[i].id})
    			} else if(isLast){
    				result = Object.assign(pieces[i].edges[typeSide], {id:pieces[i].id})
    			}
    		}
    	}
    	return result;
    }
    
    function findConnectedEdge(leftEdge, pieces) {
    	let typeOpposite = getTypeOpposite(leftEdge.type);
    	return pieces.find(function(piece){
    		return Object.entries(piece.edges).find(function(edge) {
    			let [, rightEdgeCandidate] = edge
    			return rightEdgeCandidate !== null && leftEdge.edgeTypeId === rightEdgeCandidate.edgeTypeId && rightEdgeCandidate.type === typeOpposite;
    		});
    	});
    }
    
    function getTypeOpposite(type){
      return type === 'inside' ? 'outside':'inside';
    }
    function getOppositePosition(position) {
    	if (position === 'bottom') {
    		return 'top';
    	} else if(position === 'top') {
    		return 'bottom'
    	} else if (position === 'left') {
    		return 'right';
    	} else {
    		return 'left';
    	}
    }
    
    function getDownPiece(idUpPiece, pieces) {
    	return findConnectedEdge(pieces.find(edge => {
    	  return edge.id === idUpPiece;
    	}).edges.left, pieces)
    }
    
    // Не удаляйте эту строку
    window.solvePuzzle = solvePuzzle;

    Ответ написан
    Комментировать
  • Как лучше всего организовать маршруты?

    agoalofalife
    @agoalofalife
    Team Lead
    Касательно routes
    Для начала вы можете их разместить в папке routes, а подключить в RouteServiceProvider
    Route::middleware('который нужен')
                 ->namespace($this->namespace)
                 ->group(base_path('routes/ваш путь до файла'));
    Ответ написан
    1 комментарий
  • Есть ли в Symfony аналог Laravel Passport?

    agoalofalife
    @agoalofalife
    Team Lead
    Laravel интегрировал в свою экосистему вот этот пакет
    Если вас хороший уровень можно будет реализовать под ваши задачи.
    Ответ написан
    2 комментария
  • Какой подход в написании тестов предпочтительнее?

    agoalofalife
    @agoalofalife
    Team Lead
    Как написал коллега выше это абсолютно разные тесты.
    - Первый пример: это модульный тест или unit. Обычно им тестируют класс и несколько классов когда они в зависимостях. Для примера если в аргументах примитив(число) в тестах можно передать все случаи 0 или даже отрицательные числа. Если у вас подход (DDD) можно протестировать инварианты.
    - Функциональные(интеграционные или E2E - end to end) тесты - (в Laravel папка Feature) тестирование черного ящика. Например вы делаете запрос и ожидаете определенного ответа. В laravel это сделано не совсем корректно - так как предлагается в тестах лезть в базу
    $this->assertDatabaseHas('users', [
                'email' => 'some@something.com'
            ]);

    Функциональное тестирование не про базу, оно о том как приложении работает в целом.
    Ответ написан
    Комментировать
  • Какая есть простая программа для представления БД в визуальном виде - чтобы таблички с полями и отношения между ними?

    agoalofalife
    @agoalofalife
    Team Lead
    Раньше использовал dbdesigner но после стало не хватать и нашел dbdiagram
    Ответ написан
    Комментировать
  • Несколько бд или одна?

    agoalofalife
    @agoalofalife
    Team Lead
    Внесу своих 5 копеек на чаше весов.
    Мне кажется рассматривать database - без потребителей этих данных не совсем реалистично.
    Я имею в виду, что надо отталкиваться от бизнеса, насколько все эти базы будут жить в согласованности, так как данные бизнеса имеют зависимости.
    История платежей пользователей - нуждается наверное в пользователях, они скорее всего хранятся в другом месте(в другой базе). Новости тоже могут иметь зависимости(например комментарии, кого?пользователей) Сложно сказать однозначно в этой ситуации, не вижу всей картины.
    Но..В разных базах есть смысл хранить данные, когда есть концептуальное разделение.
    Например история платежей - это частный случай, неких выплат. Выплаты можно выделить в отдельный контекст и формализовать.
    Надо исходить из предметной области, так как очевидно что ваши конечные пользователи не напрямую из базы читают, есть еще код, который организует это.
    Неизвестен масштаб проекта, если всего один разработчик, тогда какое преимущество даст разделение?Оно просто внесет сложность, трату времени и денег. Если бизнес стал развиваться, то скорее это нужда а не философский вопрос.

    Еще есть вариант, просто наделать баз в одном монолитном проекте, но такое я еще не видел. Лишать себя связей между таблицами в реляционной базе, должен быть веский повод.
    Ответ написан
    Комментировать
  • Что почитать про работу с dom через js?

    agoalofalife
    @agoalofalife
    Team Lead
    Наверное вы уже видели эту книгу, предполагаю что на русский ее еще не успели перевести. Это еще одно доказательство что english must know.
    Попробуйте почитать на английском, будет не быстро но получиться.
    Есть кстати еще одна "Dom Scripting. Web Design with JavaScript and the Document Object Model"
    Еще вариант читать спецификации и документации, к сожалению специальных книг на русском я не видел
    Ответ написан
    Комментировать
  • Какой подход к проектированию бд более оптимален?

    agoalofalife
    @agoalofalife
    Team Lead
    But I also knew, and forgot, Hoare's dictum that premature optimization is the root of all evil in programming

    Надо ответить себе на несколько вопросов:
    - Имеет ли такую нужду(как оптимизация) база данных место быть. У вас есть уже такой трафик?Если да, тогда и правда стоит подумать об этом
    - Надо думать и о доменной(бизнес модели), если в бизнесе такое понятие как contacts или он был придуман вами. Когнитивная нагрузка будет возрастать если например в вашем бизнесе это называют потенциальный заказчик(например). Заходя в структуру базы, без документации, не будет очевидно копирование из таблицы contacts to users.
    - Таблица contacts - это денормализация данных, частая практика для экономии операции чтения, насколько здесь оправдано - не ясно, так как задача вырвана из общего контекста(любое условие или перспектива будущего могут на него повлиять). Если вам надо просто различать состояние user, то вы можете сделать пометку в этой таблице. Если у вас есть дополнительная работа с candidate user(заключение договоров, ведение переговор с сохранением данных об этом и так далее) то есть процесс не мгновенный из одного состояние в другое, то наверное надо хранить в другой таблице.

    Не знаю в каком у вас состоянии находиться проект, на мой взгляд заострять внимание на производительности базы не приоритетный шаг в самом начале.✌️
    Ответ написан
    Комментировать