13 вересня 2013

[Russian] 17 дней в Крыму

My Chemical Romance - Mama

Дорога

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

Из Киева в Крым GPS предлагал ехать через Смелу, Кировоград, Николаев, Херсон. Если я не ошибаюсь, это основная дорога в этом направлении. Но некоторые ее участки просто не предназначены для такого пользования. Первый момент - это очень узкий мост. На нем даже две легковые машины не поместятся одновременно. Но самая большая боль автомобилиста - участок дороги с полным отсутствием дороги. Google считает, что его можно проехать за 20 минут. Реально же это займет чуть меньше часа. Компьютер в машине мне показал, что средняя скорость на этом участке у меня была 25 км/ч. Если водитель любит свой автомобиль, быстрее ехать не будет. Обочина здесь ровнее самой дороги. И даже рейсовые автобусы едут по встречной обочине...

"Как ты, Бель?" ©


21 липня 2013

[Russian] Авто-тест, запускающий себя через GitHub

Сразу хочу предупредить, что данный код писался для собсвенного удовольствия и практического применения не имеет. Авто-тест открывает в браузере GitHub репозиторий самого себя, находит свой код на странице - и запускает его. Для написания авто-теста использовался PHPUnit, phpunit-selenium (Webdriver), и велосипед самописный "микро-фреймворк". Для ознакомления с реализацией, возможностями и скринкастом моего велосипеда прошу под кат.

Немного предыстории

Как показала практика, львиную долю времени при написании авто-тестов занимает написание и поддержка локаторов для элементов страниц, в каком бы виде они не были у вас представлены: XPath, CSS selector, etc. Почему бы не позволить добавлять, редактировать и удалять их прямо во время запуска теста? С этой идеи и началась разработка моего авто-фреймворка.

Что мой фреймворк умеет?

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

Покрыт unit-тестами. А также позволяет покрывать unit-тестами добавляемые классы страниц. Фреймворк старается следовать принципам SOLID, и класс страницы содержит тяжелый класс сессии (PHPUnit_Extensions_Selenium2TestCase) лишь как внешнюю зависимость.

Имеет все "плюшки" PHPUnit фреймворка. Нужен метод setUp() или tearDown()? - Пожалуйста. Нужен метод setUpBeforeClass() или tearDownAfterClass()? - Пожалуйста (В этом случае используется статический метод для создания объекта сессии). В любом из этих методов мы можем продолжать обращаться к selenium серверу.

Использует Composer для установки компонент. Вряд ли это можно преподносить как "фишку" (это уже мейнстрим). Но все же приятно в одну комманду иметь подготовленное для авто-тестов окружение.

Ну и самая главная фича моего маленького фреймворка - возможность редактировать локаторы в runtime. Нужно лишь у объекта страницы вызвать метод debug(). Авто-тест приостанавливает дальнейшее выполнение тест-кейса, открывает popup, позволяющий редактировать локаторы. Все изменения тут же попадают в файловую систему в сериализированном виде (предполагается, что в эти файлы нет нужды заглядывать). При закрытии popup окна тест автоматически продолжает свое выполнение. В общем, лучше один раз увидеть...

Пару слов о рекурсии...

Тех, кто не поленится склонить проект прошу обратить внимание, сколь мало усилий и изменений потребовалось, чтоб написать тест-кейс для двух страниц на GitHub. Файлы в папке var были сгенерированы с помощью описанной выше фичи фреймворка. При написании пришлось столкнуться с тем, что иногда при нажатии на папку/файл навечно зависает лоадер - и не подгружается контент выбранного элемента (для этого были добавлены try-catch блоки в код). Также на Firefox в данном тест-кейсе вылетает исключение "waiting for evaluate.js load failed" (на других сайтах, кроме GitHub, данной проблемы не было). Есть подозрение, что это баг Firefox драйвера, поскольку в Chrome все нормально. Сам тест-кейс определяет свой относительный путь в репозитории, идет по этому пути в GitHub, открывает raw (для упрощения) исходник самого себя, определяет, с какой по какую строчку нужно себя запустить, и запускает с помощью eval().

Послесловие

Четких планов по поводу дальнейшего развития "микро-фреймворка" нету. Как я уже писал выше, код писался лишь для собственного удовольствия. Но предложения, конструктивная критика и push-request-ы будут обязательно рассмотрены.

Скринкаст



P. S. Копия статьи на habrahabr.ru. Мой аккаунт ждет твоего инвайта.

19 листопада 2009

[Russian] SEO things

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

Первое, что делается при оптимизации сайта – это проставление мета-тегов на страницах. В частности keywords и description. Я не буду рассказывать, как подбирать содержимое этих тегов, потому как я не специалист в этом. Я лишь вставлял в них то, что требовал SEO-специалист. Насколько я знаю, для этих целей есть множество сервисов, но зачастую подбор этого содержимого – «танцы с бубном». От меня же, как от программиста, требовалось написать админку, с помощью которой можно было бы редактировать содержимое этих мета-тегов. Опираясь на личный опыт, скажу сразу, что этого недостаточно. Часто SEO-специалисту требовалось или исключить вообще какой-нибудь мета-тег (например, robots или copyright), или же поменять порядок их следования. Поэтому админка должна заранее учитывать эти возможности. Но нельзя предоставлять возможность специалисту SEO полностью вручную редактировать head страницы, поскольку в нём еще содержатся важные script и stylesheet – так однажды SEO-специалист вынес стили, предназначенные для IE за специальный тег-комментарий, применяющий код только к IE. Естественно, надо не забывать про кэширование этих мета-тегов, плейсхолдеры, но это уже отдельные темы.

Дубликаты. Очень важно, чтоб ни один заголовок на страницах вашего сайта не повторялся. Также не должен повторяться текст в мета-теге description. Для отслеживания дубликатов на вашем сайте можно воспользоваться сервисом Google Webmaster Tools. Этот сервис также поможет отследить страницы на вашем сайте, открывающиеся слишком долго, а также содержащие ссылки на 404 страницу, что тоже полезно для оптимизации сайта.

Site maps. Проще всего гуглу дать знать о том, какие страницы есть на вашем сайте с помощью карты сайта. Для этого создаётся и регулярно обновляется файл с картой сайта в формате XML. На нашем сайте было 2 файла с картами сайта: sitemap.phpXML формат и sitemap.txt. В последнем файле было просто множество самых часто посещаемых ссылок сайта, каждая в новой сточке – честно, не знаю, зачем нужен этот файл.

W3C validation. Сейчас уже почти все сайты следят, чтоб их HTML код был «валидным». Как минимум, это помогает правильному одинаковому отображению страниц во всех браузерах. Но не стоит забывать, что на SEO оптимизацию это также влияет. С «невалидным» кодом мне пришлось столкнуться в теге embed. Это ошибка, которую часто можно встретить на сайтах – в тег embed вставляют атрибуты, которые не предусмотрены спецификацией. Как правильно преобразовать embed в object можно прочитать здесь.

Иерархия HTML тегов, в частности, заголовков h1-h7. В зависимости от структуры сайта могут быть нюансы. Так, например, заказчик требовал, чтоб подзаголовок страницы, который у нас находился в теге h2 также не повторялся на разных страницах.

Статьи. Давно уже не секрет, что уникальный контент приветствуется поисковиками. Именно потому важно иметь на сайте «качественный» вручную наполненный текст. Это могут быть статьи, блог, форум. Но главное, чтоб текст больше не встречался нигде в интернете.

Правильные url. Часто можно видеть на сайтах ссылки вида http://example.com/dir/subdir/subsubdir/sssdir/ssssdir/1/2/3. Но это неправильно с точки зрения SEO. Допустим, pagerank страницы http://example.com/ будет 4, тогда pagerank страницы http://example.com/dir/ будет не больше 4, а pagerank страницы http://example.com/dir/subdir/ не больше, чем pagerank страницы http://example.com/dir/ и т. д. То есть, если мы хотим увеличить pagerank наших страниц, достаточно просто вынести их на внешний уровень. Нашу ссылку можно, например, сделать такой: http://example.com/dir-subdir-subsubdir-sssdir-ssssdir-1-2-3.

Long tail keywords. Есть много статей, посвященных этой оптимизации. Поэтому останавливаться на ней отдельно не буду. Подчеркну лишь, что это способ завоевать трафик благодаря более специфическим для сайта запросам.

Pagination. Каждый сайт, имеющий достаточно большое количество страниц, наверняка имеет пейджизацию. Здесь я не скажу ничего нового – всё уже сказано выше, только специфика пейджизации объединяет несколько пунктов:
  • дублирование страниц; у вас не должно быть две первых страницы, как это есть на многих сайтах; например, http://example.com/archive/ и http://example.com/archive/1 – одна и та же страница, а url разный, соответственно, поисковик считает, что у вас на сайте 2 одинаковых страницы; выход – убрать с сайта одну из двух страниц, не забыв, где надо, подредактировать ссылки;
  • дублирование заголовков; чтоб избежать этого, часто добавляют в заголовок страницу, например, “Альбом песен”, “Альбом песен – 2” и т. д.
  • правильные url; например, лучше http://example.com/archive-2, чем http://example.com/archive/2/ и т. д.
  • «пустой» контент; не должно быть страниц, не имеющих содержательной части; например, если у вас за 21е число нет ни одной записи (видео/объявления – в зависимости от того, чем наполнен сайт), то вместо страницы за 21е число должна быть 404 страница, и ссылок на неё не должно быть также.

Nice/Clean urls. Суть этого пункта состоит в том, чтоб делать url-ы в браузере более «человечными». То есть, имея на сайте базу с видео, правильным будет использовать в url-ах страниц на видео названия этих видео, а не id из базы. Например, ссылка http://example.com/when-it-was-me-paula-deanda.htmlболее удачная, чем http://example.com/video-702032.

Есть еще много вещей в SEO, о которых я здесь не написал. Поскольку, во-первых, всё, что есть в SEO в одну статью поместить нереально, во-вторых, как я говорил, я не специалист в SEO, потому о многих вещах могу не знать. Так, например, у нас на сайте были ссылки “previous/next day”, которые SEO-специалист попросил изменить на “previous/next day videos” (поскольку сайт был посвящен видео). Потому я не советую полностью отказываться от помощи специалистов по SEO, им лучше знать, что на вашем конкретном сайте можно еще улучшить.