Maksim Fedorov

Golang Software Developer.

Help for developers  •  Posts on Habr

Ctrl + ↑ Позднее

Домены .dev в Хроме принудительно переадресуются на https (это нормально)

Google Chrome насильно перенаправляет все домены вида example.dev начиная с версии браузера 63 от 7 декабря 2017, даже если их используете локально и они прописаны в файле hosts.
Не помогает даже настройка браузера в HSTS.
Потому у некоторых программистов могут вылезти баги... сегодня вот не мог понять, что за Х**** приключилась.

Дело в том, что этот домен принадлежит Гуглу и они решили насильно всех пользователей своего браузера кидать на https. Это также скорее всего будет и на производных Хрома — например в Яндекс-браузере.

Что делать в этом случае?

Пара вариантов на самом деле:

  • Свои локальные проекты прописывайте с доменами .localhost, .invalid, .test, or .example и др неконфликтные синонимы
  • Используйте Firefox (или Safari) для разработки
2017   chrome

Поиск товаров в интернет-магазине от Яндекса

У Яндекса в бета-тестировании появился крутой сервис, который помогает искать товары в интернет-магазине.

Это именно полнотекстовый поиск по характеристикам, названиям, брендам и описанию товаров. Чтобы он заработал — нужно добавить свой магазин в поиск и добавить YML-фид, который подходит для Яндекс.Маркета.

Пример формата подходящего файла




YML-фид для поиска

Это основной момент в работе поиска. Для индексации Яндексу нужны данные в формате Яндекс.Маркета. В этом файле нужно указать все актуальные данные для каждого товара. Чем подробней будет расписан товар, тем точнее будет искать поиск — указать пол, цвет, мощность и при наборе этих значений поиск будет выдавать максимально подходящие варианты.

Пример работы с параметром «Цвет»




Лингвистическая мощь Яндекса

Обычный поиск на обычном сайте имеет недостаток — он ищет точное совпадение символов. С поиском Яндекса можно позволить себе писать с ошибками или забыть поменять раскладку.

Вводим: «l;bycs gfynfvj xthy», по-русски это «джинсы пантамо черн»

Отчасти такое могут делать поисковые решения Sphinx или ElasticSearch, но для магазина без штата программистов — это решение лучшее.




Койот — это шакал

Этот забавный кейс был описан в статье основателя «Мосигры». При проектировании своего поиска, команда интернет-магазина анализировала запросы пользователей и добавляла к играм ассоциации, чтобы можно было находить максимально широко нужную игру. Так они обнаружили, что их популярную игру «Шакал» искали по запросу койот.

В чем фишка. Можно воспользоваться этим лайфхаком и  добавить у товара в своем магазине поле «Синонимы» и в него складывать через запятую все синонимы к товару, или это можно делать программно или через Эксель, как угодно... и останется только вывести в YML-файл и поиск должен подхватить эти значения.




Далее будут статьи:

  • Вывод поиска через виджет от самого Яндекса
  • Вывод результатов поиска через Яндекс.АПИ в формате JSON (как на скринах)

Фильтрация задач по спискам или доскам в Trello

При работе с Trello иногда появляется задача — вывести сразу с нескольких досок актуальные задачи. или вывести по исполнителю и активности. Например есть 3-4 доски с разными проектами (разные сайты, или по отделам — дизайн и разработка) и нужно например вывести со всех досок одновременно все задачи из списка «Задачи» или из списка «ToDo».

Оказывается есть команды, которыми можно выводить тикеты как в фильтре — по названию списков, по активности, по людям и особенностям (с вложениями или описанием).

Например вывожу тикеты с разных досок, в каждой из которых есть список Задачи:

Доступные операторы

-operator — если добавить минус, то задачи с последующей отборкой не выведутся, например -has:members выведет все тикеты, никому не назначенные
@name — выведет тикеты, назначенные данному пользователю, @me выведет ваши картчоки
label: — выведет тикеты по точному названию, например label:«fix header»
board:id — выведет тикеты с определенной доски
list:name — выведет тикеты по названию списка
has:attachments, has:description, has:cover, has:members — выведут тикеты, которые содержат вложения, описания, обложку или участников соответственно
created:day — выведет тикеты, созданные за сутки, сожно вывести за неделю (week) или месяц (month)
edited:day — выведет тикеты, отредактированные за сутки
is:open, is: archived — выведут открытые и закрытые тикеты


Можно перейти отдельно на страницу поиска и фильтровать свои тикеты:

2017   trello   Советы

Тестовые задания для junior программиста на PHP

Делюсь некоторыми тестовыми заданиям, с которыми столкнулся при поиске работы на джуниора.
Если вам недостаточно заданий — просто разошлите компаниям на ХедХантере письма с просьбой выслать тестовое задание.

Тестовые задания Yii2

Создание REST API
Реализовать CRUD с регистрацией для авторов и книг. Подробнее

Парсер видео
Создать парсер видео с Youtube, Rutube, Vimeo — парсинг данных по ссылке или iframe и занесение их в БД. Подробнее

Агрегатор логов Apache
Собрать логи сервера и записать их в БД, также вывести с возможностью фильтрации. Подробнее




Тестовые задания на Symfony

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

Игра «Электрик»
Усложненная версия игры — переключение лампочек по клику с эффектом неожиданного погасания лампочки. Подробнее

Система пользователей для заказа запчастей
Реализовать раздел, в котором пользователи смогут создавать запросы на запчасти, а магазины, у которых есть запчасти, соответствующие запросам пользователей, смогут получать эти запросы. Подробнее




Тестовые задания на фреймворках

Форма обратной связи (Laravel)
Форма обратной связи с фиксацией заявок и возможностью их обработки менеджером. Подробнее

Парсер новостей из RSS изданий (CodeIgniter)
Нужно брать статьи из 5 источников RSS и сохранять их в БД. Подробнее

Минисправочник (задание в 2ГИС)
Реализовать справочник с адресами, компаниями и зданиями. Нужно реализовать REST и возможность выборки по радиусу/квадрату от заданного положения. Подробнее




Тестовые задания строго без фреймворка

Тестовое задание для web-разработчика (дискретка)
Реализовать структуру БД и класс(-ы) для работы с ориентированным нецикличным графом. Подробнее

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

Создание REST без фреймворков под высокие нагрузки
Новостной каталог с рубриками, авторами и новостями для 100 тыс записей. Реализация REST. Подробнее

Менеджер задач
Обычный менеджер задач. Подробнее

Сократитель ссылок без фреймворка
Генерация короткого url с записью в БД и проверкой уникальности. Должна работать переадресация. Подробнее

Напишите REST API для генерации рандомного числа
Каждой генерации присваивать уникальный id по которому можно получить результат генерации. Должны быть доступны 2 публичных API метода generate() и retrieve(id)




Куда без блокчейна в 2017 году? :)

Список дел на Solidity
Реализовать, используя язык Solidity смарт-контракт для добавления записей... Подробнее



Также читайте статью на vc.ru Как джуниор-разработчику найти работу

На Хекслете опубликовали список тестовых заданий, но для разных языков.

Отвечаю на вопросы по php

Готов помочь с проблемным кодом на php. Присылайте вопросы, примеры кода и описание задач, которые вы пытаетесь решить. Мне будет полезно отрабатывать навыки, вам возможно найдется решение. Ну сайт делать вам не расскажу как, а вот как настроить сервер, починить отправку писем или как работать с циклом, массивом или классом— велкам!


Присылайте вопросы в Вконтакте или на почту

Помогаю на Тостере

2017   Помощь

Верные друзья джуниора

Неделю назад устроился младшим программистом в крутую команду разработчиков — буду участвовать в разработке двух сервисов. Хочу поделиться своими недельными выводами.

Уметь в контроль версий (GIT)

Пришел с небольшим опытом работы в Гите, но так как не работал в команде, то понятия не имел как работать с ветками. Именно тут и наплутал — сделал одну фичу, но тут же вскоре понадобилось выполнить пару несложных доработок, которые сделал поверх этой первой фичи и запушил их на dev-сервер, еле-еле распутался.

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

И еще:

Следуйте GIT WORKFLOW

Ссылки:
https://habrahabr.ru/post/60030/
https://habrahabr.ru/post/106912/

Любить следующего парня

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

В итоге на одном проекте не было нужных для php модулей языка. На двух сыпались миграции — пришлось качать с тестового сервера копию базы (что тоже нужно догадаться — где и как взять доступы к ним?), на этих же проектах нужно было узнать — какой доступ к админ-панелям. На третьем все было хорошо, но чтобы создать администратора — нужно было пользоваться консольным приложением, команды которого (как и сам факт его наличия) знает только его разработчик — так себе зависимость ¯\_(ツ)_/¯

По итогу дня я вхреначил в README у каждого проекта инструкцию с установкой, а также вставил описание проблем и прямо захреначил коммиты в prod-ветку — с ветками в гите на тот момент я еще не разобрался ¯\_(ツ)_/¯

Делай инструкции для следующего парня!

Это сбережет новичку нервы, а опытному сотруднику время.

Уметь в  Linux

Очень важно знать консоль и работу с Линуксом. Хорошее знание SSH, настройки хостов в nginx, да и много чего — пригодилось практически с первого дня. Даже чуток помог другому новичку. Кстати почти вся команда разработчиков работает либо под Убунтой, либо под Мак-ОС.

Уметь в автоматические тесты

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

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

Тесты нужны, тесты важны, тесты сложны!

Первый опыт работы с учеником

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

Бывалый верстальщик показывает как верстать с помощью БЭМ, Богданов И., 1893 год

Зачем взял помощника

Я посчитал, что если взять помощника, и через полтора-два месяца он сможет делать работу, то я смогу брать заказы по программированию и не заморачиваться с версткой и другой работой и при том нормально выучиться по программированию, плюс будет какой-никакой опыт командной работы — например через пару недель буду встраивать в нашу работу GIT, да и с какой стороны не посмотреть — это круто!

Единственным возражением было — ничего не выйдет. Но я посчитал, что это не причина  — если может не получиться, то теперь ничего никогда не пробовать?!

Как нанимал

Было 5 кандидатов — неплохо для зарплаты в 10 тысяч рублей:

  • была девушка, которая как раз собиралась найти работу для практики на лето, но ее по понятным причинам смутила работа на квартире у какого-то лысого мужика :) думаю — это нормально
  • был супер-парень, который учился на автоматизации оборудования, знал bash, Java и  C#, и вообще был матерый, в итоге он ушел в крупную компанию на стажировку, подтвердив этим свое умение думать :)
  • был матерый верстальщик, умеющий верстать пиксель в пиксель — мне показалось, что с его навыками зарабатывать 10 тысяч не совсем уместно...
  • и было два молодых не опытных парня, один закончил колледж по сварке (24 года) , другой студент-юрист (20 лет), оба примерно полгода изучали верстку — именно им и предложил встречу.

На встрече дал обоим тестовое простое задание на верстку — нужно было сделать 2 задания из 3. Оба выполнили задание еле-как, но жалею, что не дал никакого задания по математике — дело в том, что сначала позвал парнишку-сварщика, но он был слабоват в простейших математических операциях и не говорил о своих трудностях, говорил «сделаю» и не делал. Студент-юрист же наоборот — делал все с опережением, проявлял инициативу, но у него началась летняя практика, потому его не позвал на первый день работы.

В итоге взял парнишку постарше — за 3 дня до выхода дал задание как-нибудь сверстать для интернет-магазина страницы товара и категории, но первый день показал, что тяжело идет даже обычная математика — грубо говоря 100 разделить на 4 вызывали минутные задержки. Долго объяснял, как строится ХТМЛ-дерево, что такое классы и стили , когда и как нужно их применять, но я немного разочаровался и в итоге отказал после первого дня.

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

Обучение и работа

Сильно изменился подход к своей работе.

Джедай Mace Windu, фильм «Звездные войны»

Теперь стараюсь к каждому рабочему дню подготовиться и подготовиться заранее, даю стажеру максимально боевые задания:

  • сверстать адаптивную страницу товара и категории
  • сверстать мобильную страницу товара
  • сверстать слайдер

Причем само задание объясняю подробно, но некоторые вопросы опускаю на самостоятельное решение — вообще не лезу, например освоить OpenServer и Filezilla давал на дом.

Круто, что получается обучаться нам обоим. Например стажер спрашивает про флексы и гриды, а я говорю — делай все без них, в итоге понял, какого хера я торможу — дал ему волю и сам пытаюсь больше усвоить уже за ним. Он сразу же освоил инструменты автоматизации, например Emmet и хоткеи в Sublime — я в самом начале пути о них и не думал, помог ему только, как делать инклуды в  php, чтобы по сто раз не переделывать шапку например. Также раньше редко обращался к документации БЭМ — со стажером дело пошло шустрее, нужно было не просто понять, а еще и объяснить — в итоге материал быстро усвоился.

Помимо всего — основная работа пошла живее, запрограммировал расширенный личный кабинет в магазине, запустил оптовый сайт, изучил несколько крупных разделов по Yii 2. Постоянно идут вызовы — например решился конкретно взяться за LESS и SASS, самому мотивации не хватало — на следующей недели запланировал разобраться и сделать урок по ним.

Что не получается

Из-за работы не успеваю подготовить задания и описание урока и иногда игнорирую инициативы.
Приходится очень часто отрываться от работы — понял, что нужно готовить целые разделы и как-то упростить формат. Например нужно дать свободу в исполнении, но потом выделить время и объяснить разные подходы с плюсами и минусами.


Если не можешь объяснить что-то простым языком — значит ты сам не понимаешь этого в полной мере. Альберт Эйнштейн

Ищу стажера веб-разработчика

Меня зовут Максим Федоров и я руковожу в Новосибирске интернет-магазином одежды (оптовый и розничный) — программирую, автоматизирую работу и помогаю компании повысить продажи, а менеджерам автоматизировать рутину.



Мне нужен помощник для верстки и доработок + помимо работы нужен напарник для изучения фреймворков Yii 2 и Vue.js (или Реакт). Можно студент, желательно из технической специальности.

Мы будем верстать, исправлять баги, создавать лендинги и рассылки, писать первые модули — например парсеры, слайдеры, дорабатывать админку и делать первое REST API. Также изучать вместе со мной программирование и разрабатывать пару сервисов.

Требования:

  • HTML/CSS — уметь быстро сверстать страницу, очень круто если верстали адаптивно
  • PHP — хотя бы понимать, что такое переменные и как подключить файл, знать в теории, что такое массивы и функции, круто если в теории понимаете объектно-ориентированный подход
  • JS — хотя бы на уровне прикрутить плагин JQuery

Условия:

  • Работать будем у меня дома (р-н Пединститута) вместе с котом :-), нужно будет работать около 80-100 часов в месяц.
  • Оплата будет в районе 10-15 тысяч рублей за основную деятельность (интернет-магазин джинс) + возможна премия за хорошую работу
  • Если вы студент, то компания может поставить официальную летнюю стажировку
  • Как понимаете — ищу больше напарника, нежели подчиненного
  • Есть свободный ноутбук с Линуксом и VPS-сервер
  • Работать будем через Github (вместе будем настраивать), а задачи ставиться будут в Трелло и Гугл-Доксе
  • Книги и недорогие подписки за мой счет

По работе остро нужна помощь, если все будет хорошо — будет повышение зарплаты (уже не из моего пирога).

[ ! ] Ко всему прочему сыпятся иногда заказы — не всегда беру из-за занятости, тут прибыль пополам.

Обо мне

Я руководитель интернет-проектов. Мне 26 лет. Сам программирую на уровне джуниора и хорошо верстаю. Помогаю новичкам на форумах по верстке и не сложным доработкам по интернет-магазинам...

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



Читаю почту hello@maksfedorov.ru
И всегда Вконтакте

2017   Работа

Роутинг для PSR 7 Response/Request. Часть 2: Проектируем Router

Содержание:

Добавление правил

Придумываем объект маршрутизации и его метод для добавления правила маршрутизации, в который передаем наш путь, HTTP метод и анонимную функцию:

Поиск нужного правила

Чтобы понять, какой обработчик к нашему запросу относится — придумываем метод, в который мы передаем наш Request, а он сам будет производить проверку по правилам выше и возвращать результат, из которого мы сможем извлекать экшн (анонимная функция) и атрибуты — далее мы должны найденные атрибутты в правилах передать в экшн, точнее в объект Request.
По итогу это должно выглядеть так:

Дополнительные методы для добавления правил**

Прежде чем создавать код для объекта Router — думаем над тем, что можно упростить.
Для того, чтобы не указывать HTTP методы в параметрах, мы можем создать методы объекта Router с названием этих HTTP методов:

Это более удобно, не нужно заморачиваться, также будет работать автоподстановка.

Проблема — много методов

В итоге мы придумали кучу методов, и по итогу можно запутаться — какие методы относятся к масиву правил, а что относится к нему.

Для решения этого — роутер разделяем на 2 части: на коллекции роутов и сам роутер.
https://gist.github.com/Maksclub/e09b1f4ad82b53b813ceb8a3043a878b

Помимо упрощения использования — данное разделение позволяет его использовать надежнее, например потом в контроллере, используя объект Router, нельзя будет добавить маршрут, так как у него нет таких методов.

Генерация адресов

Помимо разбора адресов при разработке и поддержке проектов необходимо адреса генерировать.
Конечно в самих представлениях мы можем выводить жестко:

<a href="/blog/<?= $post->id?>">
    <?= htmlspecialchars($post->title)?>
</a>

Но если нам нужно поменять роуты с /blog/ на /post/ или в магазине /product/ на еще какой-нибудь, то придется в ручную менять во всех местах, что может вылезти косяками в работе проекта.

Тогда придумываем метод generate() для нашего объект Router, с помощью которого мы и будем выводить адреса по названию маршрута:

<a href="<?= $router->generate('название_маршрута', ['id' => $post->id]) ?>">
    <?= htmlspecialchars($post->title)?>
</a>

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

Укрощаем регулярное выражение в правилах

Громоздкие регулярные выражения не удобно записывать, а также метод генерации адреса с регуляркой не работает.

Тогда вместо:

$router->get('blog_show', '/blog/(?P<id>\d+)', ...);

Можно будет упрощенно использовать так:

$router->get('blog_show', '/blog/{id:\d+}', ...);

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

Как мы можем поступить:

  • Сам параметр указать чистым, а регулярное выражение передать отдельным параметром, например:
$router->get('blog_show', '/blog/{id}', ..., ['id' => '\d+']);
  • Сделать систему с необязательными параметрами, а сами параметры передавать как токены и задавать значения по умолчанию:
$router->get('blog_show', '/blog[/{page}]', ..., 
     [
         'tokens' => ['page' => '\d+'], 
         'default' => ['page' => 1],
]);

Будет делать именно второй вариант.

Ctrl + ↓ Ранее