среда, 29 мая 2013 г.

RDot — 1000 загрузок

Итак, RDot набрал 1000 загрузок на RubyGems. Вполне себе повод для поста с описанием текущих изменений, накопившихся со времени предыдущего.

Стабильная ветка — “fixes

v1.0.1
Исправление бага, внесенного шаловливыми ручками в версию 1.0.0 с невидимостью RDot::defaults, что вызывало падение при попытке запустить “rdot --help”.
v1.0.2
Исправлен незамеченный ранее баг с тем, что protected-методы дублировались еще и как public. Ранее же он не был замечен, видимо, из-за того, что сами эти методы редки...
v1.0.3
Улучшено отлавливание атрибутов. Теперь и в блоках.
v1.0.4
Сегодня руки дошли — в параметры командной строки добавлен ранее пропущенный (по невнимательности) “--color-module-core”.

Нестабильная ветка — 1.1.0.preX

Для установки из этой ветки нужно выполнить команду:

gem install rdot --pre

Основная функциональность, планируемая на версию 1.1, пока не готова, исправления вносятся параллельно стабильной ветке... Но один повод воспользоваться именно этой альфой есть — добавлен параметр «--graph-splines», который позволяет указать форму стрелочек на диаграмме. Возможные значения можно увидеть в документации GraphViz.

понедельник, 27 мая 2013 г.

Еще немного о контексте и блоках

Написанное мною в предыдущем посте можно понять так, что “define_method”, а точнее — блок вообще, не формирует своего контекста и области видимости локальных переменных. Это не совсем так — блок формирует собственный контекст, но этот контекст не является изолированным, в отличие от контекста, определенного “def”.

воскресенье, 19 мая 2013 г.

Отличие между def и define_method

Надо все же записать, а то сам регулярно на эти грабли наступаю...

Важное отличие между “def” и “define_method” в том, что “def” формирует свой собственный, полностью автономный контекст, а “define_method” работает с замыканием. Т.е. в примере:

a = 1

define_singleton_method :alpha do
  p a
end

def beta
  p a
end

alpha
beta

вызов “alpha” отработает нормально, а вот при вызове “beta” Ruby доложит о неопределенной переменной.

Небольшой JS-велосипед с пояснениями

Микробиблиотечка для формирования классов в JavaScript. Целиком обозреть файл можно на GitHub, а ниже я его рассмотрю по порядку фрагментов.

пятница, 17 мая 2013 г.

Об оптимизациях скриптовых языков...

Подумалось: а ведь скриптовые интерпретируемые языки вполне способны на некоторых задачах обгонять компилируемые и сильно, если программу не исполнять, а вычислять как формулу — это же совершенно не обязательно делать по-порядку. Можно «раскрыть скобки», «привести подобные», «сократить»... Соременные компиляторы, собственно, так и делают, но они могут зафиксировать только параметры, известные на этапе компиляции, а для прочих приходится учитывать все возможные комбинации значений, тогда как при каждом конкретном запуске программы их подмножество существенно ограничено. Многие вещи — такие как: переменные среды, параметры командной строки и т.д. — определяются при старте и далее могут считаться константами, соответственно, упрощаются выражения от них и т.д.

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

Что для этого нужно? Во-первых, структурированное внутреннее представление, с которым можно манипулировать как с формулой — это не текст и не байт-код (в Ruby свежих версий именно так). Во-вторых, необходимо как-то определять наличие побочных эффектов (в Ruby это, пожалуй, может быть довольно просто реализовано для собственно ruby-методов, а вот с модулями, загружаемыми как .so и .dll будет проблема. Впрочем, достаточно к нескольким системным фунциям типа “define_method” добавить соответствующие описательные параметры). И в-третьих, желательна жесткая инкапсуляция данных, так что Ruby для этой цели подходит, а вот, скажем, JavaScript — намного хуже.

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

среда, 15 мая 2013 г.

Пара гемов в копилку: фиксированная точка и автонумерация билдов

is-fixed

Очередной велосипед, нужда в котором вызвана неподходящим радиусом кривизны руля у велосипедов имеющихся.

Пока реализованы только базовые операции. В планах: дореализовать все методы и сделать округление банковским (опционально, скорее всего).

is-build

Автоинкрементация номера билда для гемов.

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

Данный гем добавляет объектам класса Gem::Specification метод «mkbuild», который вычисляет хэш включенных в гем файлов и, если тот изменился, инкрементрирует номер билда. Пример можно посмотреть в его собственной спецификации. Метод должен быть вызван после того, как уже заданы: название, список файлов и начальное значение версии (из трех чисел).

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

Исходники всех гемов по-прежнему можно взять на GitHub.

Странности статистики

Я время от времени просматриваю статистику посещений этого блога — самую обычную, встроенную. Там, в частности, показываются источники переходов... И вот тройка запросов в Яндексе, через которые ко мне заходят:

  1. shikhalev.blogspot.com (13 за неделю)
  2. vk.com (7)
  3. ââîä ñèìâîëîâ ñ êëàâèàòóðû (4)

Вот единственное, что из этого списка мне понятно — это кракозяблы третьим пунктом. «vk.com» у меня нигде не встречается (до этого поста). Что же до п.1, понятно, что ссылки там ведут куда надо, но что же это за читатель такой, который целеустремленно раз за разом вбивает в Яндекс полный адрес блога?..

вторник, 14 мая 2013 г.

Класс — это модуль и не модуль, и что с этим делать

Есть в Ruby одно заметное нарушение LSP: класс, будучи вообще-то модулем (Class — прямой наследник Module), не может быть использован вместо модуля в качестве примеси, т.е. в “include” или “extend”. Это, в принципе, обоснованно, поскольку они не только объекты, но и конструкции языка...