Чтобы было понятно, на чём следует концентрироваться при оптимизации, слайд из доклада «Создание программных систем в Google и его уроки»:
Роман @Solovej
Пользователь
ООП с примерами (часть 2)
5 min
680KВолею судьбы мне приходится читать спецкурс по паттернам проектирования в вузе. Спецкурс обязательный, поэтому, студенты попадают ко мне самые разные. Конечно, есть среди них и практикующие программисты. Но, к сожалению, большинство испытывают затруднения даже с пониманием основных терминов ООП.
Для этого я постарался на более-менее живых примерах объяснить базовые понятия ООП (класс, объект, интерфейс, абстракция, инкапсуляция, наследование и полиморфизм).
Первая часть посвящена классам, объектам и интерфейсам.
Вторая часть, представленная ниже, иллюстрирует инкапсуляцию, полиморфизм и наследование
Для этого я постарался на более-менее живых примерах объяснить базовые понятия ООП (класс, объект, интерфейс, абстракция, инкапсуляция, наследование и полиморфизм).
Первая часть посвящена классам, объектам и интерфейсам.
Вторая часть, представленная ниже, иллюстрирует инкапсуляцию, полиморфизм и наследование
+24
Тестирование PayPal Direct Recurring Payments. Проходилка квеста
2 min
9.2KЕсли Вы собираетесь прикручивать на сайте поддержку оплаты через PayPal, а точнее Website Payments Pro (WPP), а точнее Direct Recurring Payments, то скорее всего вы уже ознакомились с документацией от самого сервиса: Integrating Recurring Payments.
Но если Вы раньше не прикручивали именно этот тип платежей, то Вы, наверняка, ещё не подозреваете о некоторых особенностях его тестирования.
Но если Вы раньше не прикручивали именно этот тип платежей, то Вы, наверняка, ещё не подозреваете о некоторых особенностях его тестирования.
+22
Как верстать красиво или чем плохи css-фреймворки
8 min
33KПреимущества дивной вёрстки, семантичной разметки и разделения содержимого и дизайна описаны десятки, сотни раз, но все-равно находятся люди, которые не понимают самой идеи html и css, пишут в коде такие ужасные вещи, как
, когда хотят расскасить текст в синий цвет и искренне считают, что эта запись чем-то лучше, чем
, наивно веря в этом деле валидатору. А ведь правильный подход в написании html и css лежит на поверхности. Достаточно просто посмотреть историю развития этого языка, почитать статьи десятилетней давности и проанализировать. Я, при поддержке theshock, постаралась в этот статье упорядоченно и коротко изложить наше видение этого вопроса.
<span style="color:blue">
, когда хотят расскасить текст в синий цвет и искренне считают, что эта запись чем-то лучше, чем
<font color="blue">
, наивно веря в этом деле валидатору. А ведь правильный подход в написании html и css лежит на поверхности. Достаточно просто посмотреть историю развития этого языка, почитать статьи десятилетней давности и проанализировать. Я, при поддержке theshock, постаралась в этот статье упорядоченно и коротко изложить наше видение этого вопроса.
+132
Определение кодировки текста в PHP — обзор существующих решений плюс еще один велосипед
7 min
104KСтолкнулся с задачей — автоопределение кодировки страницы/текста/чего угодно. Задача не нова, и велосипедов понапридумано уже много. В статье небольшой обзор найденного в сети — плюс предложение своего, как мне кажется, достойного решения.
Если кратко — он не работает.
1. Почему не mb_detect_encoding() ?
Если кратко — он не работает.
+93
Автоинкрементные первичные ключи (суррогатные ключи) = зло?
7 min
26KВ этой статье я приведу взгляд (отрицательный по большей части) Джоша Беркуса, CEO компании PostgreSQL Experts Inc. на использование суррогатных ключей для таблиц базы данных, тех самых INT NOT NULL AUTO_INCREMENT PRIMARY KEY, к которым мы привыкли. Фактически, это будет вольный, сильно сокращенный перевод его статьи на ittoolbox.
За статьей последует разбор моих собственных ошибок по этой теме, допущенных в одном старом проекте. Я был молод и глуп, но это меня не извиняет.
Честно говоря, прочитав эту статью и не заметив, кто автор, я подумал, что он все же преувеличивает и вообще, я без него как-нибудь разберусь, где и какие ключи мне использовать. Потом я еще немного подумал и полез за дампом структуры базы моего старого проекта. Было интересно.
Если вы опытный DBA, наверное, вам стоит пройти мимо, чтобы не расстраиваться.
Но обо всем по порядку. Сначала ОЧЕНЬ сокращенный перевод:
За статьей последует разбор моих собственных ошибок по этой теме, допущенных в одном старом проекте. Я был молод и глуп, но это меня не извиняет.
Честно говоря, прочитав эту статью и не заметив, кто автор, я подумал, что он все же преувеличивает и вообще, я без него как-нибудь разберусь, где и какие ключи мне использовать. Потом я еще немного подумал и полез за дампом структуры базы моего старого проекта. Было интересно.
Если вы опытный DBA, наверное, вам стоит пройти мимо, чтобы не расстраиваться.
Но обо всем по порядку. Сначала ОЧЕНЬ сокращенный перевод:
+56
Как подружить PHP с консолью Google Chrome
2 min
21KВнимание
Статья содержит информацию об устаревшей версии PHP Console.О новой версии PHP Console 3.0 читайте тут.
PHP Console 1.0
![](https://habrastorage.org/getpro/habr/post_images/de6/085/d74/de6085d7427af9e952c2331678df8d79.png)
Речь пойдёт об одном чудном расширении для Google Chrome, которое позволяет проксировать вывод ошибок и дебаг сообщений из PHP в консоль Google Chrome, а также отображать их в виде всплывающих popup-уведомлений.
+97
Как создать вебсайт для мобильных устройств
3 min
64KСтили
User Agent
Один из способов включения стилей для мобильного устройства — это использование User Agent, которую получает сервер от клиента.
Этому может помочь набор скриптов: code.google.com/p/mobileesp, а также сервис от яндекса api.yandex.ru/detector
При работе с User Agent только одна проблема — это постоянно появляющиеся новые User Agent.
+123
Сервер подсчета кликов
2 min
3.2KЕсли ваш проект использует подсчет кликов и на нем есть какая-либо солидная нагрузка, то вы наверно задумывались об отдельном решении.
История разработки уходит в один проект торгово-рекламной площадки, где необходимо было учитывать кол-во переходов. Было решение на РНР. Но это давало видимую задержку в 0.5-1 сек, что очень раздражало разработчиков (в частности меня) и я думаю пользователей тоже.
По этому, когда пришлось разрабатывать аналогичный проект, мне пришлось искать альтернативы.
История разработки уходит в один проект торгово-рекламной площадки, где необходимо было учитывать кол-во переходов. Было решение на РНР. Но это давало видимую задержку в 0.5-1 сек, что очень раздражало разработчиков (в частности меня) и я думаю пользователей тоже.
По этому, когда пришлось разрабатывать аналогичный проект, мне пришлось искать альтернативы.
+58
Goozzy.com — год спустя
2 min
4.9KЗдравствуйте, дорогие друзья.
![image](https://habrastorage.org/getpro/habr/post_images/fce/23f/c24/fce23fc24466de7cbdeccc5dc6bf4f23.png)
Сегодня Вам будет повторно рассказано о стартапе. Повторно и год спустя. Очередной «перспективный» стартап, заглохший в самом начале пути, — подумаете вы. Но я прошу Вас не торопиться с выводами и прочитать нашу историю до конца и, быть может, стать частью этой истории.
Возможно, вы помните, как летом 2009 года появилось сразу несколько проектов, посвященных стикерам, прикрепляемым к конкретным точкам web-страниц. Первым таким проектом был как раз наш проект Goozzy с гуззеничками, сгуззтками и кнопкой «Гуззнуть». Набрав пару тысяч пользователей за первую неделю, мы узнали, что проект тормозит, что наш язык никому не понятен, что «это, вот это и вон то» не продумано. В общем, завоевать мир за пару месяцев нам не удалось. Впрочем, наши конкуренты тоже замолкли.
Потом было много работы над другими проектами, Goozzy перешёл из глобального режима в локальный. Он помогал нам работать и отправлять друг другу полезные сообщения вроде: «Тут ошибка, исправьте, пожалуйста!» или «Вышла статья о нас – лень стало писать в почте – повесил стикер».
И, скорее всего, наша история бы подошла к концу, если бы весной мы не нашли инвестора.
![image](https://habrastorage.org/getpro/habr/post_images/fce/23f/c24/fce23fc24466de7cbdeccc5dc6bf4f23.png)
Сегодня Вам будет повторно рассказано о стартапе. Повторно и год спустя. Очередной «перспективный» стартап, заглохший в самом начале пути, — подумаете вы. Но я прошу Вас не торопиться с выводами и прочитать нашу историю до конца и, быть может, стать частью этой истории.
Возможно, вы помните, как летом 2009 года появилось сразу несколько проектов, посвященных стикерам, прикрепляемым к конкретным точкам web-страниц. Первым таким проектом был как раз наш проект Goozzy с гуззеничками, сгуззтками и кнопкой «Гуззнуть». Набрав пару тысяч пользователей за первую неделю, мы узнали, что проект тормозит, что наш язык никому не понятен, что «это, вот это и вон то» не продумано. В общем, завоевать мир за пару месяцев нам не удалось. Впрочем, наши конкуренты тоже замолкли.
Потом было много работы над другими проектами, Goozzy перешёл из глобального режима в локальный. Он помогал нам работать и отправлять друг другу полезные сообщения вроде: «Тут ошибка, исправьте, пожалуйста!» или «Вышла статья о нас – лень стало писать в почте – повесил стикер».
И, скорее всего, наша история бы подошла к концу, если бы весной мы не нашли инвестора.
+64
Создание PDF в CodeIgniter c помощью R&OS pdf class
4 min
3.3KTranslation
Существует довольно большое количество PHP библиотек для создания PDF файлов, например такие как FPDF, Panda и dompdf, но наиболее лучшая, на мой взгляд, это R&OS pdf class. Я впервые узнал о ней из книги PHP Anthology. Я пробовал другие библиотеки для создания PDF, некоторые работают только на PHP5, некоторые на более ранних версиях, но ни одна из них не предоставила мне такого же контроля и легкости в использовании, как R&OS. И поэтому я использую этот класс в своем примере.
+3
Настоящее скругление углов картинок на клиенте
3 min
27KО скруглении углов в html-верстке сказано уже столько, что я пойму тех кто прочитав заголовок иронично улыбнется и подумает «опять 25, ну сколько можно...». Поэтому я постараюсь кратко изложить суть, и сразу предупрежу, что этот метод вы едва ли могли видеть раньше.
+125
Расширения для Opera: Кнопки, бэджи и всплывающие окна
4 min
4.1KTranslation
Вступление
Эта статья рассказывает о базовых шагах по созданию и управлению кнопками на панели браузера и различными их компонентами.
+23
Вёрстка c «Ушами»
2 min
9.1KОчень часто фантазия человека, разрабатывающего макет сайта, не ограничивается шириной 1024px, при этом требуется, чтобы сайт выглядел достойно на всех разрешениях и соответствовал полёту мысли дизайнера.
Проблему можно представить графически так:
![image](http://8xx8.ru/habrahabr/ears/problem.jpg)
Задача вёрстки заключается в следующем:
Работает для FF3, FF4, IE8 и почти для Opera.
Проблему можно представить графически так:
![image](http://8xx8.ru/habrahabr/ears/problem.jpg)
Задача вёрстки заключается в следующем:
- — независимо от разрешения (размера она браузера), информативная часть сайта находилась посередине;
- — справа и слева должны остаться графические блоки (уши), причём эти уши должны быть видны только при увеличенном размере экрана браузера, а при уменьшенном не уместившаяся часть должна прятаться (в идеале, чтобы ещё горизонтальной полосы прокрутки не было);;
- — страница должна быть резиновой от 680px до 1000px.
Работает для FF3, FF4, IE8 и почти для Opera.
+32
Микрозаметка: Итераторы/Генерация диапазонов дат, чисел и тд
3 min
1.7KЭта заметка навеяна топиком "подсчет количества событий календаря в каждом месяце года". В ней нет ничего нового, это просто микрозаметка о возможных решениях.
Хотя задача того топика очень типична и вполне спокойно решалась обычным проходом с case или if:
Но я счел нужным написать о некоторых возможностях избежать излишнюю ручную работу. Например, если нам необходимо бы было агрегировать не за год и не за два, а, скажем, за последние 5 лет помесячно. Согласитесь, в таком случае 60 строк c if'ами было бы как минимум тяжело читать.
Хотя задача того топика очень типична и вполне спокойно решалась обычным проходом с case или if:
SELECT
sum(
CASE
when t.`start_date`<'2010-02-01' and t.end_date>'2010-01-01' then 1
else 0
end
)
AS jan,
sum(
CASE
when t.`start_date`<'2010-03-01' and t.end_date>'2010-02-01' then 1
else 0
end
)
AS feb,
...
FROM test t
Но я счел нужным написать о некоторых возможностях избежать излишнюю ручную работу. Например, если нам необходимо бы было агрегировать не за год и не за два, а, скажем, за последние 5 лет помесячно. Согласитесь, в таком случае 60 строк c if'ами было бы как минимум тяжело читать.
+25
«Делаем стартап гостеприимным» или «Как использовать OpenID на своем сайте»
3 min
3.4K![Как использовать OpenID на своем сайте](https://habrastorage.org/getpro/habr/olpictures/8f8/57d/5a1/8f857d5a1be43cc5bcb91172a89841c2.gif)
Уверен, вам не раз подалась на глаза аббревиатура OpenID. Вполне возможно у вас сложилось мнение, что это эдакая модная штуковина, о поддержке которой все чаще заявляют различные популярные проекты. По большому счету так и есть, но зачем эта технология на самом деле нужна? Предположим, вы заядлый блоггер, у вас имеется учетная запись на wordpress.com, но случилось вам прочесть сообщение в чужом дневнике и возникло непреодолимое желание оставить автору комментарий. Но вот незадача – чужой дневник оказался на livejournal.com. Неужели только для того, чтобы оставить комментарий вам придется регистрироваться на «вражеском» блог-хостинге?!
+49
Виджет выбора OpenID провайдера на Prototype
1 min
1.4KКогда-то я уже писал, как интегрировать OpenID авторизацию в ваш сайт. Речь шла о серверной части.
Сейчас же я говорю о UI части — виджет для выбора провайдера.
В качестве клиентской библиотеки для своего проекта я выбрал prototype и первым делом я полез в гугл поискать готовое решение. Удалось найти такое, но только для JQuery — code.google.com/p/openid-selector
И так мне ничего не оставалось как написать OpenID selector самому. Вот что получилось
![image](https://habrastorage.org/getpro/habr/post_images/6ee/bd3/983/6eebd398316d8ad2cb7288164cbba3ed.png)
Сейчас же я говорю о UI части — виджет для выбора провайдера.
В качестве клиентской библиотеки для своего проекта я выбрал prototype и первым делом я полез в гугл поискать готовое решение. Удалось найти такое, но только для JQuery — code.google.com/p/openid-selector
И так мне ничего не оставалось как написать OpenID selector самому. Вот что получилось
![image](https://habrastorage.org/getpro/habr/post_images/6ee/bd3/983/6eebd398316d8ad2cb7288164cbba3ed.png)
+24
Быстрый старт с openID
3 min
15KДобрый день, друзья.
Сегодня я хочу поделиться своим опытом внедрения авторизации по openID на своем книжном сайте «Мои книги». Статья рассчитана на начинающих, поэтому вряд ли заинтересует тех, кто уже знает все нюансы этой технологии. Основная ее цель – ответить на вопрос: «да, это удобно, но как же мне сделать такое в моем проекте?!!»
Сегодня я хочу поделиться своим опытом внедрения авторизации по openID на своем книжном сайте «Мои книги». Статья рассчитана на начинающих, поэтому вряд ли заинтересует тех, кто уже знает все нюансы этой технологии. Основная ее цель – ответить на вопрос: «да, это удобно, но как же мне сделать такое в моем проекте?!!»
+41
Новый дизайн 42goals
1 min
769Сложно представить проект, дизайн которого не меняется с момента запуска. Если проект активно развивается, то его дизайн обновляется в течении всей жизни проекта. Сегодня, наконец, обновился 42goals, сервис для учета целей и ежедневных дел (предыдущий хабратопик). Главная сайта выглядит теперь так:
![](https://habrastorage.org/storage/144327f1/5e67129e/c4612948/24ffd408.png)
![](https://habrastorage.org/storage/144327f1/5e67129e/c4612948/24ffd408.png)
+21
Грабли при верстке HTML писем
3 min
103KДовольно часто наши клиенты устраивают регулярные рассылки с новостями. Почти всегда их не устраивают текстовые рассылки или простое оформление HTML рассылок. Наши дизайнеры вовсю креативят, а мы потом набиваем шишки при верстке их макетов с корректным отображением во множестве почтовых клиентов.
Ниже список встретившихся нам особенностей и способы их разрешения (как то упорядочить их мне не удалось, поэтому всё идет единым списком)
Ниже список встретившихся нам особенностей и способы их разрешения (как то упорядочить их мне не удалось, поэтому всё идет единым списком)
+264
Information
- Rating
- 2,290-th
- Location
- Luzern, Luzern, Швейцария
- Registered
- Activity