Архив рубрики: Uncategorized

Проверка адреса электронной почты

Обычно в коде мы проверяем адрес электронной почты только с помощью регулярки. Но этого не всегда бывает достаточно.

У меня возникла проблема с Amazon SES, когда я по старой базе данных решил сделать небольшую рассылку. После отправки всего 5000 писем у меня bounce-rate поднялся почти до 40% и мой аккаунт заблокировали.

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

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

Класс доступен на github.com и phpclasses.org.

MySQL 5.6 Developer

Сегодня я успешно сдал экзамен MySQL 5.6 Developer 1Z0-882. И теперь жду, когда же мне присвоят Oracle Certified Professional, MySQL 5.6 Developer.

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

Сначала прочитал MySQL 5.0 Certification Study Guide (купил ее два года назад, тогда собирался сдавать соответствующий экзамен). Потом порылся немного в интернете и нашел два очень полезных поста:

Ну, и далее мануал, мануал, мануал.

Из рекомендаций:

  • обращайте внимание на детали синтаксиса и особенности поведения
  • находите и проходите тесты
  • больше практики
  • хорошо спите, особенно накануне экзамена

Upd. Мой сертификат (PDF).

Разработка приложения с помощью Zend Framework 2

1. Приложение необходимо разбивать на модули. Модуль включает в себя какую-то сущность и связанные с ней действия. Например, это может быть пользователь и контроллеры, отвечающие за вход/регистрацию, личный кабинет (настройки) и управление пользователями. Раньше я, разумеется, использовал модульность, но, как правило, модуль был достаточно весомым, он включал хоть и независимую (относительно) часть приложения, но все же там могли оказаться, например, и пользователи, и форум. Предложенная модель модулей в ZF2 предполагает соблюдения принципа единственной ответственности на более высоком уровне (по сравнения с классом или методом).

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

3. Dependency Injection — об этом много и давно говорится на просторах интернета. Я рассматриваю DI с точки зрения удобства модульного тестирования, когда любую зависимость можно легко подменить моком. Например, при тестировании класса, взаимодействующего с базой данных, вам не хочется делать реальные запросы, так как вы тестируете в данный момент вовсе не это.  С другой стороны DI делает код более гибким, когда изменить используемый алгоритм не составит труда — нужно лишь передать новый объект, который будет реализовывать тот же интерфейс. Например, для создания пароля вам захочется изменить алгоритм на более надежный.

Как отправить процесс в фоновый режим?

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

Но на деле все гораздо проще.

Нажимаем Ctrl + Z (приостановить процесс) и набираем:

bg

Готово. Теперь процесс продолжил выполнение в фоновом режиме.

Обновление PHP в Mac OS X

Сегодня мне рассказали про очень простой способ обновить PHP на локальной Mac OS X.

Шаг 1. Сначала необходимо установить Xcode, если вы этого до сих пор не сделали. Запускаем его, идем в меню XcodePreferences… и выбираем тут закладку Downloads. Жмем «Install» напротив Command Line Tools. Шаг 1 завершен, в дальнейшем при очередном обновлении этого делать уже не потребуется.

Шаг 2. Снова, если не было это сделано ранее, устанавливаем Homebrew. Для этого достаточно выполнить команду:
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

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

Шаг 3. Переходим непосредственно к установке новой версии PHP. По адресу http://php-osx.liip.ch есть небольшой сайтик посвященный утилите для установки PHP. Смотрим раздел «One Line Installation» и копируем оттуда команду, соответствующую желаемой версии интерпретатора. Например, для PHP 5.4 это будет:
curl -s http://php-osx.liip.ch/install.sh | bash -s 5.4

Сегодня он установил мне PHP 5.4.15, который является самой последней версией в данной ветке.

Тут необходимо заметить, что эта утилитка не заменяет установленный в системе PHP, поэтому по умолчанию будет работать старая версия. Чтобы это исправить нужно отредактировать (или создать) файл .profile, который находится в вашей домашней директории (то есть ~/.profile). В этот файл нужно добавить строчку, которая изменит путь поиска бинариков:
export PATH=/usr/local/php5/bin:$PATH

После этого нужно перезапустить терминал (или перелогиниться в нем), чтобы изменения вступили в силу.

Меняем историю

На работе мы имеем дело c git и github. Чтобы не захламлять историю нашего основного репозитория на гитхабе, мы решили соединять коммиты перед пулл-реквестом.

То есть вместо истории:
9fc47c08e9d70cdd33768eff1dd0c4ea95c95a7f Создал класс для фичи
69e87e4eee9bc656184a8e32c619625db0b2f51f Написал класс этой фичи
4644b4d8111fd6a9fb38087bfa9f869215ff842e Правлю баг…
4881c35c6d58e0453e737a06ae19d264acddf423 Правлю другой баг…
86861e363530a4924217e4a497a74b168beb157d Форматирование!
9680a87d2a86bb205615afeb6a9780fc7a914ef5 Все, теперь можно!

Мы получаем нечто вроде:
38b34074eb416155167b10c6914c95ee4c26d2e6 Фича такая-то. Описание особенностей.

Понятно, что так история выглядит намного приличнее и понятнее. Собственно, добиться этого просто. Разумеется, работа ведется в отдельной ветке (а то и форке). Изменения вносятся, коммитятся и, наконец, пушатся. А в какой-то момент задача полностью готова и хочется склеить коммиты.

Сначала мы сбрасываем текущее состояние до последнего общего с мастером коммита:
git reset --soft 3a1829e5f8d49cdc404df070133e5a64ccacdac2

Мы делали «мягкий» сброс, поэтому все наши изменения остались в коде, теперь мы должны из закоммитить:
git commit -a -m 'Message'

И, наконец, запушить новый коммит. Если не сделать —force, то это закончится неудачей.
git push --forсe

У способа есть минус — на деле эти ревизии сохраняются и их можно увидеть, посмотрев лог с указанием комиитов:
git log ff122876f2f5ad46b4c930a5889571e8b6db6913…c66b0cf61e269809e2d655f10fa0a6f2294da405

Последние события

Как я писал ниже, я сменил место работы, но писать об этом в блоге пока что не хочется. Поэтому пришлось придумать повод — я записался на мастер-классы по веб-разработке. Это может показаться смешно, так как я и сам, наверное, мог бы их вести и даже для более подготовленных слушателей, чем присутствовали вчера на первом занятии. Проводт эти мастер-классы ака семинары Барс-групп, стоят они всего 2500 рублей. Длительность месяц, занятия каждый понедельник и четверг.

Как я уже сказал, для меня интересного тут будет мало. (Единственное, может быть, эти семинары помогут как-то систематизировать мои отрывочные познания Питона и Джанго.) Во время занятия я попытался не засыпать, а представить себя новичком, который ничего не понимает. Как раз такой сидел рядом со мной. Я послушал ведущего и понял, что ничего не понял. То есть будь я подготовлен так же, как мой сосед, то многое мне осталось бы непонятным и неизвестным. К сожалению, было видно, что лектор подготовился плоховато, в некоторой мере его энергичность и готовность помочь компенсировали это. Последнее время часто смотрю лекции из зарубежных (преимущественно американских) университетов, которые мне очень нравятся. Так вот разница была не просто ощутима, она была колоссальна. Надеюсь, что дальше лекторы будут лучше подготовлены к семинарам.

Еще хотел заметить, что скоро будет две конференции, которые должны быть обязательно интересны всем веб-разработчикам — На стачку и DevConf. Надеюсь, увидимся там.

Мамба, до свидания!

Прошла зима, а вместе с ней завершилась и моя работа в казанском офисе Мамбы.
С 1 марта я начал трудиться в другой казанской компании, которая хорошо известна российской аудитории благодаря одному из своих проектов.

MacBook Pro & SSD

На днях я отмечал свой день рождения. По этому случаю Алексей Касаев подарил мне SSD на 120 Гб. Сам он давно установил на свой макбук 16 Гб оперативки и 250 Гб SSD — он, к сожалению, не заметил большой разницы в быстродействии системы после установки SSD, так как такой объем памяти решал, наверное, уже все проблемы.

У меня же максимальный объем оперативки, которую можно установить, 8 Гб. И еще, кажется, осенью прошлого года я ее установил. К сожалению, этот объем съедается приложениями всегда за день-два (а у меня нет привычки выключать/перезагружать бук), после чего Сафари, IDE, даже Finder начинают тормозить.

В общем, установил я SSD. Сразу заметно, что с ним система загружается во много раз быстрее! Так как диск установил только вчера, то про долгосрочный эффект написать ничего не могу, но, уверен, что и там прирост быстродействия системы будет заметен еще больше.

В общем, рекомендую!

Приложение для Мамбы

Многим в нашей стране известен сервис знакомств Мамба. Собственно, в этой компании я и тружусь последние полтора года (в сентябре 2012 будет два года). Несколько месяцев назад Мамба запустила платформу для приложений. Какое-то время мы с коллегой наблюдали за происходящим со стороны, а потом решили-таки сделать небольшое приложение. Надо заметить, что мы оба являемся PHP-разработчиками, хотя каждый из нас в той или иной степени знаком и с другими языками.

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

Разработка заняла довольно много времени — два месяца. Причиной тому то, что для написания клиентской части мы выбрали все тот же ActionScript (мы, наверное, и сейчас не сможем объяснить себе, с чем это было связано). На сервере крутился комет, написанный нами на Питоне, который управлял самим процессом общения с клиентской частью, ну а API было написано на PHP. Приложение получилось очень милое.

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

База пользователей стремительно росла, а вот онлайн нет. К сожалению, для работы нашего приложения требовался онлайн, а он не мог появиться, если его не будет. Получился такой порочный круг. Пользователь заходил, искал собеседника, не находил и покидал приложение. У нас были мысли создать ботов или еще что-то в этом роде, но в конечном счете мы признали поражение. Приложение называлось «Свидание вслепую».