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

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

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

О браузерах

Я не знаю, откуда берут статистику все до единого (!) софтварные сайты, но у них расклад получается примерно таким:
50% – Internet Explorer
50% – Mozilla Firefox
0,5% – Opera

Между тем, не меньше трети моих знакомых, как и я сам, пользуется Оперой. Примерно с такой же частотой я встречаю поклонников Оперы в сети.
Откуда такая странная статистика? Почему Оперой все пользуются, но никто не пользуется?

Когда-то это объясняли тем, что Опера притворяется Internet Explorer-ом, и якобы вся её статистика идёт в его графу. Ерунда. В поле идентификации браузера Опера пишет: “Internet Explorer/compatible (Opera 9.0)”. Любой мало-мальски грамотный сборщик статистики посчитает всё правильно.

Наверное, у меня просто круг общения такой… “оперный”? А во всём остальном мире о ней и слышать не слышали?
Я, наконец, поставил себе гугловский счётчик статистики на сайт, и смотрю раскладку браузеров за несколько дней:
54% (!) – Opera
30% – Internet Explorer
15% – Firefox
~1% – прочие браузеры

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

Gentoo

Ставлю под виртуальной машиной Gentoo. За последние пару дней переставил уже четыре дистрибутива: Mandriva, Ubuntu, ещё другой Ubuntu, и теперь вот Gentoo.

Вариантов встретил три:
– раздутый, медленный и глючный дистрибутив, в котором “всё как в винде”, но, в отличие от винды, работать невозможно (Ubuntu)
– маленький, быстрый и удобный, установка которого выполняется в пару сотен шагов и занимает шесть часов времени.
– не запускается.

Не думаю, что такими темпами линукс когда-нибудь станет широко популярен ;)

UPD. Просто для протокола. Посоветовали Fedora, поставил, понравилось.

"Так не бывает!"

Многим режиссёрам и писателям стоило бы почаще задавать себе вопрос:
А что тут будет, когда герои уйдут?

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

Кашу явно хотелось погуще. (далее)

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

Ну, к Слайдерам придираться смешно, там вообще всё бутафорское. Но и многие серьёзные произведения грешат этим же. Хотят показать “жизнь мафии” – обязательно с десяток убийств за день. Как будто у мафии бесконечные людские ресурсы. Целыми днями кромсают друг друга пачками, и всё мало.

Да что далеко ходить, звездоносный Half-Life 2, City Seventeen. Сопротивление. Всю игру и все аддоны меня постоянно мучает мысль: да как же оно живёт-то, это сопротивление, если народ в нём мрёт, как мухи? Что ни встреча – то гора трупов, и ведь никто даже не удивляется! Привыкли!
Гордон едет, и подбирает спрятанные сопротивлением бомжпакеты. А кто их раскладывал, а? Я вот не могу себе представить, чтобы в сопротивлении специально был человек, который ездит и прячет пакеты с аптечками. И что “по пути” кто-то раскладывает – тоже не верю, Гордон же не раскладывает…

Об играх

Довольно очевидное наблюдение: голос – это веб2.0 в играх.

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

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

Чтобы понять, насколько это удобно, достаточно поиграть с наушниками и микрофоном ( … )

в Team Fortress 2. Пустяк – а взаимодействие команды возрастает многократно. Игроки не просто “бегают и стреляют” сами по себе, как это делали много лет до сих пор. Игроки договариваются. “Прикройте меня медиком, я их отстрелю”. “У нас на базе шпион, огнемётчики, займитесь”. “К нам идут доктор с пулемётчиком”. “Куда вы лезете, у нас в тылу дыра, инженер, поставь пушечку”.

Но почему вдруг сейчас? Ведь микрофоны и наушники были всегда. И переговариваться в играх можно было всегда. В Team Fortress нет, представьте себе, вообще ничего нового в голосовом общении. Всему этому – годы, это было ещё в первой “контре”.

Потому же, почему и веб2.0. POST и PUSH, на которых держатся подавляющее большинство коммьюнити-сайтов, были с первых спецификаций HTML, но заработали только в последние несколько лет.
Потому, что время пришло. Люди доросли. Технологии позволили. Раньше было можно, но не хватало мелочей – хорошего соединения, работающего микрофона – у каждого. Теперь всё это есть.

Кстати, а существуют MMORPG, в которой активно использовалось бы общение голосом? WOW, который делает вид, что впереди всей планеты – умеет, нет?
Если нет, то это стоило бы сделать.

Красный космос

Как человек, не чуждый попс-культуры, купил и поверхностно осмотрел игру “Красный космос”.
Игра эта притворяется русским японским народным хентайным дейтсимом. К сожалению, рисовать одинаковые глаза авторы игры к моменту релиза так и не научились, поэтому засланцев легко раскрыть.

Стиснув зубы, изучаю. Отчёты воспоследуют.
goblin mode off.

Монстер – 48 серий – полёт нормальный. Упоминаю Монстера, чтобы этой записи было за что поставить таг “аниме”.

Да, кстати

Фраза till you run out of cake обязана войти в историю английского языка наравне с “the answer to life, the universe and everything”.
У неё есть все шансы.

…There’s no sense crying
Over every mistake
You just keep on trying
Till you run out of cake
And the science gets done
And you make a neat gun
For the people who are still alive!..

Реклама

Пользуясь случаем, рекламирую: Half-Life 2 Orange Box.
Содержимое:
– Half-Life 2
– Half-Life 2: Episode One
– Half-Life 2: Episode Two
– Team Fortress 2
– Portal

Цена всех вошедших игр по отдельности: $130.
Цена коробки в американском интернете: $50 (это просто за скачивание!)
Цена в России: 450 рублей. На дисках. В красивой коробочке. С плакатом в комплекте. Легальная.

Если б так всегда – никаких проблем бы с копирайтом не было.

Useless FAQ

А вы знаете, что IDE-устройства в XP прекрасно подключаются на хотплаг?
Невероятно, Холмс!

Ну да, ещё мне двадцать лет. С днём рожденья меня, и всё такое.

"Ой, простите, это я во всём виноват"

От одной крайности до другой не так уж далеко.
В проекте N, над которым работают, как минимум, трое программистов, затесалась ошибка. Ошибку отловили техники, и доложили о ней с гонцом в программистский отдел:
– Товарищи, в проекте N задетектирована ошибка. Когда делаешь A, но не делаешь B, вместо C происходит D. Как насчёт порыться в коде на этот предмет?
– Не надо рыться, я знаю – это у меня ошибка. Я давно подозревал…
– Ох чёрт! Быть того не… Да это ж… минуточку… похоже, это я…
– Стойте, не торопитесь, проблема у меня. Пара минут, я исправлю.
– Да ты что, ошибка совершенно точно моя. Ведь знал же, что этим кончится…
– Какая она твоя, когда я её уже полгода на примете держу?
– Погодите-погодите…

Излишняя ответственность иногда вредит не хуже безответственности. Если ваш собеседник слишком быстро принимает на себя вину, возникает искушение так и оставить её на нём – раз уж сам вызвался.
Да, а ошибка была вашего покорного слуги ;)

ICFP 2007 или "Как лодку назовёшь…"

Конкурс ICFP 2007 торжественно завершился. Команда, в которой я играл, EFG (Epic Fail Group, “команда эпического провала” ), в полном соответствии со своим названием, заняла почётное 64-е место из 869-ти.

Я к этой цифре отношения почти не имею, поскольку ничто из моих трудов (кроме, возможно, устных советов) так и не принесло команде ни копейки.

Да и вообще, единственное, что принесло нам копейку – это случайно обнаруженный внутри файла… (далее)

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

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

А теперь подробнее.

Авторы ICFP обожают придумывать своим заданиям любопытные предыстории. Вот и на этот раз, случилось так, что на планету Земля из космоса грохнулся маленький Эндо расы Фуун. Тело Эндо совершенно не приспособлено к жизни в условиях ночи, дождя, гопников и химических удобрений. Ему хочется солнца, лета, девуш… ну и ещё он хочет быть не пришельцем, а коровой (чтобы переносить нашу гравитацию). Без всего этого он немедленно же умрёт, а чтобы этого не случилось, поломанный его корабль законсервировал Эндо, и пытается изменить его ДНК, чтобы, во-первых, превратить Эндо в корову, а заодно поменять ночь на день, дождь на солнце а гопников на девушек. Такая могущественная у Эндо ДНК.

Но батарейки корабля садятся, и ему не хватает времени модифицировать ДНК самому. Поэтому он посылает сигнал бедствия, который принимают организаторы ICFP, и решают выставить эту задачу на конкурс (вместо программирования сковородок, как они задумывали сначала, бла-бла-бла…).

ДНК фуунов изменяет фууна (и мир вокруг него) в два этапа:
1. ДНК компилируется в РНК.
2. РНК исполняется, и получается картинка.

Корабль передал организаторам ДНК Эндо (7 с половиной мегабайт). Если скомпилировать этот ДНК, получатся ночь и гопиники. Менять ДНК нельзя. Но можно дописать к нему что-нибудь, причём чем меньше – тем лучше (у корабля садятся батарейки от длинных ДНК).

Процесс превращения РНК в картинку несложен – по крайней мере, у нас проблем не возникло. Это просто написание интерпретатора семибайтных команд по отрисовке.

Вся закавыка была в первом этапе. ДНК превращается в РНК следующим образом:
1. Считывается закодированный в ДНК паттерн – кусок строки с “дырками”.
2. Считывается закодированный в ДНК шаблон – кусок строки со “слотами”.
3. Считывается ещё немного данных. Если они подходят под паттерн (то есть буквы совпадают с буквами паттерна, а там, где у паттерна “дырки”, может быть что угодно) – всё, что прочитано, отбрасывается, а вместо этого к ДНК слева приписывается считанный шаблон, в котором “слоты” заполняются совпавшими кусками данных.

Например.
Паттерн: (ABCD____EF)
Шаблон: (TEXT * TEXT)
Данные: ABCDKLMNEFGHIJKL
Результат: TEXT ABCDKLMNEF TEXT GHIJKL

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

Правильно – повторить.
Примерно два миллиона раз.

Написать парсер этого чуда было несложно. Основная проблема была в скорости. Тупое “копирование” строк приводило к невероятно медлительной обработке, поскольку паттерны в большинстве своём были такие:
AB__…(семь мегабайт пропусков)…_CD
Соответственно, если паттерн совпадает, мы должны вставить его в шаблон. То есть, скопировать семь мегабайт данных в памяти. Один раз это, может, и ничего, но два миллиона раз скопировать по семь мегабайт – результата не дождёшься. А ведь это только одна компиляция, а в процессе поиска решения компиляции идут одна за другой.

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

(начало, длина)
(начало, длина)
(начало, длина)

Когда мы пытаемся прочитать очередной символ, мы смотрим, какая пара у нас выбрана “текущей”, и читаем из неё. Дойдя до её конца, мы переходим на следующую пару.
В таком случае, чтобы “скопировать” семь мегабайт данных, достаточно просто найти их начало в этом списке, найти их конец, и скопировать только цепочку списка между ними (а она “лёгкая”, там же нет данных – только указатели на них).
Например:

(начало1, 5 мегабайта)
(начало2, 2 мегабайта)
(начало3, 3 мегабайта)

Копируем:

(начало1, 5 мегабайта)
(начало2, 2 мегабайта)
(начало1, 5 мегабайта)
(начало2, 2 мегабайта)
(начало3, 3 мегабайта)

Казалось бы, скопировано 7 мегабайт, но на самом деле мы просто сделали копию указателей на данные – а это примерно 32 байта.

Реализовывать эту гадость было ужасно неудобно (ДНК фуунов совершенно не рассчитывалась под такие извращения), но я, плакая от усталости, всё-таки сделал это. И что бы вы думали?
Уже на двадцатой итерации длина цепочки ссылок была порядка нескольких тысяч элементов.
То есть, длина цепочки росла даже не линейно.
То есть, ДНК фууна устроено таким образом, что этот подход просто неэффективен. Он действительно чудовищно быстр на первых итерациях (где цепочка ещё маленькая), но с каждым следующим проходом получается так:
1. Была цепочка длины 3.
2. Скопировали, получили цепочку длины 6.
3. Скопировали её, получили цепочку длины 12.
…ну и так далее.
При этом длина суммарных данных в цепочке близка к первоначальной. Когда мы работаем со строкой, мы тратим много времени на копирование символов, но в итоге строчка получается примерно того же размера, и доступ к ней очень быстр. Когда мы работаем с моим списком, мы моментально копируем огромные блоки, но ДНК написан так, что дробление информации на кусочки неограниченно растёт. В результате с некоторого момента всё работает ещё хуже, чем в “наивной” схеме.

Ну и как они предполагали решать эту задачу?
(UPD: Оказывается, всё-таки можно сделать хорошую реализацию двусвязного списка. Ну что ж, значит я попросту облажался ;) )

ДНК фууна был любопытен ещё и тем, что в нём скрывалась куча приколов.
Например, добавив к РКН маааленький префикс из инструкции, можно было заставить его генерить не картинку “грустного Эндо около сломанного звездолёта”, а инструкцию:

Если вы видите эту картинку, значит носитель этой ДНК потерпел крушение на неизвестной планете. Пожалуйста, ничего не трогайте в ДНК, и вызовите службу поддержки с Альфа Центавры.

Если вы совсем-совсем никак не в состоянии связаться со службой поддержки, используйте следующий префикс, чтобы получить руководство пользователя ДНК:
[небольшой префикс]

Если носитель ДНК находится вдали от искуственных источников освещения, а естественный источник сейчас освещает противоположную сторону планеты, активируйте этот префикс, чтобы развернуть планету к Солнцу нужной стороной:

И самое главное:
НЕ ПАНИКУЙТЕ

Ещё существовали префиксы на DNA Self-Test (картинка с текстом “Checking memory read… OK; Checking memory write… OK; Checking integer overflow… OK “, причём ДНК на полном серьёзе всё это тестировала, а в картинку выводились результаты тестов – 25 штук).

Самое интересное обнаружилось незадолго до окончания соревнования. Кое-кто из нашей команды нашёл в исходном коде ДНК строчку “Portable Network Graphics”. Дампнув содержимое в файл, он убедился, что это действительно встроенный PNG-файл. В нём на белом фоне было написано:
Human Audio follows.

И действительно, дамп следующего куска ДНК оказался wav-файлом. Голос в нём произнёс:
“IICIFPCCI….”
Похоже, это был ещё один префикс.

Единственная проблема со всеми этими префиксами, как я уже сказал, в том, что за отсутсвием эффективного компилятора большинство из них просто невозможно было запустить. Не говоря уже о, собственно, сборке Эндо (ведь именно в этом было задание). Для сравнения, полная сборка Эндо – два миллиона итераций, тогда как парсивший один из префиксов всю ночь мой компьютер успел сделать только 490 тысяч итераций. Самый короткий префикс тратил 130 итераций – то ли Self-Test, то ли страничка “НЕ ПАНИКУЙТЕ”.

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

А теперь я, пожалуй, вернусь к ever17, и посвящу ему следующий пост.