четверг, 24 июня 2010 г.

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

Читая сегодня Хабр не смог удержаться, чтобы не процитировать золотые слова, с которыми я согласен на все 100%:

Программист должен проверять результат своей работы перед передачей в тестирование
«Моё дело писать код, а их дело проверять», «Ну а их-то зачем понанимали?» — можно услышать в таких командах. Это элементарное отсутствие гигиены, работа ради «отписаться». Где вы видели журналиста, который не перечитывает свою статью перед тем, как передать её в редакцию? Если в коллективе есть программист, который проповедует такой подход, его нужно как можно скорее ликвидировать. Какой бы он ни был классный специалист.

MySQL поиск и удаление дубликатов в таблице

Как найти и удалить дубликаты в таблице MySQL? - оказывается это довольно частый вопрос, возникающий на практике, особенно когда надо установить UNIQUE constraint.

Задачу поиска дубликатов в SQL-таблице всегда можно решить таким простым запросом:

SELECT login, COUNT(login) AS cnt
FROM users GROUP BY login
HAVING ( COUNT(login)>1 );

Этот запрос вернёт все дубликаты login из таблицы пользователей. Ситуация несколько искусственна, на практике врядли будут дубликаты логинов в таблице пользователей, но для примера запроса сгодится.
Другой вариант, возможно более прост для понимания, при SELECT-е сделать простой JOIN таблицы самой на себя. К примеру, есть таблица scriptsettings с настройками какого-то скрипта, в ней нужно найти все дубликаты, где param (имя параметра) и group (логическое название группы параметров) дублируются. Запрос через JOIN примет вид:

SELECT s1.id AS id1, s1.group, s1.param, s2.id AS id2 FROM scriptsettings s1
INNER JOIN scriptsettings s2 ON s2.id>s1.id AND s1.param=s2.param AND s1.group=s2.group;

Удаление дубликатов из таблицы так же можно сделать простым JOIN таблицы самой на себя:

DELETE s1 FROM scriptsettings s1, scriptsettings s2 WHERE s1.param=s2.param AND s1.id>s2.id;

Пока писал, в голову пришёл более лаконичный и элегантный способ удаления дубликатов при помощи MySQL:

ALTER IGNORE TABLE scriptsettings ADD UNIQUE INDEX(param);

среда, 16 июня 2010 г.

Regexp to replace placeholders at string (замена плейсхолдеров в строке на элементы массива)

Довольно часто встречается задача подстановок каких-либо значений из ассоциативного массива  в определённые места в строке. Думаю, многие повседневно сталкиваются с ней при формировании персонализированных email-писем, формировании мультиязычных сообщений пользователю с подстановками из личных данных и других повседневных задачах.
Задача замены плейсхолдеров, или так называемых меток-заполнителей, в строке на соответствующие элементы ассоциативного массива может быть решена несколькими способами, но, на мой взгляд, самый элегантный способ - при помощи preg-а (регулярных выражений).
Допустим, у нас есть ассоциативный массив с подстановками $placeholders, и строка $str c метками-заполнителями вида {var_name}, в которой нужно произвести замену на соответствующие значения из массива. Решение на PHP будет выглядеть следующим образом:
$placeholders = array("name"=>"User", "link"=>"http://webaurum.blogspot.com");
$str = "Hello {name}, you are here {link}";
echo preg_replace('~\{\w+\}~e', '@$placeholders$0', $str);
echo preg_replace( '/\{(\w+)\}/e', '@$placeholders["\\1"]', $str);
Две последние строки абсолютно идентичны по функциональному назначению, я их просто привёл для примера, может кому-то будет понятнее второй вариант. Обе последние строки вернут результат:
Hello User, you are here http://webaurum.blogspot.com
Реализация работает быстро и элегантно, использую во многих собственных проектах.

Рекоммендую

Попробуйте надёжный хостинг от Scala Hosting