Category Archives: Programming
Debug javascript в PhpStorm
Почему-то у меня до сих пор здесь нет этого поста, хотя первый раз пользовался года полтора назад. В PhpStorm можно настроить режим отладки javascript, причём и страниц, находящихся на удалённой машине. http://www.jetbrains.com/editors/javascript_editor.jsp?ide=phpstorm#Debugger_for_JavaScript http://wiki.jetbrains.net/intellij/Remote_JavaScript_debugging_with_WebStorm_and_PHPStorm
Алгоритм динамического центрирования меню по нужному элементу
Задача — при возникновении события подсветить нужный пункт меню, показать по 3 пункта сверху и снизу, остальные скрыть. Это относится и к пагинация (paging). Если, к примеру, это второй пункт меню, то снизу показать больше. В общем, чтобы в сумме всегда было показано 7 пунктов. Решил показать алгоритм, которым воспользовался, чтобы всегда быть уверенным, что …
Кроссдоменные запросы из javascript
Недавно из неожиданного источника поступил вопрос «что такое document.domain«. Я об этом читал давно, толком никогда не использовал, потому решил сохранить на будущее закладочку:) . Вот описание способов кроссдоменной работы javascript: Старый, ограниченный, но кроссбраузерный — поиграться с document.domain http://javascript.ru/ajax/cross-domain-scripting#kross-domennyy-skripting-s-obshchim-naddomenom Более новый, удобный, но поддержка всеми под вопросом — document.getElementById(«iframe»).contentWindow.postMessage() из спецификации HTML5: http://javascript.ru/ajax/cross-origin-2
PHP coding style
Описал часть своего code style для PHP. To be updated.
jQuery-плагин для создания timeline
http://timeline.verite.co/ Получается примерно вот что:
Новое в Django 1.4
Достаточно развёрнуто про новый функционал Django 1.4: http://blog.futurecolors.ru/search/label/Django%20Days
Боремся с Clickjacking
«Clickjacking — относительно новый и не очень широко известный тип атак на веб-сайты. Его суть в том, что пользователь, совершая клик на специально сформированной странице злоумышленника, на самом деле кликает по ссылке на совершенно другом сайте. Это может быть использовано как для относительно безобидных накруток голосований (например, ретвитов или лайков), так и более разрушительных вещей, …
PHP Fatal error: Exception thrown without a stack frame in Unknown on line 0
Отличная ошибка, на которую обычно просто «забивают», т. к. не понятно, где и что искать. А ошибка вызвана тем, что в кастомном обработчике исключений происходит исключение, после чего php прерывает процесс с таким замечательным и информативным сообщением об ошибке. В моём случае это было своё расширение для класса DateTime
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public function __construct( $Time = 'now', DateTimeZone $Timezone = null ) { // PHP 5.3.3 имеет этот баг: // @link https://bugs.php.net/bug.php?id=52063 // поэтому пишем странное: if ( ! empty( $Timezone ) ) { parent::__construct( $Time, $Timezone ); } else { parent::__construct( $Time ); } // ещё раз вызываем явно setTimezone, чтобы обойти багу с timestamp - @link http://www.php.net/manual/en/datetime.construct.php#97724 if ( empty( $Timezone ) ) { $this->setTimezone( new DateTimeZone( 'Europe/Moscow' ) ); } } |
Если не написать тот странный …
IoC в php
Читал-читал про инверсию управления (Inversion of Control), всякие Pico и Phemto.
Расширение базового функционала jquery-ui-виджетов
Захотелось сделать более правильную работу с триггерением/навешиванием обработчиков на события, чем это реализовано в jquery-ui. При этом сам функционал надоело копировать из виджета в виджет. В общем, вот простой добавить методы к своим виджетам:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
(function( $ ) { "use strict"; /** * расширение базового функционала jquery-ui */ $.widget( "my.my_extension", { _triggerSmart: function( EventName, Data ) { var me = this; var $me = $( me.element ); $me.trigger( EventName + '.' + me.widgetName, Data ); return me; }, _bindSmart: function( EventName, Handler ) { var me = this; var $me = $( me.element ); // боремся с повторным навешиванием обработчика var events = $.data( $me.get( 0 ), 'events' ); var filteredEvents = []; if ( EventName in events ) { filteredEvents = $.grep( events[EventName], function( Event ) { return Event.type == EventName && Event.namespace == me.widgetName; } ); } if ( ! filteredEvents.length ) { $me.bind( EventName + '.' + me.widgetName, Handler ); } return me; } } ); }( jQuery )); |
Потом для каждого виджета нужно будет указать опциональный второй параметр
1 2 3 4 5 |
$.widget( "my.fast_search", $.my.my_extension, { options: { ... |
Внимание нужно обратить на второй параметр $.my.my_extension, который в …