Pull to refresh

Меню элементов CSS для PowerPro

Lumber room
В какой-то момент соломинка переломила спину верблюда, и я таки сделал меню для вставки элементов CSS при редактировании html в редакторе или в поле ввода веб-страницы. С одной стороны, немного ускоряет набор длинных слов вроде background-color, с другой — служит подсказкой, какие элементы бывают и какие значения принимают.

CSS Menu for PowerPro

Технически это текстовый файл css_menu.txt, используемый в команде
*Menu ShowFile путь\к\файлу\css_menu.txt,
которая вешается на любую кнопку.

Если вдруг кто-то ещё использует PowerPro и тоже нуждается в автоматизации набора CSS, то вот, попробуйте :)
Total votes 4: ↑3 and ↓1 +2
Views 324
Comments 2

Споры о шаблонизаторах: троллинг или умные мысли?

PHP *
причины родились в том, что в топах посвященных обзорам конкретных шаблонизаторов спорят на обобщенную тему:
Обзор шаблонизатора Quicky: Производительность и Гибкость.
MACRO — гибкий PHP шаблонизатор, с человеческим «лицом»
раследование проведено на основе данных, полученных в топе:
HolyWar: Шаблонизаторы. Нужны ли они? состоятельны ли они? Форум.
результаты расследования под катом
Читать дальше →
Total votes 68: ↑55 and ↓13 +42
Views 1.5K
Comments 76

[В разработке] Перехватчик функций с неизвестными аргументами

C++ *Visual Studio *
Sandbox
Так уж случилось, что время от времени я развлекаюсь анализом клиентов ММО-игр на тему различного рода полезностей или получения информации о действии тех или иных игровых аспектов. Основное количество информации приносит разбор клиента в IDA Pro или OllyDbg.
Читать дальше →
Total votes 16: ↑14 and ↓2 +12
Views 5.3K
Comments 16

Язык в языке или встраиваем XPath в Scala

Scala *
Tutorial
Scala — великолепный язык. В него можно влюбиться. Код может быть лаконичным, но понятным; гибким, но строго типизированным. Продуманные до мелочей инструменты позволяют не бороться с языком, а выражать на нем свои идеи.

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

В этой статье я расскажу о том, чего делать, скорее всего, не стоит.
Я расскажу как встроить в scala другой язык.
Читать дальше →
Total votes 16: ↑16 and ↓0 +16
Views 10K
Comments 9

MacroGroovy — работа с AST на Groovy ещё никогда не была такой простой

Java *Groovy & Grails *
image
Последнее время часто приходится работать с такой мощной возможностью Groovy как Compile-time AST Transformations.

Так как я не люблю излишнюю динамику, то бОльшая часть проверок DSL на валидность у нас происходит на этапе компиляции, а так же мы используем очень много генерации кода. Поэтому каждый день приходится сталкиваться с составлением ASTNode-ов вручную.

def someVariable = new ConstantExpression("someValue");
def returnStatement = new ReturnStatement(
    new ConstructorCallExpression(
        ClassHelper.make(SomeCoolClass),
        new ArgumentListExpression(someVariable)
    )
);


До боли знакомые конструкции, не правда ли? Хотите, чтобы было вот так?
def someVariable = macro { "someValue" }
def returnStatement = macro { return new SomeCoolClass($v{ someVariable }) }


Или даже так?
def constructorCall = macro { new SomeCoolClass($v{ macro { "someValue" } }) }


В данной статье речь пойдёт о моём решении этой проблемы, максимально близком к родному решению Groovy — github.com/bsideup/MacroGroovy

Читать дальше →
Total votes 16: ↑16 and ↓0 +16
Views 5.6K
Comments 11

Макросы в Vim — это просто

VIM *
Tutorial

Макросы в Vim


Очень странно, с одной стророны тема довольно банальная, а с другой ни тут, ни на просторах интернета не видно хорошего понимания такой важной темы, которая может иногда сильно упростить задачу редактирования текста. К написанию меня подтолкнуло обсуждение макросов в Emacs в блоге Avdi Grimm'а, где в своё время никто не смог внятно объяснить, что в Vim есть то, чего ожидает автор поста от достойного текстового редактора. Исправим это, в первую очередь в себе, а потом пойдём и скажем этим из интернета, что они не правы.

Какие задачи редактирования текста помогут решить макросы? Например, такую: вот в этой самой строке, которую вы читаете, взять и все запятые поменять на 0. Можно вспомнить регулярные выражения, но не все их любят, и уж тем более не все помнят, как вставлять с их помощью перенос строки, а если вам нужно заменять какие-то символы, которые используются в регулярных выражениях как служебные, вы уже отвлеклись от своей основной задачи и вместо редактирования текста занимаетесь написанием регулярного выражения для поиска и замены, пробуя и ошибаясь.
Макросы позволят это сделать быстрее, с меньшим отвлечением на вспоминание и написание чего-либо. Запомнить как работают макросы очень легко, и это войдёт в ваш ежедневный аресенал наряду с прыжками по тексту.

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

Давайте сначала вспомним, как это сделать вручную.
f,r0
После чего можно нажимать последовательно ; для повторного поиска и . для повторения предыдущего действия. Но в какой-то момент это может стать не так просто, например, вам нужно добавить пару каких-то знаков между делом. Точка уже не сработает и нужно будет опять нажимать r0. Или этих запятых окажется довольно много, и щёлкать поочерёдно ; и . придётся довольно много раз. В этот момент что-то вам уже подсказывает, что такой механический труд можно автоматизировать.

Основы
Многократные повторения и рекурсивный вызов
Редактирование макросов
Вечные макросы
Всякое
Познать
Total votes 31: ↑30 and ↓1 +29
Views 23K
Comments 8

Макросы в haxe: выполняем код прямо во время компиляции (и это нормально)

Programming *Haxe *
В предыдущей статье я немного рассказал про haxe — простой и удобный язык общего назначения. Однако, кроме простоты и понятности, есть в нём и вещи глубокие — такие, как концепция макросов — кода, который выполняется в процессе компиляции. Почему в haxe нет традиционных Си-подобных макросов и какие возможности нам отрывают haxe-макросы, и пойдёт речь в статье.
Читать дальше →
Total votes 12: ↑11 and ↓1 +10
Views 5.9K
Comments 10

Макросы в InterSystems Caché

InterSystems corporate blog Abnormal programming *Website development *Programming *
Tutorial
Monet tulips in holland

Введение


Хочу рассказать про использование макросов в InterSystems Caché. Макрос — это символьное имя, заменяемое при компиляции исходного кода на последовательность программных инструкций. Макрос может «разворачиваться» в различные последовательности инструкций при каждом вызове, в зависимости от сработавших разветвлений внутри макроса и переданных ему аргументов. Это может быть как статический код, так и результат выполнения COS. Рассмотрим, как их можно использовать в вашем приложении.
Читать дальше →
Total votes 10: ↑8 and ↓2 +6
Views 3.3K
Comments 17

Выпуск Rust 1.32

Open source *Programming *System Programming *Compilers *Rust *
Translation

Команда разработчиков Rust рада сообщить о выпуске новой версии Rust, 1.32.0. Rust — это язык программирования, который дает возможность каждому создавать надежное и эффективное программное обеспечение.


Если у вас установлена предыдущая версия Rust с помощью rustup, то для обновления Rust до версии 1.32.0 вам достаточно выполнить:


$ rustup update stable

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


Небольшое замечание: за последнее время вышло несколько новых выпусков rustup! Чтобы обновить сам rustup, выполните rustup self update.

Что вошло в стабильную версию 1.32.0


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

Читать дальше →
Total votes 61: ↑60 and ↓1 +59
Views 7.5K
Comments 21

Расширение макроса assert() для реализации минимальной обработки ошибок

C++ *C *
– Сир, я придумал защиту от дракона. Он нам больше не страшен! Она срабатывает от взмахов крыльев дракона и включает громкую сирену, так чтобы все слышали, что приближается дракон.
– Что-нибудь ещё эта защита делает?
– Нет, зачем? Мы будем предупреждены!
– Да… Съедены под вой сирены… И ещё… напомни, когда у нас плановые отключения электричества?…

Описание проблемы


Данный способ не претендует на концепцию обработки ошибок в комплексных и сложных проектах. Скорее это пример того, что можно сделать минимальными средствами.
Читать дальше →
Total votes 13: ↑10 and ↓3 +7
Views 2.5K
Comments 16

Dialyzer specs: путь джедая

Elixir/Phoenix *

Есть два типа разработчиков, использующих эрланг и эликсир: те, кто пишет спеки для Dialyzer, и те, кто пока нет. Поначалу кажется, что это все пустая трата времени, особенно тем, кто пришел из языков с нестрогой типизацией. Однако они помогли мне отловить не одну ошибку еще до стадии CI, и — рано или поздно — любой разработчик понимает, что они нужны; не только как инструмент наведения полустрогой типизации, но и как отличное подспорье в документировании кода.


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


defs is_forty_two(n: integer) :: boolean do
  n == 42
end
двадцать строчек кода
Total votes 6: ↑6 and ↓0 +6
Views 960
Comments 0

Типы, где их не ждали

Open source *Erlang/OTP *Elixir/Phoenix *
Recovery mode

Давайте представим себе реализацию модуля Scaffold, который генерирует структуру с предопределенными пользовательскими полями и инжектит ее в вызываемый модуль при помощи use Scaffold. При вызове use Scaffold, fields: foo: [custom_type()], ... — мы хотим реализовать правильный тип в Consumer модуле (common_field в примере ниже определен в Scaffold или еще где-нибудь извне).


@type t :: %Consumer{
  common_field: [atom()],
  foo: [custom_type()],
  ...
}

Было бы круто, если бы мы могли точно сгенерировать тип Consumer.t() для дальнейшего использования и создать соответствующую документацию для пользователей нашего нового модуля.


Lighthouse in French Catalonia

Генерация типа структуры без СМС
Total votes 15: ↑11 and ↓4 +7
Views 1.4K
Comments 0

Типы в рантайме: глубже в кроличью нору

Open source *Erlang/OTP *Elixir/Phoenix *
Recovery mode

Когда я начинал писать заметку «Типы, где их не ждали», мне казалось, что я осилил принести эрланговские типы в рантайм и теперь могу их использовать в клиентском коде на эликсире. Ха-ха, как же я был наивен.


Все, что предложено по ссылке, будет работать для явных определений типа по месту использования, наподобие use Foo, var: type(). К сожалению, такой подход обречен, если мы хотим определить типы где-нибудь в другом месте: рядом в коде при помощи атрибутов модуля, или, там, в конфиге. Например, для определения структуры мы можем захотеть написать что-то типа такого:


# @fields [foo: 42]
# defstruct @fields

@definition var: atom()
use Foo, @definition

Lighthouse in French Catalonia


Код выше не то, что не обработает тип так, как нам хочется — он не соберется вовсе, потому что @definition var: atom() выбросит исключение ** (CompileError) undefined function atom/0.

Но не все так плохо.
Total votes 8: ↑4 and ↓4 0
Views 1.1K
Comments 0

Автоматическая генерация type classes в Scala 3

Scala *
Sandbox

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

В Scala 3, которая стремительно движется к релизу, появилась встроенная в язык возможность автоматической генерации type class. В этой статье делается попытка разобраться с использованием этого механизма на примере конкретного type class.

Читать далее
Total votes 11: ↑11 and ↓0 +11
Views 1.7K
Comments 0

Как я начал писать макросы для Rust на Gluon

Abnormal programming *Functional Programming *Rust *

Во многих языках есть специальный механихм для кодогенерации - макросы. Иногда из реализуют на отдельном достаточно примитивном языке, основанном на простой подстановке текста (препроцессоры PL/I и C, m4), но даже в таком варианте удается делать интересные и полезные вещи. Другой популярный вариант - макросы реализуются на том же языке, что и программа, в которой они используются. Такой подход ведет свое начало из Lisp (удобный тем, что формат программ и данных там одинаков), активно применяется в Julia, OCaml(camlp4/5), Scala, Haskell, Rust, а наибольшего развития получил в Nemerle, где макрос может может запускаться как до, так и после проверки и вывода типов, и в последнем варианте иметь доступ к типам.

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

Читать далее
Total votes 19: ↑13 and ↓6 +7
Views 3.6K
Comments 13