Рубрика «макросы» - 3

image
Жилой массив людей. Нет, серьёзно.

Холивары между ценителями Си и приверженцами его "сына" в лице C++ начались ещё до моего рождения и прекратятся разве что после смерти обоих этих языков и меня заодно. Адепты великого творения Кернигана-Ритчи до последней секунды рабочего дня готовы доказывать аксиомы приспешникам Страуструпа про вечность Си и его невероятную гибкость. Те в ответ им по-свойски советуют лучше порадоваться рабочему дню, ведь он вот-вот окажется последним – двадцать первому веку кроссплатформенный ассемблер не нужен. Распаляясь, сторонники Си приводят давно прошедшие через голову навылет миллионы тезисов "почему Си лучше C++", при этом каждый раз подчёркивая, что второй все достоинства первого растерял ещё будучи в отцовской утробе, попутно утратив лик человеческий. Обвиняемая сторона в обиде не остаётся и… а хотя постойте, о чём это я.

Я люблю Си, уважаю C++ и не переношу холивары (честно). При этом я осознаю, что в Си действительно не хватает многого, и яркий тому пример – отсутствие удобной работы с данными. В C++ эту проблему во многом решает STL и свойства самого языка. На мой студенческий взгляд, здесь особо отличается всем знакомый std::vector. Если стало интересно, как я реализовал его аналог средствами C89 – прошу под кат.

Читать полностью »

Черная магия метапрограммирования: как работают макросы в Rust 1.15 - 1В прошлой статье мы познакомились с одной из самых интересных возможностей языка Rust — процедурными макросами.

Как и обещал, сегодня я расскажу о том, как писать такие макросы самостоятельно и в чем их принципиальное отличие от печально известных макросов препроцессора в C/C++.

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

Читать полностью »

Прочтение публикации Упрощаем бинарный поиск в Excel сподвигло на дополнительное усовершенствование функции ВПР по сравнению с приведенным в статье.

Что не было учтено, и что хотелось бы добавить:

Читать полностью »

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

Предыстория

Все началось с того, что я открыл для себя т.н. Double-TRUE VLOOKUP trick (трюк с двойным использованием ВПР и ИСТИНА в 4-м параметре). Развернутое описание алгоритма можно найти в статье Charles Williams «Why 2 VLOOKUPS are better than 1 VLOOKUP» (в конце статьи).

Поняв принцип работы и открыв для себя, что этот подход может быть в тысячи раз быстрее обычного линейного поиска (ВПР с 4-м параметром ЛОЖЬ), я начал продумывать варианты раскрыть его возможности. В ходе реализации получилось несколько годных инструментов для контекстной рекламы, один из которых я еще продолжаю улучшать, и уже посвятил проекту пару статей на Хабре. Чтиво рекомендуется SEO-специалистам и специалистам по контекстной рекламе (сразу оговорюсь, по ссылкам в статьях уже устаревшие версии, последняя версия условно 6.0, ссылки на скачивание всех версий, включая самую свежую, будут в конце этой статьи):
Анализ больших семантических ядер, или «Робот-распознаватель»
Лемматизация в Excel, или «Робот-распознаватель 3.0

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

Синтаксис выглядит так: Если(ВПР(искомое; массив;1; ИСТИНА)<искомое;""; ВПР(искомое; массив;n; ИСТИНА))
где n — порядковый номер столбца, из которого мы хотим вернуть значение напротив искомого ключа.
Вместо «ИСТИНА» в 4-м параметре можно использовать «1» для номинального сокращения длины формул, это не меняет их сути.
Если озвучить ход работы формулы, будет нижеследующее:
«Если бинарный поиск ключа по первому столбцу массива возвращает значение, меньшее, чем сам ключ, возвращаем пустую строку. Иначе — возвращаем результат бинарного поиска ключа со смещением n»
Подход используется для того, чтобы не возвращать никаких значений, если искомый ключ в массиве отсутствует, т.к. зачастую, если искомое не найдено — нам не нужно меньшее значение. Так сказать, все или ничего. Вкратце, в этом и есть суть «трюка».

Напомню, на карту поставлен прирост скорости, исчисляющийся трех-четырехзначными числами. Если подходить чисто математически — на массиве в 2^20 строк обычный бинарный поиск будет делать ~10 вычислений, формула выше — около 20, в то время, как линейный поиск — ~500.000, т.е. прирост формулы выше — в 25.000 раз. Если голые цифры не впечатляют, более красноречивое эквивалентное сравнение — 1 секунда против ~7 часов.
На практике прирост не столь существенный (в конце статьи ссылка на статью, где сравнивались разные способы). Это во многом связано с затратами процессорного времени на дополнительные процедуры, которые выполняет программа (например, запись значений в ячейки). НО прирост по-прежнему критически значимый (~4000 раз).

Но одновременно с этим мы имеем сложный, совершенно неюзабельный синтаксис. Не всем смертным дался ВПР, что говорить о комбинациях 2х ВПР с ЕСЛИ.

Вопрос со сложным синтаксисом я решил с помощью VBA — написал UDF (user-defined function, пользовательская функция), которая прячет под капот наши условные конструкции, оставляя нам привычный синтаксис всем известного ВПР.

Код UDF:
Читать полностью »

Security Week 39: взлом Yahoo, брутфорс бэкапов iOS 10, макромалварь скрывается от исследователей - 1Что случилось с Yahoo? Как любит писать британское издание The Register, у Yahoo! на! прошлой! неделе! украли! полмиллиарда! паролей! (новость! официальное! заявление! Yahoo!) В предыдущей серии я кратко упомянул это событие, посчитав его масштабным, но не настолько значимым, чтобы дополнительно растекаться мыслью по древу. Ан нет. И дело не в том, что украли очень много паролей: предположительно взлом инфраструктуры Yahoo! случился! (вот, опять) в 2014 году, а сейчас базы поступили в свободную продажу в дарквебе. На фоне других взломов количественные характеристики хака впечатляют, но все же давно в курсе, что парольная защита — устаревший и неэффективный инструмент.

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

Но самое интересное в этой истории — последствия киберинцидента для крупной и публичной компании. Возникли справедливые упреки в том, что в самой Yahoo могли знать об инциденте, и скрывали эту информацию (последнее могло произойти и по миллиону уважительных причин). Позавчера New York Times со ссылкой на анонимных инсайдеров сообщила, что в компании банально экономили на средствах безопасности, включая системы обнаружения взлома.
Список предыдущих серий тут.
Читать полностью »

Если вы не слышали о call/cc, то вам определённо стоит познакомиться с этим мощным инструментом! Поговорим о продолжении (call/cc), простой, но трудно понимаемой конструкции, обладающей огромной силой в правильных руках. Реализуем с их помощью механизм yield/next/for… in, аналогичный таковому в Python. Обернём внутренности с помощью макроса — ещё одного интересного механизма Scheme.

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

image

Читать полностью »

Использование POS-клавиатуры для решения рутинных задач - 1
Вокруг нас есть множество полезных компьютерных устройств, которые при правильном приложении сил могут существенно помочь нам в решении типовых рутинных задач. И, к сожалению, немногие об этом знают и умеют применить такие вещи на практике. Сегодня я хочу рассказать вам о любопытном применении POS-клавиатуры для существенной помощи в работе QA-инженера. Это всего лишь одно из многих применений такого класса устройств для задач, где необходимо производить заданные последовательности одинаковых действий.
Читать полностью »

Вместо эпиграфа:
Сидит 30-летний программист за компом, программу отлаживает, обложился справочниками, документацией, дедлайн подходит, уже вторые сутки сидит, взъерошенный, немытый, красноглазый — не получается, глючит где-то.
Тут входит в комнату его немолодая мама, смотрит на него с тоской и говорит с укором:
— Всё играешься…

Поскольку обзоры никто полностью не читает, сразу «проматывая» до «выводов», то резюмирую здесь:

  1. Gamdias Hermes Ultimate — это дорогая, «имиджевая», универсальная (даже несмотря на то, что позиционируется она как игровая) клавиатура с расширенным функционалом: после тщательной «настройки» и «обкатки макросов» она позволит не только с успехом «валить фрагов», но и удобно работать;
  2. она построена на фирменных переключателях (свичах, кнопочках) Черри (Cherry MX) — мне досталась на «чёрных» (Black) — они идеально подходят не только для игр, но и для работы: нажимаются легко и практически бесшумно, срабатывают чётко, их очень приятно нажимать, о чём, собственно, и говорят все фанаты «механики»;
  3. в клавиатуре применена новая запатентованная технология GAMDIAS Element — специальные резиновые вставки под колпачками клавиш, которые увеличивают скорость обратного хода клавиш и снижают шум;
  4. все клавиши подсвечиваются красивым, насыщенным красным светом, яркость подсветки регулируемая;
  5. раскладка классическая ANSI: длинные «шифты» и «одноэтажный» Enter (т. е., ничто не помешает использовать её и для работы — собственно, мне лично именно такая раскладка нравится больше всех);
  6. имеется 13 дополнительных клавиш, 5 из которых традиционно расположены слева вертикальным рядком, 3 — под пробелом, ещё три — под правым Ctrl, и две — «по бокам» «стрелки вверх» «курсорного креста», все дополнительные клавиши, как и «основные», сделаны на тех же фирменных свичах — никаких «полумер», «концевичко́в от мыши» и прочего;
  7. клавиатура крута до невозможности: кроме наличия так называемого NKRO абсолютно все клавиши поддаются переназначению (ну, кроме Fn, конечно);
  8. переназначать можно как на «другую клавишу», так и на разнообразные макросы (которые легко записать и отладить в программной оболочке Hera), и ещё много разных «служебных» функций;
  9. как таковые макросы можно без проблем записывать непосредственно с само́й клавиатуры, не загружая «Геру»;
  10. есть 10 (десять!) мгновенно переключаемых профилей, которые ещё и «связываются» с программами;
  11. в комплекте идёт удобная, красивая и вполне эргономичная подставка под запястья, которой можно, когда компьютер выключен, «накрыть» клавиатуру чтобы она не пылилась;
  12. кроме своего функционала, клавиатура весьма красива своей строгостью и изысканной прямотой линий, большой подсвеченный логотип посередине выгодно дополняет имидж;
  13. в клавиатуру также встроены удлинители порта USB, выхода наушников и микрофонного входа компьютера, т. е., мышку и гарнитуру можно непосредственно «втыкать в клаву», а не лезть к задней стенке компьютера;
  14. дополнительные клавиши в сочетании с возможностью перепрограммирования и «навешивания» на клавиши макросов придают этой клавиатуре сходство с пультом управления звездолётом как внешне, так и «по ощущениям» и все ваши друзья, только взглянув на неё, дико обзавидуются, а «потрогав» её — сразу побегут в магазин за такой же!

Читать полностью »

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

enum Suit { Spades, Hearts, Diamonds, Clubs };

Обычно решение данной задачи базируется на дублировании значений, например, внутри switch-а:

switch(value)
{
    case Spades:   return "Spades";
    case Hearts:   return "Hearts";
    case Diamonds: return "Diamonds";
    case Clubs:    return "Clubs";
    default:       return ""
};

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

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

Далее в статье я опишу способ, позволяющий организовать рефлексию для enum-ов. Кому интересно — добро пожаловать под кат.
Читать полностью »

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

Встреча с Евгением Бурмако: макросы в Scala - 1

В грядущий вторник, 9 февраля, у нас в гостях будет Евгений Бурмако, PhD студент EPFL (École polytechnique fédérale de Lausanne), работающий в команде, ответственной за поддержку и эволюцию Scala. Во время своего пребывания в EPFL Евгений придумал макросы для Scala и реализовал их в официальном компиляторе. Последнее время Евгений работает над новым проектом, который значительно упрощает метапрограммирование в Scala и предоставляет новые возможности авторам средств анализа кода и интегрированной разработки. Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js