Вялое развитие с киданием из стороны в сторону в этом году JavaFX разочаровало настолько, что в последнее время даже не следил за новостями. А, оказалось, 4 декабря вышла все таки версия 1.0.
Конечно, переход на компилируемую версию в свое время здорово увеличил производительность, но убил многие вкусные штуки. Да и поздновато они засуетились, что вкупе с традиционным, мягко говоря, слабым подходом к пользовательскому интерфейсу может сыграть очень отрицательную роль. Но посмотреть надо, хотя бы ради якобы появившегося FX Mobile.
Search in the blog:
2008-12-06
MacBook Pro 15.4"
Итак, поехали, более подробно про MacBook Pro 15.4" A1211. ;-)
В целом сборка нормальная, но есть вещи, которые по мелочи, но суммарно заметно портят общее впечатление.
Эмблема с яблоком на лицевой стороне явно повернута так, чтобы гордо демонстрировать ее окружающим в правильном ракурсе. Но сперва его такое расположение путало: берешь в руки нотбук и понимаешь, что открывается он с другой стороны. И так постоянно.
Клавиатура удручает. Я даже не про дополнительную Command-кнопку, к этому я отношусь нормально. Но вот отсутствие непосредственных клавишь home, end, pagedown, pageup и delete удручает. Вообще не люблю урезанные ноутбучные клавиатуры, но такое... А так клавиши нормальные, нажимаются без ожидаемого люфта и не дребезжат практически, только Enter сильно узкий. Смотрел я еще мелкий MacBook, вот там клавиши явно похуже, они люфтили зверски.
Задумка с подсветкой клавиатуры неплохая, но реализация так себе. При определенных условиях из-за подсветки надписи вообще не видно, да и равномерностью подсветка не отличается.
У точпада удивляет отсутствие реакции на нажатие по самому точпаду, а не по кнопке. А так я вообще не люблю точпады, потому особо сказать нечего. Мышь лучше. ;-)
Где светодиодные индикаторы? Кроме индикатора питания/сна в кнопке открытия и индикатора CapsLock ничего нет. MacOS 10.5.5 особой скоростью в работе не отличается, потому часто возникают моменты, когда вообще не понятно что происходит: то ли не туда нажал, то ли просто грузится долго. Очень хотелось бы видеть индикатор обращения к винчестеру. Да и остальные индикаторы хотелось бы видеть (например, индикации включения беспроводных устройств).
Как уже писал, открывается ноутбук на довольно скромный угол. При работе на столе не влияет, но если работать полулежа, то неудобно.
Да, звук при включении - это просто ужасная вещь. Начал раздражать после уже второго включения. Причем самое маразматичное, что он стандартными средствами не отключается! Вот уж где бредятина. Может в Apple фанаты такого страшного звука, но у обычных людей этот звук вызывает желание со все дури шарахнуть ноутом об стену. Естественно, мириться с этим я не стал, к счастью нашлась готова работающая утилитка, позволяющая отключить эту гадость: http://www5e.biglobe.ne.jp/~arcana/software.en.html
С батарейкой ситуация мрачная. Ноутбук отключается при работе в совершенно произвольные моменты. Может при полном заряди, может при малом. Причем если он отключился, то при повторном включении отключается почти сразу же. Если полежит некоторое время, то потом после включения даже работает. Но не очень долго. Попытки решить проблемы нахаляву (сбросом SMC настроек) не принесли успеха. Вопрос пока открытый.
Еще по этой теме:
- Аккумулятор макбука: кердык (2010-04-23)
- Apple: и вот так у них все (2010-04-05)
- Apple (2009-11-02)
- MacOS X 10.5.7 (2009-05-18)
- MacOS X, проблемы с аккумулятором (2009-02-03)
- MacBook и MacOS (спящий режим) (2008-12-15)
- MacOS: впечатления (2008-12-13)
- MacBook приветствует пользователя, подмигивая экраном (2008-12-06)
2008-12-05
KOGAN AGORA PRO
Интересная штука: http://www.kogan.com.au/shop/android-powered-kogan-agora-pro-mobile-phone/
На первый взгляд очень заинтересовало: хочу замену E61, но для развлечения на Android OS. Ждем первых отзывов, когда это чудо реально появится.
===
Highlights
* 2.5-inch TFT-LCD flat touch-sensitive screen.
* Integrated QWERTY keyboard.
* High-speed 3G network connection.
* One-Touch Google Search ™.
* Easy Web Browsing.
* Easy-to-use email with attachment support for images, videos, music and documents.
* Customisable Home Screen with instant Email, text message and IM notifications.
* Instant access to mobile Internet services (Gmail ™, YouTube ™, Google Talk ™, Google Calendar ™, Google Maps ™).
* Music Player.
* Bluetooth® 2.0 with Enhanced Data Rate
* microSD™ expansion slot for all your storage needs.
* Wi-Fi network access.
* GPS navigation capability.
* 2.0 megapixel camera.
Android ™ Operating System
===
На первый взгляд очень заинтересовало: хочу замену E61, но для развлечения на Android OS. Ждем первых отзывов, когда это чудо реально появится.
===
Highlights
* 2.5-inch TFT-LCD flat touch-sensitive screen.
* Integrated QWERTY keyboard.
* High-speed 3G network connection.
* One-Touch Google Search ™.
* Easy Web Browsing.
* Easy-to-use email with attachment support for images, videos, music and documents.
* Customisable Home Screen with instant Email, text message and IM notifications.
* Instant access to mobile Internet services (Gmail ™, YouTube ™, Google Talk ™, Google Calendar ™, Google Maps ™).
* Music Player.
* Bluetooth® 2.0 with Enhanced Data Rate
* microSD™ expansion slot for all your storage needs.
* Wi-Fi network access.
* GPS navigation capability.
* 2.0 megapixel camera.
Android ™ Operating System
===
Немного ноутбучное (EeePC 900 и MacBook Pro)
Действительно, Eee PC 900 зверски жрет аккумулятор даже во выключенном состоянии. Но если отсоединить аккумулятор, то весь этот комплект может лежать куда как дольше (сильно дольше). Что я и стал делать, поскольку Eee PC используется не так часто, и неприятно брать его после пары недель и осознавать, что заряда аккумулятора уже не хватает даже для включения.
Еще теперь есть поиграться MacBook Pro 15.4" модели A1211 немного бу. С аккумом там тоже не все гладко: при работе от аккумулятора ноутбук просто отрубается в произвольные моменты времени. То ли батарейка сказала привет, то ли что-то другое. Еще удивляет неравномерная подсветка клавиш и то, что экран откидывается на весьма небольшой угол.
p.s. MacBook Pro к тому же и кирпич тот еще. Не люблю большие ноутбуки.
2008-11-28
Ирпедина (это я не поругался)
===
Тридцать лет назад о существовании этой планеты узнал человек. Спустя пять лет ее первооткрыватель Николай Черных решил дать астероиду имя - Ирпедина. Так выпускник Иркутского педагогического института выразил свою признательность альма-матер. Сегодня вузу вручили официальное свидетельство о присвоении названия.
===
Тридцать лет назад о существовании этой планеты узнал человек. Спустя пять лет ее первооткрыватель Николай Черных решил дать астероиду имя - Ирпедина. Так выпускник Иркутского педагогического института выразил свою признательность альма-матер. Сегодня вузу вручили официальное свидетельство о присвоении названия.
===
2008-11-24
Про книгу о вождении автомобиля
Отсканированный вариант упомянутой вчера книги про вождение автомобилей высокой проходимости есть, например, на Уазбуке: http://www.uazbuka.ru/lib/driving.zip
В формате DOC (MS Word), но читать можно.
В формате DOC (MS Word), но читать можно.
Листаем пожелтевшие страницы: советы по вождению
Вслед за правилами попалась забавная книга 1974 года. В. Б. ЛАВРЕНТЬЕВ. ВОЖДЕНИЕ АВТОМОБИЛЕЙ ВЫСОКОЙ ПРОХОДИМОСТИ (В ПОМОЩЬ СТРОИТЕЛЯМ БАМ).
Книга построена по типичным тогда правилам. Без даже малой части теории и основ физики никуда. Но есть и куча чисто практических советов.
Есть и такие советы (фактически сейчас это советы для автомобилей с АКПП):
Красота!
Книга построена по типичным тогда правилам. Без даже малой части теории и основ физики никуда. Но есть и куча чисто практических советов.
Многие опытные водители при встрече с разбитыми участками шоссе съезжают на обочину или полевую дорогу, которая идет параллельно шоссе — это обычно позволяет повысить среднюю скорость и снизить утомляемость от тряски.
При быстром течении двигаться следует под углом к берегу по течению. Это уменьшит волну перед автомобилем. Необходимо избегать крутых уступов на выходе из воды, а при отсутствии лучших участков срезать их лопатой. При входе в воду дверь кабины водителя необходимо открыть, чтобы вода быстро заполнила ее и не происходило всплывания передней части автомобиля. При выходе следует также открыть дверь, чтобы вода быстро вылилась.
В процессе преодоления участков бездорожья иногда складывается обстановка, при которой единственной возможностью объезда препятствия или разъезда является движение через участок мелколесья.
Для валки буфером сосновых деревьев ориентировочно необходимы следующие усилия тяги, кгс:
Диаметр ствола 100 мм 720
...
Для валки деревьев диаметром более 100—150 мм подъезжать к ним необходимо так, чтобы ствол приходился на стык продольной балки рамы с буфером. В противном случае буфер может быть погнут.
На выходе с крутого спуска может иметь место утыкание буфером в грунт. Однако грунт перед буфером, если он нескальный, обычно сдвигается легко и не оказывает большого сопротивления.
Есть и такие советы (фактически сейчас это советы для автомобилей с АКПП):
ОСОБЕННОСТИ ВОЖДЕНИЯ АВТОМОБИЛЕЙ ВЫСОКОЙ ПРОХОДИМОСТИ, ИМЕЮЩИХ ГИДРОТРАНСФОРМАТОР В ТРАНСМИССИИ
Гидротрансформатор облегчает преодоление таких препятствий, как уступ, облегчает валку деревьев при необходимости движения через мелколесье. Он позволяет подойти вплотную к препятствию и без удара, плавно начать преодоление его
Для этого после упора в препятствие достаточно увеличить обороты двигателя для получения достаточного уровня тяги на колесах. Остальные фазы прохода препятствий не отличаются от рассмотренных выше.
Наличие гидротрансформатора, позволяющее автомобилю двигаться на очень малых скоростях, порядка 0,5 км/ч, с успехом может быть использовано при необходимости ограничить уровень тяги на колесах при движении по участкам со слабым грунтом.
Преодоление сложных профильных препятствий, а также маневрирование в особо узких местах, например при погрузке автомобилей на другие виды транспорта, очень удобно выполнять при наличии в трансмиссии гидротрансформатора. В этом случае водитель, установив постоянную малую частоту вращения коленчатого вала двигателя и включив низшие передачи в коробке передач и раздаточной коробке, оперирует только педалью тормоза, регулируя степень притормаживания. Это позволяет двигаться с любой минимальной скоростью за счет проскальзывания гидротрансформатора.
Красота!
Еще по этой теме:
- В. Б. Лаврентьев. Вождение автомобилей высокой проходимости (2010-02-25)
- Про книгу о вождении автомобиля (2008-11-24)
2008-11-22
ПДД 1953
http://dima23390.narod.ru/pdd/index.htm#g37 - душевное описание правил дорожного движения (ПДД) 1953 года.
Радует терминология, стиль изложения, затронутые вопросы, особенно специфика тогдашнего транспорта. Интересно выглядят и ссылки на ситуацию в отдельных городах (Москва и Ленинград).
"Если при запуске двигателя в радиусе 15 м от заправочной станции происходят "выстрелы" или "чихание", двигатель нужно немедленно заглушить, а автомобиль следует откатить при неработающем двигателе в безопасную зону."
"Чтобы двигатель не заглох и автомобиль не остановился, запрещается переключать передачи и выключать сцепление, пересекая железнодорожные пути."
"В некоторых больших городах (например, в Москве и Ленинграде) движение в одном направлении ограничивается четырьмя рядами. В некоторых городах движение допускается только в один ряд."
"Нельзя автомобиль, проехавший внешнюю линию пешеходного перехода, подавать назад, даже в том случае, если в светофоре появился красный сигнал."
И еще море подобного. Рекомендую.
Радует терминология, стиль изложения, затронутые вопросы, особенно специфика тогдашнего транспорта. Интересно выглядят и ссылки на ситуацию в отдельных городах (Москва и Ленинград).
"Если при запуске двигателя в радиусе 15 м от заправочной станции происходят "выстрелы" или "чихание", двигатель нужно немедленно заглушить, а автомобиль следует откатить при неработающем двигателе в безопасную зону."
"Чтобы двигатель не заглох и автомобиль не остановился, запрещается переключать передачи и выключать сцепление, пересекая железнодорожные пути."
"В некоторых больших городах (например, в Москве и Ленинграде) движение в одном направлении ограничивается четырьмя рядами. В некоторых городах движение допускается только в один ряд."
"Нельзя автомобиль, проехавший внешнюю линию пешеходного перехода, подавать назад, даже в том случае, если в светофоре появился красный сигнал."
И еще море подобного. Рекомендую.
2008-11-18
2008-11-17
AlcorMP и безопасное извлечение флешек в XP
В том, что пропадает безопасное извлечение для флэшек в Windows XP, виновата программа AlcorMP. Это точно. Но способ лечения пока не узнал.
2008-11-14
Поддельные пельмени
В местных новостях показали сюжет про поддельные пельмени, внутри которых вместо мяса содержится вата. Самая обыкновенная вата.
2008-11-12
Линейки Canon IXUS и A-серии
Немного запутавшись в обозначениях линейки фотомыльниц Canon IXUS, полез на сайт производителя и стал делать табличку с интересующими данными (размер матрицы, объектив и т.п.).
Уже проделав эту работу, понял что зря. "Все придумано до нас". Такая таблица есть и в довольно ожидаемом месте: http://en.wikipedia.org/wiki/Canon_Digital_IXUS
Там же есть по A-серии: http://en.wikipedia.org/wiki/Canon_PowerShot_A
Уже проделав эту работу, понял что зря. "Все придумано до нас". Такая таблица есть и в довольно ожидаемом месте: http://en.wikipedia.org/wiki/Canon_Digital_IXUS
Там же есть по A-серии: http://en.wikipedia.org/wiki/Canon_PowerShot_A
2008-10-31
GoogleMaps Location API: общий принцип работы
Просто резюмирую доступную информацию относительно определения положения в мобильной версии GoogleMaps без GPS.
Определение заключается в получении координат по значениям MCC, MNC, LAC и CellID через сервер http://www.google.com/glm/mmap.
MCC - код страны (для России - 250).
MNC - код сети (МТС - 01, Мегафон - 02, Билайн - 99 и т.п.)
LAC - код локальной зоны (т.е. совокупности базовых станций, обслуживаемым одним контроллером)
CellID (CID) - идентификатор, состоит из номеров базовой станции и сектора.
База на сервере динамическая, реально строится и модифицируется по данным, которые предоставляют пользователи мобильной версии GoogleMaps с GPS.
Протокол взаимодействия с сервером Google не разглашает, но его вскрыли. Примеры работы с сервером через этот протокол:
На Python: http://forum.netmonitor.ru/about4470-0-asc-15.html#37336
На Python для S60: http://blog.jebu.net/2008/07/google-cell-tower-mapping-with-python-on-s60/
На C#: http://maps.alphadex.de/datafiles/fct0e1b11782832f02.cs
На Java для Android OS: http://davanum.wordpress.com/2007/12/01/android-much-better-geo-location-from-just-cellidlac/
Этого достаточно для написания собственного кода работы с сервером.
Да, стоит отметить, что ключевыми являются значения LAC и CellID. MCC/MNC важны только при наличии в базе на сервере нескольких значений пар LAC, CellID.
Для проверки я накидал программку, посмотрел на реальных значениях и сравнил с показаниями мобильной версии GoogleMaps. Все совпало.
Для получения реальных значений поставил на Nokia S60 FieldTest (хакерски довольно). Хотя можно и без этого. Если мобильная версия GoogleMaps умеет на телефоне определять положение без GPS, то можно пойти в "Справку", там вызвать "Общие сведения" и в самом конце информации будет строка вида myl:MCC:MNC:LAC:CellID
Определение заключается в получении координат по значениям MCC, MNC, LAC и CellID через сервер http://www.google.com/glm/mmap.
MCC - код страны (для России - 250).
MNC - код сети (МТС - 01, Мегафон - 02, Билайн - 99 и т.п.)
LAC - код локальной зоны (т.е. совокупности базовых станций, обслуживаемым одним контроллером)
CellID (CID) - идентификатор, состоит из номеров базовой станции и сектора.
База на сервере динамическая, реально строится и модифицируется по данным, которые предоставляют пользователи мобильной версии GoogleMaps с GPS.
Протокол взаимодействия с сервером Google не разглашает, но его вскрыли. Примеры работы с сервером через этот протокол:
На Python: http://forum.netmonitor.ru/about4470-0-asc-15.html#37336
На Python для S60: http://blog.jebu.net/2008/07/google-cell-tower-mapping-with-python-on-s60/
На C#: http://maps.alphadex.de/datafiles/fct0e1b11782832f02.cs
На Java для Android OS: http://davanum.wordpress.com/2007/12/01/android-much-better-geo-location-from-just-cellidlac/
Этого достаточно для написания собственного кода работы с сервером.
Да, стоит отметить, что ключевыми являются значения LAC и CellID. MCC/MNC важны только при наличии в базе на сервере нескольких значений пар LAC, CellID.
Для проверки я накидал программку, посмотрел на реальных значениях и сравнил с показаниями мобильной версии GoogleMaps. Все совпало.
Для получения реальных значений поставил на Nokia S60 FieldTest (хакерски довольно). Хотя можно и без этого. Если мобильная версия GoogleMaps умеет на телефоне определять положение без GPS, то можно пойти в "Справку", там вызвать "Общие сведения" и в самом конце информации будет строка вида myl:MCC:MNC:LAC:CellID
2008-10-29
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. Не стоит относится к нему как к языку, который может быть большим, чем простая игрушка или демонстрация идеи. Но мне он показался забавным.
Просмотр описаний показал, что большая часть языков не представляет особого интереса: либо они вторичны, либо идея в них скучная и банальная. Но есть и достаточно интересные языки, конечно, с учетом, что основная цель их создания - это вовсе не программирование на них.
Среди всех языков мне показались интересными языки, построенные на концепции очереди. Основных их нашлось два: Q-BAL и Oroogu. Q-BAL более сложный, а вот Oroogu имеет весьма простой синтаксис. Но Oroogu настолько малоизвестный, что описание пришлось добывать через http://web.archive.org. Там же были добыты примеры и даже исходные тексты (на Си) компилятора. Идея, заложенная в 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ГБ.
Но хоть это, ибо гарантийный талон валяется неизвестно где.
Попытки реанимировать при помощи AlcorMP приводили к ошибке 30700. Пришлось задать в настройках AlcorMP руками одноканальный режим. Низкоуровневый формат прошел, но, естественно, осталось только 8ГБ.
Но хоть это, ибо гарантийный талон валяется неизвестно где.
2008-10-19
Гугл замахивается на форумы?
Заметил, что в результатах поиска google стал для ссылок, ведущих на форумы, показывать дополнительную информацию.
Например: "Сообщений: <количество>", "Авторов: <количество>", "Последнее сообщение: <дата>". Возможно такое уже давно, но заметил только сейчас.
Т.е. явно идет обработка информации с форумов с учетом структуры сообщений. Увидим, чем это грозит в дальнейшем. Как для ищущих, так и для владельцев форумов.
Например: "Сообщений: <количество>", "Авторов: <количество>", "Последнее сообщение: <дата>". Возможно такое уже давно, но заметил только сейчас.
Т.е. явно идет обработка информации с форумов с учетом структуры сообщений. Увидим, чем это грозит в дальнейшем. Как для ищущих, так и для владельцев форумов.
2008-10-18
Немного историческое (цены сотовых телефонов 2000-2001)
Subscribe to:
Posts (Atom)
Blog Archive
-
▼
2025
(128)
-
▼
September
(10)
- Pentax Q "Unique Lenses"
- Toopre TL-221 bottom bracket wrench
- Kenko Soft 45/4.5: M42 adapter
- Mir-26B 45/3.5: Samples [1] - FF - f/3.5
- Sony a7c: v2.02 firmware
- Reverse Comp seatpost
- NONS SL42 (II): MC7 x2 teleconverter
- Pentax Q 07 11.5/9 Mount Shield Lens: Samples [1] ...
- Kenko Soft 45/4.5: 45mm soft focus lens
- Maxxis 27.5x1.75/2.4 tubes
-
▼
September
(10)