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

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

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

Купил нетбук с тачскрином

Asus EEE PC T101MT. У него крышка-вертушка: можно пользоваться как ноутбуком, а можно перевернуть и превратить в планшетный пк.

Пока выбирал, изучил модели, так что пишу краткий обзор на случай, если кому интересно. С самого начала я хотел купить планшетку, но такую, чтобы иногда можно было пользоваться и клавиатурой, поскольку чистые планшетки очень неудобны при наборе текста. Планшетки (TabletPC) бывают трёх видов:
– Просто планшетки, то есть – без клавиатуры. Всю поверхность ноута занимает экран.
– Перекидные (convertibles) – как у меня, с вращающейся крышкой.
– Гибридные – где экран вынимается из клавиатуры и может работать самостоятельно.

Идеально было бы купить гибрид, но их почти нет даже в штатах, а те, что есть – дорогие ноутбуки, а не нетбуки, как я хотел. Поэтому стал искать вертушку. (дальше)

В нашей стране можно найти два нетбука-вертушки: Asus EEE PC T101MT и Lenovo IdeaPad S10-3T. Последний доступен в двух модификациях: с WiMax-модемом (Yota) и без. Покупать с модемом выгодней – разница в полторы тысячи, когда внешние модемы стоят до четырёх, и к тому же – внешние! Конфигурации у Asus и Lenovo почти одинаковы: N450/1660Mhz, гигабайт памяти, 160 гигабайт на диске, встроенная видеокарта, Windows 7 Starter. Цены тоже сравнимы: 15-18 тысяч рублей.

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

Честно говоря, IdeaPad лучше. Не сильно лучше, но всё-таки ощутимо. Он легче, у него прекрасный экран. Неудачники с Engadget пишут: we were extremely happy to see ASUS use a matte, 1024 x 600-resolution 10.1-inch display — rather than a glossy one like that on the IdeaPad S10-3t. Не слушайте их. Экран IdeaPad офигенен. У него нет отблеска, на нём не остаётся отпечатков пальцев, он не рябит по изображению – его вообще не замечаешь! У EEE PC всего этого нет, и хотя к ряби можно привыкнуть а отпечатки стереть, вне всякого сомнения экран IdeaPad куда приятнее. Остальное можно списать в мелочи, но экран – мощнейшее преимущество IdeaPad, и если купите EEE PC, то ещё не раз позавидуете нетбуку от Lenovo, это я гарантирую.

Главная беда IdeaPad – дизайн.

Я не знаю, какому идиоту и по какому блату доверили дизайнить единственную вертушку Lenovo. Но то, что получилось, определяется моментально: девчачий нетбук. IdeaPad S10-3T продаётся в двух цветовых версиях: Cosmic Night и Cosmic Wonder. Уже по названиям можно понять, что пахнет жареным. Космик найт – это чёрная крышка и молочно-белая клавиатура. Увы, в Россию их не завезли, а модификацию с Йотой вообще не выпускали. У нас можно купить только космик вондер, а это – узор из разноцветных квадратиков и те же квадратики, выгравированые на клавиатуре.

Говорите, что хотите, а жить с этим я бы не смог. Если такой дизайн кому-то нравится – могу подсказать лавку на Савёловской, где вы купите любую из моделей намного дешевле средней цены, даже дешевле любой другой цены на Савёловской. Младшая модель обойдётся примерно в 15500, старшая – в 17000. (Средние цены – 17000 и 19000, обычно можно сторговать до тысячи вниз).

Ещё из плюсов IdeaPad: крышка вертится в обе стороны (на EEE PC только в одну). Из минусов: два USB-порта против трёх на EEE PC, и у Lenovo в комплект не входит стилус. Хотя, по правде сказать, стилус используешь довольно редко, но если уж он потребовался – хорошо иметь его под рукой. На EEE PC стилус есть, и главное – есть под него гнездо. Важная и приятная деталь. Ну и вообще, если не считать веса – держать в руках EEE PC приятнее.

Хотя, уже купив EEE PC, я вдруг решил, что неплохо было бы купить простую планшетку с USB-клавиатурой, и прежде, чем вы сделаете свой выбор, советую хорошенько подумать над этим вариантом. Нетбук-вертушка тяжёл. Нужно привыкать к его размерам, весу, привыкать разворачивать экран. С другой стороны, простую планшетку неудобно будет держать на коленях, когда печатаешь, а здесь это легко. В общем, приезжайте на Савёловку и пощупайте всё сами – тогда решите.

Теперь о том, как всё это в быту: очень удобно. Аниме на свёрнутом нетбуке смотрится прекрасно. Без клавиатуры работать несложно, для простых действий вроде загрузки следующего файла, перемотки, хождения по папкам – пальца хватает выше головы. Читать в метро или учить кандзи тоже удобно без клавиатуры, так что на новой планшетке я ещё почти не печатал.

Встроенный процессор видео тянет нормально. Про старое аниме я не говорю, но даже современные H264 играются без особых проблем. Система тоже быстрая, отзывчивая (добрая, сочувствующая) – после того, как оттуда удалить все предустановленные побрякушки. Об этом, кстати, интересное отступление.

На EEE PC, кроме Windows 7 Starter, установлена ещё одна операционная система, которую сам Асус за систему не считает. Они называют это “выключенным режимом”. Если, когда ноут выключен, нажать специальную кнопку, он по-быстрому загрузится, пропустив часть биоса, в некое подобие линукса, где нельзя устанавливать новые программы, но можно сёрфить интернет. Видимо, это сделано на случай, когда нет времени ждать загрузки Windows 7, а нужен интернет сейчас же.

После того, как я удалил из Windows 7 асусовские же свистопердюльки, она стала загружаться быстрее этой “быстрой” системы :)
К чести Асуса сказать, побрякушки удаляются легко и быстро. К неудовольствию – на сайте Асуса страницы, посвящённые этой модели, куда-то пропали, так что скачать побрякушки заново, равно как и обновления драйверов, пока что нельзя.

Очень, очень приятно удивило время работы от батарей. Родительский MSI Wind, с которым я работал прежде, тянул быть может три часа в режиме чтения, и хорошо, если полтора-два при просмотре видео. EEE PC T101MT тянет около четырёх часов на видео. Это просто праздник какой-то! Батарея такая долгая, что я читаю по дороге на работу, там не заряжаю нетбук, читаю по дороге обратно, приезжаю – и ложусь смотреть кино, поленившись даже воткнуть зарядку – батарей всё равно хватит на весь вечер. А когда они кончаются, то заряжаются почти мгновенно.

Portal 2

Новый Portal на E3: раз, два, три.

GladOS по-прежнему неподражаема:
Do you know the biggest lesson I’ve learned from what you did? We’re a lot alike, you and I. You tested me, I tested you. You killed me, I… oh, wait. I guess I haven’t killed you yet. Well, food for thought.

Но вот зачем в игре нужен этот бобик-скрепка из Microsoft Office… я не знаю. Здорово бы это действительно была скрепка, кстати.

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

Я написал предыдущий пост, и знакомый меня справедливо спросил, а какие же именно функции вызываются при создании объекта? Проверить несложно!
tmp := TObject.Create;
tmp.Destroy;

Оказывается, вот полный список всех вызовов при создании объекта: (далее)

Create
@ClassCreate
TObject.NewInstance
TObject.InstanceSize
@GetMem
TObject.InitInstance
@AfterConstruction
TObject.AfterConstruction

Из них TObject.InstanceSize и TObject.AfterConstruction не делают вообще ничего серьёзного, остальные не слишком много (20-30 инструкций).

Выглядит довольно безобидно! Как же на самом деле? Чтобы посмотреть, насколько быстро создаются объекты, я написал простенькую программу (pastebin). В ней в цикле создаётся и уничтожается 50 миллионов объектов и рекордов.
Для рекордов я использовал два варианта создания/удаления: GetMem/FreeMem и New/Dispose. Последний отличается тем, что Дельфи автоматически генерирует код, инициализирующий и очищающий так называемые “сложные” поля – строки и указатели на интерфейсы. Разумеется, Dispose не может быть быстрее FreeMem, поскольку в конечном счёте его же и вызывает!

Итак, пустой объект и пустой рекорд, результаты в миллисекундах:
Objects: 5469
Records through new/dispose: 344
Records through GetMem/FreeMem: 343

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

Теперь мы получаем:
Objects: 5453
Records through new/dispose: 1094
Records through GetMem/FreeMem: 1109

Откуда такой прирост у рекордов? Дело в том, что размер рекорда в прошлом эксперименте был равен нулю. GetMem/FreeMem просто игнорировала эти пустые запросы. У объекта же существуют скрытые поля. Если мы запросим размер объекта

tmp := TObject.Create;
writeln(‘Size: ‘+IntToStr(tmp.InstanceSize));

То получим:
Size: 4
Как только мы добавили поле и в рекорд, оптимизация GetMem перестала работать, и время создания записи подскочило в три раза. Но это ещё не всё! Добавим в рекорд поле типа string, чтобы проиллюстрировать разницу между New и Dispose.

Получаем:
Objects: 6188
Records through new/dispose: 3687
Records through GetMem/FreeMem: 1094

“Корректное” создание рекордов уже всего в два раза медленней объектов! Рекорды через GetMem/FreeMem работают с прежней скоростью, поскольку размер объекта не изменился: переменная типа string занимает те же четыре байта, что и integer.

Примерно то же получится, если добавить в рекорд динамический массив: он тоже требует финализации. А вот статические массивы не требуют: память для них выделяется за один запрос, вместе с памятью записи:
FField: array[0..40] of integer;
Objects: 6844
Records through new/dispose: 1188
Records through GetMem/FreeMem: 1187

Казалось бы, я совершенно напрасно ругал объекты! Ведь любой сколь-либо сложный набор данных в рекорде создаётся всего в два раза быстрее объекта. Ну, два раза для таких быстрых операций – это ерунда. Я уже готов был придти к такому выводу, как решил посмотреть, сколько занимает сложение строк:
s := s + ‘test’;
if Length(s) > 10000 then s := ”; //Чтобы не разбухала

1500 микросекунд! А разница между New и GetMem в примере со строкой была 2500!
Иными словами, расширение места под строку и копирование слова “test” занимает меньше времени, чем инициализация/финализация пустого поля типа string! Да как такое может быть?
Оказывается, вот как. Оказывается, для инициализации и финализации полей Дельфи вставляет не сам код, а вызов внутренних функций @New/@Dispose с параметром, в котором зашифровано, что именно удалять. Внутри этих функций довольно громоздкий процесс разборы параметра на части.

Попробуем сделать всё вручную! Напишем:
GetMem(rec, SizeOf(rec^))
pointer(rec.FField) := 0; //инициализация строки
rec.FField := ”; //финализация строки
FreeMem(rec);

Во-первых, дельфи могла бы догадаться, что на момент присваивания пустой строки rec.FField и так пустой. Но Дельфи этого, слава богу, не делает, и честно проверяет “if rec.FField<>nil then @LStrClr”, образно говоря. Таким образом, мы выполняем все операции, необходимые для создания/очистки рекорда со строковым полем.
Время? ~1300. Меньше, чем на 100 миллисекунд отличается от простого GetMem/FreeMem. Остальные 2400 микросекунд уходят на шатания по функциям @New/@Dispose с выяснением в рантайме вещей, которые и так известны на момент компиляции.

Теперь сделать решительный вывод опять стало сложно. Получается, если делать всё действительно оптимально – то есть, вручную – то рекорды примерно в шесть раз быстрее объектов – и этот разрыв будет расти с ростом сложности! Шестикратное замедление – это уже вполне значительная разница.
С другой стороны, если пользоваться для инициализации рекордов средствами Delphi (New/Dispose), то разница всего лишь в два раза, и она будет уменьшаться с ростом сложности! Ведь чем сложнее объект, тем большую часть создания занимает инициализация, а она общая у объектов и у New/Dispose рекордов.

Во всяком случае, вывод надо сделать такой: с рекордами не стоит использовать New/Dispose, это убивает весь их выигрыш в скорости. Если же вы используете New/Dispose, то уже не очень жалко превратить рекорды в объекты. Это уже мало (в пару раз) замедлит дело. Совершенно неожиданный вывод, поскольку я всегда считал New/Dispose быстрыми обёртками над GetMem/FreeMem.

Вообще же говоря, чтобы оценить порядок временных затрат: время на создание пустого TObject примерно равно одной десятитысячной микросекунды. В общем, я скорее всё же был неправ, обвиняя объекты в медлительности. Разумеется, было бы лучше, чтобы объекты создавались без дополнительной суеты, но её не так много, чтобы это делало их использование при большой нагрузке непрактичным.

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

Знаю, что программистов тут мало, но хочется куда-то написать. Я вдруг понял, какой полезной возможности нет в 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”.

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