Вторая половина 2000х годов — время для меня было крайне чернушное, но то, что творилось вокруг, конечно, не зависело от моих личных проблем. И воспоминания оставило скорее как о потерянном раю. Просто этот рай был не для меня.
В начале 2007го года я вылетаю с 3го курс НГУ и перевожусь на 3й курс НГТУ. Зря, программы разные, не осилил. Почему спешил, тоже понятно, каждый месяц в тех условиях как пытка, и просто не верилось, что я смогу продержаться ещё столько времени. Собственно, и не продержался. Летом 2007го ухожу в академотпуск с тем, чтобы вернуться потом через полгода на второй курс НГТУ. Отказаться от академотпуска и продолжить получение документа об образовании сразу в сентябре было никак нельзя.
Возвращаться в Барнаул сильно не хотелось. В Барнауле мне было много, где жить у разных родственников, родители ещё разведены, но как-то сложилось, что абсолютно везде собственники квартир выложились бетонным шлагбаумом против того, чтобы у меня был хоть немного нормальный Интернет. Хоть немного нормальный тогда — это 64 или 128 Кбит/сек безлимит, только-только появлялись такие тарифы на FTTB. Если владелец квартиры против провода, остаётся мобильная связь. У Мегафона модем стоил 2400руб., а Интернет — 7 рублей за мегабайт. Для сравнения, в НГУ был безлимит 24Кбит/сек, в НГТУ — помегабайтная оплата, 2 руб. днём, 0,5 руб. ночью. И даже ночью даже HTML странички было дорого открывать. Откроешь и смотришь, как насчитались копеечки.
Чтобы не сидеть совсем без картинок, я в НГУ написал rewrite_url_program для Squid на bash, чтоб при обнаружении новой картинки выкачивал её wget'ом и потом раздавал всегда с местного Apache. Одноимённые картинки с разных сайтов считались одинаковыми. И был переключатель, грузить новые картинки или нет. Форумы тогда были на одном из движов phpBB, IPB, vBulletin, так что одноимённые картинки там действительно были одинаковыми. Этот импровизированный «кеш» за два с половиной года на безлимите в НГУ разросся до 2Гб, в НГТУ уже загрузку новых картинок редко делал. Чтобы экономить на тексте, я кроме того, что имел в Squid включенный обычный кеш, ещё пропускал Squid через сжимающий прокси toonel.net. Помню, что vBulletin был настолько жирный, что даже со всеми этими ухищрениями было запретительно дорого ходить на такие форумы. И, конечно, 7 рублей за мегабайт по мобильной связи было бы чудовищно дорого.
На полгода со своими двумя курсами я был никому не нужен. Еле как только к сентябрю устроился Делфи разработчиком за 5т.р. в месяц. Переводил внутреннюю разработчку с MSSQL на MySQL, с H.323 на SIP. Если б я только знал, сколько за мои уникальные навыки могут предложить в Интернете. Догадывался. Но догадываться и реально найти заказчика и получать деньги — это разные вещи, это нужно делать в спокойной обстановке, когда Интернет просто есть, и об этом не думаешь. Такое спокойствие случится ещё нескоро.
В общем, остался я на полгода в почти полной изоляции. Единственным приемлемым способом был компьютерный терминал в шишковской библиотеке. Там оплата по времени, и надо было заранее планировать, что мне понадобится, чтоб потом прийти, поставить качаться, сбросить себе на Флеш, и уйти. А это сложно. Это не как сейчас, пришла в голову идея, пошёл прочитал, подумал, надо или нет, скачал. Или не скачал. Неделю думаешь, один час сидишь читаешь и качаешь.
Идея сделать дистрибутив Турбо Паскаля мне пришла в голову уже после того, как я оказался в Барнауле, и про запас накачать в сети НГТУ я не мог. Я был у отца на работе, в лицее, засвидетельствовал лично, какие проблемы сейчас, оказывается, с Турбо Паскалём. И пришла мне идея сделать на этом пропаганду языка Ада. Заменить справочную систему так, чтобы там было сравнение с языком Ада, и такое сравнение практически всегда будет не в пользу Турбо Паскаля. Да и Делфи самые свежие во многом до сих пор уступают. Пропаганда языка Ада — это был двигатель School Pak от начала и до конца.
Я качал описания формата TPH, сидел, писал на Аде реализацию декомпилятора и компилятора. В НГУ и НГТУ у меня практически не было свободного времени, чтоб писать на Аде. Я читал про новый стандарт Ада 2005, истекал слюнями, но в университете надо было делать другое. На первых двух курсах вообще довольно посредственно относящееся к программированию. И вот — дорвался! Контейнеры применил для описания логической структуры TPH, трёхбайтовые числа объявил с операциями 'Read и 'Write, поскольку они в TPH применяются для смещений.
Чтобы мой TPH с вшитой рекламой языка Ада не торопились заменить обратно, я хотел сделать его объективно лучше. И сделал. Я знал, что в русском TPH от VideoLord поехали номера контекстов. Или не поехали, а всегда такими были. В общем, если в меню нажать F1, то заносит в справку по другому пункту меню. Так что я проектировал свои инструменты так, чтоб они ещё и могли номера контекстов менять после декомпиляции/компиляции. Справочные темы идентифицировались не по номерам, а по буквенным идентификаторам, которые автоматом генерились либо из содержания темы, либо из ссылки из индекса, если таковая была.
Например, автоматом получал своё имя x_emulation.txt и выглядел так:
Код
;CONTEXT 010D
+
+ ┌──────────────────────┐
+ │ [X] Emulation │
+ └──────────────────────┘
+
+[X] когда эта опция включена,
@ -------
+ Turbo Pascal проверяет, имеет
+ ли ваш компьютер 80x87 сопроцессор
+ и использует его при наличии.
+
@ -------
+Если сопроцессор отсутствует, Turbo Pascal эмулирует 80x87.
+
@ -------
+[ ] когда эта опция выключена, Turbo Pascal
+ не эмулирует 80x87 сопроцессор.
+
;LINK spravka_po_dialogovomu_oknu_compiler_options
@ 11111111111111111111111
+Эта опция недоступна, если опция Target Platform Options установлена
+на Windows.
+
;LINK e
@ 1111
+Опция Emulation эквивалентна {$E}.
+
+Смотри также:
+
;LINK x_8087_80287
@1111111111111111111111111111111111
+Numeric Processing [X] 8087/80287
+
+
+
+ ┌──────────────────────┐
+ │ [X] Emulation │
+ └──────────────────────┘
+
+[X] когда эта опция включена,
@ -------
+ Turbo Pascal проверяет, имеет
+ ли ваш компьютер 80x87 сопроцессор
+ и использует его при наличии.
+
@ -------
+Если сопроцессор отсутствует, Turbo Pascal эмулирует 80x87.
+
@ -------
+[ ] когда эта опция выключена, Turbo Pascal
+ не эмулирует 80x87 сопроцессор.
+
;LINK spravka_po_dialogovomu_oknu_compiler_options
@ 11111111111111111111111
+Эта опция недоступна, если опция Target Platform Options установлена
+на Windows.
+
;LINK e
@ 1111
+Опция Emulation эквивалентна {$E}.
+
+Смотри также:
+
;LINK x_8087_80287
@1111111111111111111111111111111111
+Numeric Processing [X] 8087/80287
+
+
Я специально не делал, как в HTML, чтобы можно было выравнивать текст по горизонтали. Кстати, вот этот элемент справки в справочнике: http://pascal.net.ru/Emulation Как видите, я потом эти X научился отпиливать.
После декомпиляции я просто меняю номера контекстов, и при компиляции они перешиваются по-другому. Составил карту, куда какой элемент меню ведёт, всё поменял. Потом, кстати, мне эта карта ещё раз пригодится. Для справочника я делал перекрёстно связанные русскую и английскую версии, и раз там номера поменялись, то эта карта была нужна, чтоб правильно связать.
Вообще, думая, что кто-то будет копаться в отдельных файлах, как мне кажется, я был наивен. Это в 42й гимназии школьники вроде меня всё тасовали как хотели, а чем дальше, тем меньше творческий потенциал проявлялся.
Нужно ещё было разбираться с другими проблемами. В школьные годы, то есть, в первую половину 2000х у меня большую часть времени был компьютер с видеокартой и монитором EGA. Это который максимум 640x350 и 16 цветов. На него нельзя было установить ни Windows 3.11, ни 95 обычным способом. Хотя у меня получилось поставить Windows 3.1, на неё — Win32s, в котором есть 32битный драйвер EGA, и после этого обновить до Windows 95. Свойства экрана не влезали в экран, OK и Отмена где-то внизу экрана были, но при помощи Amish Desktop можно было прокрутить и всё увидеть. В основном я всё же сидел в DOS'е, писал под DOS. А в универе я почти ничего не мог делать, некогда. И получалось, что всё, что я знал и умел, уже практически заведомо не может пригодиться. А тут — отдушина. Напоследок выложиться и мысленно проститься с эпохой. Собрал со своих старых компакт-дисков программы, какие мне нравились. NDOS, Medincom — это откуда могло взяться? Это я с любовью взял лучшее из того, чем пользовался несколько лет. Там, в School Pak осталась частичка меня.
Были и другие проблемы. На моём компьютере стоял Хакинтош 10.4.10, а в нём — VMWare Fusion, а в нём — Windows XP Media Center Edition. Но в те годы уже медленно вползала Виста. А там — UAC. Я о нём только читал, но это могло быть опасно. К счастью, у отца ближе к зиме появился ноутбук. И мои худшие ожидания подтвердились. Действительно, не работает! Долго я тестировать не мог, приходилось как-то быстро выяснять, в чём дело, и возвращаться к себе доделывать. Первое предательство было со стороны SDL, которому вынь да положь надо было писать журналы. Туда, куда писать их нельзя. Кажется, я там заменил имя файла на nul, чтоб это отключить это совсем. Потом файл конфигурации читался с правами на чтение/запись. Никакой записи файлов в Program Files, конечно, на Висте быть не могло. Поменял в вызове fopen режим файла. Наконец, не сразу всплыло, но тоже обнаружилось, что EGAVGA.BGI открывается на чтение/запись. Разматывание клубка привело к открытию существования переменной FileMode. Переменной настолько малоизвестной, что даже в Borland, когда писали модуль Graph, не подумали открывать BGI файл только на чтение, ведь не собираются же они в него писать. Например, я написал этот ответ именно потому что был одним из немногих, кто понимает, что происходит. А в Delphi это стало вообще жестью, так как переменная глобальная, а не локальная для потока (threadvar), как было бы уместно в многозадачной программе для совместимости. То есть, бинарный file и Reset — это всё в Delphi стало непригодно для использования в многозадачных программах.
Кроме того, что узнать ответ, надо было ещё понять, что с этим делать. В отличие от TPH, на TPU документации не было, так просто там не поменять. Где-то там внутри стоит двоечка (байт со значением 2), который нужно поменять на 0. А этих двоечек пруд пруди. Я так долго шёл к «дистрибутиву, который просто работает», и вот — такой провал. Спасло меня то, что FileMode находится в компании из констант SegA000, SegB000, SegB800, значения которых уже так просто не затеряются. И, действительно, нашлась рядом с байтиками A0, B0 и B8 заветная двоечка. Затёр ноликом, проверил — то, что нужно. Я уж боялся, TSR придётся писать, чтоб отучить просить права на запись. TSR, правда, потом всё равно написал, но для другого, для того, чтоб файл BGI открывать, даже если указан не тот путь.
В первых версиях ещё был кривой Delay. Я ещё не знал, что плавающая точка вешает DOSBox, когда открыта IDE. Узнал я это только позже, когда вернулся в НГТУ, получил Интернет и начал мониторить Вопросы и Ответы Google, и там при случае давать ссылку на School Pak. Мне писали, что не так, я исправлял. Я думал, надо только немного подсобить, а дальше пойдёт молва, и будут друг другу рекомендовать. Пойдёт как лавина. Не тут-то было. Сколько бы я ни ждал, какие-то несчастные единички увеличивались, и только — когда оставлял ответ на ВиО. Но, впрочем, достаточно, чтобы срок хранения файла на Народ.Диске (помнит кто-нибудь ещё такое?) постоянно продлевался. Не признали мой дистрибутив ни на одном форуме, ни на одном сайте. Старые глючные версии распространяли, писали вновь вопрошающим что-то невнятное про DOSBox, что угодно, только не School Pak. Мне ещё баны прилетали, если я постоянно советовал. Только на КиберФоруме удалось зацепиться, против воли модератора.
Меняться всё началось, когда я решил запостить программу на http://freesoft.ru/ и http://www.softportal.com/ Отдельное спасибо SoftPortal'у за то, что вынудили меня сделать сайтик. Без сайта там нельзя опубликовать программу. Сайта у меня никакого не было. Были идейки, вот как возьму-возьму, да на XSLT забацаю сайтик, чтоб XSLT на стороне браузера, а не сервера, и чтоб, например, боковые панели были как xslt include, то есть, браузер, а не сервер собирал страницы из частей. А как присписчило, так взял и сделал одну HTML страничку в FAR Manager и разместил на статическом хостинге без всяких усложнений. Количество скачиваний по сравнению с тем, к чему я привык, пошло зашкаливать. А потом ещё, весной 2009го, поставил на сайт Яндекс.Метрику. Следил, как сначала на мой сайт начали приходить из Гугла. Долго не приходили из Яндекса. Пришли. Это было как праздник! Опытным путём я выяснил, что лучше на каждую тему заводить отдельную страницу, чем пытаться на одну страницу притянуть сразу весь возможный трафик. То есть, если у кого-то ошибка NTVDM, об этом расскажет отдельная страница. Если у кого-то ошибка 200, отдельная страница.
Но сайт — это уже другая история. Вывод, который я сделал: народная молва — ничего, административный ресурс — всё. Хоть там тысяча скачиваний, как воды в рот набрали, ни слова хорошего, чтоб другие знали и не мыкались. Вот как своё «радио» поставил, так начались подвижки. Не знаю, может ли вообще быть иначе.
Потерянный рай
Хотелось бы зафиксировать, что я помню о том времени, и почему сейчас это кажется раем. В НГУ был пиринг на базе протокола NMDC. Ставили DC++, ставили StrongDC++. Начинали-то знакомство с сеткой с крупных FTP, а потом неожиданно открывали для себя, насколько больше информации в p2p. Я со своих компакт-дисков на несколько гигабайт выложил, и вроде мелочь, а из таких мелочей складываются сотни терабайт. А потом и FTP закрылись, полностью перейдя в p2p. И кто писал эти p2p клиенты. Часто это одиночки, иногда 2-3 человека. Они копируют друг у друга программный код, улучшают, забирают чужие улучшения. Если и есть положительный пример open source, то вот он. DC++, ApexDC++, StrongDC++. И только появлялся FlyLinkDC++. Поистине народное творчество. Международное народное творчество.
Тогда это раем не казалось. У меня был Хакинтош, а большинство программ — под Windows, и постоянно зудело, чтоб больше программ было переносимыми. Хотелось, чтоб доля Windows уменьшилась, и тогда разработчикам пришлось бы делать кроссплатформенно. И я бы на своей макОСи чувствовал себя лучше.
Желание исполнилось. Так называемые мобильные платформы подорвали гегемонию Windows. Но вместе в гегемонией Windows мы потеряли рай. Рай иметь однородную среду исполнения, пусть даже такую, как Windows. Когда один пишет, другой дописывает. Как-то так внезапно оказалось, что чтобы разрабатывать кроссплатформенно, надо серьёзно вложиться в разное оборудование, и потом ещё время постоянно тратить на портирование. И таких людей, которые бы этим занимались, в народе осталось явно недостаточно. Только корпорации с хорошим коммерческим интересом способны тянуть всю эту мешанину платформ. Но корпорации не подарят человечеству ни новый GreyLink, ни Shareaza.
Рай сильно ужался. В раю ещё худо-бедно осталось место для Java и скриптов, но а большая часть — браузерный суррогат. HTML5, который верстать хуже, чем даже сильно не любимый мной Swing. Лапша обратных вызовов. И никакой надежды на спасение от этого кошмара.
Желанием вернуться в рай мотивируется моя работа над Общей платформой исполнения приложений. Чтоб была однородная среда исполнения, но без неотключаемой трассирующей сборки мусора, выжирающей 20Мб на старте и постоянно лезущей в своп, чтоб собрать мусор. Без того, чтобы нужно было писать на изковерканных версиях языков программирования вроде Delphi.NET. Всем этим требованиям удовлетворяет связка Виндоуз и Вайн, и не случайно многие разработчики «портируют» на Линукс именно таким способом. Просто отключают те возможности, которые в Вайне не работают. Например, FlyLink и GreyLink устроены именно так. И даже не бедныe разработчики поступают так же.
Основная проблема Вайна — это винданутость. Хорошо, что там общий для всех SEH. Хорошо, что там, чтобы скомпоновать программный модуль, не требуется дать компоновщику пощупать файлы библиотек всех зависимостей, а также зависимостей зависимостей. В отличие от ld на Mac OS, этих библиотек могло вообще никогда не существовать, это не помешает создать PE файл. Но вот GDI, USER32, — всё это и многое другое лучше сбросить со счетов. Формат PE, но без WinAPI. Другое API, лучше, чем WinAPI. Скомпилируй дважды, запусти везде. Дважды — потому что x86 и x64. Можно ещё для браузеров добавить WASM. Тогда скомпилируй трижды, запусти везде. Всё лучше, чем то, как сейчас.
И мы вернёмся в рай.