• Возможно ли тестирование сайта в автоматическом режиме?

    @bioroot
    Не увидел в ответах выше, так что вставлю свои 5 копеек. Посмотрите в сторону Cypress. На удивление крутая и почему-то не сильно известная штука. Это такой комбайн, в которой напиханы лучшие решения для тестирования на js, хорошая документация, поддержка jQuery. У него низкий порог вхождения. Особо и настраивать ничего не надо. Установил и поехали. И один из главных бонусов - тесты запускаются в очень презентабельном виде. Грубо говоря у вас в окошке браузера подсвечиваются выбираемые элементы и параллельно рядом показывается логика исполнения теста. Так что теперь когда начальник спросит "А чем вы вообще, ребята, тут занимаетесь?" ему всегда есть что показать.
    Ответ написан
    2 комментария
  • Можно ли совместить базы по id?

    @bioroot
    Читайте про INSERT ... SELECT Коротко, нужно создать структуру новой таблицы, а затем сделать в неё INSERT, выбрав данные запросом (например, как написал Ice).
    Ответ написан
    Комментировать
  • Как ограничить число отношений к записи?

    @bioroot
    На самом деле очень интересный вопрос. Логику, которую вам предлагают выше, всё-равно придётся использовать. Т.е. начинаем транзакцию, пробуем воткнуть данные, если что-то пошло не так - откатываем транзакцию. Но, насколько я вас понял, в первую очередь вам не нравится, что ограничения на количество мест придётся выносить в код, и откатывать транзакцию тоже из кода. Это нормальная практика, но если очень хочется вынести ограничения в базу - посмотрите в сторону CONSTRAINT. Правда есть эта штука только в последней версии MySQL (в PostgreSQL есть давно). С помощью этих проверок вы можете, например, создать колонку с количеством свободных мест в ресторане и потребовать, чтобы оно было не отрицательно. Тогда на уровне кода вам нужно будет только не забыть скрутить на единицу счётчик свободных мест. Если ограничение будет нарушено, то база плюнет ошибкой и транзакция откатится.
    Ответ написан
    Комментировать
  • Как вы планируете свой рабочий день, чтобы не выгорать?

    @bioroot
    Поддержу большую часть выше сказанного. Во-первых, работать с адекватным качеством можно не больше 6 часов в день. Я стараюсь брать по 4-5 часов (хотя это не отменяет того факта, что при какой-нибудь аварии на сервере нужно собраться и устранить проблему не глядя на часы, но такие ситуации крайне редки). Во-вторых, как только вы набьёте руку и будете интересовать клиентов больше чем они вас, уходите на фриланс. Ну или как минимум гибкий график жизненно необходим. В-третьих, подумайте, сколько денег вам нужно и чем для вас вообще является работа - способом заработка или призванием. Если первое, то работайте меньше. Лично я понял что для меня это именно способ заработка. Хотя в целом работа мне нравиться, но я не из тех кто готов по 12 часов писать код для работодателя, а остальные 12 часов - для pet-проектов. IT-субкультура навязывает что это не круто, но если вы сможете справиться со стереотипами, то станете продуктивнее и счастливее. Денег скорее всего станет меньше, но это на самом деле не так критично влияет на жизнь. Хотя сначала кажется что будет ужас, но у страха глаза велики.

    В сухом остатке, оценивайте работу в первую очередь по комфортности для вас, а не по доходу, известности компании и прочим побочным факторам. Если вы не создадите себе комфортных условий, то с гарантией выгорите, не смотря на психологов, доход, лекарства и репутацию как специалиста. Я, например, в качестве одного из главных критериев беру адекватность клиентов и доверительные отношения с ними. В результате мне не нужно писать гигантские отчёты по каждому потраченному часу, высылать пачки скриншотов с открытой IDE и выбивать заработанные деньги. Я просто говорю сколько они мне должны, они просто платят. Можно было бы нахватать больше клиентов и по большей ставке, но зачем? Всех денег не заработаешь, а удовлетворённость жизнью в текущем режиме выросла гораздо больше, чем просел бюджет.
    Ответ написан
    Комментировать
  • Как оптимизировать запрос с INNER JOIN и ORDER BY по нескольким таблицам?

    @bioroot
    Давно не пользовался MySQL, однако напишу по старой памяти. У вас очень много одиночных индексов, а в вашем случае этого уже не достаточно. Надо переходить минимум на двойные. К примеру, в таблице bank вас интересуют только slug и id. Но в случае одинарных индексов обработка вашего запроса будет происходить примерно следующим образом.
    1. MySQL видит ключ slug, лезет в хранилище индекса и находит там указатель на соответствующую строку с данными.
    2. MySQL смотрит, а что ему ещё нужно из этой таблицы. Оказывается, нужен id для джойна с таблицей branch.
    3. MySQL лезет в хранилище данных, находит там строчку (или строчки) по указателю из 1-го пункта и из них вынимает id.

    Если бы у вас был двойной индекс (slug, id), то нужный id обнаружился бы в хранилище индексов рядом со slug. И дальше в данные вообще не понадобилось бы лезть.

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

    @bioroot
    Обычно говорят что всё плохо и не говорят где именно редкие... "редиски". Я в таких случаях крайне рекомендую взять этого товарища за грудки, потрясти и спросить что конкретно не так. Таких "менторов", к сожалению, кругом пруд пруди. Пока вы не получите конкретный ответ, ваше общение не принесёт никакой пользы. А конкретные указания бывают очень разные в том числе и настолько нелепые, что потом будете удивляться. Но это будет хотя бы предметом обсуждения и вы можете либо сказать "Ой, ступил", либо объяснить почему вы выбрали именно такую реализацию.

    А иначе получается как в анекдоте. Вы все здесь ..., а я Д'Артаньян.
    Ответ написан
    Комментировать
  • Как это так? Команда Update сделала Truncate таблицы?

    @bioroot
    Во-первых, у вас после G-60019 кавычка не закрыта. Во-вторых, надо смотреть, что у вас за записи в базе. Но никто не запрещает заменить UPDATE на SELECT и самому увидеть какую выборку сделает запрос:
    SELECT CASE WHEN product_sku = 'G-60019' ... END AS test_field  FROM brand_sku_increment;
    Ответ написан
  • На чем писать сервер для игры?

    @bioroot
    [irony]Из новомодных языков Rust ещё не упомянули. Пишите на нём.[/irony] А если нет чёткого понимания на чём писать игру, то я бы взял Unity. Много уроков, библиотек, большое комьюнити, на рынке есть разработчики под неё при необходимости расширять штат, C# - строгий и понятный язык. Ну и саму Unity активно пилят дальше. И с учётом того что в современном мире нужно выкатить продукт как можно скорее, даже и не знаю, есть ли хорошие альтернативные варианты, если у вас нет за плечами большого багажа из прочих вышеперечисленных технологий под высокую нагрузку.

    P.S.: В рамках js можно было бы ещё упомянуть MeteorJS. Но на мой взгляд, если игра real-time, а не turn-based, то он не потянет.
    Ответ написан
  • Где найти пример организации контроллеров для REST api с кодами ответов?

    @bioroot
    Сугубо моё мнение, но я бы посоветовал взглянуть на dreamfactory. Правда это про Laravel и если вам нужно отдать пару строк из базы, то уровень абстракции высоковат. Но как образец для подражания и черпания идей однозначно рекомендую.
    Ответ написан
    Комментировать
  • Как сейчас выглядит взаимодействие django + react?

    @bioroot
    React работает через REST, а для него есть django rest framework. Погуглив можно найти обучалки для этой связки. И подозреваю, что она даже позволит делать страницы и на react и без него без особых проблем. Главный вопрос - зачем?

    На мой взгляд, сейчас общая тенденция идёт к тому чтобы делать голый rest api вместо обычного сайта и уже через него подгружать данные хоть в мобильное приложение, хоть на обычный компьютер, хоть на какое-то ещё устройство, которое эти данные сможет красиво отобразить. Но не понятно, зачем это делать на Django. По крайней мере в настоящий момент, когда среднестатистическому сайту такие навороты ни к чему, а для крупных проектов важнее производительность, чем возможности обвязки Django.
    Ответ написан
  • Вопрос про ООП, как использовать?

    @bioroot
    Добавлю свои пять копеек. Мне в своё время очень помогла идея интерфейсов, хотя они и довольно умеренно прижились в php и в основном на низком уровне. В вашем примере вы могли бы вынести обработку комментариев в отдельный метод, который требовал бы от объекта-аргумента имплементить интерфейс, требующий наличия метода getComments. Дальше этот метод уже сам строит по комментариям дерево. Потом вы упаковываете этот метод в файл и когда вам нужно дерево комментариев к любой сущности (не только блогу, а к фотогалерее, новости и т.п.) дёргаете этот волшебный метод. При условии что вы соблюдаете некие свои собственные соглашения о формате комментариев всё будет работать само собой. А если вы подсунете сущность, которая не имеет метода getComments, то сразу узнаете об этом.

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

    @bioroot
    По поводу универов. МГТУ им. Баумана - отличный выбор. Хотя я сам там не учился, из коллег по работе и просто знакомых оттуда выходят отличные специалисты. PHP и MySQL там, наверное, не научат, но мозги вправляют совершенно конкретно. Учат думать. Кроме того знакомая, которая по работе часто общается с иностранцами (в основном с европейцами) рассказывала, что у них технари из Бауманки на хорошем счету.

    В Москве у них есть как минимум одна своя школа. В регионах можно выяснить.
    Ответ написан
    1 комментарий
  • Как сделать парсер на python учитывая что переход по страницам осуществяется на javascript?

    @bioroot
    В качестве альтернативы в теории можно прикрутить PhantomJS в качестве webdriver для Selenium. Правда сам не пробовал. Когда была задача по парсингу сайтов, то мне было проще пересесть напрямую за PhantomJS/SlimerJS. Но там было много сайтов с похожей структурой и не было возможности руками разбираться где есть ajax, а где нет.
    Ответ написан
    Комментировать
  • А есть среди вас психологи?

    @bioroot
    1. Выспаться.
    2. Занятся чем-то, чего вы совсем не умеете. Жонглировать, рисовать, на дудке играть, скороговорки говорить и т.п. Тут важно, чтобы дело не имело для вас какой-то повышенной значимости. Если давно и сильно хотели научится играть на гитаре или кататься на коньках — не пробуйте. Можете опять скатится в то, что не получается нифига. И хорошо если дело само по себе не будет избыточно сложным. Надо его позиционировать как отдых / развлечение и заниматься столько, сколько вам позволит свободное время (но без фанатизма).
    Ответ написан
  • MVC, как лучше избежать дублирование кода?

    @bioroot
    Первым делом определитесь чего вы хотите на самом деле. Не понятно почему отсутствие проверки родителя — непрофессиональность. Если она не нужна, то непрофессиональность как раз её написание ради какой-то абстрактной идеи. Например, для региона может быть нужно сделать отдельную страницу при наличии страны и отсутствии его самого («для указанной страны не существует такого региона»). Если все ошибки ведут на одинаковую надпись «страница не найдена», то дополнительные проверки ни к чему.

    Далее надо определиться с реализацией. Но тут уже вам должно быть виднее какая у вас архитектура. По сути всё предложенное выше сводится к классическому паттерну Strategy: весь общий функционал оставляем в родительском классе, а все частности (ключевой момент — их должно быть мало) переносим в наследников. В вашем случае предком будет CRUDController с реализацией метеодов завязанной на modelClass, а потомками классы определяющие этот modelClass и метод checkRequest. Дёрганье checkRequest прописывайте где вам нравится. Не знаю как устроен Yii, но если он позволяет создавать контроллеры произвольных классов не наследуясь ни от кого, то имеет смысл вообще объявить CRUDController абстрактным и в нём же прописать абстрактный метод checkRequest. Тогда это будет вообще Strategy из книжки, а вы получите возможность использовать checkRequest в других методах CRUDController не опасаясь того что в наследниках он не определён. И ещё обычно в современных фреймворках есть метод, который дёргается перед любым экшеном контроллера. Возможно, там вашему checkRequest самое место.

    Продолжая фантазировать на тему, можно сделать тип модели modelClass передаваемым в параметре. Или получать его исходя из того что вам передали. Только надо сделать карту допустимых значений. Что-нибудь типа
    array(
    	...
    	'region' => array( 'model' => 'regionModel', 'parent' => 'countryModel' ),
    	'country' => array( 'model' => 'countryModel', 'parent' => null )
    )
    

    и из этой карты получать модель и родителя проходя по ключам массива и проверяя на существование параметра с таким ключом. Как только нашли — проверяем существование родителя и работаем по общим методам с уже определённым значением modelClass.

    Почему все советуют делать Strategy. Потому что эта штука зарекомендовала себя в боях. Классический ООП подход часто приносит больше трудностей при разработке (надо быть аккуратнее и чаще всего писать больший объём кода), но даёт заметный выигрыш при необходимости изменить какую-то часть проекта. К примеру, «нафантазированный» способ реализуется быстрее (надо добавить пару методов и карту соответствия, против базового класса + 5 классов дочерних для сущностей). Но при этом если понадобиться добавить какой-то новый экшн (например, добавление комментария к ревью), то в случае со стратегией вы просто впишите его в нужный класс. А для более простого метода придётся ломать себе голову с изобретением исключения в логике. Пару раз так можно сделать, но… после 12 костылей код превратится в тыкву.

    Но, в конечном итоге, решать всё-равно вам. Может быть и второй быстрый способ подойдёт, потому что «там стопудова ничего не будет меняться» (не верьте тем кто так говорит — обязательно будет). Может вы их скрестите и внесёте в базовый класс стандартную реализацию checkRequest, а в дочерних классах будете определять только modelClass и parentModelClass. Всё зависит от конкретных потребностей и архитектуры проекта.
    Ответ написан
    1 комментарий
  • Регулярные выражения, максимальная длина строки

    @bioroot
    А есть какая-то веская причина не проверять условие вне регулярного выражения? Я с ходу не могу придумать адекватного способа это сделать без look-behind'ов. Собственно и с ними страшновато.

    Может лучше опишите задачу целиком? По опыту когда ко мне кто-то обращается с вопросом «как построить регулярку» в 90% случаев исходная постановка задачи помогает найти более адекватное решение, хотя часто и через другую регулярку.
    Ответ написан
    1 комментарий