Хобби
Далеко не все вещи можно представить на всеобщее обозрение, но есть–таки и некоторые выдающиеся (по моему мнению) законченные достижения, которые можно показать, и о которых я могу рассказать.
School Pak & pascal.toom.su
Как–то раз захотелось мне захватить одну почти незанятую нишу. Каждый учебный год начинается с проблем у студентов с Turbo Pascal. Delphi не вполне заменяет TP, то же касается Free Pascal, хотя тут некоторые могут поспорить. Так или иначе, относительно востребованная ниша показалась мне незанятой, и я решил восполнить этот пробел. Это должен быть дистрибутив Turbo Pascal+DOSBox, с инсталлятором, который бы «просто работал», насколько это возможно. Чтоб установил — и уже можно писать, и делать всё, что нужно по учёбе. С Turbo Pascal я знаком примерно с 8го класса. Я участвовал в олимпиадах по информатике и, кроме того, когда в 9м классе увлекался ассемблером, это были, как правило, ассемблерные вставки в Pascal и, реже, чтобы иметь возможность вызывать 32битные инструкции, отдельные модули. Без ассемблера было невозможно под DOS отслеживать одновременные нажатия нескольких клавиш в играх, а также быстро выводить графику. Программировать под DOS было, вообще говоря, поздновато, но мой EGA монитор только такое и позволял в те небогатые времена. Background для создания School Pak (так я решил назвать этот дистрибутив) вполне подходящий. Я сделал систему скриптов, которая при запуске главных файлов запускает DOSBox и внутри него запускает резиденты, монтирует диски и запускает желаемую программу. autoexec в DOS я настраивал, здесь аналогично. В DOS мне нравилось пользоваться NDOS.COM, продвинутым заменителем COMMAND.COM, вот и здесь я нашёл его и некоторую логику на NDOS реализовал. DOSBox позволяет мне решить некоторые проблемы, которые сложнее решить в дистрибутивах Turbo Pascal без него. В частности, X: монтируется как read only диск, расположенный в Program Files, а Y: — это «Мои документы» пользователя, в них остаётся конфигурация. X: и Y: изнутри DOSBox всегда неизменны, поэтому в настройках Turbo Pascal можно было указать все мыслимые пути директорий относительно этих X: и Y:. Без DOSBox пришлось бы узнавать короткий путь каждой директории и вписывать в двоичный файл конфигурации. Разумеется, так никто не делал из других создателей не–DOSBox дистрибутивов. Других дистрибутивов на DOSBox я насчитал только два, но они не столь развитые, как мой. Среди проблем, которые я решил, инициализация графики при read only доступе к EGAVGA.BGI, а под Vista и Seven так оно и есть обычно. В SYSTEM.TPU в нужном месте исправил 2 на 0. Формат TPU недокументирован, и найти нужную 2 было бы очень сложно, но, к счастью, FileMode идёт сразу после констант SegA000, SegB800 и т. п., значения которых хорошо поддаются поиску. Из других изменений: модуль CRT.TPU славится своей устаревшей реализацией Delay, однако, самый популярный патч тоже устарел, и я выбрал тот, который использует инструкцию HLT или INT 2F/1680 (если OS поддерживает). Отличается от других тем, что задержку выдерживает, сколько указано в параметре, а также не потребляет CPU в режиме ожидания. Потребление CPU было снижено и для других программ. TSR резидент перехватывает вызовы некоторых прерываний, в частности, ожидания нажатия клавиш, и высвобождает холостые циклы при помощи инструкции HLT. В Norton Commander при помощи AVPUTIL (ассемблерный отладчик для DOS) были обнаружены холостые циклы, и в пустоты (NOP) были внедрены HLT. HLT, как и NOP, oднобайтовая. С Turbo Pascal так же просто не получилось, так как я все компоненты подбирал русские, а русская IDE — это Borland Pascal для защищённого режима. HLT из ring3 недоступна, а INT 2F/1680 обрабатывается DPMI сервером и не доходит до моего резидента. AVPUTIL тут бессилен, отладчик защищённого режима тоже. Просто медитировать на DPMI16BI.OVL, не запуская его, бесполезно. А фичу реализовать хочется. Чтобы отлаживать ring0 код, я использовал отладчик, встроенный в виртуальную машину bochs. Он даёт абсолютное представление о происходящем как в реальном режиме, так и в защищённом, включая переходы между ними. Я нашёл холостой цикл, проследил, что выполняется при вызове INT 33h (которое без изменений приходит в реальный режим), потом при вызове INT 2F/1680 (которое перехватывается DPMI), и в чём разница. Было понятно, где патчить, с некоторого раза это удалось. Дополнительные инструкции вписал на место чуть укороченных сообщений об ошибках, которые почти никто всё равно не видит. В случае с BP.EXE дополнительные инструкции писались на месте предыдущего метода, который я укоротил, сохраняя эквивалентность. В версии School Pak 1.2 вышла небольшая заминка. Я не учёл, что запись/сохранение 4х байтов через ES:DI в защищённом режиме не работает в общем случае, и IDE крешилась при клике мышью ниже, чем по верхней строчке. Мышью не пользовался, поэтому не заметил. В версии 1.3 это исправлено. School Pak 1.3 — это последняя версия, дальнейшие изменения пошли в другую сторону. Вышел School Pak Portable в виде архива .zip и .dmg для Mac OS X. Так как у меня дома Mac OS X, а не Linux, для Mac OS X порт хороший, а линуксовым я толком не занимался.
У проекта с момента публикации был сайт. Так как в те далёкие времена я был студент–нищеброд, скованный получением образования, было это на бесплатном статическом хостинге (gorodok.net). Хостинг хороший, без рекламы, но у меня уже была платформа X-Wiki (Тум Су), на которую мне и не терпелось перенести сайт, и на новом месте богато обрастить дистрибутив контентом. Люди зачастую не ищут, какой бы лучше дистрибутив взять, а берут его либо в поиске (куда мне просто так не попасть), либо по соседству с учебными материалами для Turbo Pascal, кои у меня отсутствовали, и мне не терпелось это наверстать. Используя имеющиеся наработки, я декомпилировал TURBO.TPH одновременно и английский, и русский, преобразовал их в формат X-Wiki и сделал импорт. Этот материал лёг в основание pascal.toom.su. Потом была кропотливая работа по доделыванию того, что не было сделано автоматически. Например, указать родителя для каждого документа. Для описания функций родитель — описание модуля и т. п. Для каждой функции пример заинклюдить вместо того, чтобы он был по ссылке, как в оригинальном TURBO.TPH. Такой сайт не был уникальным, TURBO.TPH много, кто декомпилировал, но посещаемость и бонус к скачиваемости–таки это давало. Уникальность наработок подчёркивается тем, что у меня декомпилирован в том числе и английский TURBO.TPH, и есть перекрёстные ссылки английский<->русский. Английская часть не настолько кропотливо переработана, но на всякий случай можно сверяться с оригиналом иногда. у конкурирующих ресурсов только русский TURBO.TPH, а английского, похоже, в Интернет и вовсе не выкладывали раньше на web–сайт. Этого мне показалось недостаточно, и я решил выложить учебник по Turbo Pascal, и тщательно переплести его со справочником. Конкурирующие ресурсы отличаются изолированностью материалов. Либо где–то кто–то выложил декомпилированный справочник, но это справочник, не подходящий для последовательного изучения. Либо кто–то выложил учебник, возможно, свой, не имея при этом возможности сослаться на онлайн справочник. У меня на сайте и то, и другое, переплетённые в обоих направлениях. И, наконец, для чего я это затеял, School Pak Plus, который отличается наличием оффлайн версии pascal.toom.su. Небольшой скрипт на платформе X-Wiki создаёт в формате JSON полный список документов. Затем, на моём компьютере скрипт для node.js (захотелось попробовать, вот и повод нашёлся) скачивает этот JSON, затем скачивает содержимое каждой страницы в html формате, делает таблицу преобразования из кириллических URL с пробелами (плюсами) в латиницу с минусами, затем в каждом href= и src= меняет пути согласно этим преобразованиям. Затем я скачал со своего сайта произвольную страницу как она есть и переделал в шаблон для оффлайн версии. Загнал содержимое всех страниц в эти шаблоны, протестировал, и вуаля! готов School Pak Plus. Помимо трёк китов (справочник, учебник, School Pak), на pascal.toom.su есть таблица символов DOS и ANSI, таблица кодов клавиш для ReadKey. Названия цветов сопровождаются самим этим цветом, то есть, несмотря на то, что много материала заимствовано и неуникально, результат лучше, чем у конкурирующих ресурсов, делающих то же самое.
Что касается создания сайта, не обошлось и без экспериментов в SEO. School Pak, так как использует DOSBox, не имеет некоторых недостатков, характерных для других версий Turbo Pascal. Чтобы привлекать посетителей, я начинал с того, что на главной странице перечислял полные тексты ошибок. Количество посещений подросло, когда я перестал пытаться соптимизировать одну страницу по множеству запросов, а начал вычленять для каждого релевантного запроса свою отдельную страничку. И не забыть скриншот! Картинок в Интернете меньше, чем просто страниц с текстом, а видеофайлов меньше, чем картинок, следовательно, чем тяжелее контент, больше отрыв от конкурентов по отдельно взятому запросу. С видео такое не всегда проходит, так как видео можно смотреть на самом видеохостинге, и если искать в Google, то всплывать может ссылка на youTube, а не на страницу, куда это видео внедрено. Хорошо, если удалось найти непроторенные конкурентами, но часто искомые фразы. Например, «Версия этого файла несовместима с используемой версией Windows». Такие странички я называю SEO'шными антеннами. Возможно, есть какое–то другое для них название. Жаль, что внешние факторы по прежнему играют большую роль в ранжировании, поэтому профессиональный SEO'шник будет больше времени проводить, распределяя бюджет на бирже ссылок.
GreyLink OpenMod & p2p.toom.su
С 2005го года я знаком с пиринговыми сетями. Было это в Новосибирске, своего компьютера ещё не было. Добрая часть софта лежала на здоровенных ftp, но объём информации в p2p просто поразил. В дальнейшем ftp начали сворачивать, они полностью перекочевали в p2p в виде крупных аплодеров, а на самих ftp осталась только инструкция, где что скачать, чтобы войти в сеть (в те времена был популярен Strong DC++). Торренты начали набирать популярность уже позже, году в 2007м, совершенно непонятно, зачем вдруг. Так или иначе, локалок Новосибирских это не коснулось, а вот по приезду в Баранул меня ожидал неприятный сюрприз в виде этой гадости почти у всех провайдеров. Частные торренты ну никак не могут заменить DC++ файлообменник. Как сотрудник техподержки я вдоволь наслушался клиентов с этими непонятными мне проблемами. Вечно кто–то пароль забудет, звонит в техподдержку. Без регистрации почему–то качать нельзя. Второй раз зарегистрироваться с тем же IP нельзя. И это загадочное издевательское сообщение «Извините, Вы не подходите для того что-бы стать членом этого сайта». Если бы я такое увидел, я бы плюнул, да и пошёл бы, где всё проще. В Direct Connect. Только не наши клиенты. Наши клиенты звонят в техподдержку. К счастью, этот ресурс с самого начала не был фирменным, и техподдержку с этим ресурсом ничего не связывает, и мои желания находились в полном соответствии с инструкциями для техподдержки. Логично, что с такими взглядами мне дали доступ к серверу, на котором хостится Verlihub, которым давно никто не занимался, но он был, плюс, возможность выкладывать свои преднастроенные сборки на ftp (свой сервер тогда ещё не поставил). Поначалу это были zip для ApexDC++, потом для ApexDC++ sqlite. Во FlyLink я почему–то не обнаружил функции Инет хабов. Как выяснилось, её действительно вырезали. Я решил, эта ересь мне совершенно не подходит. У людей должен быть легкодоступный выход в Большой Интернет, во внешние хабы, стоит только захотеть. К моему сожалению, ApexDC++ sqlite имел крайне пренеприятный баг: входящий порт перестал открываться без особых на то причин. Обычный ApexDC++ с теми же настройками работал нормально, и смена номера порта не помогала исправить проблему. Я решил вообще больше не связываться с продукцией липецких программистов. И где–то в это же время мне в чате посоветовали GreyLink, от которого я до сих пор в восторге. В те времена он, разве что, был менее стабилен, но после падения он сам перезапускался, сам делал бекапы, а в следующих версиях стабильность–таки вернулась. Я остановил свой выбор на нём, начал делать уже не .zip, а .exe, который прописывает программу в автозагрузку (с согласия пользователя). Ну и хаб, конечно, администрировал. Сервер не так, чтобы очень современный, и традиционная проблема юниксов — неоправданно тяжёлая установка software на большинстве дистрибутивов, если нет прав рута. Впрочем, хаб патченный, так что его хоть как собирать из исходников, а вот Lua плагин поставить не удалось, пришлось патчи на C++ делать, а не на Lua. В Verlihub из коробки нет «последних сообщений», а они полезны для поддержания общения. В Verlihub есть самописная ORM для MySQL, и я поначалу пытался приспособить её для своих нужд, но никак до конца не мог понять, как. В этой ORM не предусмотрены суррогатные ключи, и я не нашёл простого способа, как бы зарегистрировать класс–модель сообщения так, чтобы запросы строились, какие мне надо. В конце концов написал вставку и выборку через обычные обращения к MySQL, и так оно и работало. Русификацию накладывал, реализацию $ConnectToMe чуть поменял. $ConnectToMe по умолчанию не даёт владельцу серого IP соединиться с владельцем белого IP, и это недопустимо, так как покупатели белых IP — ценные аплодеры; кроме того, у всех ТТКшников белый IP.
На хабе было немноголюдно, но уютно. Даже встречу организовывали, но я работал и не смог прийти. Далеко не единственный ништяк, мимо которого я пролетел из–за работы в техподдержке. Со временем ТТК–ЗС открыли доступ к хабу ПульсТТК, наш хаб начал запустевать, а потом его и вовсе сняли для апгрейда, а, когда поставили, уже не очень–то и надо. С других городов доступа нет, с других провайдеров доступа нет. Тем временем я в свою сборку GreyLink добавил возможность указать ник в момент установки, а также провайдер и город, в зависимости от которого подключается разный набор хабов. Сборка имеет преднастройки для ТТК–ЗС, а также ТТК–Сибирь, ТТК–Урал и ТТК–Байкал. Впрочем, поддержка нескольких провайдеров сейчас несколько раздута, и по плану переделать этот механизм и интерфейс в установщике. Есть и другие установщики (и другие моды), преднастроенные на несколько провайдеров, а хотелось бы чем–то отличаться от них в лучшую сторону. В отличие от других модов (мод — изменённые ресурсы и графика), в своём моде собственно моддинг я автоматизировал скриптами и утилитами. В отличие от других сборок, установочный скрипт (InnoSetup PascalScript) и скрипт моддинга доступны для скачивания, поэтому называется OpenMod.
InnoSetup предусматривает выключение сжатия и проверки контрольной суммы, чтобы при желании можно было вписывать что–нибудь в уже готовый инсталлятор. Этим я и воспользовался при создании сервиса greygen. GreyGen вписывает в заранее найденное по сигнатуре место в инсталляторе несколько строчек конфигурации, которые затем считываются на стороне установщика (PascalScript). GreyGen на данный момент позволяет создавать сборки, специализированные на подключение к одному хабу. Уникальный сервис, но можно зайти и ещё дальше. Для p2p.toom.su звёздный час ещё не настал.
toom.su
Я давно хотел иметь свой кусочек пространства в Интернете. И сайты, и сервисы на нём. Сайты в Интернете играют ту же роль, что и недвижимость в реальной жизни. Есть сайт — есть дом. Нет сайта — бомж, чьи сообщения на форуме (а где ещё?) быстро уйдут в историю, стоит только на этом форуме немного не появляться. А если и на форумах не писать, тогда и вовсе негуглимое пустое место. Простительно некомпьютерщикам, но айтишник без сайта — как сапожник без сапог (такое вот оно, моё скромное мнение). И не только моё:
Можете верить нам, можете не верить. Можете расценивать как всего лишь ещё одну статью, рекламирующую создание сайтов. Но помните, отдельный сайт – это ваш собственный дом. Вы можете его продать, подарить или оставить в наследство. В то время как страничка или даже подсайт (блог) на бесплатном хостинге – это всегда всего лишь съемная квартира, или комната в гостинице, снимаемая вами на час. И чем дороже на вид, гламурнее отель, тем выше плата, которая не всегда выражается в деньгах.
Лучше всего, чтобы это был настоящий, свой собственный сервер на co-location, и именно так я и сделал. Планировалось делать сервисы для локалки Metrolife. Один из них, http://intuit.metrolace.ru/ до сих пор работает, так как нужен мне, а вот локальный Яндекс.Сервер в мёртвой локалке стал не нужен и только зря ел ресурсы. Установка сервера была примерно в то время, когда у кого–то были безлимитные тарифы, а у кого–то помегабайтные и, кроме этого, был тариф Локальный вообще без внешнего трафика, и никак внешний трафик с таким тарифом даже докупить нельзя было. Стоил локальный 100 руб./месяц, и пользовалось им немало. Пользователи загнаны в локалку, весьма плодородная почва для поднятия сервисов и халявной их раскрутке. Яндекс.Сервер, зеркала новостных сайтов, синхронизируемые по RSS... посещаемость из воздуха. В сетке НГТУ у меня хостилось наколеночное зеркало bash.org.ru (nntp//rss + sn + NewsPortal) и некоторых других RSS. При цене Интернета в 1,5руб. за Мбайт студенты были загнаны в локалку. Но в Metrolife, раньше, чем я успел поставить сервер, помегабайтные тарифы исчезли сначала для FTTB клиентов, а потом и DSL, а стоимость Локального повысилась до 250руб., а потом и вовсе этот тариф упразднили. Пользователи разлетелись в Интернет, локалки в прежнем виде уже не было:
Забавно: Участники сети заинтересованы в развитии общей инфраструктуры, стремясь приблизить приход столь желанного безлимитного доступа на всё, что пожелаешь... который и разобщит их изнутри, превратив сетевое сообщество в сообщество машин, с прикованными к мониторам людьми
Благоприятным условием были бы дохлые тарифы у юзеров и хороший тариф на сервере. Но всё было как в зазеркалье: дохлый тариф был на сервере, а у юзеров аршинные тарифы, и не очень–то их чем было заинтересовать в таких условиях. Так что я сосредоточился больше на своих делах. Мне хотелось такую альтернативу обычным хостингам, чтобы поддомены 3го уровня были чем–то лёгким, существующим ad hoc. Чтобы поддомен 3го уровня был просто частью адреса. Единая вики, которая только лишь выглядит разбитой на поддомены. За основу я взял X-Wiki. Так как сервер мой, я волен ставить на него любой софт. У меня настроен Squid в режиме reverse proxy, поэтому я могу разные домены разводить на разные web–сервера (и даже разные подкаталоги на разные сервера), и такие условия несколько развязывают руки. У меня было сильное желание выбирать софт для web по принципу лишь бы не PHP, и дело тут не только в языке. В PHP каждый запрос обрабатывается независимо, а если нужно взаимодействие, то это, как правило, запросы к MySQL. Вот, например, даже типичный чат на PHP представляет из себя постоянные запросы к базе. А мне бы хотелось, чтобы поактивнее было внутри–web–серверное взаимодействие. При помощи дополнительных плагинов всё это можно устроить, но так как в хостингах этого нет, то и в скрипте, который я возьму, это, скорее всего, не будет реализовано. eyeOS — редкий скрипт для PHP, которому нужно больше, чем обычно есть на хостинге (тоже, кстати, хотел развернуть). ActiveMQ, например. X-Wiki на Java показалась мне хорошей вещью. А, учитывая её программируемость, просто отличной. В X-Wiki к документам можно прикреплять не только файлы, но и объекты. Например, в стандартном движке блогов есть объекты–категории новостей и есть объекты–посты. Кажется, что из этого можно вылепить всё, что угодно, но факты таковы, что реализовано это поверх реляционной СУБД, и реализовано неэффективно. Первым серьёзным испытанием был импорт перекодированных английского и русского TURBO.TPH на pascal.toom.su. Схема базы данных X-Wiki, увы, такова, что при большом количестве объектов производительность падает из–за множественных JOIN, так что в конечном итоге я не очень активно использую этот функционал, но в целом вещь хорошая.
В X-Wiki такая вещь, как Spaces (пространства документов), является встроенной, и, возвращаясь к первоначальной идее, мне просто нужно было спроецировать Spaces на поддомены, но X-Wiki такое не поддерживала. X-Wiki поддерживает использование разных поддоменов только для того, чтобы работать с разными базами данных на разных доменах. Это можно видеть на xwiki.org. Например, возьмём URL http://dev.xwiki.org/xwiki/bin/view/Community/Building . Здесь «Community» — это Space, «Building» — это Name, а «dev» — это database. Кстати, нельзя не обратить внимание на длину URL. Во–первых, я бы не хотел «bin/view», во–вторых, database — это ненужная мне и вообще лишняя сущность, которая только усложняет запоминание. Мне достаточно только двух сущностей и, в соответствии с моим замыслом, домен должен определять Space, а адрес после косой черты — Name. Как lurkmore.ru/Холодильник, так и у меня pascal.toom.su/ReadLn. Всего лишь две сущности, поэтому довольно многие URL можно написать по памяти. Чтобы это так работало, пришлось дописать на Java свою реализацию генератора и распознавателя URL, а потом фиксить то, что сломалось. Например, для нормальной работы AJAX нужно совпадение доменов. Впоследствии я сделал для себя возможность привязывать отдельные пространства к доменам 2го уровня, вот как на этом сайте, а также на gegames.org.
Поработал с двумя серверами приложений. Начинал с GlassFish, потом переехал на Resin. Покомпилировал Java код на maven, разобрался с CMS, пользуясь только англоязычной литературой — примерно так можно подвести итог работы с X-Wiki.