Добавление комментариев на сайт
Честно говоря, когда увидел, что по этому поводу пишут и советуют новичкам на других сайтах, немного ужаснулся и решил запилить свою заметку на эту тему без фатального недостатка. В основном я видел длинные полотнища кода, которые реализуют добавление комментариев на сайт. Обычно для этого создают форму, реализуют ее обработку, сохранение, а так же выборки для отображения. Но преимуществ подобного подхода чем дальше, тем все меньше.
В этой заметке вы узнаете один из самый простых (но, субъективно, один из наиболее предпочтительных) способов добавить комментарии на сайт - простой пример для новичков + варианты для более продвинутых веб-мастеров.
Действительно, для чего изобретать велосипед и писать кучу кода, который в будущем еще придется поддерживать, фиксить и т.д., если есть куча готовых решений от сторонних сервисов (речь идет о социальных сетях + disqus)?
Value Object'ы у Symfony формах
Symfony разработчики часто задаются вопросом, как заставить Symfony формы работать с value-object'ами. Давайте, для примера, представим тип Money как объект с двумя полями $amount и $currency:
class Money
{
private $amount;
private $currency;
public function __construct($amount, $currency)
{
$this->amount = $amount;
$this->currency = $currency;
}
public function getAmount() // ...
public function getCurrency() // ...
}
Можете ли вы создать form type для этого класса без методов setAmount() и setCurrency()? В этой заметке вы научитесь этому.
Версионность ассетов при использовании gulp
При изменении клиентского кода нужно как-то заставить браузер клиента перезагрузить измененные файлы. Эта проблема достаточно распространенная. Скорее всего, вы столкнетесь с ней вне зависимости от того, какими технологиями пользуетесь при веб-разработке. Этот пример о решении проблемы при создании фронтенд проекта с использованием javascript и gulp.
Решить можно несколькими способами.
Пусть, например, 7e50961489 - это новая версия ассетов. На самом деле, она может быть любой, главное, чтобы отличалась от тех, что были раньше. Можно просто нумеровать - 1, 2, 3 и т.д. Но так не слишком удобно. Дальше станет понятно, почему.
Sequence Master Game
Sequence Master Game - игра для проверки скорости реакции. Кликайте по наибольшем среди доступных чисел (можно выбирать несколько чисел на каждом шаге) и делитесь рекордом с друзьями.
Ключевые особенности/геймплей:
1) Доступно 7 уровней
2) За отведенное время вы должны успеть прокликать числа от наибольшего до наименьшего.
3) За каждый выбор начисляются очки. Их количество зависит от скорости выбора игрока и величины выбранного числа. В случае ошибки игра не прекращается, но начисляется штраф.
4) Игра прекращается, если не успеть выбрать правильное число за отведенное время. После окончания игры есть возможность расшарить результат.
5) Респонсивность (должно работать на смартфонах), анимация и прочие свистелки =).
Поиграть можно перейдя по ссылке: https://rg.folkprog.net
Gulp-файл для frontend проекта
Решение не претендует на идеальность. Но вполне подойдет для разработки небольшого frontend проекта, написанного с использованием coffeescript и less. Важное замечание: использование бекенда не предусмотрено. Nodejs использован только для билда ассетов (такое решение удобно, к примеру, если вы планируете создать гибридное оффлайн приложение для смартфона).
Ключевые особенности нашего проекта, и, как следствие, gulp-файла:
1) Поддерживает разные среды (prod, dev, etc)
2) Компиляция и минификация less, CoffeScript файлов, объединение нескольких в один (конкатенация)
3) Поддержка тестов (jasmine)
4) В dev-среде работает watch (динамически перебилдивает ассеты при изменении исходников)
Откуда гении? (Обзор книги "Вы, конечно, шутите, мистер Фейнман")
Так откуда же гении? Ответ, к сожалению, неизвестен никому.
Но кое-какие интересные предположения все-таки можно отыскать в книге “Вы, конечно, шутите, мистер Фейнман!”.
Многие скажут, все зависит от генов. Да, безусловно, гены - главная улика любой личности. Без них, разумеется, не обходится. Но есть и другие, не менее важные обстоятельства.
Только свободный мир рождает свободных личностей, готовых взять от жизни по максимуму. И отдать столько же, а, может, даже больше. Почти все лауреаты Нобелевской премии и других престижных мировых премий принадлежат свободному миру. Угнетенные же континенты, которыми были совсем недавно большинство, гениев не рождают.
А ведь именно гении — всемирный прогресс. Человечество нуждается в них, чтобы улучшить жизнь каждой личности. Теперь это качество умножается не столетиями, а десятком-другим лет.
Но вернемся к Ричарду Фейнману.
Книга - яркий пример того, как человек наслаждается жизнью, в хорошем, возвышенном смысле.
Создание респонсивных таблиц с помощью css
В этой заметке мы рассмотрим, как можно использовать таблицы в респонсивных шаблонах и как мы можем сделать удобным использование таблиц на мобильных устройствах.
При создании респонсивных таблиц вы столкнетесь с множеством проблем:
- Слишком много колонок
- Слова вылазят за границы ячеек
- Ширина колонки становится слишком малой
- Если у вас много строк, при скроле вы не сможете видеть заголовки колонок
В этой заметке, надеюсь, мы исправим все эти проблемы путем использования респонсивного css-решения.
Junior vs Senior разработчик: в чем, в конце концов, разница между ними?
Кажется, что есть резкий контраст между этими уровнями. Но на самом деле, какое различие между Junior и Senior разработчиком?
Что еще более важно, как с обеих сторон можно оценить рост разработчика в более высшую лигу? Чтобы разобраться в этом вопросе, продолжайте читать статью.
Этот вопрос может показаться глупым и очевидным, но какой же ответ на самом деле?
Инкапсуляция с помощью замыканий в JavaScript
Одной из необычных особенностей JavaScript является инкапсуляции с помощью замыканий. Необычной потому, что во многих других языках программирования этот механизм реализован с помощью классов. В JavaScript же другой механизм, который может показаться странным, если не разобраться в особенностях переменных и функций.
Если переменная или объект в JavaScript не помещены внутрь какой-либо функции, то они становятся глобальными. Все глобальные элементы в JavaScript являются свойствами глобального объекта. Для браузера это объект window. При этом конструкции for, if и другие не влияют на видимость переменных.
Создание глобальных переменных, как правило, нежелательно, так как оно может привести к трудно обнаружимым ошибкам, и усложняет перенос кода в другие приложения.
Готовимся к HTTP/2: Руководство для веб-дизайнеров и разработчиков
Протокол передачи гипертекста (HTTP, англ. HyperText Transfer Protocol) - протокол, который управляет соединением между вашим сервером и браузерами клиентов. Впервые после 1999 года, появилась новая версия этого протокола, и это обещает значительно ускорить каждый сайт.
В этой статье мы опишем основы HTTP/2 для дизайнеров и разработчиков. Я объясню некоторые ключевые особенности нового протокола, рассмотрю совместимость (серверную и браузерную) и остановлюсь подробнее на вещах, над которыми нужно задуматься, поскольку все чаще видим внедрение HTTP/2. Прочитав эту статью, вы получите обзор того, что нужно изменить в вашей работе в кратко- и долгосрочной перспективе. Также я включу множество дополнительных ресурсов, на тот случай, если вы захотите углубится в вопрос. Моя цель - предоставить достаточное количество знаний, которое поможет принят правильное решение о переходе на HTTP/2.
Новое в PHP 7: оператор объединения со значением NULL
Не слишком броское имя для оператора, но раз уж php 7 принес нам удобный оператор объединения со значением NULL (англ. null coalesce operator), покажем пример.
У php 5 уже есть тернарный оператор, который проверяет выражение и потом возвращает второй элемент, если оно истинно и третий если ложно:
echo $count ? $count : 10; // выводит 10
Удалить дефолтный блок sonata.admin.block.admin_list у SonataAdminBundle
При использовании SonataAdminBundle и SonataBlockBundle захотелось удалить дефолтный блок.
Толку от него мало, он просто дублирует функционал бокового меню на дашборде.
При установке SonataBlockBundle, если мы просто напишем у конфигурации:
sonata_block:
default_contexts: [sonata_page_bundle]
blocks: []
(в будущем будем добавлять свои блоки, но для начала просто ставим пустой массив), то отловим ошибку.
Использование php-генераторов
Несмотря на то, что php-генераторы доступны с php 5.5.0, они все еще почти не используются. Более того, большинство разработчиков, которых я знаю, понимают, как работают генераторы, но не видят, когда они могут быть полезны в реальной жизни.
Да, генераторы определенно смотрятся хорошо, но знаете... Я не понимаю, где они могут быть полезными для меня, разве что для расчета последовательности Фибоначчи.
И они не ошибаются, ведь даже примеры в php-документации слишком упрощены. Они только объясняют, как эффективно реализовать range или итерировать по строкам файла.
Но даже с этих простых пример мы можем понять ключевые преимущества использования генераторов: они просто упрощают итераторы.
Symfony Blog Bundle
HarentiusBlogBundle - бандл для блога/простого портала (Или сложного, если с наследованием бандлов и расширением). Движок этого сайта.
В качестве бэкенда используется SonataAdminBundle. Реализовано:
1. Админка (WYSIWYG, ckeditor), загрузка картинок, аудио, плеер.
2. Теги, категории, архивы, облако тегов
3. Статистика
4. RSS-feed (требует доработки)
5. "Умное" кэширование всего и вся, контент отдается очень быстро
Для "успокоения души" осталось:
1. Тесты