Что узнал за день

Standard

1) Если в sql таблице есть столбец со значениями вместе с null и мы хотим отсортировать таким образом, что строки с null значением будут идти после примитивных типов (45, 4662, 113 и т.д.) нужно сделать так: … ORDER BY ISNULL(col1), col1

2) Псевдокласс :first-letter работает только для block элементов, не inline ! Поэтому скорей все придется переводить a теги в display: block

3) Плюсы паттерна Singleton:

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

Новое в chrome developer tools

Standard

Вчера была сессия на Google IO 2013 посвященная Ghrome developer tools, сегодня выложили видео. Что понравилось: workspaces, canvas performance recording, поддержка sass.

Ниже видео выступления на google io + еще пара недавних видео о dev тулзах.


Кстати, то расширения для хрома для удобной работы с android лежит здесь: https://github.com/repenaxa/ADBPlugin


Верстка под ipad

Standard

Меняю верстку сайту, при работе с ipad выплывает много тонкостей:

  1. Телефоны на ipad отображаются синим цветом, как ссылки. => добавьте <meta name=»format-detection» content=»telephone=no» />
  2. Input и submit кнопки закруглены, хотя по стилям так быть не должно. Задайте правило => input, textarea {
    -webkit-appearance: none;
    -webkit-border-radius: 0;
    }
  3. Для div`ов бывают артифакты в виде серых полос по краям (border). Добавьте <meta name=»viewport» content=»initial-scale=1, maximum-scale=3″>

Если крон запускается не в то время

Standard

У меня в кронтабе стояла такая строка:
0 1 * * * /var/www/def/symfony parse >> /var/www/def/parser.log
запускался скрипт в 5 часов по нашему, это было вызвано двумя причинами.
Первая — надо обновить дистрибутив (apt-get update && apt-get upgrade)
Вторая — крон запускается (на debian) почему то по UTC времени, мне надо было запускать по Москве. Открыл /etc/default/cron, добавил строку «TZ=’Europe/Moscow’, перезагрузил крон (/etc/init.d/cron restart) и все заработало.

Как отсортировать записи в таблице по Enum полю

Standard

Есть пара способов, как отсортировать enum:

  1. Если вы хотите отсортировать в алфавитном порядке, используйте CONCAT:
    SELECT * FROM SomeTable ORDER BY CONCAT(ENUM_FIELD);
  2. Если надо использовать определенный порядок:
    ORDER BY FIELD(ENUM_FIELD, 'FIRST_VAL', 'SECOND_VAL', 'THIRD_VAL');
  3. Еще один случай, к примеру вам надо отсортировать следующим образом: есть столбец column, первыми идут значения ‘red’, затем любые кроме ‘yellow’ в конце ‘yellow’, внутри каждой группы сортировать по столбцу name :
    ORDER BY CASE color
    WHEN 'YELLOW' THEN 3
    WHEN 'RED' THEN 1
    ELSE 2
    END, name

Это все проверено на mysql, я видел в инете люди ругались на 3 решение используя db2 базу данных.

Блоги о highload от компаний

Standard

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

  1. Amazon Web Services
  2. Zynga
  3. Flickr
  4. Facebook
  5. Twitter
  6. Foursquare
  7. LinkedIn
  8. Tumblr
  9. Pinterest
  10. Reddit (иногда бывают тех. посты)
  11. Ebay

Ускоряем вордпресс

Standard

Для блога сделал очередное улучшение: теперь fancybox файлы вставляются в html, в том случае, если в посте есть изображения.
Зачем ? Чтобы, блог быстрее работал у конечного пользователя — уменьшая количество загрузок (особенно скриптов) мы ускоряем наш сайт.
Внутри header.php в head тегах вставьте следующий код:

<head>
<? if(!is_front_page()):?>
#SOME CODE
<? endif;?>
</head>

Там где, #SOME CODE можно расположить все стили и скрипты к-ые нужны только в посте, к примеру код комментариев ВКонтакте, fancybox, подсветку синтаксиса и тд.
Вот весь код, к-ый вставляет скрипты или стили, если есть картинки:

<?
$content = $post->post_content;
$searchimages = '~]* />~';
preg_match_all( $searchimages, $content, $pics );
$imgs_num = count($pics[0]);
// Если у нас есть картинки - грузим fancybox
if($imgs_num > 0): ?>
<!-- ВСТАВЛЯЕМ СЮДА СВОИ ФАЙЛЫ -->
<? endif; ?>

Как бороться с segmentation fault в simple_html_dom

Standard

Иногда бывает что ваш скрипт выдает ошибку segmentation fault (ошибка сегментации) и завершает свою работу. Скорей всего ошибка в комбинации ваших расширений к пхп, попробуйте оставить только те расширения, к-ые необходимы для скрипта. Если все ок — найдите расширение, к-ое глючит и попробуйте обновить либо само расширение, либо библиотеку, к-ую оно использует.

Но к сожалению у меня эта ошибка возникала на нескольких компьютерах с разными версиями php и комбинацией расширений. Причина была в библиотеке для парсинга simple_html_dom, пробовал Nokogiri, Zend_Dom — все равно, лучше simple_html_dom ничего нету. При больших объемах обрабатываемого html кода, например внутри цикла, возникает segmentation fault. Возможное решение — разместите следующий код в конце итерации (если парсинг идет в цикле):

$simple_html_object->clear();
unset($simple_html_object);

Строка выше помогает бороться с потреблением памяти, но полностью ошибку segfault не решает. Причина кроется на 143 строке (в классе simple_html_dom_node):
// clean up memory due to php5 circular references memory leak...
function clear()
{
$this->dom = null;
$this->nodes = null;
$this->parent = null;
$this->children = null;
}

Данная функция вызывается деструктором simple_html_dom_node класса, и когда подходит его очередь для garbage collector`a происходит segfault (в некоторых случаях).
Есть открытый bug на sourceforge, люди советуют сделать так:
// clean up memory due to php5 circular references memory leak...
function clear()
{
unset($this->dom);
unset($this->nodes);
unset($this->parent);
unset($this->children);
}

Но мне и это не помогло, решил сделать быстро и тупо => закомментировать все строки внутри clear функции. В итоге потребление памяти увеличилось, к примеру раньше было стабильно 20 мегабайт, теперь — при парсинге около 1000 страниц потребление где-то 1 гагабайт, зато без segfault`а :)!

Doctrine 1.2 и Symfony 1.4 советы

Standard

Чтобы вставить несколько записей за раз, сделайте такую штуку:

но на всякий пожарный коллега здесь реализовал это через наследование Doctrine_Query. Возможно его реализация быстрее.
Как делать миграции:

  1. Измените schema.yml
  2. Запустите ./symfony doc:generate-migrations-diff
  3. ./symfony doc:migrate
  4. ./symfony doc:build —all-classes

Как предотвратить удаление записи в doctrine:

public function preDelete(Doctrine_Event $event){
$event->skipOperation();
}

Либо назначить свой Listener чтобы предотвратить удаление:

$userTable = Doctrine_Core::getTable('User');
$userTable->addRecordListener(new HydrationListener());