LiveStreet LiveStreet — открытый блоговый движок по функционалу напоминающий Хабр. Особенно рекомендую новичкам для изучения внутренностей в плане правильной архитектуры. Все слышали про MVC, видели красивые схемы в книжках, но для практики нужно посмотреть LiveStreet. И ни в коем случае нельзя изучать архитектуру движков по WordPress — там полнейший ад из сотен инклудов, функций и PHP, перемешанного с HTML и SQL-запросами.

Иногда заглядываю в логи на предмет ошибок. Очень часто, порой до половины логов, остаются следы ботов-парсеров. В основном ищут известные CMS, вход в админку, форумы (видимо для дальнейшего спама)

/bitrix/admin/
/nulled_cms/
/nulled/
/crossdomain.xml
/hostcmsfiles/main.js
/cgi-bin/CMS

(далее...)

Студия Лебедева использует свою собственную CMS Imprimatur. Есть плюсы и минусы (минусов много), но одна мелкая деталь мне понравилась в плане юзабилити. Удаленные записи выводятся перечеркнутыми (тег <strike> или аналог css "text-decoration: line-through").

Студия Лебедева юзабилити

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

SELECT DISTINCT B.TYPE_SID, B.ID BANNER_ID, B.WEIGHT BANNER_WEIGHT,
B.SHOWS_FOR_VISITOR, B.FIX_CLICK, B.FIX_SHOW, B.KEYWORDS BANNER_KEYWORDS,
C.ID CONTRACT_ID, C.WEIGHT CONTRACT_WEIGHT, C.KEYWORDS CONTRACT_KEYWORDS
FROM b_adv_type T
INNER JOIN b_adv_banner B ON ( B.ACTIVE='Y' and B.TYPE_SID = T.SID
and B.STATUS_SID = 'PUBLISHED'
and (B.FOR_NEW_GUEST is null or B.FOR_NEW_GUEST='N')
and (ifnull(B.MAX_SHOW_COUNT,0)>ifnull(B.SHOW_COUNT,0)
or ifnull(B.MAX_SHOW_COUNT,0)=0) and (ifnull(B.MAX_CLICK_COUNT,0)>ifnull(B.CLICK_COUNT,0)
or ifnull(B.MAX_CLICK_COUNT,0)=0) and (ifnull(B.MAX_VISITOR_COUNT,0)>ifnull(B.VISITOR_COUNT,0)
or ifnull(B.MAX_VISITOR_COUNT,0)=0) and (B.DATE_SHOW_FROM<=now() or B.DATE_SHOW_
FROM is null or length(B.DATE_SHOW_FROM)<=0) and (B.DATE_SHOW_TO>=now()
or B.DATE_SHOW_TO is null or length(B.DATE_SHOW_TO)<=0))
INNER JOIN b_adv_banner_2_site BS ON ( BS.BANNER_ID = B.ID and BS.SITE_ID = 'ru')
INNER JOIN b_adv_contract C ON ( C.ID = B.CONTRACT_ID and C.ACTIVE='Y'
and (ifnull(C.MAX_SHOW_COUNT,0)>ifnull(C.SHOW_COUNT,0)
or ifnull(C.MAX_SHOW_COUNT,0)=0) and (ifnull(C.MAX_CLICK_COUNT,0)>ifnull(C.CLICK_COUNT,0)
or ifnull(C.MAX_CLICK_COUNT,0)=0)  and (ifnull(C.MAX_VISITOR_COUNT,0)>ifnull(C.VISITOR_COUNT,0)
or ifnull(C.MAX_VISITOR_COUNT,0)=0) and (C.DATE_SHOW_FROM<=now() or C.DATE_SHOW_
FROM is null or length(C.DATE_SHOW_FROM)<=0) and (C.DATE_SHOW_TO>=now()
or C.DATE_SHOW_TO is null or length(C.DATE_SHOW_TO)<=0))
INNER JOIN b_adv_contract_2_site CS ON ( CS.CONTRACT_ID = B.CONTRACT_ID and CS.SITE_ID = 'ru')
INNER JOIN b_adv_contract_2_type CT ON ( CT.CONTRACT_ID = C.ID
and (CT.TYPE_SID = 'ALL' or CT.TYPE_SID = T.SID))
INNER JOIN b_adv_banner_2_weekday BW ON ( BW.BANNER_ID = B.ID
and BW.C_WEEKDAY='SUNDAY' and BW.C_HOUR = '11')
INNER JOIN b_adv_contract_2_weekday CW ON ( CW.CONTRACT_ID = C.ID
and CW.C_WEEKDAY='SUNDAY' and CW.C_HOUR = '11')
LEFT JOIN b_adv_banner_2_group UG1 ON ( (UG1.BANNER_ID = B.ID and UG1.GROUP_ID in (2,1,21)) )
LEFT JOIN b_adv_banner_2_page BP1 ON ( BP1.BANNER_ID = B.ID and BP1.SHOW_ON_PAGE='Y')
LEFT JOIN b_adv_banner_2_page BP2 ON ( BP2.BANNER_ID = B.ID and BP2.SHOW_ON_PAGE='N'
and '/e-store/books/index.php?SECTION_ID=145' like concat(BP2.PAGE, '%'))
LEFT JOIN b_adv_contract_2_page CP1 ON ( CP1.CONTRACT_ID = C.ID and CP1.SHOW_ON_PAGE='Y')
LEFT JOIN b_adv_contract_2_page CP2 ON ( CP2.CONTRACT_ID = C.ID and CP2.SHOW_ON_PAGE='N'
and '/e-store/books/index.php?SECTION_ID=145' like concat(CP2.PAGE, '%'))
LEFT JOIN b_adv_banner_2_stat_adv BA ON BA.BANNER_ID = B.ID
LEFT JOIN b_adv_banner_2_country BC ON BC.BANNER_ID = B.ID WHERE T.ACTIVE = 'Y'
and BP2.ID is null and CP2.ID is null
and (BP1.ID is null or '/e-store/books/index.php?SECTION_ID=145' like concat(BP1.PAGE, '%'))
and (CP1.ID is null or '/e-store/books/index.php?SECTION_ID=145' like concat(CP1.PAGE, '%'))
and (BA.STAT_ADV_ID is null or BA.STAT_ADV_ID='0')
and (BC.COUNTRY_ID is null or BC.COUNTRY_ID='N0')
and ( (B.SHOW_USER_GROUP = 'Y' and UG1.GROUP_ID is not null)
or (B.SHOW_USER_GROUP <> 'Y' and UG1.GROUP_ID is null))
ORDER BY B.TYPE_SID desc, C.ID desc

У Битрикса одна из лучших админок, но внутри полный пиздец. Как это работает на больших таблицах?
Например, не понятно зачем делать потенциально числовые поля строковыми: CP1.SHOW_ON_PAGE='Y'

Drupal 24 апреля в офисе Мастерхоста прошел бесплатный семинар по Drupal. Было довольно интересно. Рассказывали с нуля: что такое, как ставить, основные особенности. Народу пришло немного, впрочем, зал был рассчитан на 50 человек и был почти полным. Порадовал мастер-класс по созданию ресурса аля Хабр. Вот что из этого вышло http://shvabrashvabr.ru

английский язык для начинающих
Ашманов Египет Москва РХТУ Россия США Снежинск Таиланд Тушино Урал Челябинская область Яндекс алкоголь английский язык баги база данных безопасность бизнес блоги взлом видео выставка выходные горные лыжи дайвинг дауншифтинг допинг идиотизм инвентарь интернет книги кэширование мозг море музей ноутбук образование оптимизация отдых отпуск пароль плагин пора сваливать программирование программисты путешествия работа работоспособность радиация реклама самогоноварение собеседование социальные сети спам стартап статистика страны тайм-менеджмент техника учеба фантастика фото фриланс хакер экология электронные деньги юмор Ajax CMS DbSimple DDOS email FireFox Google honda htaccess HTML javascript jQuery life md5 MySQL PHP SEO soft SQL vkontakte Web web 2.0 wordpress