tgp.test3

tgp.test3

На Пикабу
1501 рейтинг 1 подписчик 0 подписок 4 поста 0 в горячем
Награды:
5 лет на Пикабу
2

Электронные таблицы под капотом

Электронные таблицы под капотом Habr, Электронные таблицы

В нашем документе может существовать множество таблиц. В таблицах есть колонки, строки, ячейки, и над каждым из этих элементов могут производиться операции вставки, удаления, перемещения и редактирования. В результате некоторых таких операций возникает необходимость пересчета формул. Изюминкой нашего редактора является то, что мы можем пересчитывать только те формулы, которые действительно нужно пересчитать. То есть формулы, значение которых могло измениться. Таким образом мы повышаем эффективность при редактировании больших документов, а также избегаем ситуаций, когда значение ячейки, содержащей, например, функцию RAND, изменяется при каждом редактировании документа.


КАК РАССЧИТАТЬ ФОРМУЛЫ?


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

Рассмотрим простейший вариант: в пустую ячейку вводится формула «=2+2». В этом случае надо всего лишь вычислить значение этой формулы.

Более сложный вариант, когда формула ссылается на другую ячейку, как показано на рисунке 1. Допустим, что изменилось значение ячейки B2. Тогда необходимо каким-то образом определить, что существует формула в B1, ссылающаяся на нашу ячейку, и вычислить ее, а затем вычислить формулу в A1.

Электронные таблицы под капотом Habr, Электронные таблицы

Рис. 1. Пример простой зависимости между формулами


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

Но этот вариант может усложниться, если формулы образуют цикл, как показано на рисунке 2.

Электронные таблицы под капотом Habr, Электронные таблицы

Рис. 2. Пример циклической зависимости между формулами


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


Существует два критерия выхода из цикла: достижение максимального количества итераций и достижение определенной точности результата вычисления. До тех пор пока цикл не вычислен, мы не можем продолжить вычисление зависящих от него формул.


Дополнительные проблемы возникают с функциями типа INDIRECT и FORMULA, которые не имеют прямой зависимости от ячейки. Чтобы определить, от чего зависит формула, содержащая подобную функцию, необходимо сначала вычислить значение параметра функции. А если эта формула попала в цикл, который изменяет значение параметра функции и вместе с ним зависимость формулы на каждой итерации, то оказывается, что граф зависимостей между формулами может изменяться динамически во время расчета.


Из вышесказанного составим следующий алгоритм расчета формул:

1. Определить, какие ячейки были изменены.

2. Найти формулы, которые ссылаются на эти ячейки.

3. Построить граф зависимостей между формулами.

4. Найти циклы в графе.

5. Установить порядок расчета формул.

6. Посчитать формулы с возможностью распараллеливания расчета.

7. Если в формуле обнаружена неявная связь и в результате расчета эта связь изменилась, необходимо выполнить алгоритм с начала.


КАК НАЙТИ ФОРМУЛЫ ДЛЯ ПЕРЕСЧЕТА


В представленном выше алгоритме расчета формул выполнение первого пункта тривиально. Рассмотрим подробнее второй шаг: как определить, какие формулы ссылаются на нашу ячейку.


Так как размер таблицы огромен – 1.7*10^10 ячеек, а формула может ссылаться на целый столбец или целую строку, например «=A:B», то хранить обратную связь от каждой ячейки к формуле не имеет смысла. Перепроверять все формулы каждый раз, когда изменилась ячейка, тоже неэффективно. Мы решили хранить данные о том, на какие ячейки ссылается каждая формула. Таким образом для каждой таблицы храним ссылки в виде координат левого верхнего и правого нижнего угла диапазона. Теперь для ссылки A:B координаты будут выглядеть так (0, 0; 1, 1 048 576), где 1 048 576 – максимально возможное число строк. Когда мы узнаем, что изменилась ячейка (COL, ROW), можно определить, в какие диапазоны она попадает. 


Допустим, что у нас в документе существует N ссылок, а изменилось M ячеек. Тогда максимально возможный размер ответа на вопрос «Какие формулы нужно пересчитать?» может быть M*N, если вдруг окажется, что все диапазоны пересекаются и все ячейки попали в каждый из диапазонов. Но это редкий случай. Чаще всего диапазоны разрежены и мы можем подумать над тем, как оптимизировать поиск, чтобы не перебирать все диапазоны для каждой из ячеек. Простой и понятный способ немного ускорить поиск – алгоритм заметающей прямой.


Пусть каждый диапазон имеет два события – начало и конец. Отсортируем события по координате Х. Все изменившиеся ячейки (точки) также отсортируем по Х. Далее представим вертикальную прямую, которую мы сдвигаем вдоль оси Х от точки до точки, и поддерживаем коллекцию диапазонов, с которыми пересекается наша прямая. Для коллекции диапазонов мы выбрали хэш-таблицу, потому что она наиболее эффективна, если требуется добавлять и удалять элементы в случайном порядке. При пересечении событием начала диапазона добавим его в коллекцию, при пересечении конца – удалим его. Таким образом для каждой из точек мы всегда знаем, в какие диапазоны она попадает по оси Х. Среди них обычным перебором найдем те, которые подходят по Y.


Рассмотрим пример на рисунке. Цветными квадратами обозначены диапазоны, а точками на оси X – события. Пройдем по списку событий до точки 1 и увидим, что мы вошли в красный, синий и зеленый диапазоны. После этого проверим каждый из них по оси Y и определим, что точка попадает только в красный и синий. Дальше перемещаемся к точке 2 по X. Сначала видим, что красный диапазон закончился, удаляем его из списка, затем удаляем зеленый. Добавляем желтый. Точка 2 попадает в желтый и синий диапазоны по оси X, то же самое выполняется и для Y.

Электронные таблицы под капотом Habr, Электронные таблицы

Рис. 3. Схема работы алгоритма заметающей прямой в применении к поиску вхождения точек в двумерные диапазоны


Хотя в худшем случае время работы алгоритма составит M*N, в среднем алгоритм должен работать гораздо быстрее. В условиях разреженной таблицы время работы может приближаться к N+M*log(M). Для хранения данных требуется M+N памяти. Очевидно, что это минимально возможные затраты. Также есть поле для дальнейших оптимизаций, которые мы решили отложить, если не столкнемся с проблемами в производительности.

Выше мы упомянули, что поиск диапазонов по оси Y выполняется обычным перебором. Но если большое количество точек и диапазонов совпадают по оси Х, можно применить алгоритм заметающей прямой и для поиска по оси Y. Для этого необходимо для текущих диапазонов создать отсортированный по оси Y список событий. Точки сортировать не нужно, предполагается, что они уже были отсортированы ранее по X и Y. Тогда время поиска по оси Y составит N*log(N)+M, оптимизацию можно применить при таких M и N, когда выполняется условие N*log(N)+M < M*N.


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

До встречи.

Показать полностью 3

36 на Fronttalks. Доклад о том, о чём нигде не рассказывают

Привет, я фронтенд-разработчик из Яндекс.Карт. Год назад я сделал странное — на фронтенд-конференции Fronttalks в Екатеринбурге рассказал доклад на совершенно не техническую тему. Программный комитет конференции сильно рисковал, когда ставил меня в программу — разве кому-то интересно слушать о глубоко личных переживаниях рядового верстальщика из Яндекса? К счастью, тема моего рассказа оказалась близка многим слушателям и доклад оказался одним из самых популярных за историю конференции.


Я благодарен организаторам за то, что мне посчастливилось выступить с таким докладом.

В этом году состоится третья по счёту конференция для фронтенд-разработчиков FrontTalks. На этот раз я не докладчик, а один из организаторов, и теперь у меня самого есть возможность «рисковать» и составлять программу конференции так, чтобы вам было интересно. Ниже расскажу немного о том, что у нас получилось.


«Introduction to accessibility mechanics». Леони Уотсон — слепая. Она расскажет нам, зрячим, о её «видении» доступного веба.


«Веб-анимация на JS и CSS». Александр Завьялов работает в такой группе, которая имеет едва ли не самый богатый опыт создания анимаций в Яндексе. Легко, понятно, без заумностей Александр расскажет нам, какие способы анимаций стоит использовать и в каких случаях.


«Вызов принят». Анна Селезнёва поведает, как ей посчастливилось создавать необычный сайт. Расскажет о трудностях, которые ей пришлось преодолеть. В её рассказе будет достаточно технических деталей, о которых (я точно знаю), многие из нас услышат впервые в жизни. Это будет живая, яркая, смелая история.


Ещё мы увидим Мартина Клеппе с докладом «Different Characters». Мартин обещает нам веселый рассказ, который по его словам «способен взорвать наш мозг и увеличить нашу продуктивность». Посмотрим :)


Владимир Кузнецов расскажет о набирающем популярность сборщике проектов «WebPack» — расскажет о малоизвестных возможностях утилиты. А Александр Зинчук в своей неповторимой манере рассказчика расскажет о другом сборщике «yms». А мы, после этих двух докладов, вызовем ребят на ковер и заставим сражаться — пусть объяснят нам, какой же сборщик из этих двух нам хотеть и почему :)


Ещё нас ждёт выступление Романа Дворнова из Avito. Роман как бы апеллирует к двум предыдущим докладчикам и говорит им: «Парни, сборщиками и другими консольными инструментами никого не удивишь. А вот автоматизации самого процесса разработки того, с чем мы имеем дело в браузере, уделяется меньше внимания…». Интересно, что на это заявление ответят предыдущие два докладчика? :)


Тимофей Чаптыков из 2ГИС расскажет об инструменте для «приятного контроля» качества вёрстки. Контроль бывает разный, но приятный — только от разработчиков 2ГИС. Я видел этот инструмент полтора года назад, когда был в Новосибирске у 2ГИС в гостях. Сейчас этот продукт может увидеть каждый. Удивительная вещь.


В конце дня нас ждут два ярких мотивирующих выступления от Андрея Ситника и Олега Мохова.


Весело и убедительно, смело и вдохновенно, Андрей расскажет об основных заблуждениях насчёт PostCSS и о том, как использовать PostCSS и Autoprefixer правильно.


А в заключение дня Олег поведает историю, как ему дали задачу сделать «ещё одну читалку книг в браузере», но он решил: «Если делать, то не ещё одну, а самую лучшую». Решил и сделал. История этого продукта — живая, познавательная, вдохновляющая на свои свершения.


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


После каждого доклада 10 минут на отдых — размять ноги и взбодриться чашкой кофе с печеньем. В течение дня два больших кофе-брейка и один перерыв на обед. В конце дня афтепати ;)


«Fronttalks», Екатеринбург, 19 сентября, БЦ «Палладиум».


Приходите, мы ждём ВАС!

36 на Fronttalks. Доклад о том, о чём нигде не рассказывают Habr, Интерфейс, Видео
Показать полностью 1
1

Векторный, открытый и удобный: Inkscape 0.91

Давно увлекаюсь векторной графикой, особенно ее созданием, отрисовкой с нуля. Много программ я пробовал, но в основном моим рабочим инструментом был CorelDraw, который меня всем устраивал. Не помню, почему и зачем я начал искать ему альтернативы, но в один прекрасный день я наткнулся на Inkscape. Это была любовь с первого взгляда…

Я все ждал, что на Хабре появится статья-обзор новых возможностей версии Inkscape 0.91, а ее все нет. Решил написать сам, если что не так – не судите строго, пишу редко.

Под катом будет много иллюстративных примеров и технических деталей.

Векторный, открытый и удобный: Inkscape 0.91 Habr, Open source, Гифка

Главное нововведение – смена рендер-ядра

Наверное основная причина, по которой после версии 0.48.5 последовала версия 0.91 в том, что Inkscape 0.91 включает в себя новое рендер-ядро на основе библиотеки Cairo. Большая часть работы по замене рендер-ядра была выполнена в рамках Google Summer of Code 2010 и 2011.


Что дает новый рендер:

1. Повышение производительности. Новый рендер выполняет отрисовку быстрее на большинстве рисунков. Рендеринг очень сложных объектов автоматически кэшируется, повышая скорость редактирования.

2. Поддержка технологии OpenMP обеспечивает многопоточность работы фильтров. Так же фильтры использоуют все доступные ядра процессора для вычислений. Это приводит к существенному ускорению редактирования рисунков с множеством фильтров на многоядерных процессорах.

3. Существенная экономия памяти. Теперь Inkscape использует меньше памяти при открытии сложных рисунков, иногда используя только 25% от объема памяти для открытия аналогичного рисунка в Inkscape 0.48.

4. Улучшение отзывчивости редактора. Рендер SVG графики теперь кэшируется. Что в результате дает повсеместное улучшение отклика подсветки при выделении кривых, процесса выбора/снятия выбора объектов и быструю перерисовку при редактировании кривых.

5.Устранено большинство ошибок отрисовки. Множество багов из нашей системы отслеживания ошибок закрыты в Inkscape 0.91. Теперь отображаются правильно:

 - Текстурная заливка (нет щелей между плитками, независимо от преобразования)

 - Результат трансформации объекта с его заливкой

 - Текстуры, содержащиеся в обрезанных объектах

 - Вложенные обтравочные контуры

 - Маска и обрезка объектов на которые наложены большие маски

 - Пути с широким сглаживанием и длинными скосами

 - Шрифты


Узлы

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

Векторный, открытый и удобный: Inkscape 0.91 Habr, Open source, Гифка

Измеритель


Измеритель – новая функция для измерения элементов в рисунке. Просто выберите инструмент, щелкните в любом месте на рисунке и перетащите мышку. Инструмент измерения интерактивно обновляет значения длины и градусы углов, когда вы двигаете им над объектами рисунка.

Векторный, открытый и удобный: Inkscape 0.91 Habr, Open source, Гифка
Показать полностью 2
1

Аутентификация: что общего между холодильником и ружьем?

Аутентификация: что общего между холодильником и ружьем? Habr, Безопасность

Всех с пятницей, уважаемые хабравчане! Как вы знаете, у нас в Почте, Календаре и Облаке используется двухфакторная аутентификация. За месяцы, прошедшие с её внедрения, у службы поддержки накопилось достаточно фактического материала, который ясно даёт понять: многие пользователи (и даже продвинутые) путаются в технических терминах. С чего мы это взяли — под катом.


Начнем с того, что множество пользователей путают понятия «аутентификация», «авторизация» и «идентификация». Как нам подсказывает Википедия:

Аутентификация — процедура проверки подлинности.

Авторизация — предоставление прав на выполнение определённых действий; а также процесс проверки (подтверждения) данных прав.

Идентификация — признание тождественности, отождествление объектов, опознание.


Как видите, смысл у эти трёх терминов разный. Кто-то об этом и так знает, кто-то сейчас узнал для себя нечто новое, а кто-то скажет, что какие-то из определений тождественны, просто описаны разными словами. Как показывает практика, немало пользователей, обращающихся в нашу службу поддержки, отчаянно путают термины, когда говорят о двухфакторной аутентификации. И сегодня мы решили поделиться с вами наиболее любопытными примерами из обращений пользователей. Итак, как же люди называют двухфакторную аутентификацию? Список читайте ниже, авторская орфография полностью сохранена (граммар-наци негодует). А восемь из них мы постарались проиллюстрировать, какой рисунок к чему относится — попробуйте догадаться сами.

Аутентификация: что общего между холодильником и ружьем? Habr, Безопасность
Аутентификация: что общего между холодильником и ружьем? Habr, Безопасность
Аутентификация: что общего между холодильником и ружьем? Habr, Безопасность
Аутентификация: что общего между холодильником и ружьем? Habr, Безопасность

двухтактовая защита

двукратный пороль

двуанифиакционная защита

двухфактурная аутентификация

двухуровневая аутентификация

двухствольная аутентификация

двухсторонняя аутификация

двухслойная индификация

двух сторонняя штука

двухяростная защита

двухмерная на другой телефон

двухядерная аундификация

двухтактовая индефекация

двухсторонняя треангуляция

двуфиксация

двухкраьная ауентификация

двухконтурная авторизация

двузтактовая аунтетификация

двухратная аунтификация

двухядерная аундификация

смс двух фактовая с номером

двухратная аунтификация

функция двухяростная

двухтактная аунтификация код+смс

новая зашита двусульная

двухкратная аутентичность

двуххактерная защита

двухфакратная аутенфикация

двухфактная модификация

двухвакторная индефикация

двух створчатая адентификация

двухкраторная аундентифакация

двухскатная аутентификация

двухэтажная аутентификикация

двух кратная привзяка

двухфронтальная аутефикацыя

двухуровневая инентификация

аунтефикация двухвакторная

двухкамерная аунтефикацыя

двух сторонняя аутифенция

двухвазный аунтификатор

двухкамерная фигна

двухвостная защита

двуанифиакционная защита


А какие названия сложных технических терминов приходилось слышать вам?

Показать полностью 4
Отличная работа, все прочитано!