Вышел релиз библиотеки PIE 1.0, котрая добавляет в IE 6, 7 и 8 поддержку некоторых возможностей CSS3: boder-radius
, box-shadow
, border-image
, border-image
и несколько фоновых изображений.
-
CSS3 PIE 1.0
16 мая 2012
-
Векторные значки
10 мая 2012
Векторные значки, выполненные в виде шрифта, похоже, скоро будут использоваться повсеместно. Технически работают они даже в IE6, а, с приходом популярности, улучшаются и техники их использования.
Я уже упоминал Font Awesome. Его, в несколько изменённом виде, мы будем использовать для новой версии stay.com. Внедрение, за исключением небольшой проблемы с CDN, прошло на ура. В итоге сэкономили кучу HTTP-запросов и получили масштабируемые значки.
Вчера векторные значки внедрил github. Кстати, их анонс довольно подробный с технической точки зрения, можно использовать как пособие.
Ну и стоит упомянуть недавно обновившийся Fontello, проект, который позволяет выбрать значки из кучи популярных наборов и собрать из них свой шрифт.
-
20 лет Wolfenstein
10 мая 2012
ID Software, по случаю двадцатилетия игры-первопроходца жанра 3D-action, дала всем желающим бесплатно поиграть в версии для iPhone и iPad. Как приятное дополнение — можно поиграть прямо в браузере. Решив посмотреть, что же внутри этой версии, я был немного удивлён тому, что построена она на спрайтах и div-ах.
-
Решение проблемы сильно мелкого шрифта gmail в Opera
2 мая 2012
Последние версии Opera используют в gmail очень маленький шрифт. Хорошо, что Opera позволяет решить это быстро и безболезненно путём применения своего CSS:
- Создаём файлик с именем, например,
gmail.css
. - Заходим в Google Mail. В контекстном меню выбираем «Настройки для сайта» → «Вид» → «Моя таблица стилей».
- Выбираем наш файл.
- В файл пишем немного CSS:
body[contenteditable].editable { font-size: .8em !important }
После этого обновляем страницу и наслаждаемся результатом.
- Создаём файлик с именем, например,
-
Yeeki
1 мая 2012
В начале года, когда в CleverTech текущий проект был закрыт, а новый ещё не начат, появилась возможность в рабочее время заняться чем-нибудь общественно полезным и интересным. А так как идея написать wiki-движок на Yii посещала меня не первый раз, в качестве проекта была выбрана именно она.
В Yii 1.1 Application Development Cookbook я приводил как пример сверхпростой wiki-движок на основе markdown. Без ревизий, разделения прав и других полезных штук. В этот раз я настроился посерьёзней и через некоторое время появился Yeeki — простой, но вполне себе рабочий wiki-движок.
Основные возможности:
- Можно использовать и как приложение и как модуль для встраивания в любое приложение на Yii.
- Unicode.
- namespace.
- Индекс страниц.
- История изменений, просмотр отдельных ревизий, diff.
- Возможность ввести описание для правок и посмотреть его в истории.
- Возможность прикрутить любую разметку (из коробки поддерживается markdwon).
- Дополнительная разметка для [[wiki-ссылок]].
В планах к версии 1.0:
- Права для namespace и отдельных страниц.
- Разрешение конфликтов при одновременном редактировании.
- Вложенные namespace.
- Экспорт в PDF.
- Инсталлятор.
Поддержка PostgreSQL, SQLite.
-
Запомнить во всех браузерах
26 апреля 2012
Не так давно задался вопросом кроссбраузерного «запоминания» пользователя на сайте. Не потому, что действительно была такая потребность. Просто в пришло в голову и решил проверить, насколько это возможно. Оказывается, вполне возможно и даже применяется.
Логика подсказывает, что для того, чтобы несколько браузеров считали какое-то значение, значение должно быть установлено в нечто, которое всеми браузерами используется. Первым на ум приходит Flash. Его «Flash Cookie» или Local Shared Object оказывается вполне рабочим решением, которое используется, например, в Яндексе. Есть и в готовом виде с обёрткой для JavaScript.
Также стоит упомянуть evercookie. Штука очень «злая». Хранит информацию огромной кучей разных способов: обычные cookie, Flash, Silverlight, HTML5 LocalStorage и другие. Всего их 13. При попытке удаления части данных, библиотека их восстанавливает. Отлично должно подойти для отлова клонов, хотя, конечно, тут уже попахивает печеньками с тёмной стороны.
-
И ещё раз про невнятные ошибки MySQL
18 апреля 2012
Снова наткнулся на совсем-совсем невнятные ошибки MySQL. Всё больше убеждаюсь, что о людях при написании данной его части никто не думал.
ALTER TABLE `post` DROP FOREIGN KEY `FK_Post_UserID`
В результате получаем:
SQLSTATE[HY000]: General error: 1025 Error on rename of './mydb/post' to './mydb/#sql2-11a-1f2c' (errno: 152)
Очень помогло…
Оказывается, нормальую информацию, получить всё-таки можно. Правда, через одно место:
SHOW ENGINE INNODB STATUS
отдаст нам кучу всего, в том числе:
LATEST FOREIGN KEY ERROR ------------------------ 120418 16:58:22 Error IN dropping of a FOREIGN KEY CONSTRAINT of TABLE "mydb"."post", IN SQL command ALTER TABLE `post` DROP FOREIGN KEY `FK_Post_UserID` Cannot find a CONSTRAINT WITH the given id "FK_Post_UserID".
Вот это уже намного понятней. У нас просто нет FK с таким именем. Интересно, чем руководствовались разработчики MySQL, скрывая от конечного пользователя действительно важную для него информацию?
-
Опасность слепой проверки заголовка X-Forwarded-For
15 апреля 2012
Сегодня пришёл pull-request в Yii на эту тему. В классе
CHttpRequest
есть методgetUserHostAddress
, который отдаёт нам IP пользователя. Предложение было перед возвратом$_SERVER['REMOTE_ADDR']
проверить, а нет ли чего в$_SERVER['HTTP_X_FORWARDED_FOR']
, и, если есть — вернуть. Мотивация — будут видны IP пользователей за прокси.Так как такое заблуждение встречается ну очень часто, я даже не сразу вспомнил, откуда берётся
$_SERVER['HTTP_X_FORWARDED_FOR']
. А берётся он из заголовка HTTP запросаX-Forwarded-For
и означает это то, что придти нам может что угодно.А теперь представим, что разработчик воспользовался изменённым методом
getUserHostAddress
, проверяющимX-Forwarded-For
:if(in_array(Yii::app()->request->getUserHostAddress(), $allowedAddresses)) { // даём доступ к админке }
Тем, кто пишет на Zend Framework, кстати, стоит проверить свой код потому как
Zend_Controller_Request_Http::getClientIp()
без переданного аргументомfalse
как раз проверяетX-Forwarded-For
:/** * Get the client's IP addres * * @param boolean $checkProxy * @return string */ public function getClientIp($checkProxy = true) { if ($checkProxy && $this->getServer('HTTP_CLIENT_IP') != null) { $ip = $this->getServer('HTTP_CLIENT_IP'); } else if ($checkProxy && $this->getServer('HTTP_X_FORWARDED_FOR') != null) { $ip = $this->getServer('HTTP_X_FORWARDED_FOR'); } else { $ip = $this->getServer('REMOTE_ADDR'); } return $ip; }
Заслал репорт в трекер Zend Framework на всякий случай.
-
YiiConf 2012, открыта финальная регистрация
10 апреля 2012
Открыта финальная регистрация на первую ежегодную профессиональную конференцию YiiConf.
- Дата проведения конференции: 19 мая
- Стоимость участия: $50, 1500р. или 400 гривен
- Количество мест: 200
- Место проведения: ул. Михайловская, 1/3 (Площадь Независимости) г. Киев, 01001, Украина
-
Подробное сравнение синтаксиса PHP, Perl, Python и Ruby
30 марта 2012
Целых две страницы с подробным сравением синтаксиса интерпретируемых языков программирования.