Pull to refresh

Проверка существования свойств и методов объекта в Javascript

Reading time1 min
Views66K
Нашел в коде Javascript библиотеки вот такую вот конструкцию:

if ('is_public' in profile) {
...
}


Очень заинтересовало, как это работает. До этого использовал оператор 'in' только для итерации, а тут вот такая вот проверка интересная. Покопавшись я обнаружил для себя, что оператор 'in' также можно использоваться для проверки существования метода объекта, свойства объекта и индекса элемента в массиве. Ниже несколько примеров:
Читать дальше →
Total votes 62: ↑48 and ↓14+34
Comments99

Быстрый доступ к 2D-массиву во флэше

Reading time1 min
Views1.2K
Задача простая и типичная. Есть большой двумерный массив. И нам хочется наиболее эффективно с ним работать. В моем случае, меня интересовал массив чисел (байт).

Что ж… Самое простое, что приходит на ум — это воспользоваться стандартным двумерным массивом типа и обращаться к элементам на манер a[x][y]. Но насколько это эффективно? Возможно, будет быстрее оперировать с одномерным массивом и обращаться к элементам как a[x + y*size_x]?

Чтобы расставить все точки над i, я написал тест, который проверяет скорость чтения и записи различных вариантов массивов.

На ум пришли следующие варианты:
  • 2-мерный нетипизированный массив (Array)
  • 1-мерный нетипизированный массив (Array)
  • 2-мерный типизированный массив (Vector.<Vector.<int>>)
  • 1-мерный типизированный массив (Vector.<int>)
  • Использование BitmapData как хранилища и setPixel/getPixel для доступа
  • 1-мерный массив байт (ByteArray)
  • Ну, и наконец, изврат. Обращение к ByteArray, ускоренное средствами быстрого доступа к памяти технологии Alchemy
Читать дальше →
Total votes 32: ↑24 and ↓8+16
Comments47

Расширение возможностей массива в PHP

Reading time5 min
Views17K
Уровень статьи: начальный/средний

Массив в PHP — один из самых мощных типов данных. Он может работать как линейный массив (список), как ассоциативный (словарь) и как смешанный. В качестве ключа массива может использоваться либо целое число, либо строка, причем строка, если она представляет собой целое число (например, «5»), будет конвертирована в целое. Остальные типы, за исключением массивов и объектов, так же конвертируются в целое или строку — подробнее можно прочитать в документации.

Несмотря на мощные возможности базового типа array иногда хочется их расширить. Например, подобный кусок кода можно встретить, наверное, в большинстве php-проектов:

$foo = isset($array['foo']) ? $array['foo'] : null;
$bar = isset($array['bar']) ? $array['bar'] : null;


Один из способов сделать этот код короче и элегантней — использовать короткую запись тернарного оператора:

$foo = $array['foo'] ? : null;
$bar = $array['bar'] ? : null;


Но такой код выкинет PHP Notice в случе, когда ключ не определен, а я стараюсь писать максимально чистый код — на сервере разработки выставлено error_reporting = E_ALL. И именно в подобных случаях на помощь приходит ArrayObject — класс, к объектам которого можно обращаться используя синтаксис массивов и позволяющий изменять поведение используя механизм наследования.

Рассмотрим несколько примеров изменения поведения.

Читать дальше →
Total votes 34: ↑25 and ↓9+16
Comments30

7 трюков при работе с массивами в Ruby

Reading time2 min
Views29K
ruby arrays

В данной статье описаны некоторые интересные трюки как можно эффективно использовать и работать с массивами в Ruby. Конечно же, есть РубиДок и множество других ресурсов, где подробно описаны все доступные методы, но здесь я хочу поделиться именно способами использования.
Читать дальше →
Total votes 39: ↑28 and ↓11+17
Comments6

Все способы перебора массива в JavaScript

Reading time7 min
Views524K

Содержание:


  • I. Перебор настоящих массивов
    1. Метод forEach и родственные методы
    2. Цикл for
    3. Правильное использование цикла for...in
    4. Цикл for...of (неявное использование итератора)
    5. Явное использование итератора

  • II. Перебор массивоподобных объектов
    1. Использование способов перебора настоящих массивов
    2. Преобразование в настоящий массив
    3. Замечание по объектам среды исполнения


Читать дальше →
Total votes 53: ↑44 and ↓9+35
Comments61

Judy-массивы в PHP

Reading time4 min
Views27K
В Badoo используется много сервисов на C и C++, большинство из которых работают с огромными объёмами данных. Как правило, сервисы выступают в роли «быстрого кэша» или «быстрой базы данных», т.е. совершают различные операции с массивами однотипных данных. Для быстрого доступа к данным мы давно и успешно используем Judy-массивы (англ. Judy arrays). Но однажды нам захотелось странного: обрабатывать большие массивы целых чисел на PHP, и мы сразу вспомнили про Judy.

Немного истории

Judy-массивы были изобретены Дугласом Баскинсом (англ. Douglas Baskins) в начале 2000-го года. Проект их разработки финансировался компанией HP, но примерно через два года был закрыт. За это время было выпущено четыре версии, причём разработка последней заняла больше года, и в ней разработчики смогли в два раза ускорить Judy, в два раза уменьшить потребление памяти, хоть и далось это нелёгкой ценой: объём кода вырос в 5 раз, а его сложность  ― на порядок.
Читать дальше →
Total votes 103: ↑93 and ↓10+83
Comments62

Интересные моменты, которые вы, возможно, не знали о C# (Array)

Reading time1 min
Views53K
В продолжении статьи «8 фактов, которые вы, возможно, не знали о C#» описывающей интересные моменты языка C#, представляю крохотный очерк. Очень жаль, что некоторые воспринимают такие статьи как “капитанство” отбивая всякое желание к написанию, но несмотря на это, в комментариях, порой, всплывает много полезной информации.

Итак, что возвращают функции поиска индекса в массивах, если элемент не найден?
Читать дальше →
Total votes 82: ↑60 and ↓22+38
Comments35

Arr.js: события для стандартного массива

Reading time3 min
Views12K
Arr.js — это «класс», унаследованный от стандартного Array. Отличительными особенностями являются: наличие события change для отслеживания любых изменений в массиве, и методы insert(), update(), remove(), set(), get() для упрощенной работы с массивом. Доступны все «родные» методы стандартного Array.

var fruits = new Arr('apple', 'orange', 'pineapple');

fruits.on('change', function(event) {
  alert('I changed fruits: ' + fruits.join(', '));
});

fruits.push('banana');

Читать дальше →
Total votes 32: ↑26 and ↓6+20
Comments25

Очередная критическая уязвимость в Drupal 7

Reading time1 min
Views20K


Вслед за уязвимостью в XML-RPC, недавно компанией Sektion Eins была найдена уязвимость, которой подвержены все версии 7 ветки. Она позволяет выполнить произвольный SQL-запрос в БД друпала не имея никаких прав в системе. Опасность определена как наивысшая. 15 октября вышло обновление ядра до версии 7.32, которое устраняет эту уязвимость. Разработчики настоятельно советуют обновить ядро немедленно. Обновление не займёт много времени, необходимо обновить только файл /includes/database/database.inc. Спасти сайты до обновления может только блокировка сайта, maintenance mode не поможет.
В чём слабость, брат?
Total votes 24: ↑20 and ↓4+16
Comments14

Немного о псевдомассивах (массивоподобных объектах или коллекциях). «Что это?», «Как с ними работать?» и прочее

Reading time4 min
Views46K
В этой статье я расскажу про псевдомассивы: «Что это?», «Как с ними работать?», «Чем они отличаются от массива?», «Как преобразовать их в массив?».

Так же, прежде чем начать, я уточню, что данная информация касается только JavaScript. То есть, я буду рассказывать о псевдомассивах в языке JavaScript.

Что такое псевдомассив (массивоподобный объект или коллекция)?


Псевдомассив — это объект, который структурно похож на массив. То есть у него есть числовые свойства (индексы) и свойство length.
Читать дальше →
Total votes 8: ↑7 and ↓1+6
Comments20

Defined or Undefined? Нюансы создания массивов в JavaScript

Reading time8 min
Views13K
image

Пару месяцев назад я наткнулся на интересный вопрос на stackoverflow, там, если вкратце, человек хотел создать пустую матрицу 5х5, и, используя один способ у него получилось, а используя другой — нет. В развернувшейся дискуссии на этот счёт были приведены интересные мысли.

Правда, задавший вопрос, так же как и те кто ему отвечал, не обратили внимания, на то, что фактически матрицу не получилось создать, а приведенный результат вычислений некорректен. Всё это меня заинтересовало, и, я решил копнуть чуть глубже, чтобы затем прийти к интересным умозаключениям, с которыми сейчас с вами и поделюсь.
Читать дальше →
Total votes 32: ↑31 and ↓1+30
Comments29

Как размеры массивов C стали частью двоичного интерфейса библиотеки

Reading time8 min
Views8.3K
Большинство компиляторов C позволяют получить доступ к массиву extern с неопределёнными границами, например:

extern int external_array[];

int
array_get (long int index)
{
  return external_array[index];
}

Определение external_array может находиться в другой единице трансляции и выглядеть так:

int external_array[3] = { 1, 2, 3 };

Вопрос в том, что произойдет, если это отдельное определение изменится так:

int external_array[4] = { 1, 2, 3, 4 };

Или так:

int external_array[2] = { 1, 2 };
Читать дальше →
Total votes 27: ↑26 and ↓1+25
Comments24

PostgreSQL Antipatterns: DBA-детектив, или Три дела о потерянной производительности

Reading time30 min
Views5.3K
Сегодня вместо решения абстрактных алгоритмических задач мы выступим в роли детектива, по крупицам доставшейся информации исследующего неэффективные запросы, и рассмотрим три реальных дела, встречавшихся в разное время на просторах нашего приложения СБИС, когда простота и наивность при написании SQL превращалась в дополнительную нагрузку для PostgreSQL-сервера.


Дедукция и индукция помогут нам вычислить, что же все-таки хотел получить от СУБД разработчик, и почему это получилось не слишком оптимально. Итак, сегодня нас ждут:

  • Дело о непростом пути вверх
    Разберем в live-видео на реальном примере некоторые из способов улучшения производительности иерархического запроса.
  • Дело о худеющем запросе
    Увидим, как можно запрос упростить и ускорить в несколько раз, пошагово применяя стандартные методики.
  • Дело о развесистой клюкве
    Восстановим структуру БД на основании единственного запроса с 11 JOIN и предложим альтернативный вариант решения на ней той же задачи.
Расследовать
Total votes 17: ↑17 and ↓0+17
Comments3

Обработка древовидного массива со Smarty

Reading time1 min
Views1.2K
Вчера столкнулся с проблемой. Имею массив, типа:

1 => array(
  'title' => 'название 1',
  'sub' => array(
    2 => array(
      'title' => название 2',
      'sub' => array(
        3 => array(
          'title' => 'название 3'
        )
      )
    )
  )
);

Обработка его средствами smarty получилась никакая — не поддерживает он бесконечных циклов внутри какой-либо функции. На уровне PHP это сделать не проблема — нужно просто прогнать весь массив через одну функцию вывода, в которой при нахождении подэлементов вновь делать вызов этой же функции, только уже с массивом подэлементов и дальше по аналогии.

Может кто реализовывал вывод таких древовидных массивов с помощью смарти? :)

Update: Смотрим вариант, найденный мной на каком-то форуме.
Читать дальше →
Total votes 8: ↑3 and ↓5-2
Comments14

Класс Set — повелитель массивов

Reading time1 min
Views1.2K
Сегодня кстати, вышел четвертый релиз-кандидат CakePHP 1.2. Более 300 изменений и все такое. Но сейчас речь не об этом.
Оказывается в недрах CakePHP давно живет класс Set, который активно используется в ядре и редко используется конечными пользователями. А между прочим зря.
О чем это ты?
Total votes 41: ↑29 and ↓12+17
Comments44

Проблема c массивами javascript в IE при межоконном взаимодействии

Reading time1 min
Views441
С занятной проблемой столкнулся. Есть у меня на странице сайта некий массив объектов, в общем не простая конструкция вида:
dataArray = [
{id1:data1},
{id2:data2},
{id3:data3}
]

сами данный не суть.

В программе есть такой момент, когда данный массив должен быть передан открывшемуся окну. К коде окна естественно прописано:
dataArray = window.opener.dataArray;

Проблема заключается в том, что как window.opener.dataArray, так и, соответственно, dataArray уже не являются массивами, т. е.:
window.opener.dataArray instanceof Array // false
dataArray instanceof Array // false, соответственно.
и соответственно теряют все присущие массивам методы.

Решение конечно есть — передавать массив через JSON, но оно какое-то… топорное что-ли…
Total votes 5: ↑0 and ↓5-5
Comments11

SoapServer на PHP. Пусть array всегда будет Map

Reading time4 min
Views2.5K
Во время работы над серверной частью одного iphone приложения, всплыла любопытная особенность Zend_Soap_Server. Приводила она к спонтанно (на первый взгляд) возникающим ошибкам при возвращении php-ных массивов. У нас выявление и отладка заняли несколько человеко-часов, и, возможно, данная статья позволит кому-то те же самые несколько часов сэкономить.
Читать дальше →
Total votes 8: ↑7 and ↓1+6
Comments2

Как устроены массивы в PHP

Reading time6 min
Views72K
В прошлой статье я рассказывал о переменных, теперь пойдет речь о массивах.

Что такое массивы на уровне PHP?


На уровне PHP, массив — это упорядоченный список скрещенный с мэпом. Грубо говоря, PHP смешивает эти два понятия, в итоге получается, с одной стороны, очень гибкая структура данных, с другой стороны, возможно, не самая оптимальная, точнее, как выразился Anthony Ferrara:
PHP arrays are a great one-size-fits-all data structure. But like all one-size-fits-all <anything>, jack-of-all-trades usually means master of none.

Ссылка на письмо



(на картине изображен HashTable с Bucket-ами, В. Васнецов)
Читать дальше →
Total votes 90: ↑77 and ↓13+64
Comments40

Тонкости Javascript/Node.js. Увеличиваем производительность в десятки раз

Reading time3 min
Views43K

Вступление


Появилась необходимость обмениваться сообщениями между сервером и клиентом в бинарном виде, но в формате JSON в конечном итоге. Начал я гуглить, какие существуют библиотеки упаковки в бинарный вид. Пересмотрел немало: MesssagePack, Bson, protobuf, capnproto.org и другие. Но эти все библиотеки позволяют паковать и распаковывать готовые бинарные пакеты. Не очень копался, возможно ли делать парсер входящего трафика по кускам. Но суть не в этом. С такой задачей никогда не сталкивался и решил поиграться с нодой и сделать свой. Куда же без костылей и велосипедов? И вот с какими особенностями Node.js я столкнулся…
Читать дальше →
Total votes 47: ↑35 and ↓12+23
Comments38