Архив метки: work

Визуализация алгоритмов хранения данных

Пытаетесь понять, как работает бинарное дерево, и не понимаете, что там написано в статье в Википедии?

Тогда загляните на эту страничку. Прекрасный визуальный интерактивный инструмент по различным алгоритмам, как они работают.

PHP memory and Zend Memory Manager

Хорошая статья про работу с памятью в среде разработки «для инвалидов», в PHP.
http://jpauli.github.io/2014/07/02/php-memory.html

Zend Memory Manager has nothing to share with ZendGC. ZendGC, appeared in PHP 5.3, is about clearing circular references in PHP variables and that’s absolutely all it does. It then acts on top of ZendMM, for PHP variables containing themselves (circular references).

Немного баловства с JS/HTML5

У js-библиотеки Prototype есть вспомогательная библиотечка Window, позволяющая создавать на странице сайта модальные окна (со всеми плюшками в виде сворачивания, закрывания, ресайза и перетаскивания).

Легким движением, а именно переопределением методов minimize и restore можно сделать, чтобы окошки не просто сворачивались, а убирались в какой-то угол страниц в виде небольших кнопок (панель задач в Windows помните?).

И вот задача, чтобы эти свернутые кнопки не исчезали при переходе между страницами сайта.

Для этого воспользуемся идеей: при сворачивании окон мы делаем еще одну дополнительную операцию, а именно считываем свойства окна и записываем их в локальное хранилище с помощью технологии Web Storage (localStorage). Для работы с этим хранилищем я воспользовался библиотекой http://www.jstorage.info

Кусочек из метода минимизации:

minimize: function(id, event) {
var win = this.getWindow(id);
...
var winProps = jQuery.jStorage.get('winProps');
var newWinProps = {
'id': id,
'className': win.options.className,
'title': win.options.title,
'minWidth': win.options.minWidth,
'width': win.options.width,
'height': win.options.height,
'url': win.options.url,
'recenterAuto': win.options.recenterAuto,
'destroyOnClose': win.options.destroyOnClose,
'showEffectOptions': win.options.showEffectOptions,
'top': jQueryElement.css('top'),
'left': jQueryElement.css('left')
};
winProps[id] = newWinProps;
jQuery.jStorage.set('winProps',winProps);
...

(есть возможность хранить несколько окон)

При открытии любой страницы запускаем код ниже, который считывает данные из хранилища (по сути это просто параметры окна, которые передаются в конструктор нового окна), инициализирует для каждого окна объект Window (который так же добавляет нужные элементы в DOM) и отображает соответствующую «свернутую» кнопочку в углу страницы.

var winProps = jQuery.jStorage.get('winProps');
if (!jQuery.isEmptyObject(winProps)) {
// get from localStorage
for (var winId in winProps) {
var win = new Window(winProps[winId]);

// Create a dock element
var element = document.createElement('span');
element.className = 'dock_icon';
element.style.display = 'none';
element.win = win;
$('dock').appendChild(element);
Event.observe(element, 'mouseup', Windows.restore);
$(element).update(win.getTitle());
new Effect.Appear(element)
}
}

Ну и в методе restore не забываем добавить кусочек, отвечающий за удаление данного окна из списка в localStorage, т.к. оно уже не требуется к «перетаскиванию» между страницами, когда открыто, а не свернуто.

restore: function(event) {
...
// remove from localStorage
var winProps = jQuery.jStorage.get('winProps');
delete winProps[element.win.getId()];
jQuery.jStorage.set('winProps',winProps);
...

Задумался о перспективах

Я PHP-разработчик. Уже много лет. Раньше имел возможность работать в веб-студиях и на фрилансе, делать проекты на популярных CMS. Но последние годы работаю над, так сказать, внутренними компонентами одной большой платформы и из веб-интерфейсов там разве что различные админочки. Все остальное — это различное взаимодействие между компонентами, работа с БД, отчеты, АПИ, бэкенд для каких-то сервисов.

Все это способствовало тому, что я как страшный сон забыл про Битрикс, Друпал и т.п., но смог сконцентрироваться на последних версиях php и на актуальных современных фреймоворках/платформах типа Symfony, в которых реализованы и продвигаются современные концепции разработки ПО.

Но пришло время и задумался о том, а что же дальше. Посмотрев по сторонам можно увидеть, как на собеседованиях по php, где не упоминаются слова CMS и веб-сайты (как раз то, что интересно, настоящий бэкенд, энтерпрайз), спрашивают про алгоритмы, некоторые сложные внутренние аспекты работы php. Рынок, куда хотелось бы пойти в области php дальше, очень ограничен, потому что куда более часто для подобных задач выбирают совсем другие технологии, а php все же оставляют ту вотчину, для которой он и был предназначен, веб-сайты. И попасть на эти места — большая конкуренция, а я не гений.

Конечно, можно внезапно попасть на компанию, которая ведет какой-то своей веб-проект. Может это будет стартап, может компания с историей. И проект каким-то чудом окажется не на Битриксе, а на Symfony. Но это все же редкость. Куда больше предложений пойти именно в веб-студия или на проект с использованием какой-то популярной CMS.

Возможно, я загоняюсь, и все не так плохо. У Битрикса ведь тоже есть различные компоненты, на которые реализовано несколько интересных корпоративных продуктов. Возможно, в них интересно ковыряться и поддерживать. И код, возможно, там красивый, который не тянет всю необходимость «поддержки старых версий». Но все это лишь возможно.

И вот задумался я, куда пойти дальше. Из наиболее близкого и очевидного — Java. Можно попробовать что-то на python. Но для этого всего даже на junior надо иметь хоть какой-то опыт, список успешных работ. У меня из этого лишь какое-то собственное баловство и небольшие прикладные скрипты, а также косвенное участие в http://mozartframework.ru/

Но самое главное и важное — я не математик. Я никогда не любил математику и в жизни она мне не сильно была нужна. Я представляю, что такой сложность алгоритма и могу вспомнить про двоичный поиск по упорядоченному списку, или же сито Эрастофена для поиска простых чисел. Но это, пожалуй, максимум. Все остальное я чаще всего ищу и нахожу в интернете и вряд ли мне это пригодиться на собеседовании.

А между тем я бы не хотел ничего никому доказывать, а просто делать свое дело. Успешно и ответственно. Да, я не гений. Но работу свою всегда делал.

И вот сижу я и думаю, куда докатила меня жизнь…

Округление числа в меньшую сторону на PHP

Есть задача округлять дробные положительные числа в меньшую сторону. 2 знака после запятой. В результате:
2.03000 -> 2.03
2.267777 -> 2.26

Используя стандартные средства и из-за особенностей обработки чисел с плавающей точкой в компьютере и PHP в частности получаем такие странные результаты:
php > echo floor(2.26 * 100) / 100;
2.25
php > echo round(2.03600, 2, PHP_ROUND_HALF_DOWN);
2.04

Без использования сторонних библиотек кажется, что единственный и самый простой способ выполнить такую задачу — через преобразования в строку:
// результат = взять целую часть от умножения, удалить последний символ, поделить на 100
$valueArray = explode('.', $value * 1000);
$value = substr(array_shift($valueArray), 0, -1) / 100;