Категория: Компьютеры

Заметки о программировании и на околокомпьютерные темы

Вложенные категории: Delphi, Игры

О паскале и объектах

Знаю, что программистов тут мало, но хочется куда-то написать. Я вдруг понял, какой полезной возможности нет в Delphi, которая давно есть во всех компиляторах.

В ней нет объектов.

Конечно, есть классы, которые (далее)

почти объекты. Кроме того, что они тяжёлые. Создание класса – это вызов десятка функций, сотни проверок, несколько выделений памяти. По космическим меркам это всё, конечно, мелочи. По сравнению с поиском в какой-нибудь сотне тысяч записей или рендерингом какой-нибудь сложной фигуры цена создания класса – разменная копейка. На неё не стоит обращать внимания, говорит идеология Delphi.

Но это неправда.
Копейки очень быстро собираются в рубль. Классами нельзя играть с такой же лёгкостью, как рекордами. Их не жалко в ситуациях, которые возникают редко: при создании приложения, открытии окна, загрузке файла. Но при обслуживании запроса по сети? Уже нет. Создавать класс на каждый запрос – слишком дорого. А если их будет тысяча в секунду? А десять тысяч?

Остаётся использовать для таких задач рекорды. Но тогда пропадает вся полезность классов! Из объектов они превращаются в подобие неймспейсов: не воплощают функциональность элементов, а разделяют код.

Delphi очень нужны наследование и vtable рекордам. Ну или возможность сделать класс lightweight, чтобы он не вызывал всю эту борландовскую ерунду при инициализации. Чтобы стандартное Create было одним выделением памяти + занулениями, как с рекордом.

UPD: Эксперименты показали, что я в этом мнении более-менее неправ.

Новости с браузерного фронта

В Опере 10.5 новый Javasсript-движок с компиляцией в нативный код и новый графический движок с аппаратным ускорением. В результате Опера 10.5 в шестнадцать раз быстрее Оперы 9.5 в тесте SunSpider, и обходит в нём все браузеры, включая Chrome (славящийся именно быстрым JS).
Кроме того, у неё 100/100 в Acid3.

Кроме того, поддерживаются HTML5 теги video и canvas. Ускорение работает прекрасно, анимация на канвасе даёт десятки FPS там, где Хром и Файрфокс выдавливают из себя два-три.

В общем, Опера уделала всех и вся на поле боя, докуда дотянулись руки.

You know you’re screwed when…

У меня на компе две винды, XP и preview Windows 7. Для тех, кто не знает: превью-релиз семёрки вышел прошлой весной, и распространялся бесплатно. Обещалось, что он будет работать бесплатно год, после чего выключится, и придётся купить полную версию. Таким образом Майкрософт хотела заранее протестировать систему на ошибки.

Так вот, решил я переустановить XP. Перезагрузился в семёрку, забэкапил все данные, тяжело вздохнул – и удалил старую копию XP с диска.
“Вы точно хотите удалить папку?”
“В папке есть файлы, помеченные флагом read-only, вы точно хотите их удалить?”
“В папке есть защищённые системные файлы, вы точно хотите их удалить?”
“Последний раз спрашиваю: удаляем?”
“Удаляй!”

“Удалено. Кстати говоря, вы пользуетесь превью-версией Windows 7, а срок её действия только что истёк. До свидания”. Система выключается, щёлк – чёрный экран.

И я остаюсь с компьютером, на котором нет ни одной рабочей системы :)

На самом деле, семёрка работает и после истечения срока, просто время от времени злится и вырубается. Всё равно заставила понервничать.

С Баша

Пьер Косталь: Стоит объяснить коллеге, что “данные следует передавать в стрингах” – как наступает тишина в автобусе :)
Разумеется, поскольку ни один нормальный человек не передаёт данные в стрингах!

DirectX

Есть известная шутка о регэкспах: допустим, у вас возникла проблема, и вы прикидываете, как бы её решить. Тут вам приходит в голову: о, регэкспы!
Теперь у вас две проблемы.

В DirectX иначе: у вас по-прежнему одна проблема, потому, что прошлая проблема в сравнении с новой покажется ерундой…

Читая Accelerando…

Мыслепотоки, распределённо исполняющиеся на близлежащих процессорах – это ладно, но кое-что весёлое можно сделать уже сейчас. Программу для мобильников с GPS, действующую так: любая фотка автоматически загружается на сервер, который ищет в базе фотки в пределах 12 метров (точность GPS) вокруг, поворачивает их так и сяк, чтобы угадать, к чему относится нынешняя фотка.
И добавляет в базу под нынешним числом.

Профиты:
1. Появляется смысл щёлкать своей идиотской фотокамерой!
2. У любого населённого места на планете есть дофига фотографий со всех возможных сторон, по которым можно даже, наверное, восстановить 3d-версию места.
3. Установив место, мобильник коннектится к гугл-мапс, и рисует на экране “это столовая”, “это автобусная остановка”, “автобусы идут туда и туда”.

Пиарю-пиарю свою утилиту для добавления файлов в анидб: anidbtool.

Работает так. Из командной строки:

anidb mylistadd D:\Anime\Toradora\*.*
anidb mylistadd /S D:\Anime\*.mkv

Из проводника: правой клавишей по файлу или папке, “Отправить” -> “Добавить в Anidb”.

Добавляю функциональность по запросам. Если у вас есть затаённая мечта, которой вы с детства стеснялись поделиться, говорите мне.

Быстрый поиск

Быстрый поиск такая удобная штука, что его стоило бы изобрести на тысячу лет раньше. Привыкнув в Опере, на автомате пытаюсь жмакать “/” и искать файлы в проводнике.

Об авто-обновлении

Вручную пользователи обновляют программы неохотно – только если старая версия перестаёт работать. Поэтому было придумано авто-обновление. Но делают его из рук вон плохо. Обычно программа при запуске сообщает пользователю, что доступна новая версия и хорошо бы её скачать и установить.

Это почти всегда бесполезно, (…)

поскольку пользователь обычно запускает программу не из праздного любопытства. Он запускает её, чтобы сделать что-то конкретное. Иными словами, у него есть цель. Ему совсем не по душе отвлекаться, выключать программу, скачивать и устанавливать новую версию.

Чтобы решить эту проблему, автоматическое обновление стараются сделать как можно более простым. Программы скачиваются сами собой, устанавливаются сами собой, некоторые даже перезагружаются в новую версию автоматически. Но! Но!
Всё равно каждая задаёт пользователю идиотские вопросы.

“Доступна новая версия, хотите скачать и установить?”
Или, в хамовато-наглой версии Adobe Updater:
“Я без спросу скачал обновления, хотите установить?”

Ответ на это всегда будет “нет”. Потому, что пользователь не дурак. Он понимает, что если бы установка действительно была простой и быстрой, его бы не спрашивали. Обновление бы просто установилось само собой. (В конце концов, программисты ведь тоже не дураки, так?) А раз его спрашивают – ожидаются проблемы и перемены. А ему сейчас не до проблем, он другим занят.
И пользователь жмёт “Нет”.

Чтобы модель автоматического обновления работала, она должна удовлетворять трём условиям. Во-первых, при установке программма должна спросить, желает ли пользователь обновлять программу автоматически. И если пользователь не желает, не обновлять и больше не приставать (привет, Adobe). Во-вторых, если пользователь согласился, отныне и впредь скачивать и устанавливать обновления настолько незаметно, насколько это возможно.

Это значит – никаких подтверждений. Никаких всплывающих окон. Никаких значков “идёт обновление” возле часов. Никаких “обновление ещё не докачано, хотите выйти?” Никаких “установите и перезагрузите”. Полностью автоматически. Само нашло, само скачало, само установило при следующем запуске и загрузило уже новую версию. Пользователь должен вообще ничего не замечать.

И, в третьих, необходимо разделять обновления на ветки. “Маленькие” обновления, которые устанавливаются автоматически, не должны менять ничего серьёзного в интерфейсе. Только добавлять новые функции или исправлять ошибки. Никаких “автоматически устанавливает google toolbar”. Никаких “в новой версии добавили рекламу”. Если производитель софта хоть раз допустит подобное, пользователи просто выключат его авто-апдейт. Вот и всё, чем кончится.
Крупные же обновления нельзя устанавливать автоматически, и лучше даже не предлагать к установке до тех пор, пока нынешняя ветка не будет закрыта. В крайнем случае, предложить один раз – и лучше не всплывающим окном и не сообщением с кнопкой “OK”, а небольшой заметкой где-нибудь в статусной строке или на панели подсказки.

Об ошибках

В мире софта столько говорят об обработке ошибок, о грамотном управлении ошибками, о полезности ошибок, что привыкаешь, написав хорошую обработку ошибок, чувствовать себя защищённым от любых случайностей.

А между тем, контроль ошибок, assertionы и прочее – это, скорее, защита от случайно допущенных закономерностей. Настоящая случайная ошибка – это когда процессор сложил два и два и получил пять. Никакие try…except до конца от этого не защитят.
Слава богу, что такое редкость.

(С другой стороны…

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

Голый минимум того, на что можно рассчитывать – стек в сторону уменьшения и обратно до этой же величины; уже выделенная память и объекты; корректное исполнение кода на процессоре. Если что-то из этого недоступно, происходящее уже вообще не поддаётся контролю никак. В голом минимуме нельзя вызывать никакие внешние функции, нельзя, вообще говоря, даже обращаться к выгруженным страницам кода – физической памяти может не быть.

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

)