Pull to refresh
  • by relevance
  • by date
  • by rating

Практический JS: избавляемся от утечек памяти в IE

Client optimization *
Translation
Примечание: ниже находится перевод статьи Understanding and Solving Internet Explorer Leak Patterns", в которой автор рассматривает некоторые характерные случаи утечек памяти в IE и предлагает методы для их избежания и устранения. Рассмотренные проблемы не являются чем-то новым или революционным, однако, знать об их существовании должен любой уважающий себя программист клиентских интерфейсов. Мои комментарии далее курсивом.

Опубликована: июнь 2005

Развитие веб-разработок



В прошлом утечки памяти не создавали никаких проблем веб-разработчикам. Страницы были предельно простыми, а переход с одной на другую был единственным нормальным способом для освобождения всей доступной памяти. Если утечка и происходила, то была настолько незначительна, что оставалась незамеченной.

Современные веб-приложения должны разрабатываться с учетом более высоких стандартов. Страница может выполняться в течение часов без дополнительных переходов по сайту, при этом она будет сама динамически запрашивать новую информацию через веб-сервисы. Языковой движок испытывают на прочность сложными схемами отработки событий, объектно-ориентированным JScript и замыканиями (closures), производя на свет все более мощными и продвинутые приложения. При все при этом, учитывая некоторые другие особенности, знание характерных шаблонов утечек памяти становится все более необходимым, даже если они были раньше спрятаны за механизмом навигации по сайту.

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

читать дальше на webo.in →
Total votes 34: ↑32 and ↓2 +30
Views 1K
Comments 13

C#-like cобытия для PHP. Reflection, closures…

PHP *
Задача — сделать на PHP эвенты а-ля C# т.е. произвольный объект может генерировать события. Другие объекты могут на эти события подписываться непосредственно у экземпляра генерирующего объекта.

Основное отличие от того что видел ранее — строгая проверка навешиваемого хука. Проверяется наличие метода, количество его аргументов, etc…
Читать дальше →
Total votes 19: ↑10 and ↓9 +1
Views 1.1K
Comments 17

Оптимизация с помощью замыканий

JavaScript *
Дано — раз в секунду дергается AJAX'ом скрипт, в нем несколько вызовов одной функции (назовем ее updater) с разными аргументами. Функция в соответствии с аргументами апдейтит некоторый набор DOM-элементов (меняет контент, скрывает, показывает) на текущей странице. Используется jQuery, визэффекты и т.п. Т.е. на клиента приходит примерно такой код…
updater('id1', 10, 20);
updater('id33', 11, 22);
updater('id181', 102, 27);


* This source code was highlighted with Source Code Highlighter.

Проблема — после увеличения количества вызываемых функций (увеличилось количество типовых блоков) все жутко тормозит — много времени уходит на jQuery, на выбор DOM-элементов по селекторам.

Требуется по-возможности быстро и безболезненно, не меняя верстку и не отказываясь от jQuery оптимизировать процесс.
Далее...
Total votes 11: ↑7 and ↓4 +3
Views 1.5K
Comments 10

Поддержка замыканий в C/C++/Objective-C в Snow Leopard

Development for iOS *
Угадайте, что это такое:

testblock = ^(char *s) { printf("String is %s\n", s); };
testblock("TEST!");

* This source code was highlighted with Source Code Highlighter.

Скоро подобные конструкции будут все чаще встречаться в приложениях для Mac OS и, возможно, iPhone OS.

Еще в конце лета 2008 года Apple объявила, что работает над расширениями к C/C++/Obj-C под условным названием «блоки» (Blocks), которые представляют из себя ни что иное, как замыкания (closure).

Читать дальше →
Total votes 31: ↑27 and ↓4 +23
Views 3K
Comments 57

Эффектное создание объектов в Perl

Lumber room
Пару раз встречал оригинальные варианты создания объектов в любимом Perl и вздохи по поводу 6-ки, что там все проще, лучше, быстрее и т.п. Однако довольно симпатичные и совершенно безопасные конструкции можно городить и в «народной» пятерке. Используем классический вариант из учебника с замыканиями и горкой перца :)
Читать дальше →
Total votes 10: ↑10 and ↓0 +10
Views 378
Comments 7

Оптимизация Javascript с помощью Google Closure Compiler

IT-companies
image
Google открыла исходные коды нескольких инструментов, которые использовались их сотрудниками при разработке таких проектов как Google Docs, Google Maps и GMail.

В числе этих инструментов имеется достаточно интересная штука, называемая Google Closure Compiler. Данная утилита минимизирует и оптимизирует javascript-код, за счет чего он начинает работать и загружаться быстрее.
Читать дальше →
Total votes 89: ↑85 and ↓4 +81
Views 28K
Comments 67

PHP Compressor Beta

PHP *
Решил развлечься на выходных и написать вот такой вот небольшой php compressor (и obfuscator).

Основные функции.


Может переименовывать локальные переменные в функциях (включая аргументы), переименовывать функции и удалять лишние пробелы.

Возможные проблемы:

  • Некорректная работа с выражением вида $$a.
  • Возможна неправильная работа с классами (уже исправляю).

С нетерпением жду ваших отзывов!
Total votes 19: ↑4 and ↓15 -11
Views 1.4K
Comments 18

C++0x: Конвертируем лямбда-выражение в указатель на функцию

C++ *
Sandbox
По роду деятельности мне часто приходится иметь дело с вычислительными задачами. В них нередко нужно передавать указатель на функцию, чтобы, например, построить график этой функции, или решить уравнение. Кроме того, указатели на функцию обычно используются в различных GUI фреймворках, чтобы указать, какое действие будет совершено при нажатии на определённую кнопку.

В новом стандарте C++0x появились зымыкания. Не вдаваясь в подробности, замыкания — это такие объекты, которые позволяют создавать функции прямо в теле других функций. Если подробнее — замыкания позволяют создавать функциональные объекты — то есть объекты, для которых определён operator(). На хабре уже писали о них: например тут.

Мне очень понравилось нововведение и я начал им пользоваться. Но только вот незадача: по смыслу, замыкания и функции — почти одно и то же, а использовать замыкания там, где должны использоваться указатели на функции, сходу не получается. По стандарту, замыкания без списка захвата должны свободно конвертироваться в указатели на функции, но на практике такого не наблюдалось, видимо ещё не реализовано. И я задался вопросом, можно ли использовать замыкания там, где используются указатели на функции?
Решение появилось у меня после недолгих раздумий.
Total votes 30: ↑27 and ↓3 +24
Views 6K
Comments 19

Используем блоки в IOS < 4.0

Development for iOS *
Для тех кто знаком с блоками в Objective-C, но не может пока их использовать в силу необходимости поддержки приложений для ios младше 4.0 версии, либо сторонится патченого компилера PLBlocks, предлагаю рантайм блоков в виде статической либы libESBlocksRuntime.a

Сам рантайм был выдернут с исходников проекта compiler-rt, и завернут в блоковые классы ESBlock. Добавлены недостающие методы -[ NSArray enumerateObjectsUsingBlock: ] и т.д. также UIView блоковые екстеншены.

Для подключения в проект достаточно скачать исходники проекта, и добавить его в dependencies например так.

Вопросы и предложения пишите в личку — с радостью отвечу каждому заинтересовавшемуся.

Здесь можно почитать о терии блоков на хабре.
Total votes 28: ↑23 and ↓5 +18
Views 970
Comments 14

О блоках и их использовании в Objective-C часть 1-ая

Development for iOS *
В OS X 10.6 и iOS 4.0 компания Apple анонсировала поддержку блоков, по сути являющиx собою замыкания. Дальше о блоках в контексте разработки под IOS, Objective-C (тоесть работа без gc).
Для использования блоков IOS ver. < 4.0 можно применить ESBlockRuntime или PLBlocks.

Кратко о теории


Экземпляр блока, тип блока и сам блоковый литерал обозначаются с помощью оператора ^, пример:

typedef int (^MyBlock)(int);

int multiplier = 7;
MyBlock myBlock = ^(int num) {
 return num * multiplier;
};


* This source code was highlighted with Source Code Highlighter.

или

int multiplier = 7;
int (^myBlock)(int) = ^(int num) {
  return num * multiplier;
};


* This source code was highlighted with Source Code Highlighter.

Вызов блока аналогичен вызову обычной сишной функции. Например, так:

myBlock( 3 )

* This source code was highlighted with Source Code Highlighter.

Главной особенностью блоков является их умение хранить контекст в котором они создавались. В примере выше «myBlock» всегда будет умножать число на 7. Как же это все работает?
Читать дальше →
Total votes 16: ↑12 and ↓4 +8
Views 32K
Comments 12

О блоках и их использовании в Objective-C часть 2-ая

Development for iOS *
Продолжение топика — О блоках и их использовании в Objective-C часть 1-ая.

Многие из тех кто впервые сталкивается с блоками (или замыканиями), задают вопрос — «а зачем? Если и без них можно». Да можно. Но использование блоков имеет не мало преимуществ, и первое из них — существенная экономия на количестве кода, а следовательно и на времени написания и поддержке. Дальше буду говорить примерами.

Содержание:


1. Работа с контейнерами на примере NSArray.
2. Guards на примере UITableView.
3. Использование блоков вместо классов на примере scheduled операций.
4. Блоки вместо делегатов в UIAlertView.
5. UIView анимации, последовательность анимаций.
6. Асинхронные операции и управление ими. Переписываем пример с анимациями.
Читать дальше →
Total votes 36: ↑32 and ↓4 +28
Views 9.2K
Comments 21

О блоках и их использовании в Objective-C часть 3-ая

Development for iOS *
Так же как и в топике — «О блоках и их использовании в Objective-C часть 2-ая», мы продолжим говорить о преимуществах использования блоков на живых примерах.
Здесь мы рассмотрим удобства использования блоков при управлении последовательностью операций.

5. UIView анимации, последовательность анимаций.

Для начала напишем простенький пример, в котором мы будем двигать кнопку с помощью анимаций(без блоков). Затем поменяем порядок анимаций чтобы посмотреть, какие изменения потребуются в коде.
Читать дальше →
Total votes 12: ↑12 and ↓0 +12
Views 4.3K
Comments 9

Итераторы и генераторы на основе функций

JavaScript *
Поддержка итераторов и генераторов в качестве языковых конструкций появилась в javascript только в версии 1.7, и об использовании этих чудесных вещей в браузерах еще долго можно будет только мечтать. Однако использовать итераторы и генераторы в виде паттернов проектирования в javascript можно уже сейчас, и более того, делать это достаточно легко, а иногда даже приятно :)
Добро пожаловать под кат
Total votes 38: ↑36 and ↓2 +34
Views 4.3K
Comments 9

«Сделайте мне красиво!» Выпуск №34

Lumber room
Вашему вниманию очередной выпуск подкаста о веб-разработке «Сделайте мне красиво!»

Show notes:



Наши ссылки: RSS и лента на rpod.ru
Total votes 4: ↑1 and ↓3 -2
Views 566
Comments 0

«Разбор полетов» — episode 7 — Чем заняться в следующем году

Lumber room
После продолжительного новогоднего застоя, c простуженными голосами я и коллега aib представляем вашему вниманию очередной седьмой выпуск популярного в узких кругах, разговорного IT-тематического подкаста «Разбор Полетов».
В этом выпуске:
Читать дальше →
Total votes 9: ↑6 and ↓3 +3
Views 409
Comments 2

Closures и полное копирование объекта

.NET *
Sandbox
Сегодня передо мной встала задача сделать полную копию объекта, то есть DeepClone. Рассмотрим некоторый код и я покажу какие проблемы при этом могут возникнуть и как их решить.
Читать дальше →
Total votes 23: ↑20 and ↓3 +17
Views 9.5K
Comments 54

TodoMVC — «Hello, world» на стероидах

Website development *JavaScript *
Tutorial
Cуществует уже несколько десятков JavaScript-фреймворков для построения сложных приложений в браузере. Чтобы сравнить их между собой и выбрать наиболее подходящий, примитивного примера вроде классического «Hello, world» явно недостаточно. Более сложные и реалистичные примеры программ в книгах и документации каждого фреймворка могут сильно отличаться, и сравнивать их между собой затруднительно. Проект TodoMVC решает именно эту проблему. Это набор примеров реализации одного и того же простого, но вполне законченного веб-приложения с использованием разных фреймворков + эталонный пример на чистом JavaScript.

Приложение TodoMVC — это список дел. Дела можно добавлять, помечать как выполненные и удалять. Список должен сохраняться в локальном хранилище браузера. Приложение должно по возможности использовать стандартный шаблон HTML и CSS. Вот подробная спецификация приложения.
Читать дальше →
Total votes 51: ↑41 and ↓10 +31
Views 17K
Comments 17

Еще раз о каррировании и частичном применении в PHP

Website development *PHP *Programming *
Искусство каррированияВ недавней статье предложена реализация каррирования (currying) и частичного применения (partial function application) на PHP. Ее фундаментальным недостатком является то, что результатом каррирования является не функция, а объект. Он уже не может быть передан в качестве callback-параметра, а для подстановки аргументов приходится использовать специальный синтаксис. В настоящем тексте предлагается новая, прозрачная реализация этих конструкций для PHP 5.3 и выше.

Термин currying происходит от фамилии американского математика Haskell Curry. Второе значение слова currying — выделка дубленой кожи.

Понятия каррирования и частичного применения происходят из функциональных языков программирования, в рамках которых они находят широчайшее применение. Современный PHP проявляет тенденцию к заимствованию некоторых элементов функционального программирования (функции как объекты первого класса, анонимные функции и замыкания), так что обсуждаемые концепции уже не являются для него совершенно инородными.

Эмуляция каррирования и частичного применения на PHP — это один из примеров того, что Макконнелл в «Совершенном коде» (гл. 4.3) называет программированием с использованием языка, а не на языке.
Читать дальше →
Total votes 14: ↑12 and ↓2 +10
Views 4.9K
Comments 20

Наглядный пример использования замыканий в PHP

PHP *
Sandbox
Начиная с версии 5.3, PHP позволяет создавать замыкания. К сожалению, пример их использования в официальной документации http://www.php.net/manual/en/functions.anonymous.php#example-163 (example 3) обладает редкой изощрённостью и надуманностью. Надеюсь, пример под катом поможет увидеть в замыканиях другое применение, кроме как с функциями типа array_map().
Читать дальше →
Total votes 60: ↑41 and ↓19 +22
Views 11K
Comments 40
1