Кота с лампой – нет, держите мотылька.
Велика вероятность того, что не каждый из читателей знаком с понятием «визуальная новелла», а если и знаком, то уже пишет в комментариях восклицание по типу: «Снова эти виабушники на хабре!». Но если вам просто интересно прочитать историю одного недо-переводчика с небольшими навыками программирования и большими амбициями, то я вам её поведаю.
С чего все началось
В 2016 году я еще не имел полноценной работы связанной с программированием. На тот момент я работал удаленно в технической поддержке по всяким бухгалтерским программам. Клиентов у нас было не много, поэтому у меня было достаточно свободного времени.
Я брал некоторые заказы по сайтам, два раза в неделю посещал занятия по японскому языку. Очень уж мне нравилось звучание их языка (да чего уж таить — и сейчас нравится). Уже через полгода, имея «великое» знание азбук и горсти иероглифов, я хвастался этим в группах по аниме и визуальным новеллам. Наконец, в один из дней я получил сообщение от руководителя перевода одной визуальной новеллы с японского:
Скриншот первого сообщения
Для тех, кто не знаком с данным жанром игр, я вкратце опишу — это рассказ с картинками, с возможностью влиять на сюжет выбором реплик в диалогах. В некоторых экземплярах встречается какое-то подобие геймплея в перерывах между сюжетом, типа карточных игр, игр на ловкость и так далее. Зачастую, в подобных играх присутствуют «клубничные» моменты, а порой, и в значительном количестве. В русскоязычном сообществе особенно сильно прославилось «Бесконечное лето», с его героем-сычом и коммунистическим бэкграундом.
Ну и не забываем про Алису с бутылкой водки и Лену с ножом, да…
Перевод они делали через специальную программу — Visual Novel Reader. Настоящий монстр, как по количеству функционала, так и по прожорливости. Основной костяк был написан на питоне, который в свою очередь вызывал десяток других библиотек. Суть её работы заключалась в извлечении текста из новеллы прямо в процессе игры. Затем, с помощью множества встроенных словарей и машинных переводчиков, этот текст переводился, доводился до ума уже самим переводчиком и только потом сохранялся для остальных пользователей на сервере автора программы.
Пример основного интерфейса
Некоторое время поломавшись, я все-таки согласился помочь им с переводом, впрочем, толку от меня было мало. Работать переводчиком оказалось намного сложнее чем я мог себе представить. Если ранее, читая для себя, я мог просто пропускать то, что не понимал, то теперь приходилось обращаться к более опытным коллегам и выяснять: «а что там написано смесью иероглифов и двух азбук…?». Некоторое время я помучался со всем этим, но, когда нашел прибыльную подработку – забросил.
Хоть я и забросил, но за процессом перевода все равно продолжал наблюдать, очень уж мне приглянулись некоторые персонажи в новелле, хотелось почитать их на русском. Итак, спустя несколько месяцев возник прецендент: сервер, хранящий на себе все переводы, пользовательские словари и кучу всего прочего – умер. Или, вернее сказать, создатель просто забыл заплатить за домен. Казалось бы чепуха, но его не продлевали несколько дней. В русскоязычном и зарубежном комьюнити начали возникать волнения и опасения по поводу сложившейся ситуации. Именно тогда у меня возникли первые мысли о создании собственного сервера, тем более, что все исходники лежали в открытом виде, главное — найти нужные места в коде. Но, спустя еще некоторое время, домен чудесным образом заработал, и все забыли об этой ситуации. Однако, всеобщее счастье продлилось недолго…
Власть, которая и не снилась моему отцу…
Через несколько месяцев ситуация повторилась вновь. Так как это было уже не в первый раз, то все не сильно волновались, наверное, создатель на этот раз забыл заплатить за хостинг. Но вот прошла уже неделя, а сервер как лежал, так и лежит. Те, кто был знаком с создателем, пытались до него достучатся через известные каналы связи, но все было тщетно. Человек просто пропал…
В таком режиме прошел чуть ли не месяц, сервер продолжал быть в мертвом состоянии, а о создателе ничего не было слышно с тех самых пор. Программой по-прежнему можно было пользоваться, но только в качестве инструмента для перевода. Для простых обывателей, ради которых задумывался перевод это было, по сути, бесполезное приложение. В итоге, все активные переводы через эту программу были остановлены, а значит — настало время создавать свой сервер!
На тот момент моё понимание разработки было не выше уровня «чайника», и я понятия не имел о том, что такое IDE, фреймворки, да и вообще, мои познания были ограничены только вебом на уровне недо-джуна. И на тот момент для меня стояла неординарная задача – откопать в неизвестной мне архитектуре на неизвестном языке файл, который отвечает за отправку запросов на сервер, но в остальном я был абсолютно уверен в своих силах! Я не знал на какой домен отправляются запросы, а проверять подобного я еще не умел, но предположил, что домен в программе будет тем же, что и сам сайт, поэтому просто сделал поиск по всем файлам исходного кода программы. Подождав некоторое время, я получил немалый список упоминаний домена в коде и дальше, уже ручками, перебрал все файлы, пока не нашел нужное мне место. Подставил свой домен, запустил программу и убедился, что запросы идут куда нужно. Начало было положено!
Теперь возник вопрос с тем, какие данные посылает клиент, и какие ожидает. Мне пришлось потратить немало времени на изучение всего этого, и, должен сказать, мне крупно повезло. Субтитры, комментарии, словари, пользователи, игры… все это сохранялось в кэше программы в виде обычных xml файлов в первозданном виде. Просто бери, копируй на сервер и все заведется. Потратив несколько дней на написание, как я думал, гениального кода на стороне сервера, создание базы данных и бесконечные перезагрузки программы (у меня был слабый ноутбук, и перезагрузка занимала по несколько минут), я наконец-таки закончил работу над минимальным функционалом, и отдал на тестирование знакомой команде переводчиков. В течение дня мы тестировали, исправляли появляющиеся баги и в конце концов констатировали – сервер готов к работе! Но в данный момент сервер был абсолютно пустым, а на предыдущем были сохранены драгоценные данные. Благо, у пользователей все данные были сохранены в кэше, поэтому решение было очевидное – создать на сайте сервера форму для загрузки собственных субтитров и словарей.
Для всего этого дела я создал отдельный поддомен на своем основном сайте, и через дичайшие костыли связал авторизацию между своим основным сайтом и сервером для VNR.
Что бы вы понимали весь ужас ситуации, этот глупец вместо того, чтобы создать отдельную базу данных, добавил таблицы в базу данных основного сайта. Я в то время думал создать многофункциональный портал… В итоге получился невероятный бардак, который теперь тяжело распутать. Даже я путаюсь, где используется логин основного сайта, а где логин VNR. Не будьте такими, как я :(
Т.к. я понятия не имел о паролях других пользователей, то пришлось на веру дать возможность людям самостоятельно указать свой старый логин, который они использовали в VNR и с которым потом будет связан аккаунт. И должен сказать – я рад что мне никто так и не написал о том, что его аккаунт угнали, моя вера в человечество спасена!
Разумеется, интерфейс также был переведен на английский язык, за что спасибо одному из переводчиков, ибо на тот момент в английский я не мог от слова совсем.
А вот так выглядят минималистичные формы для загрузки пользовательских субтитров и словарей:
Внимательный читатель заметит, что нигде нет кнопки выхода. Просто я поленился её добавлять…
Наконец, спустя пару недель разработки и отлова багов, сервер был отправлен в свободное плавание. Это был апогей того, что я делал до этого… Одно дело, когда ты делаешь что-то прикольное для своих соотечественников, но совсем другое, когда к ним подключаются еще и люди с остального мира! На форумах удивлялись тому, какую работу проделали русские, и самое главное – как у них это получилось?! Хотя ничего сложного в проделанной мною работе не было, я все же сильно возгордился своим достижением. Я – никто из «мухосранска», получил благодарности от иностранцев, я просто всемогущий!
Разумеется, на сервере еще оставались баги, и некоторое время я продолжал их исправлять и ловить плюсы от переводчиков на форумах и в дискорд-сервере, посвященному этой программе. Самое забавное, что мы настолько сильно засели в дискорде, что админ в конечном итоге создал нам отдельный канал для нашей болтовни, который существует и по сей день, хотя VNR упоминается теперь все меньше и меньше.
Брошенный на произвол судьбы
После восстановления сервера, я начал понемногу его дорабатывать. Сделал несколько фичей, добавил пару новых словарей для переводчиков. Но в конечном итоге, подустал всем этим заниматься и оставил сервер жить своей жизнью. Потом, спустя еще пару месяцев, мне удалось устроится в полноценную продуктовую ИТ-компанию, где из-за постоянных переработок ради повышения, я совсем позабыл о сервере.
Таким образом, прошло больше года и за это время я многому научился в программировании. В очередной раз открывая панель управления хостингом, я увидел поддомен сервера, на котором вертится VNR и решил, что его нужно передать другим, более достойным людям. Но, так как сервер был тесно связан с моим основным сайтом, который я тоже забросил, его было тяжело отделить. Но даже если и отделить, то возникает другая проблема: код, который я написал – полное дерьмо! Это самое мягкое что я могу о нем сказать. Все API-методы обрабатываются в единственном файле, написанном в процедурном стиле. Условия в условиях, добавляем туда циклы в несколько уровней, и получаем код, который невозможно читать. Даже сборка xml ответа происходит руками, потому что я где-то вычитал, что так будет менее ресурсоемко, нежели использовать для этого специальный инструмент. Я просто не мог выложить этот ужас в открытый доступ, мне глубоко стыдно за то, что там написано.
Поэтому я решил переписать сервер с нуля на нормальном фреймворке, а также, добавить немного функционала, связанного с социализацией. Например, страницы групп переводчиков с их контактными данными и ссылками на пожертвования. В перспективе, даже подумывал дать возможность переводчикам делать свои субтитры платными, как это сделано на том же «rulate». В течение месяца я потихоньку пилил новый сервер, но в итоге столкнулся с большой проблемой. Я хотел, чтобы все было идеально! «Это же open source, я должен сделать все максимально красиво!» — думал я. И в итоге, выгорел в бесконечной шлифовке одного и того же. А потом произошло повышение на работе, и по вечерам уже было далеко не до спасения старого сервера.
И вот, снова прошло полтора года и 11 мая серверу исполнится 3 года со дня его публикации. Я по-прежнему не переписал сервер на новый движок, а о создателе программы до сих пор ничего не слышно. Со мной все понятно, я ленивый мудак, который ничего не будет делать, если это не приносит ни выгоды, ни морального удовлетворения. Но вот насчет создателя, боюсь, что ничего радужного с ним не приключилось…
К концу статьи хотелось бы сказать: «Не будьте такими мудаками, как я, которые бросают дело на полпути!», но кто я такой, чтобы это говорить. Меня только радует, что есть и другие специалисты, которые делают чтение визуальных новелл проще. Сейчас активно развивается упрощенный аналог VNR-а – «Textractor», у него пока что нет такого крутого функционала, но зато он очень шустрый и легко расширяемый (правда, расширения могут очень сильно конфликтовать друг с другом). Не так давно я сделал для него отдельное расширение для получения переводов с сервера VNR, так что переводчики вполне могут создавать переводы в более сложной программе, а читатели – читать в легкой. Хотел также начать перенос словарей, но ни в какую не могу завести MeCab библиотеку под плюсами, буду рад, если найдется эксперт, который поможет в этом вопросе.
В заключение, немного статистики сервера на текущий момент:
• Всего созданных субтитров: 1,555,653
• Новых субтитров в месяц: 21 470,3
• Количество игр, имеющих хоть один субтитр: 1759
• Количество пользователей: 62 430
Благодарности:
gasparchik и анониму за редактуру текста