вторник, 1 ноября 2011 г.

Ruby: Hash — когда ключ не найден

Есть в стандартном классе Hash такая замечательная возможность — определить значение по-умолчанию, которое будет выдаваться вместо nil при обращении по неизвестному ключу. Например:

h = Hash.new("")
p h[:alpha]

выдаст именно пустую строку, а не пустое значение. Это само по себе может быть весьма полезным, но возможности Hash.new() этим не ограничиваются.

FPC-Notes: Начало работы

Предварительно хочу сказать, что данная заметка является непосредственным продолжением «Что такое Free Pascal?», а не «Hello, World!»

Очевидно, чтобы использовать Free Pascal, первым делом нам надо откуда-то его взять и установить на свой компьютер. Для этого нужно зайти на официальный сайт в раздел «Download» [1] и выбрать дистрибутив для своей системы. Далее следовать инструкциям на сайте. Для разных систем предусмотрены различные адекватные системы установки (на врезке показан установщик для Win32), в том числе deb- и rpm-пакеты для распространенных дистрибутивов Linux, dmg-образ для Mac OS X и т.д.

Таким образом вы получите последний стабильный релиз. Пользователям Linux имеет смысл предварительно выяснить, нет ли пакета fpc в репозиториях родного дистрибутива... Скорее всего он там найдется, но далеко не факт, что свежей версии1.

среда, 12 октября 2011 г.

FPC-Notes: «Hello, World!»

program Hello;

begin
 WriteLn('Hello, World!') 
end.
$ fpc hello
Target OS: Linux for x86-64 
Compiling hello.pp
Linking hello
5 lines compiled, 0.9 sec
$ ./hello
Hello, World!
$

Начнем по традиции с простейшей программы, делающей хоть что-то... Кто сказал «что-то полезное»? До чего-то полезного нам еще пилить и пилить. Достаточно типовой «Hello, World!» можно увидеть во врезке. Теперь можно сохранить этот текст в файл (например, hello.pp1), скомпилировать командой fpc hello и запустить. См. консольный фрагмент — если вы работаете в Linux или FreeBSD, результат должен быть похож. Да и в других системах отличия не особо существенны. Еще тут может выпасть предупреждение от компоновщика — на него внимания обращать не надо. Получилось? Теперь будем разбираться, что именно.

вторник, 11 октября 2011 г.

Что такое Free Pascal?

Free Pascal [1], точнее Free Pascal Compiler aka FPC — это свободный1 кроссплатформенный компилятор языка программирования Pascal. В отличие от другой свободной реализации этого языка — GNU Pascal, FPC ориентирован не на стандарт, а на популярные диалекты — то, что когда-то называлось Object Pascal, а теперь Delphi Language.

Существует также проект Lazarus [2] — основанная на FPC свободная среда программирования, реализующая значительную часть функционала собственно среды Borland Delphi (см. врезку). Простые проекты можно переносить практически без ручной работы, после чего они могут быть скомпилированы для систем, отличных от Win32.

FPC-Notes

Подумал я и решил написать серию заметок про Free Pascal. Причем, в перспективе эти заметки, начерно опубликованные в блоге, должны превратиться в полноценные статьи для FreePascal.ru, а там, чем черт не шутит, и в книгу. Первую, совсем-совсем вводную, выложу сегодня, вторую, тоже отчасти вводную, скорее всего — завтра, ее чуть-чуть доделать надо.

Очень надеюсь на комментарии — зачем бы еще публиковать черновики...

Вся эта серия будет маркироваться тегом «fpcnotes».

Выделение «маркером» в LaTeX

Иногда бывает полезно выделить в тексте небольшой фрагмент так, как это делается на бумаге маркером. В HTML это делается посредством указания атрибута стиля background-color соответствующему элементу (<span> в предыдущем предложении). В LaTeX для этой цели используется \colorbox{цвет}{текст}. Но есть нюанс.

понедельник, 10 октября 2011 г.

Git-dybr

По сути, пара ссылок.

Во-первых, с некоторых пор git-репозитории начал поддерживать сервис BitBucket. Преимущество у него перед GitHub'ом в том, что бесплатный аккаунт разрешает создавать и приватные репозитории, при этом сильно ограничивая количество их участников, что делает разумной покупку платных услуг для коммерческого проекта, и в то же время позволяет бесплатно разместить на сервере всяческие свои скрипты, конфиги, проекты в зачаточной стадии... Дизайн там оставляет желать лучшего, функциональность в чем-то превосходит GitHub, а в чем-то ему уступает. Лично я таки перенес туда то, что следовало сделать приватным, а публичные RDot и ppRuby продублировал, т.е. они сейчас и на BB, и на GH. Опять же, не помешает, если один из сервисов в какой-то момент окажется недоступным.

Соответственно, мои профили: shikhalev и shikhalev.

Во-вторых, хочу дать ссылку на актуальный форк QGit4, оригинальный — тот который находится в репозиториях Gentoo (и, подозреваю, других дистрибутивов тоже) — не совсем корректно работает с новыми версиями Git. Брать тут: https://github.com/scalm/qgit4. Инструкции по сборке там в README указаны.

суббота, 8 октября 2011 г.

Интервью со мной на RubyDev

Про RDot, немного про ppRuby, и вообще... (ссылка в заголовке)

суббота, 1 октября 2011 г.

LaTeX: некоторая тонкость с окружением wrapfloat

Обнаружил особенность окружения wrapfloat из пакета wrapfig (оно же wrapfigure и wraptable — принципиально они ничем не отличаются): это окружение плохо себя чувствует внутри определяемых пользователем окружений. Следующий фрагмент не работает так, как надо.

\newenvironment{mywrap}{%
\begin{wrapfloat}{figure}{O}{5cm}%
}{%
\end{wrapfloat}%
}

Это могло бы быть очень печально, но... Вспоминаем, как выглядят окружения с точки зрения TeX, пробуем, и ага — такая конструкция уже прекрасно работает.

\newenvironment{mywrap}{%
\wrapfloat{figure}{O}{5cm}%
}{%
\endwrapfloat%
}

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

воскресенье, 25 сентября 2011 г.

Осваивая XeLaTeX...

Печальное состояние дел с кириллическими шрифтами в TeXLive все более стимулирует изучение XeLaTeX, но там свои проблемы... Вот, что у меня нарылось в последние пару дней:

пятница, 9 сентября 2011 г.

RDot 0.9.3

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

Поскольку дополнительно я ввел новый ключ — --hide-arguments, который позволяет отказаться от аргументов методов, то решил и подвинуть версию уже в третьей цифре — RDot 0.9.3.

среда, 7 сентября 2011 г.

Как проверить rootfs

Намедни озадачился вопросом, как полноценно проверить корневой раздел на диске. То есть, оно понятно, что для этого надо перемонтировать его в read-only, но вот как это сделать... Нагуглить ничего не смог. Сегодня вдруг дошло. Ларчик открывается очень просто — [Alt]+[SysRq]+[U] перемонтирует все файловые системы в режим чтения. Непосредственно перед этим, правда, крайне желательно выполнить [Alt]+[SysRq]+[S] для сброса всех буферов на диск.

Жив ли оверлей sunrise?

Что-то обновлений давно не видно... Особенно обидно, что версия 2gis-data торчит мартовская, и, соответственно, «Дубль-ГИС» нормально не работает.

суббота, 3 сентября 2011 г.

RDot 0.9.2.4 — распознавание заголовков методов

Наконец-то дошли руки сделать так, чтобы RDot правильно распознавал произвольные (естественно, корректные с точки зрения Ruby) заголовки методов, независимо от использования/неиспользования скобок для списка параметров, записи в несколько строк и разнообразных значений по-умолчанию для аргументов. Для многострочных заголовков действуют следующие ограничения:

  • заголовок может состоять не более, чем из 4 строк;
  • перенос может производиться только после одного из следующих символов — ,{([|&+-*/=>.

upd: Всплывают новые глюки...

upd2: См. «RDot 0.9.3»

понедельник, 29 августа 2011 г.

Ruby: небольшой нюанс видимости атрибутов

Столкнулся с несколько неожиданной, да и неприятной, особенностью методов вида smth= — к ним невозможно обратиться без указания объекта в контексте самого этого объекта, обязательно нужно указывать self.smth, иначе происходит присваивание локальной переменной. Это касается как использования в методах того же объекта, так и в блоке, вызываемом через instance_eval(). Ниже — поясняющий пример.

среда, 10 августа 2011 г.

Про GPL

Этот текст я изначально написал в своем ЖЖ, но решил продублировать и тут.

Довольно часто встречаю в разных местах в интернете утверждения[пример], что в России лицензия GNU GPL не действует, и надо принять какие-то законы, чтобы ее признать... Так вот, лицензия, что GPL, что любая EULA, считается договором присоединения и вовсе не должна каким-либо образом быть прописанной в законодательстве. Такой договор должен не противоречить законодательству, а это совсем другое дело. Однако, утверждений, что GPL, Creative Commons или еще какие-то свободные лицензии именно противоречат российскому законодательству, я не встречал. Возможно, тут какой-то рудимент крепостного сознания, типа «что не разрешено, то запрещено», но вот утверждений на том же основании, что в России не действует, например, Microsoft EULA, тоже не видно.

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

вторник, 9 августа 2011 г.

Сравнение Google Maps и Яндекс.Карт на примере нашей глубинки

Сразу оговорюсь, что меня заинтересовало исключительно отображение спутникового вида, поскольку изначально задача стояла прикинуть свой путь по окрестным лесам во время похода за грибами. Итак, место действия — районный центр Арти в Свердловской области. Что мы видим на Google Maps, а что на Яндекс.Картах?

понедельник, 8 августа 2011 г.

QtCurve for Qt4

Такое смутное ощущение, что с того момента, как я поставил qtcurve-qt4 вместо дефолтных для KDE 4 тем оформления, интерфейс в целом стал пошустрее... Возможно, это только субъективное впечатление. С эстетических и эргономических же позиций на моем маленьком (по нынешним временам) мониторе это однозначно оптимальный вариант.

пятница, 29 июля 2011 г.

Распределенная блогосфера

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

четверг, 30 июня 2011 г.

Мой вариант yakurun

Yakuake — это такой весьма удобный терминал для KDE, прячущийся подобно консоли Quake. Задача — запустить в нем некую программу в отдельной вкладке и в конкретном каталоге. В целом решение взято из поста на Gentoo.ru, однако я убрал проверку существования вкладки (всегда открывается новая), добавил переход в нужный каталог, ну и использовал более понятные параметры командной строки, для чего вместо bash-скрипта написал короткую программу на Ruby. Код можно найти под именем yakurun в моей свалке скриптов на GitHub, или далее в этом посте.

Gentoo — маски в package.use

Не знаю с каких пор (когда-то давно я такое пробовал — не получалось) в package.use можно стало указывать не конкретный пакет, а маску. Т.е., например, так:

dev-ruby/*  doc

Для чего это может понадобиться — думаю, понятно из этого примера. Более того, корректно работает и маска «dev-*/*». При этом никто не мешает отменить действие, заданное маской для конкретного пакета — указание

dev-ruby/addressable  -doc

будет иметь преимущество, даже если расположено в файле до строки с маской.

вторник, 28 июня 2011 г.

Минорное обновление в RDot — v0.9.2.2

Несколько улучшил распознавание заголовков методов в RDot. Еще есть, к чему стремиться, но мои текущие задачи теперь решаются, а именно — теперь корректно обрабатываются параметры со значениями по-умолчанию, правда, не все, а только nil и {}. По-хорошему надо бы и для прочих литералов дописать обработку, но...

пятница, 27 мая 2011 г.

Calculate Linux — первый опыт

Если кратко, то Calculate Linux переводится как «у меня нет времени ставить Gentoo». Теперь немного подробнее.

Устанавливал я Calculate Linux Desktop KDE, сборку от 2011.05.19. Выбор был определен странными глюками после кривого (сугубо моя вина — намешал разных веток) обновления Debian. Намучавшись с невозможностью нормальной настройки «иксов», я прямо-таки физически испытал потребность в простой, а главное — хорошо мною изученной, системе гентушных конфигов, но нескольких дней на полную сборку системы с нуля у меня не было. Calculate со своей задачей справился.

среда, 20 апреля 2011 г.

Небольшое изменение в ppRuby

Внес исправление процедуры DefineFunction() в ppRuby. Теперь там используются типы TRubyMethodXXX, т.е. функции с дополнительным первым параметром, куда передается объект main. В связи с этим интересно, почему я его проигнорировал изначально — вероятно, ошибка присутствует в какой-то документации, но в какой именно, боюсь, сейчас не найти. Тем не менее: определяемые глобальные функции обязаны принимать первым параметром main — это для памяти...

четверг, 3 марта 2011 г.

вторник, 1 марта 2011 г.

Ruby: Небольшой нюанс обработки Regexp в блоках

Столкнулся со следующим, неожиданным для меня, поведением метода gsub() с блоком кода — если мы этот блок указываем не непосредственно, а берем откуда-то еще, то в нем не работают, как им положено, переменные $1, $2 и так далее.

пятница, 11 февраля 2011 г.

Определяем наличие перенаправления stdout во Free Pascal

Небольшое дополнение к давнему посту про определение того же самого в Bash и Ruby. Собственно, ограничусь кодом:

{$mode objfpc}{$h+}

uses
  BaseUNIX;

var
  info : Stat;

begin
 FpFStat(stdout, info);
 if (info.st_mode and S_IFCHR) <> 0
    then WriteLn('Test stdout console: '#27'[1mYES'#27'[0m.')
    else WriteLn('Test stdout console: no.');
end.

Точно работает под Linux, также должно работать под FreeBSD и MacOS X. Виндовый аналог искать лень.

суббота, 29 января 2011 г.

Занимательная архивация – 2 — 7-zip vs Bzip2 vs XZ vs LZMA vs LZip...

Все-таки собрался и немного потестил разные архиваторы. Результат в табличке.

  Набор примеров для учебника по Lazarus (см.) Образ диска VirtualBox Дерево исходных кодов Free Pascal с документацией
Исходный размер 56.1M 8.8G 297M
7z (t/size) 20.0s (17s) 411K 107m (80m) 2.8G 3m55s (2m52s) 125M
tar.bz2 53.6s 9.3M 67m 3.5G 2m28s 134M
tar.xz 30.1s 388K 133m 2.8G 4m40s 125M
tar.lzma 30.0s 387K 132m 2.8G 4m45s 125M
tar.lz 44.5s 388K 168m 2.8G 7m7s 125M
tar.7z 21.1s (20s) 392K 107m 2.8G 4m22s 125M

среда, 26 января 2011 г.

Использование Ruby в качестве скриптового движка в проектах Free Pascal & Lazarus

Пока кратко: по адресу https://github.com/shikhalev/ppruby находятся модули и пакеты Lazarus для использования Ruby в качестве скриптового движка в программах на FPC. Общий принцип следующий: для каждого published-свойства объявляются соответствующие Ruby-методы автоматически, другие методы объявляются вручную и пока доступны не для всех стандартных классов... Практически полностью «укомплектованными» можно считать:

  • TObject
  • TPersistent
  • TComponent
  • TStrings
  • TStringList
  • TStream
  • TFileStream
  • TCustomMemoryStream
  • TMemoryStream
  • TStringStream
  • TBasicAction
  • TCollection
  • TCollectionItem

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

В комплекте имеется демо-проект.

пятница, 7 января 2011 г.

Визуализатор классов Ruby — RDot 0.9.2

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

Поэтому просто, чтоб было: называется теперь программка RDot, чтобы не вызывать ненужных ассоциаций с Dia, располагается по адресу https://github.com/shikhalev/rdot. Там же README с описанием параметров.

четверг, 6 января 2011 г.

Ввод «типографских» символов с клавиатуры

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

Вообще говоря, ввод каких бы то ни было символов с клавиатуры можно организовать разными путями, некоторые из которых (например, определение собственной раскладки) доступны и в оффтопичной системе от MS. Однако, удобных способов существенно меньше. Собственно, я буду говорить о двух, простых как в использовании, так и в настройке: «третий уровень» и Compose Key.