Извините - я не должен был писать эту программу

Инвариант
Начиналось все довольно обычно. Как реверсер-фрилансер, я получил заказ на программу для редактирования некоторых значений в файле данных. - Плевое дело, - подумалось мне. - Напишу после ужина. Что там - загрузить файл в память, исправить, что требуется, выгрузить на диск. Ну, еще какие-нибудь кнопочки и рюшечки, для вящего счастья заказчика.

Так, неожиданно для себя, я сунул нос в бескрайнюю страну OTDR. В сущности, это та же радиолокация, только с не с радиоволнами, а со световыми. OTDR - это Optical Time Domain Reflectometer - оптический временной рефлектометр, прибор, основанный на измерении времени прихода отраженных оптических сигналов. Источник - лазерный светодиод - посылает короткий световой импульс в оптическое волокно и приемник начинает отсчитывать время до прихода отраженного от препятствия сигнала. Препятствием может быть стык или сварка двух оптических волокон, излом или обрыв волокна, просто рассеяние света на мелкодисперсных примесях и микропузырьках воздуха, попавших в оптическое волокно. Существуют жесткие стандарты на уровни потерь и отражений на погонный километр трассы и OTDR позволяет контролировать эти значения.

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

Sorry! сконструирована так, чтобы, с одной стороны, быть устойчивой к этим ошибкам и, с другой, обеспечить максимально точное воспроизведение входного формата, даже если он не вполне верен, чтобы не потерять возможность просмотра отредактированного файла программой данного вендора.

Одна из уникальных возможностей Sorry! - битовая идентичность сохраненного файла. Внутренняя память Sorry! никогда не хранит образ исходного файла - он сканируется поблочно и хранится в собственном внутреннем формате. По команде Write выходной файл собирается с учетом почти сотни параметров и, при подходящем выборе настроек, оказывается бит-в-бит идентичен исходному. Это позволяет производить "хирургически точное" редактирование параметров, выполняя только минимально необходимые изменения, и не затрагивая никакие дополнительные части файла, включая и проприетарные блоки других вендоров.

Я получаю множество писем - и по поводу Sorry! и с вопросами о помощи в разборе формата SOR. География обширна: Европа, Индо-Китай, Австралия. Большинство писало по-английски, но некоторые были так любезны, что использовали Google-переводчик. Это всегда было очень забавно, особенно когда он дословно переводил название программы - "Извините". На самом деле, Sorry! - это игра слов - и от названия формата - SOR, и от обозначений концов трассы - S/R и от моих реальных сожалений о том, как обстоят дела в этой области. В интернете можно найти около дюжины программ различных вендоров (вьюверы, обычно, бесплатны) размером в десятки, а то и сотни мегабайт, с функциональностью "на два цента". Возможно, Sorry! не имеет всех тех "красивостей", которые можно найти в "больших" программах, зато отличается уникальной "всеядностью" и стабильностью, открывая и не вполне стандартные файлы, и файлы на которых падают другие программы, обеспечивая при этом полный доступ на редактирование ко всем параметрам файла, включая данные трассы.

Одно интересное предложение было из Тайваня, и я уже начал разрабатывать для них Sorry! DLL (еще до оформления какого-либо соглашения), но потом переписка стала угасать, начал отвечать другой менеджер, а затем перестал отвечать и он. Я свернул проект и когда, спустя долгое время, начались извинения, отказался продолжать с ними работу.

Другой неожиданный вопрос был из Польши. Мой корреспондент писал: "I need a program series SorEditor, he wants to edit the measurements." Как оказалось, речь шла о старых файлах Anritsu: "I need convert arnitsu MW9070 file *.DAT convert to SOR". Я ответил: "Don't know what is it 'Arnitsu MW9070 *.DAT file', but if you send some examples to me, I can to check if format of them close / may be converted to .SOR or completely different".

Беглый осмотр присланных образцов не выявил ничего особенного и хотя какая-то структура внутри просматривалась, идентифицировать блоки, исключая отчетливо различимые почти повторяющиеся данные (DataPts, в терминологии стандарта), не удалось. Я ответил: "I check it. Unfortunately, MW9070 *.DAT files format is completely different with .SOR, but seen contain some info relative to DataPoints and KeyEvents blocks. I will be try to define and extract data of these blocks (as first phase) and check if some .SOR file may be constructed with this info. I think, it's take a few a days to understand this format. I'll note you about results."

К моему удивлению, хотя новые версии Anritsu и не отказывались открывать эти файлы, они отображали их совершенно неверно. Вероятно, формат был настолько древним, что успел за это время полностью поменяться. Но в моем распоряжении все еще оставался "родной" вьювер - старый Anritsu MX3607B (кошмар, написанный на VisualBasic) и сделанная на чуть более читаемом Delphi Demo-версия FiberDoc, по счастью сохранившая опции пакетной конверсии, хотя и в урезанном виде.

MX3607B позволял сохранять файлы в двух форматах - в оригинальном MW9070b (при этом менялись некоторые поля) и в упрощенной "printable" версии. Не считая уродливого интерфейса, программа оказалась хорошо сделана, предоставляя не только полную информацию о трассе, но и позволяя автоанализ, отсутствующий в большинстве бесплатных программ. Я решил, что для моих целей этого должно быть достаточно.

Итак, у меня оказалось две, пригодных для исследования, версии программ: старый оригинальный Anritsu 16 bits, и более новый 32 bits FiberDoc. Отладка 16-битной программы под Win'32 оказалось мучительной, так что я почти полностью сосредоточился на 32-х битной версии. После пары недель обдумывания и интенсивных исследований, я счел, что готов к этой работе: "Well. I think, now I have a very draft image about this format (DataPts table and a few valuable constants), but a lot things still understandable to me, also still not found KeyEvent table place. BTW, it store DataPts more precise than .SOR do." Все это время "одной ногой" я был в дизассемблированном коде и другой - в документации по инструкциям сопроцессора с плавающей точкой. Среди прочего, формат предусматривал пять(!) поправочных коэффициентов, причудливо раскиданных в разных местах файла.

Еще одна вещь оказалась для меня совершенно неожиданной и, по совести говоря, я даже не думал, что такая технология (a la Dolby noise-reduction system) используется в рефлектометрии. В результате, я не знал, как правильно выполнить скалирование данных трассы - внешне она выглядела правдоподобной, но масштаб все еще был неверен. Через несколько дней я смог отослать предварительную версию конвертера "anritsu.com": "Almost all done, but I still screwed up with two things: 1. How to calculate right vertical scaling for DataPts. 2. Where to find KeyEvents reflectance / loss info. So, work in progress." На что немедленно получил ответ: "Anritsu.com bad convert DAT to SOR, Graph is change, another :) FiberDoc convert file *.dat to *.sor. FiberDoc open *.DAT file."

Я написал: "I know about FiberDoc features (and use 5.41 Demo), but its buggy although. Sometimes it write wrong files, last Marker (5) position in KeyEvents table calculated incorrect (Anritsu do it right), etc." После еще недели работы я смог, наконец, написать: "Well. I hope trace scaling now is right. It's bit different with FiberDoc values due differences in float points model in Delphi (80 bits) and pure microsoft's Visual C implementation (64 bits only). So delta may be about 0.01 dB in the worst case. I hope it is not so awful in the real world, in other case its required third party package for precise float point calculation. Also FiberDoc have another nice BUG - it incorrect calculate value for very last data point in array and shifted up all the trace. Anritsu converter do it correct." Ответ меня порадовал: "Program is good. I'm sorry for responding so late. I had a computer crash (Windows 8 update to Windows 10) and lost my correspondence with you, I tested the program and the program is very good."

Я не люблю деловых писем по пятницам. Обычно, они предвещают неприятности. Но пока все выглядело безобидно: "Are you selling this program?  Would like to get the full version. Thanks, Brad." Я ответил стандартно, предложив ему ознакомиться с Demo-версией : "Hi, Brad! Thank you for interesting with Sorry! Before even plan to buy it, try the DEMO-version from my Sorry! page to check if it really fill you needs. Also pay attention to set of FREE SOR-viewers listed in the middle of the page. Sorry! DEMO have a most features of FULL version, exclude working with collections (KeyEvents, DataPts) and missed 'Save' function for collections. But it still fastest SOR-viewer around with simple edit functions (for any single value field)."

Но Брэд настаивал на покупке: "Mike, Interested in buying it for sure. Downloaded the demo and wondering also how you handle payment as well as are you available for consulting. I work for a Fiber Optic web company." Меня это озадачило. Казалось бы, у "Fiber Optic web company" не должно быть проблем с пониманием SOR-формата и редактированием рефлектограмм. Зачем им еще и мой редактор?

Особенно меня удивил вопрос о консультациях: "Also do you do consulting work? I run the development team here in the US for FiberOptic.com." Чем скромный российский инди-разработчик может быть полезен большой американской компании? Ответил так: "If you have any question about Sorry! - just drop me a line by e-mail. Also any check for SOR-files (compatibility with Sorry!, derivation from standard, CkSum type etc) I do for free. Also by e-mail (for free) all customers got bugfixes and updates."

Но Брэду не были нужны мои бесплатные консультации и он продолжал настаивать на покупке: "Thanks for the reply today. Would like to get you paid and get the software ASAP. If we can do PayPal can do this in the next few minutes." Я ответил, что PayPal меня не устраивает: "Hi Brad ! Any relationship with russian offices can't be done nor with two minutes, nor with two days, nor with two weeks. A lot of documents should be scanned and sent (some times with notarize) to get in the hands a few own bucks."

Но теперь уже его не устраивали предложенные мной альтернативы: "Mike, Sorry for the confusion. All I was saying is that with Paypal you could verify the money has been sent and then email me the program. Pretty standard procedure with the internet these days. Not sure what you are talking about related to scanning and sending documents? If we were to do some consulting agreement with you that makes sense.  If you are talking about needing to do that for the software purchase again i'm confused as to why. Only way I can pay now would be PayPal. Thanks for the quick replies and let me know if you are interested in any consulting work and if you will accept PayPal. Sincerely, Brad."

Переписка продолжалась еще несколько дней. Брэд писал мне как влюбленная девочка - по два письма в день, и все еще спрашивал о консультациях: "Mike, Wanted to let you know I will be purchasing this week. Do you do any freelance consulting? Would love to do a call day or night. Maybe Skype? Let me know your thoughts. Thanks, Brad." Более того, он даже нашел выложенный мной когда-то на YouTube Demo-ролик и подписался на мой канал (на котором с тех пор так и не было ни одного обновления). Я получил автоматическое извещение: "Brad M. has subscribed to you on YouTube! Want to return the favor and subscribe to Brad M.? Just visit Brad M.'s channel and click on the "Subscribe" button at the top. Here is a link to Brad M.'s channel: Channels who subscribe to you will be notified when you upload new videos or respond to others' videos (by favoriting, commenting, rating, etc). You can control which of your actions are publicly visible by going to your <a settings</a>."

Предложения Брэда становились все более заманчивыми - он уже почти обещал мне работу: "Mike, Take a look at FiberOptic.com and a product offering we have called FiberBase. I wasn't looking for support on Sorry! was more interested in speaking to you about possible work. Let me know if you are interested. Brad."

Разумеется, я посмотрел, чем они занимаются: "Hi Brad! I take a look at FiberOptic.com - it mostly about hardware, so I wonder, which kind of work do you mean." На что получил ответ: "Mike, This is my work email. Sending you more information on FiberBase and how you may help us. FiberBase has an OTDR Workspace: http://fiberbase.fiberoptic.com. FB Demo Video: http://www.screencast.com/t/D82k3rOsda". Это письмо оказалось почти последним - было еще одно, где он обещал, что скоро я о нем услышу. Но получилось так, что больше я никогда не слышал про Брэда. Зато на следующий день я не смог зайти на свою страничку http://gazlan.freetzi.com/sale/sorry.html. Не удалось это мне и через несколько дней - сайт перестал существовать. На мои вопросы в саппорт никакого ответа не последовало, но эти два события - внезапное исчезновение сайта и внезапное исчезновение Брэда, кажутся мне тесно связанными. Остается, правда, загадкой, чем мог помешать мой сайт Fiber Optic. Но это было мне уроком. Я переехал на платный хостинг.

"А вот конец, хоть не трагичный, но досадный"
Вл. Высоцкий "Песнь о вещей Кассандре"

Признаться, я не очень слежу, что делают другие. В любом случае, на протяжении нескольких лет Sorry! оставался единственным в мире редактором рефлектограмм, так что конкуренции можно было не опасаться :-)

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

Но однажды, просматривая поисковую выдачу, я наткнулся на странно искаженный текст с главной странички моего сайта. Не понимая кому и, главное, зачем потребовалось его переврать, я кликнул по ссылке. Так я нашел SorEditor - программу, почти полностью повторявшую дизайн, идеологию и функциональность Sorry! Заодно, повторялся и текст с моего сайта.

Назвать все это кражей, вероятно, нельзя: в отличие от краденного текста, сама программа SorEditor написана на другом языке и, таки, самостоятельно, но при этом полностью копируя Sorry! (включая дизайн, порядок и тексты вкладок, количество и расположение полей и связанную с ними функциональность), так что подходящим термином, скорее, будет "плагиат". К тому же и некоторые надписи и текстовые шаблоны (уникальная возможность, впервые предложенная в Sorry!) в SorEditor переведены на русский. Более того, судя по истории версий SorEditor, плагиатор тщательно отслеживал развитие Sorry! и по мере того, как в ней добавлялась новая функциональность, немедленно воспроизводил у себя те же самые возможности. Когда проект Sorry! на некоторое время оказался "заморожен", прекратилось и обновление SorEditor.

Пожалуй, главное отличие оказалось в "бизнес-модели": в то время, как Sorry! является полноценным редактором, дозволяющим полную разборку и сборку файла, результатом работы SorEditor является зашифрованный текстовый файл .ENC, который надо отослать автору и отдельно договариваться с ним о конверсии в стандартный .SOR.

Чтобы облегчить жизнь своих пользователей, я написал бесплатный конвертер ENC-2-SOR и, кроме того, добавил в Sorry! возможность чтения зашифрованных файлов SorEditor.