Search in the blog:

2008-10-27

Эзотерический язык программирования Oroogu

Эзотерических языков программирования существует весьма много. Некоторые из них известны, а некоторые - совсем нет. Один из достаточно полных списков эзотерических языков программирования расположен здесь: http://esolangs.org/wiki/Language_list, там же есть краткие описания.

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

Среди всех языков мне показались интересными языки, построенные на концепции очереди. Основных их нашлось два: Q-BAL и Oroogu. Q-BAL более сложный, а вот Oroogu имеет весьма простой синтаксис. Но Oroogu настолько малоизвестный, что описание пришлось добывать через http://web.archive.org. Там же были добыты примеры и даже исходные тексты (на Си) компилятора. Идея, заложенная в Oroogu мне понравилась, поэтому я решил вкратце рассказать об основных особенностях этого языка.

Итак, язык программирования Oroogu. Автором языка является Georg Kraml, цель создания языка неизвестна. Основными типом данных в Oroogu является очередь. Работа с очередью происходит в обычной манере: можно добавлять элементы в конец очереди, можно извлекать из начала. При этом механизма доступа по индексу к произвольному элементу очереди нет.

Очереди могут включать в себя только целые числа. Точнее говоря, специально для реализации Ninety-Nine Bottles of Beer была добавлена поддержка строк, но в ограниченном виде (нельзя манипулировать содержимым строк).

Конструктор очереди выглядит просто: (1, 3, 5) создает очередь с элементами 1, 3 и 5. Возможно использование оператора .. для заполнения промежуточных значений. Так, например, (1, 3, 5 .. 7) будет содержать целые числа: 1, 3, 5, 6, 7. Этот оператор работает и в сторону уменьшения: (10 .. 1) будет содержать числа в убывающем порядке от 10 до 1 включительно.

В Oroogu есть переменные, но они могут содержать только очереди. Имена переменных не могут начинаться с цифры, длина их не может быть больше 8 символов. Переменные, начинающиеся с букв d и e, имеют особенность: после окончания работы программы их значения будут выданы в stdout и в stderr, соответственно. Переменные не нуждаются в определении.

Выражений в Oroogu не очень много.

Выражение присваивания d = c полностью копирует очередь c и присваивает d. Справа могут быть как переменные, так и конструкторы очереди. Слева допускается указание нескольких переменных через запятую:

var = (1, 2, 3)
i = var
k, m = i


После выполнения все упомянутые переменные (а именно var, i, k, m) будут содержать очереди (1, 2, 3).

Выражение объединения d / c объединяет очереди d и c и результат присваивается d.

var1 = (1, 2, 3)
var2 = (4 .. 6)
var1 / var2


В результате var1 будет содержать (1, 2, 3, 4, 5, 6)

Аналогично оператору присваиванию слева допускается указание нескольких переменных.

Выражение пересечения d \ c удаляет из d элементы c, если они есть.

v \ (2) удаляет 2 из очереди v, если 2 там есть
v \ v полностью очищает очередь v

Доступ к данным очереди и арифметика могут осуществляться только в конструкторе очереди. Доступ к значению из начала очереди осуществляется по имени переменной, в которой эта очередь находится. Запись var извлекает значение из начала очереди var и подставляет его в конструкторе. Запись <var просто подставляет значение из var, не извлекая его из очереди. Из арифметических операций поддерживаются традиционные +, -, /, * и оператор возведения в степень ** и оператор остатка от деления (либо %, либо mod - в разных документацих Oroogu указаны разные варианты).

(1, 2, 1 + 2) определяет очередь со значениям 1, 2, 3.

var = (1, 2, 3)
i = (var - 1, <var, var)


В результате var будет (3), а i - (0, 2, 2).

Стоит отметить, что выражения var = f и var = (f) имеют разный смысл. Первое выражение создает полную копию f, а второе выражение - извлекает из f первый элемент, который будет единственным значением очереди i.

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

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

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

Пример: i = (1..100) (dump / (<i * i)) собирает в переменной dump квадраты чисел от 1 до 100 включительно, после завершения программы dump (поскольку начинается с буквы d) будет выведен в stdout.

Заголовок цикла i = (1..100) присваивает переменной i очередь, содержащую значения от 1 до 100 включительно. Эта же очередь и будет очередью заголовка цикла. Поскольку первоначально она содержит элементы, то выполняется тело цикла: (dump / (<i * i)). В теле цикла (<i * i) берется значение из начала i, но без извлечения его из очереди, затем берется опять это же значение, но с извлечением. Эти значения (а они равны) перемножаются. Затем dump объединяется с получившейся очередью из одного элемента. Поскольку в теле цикла есть извлечение из очереди i, то цикл конечный. Он пройдет по всем значениям i от 1 до 100, после чего завершится.

Таковы вкратце основные конструкции. Еще стоит отметить, что в Oroogu нет функций, но есть возможность включать куски кода на стадии компиляции из файла.

Важным является то, что язык Oroogu является полным по Тьюрингу. Автор языка доказывает это неформально через сравнение с Т-полным языкомFloop.

Еще примеры.

Вывод Hello, world!:
d / ("Hello, world!")

К очереди d добавляется строка "Hello, world!", после завершения работы значение очереди d выводится в stdout, поскольку имя начинается с буквы d.

Вывод первых 10 чисел Фибоначчи:
buf = (0, 1)
i = (1 .. 10) (d, buf / (buf + <buf) null = (i))


Первоначально buf содержит очередь (0, 1). Затем организуется цикл. В заголовке цикла определяется очередь i, которая первоначально будет содержать значения от 1 до 10 включительно.
В теле цикла конструкция (buf + <buf) извлекает из buf значение и прибавляет к нему следующее значение из buf (но уже не извлекая его). Получившаяся очередь из одного элемента добавляется к очередям d и buf. Выражение null = (i) служит для простого извлечения значения из очереди i (тем самым исключая зацикливание и организуя 10-кратное выполнение тела цикла).
Таким образом, в d накапливается результат (все подсчитанные числа Фибоначчи), а в buf всегда держатся два значения, второе из которых - это последнее подсчитанное на данной итерации число Фибоначчи, а первое - предыдущее значение, точнее значение, которое будет использовано для вычисления следующего числа Фибоначчи.

Не совсем корректный вариант "Ninety-nine Bottles of Beer":
b = (99 .. 1)
(
d / (<b, "bottles of beer on the wall, ")
d / (<b, "bottles of beer.\n")
d / ("Take one down and pass it around, ")
d / (b - 1, "bottles of beer.\n\n")
)


Простой пример, в котором организуется цикл по перебору значений от 99 до 1 включительно. В теле цикла несколько раз используется первое значение из b без извлечения (конструкция <b), а затем под завершение тела цикла первое значение извлекается для организации последовательного прохождения по всем значениям b. Особенностью этого примера является разве что использование строк.

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

2008-10-26

Народное творчество: Бу Гага

Сегодня видел, как ушлая молодежь из дорожного знака "Бульвар Гагарина" путем замазывания букв сделала надпись "Бу Гага".

2008-10-23

Путепровод на M55 (станция "Глубокая")

Хорошая новость: на федеральной дороге М55 открыли путепровод через Ж/д пути в районе станции "Глубокая" взамен старого переезда.

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

Теперь дорога стала быстрее и безопаснее, чем я рад.

2008-10-22

Восстановление флешки Transcend V10 на 16ГБ

Флэшка Transcend V10 на 16ГБ сказал привет и отказалась работать.

Попытки реанимировать при помощи AlcorMP приводили к ошибке 30700. Пришлось задать в настройках AlcorMP руками одноканальный режим. Низкоуровневый формат прошел, но, естественно, осталось только 8ГБ.

Но хоть это, ибо гарантийный талон валяется неизвестно где.

2008-10-19

Гугл замахивается на форумы?

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

Например: "Сообщений: <количество>", "Авторов: <количество>", "Последнее сообщение: <дата>". Возможно такое уже давно, но заметил только сейчас.

Т.е. явно идет обработка информации с форумов с учетом структуры сообщений. Увидим, чем это грозит в дальнейшем. Как для ищущих, так и для владельцев форумов.

2008-10-18

Немного историческое (цены сотовых телефонов 2000-2001)

Нашел "прайс-лист" сотовых телефонов одной иркутской фирмы. Год примерно 2000-2001.







Изображения из альбомов:

2008-10-17

Устаревший термин "Автомагнитола"

Вообще, конечно, автомагнитол (т.е. умеющих работать с аудиокассетами) сейчас конечно осталось не так много, а среди новых - совсем мало. Но по привычке все равно хочется называть эти агрегаты автомагнитолами. Можно называть их более правильно или общим термином "головное устройство". Или уточненным "CD/DVD/MP3-ресивер", но, как говорится, "привычка - не рукавичка..."

2008-10-16

Магнитола Sanyo: установка времени (через кнопку DISP)

Просто памятка: на некоторых двухдиновых "автомагнитолах" Sanyo время настраивается через DISP+"громкость вверх" и DISP+"громкость вниз". Кое-как нашел комбинацию без документации.

2008-10-15

Effective Java, Second Edition

Книга "Effective Java, Second Edition" от Joshua Bloch. Оформлена в виде набора советов, объединенных по темам. Отражает современное состояние Java, т.е. используются enum, аннотации, generics. Ни в кое мере не является заменителем документации: бОльший упор на концепцию использования тех или иных конструкций.

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

В целом книга хорошая.

2008-10-14

"Конструкторы": пошлина на кузов

==
Постановление от 10 октября 2008 г. N 745 О временной ставке ввозной таможенной пошлины в отношении кузовов отдельных видов транспортных средств

Правительство Российской Федерации постановляет:
1. Утвердить сроком на 9 месяцев ставку ввозной таможенной пошлины на кузова для транспортных средств товарной позиции 8703, прочие (код ТН ВЭД России 8707 10 900 0), содержащиеся в Товарной номенклатуре внешнеэкономической деятельности Российской Федерации, утвержденной постановлением Правительства Российской Федерации от 27 ноября 2006 г. # 718 "О Таможенном тарифе Российской Федерации и товарной номенклатуре, применяемой при осуществлении внешнеэкономической деятельности", в размере, равном 15 процентам таможенной стоимости, но не менее 5000 евро за 1 штуку.
Для целей применения ставки ввозной таможенной пошлины товары определяются исключительно кодом ТН ВЭД России, наименование товаров приведено только для удобства пользования.
2. Установить, что действие пункта 2 постановления Правительства Российской Федерации от 22 октября 1997 г. # 1347 "Вопросы таможенно-тарифной политики" не распространяется на ставку ввозной таможенной пошлины, утвержденную настоящим постановлением.
3. Настоящее постановление вступает в силу по истечении одного месяца со дня его официального опубликования.
http://www.government.ru/content/governmentactivity/rfgovernmentdecisions/archive/2008/10/10/6345332.htm
===

"Конструкторам" привет!

2008-10-09

LPD: Midland GXT500

Обзавелся наконец-то LPD-радиостанциями (LPD - это маломощные станции на 433МГц). Модель: Midland GXT500. Интересно, что продавцы активно взамен "впаривают" G7, вроде как продолжение GTX400, но с поддержкой еще PMR.

С родными аккумуляторами решил не связываться, практичнее использовать AA-аккумуляторы. Но вылез интересный момент. Как оказалось, комплект Ansmann Photo 2400 очень заметно проигрывает по времени работы какому-то дешевому Samsung 2100, хотя покупались они пару лет назад одновременно. Что-то сильно стали AA-аккумуляторы Sanyo и Ansmann разочаровывать.


Еще по этой теме:

Рейка хайджека вместо рычага

Человек выехал на Suzuki Jimny в бревно, сломал продольный рычаг (фиксирующий передний мост от продольных перемещений). Вместо рычага приколхозили рейку от домкрата ХайДжек и поехали дальше. http://www.suzuki-club.ru/forum/showpost.php?p=396396&postcount=1 (с фото)

Отлично, я считаю.



Еще по этой теме:

2008-10-08

Подсветка домена в адресной строке (для Firefox)

Если нравится способ показа адреса в адресной строке Google Chrome с выделением домена черным цветом, а остальных частей URL - серым, то для Firefox есть соответствующий адд-он: https://addons.mozilla.org/en-US/firefox/addon/4014

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

Asus Eee PC 900: качество корпуса, сравнил с 901

Все таки корпус Eee PC 900 явно менее практичный, чем 701 из-за своей блестючести. Всего-то ничего использовал, а уже заметные потертости на крышке и аккумуляторе. На 701 был более матовый и устойчивый к потертостям корпус.

Посмотрел живьем Eee PC 901. Настораживает еще большие, чем у 900 размеры. Особенно заметно, если сравнить с 701. 901 какой-то весь пухлый. А так нормально. Очень уж хочется продолжительного времени работы, 701 и 900 в этом плане совсем уж слабые.

Еще посмотрел Acer Aspire One 8.9". Вообще не понравился. Здоровый, с бликующим (в соответствии с современным тенденциями) экраном, да еще и Acer. Вычеркиваем.


Еще по этой теме:

2008-10-05

GlobalSat BT-359: проблемы продолжаются, сервис GPSHome

Пользуюсь bluetooth gps-приемником GlobalSat BT-359, но его работа в последнее время не очень нравится. В основном претензии к холодному старту. Очень медленный и ненадёжный старт. Если делать холодный старт при движении, то задержка определения координат может достигать многих десятков минут, а в отдельных случаях вообще не получается определить координаты даже через очень долгое время ожидания. Такое чувство, что прибор сходит с ума и замыкается в себе. Иногда помогает вытаскивание аккумулятора на время. И вообще, ощущение, что сильно упала чувствительность. Иногда в весьма тепличных условиях видит от силы 3 спутника. Не очень нравится такое поведение.


Полез я на сайт globalsat в поиска полезной информации по этому вопросу. Ничего полезного не нашел, но наткнулся на их сервис GPSHome. Фактически, это сервис поддержки их GPRS/GPS трекеров TR-серии, но дается возможность потестировать в связке мобильный телефон с GPRS + bluetooth GPS-приемник при помощи Java ME программки.

Вообще, подобных сервисов довольно много, но посмотреть этот сервис было тоже интересно.

Java ME программа довольно простая и дубовая. Ничего не умеет кроме показа основных данных и передачи их на сервер. Увы, оказалось, что наименьший период передачи данных - 30 секунд. Многовато для отдельных задач. Зато данных передается довольно мало, экономится трафик. В автоматическим режиме, конечно, оставлять эту Java ME программу работать ненадежно, даже если решить проблему с питанием телефона и GPS-приемника.

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

Для трекеров есть поддержка управления через SMS, через некий "конструктор SMS", но проверить не удалось.

Какие-то выводы делать не буду, в основном GPRS/GPS трекеры мне интересны в применении к автоохранным системам, а здесь довольно простая обычная система. Да и проверять надо с их TR-трекерами, а не на суррогате в виде мобильного телефона.

2008-10-01

Asus Eee PC 900: саморазряд и нагрев

Что на 701, что на 900 Asus Eee PC зверский разряд аккумулятора в выключенном состоянии. Примерно за одну-две недели садится в ноль, и Eee PC не может даже включится.

Это первое.

А второе, замечаешь после долгого неиспользования Eee PC 701/900, что корпус довольно ощутимо греется во время работы. Все таки мобильный целерон та еще гадость.

И вообще, хочется трекпоинт на такой мелком ноутбуке, а не тачпад.


Еще по этой теме:

2008-09-20

Музыка Super Mario в разном исполнении

Отличная подборка исполнения музыки из Super Mario на разных инструментах: http://habrahabr.ru/blogs/humour/40265/

Терменвокс, однако, забавная штука.

2008-09-09

Вверх/вниз (восприятие направления)

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

Если рассматривать временную шкалу (прошлое-будущее) и, скажем, ряд натуральных чисел, то при горизонтальном расположении для нас, пишущих слева направо, все достаточно понятно. Слева будет прошлое, а справа - будущее. Если располагать числа по возрастанию, то они тоже будут идти слева направо. Как пример: ось абсцисс на графике. БОльшие значения располагаются правее, а меньшие - левее.

Если же рассматривать вертикальное расположение, то не все так просто. Здесь, как мне кажется, возникает конфликт двух восприятий. Во-первых, при записи или чтении текста прошлое у нас располагается выше. Не зря есть выражения "см. выше", "см. ниже". Это вполне логично вызвано тем, что текст мы читаем и пишем сверху вниз. Но, во-вторых, увеличение (значения, например) при этом воспринимается как движение вверх. Если говорить о том же графике, то ось ординат задает такое же восприятие: бОльшие значения находятся выше, а меньше - ниже.

Отсюда и возникают различные проблемы. Например, переключение каналов в программе с клавиатуры и колесика мыши. Как воспринимать это? Как листание (вниз - это следующий канал, вверх - предыдущий) или как изменение значений (вверх - увеличение значение канала, вниз - уменьшение)?

Причем эта проблема возникает не только чисто в компьютерных программах. Взять то же ручное управление АКПП. Если управление производится движением рычага вверх или вниз, то возникает точно такая же проблема: как воспринимать движение рычага вниз - как переключение на следующую или на предыдущую передачу? Разные производители применяют разные подходы к решению этого вопроса.

Но, возвращаясь к первоначальной проблеме колесика мыши, хотелось бы отметить, что проблема не только в том, как воспринимать движение вниз - как увеличение или как уменьшение значения. Проблема еще в том, что считать этим самым увеличением или уменьшением. Приближение к объекту - это увеличение значение (как масштаба) или уменьшение (как видимой области)? Вопрос риторический.

Подобные проблемы есть во многих областях. Например, в той, в которой лежат мои научные интересы, есть проблема определения отношения наследования на классах. Если рассматривать с точки зрения множеств объектов, то более специфичный класс задает МЕНЬШЕЕ множество. Но если рассматривать с точки зрения информации, то более специфичный класс задает БОЛЬШЕЕ количество информации.



Еще по этой теме:

Erdas Titan 2009 Viewer

Посмотрел Erdas Titan 2009 Viewer. Это программа, которая показалась мне похожей на Google Earth.

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

Что не понравилось:

1. По детализации проигрывает (по крайней мере на интересующих меня местах).
2. Управление не очень удобное. Первым дело пришло лезть и уменьшать чувствительность мыши в настройках (есть и такой пункт). Да и вообще, интерфейс сложно назвать сразу понятным.
3. При большом приближении появляются черные области на местах с низкой детализацией. Это вообще никуда не годится.
4. Для использования надо регистрироваться. Ужасно.
5. Выдает какой-то instant messenger. Зачем мне этот мусор? Даже если это полезная программа, но не надо так его навязывать.

Что понравилось? Ничего не понравилось.

Кстати, интересный вопрос по управлению колесиком мыши. Вот лично мне привычнее, когда для приближения (увеличения масштаба) надо крутить колесико ОТ СЕБЯ. Как в том же Google Earth. А в этом Viewer и в ДубльГИС - наоборот, К СЕБЕ. Раздражает.

2008-09-03

Новый браузер Google Chrome

Что сказать. На первый взгляд забавно. Люблю такие вещи, до этого игрался с Сафари, но уж больно он падучий. Попробую заменить его на Chrome.

Blog Archive