Объявляю эту тему своей. Тем не менее, я буду использовать её с некоторым уважением к правилам форума.
Я буду публиковать здесь то, что посчитаю нужным, в какой захочу форме, и в желаемых количествах.
(Предупреждаю, что если кто-либо необоснованно и без моего согласия прикоснётся к самой теме или сообщениям здесь – то я для начала стану рандомно удалять чужие комментарии в соседних темах до тех пор, пока не лишусь формальных прав, позволяющих это.)
Безусловно, ничего не имею против чьих-либо ответов.
(прошлое содержимое этой темы отправлено туда; а вот и заархивированная копия прошлого содержания)
ЦитатаVirki ()
(это из чата, если что)
*UPD*
ЛИЦЕНЗИЯ НА ВЕСЬ КОНТЕНТ ЗДЕСЬ И НЕ ТОЛЬКО:
Я, Клименко Алексей, также известный как Aleksusklim/aleksuslim и Kly_Men_COmpany, сим объявляю, что все мои авторские тексты, такие как личные сообщения, комментарии, описания или документации, и художественные произведения любого характера – все написанные ранее и все последующие – должны рассматриваться как лицензированные под «CC0» (общественное достояние), если в них не указано иное; а все мои авторские программные продукты, которые я распространяю с открытым исходным кодом – все написанные ранее и все последующие, если не указано иное и отличное от «лицензия – свободная» или «free» – должны рассматриваться как лицензированные под WTFPL (отказ от авторских прав); однако, данное моё заявление должно применятся только к тем материалам, в отношении которых моё единоличное авторство объективно не вызывает сомнений, а также к таким материалам, для которых очевидно отсутствие ещё чьих-либо претензий на лицензию и авторские права. but nobody came
Сообщение отредактировал aleksusklim - Воскресенье, 05.11.2017, 15:26
I never imagined myself out on my own Trying to find out what's next for me The Cutie Mark Crusaders have always been my home Maybe now there is more that I could be
I guess as time goes by Every pony has to go out on their own And maybe someday I'll have to try Something new that's just for me A little something that could be Just my own and I won't feel so left behind
We used to say that we'd be always side by side Maybe things are changin' and this could mean goodbye I always thought our friendship was all I'd ever need We've always been crusadin' – what else is there for me?
I guess as time goes by Every pony has to go out on their own And maybe someday I'll have to try Something new that's just for me A little something that could be Just my own and I won't feel so left behind
__________
Мой опубликованный перевод:
Я и не думала, что буду одна В поисках: что же ждёт меня? Искателей команда – вы были мне родня, На что же ещё способна я?
Когда придёт ваш час, То все пони по своим тропам пойдут… Так может и я сумею раз Сделать что-то, что моё, Найти призвание своё И смогу не потеряться, как сейчас.
Клялись, что вечно будем мы плечом к плечу, Времена сменились – я вам «прощай» шепчу. Всегда казалось: дружба – вот всё, что нужно мне. Мы свой талант искали, заняться чем теперь?
Когда пробьёт мой час, Я, как все, своей дорогою пойду. Попробую всё, но может раз Что-то я найду своё, Что идеально и моё, Да смогу не огорчаться, как сейчас.
Take a look at everything around you All the smells that surely will astound you Open up your heart, it will surround you In the magic of Hearth's Warming Eve
The little things that make it better Little ponies spreading cheer Give a toy, a hug, a sweater Memories that last all year
The present's always filled with presents Large, medium, and small Sometimes the most important things Aren't very big at all
What a party, there's so much to see here Can't believe you didn't want to be here You'd have a blast, I guarantee here This is the spirit of Hearth's Warming Eve
Cider's flowing, this is living Come on and feel the beat Life is better when you're giving Each time you do it feels so sweet
The present's always filled with presents So come on, open your eyes Spend time with ponies just like you And watch your spirits rise
The present's always filled with presents Take a look around The reason for the holiday Is quite easily found
Yes, the reason for the holiday Is quite easily found And the reason is to be with your friends!
__________
Наш исходный перевод (с Princess_of_Uranus):
Посмотри-ка ты вокруг, приятель: Запахи попробуй-ка, впитать ты, Сердце поскорей открой, окружит Нас с тобою магия очага.
Вот всё, что нам дарует счастье: Малышей веселие: Дай игрушку и обьятье – На весь год волнение.
Подарочки полны подарков: Мал, в меру, и большой – Бывает, самый важный дар Он меньше нас с тобой.
Что за вечеринка тут, смотри же: Здесь ты не хотела быть, но вижу, Оторваться можно тут по полной, И вот что значит наш дух очага.
Сидр льётся, жизнь несётся – Давай, почувствуй бит. Ведь приятнее живётся, Когда всё делаешь для других!
Подарочки хранят подарки, Открой же пошире глаза, Тусуйся с пони прям как ты – И вот твой дух воспрял!
В подарочках всегда подарки, Посмотри кругом – Празднику причину мы Легко с тобой найдем.
Да, для праздника причину мы Легко с тобой найдем, И причина – лишь быть вместе друзьям!
Everypony has times in their lives When their hearts are filled with doubt Frustration builds up inside And it makes you want to shout
But if you just take that first step The next one will appear And you find you can walk, then run Then fly…! Into the stratosphere
You've got to give it your best So you can pass the test Give it everything that you've got
And we know you can win You just have to begin Have to give it your very best shot
There are times that you want to give up When you think that you can't go on But if you fight through with all of your might You will find that you can't go wrong That you could do it all along
Everypony has times in their lives When their hearts are filled with doubt But if you just give it your all You'll start to work it out
And I know I can't give up too soon Get myself in the zone And I find I can walk, then run Then fly…!
I can do it on my own You can do it on your own I can do it on my own I can do it on my own
__________
Наш опубликованный перевод (с Princess_of_Uranus):
Каждый пони миг в жизни видал – Что в сомненьях сердца часть, Тревогу не обуздал И уже готов кричать!
Но стоит лишь сделать шажок – Как следующий грядёт, Ты идёшь и бежишь, прыжок, Полёт!.. В небо тебя несёт!
Напомнить гордо хочу: Всё тебе по плечу, Лучше всех мастерство покажи!
Знаем – ты победишь, Ты пройдёшь, лишь начни, Просто приложи больше ты сил!
Может сдаться совсем и пора: Трудно встать да идти вперёд Но стоит только чуть-чуть поднажать, Превзойти сил своих порог – Дела закончить сам бы смог!
В каждой жизни пусть есть времена И колеблется душа, Но посвяти в целом себя – Всё сдюжишь не спеша.
Отступать я уж нет, не хочу – А войду весь во вкус. И уже я хожу, бегу, Лечу!
Я сделать всё и сам смогу! Всё по силам впредь ему! Делать всё я сам могу, Всё сумею, всё смогу.
Would you say I'm a hero Glorious and brave If I told something You wouldn't believe?
That sometimes I'm scared And I can make mistakes And I'm not so heroic, it seems
But if day can turn to night And the darkness turn to light Then why can't we imagine a changeling can change?
No two ponies are exactly the same No two snowflakes ever match their design
And I thought I was strong But I was nothing but wrong When I forgot to be friendly and kind
But if day can turn to night And the darkness turn to light Then why can't we imagine a changeling can change?
Would you say I'm a hero Glorious and brave If I told something You wouldn't believe?
This changeling, it seems Knows the real me And would stay by my side 'til the end
So if day can turn to night And the darkness turn to light Then why can't we imagine Just, why can't we imagine Then why can't we imagine A changeling can change?
__________
Наш опубликованный перевод (с Princess_of_Uranus и grimnir11):
Я герой, говорите, Доблестный храбрец… Образ лишь – поймите, Притворству конец:
Порою боюсь, С ошибками учусь – Не таким уж героем кажусь…
Даже день сменяет ночь, Но и мрак свет гонит прочь – Так что ж нельзя нам образ, Проверить, хоть раз.
Ведь не могут пони в точь совпадать, И снежинок форму не угадать.
Думал, силы нашёл, Только друга подвёл… И позабыл доброту сберегать.
Даже ночь сменяет день, Или свет прогонит тень… Пора бы всем увидеть Соседа ясней.
Я герой, говорите, Доблестный храбрец… Образ лишь – поймите, Притворству конец:
И друг мой сполна Понял, кто же я, Но остался со мной до конца!
Если день сменяет ночь, Отгоняя тени прочь – Луч дружбы нам укажет, И правды путь покажет, И перевертыш сможет Мир перевернуть?
__________
~Даже снежинки не получается такими, какие задуманы.
Иф дэдей кен тёрн ту на-а-айт, Эн дэдаркнэс торн ту ла-а-айт, Бат айвсты-ы-ыл Гят дэблю-ю-юс Фо-о ю-ю-ю.
I wanna be the very best, Like no-one ever was. To catch them is my real test, To train them is my cause. I will travel across the land, Searching far and wide. These pokemon to understand, The power that's in side.
Pokemon! Gotta catch 'em all. It's you and me. I know it's my destiny. Pokemon! Oh, you're my best friend, In a world we must defend. Pokemon! Gotta catch 'em all. A heart so true, Our courage will pull us through. You teach me, And i'll teach you. Pokemon! Gotta catch 'em all. Gotta catch 'em all. Yeah-eh-eh.
Every challenge along the way, With courage i will face. I will battle every day, To claim my rightful place. Come with me, The time is right. There's no better team. Arm in arm, we're in the fight. It's always been our dream.
__________
Мой перевод:
А я хочу великим стать, Всех лучше, без прикрас! Мне не легко их поймать, А тренером быть – класс. Путешествий – тьма с меня, Поиск ждёт в пути: Вот покемон – как их понять, И силу, что внутри?
Покемон! (Всех ловить готов!) Лишь ты и я: Такая моя судьба. Покемон! Он – навек мне друг, Мы миры спасём вокруг! Покемон! (Всех ловить готов!) Душой горжусь, Всё мужеству по плечу, Вас учу И сам учусь, Покемон! (Всех ловить готов,) Всех ловить готов!
Я!
Испытанья волной грядут, Чтоб смелость я постиг: Битвы каждым днём пройдут – Не зря высот достиг! Цель близка, Давай ко мне: Лучших не сыскать. Мы в бою – спина к спине, О чём ещё мечтать?
Покемон! (Их поймать бы смог!) Всегда я и ты, Верны нашей доле мы. Покемон! Он – товарищ мой, Защитим земной покой! Покемон! (Их поймать бы смог!) Дух честен твой, Отвага решает бой: Ты со мной, А я с тобой, Покемон! (Их поймать бы смог,) Их поймать бы смог!
Их поймать бы смог! Их поймать бы смог! Их поймать бы смог! Я!
Покемон! (Их искать – улёт!) Вот мы с тобой, Покорны судьбе одной, Покемон! Он – мой друг навек: Избавлять свет наш от бед. Покемон! (Их искать – улёт!) Тьмы в сердце нет, И храбрость у нас вдвойне: Ты ко мне, Да я к тебе – Покемон! (Их искать – улёт,) Их искать – улёт!
Вот когда однажды понадобилось мне собрать ОДИН список своих игр – я его собрал. Но это было сделано слишком поздно, а чтобы дополнить его всеми описаниями, которые я когда-либо к ним писал – вышло бы значительно дольше и скучнее.
Это у нас-то всегда раскопки хоть и долгие – но конечные. А мне, чтобы на самом деле найти что-то, что я когда либо кому-то писал – это перебирать все документы, все письма электронной почты, все мессенджеры и диалоги в социальных сетях. Я же никогда не собираю ничего в формате, удобном для поиска или экспорта (и кстати, предыдущие два поста к приведению в такой формат дались мне далеко не без труда).
В общем, дальнейшее содержимое не полное как по количеству (тут не всё), так и качеству (описаний могло быть больше), и ещё и собрано из различных мест, но тем не менее, я публикую его.
{{{ В этой игре нужно выискивать цели мышкой, основываясь на расстоянии до ближайшей из них от текущего положения мыши. Управление – только перемещением указателя, кликать нужно только для паузы и старта игры.
В каждом уровне цели расставляются случайно, и они не видны. Пеленгация происходит автоматически, примерно раз в две секунды. Чем ближе цвет волны к красному, и чем меньше общий радиус – тем ближе цель.
По мере распространения волны в кругу шариков на миг возникает цельная полоса, и она наиболее яркая в тот момент, когда радиус как раз равен расстоянию до ближайшей цели (относительно центра испускания).
Если волна выпущена в достаточно маленьком радиусе от цели – это считается попаданием, и закрашивается кружком. После поражения всех целей на уровне, игра переходит на следующий, в котором на одну цель больше.
Количество снарядов (=время) ограничивается в зависимости от числа целей (=уровень), если патроны закончатся – игру придётся начинать с самого начала. В качестве рекордов ведётся статистика максимального достигнутого уровня и минимального количества использованных снарядов на каждом из них.
Игра вполне проходима, если понимать стратегию. Вообще говоря, математически возможно ловить одиночную цель всего за четыре хода, ведь расстояния от трёх различных точек даёт однозначное её расположение. Но со схожими яркостями цветов и многими целями – задача становится не такой тривиальной! }}}
Это программа-помощник для создания японских кроссвордов. В нее встроен решатель, позволяющий убедиться, что кроссворд точно решается без «предположений»: http://klimaleksus.narod.ru/Files/3/JapMaker.rar
Обрывки описания: {{{ Короче, ты – красный, вправо-влево-вверх-вниз. Ушёл за экран = проигрыш. Синие – враги, коснулся = проигрыш. Всё поле – клавиши на клавиатуре, 123,… WER… ASD… ZXC. Розовые кружки по бокам – это два шифта и два контрола. Зажал ОДНУ кнопку и контрол/шифт – стрельнул ТУДА заряд из соответствующей пушки (заряд осколочный). Зажал ДВЕ кнопки и нажал пробел или энтер (что сработает) – пустил два снаряда между ними (если пересекутся, будет осколочный). Зажал ТРИ кнопки – запустил генерацию взрывной волны, которая если скастуется, то почти полполя зачистит. Снаряды могут убить себя и убивают всех врагов. НО! использованные пушки надо перезарядить, иначе из них более нельзя пальнуть. Двойные и тройные также требуют перезарядки – для этого нужно КОСНУТЬСЯ их своим красным шаром. Цель – выжить как можно дольше и завалить всех синих! Каждый выживший и убежавший синий снимает один восклицательный знак из заголовка окна, а их количество отображает время до следующего появления нового синего, так что… (кстати, во многих играх в качестве паузы можно использовать F1). Из «key» надо попробовать мультиплеер кооператив сделать. > "ко-оп режим: пушки дамажат по синим и себе, но не бьют союзника" – Я думал только управление рапараллелить, но не персонажа. Хотя… ИДЕЯ!! )) }}}
О, а вот моё пианино на GML: http://klimaleksus.narod.ru/Files/4/rp.rar Правда, я туда подключил перехват windows-messages через Delphi, чтобы получить абсолютную отзывчивость на события ввода. Высокой ценой, правда. Да и программа получилась какая-то бесперспективная из-за этого.
А вот ещё одна незаконченная 3D-игра: http://klimaleksus.narod.ru/Files/4/ih.rar Уровень – болванка. Один враг, цели нет. Можно бежать и прыгать, приседать. Кстати, если выбросить «свет» и присесть, то враг отвлечётся на него, если не «видел» куда пошёл игрок. Там вообще у врага два режима (их переключение можно увидеть, нажав Z для дебаг-вида) – поиска и погони. В первом он стандартными средствами GML вычисляет пусть к игроку по секте лабиринта, а во втором, когда игрок окажется его поле зрения – движется к нему в лоб, огибая препятствия тоже стандартными средствами. Насчёт этой игры у меня было даже больше идей, но я её что-то забросил…
О, вот математическая игра: http://klimaleksus.narod.ru/Files/4/la.rar Нужно визуально подбирать значения переменных в систему линейных уравнений без видимых коэффициентов.
Вот игра-тренировка, где нужно запоминать последовательность чисел: http://klimaleksus.narod.ru/Files/C/External_12.rar Говорят, нужно исправить режим проверки ответов, чтобы был вариант «пропустить», а не перебирать забытый, чтобы не забыть в это время оставшиеся далее.
Вот украденная идея игры, где мышью нужно щёлкать по правильным кружкам: http://klimaleksus.narod.ru/Files/P/scull_1.rar Нужно тыкать в те, цвет которых совпадает с цветом фона в данный момент. Можно прочерчивать без отрыва. При первом касании остальные меняют цвета. Но инверсный цвет рамки остаётся, по нему всё ещё можно отличить нужные. А на самом деле, игра сетевая! Для запуска сервера достаточно передать любой аргумент при старте, или перетащить на бинарник любой файл, да хоть её же исходник. Подключение по IP к серверу – кнопка S. Старт игры на сервере (только отдельным процессом) – пробел в его окне. Определение победителя довольно чёткое, с учётом пинга до клиентов, однако с полным доверием к ним (т.е подаётся взлому). Жаль, нет адекватного управления пирами, как и таблицы рекордов.
Вот редактор картинок для использования в играх на ZX Spectrum: http://klimaleksus.narod.ru/Files/S/sinc2.rar (своей цели – MLP2048 – я так и не достиг, но и не отверг её) Особенность в том, что поле делится на квадраты 8*8, каждый пиксель которых может иметь либо цвет фона, либо цвет тона. Но эти цвета (коих всего восемь) задаются для каждого квадрата, а не пикселя, из-за чего придётся умело располагать рисунок по четким границам между квадратами.
А ещё я некоторое время в институте преподавал уроки разработки игр на Game Maker, и поэтому у меня появилось несколько концептов, не все из которых стали полноценными играми (но фонтанчики, туннель-драйвер и даже моя охота на лис – именно из этой серии), а так и остались концептами.
Я тут пособирал всё (и не только) отдельно без бинарников в архивчик: http://klimaleksus.narod.ru/Files/4/concepts.rar Имена двухбуквенные (они недостойны большего), везде ниже, где вместо ссылки написано [xx] в квадратных скобках – это одна из папок этого архива. Хотя иногда что-то выложено и по ссылкам отдельно. Для открытия – вот сама среда без ресурсов: http://klimaleksus.narod.ru/Files/S/GML.rar
[de] – воссоздание механики игры «Dark Echo». В оригинале персонаж создаёт звуки во тьме, которые визуально вырисовываются и отражаются от стен. Можно идти, удерживая мышь в стороне, красться путём быстрого нажатия, бросать камень правой кнопкой, а ещё совершать хлопок, удерживая мышь на самом персонаже.
[ml] – это типа битва на двоих. Управление почти как в моём chopduel, но упор был сделан на векторное отталкивание от краёв экрана, соперника и от этой хреновины в центре. Основного игрового процесса нет.
[ff] – концепт основной механики камер первых Five Nights at Freddy’s. Зелёное – игрок. Голубое – текущий вид из камеры. Ну жёлтое – подсветка. Синий – игрок, красные – враги; время, конечно, ускорено. Левый клик – включить нужную камеру. Клик по игроку или правый щелчок в любом месте – закрыть камеру и перейти на игрока. Мышкой можно закрывать двери вокруг себя, но только одну одновременно. Враги движутся тупо по рандому. Персонаж игрока передвигается нажатием стрелок, но только если камера закрыта. А фишка в том, что если враг попадает на камеру – то он должен на неё остаться до тех пор, пока камера с него не уёдет. Если игрок входит в комнату с врагом – проигрыш сходу. Но если камера закрыта, то враг не может войти к игроку, и будет бесконечно ждать в следующей комнате, если выбрал целью хода текущую. А если же камера открыта, и не на этом враге – то он прыгает в комнату к игроку, но игра не закончился до тех пор, пока камера не будет закрыта. Всё это типа для того, чтобы скриммер вылетал только на отклик от действия пользователя…
[ab] – демонстрация того, как например можно сделать быстрое отталкивание шарика от поверхности произвольной формы: считаем по кругу, есть ли пересечения некоторых точек, и выбираем противолежащий вектор. И складываем их… Правда я с коэффициентом прибавки к скорости не разобрался, но управление на стрелках, а добавление стены – правый щелчок.
[gw] – какая-то битва с боссом, мы собирали разные варианты его снарядов, чуть ли не Touhou вышло. One-hit-death, почти непроходимо. А ещё можно через Ctrl оставить бомбочку, которая может убить врага, если её заденет его снаряд. Вторая версия – чья-то модификация в стиле андертейла, там атака уже на Shift.
[gn] – псевдо 3D, тут надо мышкой сбивать летающие тарелки и уклоняться от астероидов…
[pt] – PianoTiles? Управление на F-G-H, жизни в заголовке. Абсолютно непроходимо.
[rn] – вот это чёткая штука. Простой бегунок, с замедлением и ускорением, а также регулируемой высотой прыжка. Не то что мой SpyroRunner, это играть можно бесконечно, и не проигрывать. Перезапуск на пробел.
http://klimaleksus.narod.ru/Files/4/robot.rar – Вот учебный исполнитель «робот», по аналогии с паскальским из PascalABC ( http://klimaleksus.narod.ru/Files/PABCDistr.zip ). Несколько заданий приложены, одно с решением. Можно либо всё прописывать в самом исходнике в среде, либо же перетаскивать решения в текстовых документах на бинарник. Само задание тоже можно перетащить, чтобы посмотреть его. Enter – перезагрузка текущего задания (некоторые слегка рандомные). Хорошо бы сделать новую версию, более багоустойчивую (но нет, я не собираюсь опять gml вручную парсить!..) и с нормальным описанием функционала.
А ведь у меня тоже полно и своих концептов! Вот например какая-то одна хромая реализация квадродерева: [qu] Мышкой можно рисовать и убирать дырки. А ещё в архив я положил какую-то флеш-презентацию про квадродеревья (если я не ошибаюсь, она уже удалена со странички разработчика).
К слову о параспрайтах: [ft] Цели нет, но можно полетать. Хотелось сделать игру, в которой игрок летает в конце игры лучше чем в самом начале отнюдь не потому, что его персонажу чего-то там прокачали, а лишь из-за прокачки собственного скила тыканья по кнопкам. Управление на стрелочках. Спорю, что без подсказки не взлетите)) Нужно удерживать кнопку вверх, быстро отпускать её и нажимать ещё раз. В полёте нужно временно нажать вниз, чтобы немного повысить обтекаемость. И продолжать нажимать вверх с правильным переменным ритмом, который показывает сила взмахов. А для доказательства того, что чётко лететь можно всегда, предлагаю зажать Ctrl. Скорость понизится до 10 fps, а на отладочных шкалах будут выделены те, которые отвечают за силу взмаха. Нужно удерживать вверх до тех пор, пока они не сравняются – отпустить и тут же нажать снова. О, сюжет бы придумать…
Случайные шахматы: [rc] Что будет, если белые будут выбирать любой из доступных ходов, а чёрные – сначала выбирают любую случайную фигуру, которая может ходить, а потом – делают ей возможный случайный ход? Взятие имеет приоритет, правила насчёт короля стандартные. Shift – ускорить время.
Ещё одна проверка физики летящего объекта: [wd] Тут притяжение, ускорение, скорость, подъёмная сила и сопротивление воздуха, конечно же, неправильно подсчитанные. Суть в том, что можно менять свой угол наклона, если он направлен вверх, то ещё и ускорение добавляется (набор высоты, планирование, пикирование). Сверху притяжение сильнее. Управлять всего двумя стрелочками вверх и вниз. Стрелять – удержание Ctrl или вправо, снаряды как бы разгоняются траекторией угла атаки, поэтому их можно закидывать по дуге назад. Пробел – сброс уровня. Ну вообще цели нет, но я поместил бесполезный сверкающий шарик в самый верхний-правый угол, и его можно попробовать достать…
Буквенные кроссворды! http://klimaleksus.narod.ru/Files/4/cross.rar В них нужно собирать слово в таблице букв, рисованием ломаных линий. Эта программа поможет составить такой кроссворд, имея форму поля (не обязательно прямоугольное) и список слов. Картинка считывается из файла, как и слова; сама же программа в полуавтоматическом режиме расставляет эти слова по тычку. Клик по клетке – выпустить оттуда слово случайным образом. Если плохо легло – можно кликнуть по началу правой, и перестроить; каждый раз выбирается максимальное из слов, которые могут поместиться в данное пространство. В принципе, программа не гарантирует, что все слова займут все клетки, но вместо этого даёт статистику, и позволяет выровнять (Pageup/down и стрелочки, в том числе автоматически по Enter) накладываемую сетку по контурам фона. А через Ctrl можно увидеть реальные слова, а не их цветные тени.
Самолётик… [tg] Хотелось сделать игру, в которой у самолёта был бы угол, под которым он летит, влиял бы на его вектор направления; и с учётом силы тяги (на самом деле, это ж предшественник «wd»), потребляющей топливо. А при повреждениях у него могли бы выходить из строя различные системы, и их нужно было бы ремонтировать. Реализация получилась отвратительной… Пробел – стрелять, Enter – чиниться, стрелочки – наклон и тяга. В игру впихано больше, чем отлажено и доведено до ума.
Как-то меня зачем-то попросили сделать имитатор казино для проверки чего-то в теории вероятности: [cs] Там много всего подсчитывается (показываются при наведении), но всё было реализовано неудобно и кучей.
Мощная игра задумывалась: [cd] Я видел такой концепт где-то на Spectrum, смысл в том что корабль плавает по карте, а если встречает подлодку, самолёт или другой корабль – экран переключается на мини-игру, в которой нужно победить врага особенным способом. А я ещё попробовал сделать так, чтобы заезжая на сушу, корабль мог превратиться в танк, а на взлётную полосу – в самолёт. У всего этого разное оружие и управление. Но реализация меня опять не удовлетворила, и я не стал заниматься пустым левел-дизайном, просто бросив игру неоконченной. Оружие меняется на Shift, на пробеле можно уйти в атаку подлодок (там бомбы падают глубину, куда показывает стрелка) или самолётов (там нужно стрелять на Ctrl по самолётам, а прицел показывают конусы четырёх пушек, направляется стрелочками; а уклоняться от атак нужно с удерживанием Shift).
Однажды для чего-то меня просили сделать имитатор ватсаппа, где на экране был бы неинтерактивный интерфейс открытого мессенджера, в котором можно было бы заранее задать текст входящих и исходящих сообщений: http://klimaleksus.narod.ru/Files/4/wa.rar Это для какой-то сценки а-ля КВН и выводом на проэктор. На самом деле, по назначению программу так и не использовали, хотя функционал у меня получился большой, и даже справка есть.
А вот реализация лотереи, чтобы случайным образом выбрать один шарик: http://klimaleksus.narod.ru/Files/4/rb.rar (с секретной возможностью наоборот сделать так, чтобы выпала нужная последовательность)
Вот думаю, это тоже что ли выложить: http://klimaleksus.narod.ru/Files/4/mc.rar – заменил оригинальный текст на лорем. Программа принимает шаблон картинки и большой текст, чтобы расположить его на ней и расширить промежутки между буквами так, чтобы пробелы образовали исходный рисунок. Делал, можно сказать, в качестве своеобразного подарка (вернее, не саму прогу, а конкретную картинку: http://klimaleksus.narod.ru/Files/4/mc.png )
А вот мои старые-старые игры, и некоторые можно даже сказать, хоть сколько-то удавшиеся: (хотя нет, в мусорку всех!) [tm] – тут нужно собирать созревшие помидоры (украл чей-то пак ресурсов), в игре нужная поуровневая справка.
[bk] Банка – сверху падают камни, нужно прыгать залезать на них. Кривая игра с бесполезными понтами, а ещё можно прыгать сверху до касания с летящими, и прошибать стоящий камень кнопкой вниз под собой. Очки несбалансированны, как и недокументированные эффекты от призов…
[rf] Отражения – нужно гонять шарик в правильном направлении, чтобы собирать призы и не попадаться на бомбы. Жёстко сделано, возможно если замутить нормальный физический движок, то пересоздать идею можно будет.
[rr] Рельсы – а тут нужно проехать по железной дороге, запоминая её форму, чтобы собрать максимальное (и минимальное) количество призов. Внутренний расчет реализован был как-то рекурсивно, и ещё есть меню, позволяющее задать параметры генерации уровня.
[tp] А тут исходник даже не мой, я его где-то украл. Блин, будь моя реализация чуть получше, годная бы штука вышла! Простой платформер, с разными типами стенок. Головоломка! Нужно пропрыгать до конца и не проиграть.
[md] Это кончено не Пэкмен, но просто стилизация такая. Идея в том, что нужно собрать по лабиринту боезапас, потом расставить динамиты, а затем – рвануть всё по цепочке, чтобы уничтожить всех врагов! А ещё брать и прятать яйца, из которых потом можно ожить при проигрыше. Тут меня левел-дизайн скорее подвёл, даже имеющиеся карты настолько сложны, что по-моему даже я их не проходил. И сама игра опять же жестковата.
[zd] Зимний дрифт! Реалистичность физики конечно так себе, но тут нужно проехаться вперёд, огибая препятствия (а линии покажут направление к ним). Разные шкалы на экрана отображают какие-то разны параметры, а при ударе об стенку или препятствие управление машиной меняется и переходит в решим скольжения, где нажатие кнопок действует не сразу, и можно лишь чуть-чуть подруливать. В режиме на двух игроков есть оружие (кнопка вниз), которое меняет тип в зависимости от взаимного расположения игроков (а бонус в скорости получает отстающий). И есть режим автопилота, когда компьютер сам рулит (и вот как раз эту идею ИИ я и использовал в TunnelFlyer), и даже есть битва с компом отдельным режимом; кнопка вверх – быстрое ускорение с низкой скорости ценой дрифта.
[ms] Сапёр. Хотел сделать так, чтобы первым ходом не открылась не только бомба, но и просто всегда была пустая клетка. Хотя нет, с тех пор как я узнал, что на стандартный сапёр в XP есть крутой чит-код, моя реализация стала априори хуже.
[fs] Просто быстрая штука, чтобы «растрясти» стереограмму. Такую, как с сайта http://hidden-3d.com/
[db] О-о, а рпг-задумка была-то большой. Биться на Ctrl при пересечении с врагами, магия – на пробел, сменить магию – на Pageup/down (сбалансировано плохо).
[lv] Тугая неинтерактивная реализация игры «жизнь».
[bl] Какая-то неудачная реализация игры наподобие «три в ряд», перетаскивать мышью.
[pl] Украденная идея игры про диспетчера, где нужно перетаскивать самолётики на посадочные полосы, и не давать им врезаться. При зажатом Shift их поведение становится очевиднее. Правый щелчок – посадить готовящийся к посадке самолёт.
[dm] Какая-то очень старая моя демонстрационная игра, но вышла она уж с очень жёстким управлением. Стрелять на пробел.
[hc] Какой-то хоккей, где нужно запихивать мячик в ворота во время пересечений с ним. Там есть даже не только режим для двух игроков, но и мультиплеер, через встроенную в игру мою же обёртку для мультиплеера в Game Maker. Обёртка фиговатая и нелогичная, но на удивление как-то работает.
[sn] Плоходокументированная змейка с тем же модулем мультиплеера, но тоже какая-то грубоватая и не очень.
[pg] Погоня… первоначально – как модификация исходного же образца самого Game Maker. Управление стрелочками. Глупая и нудная игра. Вторая версия – уже на мыши, нужно просто удерживать шарик под курсором, а потом и кликать по нему.
[sw] Очень неудачная реализация махания световыми мечами: управление стрелочками; двойное нажатие в сторону – полный оборот; удерживание пробела – щит; Ctrl – убрать меч – без него пробел выбрасывает магию, дающую контроль над врагом или стеной, которую она коснётся.
[gr] – это головоломка, когда дано разноцветное поле, нужно пройти по цветам из одной точки в другую, сохраняя всегда одну и ту же последовательность цветом Для старта, слева нужно нажать последовательно при кнопки, а потом перетаскивать персонажа мышкой по полю справа (вернее, он сам за мышью следует). Странно, но мне хватило самого факта того, что я смог реализовать этот концепт, и такие вещи как улучшение управляемость или адекватность меню меня резко перестали интересовать… Любая кнопка на клавиатуре – перезапуск.
Во многих вышевыложенный играх, даже если и написано, что справка есть – на самом деле её нет. Если я где-то забыл указать управление – то обычно это стрелочки, Ctrl/Shift/Enter/пробел. А ещё я раньше делал такие щедрые начальные экраны, и указывал на них своё авторство. Потом, когда стало чуть-чуть стыдно за такие дурацкие реализации, мои копирайты стали более скромненькие и краткие.. Ну и теперь вот я вообще стараюсь ничего такого не указывать в самих играх, разве что может быть в справке либо даже просто в названии версии в самом ресурсе для .exe
Вдогонку – уже довольно старая моя копипаста:
Я манал это MIDI.
Целую неделю убил на то, чтобы закончить клёвую программу, которая, видимо, призвана стать программным синтезатором, умеющим считывать .mid и воспроизводить через колонки (буду называть динамики так, чтобы не путать со спикером) или pc-speaker. Если построить пересечение и разбитие шкалы времени на такие участки, где играет равное количество нот – то их и надо будет выводить на спикер быстрым перебором; иначе – ровной нотой. Для вывода в колонки можно либо так же порезать, либо играть как в оригинале, с любыми объединениями нот.
Потом я упарился с «инструментами» – прямоугольным, пилообразным, треугольным и синусоидальным сигналами. Оказалось, что громкость каждого на слух может сильно отличаться от других, а загуглив конкретно ВО СКОЛЬКО РАЗ, мне выходило разве что «ой-ой, это всё субъективно, ибо даже звуки разной частоты ощущаются с разной громкостью». Но я всё же выбрал примерно некоторые цифры …
А затем выяснилось, что происхождение миди-файлов может быть насколько угодно корявым, и в них может меняться темп воспроизведения, уф! Дело в том, что я не писал свой миди-парсер (несмотря на то, что я хотел просто вытащить массив всех нот с их временами, длительностями, номером инструмента и канала – все остальные события, все-все – меня не интересуют..), потому что понял, что без парсинга ВСЕХ событий там не обойтись; а нашёл готовую реализацию на Delphi. Но оказалось, что в ней игнорируются события изменения темпа и масштаба времени, из-за чего многие файлы воспроизводились неправильно. И когда я попытался сам разобраться со временем, я вконец запарился со структурой формата, где куча формул и условностей, зависящих от кучи всяких параметров.
Нашёл ещё одну реализацию полноценного синтезатора, но она оказалась наоборот же такая большая и сложная, что я не смог вытащить из неё нужную мне часть, а всё вместе у меня компилироваться не хочет.
Короче, я пока ставлю крест на своей идее, потому что от неё меня уже тошнит. Исходник: http://klimaleksus.narod.ru/Files/4/midi2something.rar – там полный бардак, куча неиспользуемых функций и закомментированных кусочков. Я это вообще из трёх других программ собрал. По умолчанию он сейчас запущен как софт-синтезатор с несколькими инструментами (там файлик, на котором более-менее нормально воспроизводится). Если изменить константу на строке 806, то включается режим деления на участки с равным количеством нот; хотя у меня такое чувство, что там уже что-то сломалось (этот режим я делал первым, а потом ж значительно менял всё вокруг). Теперь если изменить 720, то воспроизведение переходит к спикеру, но играется только первая соло-нота. Изменив 348 можно получить многоголосый перебор, но добавил я его только что и весьма грубовато (а ведь это чуть ли не основное, что должно работать идеальнее прочего!..)
Может когда-нибудь перепишу эту программу заново (там ещё столько всего планировалось: много опций запуска, затухания и громкости, фильтр и мап каналов и инструментов, поддержка других трекерных форматов, вывод на миди или разные wave-устройства, сохранение в звуковой файл…), если найду как нормально миди распарсить.
Ха, а вот pcstream – другой франкенштейн, к которому я пришёл, когда захотел выяснить, можно ли заставить Windows воспроизводить стандартные звуки через спикер. Всё же элементарно – либо найти заводскую функцию, которой нет; либо указать на миди-файл (и сделать свой виртуальный драйвер миди-устройства…), что тоже невозможно. Тогда я подумал, что это ж можно программой наподобие виртуального аудио-кабеля, перенаправляющей выходное wave устройство (если поставить его по умолчанию – системные звуки тоже пойдёт через него) на другое входное, которое можно считывать (как на запись с микрофона) другой программой, которая уже будет перенаправлять найденные в wave частоты (не-а, таки БЕЗ разложения Фурье) на спикер.
Что, собственно она и делает. Ну анализ там слабенький, со многими предположениями о входном сигнале (нужная громкость, нужная форма, нужный диапазон частот и выравнивание по нулю, равное распределение в положительную и отрицательную амплитуду), то есть «всё подряд» один фиг играть не сможет. Но если заранее формировать wave файлы с синусоидальным сигналом, то по идее она идеально должна переваривать и выдавать чистую ноту (там я ещё привязку к нотнам midi-диапазона сделал, чтобы небольшие отклонения частоты не сразу меняли тональность).
Эту прогу я придумал только что, после вашего письма. Ага, а теперь угадайте, зачем я сейчас стал париться с предыдущей программой. Именно для конвертирования миди в СИНУС для этой.
Ну а к этой нужно ещё добавить выбор входного устройства, и чтение звука из файла (оно там было, но я его уже успел поломать). Но вообще говоря, поиграться с микрофоном можно хоть сейчас ^^ Там, конечно, задержка (как-то я не очень пряморуко с буферами работаю, и таймлаг у меня ещё и копиться в ту или иную сторону – поставил явные условия на пропуск или добавление семплов при отклонении, это же явно как-то неправильно) ощутимая, но это очень прикольно наблюдать, как спикер пытается «повторить» тот звук, который слышит микрофон. У него можно даже ртом ноту издавать. А можно и на колонки чистый синус по нотам пустить, прижав к ним микрофон – вообще чётко играть будет. В прочем, можно замкнуть микрофон на себя, прислонив к спикеру же – и получить самогенерацию. О, чувствительность регулируется в строке 290, это шестнадцатибитное число (порог регистрируемой амплитуды). but nobody came
Да уж, это было непросто! Интересно и познавательно. Но такую вещь на расслабоне не почитаешь, это настраиваться надо. А вообще – круто! Но дико. В том смысле, что может в одном или в другом, но ВСЮДУ – я бы такие выкрутасы с красивыми словечками выдавать не смог, признаю…
Ха, возможно я тоже весьма отравлен канцеляритом. И обычно я как бы считал это преимуществом, потому что много когда владение им играет большую пользу. Другое же дело, что он и не должен ни для чего требоваться, но это уже не ко мне, я просто приспособился как мог. Но я ведь понимаю, когда моя речь свободная – канцеляричу как хочу – а когда я создаю некий продукт, где этому не место – и легко избавляюсь от него. Однако ведь автор книги призывает-то как раз из намеренного искоренения его из обыденной жизни в том числе.
Вообще, книга переполнена её личным отношением ко ВСЕМУ. Хотелось бы больше конкретики, больше точных примеров и ничего лишнего. Нет, там очень и очень много примеров, но он часто разбавлялись возгласами «ну как так, ну сколько ж можно». Понятно конечно, что книга должна быть яркой и мотивирующей, но я-то больше предпочитаю «справочники». Хотя думаю, многим такой стиль изложения наоборот понравится.
Ой, а с этим улучшением-украшением переводимых текстов! Это надо постоянно как бы кричать самому себе: – Бред. – Но так в оригинале! – Что это значит? – Ну это как бы… – Нет. Ещё! – Это когда… – Так, и? – Там вот как бы… – Проще! – Ну там всё… – Ещё проще!! – Не знаю! Ну это типа… – Да что это!? – Это бывает, когда… – Ну что это такое? )) – Да это же! – Ага, во-от! – И ещё!.. – Всё, так и напиши.
И так на каждую фразу. На примерах показывалось, как битва за каждое слово выигрывает бой за всю фразу. Хм… В принципе, это именно то, что делает Томас в переводе Spyro2.
Нора Галь агитирует за «дерзкий» перевод! О, и зря вы сказали, что последние главы можно не читать. Это же «Best Practices»! Ага, диву даёшься, как они выбрали именно такой вариант перевода. А ещё больше нравятся описания – которые следует бы совать в нос тому, кто в очередной раз заявит «имена не переводятся» или «так написано в оригинале».
Отсюда вытекает ещё одна проблема книги. Ну не будь она такой большой, такой тяжёлой для чтения и вникания… Вот кому я могу её порекомендовать? Кому захочется в ней копаться? Тому, кто плохо переводит? Не, если он аж настолько плохо переводит, что только полноценное прочтение такой книги ему поможет – то он и читать её не будет, у него сил и осознанности не хватит. Тому, кто хорошо переводит? Да, он прочтёт. Но весьма нескоро, у него и так много дел. Просто показать нужный отрывок в нужный момент? Но тогда не дойдёт вся мораль, весь напор повествования книги, а значит – и авторитет прочтённого.
Вот можно сказать, что я познал истину (это как фильм «Дух времени», наверное). Не то чтобы я её не знал, но теперь я точно уверен в ней! Но вот «передать» эту истину через эту книгу почти невозможно. Нельзя заставить прочитать её. Тем более, нельзя заставить вникнуть в текст! (Даже я пропускал некоторые абзацы, дойдя до их середины – я и слов таких не знаю, и произведения эти не читал… Хотя теперь может «маленького принца» прочту, а то всё муми-тролль, муми-тролль…) Нельзя «просто сослаться» даже на отрывок, и ожидать, что перешедший по ссылке просветлеет.
Хотите обратный пример? Берём хренового переводчика за шкирку, и тыкаем сюда: http://translations.ted.org/wiki....ий_язык Объявляем это истиной, и приказываем следовать. Не знаю, но по крайней мере одного переводчика, всюду писавшего в субтитрах «Вы» с большой буквы – мы таки переубедили. Но не только одной этой ссылкой… (причём жертва отбивалась неким правилом русского языка, в котором говорилось, что «на "Вы" нельзя обращаться к нескольким лицам», из чего якобы следовал вывод, что к одному лицу – можно и нужно.)
Тут – как я пытался агитировать за неё среди тамошних переводчиков:
Есть довольно полезная книга: http://royallib.com/book/gal_nora/slovo_givoe_i_mertvoe.html Интересно, знают ли о ней современные переводчики – такие как мы – ведь мне иногда кажется, что нет. Польза от книги огромная, но у неё есть одна проблема: это не для лёгкого чтения, и чтобы её прочитать, нужно поставить себе серьёзную цель.
Каждый раз, встречая «имена не переводятся» или «так написано в оригинале», мне хочется бесконечно апеллировать к этой книге. Но вытаскивать оттуда цитаты не так авторитетно, как позволить самой книге открыть глаза другим.
Одно дело, когда переводчик ошибся, что-то пропустил или неправильно понял оригинал – достаточно лишь объяснить и может даже поспорить. Но если же ошибочное мнение закоренело – то изменить его будет очень и очень непросто, особенно простыми разговорами. А тут – собрано всё самое яркое, объясняются (может даже слишком часто) последствия, вытекающие из неправильного подхода к переводу. Кажется, всем достаточно просто прочитать всё это – и качество перевода возрастёт. Либо из-за общей смены отношения, либо из-за более частого включения мозга там, где раньше использовалось «первое слово по словарю», а где-то даже из-за скромности самого переводчика, который не рискнёт предлагать плохой вариант, заведомо осознавая его низкокачественность.
SubCmpAlgo v1.1 – а вот что ещё я собрал. Далее – большая сборная копипаста того, как я создавал алгоритм сравнения субтитров. Это из разных диалогов и источников, и то лишь самое основное. Сначала я обсуждал задачу с математиками и программистами, а затем уже показывал результат переводчикам из TDT.
Короче, у меня есть две числовые прямые, на них – непересекающиеся отрезки. Я накладываю эти прямые друг на друга, и хочу порезать на кусочки. Моя цель – как-то соотнести отрезки на одной прямой с отрезками на другой.
Задание нечёткое, могу лишь примерно описать, чего хочу получить: Если отрезки начинаются в одинаковых местах – резать по ним. Если отрезки чуть-чуть сдвинуты – всё равно резать (через какую точку пройдёт – неважно, меня только интересуют группы соотнесения отрезков по участкам) Если отрезок не соответствует никакому на второй – пофиг, резать его одного. Если один отрезок поглощает другой – они должны оказаться в одной группе. Когда один отрезок поглощает несколько – те должны быть объединены в его группу. И самое главное: отрезок не должен попасть более чем в одну группу.
Пока у меня идея – считать пустые промежутки между отрезками – тоже отрезками, тогда прямые просто разобьются точками. Потом найти пару противолежащих точек, между которыми наименьшее расстояние – и разбить по ним. Продолжать до тех пор, пока получаются разрезы.
Верный способ? Или есть контр-пример?
Вообще, это две разные версии субтитров к одному и тому же видео, которые я хочу построчно сравнить. Но тайминг разный, и количество строк разное. Но они _примерно_ на тех же местах по времени.
Иногда в одном файле фраза одна и длинная, а в другом – две коротких. Тогда они должны быть соединены, чтобы соответствовать.
Так. У меня есть три файла субтитров. Субтитры – это наборы текстовых реплик, персонажей и тайминга. Тайминг – это пара начало+конец каждой реплики относительно всего файла. Пример:
0:17:11.42,0:17:14.59,Rarity,Who cares what some stuffy unicorn thinks of the food here. 0:17:14.59,0:17:16.30,Rarity,It's exquisite. 0:17:16.58,0:17:17.68,PinkiePie,That's true. 0:17:18.24,0:17:21.64,Rarity,And you don't need three silly hooves in your window to prove it. 0:17:21.64,0:17:23.14,PinkiePie,That's double true. 0:17:23.44,0:17:26.48,Rarity,You just need ponies in here to give it a chance. 0:17:26.82,0:17:29.37,Rarity,Ponies that would tell everypony else in Canterlot 0:17:29.37,0:17:31.94,Rarity,that the "Tasty Treat" is best food in the city! 0:17:32.16,0:17:34.24,PinkiePie,That's true times three!
– некоторые концы совпадают с началами следующих фраз. Но это не запрещает им пересекаться. Вначале я хочу взять представить их как отрезки во времени, и взять объединение. Я соберу пересекающиеся фразы в кусочки большего размера, объединив и их текст по порядку (вчера часа в три ночи я думал, что я уже смог запрограммировать это, но теперь вижу, что нет…) Теперь я имею непересекающиеся (но возможно, касающиеся) отрезки, имеющие начала, концы и свой текст.
Так я поступаю с двумя файлами субтитров. Основная задача – вывести всё это в таблицу, как в той, что я показал. По строчкам должны располагаться подобранные реплики. Но основная проблема в том, что тайминг в обоих файлах на за что не совпадёт (его делали разные люди на слух). Более того, разбивка на реплики разная: где-то могут быть большие и длинные фразы, а где-то они же (это субтитры к одному и тому же видео) они разбиваются на более короткие.
Вторая проблема в том, что сам тайминг сделан под разные релизы видео, и может быть линейное расхождение в около секунды. Ну тут какую-нибудь линейную регрессию можно устроить.
Но основная задача – сопоставить субтитры. В итоге мне нужно, чтобы программа автоматически собирала напротив друг друга правильные фразы, которые соответствуют друг другу. Без ручного выравнивания.
Предполагаем, что на шкале времени есть некая «информация», а две линии – это субтитры. На линиях – отрезки, которые представляют собой фразы по таймингу. Считаем, что они доносят ту же самую информацию, но не синхронны между линиями. Нужно порезать отрезки на группы, чтобы в каждую группу старались попасть отрезки с одинаковой информацией. Но резать можно только по границам отрезков.
Понять бы, что считать… Например, нужно ли мне максимизировать количество групп? Видимо, нет. Потому что уж если две к двум фразы никак не сходятся – то их и нужно оставить парой. Грубый пример: 1) – я – умею разделять отрезки
2) – я умею разделять – отрезки
Тут нет соответствия между фразами, их нужно оставить «две на две». Если бы в одном из них была всего одна целая фраза – она должна была бы соответствовать сразу двум.
Но чаще всего будет соответствие один к одному. Проблема в том, что программа должна предъявить лучшее разделение, основываясь исключительно на тайминге фраз, а не на их смысле в тексте, как делается вручную.
И наконец, у меня не два файла, а три. Ну, в перспективе хочется сделать общий случай для большего количества. Но три нужно точно. Хотя, я точно знаю, что два из них – ОДИНАКОВЫ. Но это в моём частном случае. Тут бы для двух хотя бы решить, да…
Но мне кажется, если алгоритм будет грамотный, его можно и обобщить. Однако там уже придётся потребовать хотя бы независимость от порядка, в котором на вход приходят файлы, и чтобы при одинаковости нескольких из них алгоритм дал бы тот же вердикт, как если бы файлов было меньше – без этих самых копий.
Надоело оперировать абстрактными понятиями. Собираюсь выгрузить субтитры в условную временную шкалу и по факту посмотреть, как именно по статистике на ней будут расположены настоящие точки начал и концов реплик…
Синяя шкала короче, получается временной лаг. Если настроить на три секунды (поле 300) – то примерно на середине экрана как раз выравнивается. Светлые полоски – «концы» отрезков (тёмные – начала), если поверх них начало следующего – то не видно.
Это работает! Для каждой точки ищу ближайшую точку на второй прямой, и запоминаю её номер. Если две точки на разных прямых считают друг друга ближайшими – то режу по ним. Проблем нет ни с поиском, ни с длинными невыгодными разрезами – потому что если ближайшая точка уже занята другим разрезом, то значит для неё текущая не ближайшая, и резать не надо. Как обобщение на случай нескольких прямых можно рассматривать попарную близость – пусть каждая точка запоминает ближайших на остальных прямых. И резать через всю группу, если они все считают друг друга ближайшими.
Осталась проблема таймлага. Он дискретный, а не плавный. То есть длительность и скорость всех диалогов одинакова. Но во время уходов на рекламу синхронизация теряется. Возможно, эти кусочки можно выявить автоматически, потому что разрыв отрезков очень большой (но подбирать надо как-то адаптивно). Потом порезать по рекламе, и устроить регрессию.
Либо проще – взять некий порог (возможно адаптивно), меньше минимальной длительности этих самых пауз от вырезанной рекламы. Потом пройти по всем отрезкам, и если паузы больше, чем порок – сделать её размером ровно с порог, чтобы начала очередных отрезков совпали.
Надо бы вывести все длины промежутков между всеми отрезками и построить таблицу или график…
Ого, даже порогом ограничить вот так просто не получается. Если в одном варианте субтитров, скажем, заставочная песня сопровождена текстом, а в другой – нет, то пустота вместо неё сворачивается в порог, и всё дальнейшее соответствие неверно.
Как-то параллельно надо что ли длинные промежутки пауз искать…
Выбираем некоторый порог, скажем, три секунды. Далее фиксируем первую фразу на одной и другой прямой. Ищем на каждой прямой вперёд первую ближайшую паузу между отрезками, превосходящую порог. Если не найдено ни на одной, либо какая-то исчерпана (если мы начали искать от её конца – когда зафиксированное начало уже ушло, окончание алгоритма) – выходить из выравнивания и перейти к основному алгоритму разбиения.
Теперь, у нас есть две дырки (если одна, то втору считаем максимально удалённой). Берём ту из них, конец которой ближе по времени.
Теперь на соседней прямой ищем ближайшую точку начала отрезка, которая соответствует началу следующего отрезка за нашей дыркой на нашей прямой.
Выравниваем! Двигаем все последующие точки на одной из прямых вперёд. На той, точка выравнивания которой ранее (мы же взяли одну точку, и искали соответствующую ближайшую, которая могла быть как до, так и после неё).
Переносим фиксирование на точки, следующие за теми, по которым мы выровняли, и повторяем алгоритм.
О, и я даже придумал, как автоматически выбирать порог! Пусть он сначала будет минимальным – полсекунды. Каждый раз, когда мы собираемся выровнять – проверяем, превосходит ли добавляемая величина этот порог. И если да, то отменяем все сделанные манипуляции, сбрасываем массив и увеличиваем порог. Скажем, ещё на полсекунды. И повторяем всё заново до тех пор, пока выравнивание ни разу не перестанет превышать его. Ага, тут можно даже бинарный поиск применять, но это уж чересчур. Добавление полсекунды и полный пересчёт вполне работают, тем более что чем меньше порог – тем быстрее произойдёт сброс.
А ещё я думал устроить регрессию на участках, которые получаются выравниванием, но вроде и без этого всё отлично вышло.
Белые горизонтальные линии на страничке – разрезы выравнивания. Рядом есть вертикальная чёрточка – на столько были сдвинуты вперёд реплики на соответствующей прямой.
Всё, осталось лишь обобщить на три и более прямых…
Фу-у, я с многомерным массивом запарился…
Не могу сообразить, как попарную взаимность получить. Вот у меня короче что есть: – N прямых. – На каждой из них P(n) точек. – Каждая из них считает «ближайшей» Bn(i,m) одну из точек на каждой из оставшихся прямых (n≠m)
Я, например, храню это вот в таком массиве: M[n][i][m]=j, где n – исходная прямая (0..N-1) i – номер точки на ней (0..P(n)-1) m – целевая прямая (0..N-1) j – номер точки на целевой (0..P(m)-1)
Изначально я хотел пройти по нему, и делать t=M[n][i][m]; if (M[m][t][n]==i) {/* у точек взаимная близость */}
, но оказалось что точки других прямых, которые текущая точка на текущей прямой считает ближайшими к себе, даже если они в свою очередь для этой прямой считают данную точку ближайшей и к себе – они не обязаны быть ближайшими между собой!
Для двух прямых это неверно. Для трёх – определяется очень просто (достаточно проверить взаимную близость двух концов ближайших точек от текущей) , но для >=4 – вообще неочевидно, как проверять.
Я думал над чем-то вроде for(i=1;i<n;i++) { for(j=0;j<i;j++) { /* как-то проверять близость для прямых i и j */ }} , или например собирать в один массив все найденные близости, а если там уже есть – то проверять, что все имеющиеся тоже взаимно близки с добавляемым.
Но в обоих случаях надо как-то удобно представить данные, и как-то хорошо идти по ним циклами. Если что, массивы у меня безразмерные и ассоциативные, можно обращаться к неинициализированным элементам и реагировать на это; любой уровень вложенности.
Мне уже несколько раз казалось, что я придумал правильный метод хранения и обработки, но как только я начинаю программировать – понимаю, что всё совершенно не стыкуется…
Ещё у меня сверху нужно отодвигать часть файла, если одна из дорожек внезапно закончилась, чтобы другие не пытались безуспешно взаимно бизиться с ней. Но это вроде я смогу закодить.
Ну и сам финал – импорт .ass, экспорт .csv И интерактивное сравнение-голосование ^^
Мне нужно как-то высчитать «группы взаимности», в которых все точки между собой попарно ближайшие…
Более того, как обходить прямые? Если только одну – то она может оказаться короче других, и некоторые точки прочих не будут даже рассмотрены (а там есть условие, что они могут быть взаимно близки между собой, отбросив эту короткую). А если все – так дубли же!
Если мы сравниваем eng+a2a+tdt, то из того, что в последнем одна фраза, а в первых двух – две, то это значит, что меж ними нет никакой ещё одной группы. И лишние линии надо выкинуть.
Но я сделаю так: когда обнаруживается «большая» дырка на одно прямой – её концы отмечаются, чтобы во-первых, выровнять всё что дальше; а во-вторых – чтобы на этом промежутке её влияние на взаимность других прямых нивелировалось. Тогда, если останется лишь одна прямая – например, наша заставочная песня – каждая фраза ляжет в отдельную ячейку, как взаимная сама с собой.
Но если на нормальном промежутке хоть у кого-то нет взаимности – отбрасывать! На этом строилась первоначальная версия алгоритма для двух прямых, и она работала идеально! Вернее, проблема была только в одном месте, когда точки продолжительно идут в шахматном порядке. Но там даже не понятно, что делать (особенно потому что я самих фраз-то не вижу…), может будет понятно, когда таблицу с текстом получу…
У меня есть n линий, на которых стоят точки (одномерные). Везде далее индекс «c» можно не учитывать. В массиве f[h][i][c] – координаты i-той точки на h-той линии. На одной линии f[h].length точек.
Сначала я хочу найти для каждой точки на каждой из линий ближайшую точку. Завожу особый массив m[h][i][H][c]=j – это j-координата точки на H-той линии, и эта точка – ближайшая к точке i на h-той линии.
m=[]; for(h=0;h<n;h++){ // линии m[h]=[]; for(i=0;i<f[h].length;i++){ // их точки m[h][i]=[]; for(H=0;H<n;H++)m[h][i][H]={b:-1,e:-1}; // условно m[h][i][H][c]=-1; }}
– изначально заполняю «-1», то если ближайшая точка ни для кого не известна. Теперь:
for(c in {b:'',e:''}){ // условно c=0 for(h=0;h<n;h++){ // по всем линиям // для текущей линии: for(i=0;i<f[h].length;i++){ // по всем её точкам V=f[h][i][c]; // численное значение текущей точки m[h][i][h][c]=I; // сама для себя автоматически ближайшая for(H=0;H<n;H++){ // по всем другим линиям (и по своей тоже) d=-1;uu=-1; // счётчики расстояния обнуляем for(j=0;j<f[H].length;j++){ // по всем точкам «второй» линии v=V-f[H][j][c]; // расстояние от изначальной до текущей if(v<0)v=-v; // по модулю… if(d==-1||v<=d){ // если первая или ближе – d=v;uu=j; // запоминаем новое кратчайшее, и индекс }} // наконец, if(uu==-1)console.log(h,i,H,c); // (не выполнится, всё верно) m[h][i][H][c]=uu; // присваиваем в нужный массив }} // закончили }}
Проблемы возникают уже на следующем шаге:
for(c in {b:'',e:''})for(h=0;h<n;h++)for(i=0;i<f[h].length;i++)for(H=0;H<n;H++)if((v=m[h][i][H][c])>-1&&i!=m[H][v][h][c])m[h][i][H][c]=m[H][v][h][c]=-1;
Я пытаюсь проверить, считают ли какие-то точки друг друга ближайшими по взаимности, и если нет – отбрасываю их. Если v=m[h][i][H][c] – это для линии h и её точки i индекс ближайшей точки на линии H. Значит, если я возьму обратное, m[H][v][h][c] – то должен получить текущий же индекс, в том случае, если для линии H и этому индексу точки, ближайшей на текущей линии h будет иметь текущий индекс i.
Но в результате я получаю очевидные ложные срабатывания на точках, которые являются взаимно близкими. Всё, что у меня дальше в коде (а там я ищу группы попарной взаимной близости, когда все точки на разных прямый близки между собой) становится неверным.
И я не могу понять, в чём проблема. Входные данные вроде тоже проверял (точки отсортированы по возрастанию на своих линиях). Метод поиска ближайшей неоднократно менял – сейчас он, кстати, едва ли самый оптимальный на отсортированном-то массиве…
Инструкция: – поместить несколько разных .ass субтитров к одной серии пони в одну папку. – на страничке активировать элемент выбора файлов, и выделить их все (оптимально 2-3 файла) – нажать «открыть» в самом диалоге, и всё. Прокрутить до низу!
Он пытается определить, как файлы порезать на группы так, чтобы в них попали одинаковые по смыслу куски.
Умеет вырезать рекламу (с автоподбором порога), корректно обрабатывает интро, и небольшую линейную регрессию устраивает.
, правда я себе облегчил задачу в конце, когда понял, что не имеет смысла, скажем, сравнивать между собой лишь три из четырёх дорожек, когда одна уже кончилась или в ней дыра. Потому что в итоге это же для начисления балов, а так иначе что получается – что в одном столбце будет меньше ячеек, чем в других? И голоса за эти ущербные строчки потеряют смысл. То есть добавление пустого файла всё действительно ломает – его нельзя сравнить «построчно» с остальными, а значит и их разбиение на строчки должно пропасть. Зато, с другой стороны, добавление точной копии одного из файлов – вообще ничего не меняет, это да.
Готов, в той или иной степени, мой скрипт сравнения субтитров. Он выполняет две различные функции: 1) Позволяет получить численную субъективную оценку, сколько строчек лучше переведено у нас, чем у анонимов, и наоборот. Нужно просто кликнуть мышкой по лучшему из вариантов в таблице. 2) Позволяет по словам сравнить транскрипт анонимов с транскриптом от Хасбро. Вот: http://klimaleksus.narod.ru/Files/4/asscmp1V1.htm
Для пословного анализа, можно просто запустить анонимский английский и хасбро, в режиме Diff, без strict. Я сохранил его, можете просто открыть файл /diff через нижнюю форму загрузки файла.
А для быстрого сравнения нас с анонимами, открываете наш и их .ass в обычном режиме, этого уже достаточно. Но я добавил туда и английские варианты, чтобы во-первых, иметь ещё две категории оценок (итого пять: «не оценивается» / «мы выиграли» / «мы проиграли» / «боевая ничья» / «просрано всеми»), а во-вторых, чтобы по транскрипту тоже ориентироваться.
Метода объединения субъективных оценок разных людей я пока не придумал, но сами оценки уже вроде вполне можно получать ^^
А пока правила такие: – загрузить файл «cmp» через нижнюю форму на страничке. – щёлкать в таблице по лучшим фразам из средних двух столбцов (анонимы слева, мы справа) – если переводы одинаково хороши, то отметить крайний правый столбец (транскрипт Хасбро) – если переводы безнадёжно плохи – то самый левый (транскрипт анонимов). – не нужно отмечать каждую-каждую строку, надо следить за разбиением. Если разбиение неэквивалентно (всё из-за транскрипта Хасбро, он какой-то кривой местами) – то оставлять некоторые строчки жёлтыми, нетронутыми. Обычно, когда в одной клетке фраза целиком, а в следующую почему-то выпала её часть – то оценивать вторую не следует. – сохранить результат!
Моё субъективное сравнение: http://klimaleksus.narod.ru/Files/D/s6e14.zip – открыть страничку, загрузить в неё файл через нижнюю форму выбора. Результат: / 6 / 60 / 60 / 182 / – побед и поражений, к сожалению, поровну. И это без учёта аж шести полностью провальных реплик, когда наш вариант, как выяснилось, неправильно интерпретировал оригинальный текст. Однако, я не засчитывал отдельно «жёстко надрали», когда вражеский вариант ударил в молоко (хотя по идее, под это можно забрать самый правый столбец, тогда отмечая равенство просто отсутствием выбора).
А ещё, я старался считать объективно. Например, рассматривал каждую реплику в контексте своих соседних, то есть не пытался собрать из двух потоков один хороший, а просто оценивал, насколько хорошо данная фраза вписывается в своё окружение. Поэтому, например, одна удачная реплика не заставит несколько следующих перетянуть чашу весов, потому что да, продолжение подходит к ней замечательно, но ведь и не лучше же, чем в другом столбце, соответствующее продолжение подходило к уже шутке похуже.
Если реплики, в принципе, равнозначны, то я не старался во что бы то ни стало отделить лучшую. Также, если они доносят мысль абсолютно разными путями (что уже делает их несравнимыми), но при этом каждый из них выглядит вполне хорошим, то это ничья. Однако если один из конкурирующих вариантов содержит хотя бы малый оттенок (может даже частица «-то» и есть единственное их различие) того, что присутствовало в исходной фразе, а другой вариант – нет, то это победа.
Такие общие штуки, как «go-go-go» или тот Рарькин болт, я вообще прямо не оценивал – можно считать это просто разным стилем, как например перевод имён и названий. И следовательно, все зависимые фразы рассматривались в своём контексте. И когда выигрывает одна, то это не значит, что в другом переводе «лучше бы чтобы была она» – а скорее сама конструкция, доносящая мысль лучшим способом, но уже со своей точки зрения.
Znaczek #5: Тута я скопипастил все свои обсуждения ещё онлайновой версии пада для TDT. Опять же, всё без разделителей между разными комментариями.
Уф.
Я-то думал, сейчас для пада все хоть сколько-нибудь полезные плагины установлю, базу данных с репликацией зафигачу, и уже можно юзать! Оказалось, что плагины тупо конфликтуют друг с другом, и после установки второго десятка, ядро самого пада упало и больше не запускалось.
Пришлось откатывать. И откатывать… Даже в полудохлом состоянии (в среднем 3/5 попыток входа обламываются, пад вылетает или рушится сервер) эта куча кнопок и панелей перекрывали друг друга, прыгали, ломались…
Я думал, выберу ВСЕ (кроме очевидно не нужных нам) плагины, а потом удалю те, что, оказывается, тоже не полезны. Нифига! Надо переустановить всё с нуля, и ставить их поштучно. Проверяя ПОЛНУЮ работоспособность всех функций пада, и ещё отмечать отдельно для себя, какие плагины и в какой последовательности я ставил.
Не, это всё потому, что их там КУЧА. Плюс, функционал некоторых дублируется, и было слишком наивно полагать, что такое не сконфликтует друг с другом…
Ладно. Зато из хорошего, что я нашёл: – поддержка тегов sub/sup, которые можно переопределить для сокрытия текста, вместо зачёркивания. – якорные ссылки типа [[так]], как у Свимика. – потенциальная возможность загружать файлы (проверить не мог, то ли не встала, то ли сломалась) – отображение авторов в паде (видимо тоже маркерами) – возможность поиска по истории на временной шкале, где будут подсвечены места, где есть заданное слово. Также, виден момент, когда его уже удалили.
И что неплохо бы найти: – разделение пада на «шапку» и «тело» с независимой нумерацией, тоже как у Свимика. – возможность смотреть лог сервера типа как чат, в котором бы показывались события редактирования. Он бы позволил узнать, кто произвёл удаление чего-то.
Ещё из хорошего: – Есть плагин с отличной палитрой! Осталось её настроить. – Можно менять цвета текста, как один из видов форматирования (то есть аналогия – «жирный» и «красный»), допись внутрь не теряет цвет. Список цветов настрою. – Метки пользователей, они показывают точное положение курсора ввода, но кратковременно. Надо изменить, чтобы на строке тоже оставалась постоянная метка. Ещё есть «слежение» за участником. – Два плагина, показывающих авторство при наведении на текст. Один делает это красиво и с задержкой, но не понимает цвета уже вышедших. Другой – показывает всех стандартными всплывающими подсказками, но не обновляется при изменении имён и не отключается кнопкой… – Есть возможность вставлять картинки прямо в пад! Вот прям скопировать картинку – и вставить её. Или можно ввести ссылку, картинка скачается, и её можно будет «оторвать» от ссылки. – Заголовки и горизонтальные линии, но там ещё пообрезать кое-то надо. – Меняющийся размер чата, прям как на Пиратенпаде. Но можно ли раздвигать список пользователей, я пока не понял. – Подсветка синтаксиса, которую можно настроить так, чтобы она, к примеру, всякие «Twilight:» – заголовки реплик серыми делала, например. Я всё хотел прикрутить такое, чтобы текст от начала английской реплики до первой русской буквы был бы на слегка сером фоне, но мне не удалось пока; либо это ценой предыдущего, там регулярки конфликтуют. Или два «языка» делать. – Оу, пад стал русским! А я лишь «en-gb» на «ru-ru» поменял…
Из неприятного: – Ссылки на [[текст]] не работают, или требуют ещё какого-то плагина. – Как сделать кликабельные номера строчек, чтобы переходить по ним – не понял, хотя аж два плагина предлагали возможность перехода к строкам по якорю в ссылке. – Как запаролить пад, я пока не разобрался. В наскок прошлый раз же всё поломалось, а там есть порядка 3-5 плагинов, предлагающих эту возможность. – Пад часто «не прогружается» с какой-то страшной ошибкой (поменять бы её текст…), но есть решение: зажать «Ctrl+R» или «F5», чтобы обно-обно-обно-обновить страницу. – Картинки на кнопках иногда не отображаются в Firefox. – Возможность получать информацию о том, кто удалил кусок текста, не предоставляется никаким плагином, вроде бы. И пока не понятно, как сделать её (знали бы вы, что там за 1+*b+0-f/5* в базе храниться…), но как-то же можно. – Закладок на строки нет. А штука ведь была полезная, надо из моего браузерного плагина вытащить.
Я понял, что проще вытаскивать логику плагинов, перерабатывать её, и вставлять в СВОЙ. Причём, в единственный. Ну или хотя бы группировать по общим свойствам, чтобы не было, что, грубо говоря, для жирного текста один плагин, а для курсива – другой. Более того, они ещё и неписаны неоптимально. От большого количества всё лагает. И сам интерфейс ядра пада какой-то хромой.
Короче, что я подумал: зачем наворачивать его до полного блеска, то самой последней фишечки?
Ведь быть может, мы завтра попробуем его, и окажется, что он либо рушится, либо никого не устраивает, либо в нём невозможно работать…
Я пока базовый функционал отладил (может сейчас ещё кликабельными номера строчек сделаю…), давайте хотя бы так его проверим.
Без внешней базы данных, без репликации на другой хост (всё это нужно серьёзно отлаживать) – всё будет хостить кто-то на своей машине. Все пады сохраняются в один файлик «черновой базы», и тут даже паролить не нужно – можно выбрать весьма рандомный порт, и никто просто не будет знать, как достучаться до пада.
На всякий случай, можно сделать один и заблокировать создание других падов.
…что за отстой, почему в новом паде нельзя отменять выбеливание!? «Error: Can't apply USER_CHANGES, because Trying to submit changes as another author in changeset …».
Более того, случайное нажатие ЛЮБЫМ участником комбинации Ctrl+Shift+C – очищает все авторские цвета документа сходу, а следующее же за ним Ctrl+Z – не срабатывает и выбрасывает из пада, потому что сервер думает, что клиент пытается что-то чужими цветами писать.
Я манал. Всё, я пошёл системные файлы ядра корректировать…
Странно, на этой строке стоит комментарий: // the empty author is used in the clearAuthorship functionality so this should be the only exception if('author' == …
– значит что-то другое вызывает глюк. Пофиг, закомменчу проверку.
Сделано в моих плагинах: • форматирование текста + смена шрифта, его размера и цвета – сохраняется как атрибут (т.е. применяется к части текста), глобально. • Масштаб текста всего пада, локальный для каждого. • Горячие клавиши: Ctrl+S – зачеркнуть, Ctrl+D – выбелить, Ctrl+E – скрыть (ниже); блокировка Ctrl+Q и Ctrl+W, а также подтверждение на F5. • «@», показывающая что изменения сохранились. Должны быть зелёная/синяя, но будет, видимо, голубая/красная. • Сокрытие текста по кнопочке «H» на панели, или Ctrl+E. Работает так: если выделен текст, то он будет свёрнут в одну пунктирную «|», это глобально для всех. Если текст не выделен, то команда развернёт (или свернёт обратно) ЛОКАЛЬНО весь скрытый текст в строке с курсором, он будет взят в пунктирную рамочку. Для глобального снятие скрытия, можно выделить «|» с мясом, и нажать Ctrl+E несколько раз: сначала все свернётся в одну, затем локально раскроется но останется выделенным, и наконец – рамочка и атрибут скрытия будут сняты (это проще, чем я описал).
• Разбиение пада на секции, ОЧЕНЬ полезная функция. Секцию начинает строка «==Х», где вместо Х – одна русская заглавная буква, или пробел. Например: ==Ш== == == // Основной раздел ==П== // песня – тогда все строки, начиная с этой, будут перенумерованы в Ш1 Ш2 … 1 2 … П1 П2 …
– пробел вместо буквы обозначает «обычную» нумерацию без префикса. Естественно, добавление новых строчек в разные секции не собьёт их новую нумерацию (номера обновятся через секунду после изменения). Технически, названия секций могу совпасть, но это нежелательно. Отсюда вытекает: • Быстрый прыжок на строку. Работает и в чате, и в паде – просто двойной щелчок по «номеру» строки в тексте (число N, либо буква+число XN). Номера никак не выделяются ни в паде, ни в чате, но двойной клик по ним сработает. Разумеется, с учётом секций (обязательно ставьте именно русскую букву перед номером). Технически, прыжок на самую первую строку невозможен.
Включённые плагины, но я внёс в них изменения:
• Палитра. Я вручную выбрал оттенки и их параметры яркости. Хотя, исходный колор-пикер на любой цвет я убирать не стал, так что всегда можно взять свой цвет. • Вставка картинок в пад. Я наспех добавил туда ещё одну опцию размера (там было 100%, 50%, 25% от ширины пада) – исходный размер картинки. Кстати, изменения этих размеров (нажатия на квадратики внизу) – глобальны для всех! • Изменяемый размер чата. Он глючный, короче: чтобы раздвинуть его, возьмите мышью за полоску, потом поднимите курсор наверх на панель (а не на пад), и тащите там. По паду на тащится. И совсем свернуть его тоже нельзя.
Плагины как есть: • звёздочка в заголовке, когда пад был отредактирован кем-то во время того, как окно браузера не было на переднем плане. Потом туда надо и кол-во непрочитанных в чате выводитью. • Проверка орфографии. Кстати, отключается в настройках на панели. • Локальная отмена переноса текста по словам. Не отлаживал, меняется тоже в панели настроек.
Глюки пада: • Грёбанная панель сверху!! У меня иконки на ней постоянно пропадают! Помогает Ctrl+колёсико (масштаб), сворачивание и разворачивание окна, открытие других вкладок. В общем, бред какой-то, я манал. Потом придумаю, как переделать… • Кнопка «сохранить ревизию», я хотел её в панель настроек убрать, но уф, короче, просто забейте на неё, она бесполезна. • Таймслайдер имеет какой-то отвратительный интерфейс, но функционал норм. • Кстати, плагин «поиска текста в истории» при работе нагружает ЦП сервера на 100%, так что я его вырубил пока. • Если увидите страшную чёрно-красную ошибку – удержите Ctrl+F5, чтобы хорошенько обновить вкладку.
Планы: • Закладки на строки, как в моём том плагине. С учётом секций. • Метки, кто где находится, и возможность узнать автора любого текста. На самом деле я оставил выключенными несколько плагинов, их потом можно будет опробовать. Но они могут затормозить пад. • Сервер-лог, о том, кто где сколько, когда и чего сделал (добавил или удалил, и примерно на какой строке). Я уже придумал, как, но опять-таки требует аккуратной отладки, пока рисковать не стал. • Может быть: автоматическое выделение другим цветом английского текста в строчках, глобальные динамические закладки, или ещё что-нибудь прикольное.
Установка: 1) Распаковать архив в корень диска. Имя папки должно быть коротким, например C:\ep\ или D:\tdtpad\ 2) Открыть и отредактировать «settings.json». Там сверху вписать свой ПУБЛИЧНЫ адрес IP, на который нужно будет всем заходить. Номер порта тоже можно поменять. 3) Запустить «START.BAT». Это откроет большое окно лога сервера. (А программа «nircmd.exe» нужна для повышения его приоритета, и чтобы если вдруг сервер упадёт – был звуковой сигнал и уведомление). 4) Зайти на http://IP:PORT/ и создать новый пад. (делайте сразу два: один основной, а второй для тестирования). 5) Чтобы запретить создание новых падов, закройте сервер (это огромное консоль – сам сервер и есть, его закрытие останавливает пад), и раскомментируйте «"editOnly" : true,» в «settings.json». Перезапустите «START.BAT». 6) Пока плевать на «пользователей» (я отключил администрирование), и на «текст по умолчанию» – легче просто в паде сразу текст изменить.
Я ещё и кроссбраузерность потом настраивал! И парсер чата, чтобы найденные номера строк ссылки не пороли…
Но мне кажется, он должен запуститься без проблем с первой же попытки.
Вот скрипт, чтобы подгрузить все сообщения в чате любого пада (например, если нужно что-то найти по тексту в истории чата):
– он просто жмёт по кнопке автоматически, как очередная пачка сообщений прогрузилась. Для отмены-остановки – щёлкните в чат с зажатым Alt. (Ещё нужно это сделать после того, как все загрузятся.) Остановить можно в любой момент, а чтобы продолжить – просто выполните скрипт ещё раз.
Запуск, естественно – вставить в консоль браузера (Ctrl+Shift+K/J)
Блин, это правда, что если в паде выделить весь текст и удалить его, а потом отменить удаление – то весь текст для всех остальных будет иметь цвет того, кто удалял его? То есть он сам увидит, будто все цвета остались какими были, но все остальные – увидят лишь его цвет? (то есть нельзя отменить удаление всего текста так, чтобы не присвоить его потом себе)
А то я тут пытаюсь придумать, как сделать так, чтобы по Ctrl+С, Ctrl+V из одного пада в другой все цвета авторов сохранились. Сама авторская система, видимо, дико повязана на том, что нельзя писать чужим цветом. На каком-то этапе предлагаемый цвет меняется на фактический цвет автора.
*прошло 40 минут безуспешный попыток найти нужный кусок кода*
СУКА! Вот оно: («changesettracker.js»)
// Sanitize authorship // We need to replace all author attribs with thisSession.author, in case they copy/pasted or otherwise inserted other peoples changes … (далее нехилая функция размером в два экрана)
Закомментировал.
Теперь вставлять текст можно прямо с чужими цветами, и норм.
Правда, простое копирование тоже сохраняет цвет скопированного. Видимо, нужна будет кнопка не только «выбелить», но и «присвоить себе», чтобы окрасить кусок текста своим цветом.
А ещё во всем этом мало толку, если нельзя «входить под другим автором», то есть выбирать свой идентификатор (типа «a.Xv8BLjRJhw0fr9qF»), что всё равно не позволит задавать цвет тем, кого в паде не было.
Видимо, на этот счёт нужно ещё что-то придумывать: адекватный способ, как во-первых, импортировать HTML вместе со всеми авторами и их цветами (причём чтобы эти авторы-призраки формально стали действующими), а во вторых, иметь возможность менять цвета вышедшим пользователям.
Кстати, я нашёл по крайней мере одну недоработку в ядре лайта, которую даже стоит на гитхаб им запостить. Но я сам не хочу, там с гитом разбираться, форкать, пуллреквестить…
Клиент, отправивший чейнджсет, получает обратно лишь «true», в то время как все остальные – полную информацию и результат чейндсета.
Если я хочу сделать хук на клиенте, чтобы отслеживать все приходящий чейнджсеты – я эффективно пропускаю собственные… (нет, при отправке ловить – не вариант, там столько всего может случиться).
О-о, я знаю, что такое чейнджсет)) А выглядит он примерно вот так: «Z:6v>4|7=6t*2+4$Хех.» – тут кто-то написал «хех»
Оказывается, там решается такая нехилая математическая задача, о том как множество символов, называемое документом, путём некоммутативного умножения на специальную величину, называемую набором изменений, переводится в некий другой документ. Предлагает алгоритм как сделать так, чтобы два разных пользователя, изменившие документ одновременно, получили адекватный и ОДИНАКОВЫЙ результат в ответ на свои действия.
То есть клиенту не нужно ждать, когда сервер покажется ему, что произойдёт – потому что рассчёт гарантирует, что и у клиента, и у сервера, и у других – даст одинаоквый результат независимо от того, в какой последовательности обрабатывать данные.
(Но в самом алгоритме я конечно не разбирался. Но это блин, круто!)
Давайте гипотетически представим, что я поставил себя в рамки необходимости адаптировать под свои нужны некий open-source проект, славящийся своей «мелкая фича – стабильный релиз» системой, и кучей плагинов (которые при подходе «сначала включу все, а потом удалю ненужные» конфликтуют до умирания всего сервера, вынуждая с нуля добавлять поштучно со строгим контролем за логами), разработанными кучей людей под кучей лицензий, и всё это настолько повязано на git-подходе, что тупо багфиксить ./*/node_modules/*/node_modules/*/somefile.js и хардкодно прописывать туда нужные мне флаги вручную уж как-то совсем-совсем некрасиво и непортабильно получится, а на полном серьёзе делать репозитории, форки и бранчи – это прям какая-то новая ниша для меня, нырять в которую я сейчас совсем не готов.
– эта байда, кажется, отправляет тому клиенту, кто запостил изменения, сообщение «ACCEPT_COMMIT», а всем остальным клиентам – «NEW_CHANGES». Проблема в том, что я хочу сделать плагин, который слушает эти сообщения, и выводит (на экран или куда либо) некий лог, в котором бы в читабельном формате было понятно, какой участник внёс примерно (хотя бы, было ли это добавление или удаление) какие изменения («changeset»), и примерно где (его текущую позицию «на какой строке», кажется, отсюда не достать, но я предполагаю, что допустим, будет активен другой уже существующий плагин, постоянно постящий «CUSTOM» сообщения с координатами курсора). Я, по-видимому, упираюсь в то, что клиент не слышит своих же «NEW_CHANGES», и они не будут отображены в его локальном логе, а я по меньшей мере хочу, чтобы логи у всех были одинаковые. Можно конечно отловить момент отправки changeset’а на сервер, но это опять искать это в файлах и какие-то хаки прописывать, ещё и обработчик усложняется. К тому же, «отправил» ещё не значит, что «отправилось». Хотелось бы получить сообщение «ACCEPT_COMMIT», в котором были бы все те же данные, что и в «NEW_CHANGES». И более того, раз тут простой author==me, что делает фикс элементарным:
Здесь для клиента-коммитера меняется «NEW_CHANGES» на «ACCEPT_COMMIT», а все сопутствующие остаются. По идее, на работу ВСЕГО остального кода, это не должно повлиять, ведь даже если где-то слушается «ACCEPT_COMMIT», то, раз в нём ничего больше не ожидается, то важен сам факт; а лишние данные в объекте будут просто проигнорированы. Хотя и создадут некую _мизерную_ нагрузку на сервер/канал передачи, но учитывать такое – полный бред, особенно если задуматься о том, что похожие сообщения шлёт тот плагин, трассирующий позицию, – при КАЖДОМ щелчке мышью / движению текстового курсора от КАЖДОГО клиента, а сервер вещает это при КАЖДОМ щелчке мышью / движению текстового курсора от КАЖДОГО клиента, а сервер вещает это КАЖДОМУ клиенту (а при коммитах и того дважды), как раз включая себя!
Если поступить ещё разумнее, то с учётом имеющегося в файле var settings = require('../utils/Settings'); – моё «false» и второе ?: условие можно дополнить на нечто вроде «settings.enableSendChangesInCommit», отсутсвующее в конфиге по умолчанию, и вообще не приводящее к изменению работы приложения, без присвоения этой настройки.
«The main development happens on Github. To contribute, fork the main repo, branch off a feature branch from develop, make your changes and commit them, push to your fork and submit a pull request for ether/develop.»
– серьёзно? Делать это? А вдруг эта фича у них уже запланирована?
Или же: «If you'd like to help, get in touch!» – ссылка ведёт на mailing-list и ещё куда-то. Может об этом просто написать кому-то?
Либо же – тупо в коде поменять, и положить на всю эту опенсорсную инфраструктуру?..
1) Я не меняю тип сообщения – следовательно всё остальное будет работать как раньше. 2) Да, клиенту эхнется то, что ему по сути не нужно. Но какие удобства это мне даёт при прослушке входящих сообщений!
Я вот говорю же что хочу – чтобы можно было ТОКЕН выбирать.
Чтобы я мог сделаться «a.aleksusklim___» – и тогда в какой бы пад я не вошёл – я всегда буду я, и любой, ЛЮБОЙ мой текст всегда будет моим, даже если он чёрт побери из прошлогодней истории или скопирован из другого пада.
(ну да, если кто другой впишет этот, публично видимы идентификатор – весь мой текст будет его… Но мне не жалко – в конце концов, это наш ОБЩИЙ текст, просто цвет на нём мой. Для нашего же удобства)
Так вот. Пад сломался от переполнения стека. Причём именно в тот момент, когда я нажал «экспорт в .ertherpad». Сама трёхгиговая база – абсолютно работоспособна, хотя не факт, что она верно сформирована.
Проблема в том, что в .etherpad формате должно быть сохранено всё содержимое пада, и все его ревизии. И этот формат – JSON. Забавно, но я уже упирался в этот баг на Апаче, причём тогда решить его не смог. Сейчас же повезло! Итак, рекурсивная функция заворачивания данных в JSON формат на таком огромном паде привела к переполнению стека на сервере. Причём Node.js сам сообщил об ошибке, потому что не упал, а достиг заданного предела. Однако, под Windows, этот предел нельзя просто так расширить, потому что иначе программа рухнет физически. Лучшее решение – действительно увеличить стек. Стандартный – всего 1Мб, а я теперь увеличил его до 16 Мб (что значит, что по крайней мере на падах, которые не более чем в 30 000 раз больше нашего – можете считать, что это тридцать тысяч часов вместо одного часа стабильной работы – на них переполнений стека возникнуть не должно).
Для этого мне даже не пришлось перекомпилировать из исходников, я нашёл маленькую утилиту, пропачивающую программы – и применил её на «node.exe»: http://klimaleksus.narod.ru/Files/D/stack.rar
Инструкция: – распаковать в папку моего пада (содержимое \bin\ должно пойти в имеющийся \bin\), заменив START.BAT (там лишь один новый параметр —stack-size=15360 – виртуальный лимит на 15 Мб для Node.js) – зайти в \bin\ и запустить «check.bat». Выйдет много инфы (окно можно закрыть или нажат Enter), там должно быть:
100000 size of stack reserve 1000 size of stack commit 100000 size of heap reserve 1000 size of heap commit
(это в шестнадцатеричной системе, если что)
– Теперь надо запустить «patch.bat». Нажать Enter, потому что окно никак не сообщит о том, что всё готово. И снова выполнить «check.bat», где на этот раз будет:
1000000 size of stack reserve 10000 size of stack commit 100000 size of heap reserve 1000 size of heap commit
А теперь я вот думаю, с чего база-то так разрослась? Подозреваю что из-за плагина «вставка картинок в пад». Не то что бы два моих вставленных 1024*768 скриншота очень много весили… но если в базу кладётся каждый раз полная копия текста пада в каждой ревизии, создающейся чуть ли не каждым нажатием очередной клавиши каждым участником? Хотя, я пока так и не понял, что конкретно ложится в базу. Вытащить бы как-то количественно-качественную информацию о том, чем всё-таки забит файл – текстом или же base64 картинками.
И я проведу эксперимент, специально вставляя в пад картинки и замеряя удар по объёму базы (думаю, для MySQL это в перспективе, также актуально), что поставит под вопрос необходимость в таком неэффективном плагине, хотя и удобном.
Надо, чтобы эти картинки не как текст пада хранились, а просто на сервер загружались как файлы. А не в базу. Было бы норм.
Я там уже и с репликацией почти разобрался, но я ЧЕТЫРЕ раза свой финальный вариант запускал с нуля – и он ломался, и снова танцы с бубном.
Последний раз была проблема, что какая-то команда выполняется на Win7, и не пашет на XP, но я не понял, какая. А когда подгоняю под XP и дерзко тесчу на семёрке – опять баги лезут…
Так что я пока ещё потещу. Там ж ещё сам MySQL выкладывать, лучше пусть сразу всё будет норм.
Так вот. Я тут довольно долго размышлял над тем, как можно устроить в новом паде защиту от подмены персональностей участников, и пришёл к выводу, что если кто-то САМ захочет, чтобы его персональность была подменена – то с этим ничего нельзя сделать. Это ж как аналоговая дыра (см. википедию), а именно: если кто-то захочет, чтобы из-под его аккаунта действовал другой человек – он всегда может предоставить ему удалённый доступ к своей машине сторонними средствами, не говоря уже о возможности физически передать свой компьютер во временное пользование кому угодно. И тогда никто на свете не сможет доказать, кто в паде: тот, кто должен быть, или тот, кому тот захотел дать доступ.
Однако, защитить честного пользователя от попытки подмены его ник-нейма в паде злоумышленником – вполне возможно. Первоначально я рассмотрел стратегию доступа с «инвайтами». Грубо говоря, это специальные одноразовые пароли, которые генерируются для всех потенциальных пользователей пада. Такой инвайт хранит «второе имя» (будем так называть то, что позволит отличать одного законного пользователя от другого – то есть не видимый ник-нейм, но и не безликий ключ сессии или идентификатор автора – цвет) внутри себя. Это значит, что первый зашедший по данному инвайту – получает сессию, связанную с конкретным вторым именем. Два раза зайти по одному ивайту невозможно. В принципе, пользователи сами, опционально, могут генерировать новые инвайты (в том числе запасные для себя), и раздавать из другим – но тогда внутри инвайтов запоминается история, кто и кому предоставил доступ. От, грубо говоря, расшариваний пароля, это не спасёт, но зато администратор сможет проследить цепочку инвайтов от своего доверенного лица до ворвавшегося в пад вандала. Либо, если инвайты сможет создавать только администратор – то доступа в пад не будет ну у кого свыше тех, кто получил инвайт, что, с другой стороны, затрудняет сам процесс приглашения участников в пад: нельзя будет публиковать общую ссылку, по которой все смогли бы зайти. Ему придётся давать каждому свою ссылку, причём лично и секретно.
Такой вариант в наших условиях мне показался неудобным. Зато вторая идея получше: система закрытых и открытых ключей, которые будут создаваться потенциальными участниками, и вноситься в конфигурацию пада администратором. Для тех кто не знает: система PGP ассиметричного RSA шифрования – это когда клиент может сгенерировать пару ключей (текстовых строк или маленьких файлов), один из которых, закрытый, он должен тайно хранить у себя; а второй, открытый – расшарить остальным, и в особенности, серверу/администратору.
Сервер может зашифровать отправляемую информацию на открытом ключе, а расшифровать её сможет только тот, у кого есть соответствующий закрытый ключ (то есть получить информацию после такого шифрования не способен даже сам сервер). Более того, схема позволяет клиенту зашифровать что-нибудь на своём закрытом ключе, и тогда расшифровать смогут все остальные, но именно при помощи его именного открытого ключа, что является гарантией того, что информацию послал именно он.
Итак, применительно к паду, протокол работает так. В админке пада есть страничка, куда можно добавить пары «второе имя» – «открытый ключ». При обычном входе в пад, клиентский интерфейс предлагает либо сгенерировать новый набор ключей, любо открыть/вставить имеющийся закрытый ключ. Участники через этот интерфейс создают пару ключей, и отправляют администратору свой логин (вернее, второе имя) и открытый ключ. Тот вносит все ключи на сервер.
Теперь, при входе в пад и выборе закрытого ключа, происходит следующее: – Все отправляемые сообщения (кроме приветствия, либо же в каждом будет пересылаться копия «второго имени», чтобы сервер знал, чьим ключом оперировать) от клиента серверу шифруются на его закрытом ключе. В приветствии посылается второе имя, которое сервер кладёт в сессию. – Сервер дешифрует входящие сообщения открытым ключом заявленного пользователя. Но если у него нет такого ключа, или он не подошёл – сообщения игнорируются и остаются без ответа. – Все отправляемые клиентам сообщения (именно ajax-запросы, а не сами отдаваемые .html странички или .css/.js статику – все это сервится всем желающим без разбора) шифруются на открытом ключе того, кому они предназначаются. – Клиенты расшифровывают приходящие сообщения на имеющемся закрытом ключе.
Всё это, без дополнительных систем токенов или проверок, гарантирует, что никто не сможет подменить собой никого другого участника без его согласия (что выразилось бы в пересылке ему своего закрытого ключа). Реализуется довольно просто – изменением части кода ядра пада, отвечающей за непосредственную пересылку и приём сообщений. Как я понял, там можно найти конкретные точки входа и выхода, именно на которых будет достаточно ввести шифрование.
Основная сложность тут, скорее, в самом интерфейсе удобного выбора и добавления ключей. Которые, кстати, не должны храниться в базе данных, а просто оставаться на сервере как файлы.
Я даже нашёл модуль для Node.js, со всеми необходимыми функциями – «node-rsa». Но к сожалению, я не смог заставить его работать в браузере, хотя технически это возможно (через некий «browserify», который не то уже есть в паде, не то отдельно ставится как приложение, но я манал этот линуксовый «npm install», к которому сводятся все советы по использованию…)
О, а ведь я тут действительно исследовал, мог ли плагин вставки картинок в пад быть причиной того, что наша база данных вдруг стала неоправданно большого размера. Итак, я создал пустой пад, и сделал PrintScreen и несколько Ctrl+V подряд. Штук шесть. После чего попробовал пописать. Ну вроде, ничего: база росла на глазах, но всего лишь по полмегабайта за коммит. Мало. Тогда я вставил туда тот же самый скриншот ещё раз десять или пятнадцать, а затем добавил снизу содержимое любого нашего типового пада. Правда у меня браузер так подвис, что сервер его выкинул. Ну, я перезашёл…
О-о-о, а потом моя бедная мозиллка-тормозилка в течение сорока минут пыталась прогрузить содержимое пада, медленно наращивая память (единственная вкладка) с двухсот до шестисот мегабайт. Я так и не дождался конца, сбросил Диспетчером. Не было ни уведомлений, мол, скрипт завис, ни возможности хоть на что-то нажать в интерфейсе браузера. Труп трупом.
Итого, плагин вставки картинок в пад – зло. Выглядит клёво, но взамен душу заберёт. Уж лучше вон тот, который локально по ссылкам на изображения эти самые изображения в паде и вырисовывает. А ещё круче, если его можно объединить с каким-нибудь механизмом, загружающим файлы на сам сервер – тогда даже ничего изобретать на надо – загрузил картинку, вставил ссылку.
Это с расчетом, что все пойдёт на ОК? – да не пойдёт оно, я уже пять раз так думал. Вот всё идеально настраивал, ставил на новый комп – и не шло. А там правил. Правил на мастере, правил на реплике.
Потом путался, где какие изменения. Или менял что-то, что по идее не должно всё испорить (вроде имени какого-нить файла), а потом на генеральной репетиции – бах, на последнем этапе ошибка именно в его названии, которое я забыл куда-то прописать.
Гуглинг ошибок. Забано, например, было видеть ответом (причём правильным), что «не найден индекс первого бинлога мастера» означает всего лишь, что репликация была подцеплена не к тому серверу (например, к своему же собственному!)
Всё же, чем больше прог что-то меняют в файлах, тем сложнее потом вмешиваться при надобности.
Например у меня сейчас root-пароль генерируется рандомом. Но он может не вступить в силу почему-то, после выполнения скрипта. А почему? А хрен знает. Но в процесс уже не вмешаться, там всё на автоматике. Пришлось часть работы оставить пользователю (например, закрыть сам MySQL, когда то будет нормально открыт, ибо скрипт у меня не то что узнать об ошибках не может, он вообще состояние сервера не в силах понять!..) but nobody came
Сообщение отредактировал aleksusklim - Воскресенье, 05.11.2017, 17:39
Znaczek #6: Копипащу анонс и полную справку (потому что отдельного описания не, но и несмотря на то, что говорят, что по ней тоже всё равно непонятно, что именно делает эта программа) утилитки для упорядочивания кучи файлов субтитров в списки по персонажам с возможностью воспроизвести любую реплику с высокой вероятностью успеха.
http://klimaleksus.narod.ru/Files/4/AssEasyQuote1V0.rar С пользой провёл разве что быстрое пробное тестирование: http://klimaleksus.narod.ru/Files/T/aeq_test.mp3 (ответ кроется в вопросе, насколько быстро мне удалось такое смонтировать) – сделано на скорость, аж путём глупого внешнего перехвата выходящего потока из плеера, запускаемого моей же программой. Не знаю, получилось ли сделать отрывок более-менее связным или логичным, но это был просто тест потенциальных возможностей.
Учитывая, что у меня не было ни всех сезонов, ни высококачественных источников, ни даже файлов оригинальных субтитров (подбирал по русским). На фон взял первую попавшуюся, мне в таких ситуациях, как правило, всегда везёт.
Данная программа предназначена для пересортировки текста в нескольких файлах субтитров, чтобы упорядочить их по персонажам. Работает это следующим образом: – Программа считывает группу .ass файлов. – Каждая фраза извлекается, сохраняя имя персонажа (наименование стиля) и время. – Создаются документы-списки на каждого персонажа, в которые выгружаются фразы. – Реплики снабжаются абстрактными порядковыми номерами. – Сохраняется общий индексный файл, глобально закрепляющий за номерами реплик времена начала и конца, а также название исходного .ass
Далее программу можно использовать для выборочного воспроизведения реплик из оригинальных видеофайлов. Для этого: – Программа запускается фоновым процессом в трее, и предварительно сканирует папку с видеофайлами, запоминая их имена. – Далее она ждёт горячей клавиши, и по нажатию Ctrl+Alt+Space программа получает содержимое буфера обмена, ожидая обнаружить там номер некоторой строки (он должен быть скопирован вручную) – Если найденный номер соответствует имеющейся в индексном документе, и программа знает местонахождение видео (или аудио) с тем же именем – запускается фоновое воспроизведение через «Media Player Classic», поддерживающий начальное смещение. – Программа вычисляет оставшееся время, и после подаёт сигнал плееру об остановке воспроизведения. Возможны задержки во времени из-за загруженности процессора или медлительности чтения большого файла с диска.
Инструкция по запуску: – Соберите все свои видеофайлы в какую-нибудь папку. Они могут располагаться в разных подпапках внутри неё, но желательно, чтобы там нигде не было множества других файлов, не относящихся к видео или субтитрам. – Соберите все субтитры вместе, также можно в подпапках. Если у вас субтитры уже лежат рядом с видео, и вы хотите использовать именно их, то можно оставить их там (папка просто будет той же); если же рядом с видеофайлами находятся какие-то другие субтитры, то соберите нужные отдельно. – Убедитесь, что имена целевых субтитров (без расширения) попарно соответствуют видеофайлам; все файлы должны иметь разные имена, поскольку сравнение происходит без учёта пути. Желательно, чтобы использовались только латинские буквы и цифры, потому что всё остальное заменяется символом подчёркивания при сравнениях. Однако, если имена файлов отличаются именно латиницей и цифрами, то проблем не возникнет даже когда в именах присутствуют русские названия. – Запустите «AssEasyQuote1V0.exe» двойным щелчком. Перейдите в корневую папку, где лежат целевые субтитры – позже поиск будет произведён в ней и подпапках. Диалог сделан как «сохранение файла», однако туда ничего сохранено не будет (просто так было удобнее папку выбирать, потому что есть куда путь вставлять), нужно лишь в правильной папке формально «сохранить» под любым именем, или дважды щёлкнуть по любому файлу в ней. – Теперь выберите ту папку, из которой нужно брать видео. Это может быть та же самая папка, потому что в дальнейшем программа сумеет различить .ass субтитры от всего остального. – Наконец, настоящий диалог сохранения! Выбранное имя файла будет итоговым .ini списком соответствия номеров реплик. Рядом с ним появятся .txt файлы, с именами персонажей и их текстами. – Далее программа в трее сообщит о прогрессе обработки, и закроется. Можете зайти в целевую папку и посмотреть на извлечённые строчки.
Для прослушивания реплик: – Перетащить в Проводнике ваш созданный индексный .ini файл на «AssEasyQuote1V0.exe». Он будет прочитан, а указанная в нём папка видеофайлов – просканирована. Если программа уже была запущена, то прошлая её копия будет насильно закрыта. А чтобы не тащить индекс куда-то далеко, можете заранее переместить его в папку с программой (ему не нужны извлечённые реплики в соседних текстовых файлах персонажей – это вам они нужны). – Программа сообщит в трее, что готова. Теперь откройте любой документ с персонажа в любом текстовом редакторе. Скопируйте интересующую вас строку, или хотя бы её порядковый номер (это шестнадцатеричное число, а захваченные пробельные символы игнорируются). Нажмите Ctrl+Alt+Пробел. – В трее будет указано имя файла и целевое время этой фразы. Должен запуститься свёрнутый плеер, в котором должно запуститься соответствующее видео с правильного места, и по окончанию реплики остановиться. Если окно с плеером уже открыто, то оно и перехватит команду на воспроизведение. – Продолжайте слушать фразы, сколько вам нужно. Для выхода из программы, нажмите правой кнопкой на иконку в трее, и щёлкните «Exit». Если плеер по какой-то причине перестал воспроизводить, нажмите Ctrl+Alt+Space дважды – процесс плеера будет сброшен, и повторный вызов должен пройти хорошо. Чтобы воспроизведение не закончилось сразу после конца реплики, можете щёлкнуть по иконке в трее левой кнопкой мыши, остановив работу программы. Для возобновления, снимите галочку с «Script Paused» в контекстном меню иконки; возможно, понадобится закрыть плеер. – Реплики во фразах персонажей отделяются одной пустой строкой, если не следуют непосредственно друг за другом в исходных субтитрах; и двумя пустыми строками, если вообще принадлежат разным файлам. При создании файлов, если документ с таким персонажем уже существует, то он будет заменён новым – поэтому лучше всегда создавайте новую папку при выборе места для сохранения индексного файла.
Альтернативный способ обработки файлов: – Для этого нужен «современный» браузер, откройте файл «AssEasyQuote1V0.htm». Этот способ может быть оказаться быстрее предыдущего при очень большом числе субтитров и персонажей. – Сложите все субтитры в одну папку, и заархивируйте её в .zip – Откройте архив интерфейсом на страничке, или перетащите его на элемент загрузки файлов. – Страница, после обработки, вернёт вам некоторый файл. Сохраните его как .zip архив. – Распакуйте полученный файл. Там окажется, в том числе, один .ini файл. – Откройте его текстовым редактором, и вставьте на первую пустую строку полный путь к той папке, которую вы бы выбрали как папку с видеофайлами. – Всё, можете перетащить его на программу и пользоваться как обычно.
А вот ещё этапы разработки и финальная версия скрипта, мониторящего доступность видео на Ютюбе.
Инструкция: 1) Зайти браузером на https://www.youtube.com/oembed (там «Not Found») 2) Открыть консоль браузера (Ctrl+Shift+K/J/C) 3) Вставить туда содержимое текстового файла по первой ссылке.
4) В текстовое поле вставить ссылку на какое-нибудь видео. 5) Нажать Enter или ADD. Добавить ещё несколько видео.
6) Таймер пока одноразовый, без повторной проверки. Кнопка «now» запускает проверку данного, кнопка «DEL» – удаляет строку. 7) Посмотреть результаты работы скрипта – зелёный на хороших видео, красный на плохих. 8) Было бы здорово проверить, что существующее, но удалённое позже видео, при нажатии «now» начинает выдавать красный.
Осталось придумать, какие уведомления выдавать (думаю, что смогу звуком), и выбрать интервал обновления…
Если текущая страница не «youtube.com/oembed», то скрипт либо сам переадресует туда в текущей вкладке (если посчитает её содержимое не важным), либо создаст большую кнопку, по которой можно будет перейти туда в новой вкладке (а если зажать Ctrl при щелчке, то скрипт попытается всё же использовать эту вкладку вместо новой). В любом случае, на целевой странице скрипт нужно будет вставить в консоль ещё раз.
Дальше как обычно, вставлять ссылки в поле (хотя я предпочитаю не ссылки кидать, а только сами идентификаторы видео типа «q7s1B-kd_Uc»). Применять можно по Enter или ADD.
Далее в таблице появится серая строка, и через секунду запросит обновления; но прежде идёт дополнительный запрос на заголовок и картинку для видео (ведь на блокированных видео эта информация не выдаётся).
Обновляемая строка горит либо голубым (если новая, или ещё до этого была зелёной), либо жёлтым (если была красная). Запрос ждёт 20 секунд, и если ответ не пришёл – будут посылаться повторные запросы каждые 20 секунд. Таймер будет идти от нуля в отрицательную сторону.
Пришедший ответ обновляет таймер, устанавливая его на случайное значение от 10 до 35 секунд. Если с видео всё хорошо, то строка станет зелёной.
Если же обнаружен статус "fail", то строка будет красной, и случится уведомление. Таймер, тем не менее, пойдёт как обычно к нулю, и последующий запрос всё равно произойдёт (скрипт же не знает, почему была неудача, может там сервер просто ответил «повторите позже», тем не менее «причина»будет выведена под названием видео). Таким образом, если вставлена некорректная ссылка, то уведомления будут случаться постоянно, примерно каждые 20 секунд.
Чтобы остановить такмер на конкретном видео, есть кнопка «stop» под ним. Она сделает цвет строки белым (если он был зелёным или голубым), либо розовым (если красный или жёлтый). Теперь обновлений не будет, а также кнопки «now» (обновить сейчас) и «DEL» (удалить строку) перестанут работать, пока кнопка «enable» (второе состояние этого «stop») не будет снова нажата.
Уведомление – это во-первых, «Desktop Notifications», и браузер, по идее, должен спросить разрешение у пользователя, при добавлении первого видео в таблицу. Нужно разрешить показ уведомлений! Если браузером поддерживается, то на экране возле трея будет появляться окошечко без иконки, но с идентификатором видео, причиной неудачи, и названием (если поместиться).
Во-вторых, должен быть слышен пронзительный звук сирены ^^. У меня работало во всех браузерах (ну кроме IE, на который я даже не рассчитывал и не пробовал, потому что в нём этот скрипт работать гарантированно не будет). Но возможно, если звука нет, то нужно зайти в настройки браузера и либо «включить звуки на веб-страницах», либо отметить «запускать все плагины» (вместо «по запросу / только важные»).
И в-третьих, заголовок страницы (вкладки окна / иконки панели задач) будет в течение пяти секунд постоянно меняться на всякую всячину.
Вот так, вроде всё. Думаю, что если какое-то видео действительно вдруг оказалось заблокированным – нужно остановить его таймер и принять меры. После того как меры приняты – нажать «enable» и удалить строку.
О, а ещё, строка в таблице может почему-то стать синей. Это произойдёт, если в ответе сервера не найден «status» вообще, или не равен ни «ok», ни «fail». Это ничего не изменит, должно по идее считаться, что ответ не пришёл (перезапрос через 20 секунд), но если происходит регулярно – дайте ссылку на такое видео))
P.S Блин, по-моему, я слишом грубо парсил результаты. Вполне возможно, что видео с названием, включающим символы \, &, <, >, = – может всё поломать. Или нет.
Баг заключался в том, что _возможно_, новое добавленное видео могло сломать проверку всех предыдущих (угораздило же меня написать «if(A[i ].handle=v)…» и не заметить).
Изменения: – теперь промежутки времени (интервал, его рандомная добавка и ожидание ответа сервера) задаются как числа в поля на самой странице. Применяются мгновенно при изменении; если невалидно (интервал меньше 1, добавка меньше 0 или ожидание меньше 2, либо если не число) – подсвечивается розовым. – первый раз картинка на видео прогружается не сразу, а спустя три секунды (чтобы дать возможность маленькой прогрузится, если будет; хотя ждать её нужно было не так…) – таблица формально не пересоздаётся при добавлении очередной строки. – при остановке таймера, его кнопки «now» и «DEL» становятся визуально недоступны. – идентификатор видео во втором столбце теперь является ссылкой, открывающейся в новом окне.
Русифицировал интерфейс. Ну и сделал отлов картиночки именно такой, какой нужно: вначале идёт запрос на картинку высокого качества, которая точно есть (как и название). Далее, если он пришёл – то название выставляется сразу, а ссылка на картинку – запоминается.
При следующем обычном запросе, если вернулось название – то оно заменит имеющееся, но единожды (кстати, название видео у меня по таймеру вообще не обновляется. А надо?) Если пришла ссылка на картинку низкого качества – то вырисовывается она. Если же нет, то берётся сохранённая ссылка на большую если есть.
Когда таймер достигает «0» – на сервер посылается запрос на обновление данных, а таймер продолжает идти «в минус». Состояние запроса никак не отслеживается, то есть верный результат может либо придти, либо нет.
А значит, если ответа нет – через некоторое время нужно повторить посылку запроса (но да, потом могут придти сразу два). Например, если wait = 15, то запрос будет посылаться при таймере, равном 0, -15, -30, -45… (меньше 2 поставить нельзя, потому что от 0 до -1 происходит посылка, и где-то от -1 до -2 – приём, поэтому иначе повторный будет послан слишком рано.)
Я просто подумал, что браузер может кешировать запросы… Теперь всё скачивается через POST (ха, Ютюб не банит за это, как Гугль!), и к запросам добавляется случайное число, чтобы URL был формально каждый раз новый.
Там вроде есть кол-во просмотров, но оно было какое-то не очень адекватное, кажется.
http://klimaleksus.narod.ru/Files/4/ytalert1V5.txt – теперь принимает список ссылок/идентификаторов, разделённых пробелом (вгружаются через секунду по-очереди, но добавляются одновременно). Такой список из текущей таблицы – выводится перед ней (ну чтобы можно было скопировать эту строку, и потом целиком и вставить)
Оу, тут можно ещё кусочек про пад добавить, насчёт переполнения стека – косвенный пример:
А вот что у меня было с Апачем. Забавно, но я делал такой же редактор в реальном времени, как пад – но графический, там можно было одновременно рисовать. Клиент посылал серверу JSON с перемещением курсора, а сервер сохранял его и пересылал всем остальным по их запросу.
Я хотел устроить хотя бы проверку валидности данных, чтобы клиенты не могли заспамить сервер мусором (он ведь вслепую ретранслирует всё другим клиентам), но без полного парсинга JSON для экономии ресурсов.
Но когда клиент водил мышью с особой ревностью, и строка становилась в сотни раз больше – сервер вылетал, перезапускался и соединение разрывалось без получения чего либо (в том числе, адекватной ошибки).
На сайтах пишут, что такие проблемы с preg_match($r,$s) только под Виндой. Потому Апач там по умолчанию скомпилирован с коротким стеком. А ещё рекомендовали перекомпилировать его, поменяв часть рекурсивного кода на линейный… (но тогда мне было вообще не до таких разборок, и мы просто забили на валидацию)
(э, ладно, возьму-ка отсутствующий кусок текста про mysql из предыдущего поста – тот, что в архиве – и плейн-текстом фигану сюда. Ну там, для возможности поиска, тудым-сюдым…)
Поскольку, исправлять баги и плясать с бубном, пока я всё это настраивал, мне приходилось постоянно и многократно – нужно, чтобы пользующиеся моей сборкой чётко понимали, как она работает внутри. Хоть я и свернул всё к простым кликам по .bat файлам, но обязательно что-то пойдёт не так.
Итак, в архиве – куча батников, и папка «MySQLServer5.5» – её переименовывать не надо. В ней есть файл «my.ini» – это основная конфигурация сервера. Нужно выгрузить это в папку, находящуюся (желательно) в корне жёсткого диска, например чтобы существовал путь: D:\TDTPAD_MySQL\MySQLServer5.5\my.ini
Теперь этот путь надо прописать в самой конфигурации дважды, и в моём файле «path.bat»: Там нужен путь типа «@set dir=D:\TDTPAD_MySQL\MySQLServer5.5» А файле конфигурации «my.ini» – два пути, один к этой папке, а второй – к её «DB» подпапке. Причём слеши там требуются прямые. То есть basedir="D:/TDTPAD_MySQL/MySQLServer5.5/" datadir="D:/TDTPAD_MySQL/MySQLServer5.5/DB/"
Все эти пути правильно прописывать ОЧЕНЬ важно. У меня было, что путь «С:\MySQL2\…» был неверен только потому, что там русская «С». Дальше:
Скрипт «MySQL_totalreset.bat» – очищает всё состояние базы данных до заводского, но не трогает конфигурационный файл. При запуске требует подтверждения – нужно ввести английскую букву «y» и нажать Enter. Будет сгенерирован новый локальный root пароль, который запишется в файл «pass.bat» и станет автоматически использоваться в дальнейшем. Откроется окно запущенного сервера с логом работы, если всё в порядке, его нужно закрыть.
Скрипт «MySQL_start.bat» – запускает сервер базы данных. По идее, он работает в фоне и не имеет консольного окна. Больше одного раза сервер запускать нельзя, будут глюки в виде пустых консольных окон или невыполняющихся команд и заблокированных файлов. Если такое случилось – убивайте сервер скриптом «MySQL_kill.bat»
Скрипт «MySQL_stop.bat» – останавливает работающий сервер. Может не сработать, если что-то с root-паролем случилось.
Скрипт «MySQL_kill.bat» – убивает все процессы, имя которых равно «tdtpad_mysqld.exe», это на случай, если предыдущая команда не заставила его остановиться.
Скрипт «MySQL_SHELL.bat» – открывает клиентское окно команд терминала MySQL (это туда надо вводить все те команды, которые можно нагуглить для решения той или иной проблемы), вообще говоря, через него можно сделать что угодно. Но самые главные функции вынесены в отдельные скрипты, а этот потребуется лишь для ручного вмешательства.
Скрипт «MySQL_STATUS.bat» – выводит на экран всю информацию о работе сервера – все процессы с его именем (должен быть один!), его общий статус, текущее состояние репликации и номер бинлога мастера. У меня всё сконфигирировано так, чтобы и мастер и реплика настраивались одинаково, надо просто знать, на что обращать внимание. Если статус вообще не печатается на экран – с сервером что-то не то.
Скрипт «MySQL_debug_log.bat» – запускает сервер (убедитесь, что больше ни одна провисшая копия не активна) в консольном режиме, с выводом лога на экран – сразу покажет примерную причину, почему вдруг сервер не запускается при штатной попытке.
– Ну со всем этим понятно как работать. Сначала «MySQL_totalreset.bat», потом «MySQL_start.bat» и сразу «MySQL_STATUS.bat». Если всё верно – то можно «MySQL_SHELL.bat» попробовать (если есть что писать туда), закрытие или перезапуск – «MySQL_stop.bat» и «MySQL_start.bat» снова. Если пустые окна остаются – то «MySQL_kill.bat», а если всё равно новая копия не поднимается – то «MySQL_debug_log.bat» и вчитываться.
Теперь ближе к паду. Кусочек конфигурации «settings.json» для etherpad-lite:
Так, во-первых, там вверху где «"ip": "127.0.0.1", "port" : 9001,» – айпи, кажется, надо писать «0.0.0.0» – тогда пад будет доступен на машине, независимо от её настоящего адреса (127.0.0.1 ли, 192.168.0.1, или любой внешний). Главное чтобы при подключении порт был тот, который указан тут. Во-вторых, все строки, связанные с «"dbType" : "dirty"» надо закомментировать или удалить.
В-третьих, раскомментировать секцию, связанную с mysql (настройки в ней объединены с dirty для упрощения выбора). У меня там есть нужный кусочек, вот такой:
– здесь, «user» – имя пользователя для базы данных, которому разрешён нужный доступ, это слово «etherpad» (тогда полное его имя – это 'etherpad'@' localhost' ); «port» – на каком порту будет ждать локальная база данных. В MySQL этот порт меняется дважды в конфигурационном файле, там написано «port=3311». Желательно, чтобы на всех используемых хостах этот порт был одинаковым (проблем при согласовании меньше будет). «database» – имя базы данных, куда пад будет всё сохранять. Это строка «ep», далее пойдут несколько работающих с ней скриптов. «password» – пароль для доступа к базе данных серверу пада. Эту строку можно изменить. Я вот думал, как бы сделать рандомную генерацию, но на самом деле этот пароль и никому не нужен, он же локальный и используется автоматически. Можно написать что угодно, просто скопировать в нужные места – и забыть о нём, ведь всё равно кроме как с «localhost» (это в MySQL настроено) никто к базе не присоединится.
Теперь нужно создать базу данных для пада. После запуска сервера, выполнить скрипт «install_db.bat» – это создаст базу данных «ep», и даст к ней доступ по заданному паролю. Чтобы поменять пароль, отредактируйте сам этот скрипт в Блокноте (менять в «identified by 'my-awesome-etherpad-password';»). Также, там разрешается репликация с этого сервера на любой адрес. Пароль репликации – в «identified by 'my-awesome-replication-password';», если его менять – то менять у всех; к тому же, этот пароль внешнего доступа ни на что, кроме самой репликации, и не даёт.
Наконец, пад можно запустить! В его настройках есть закомментированный кусок «//"dbType" : "dirty",», если поменять его с mysql, то пад переключиться на свою внутреннюю базу данных. Это можно использовать для открытия временного пада на своём хосте, пока MySQL настроен на репликацию главного – а временный пад использовать как средство связи, или писать там адреса альтернативных серверов (раз уж нормальной общей конфы нет).
Для экспорта базы данных, нужно выполнить скрипт «EP_export.bat». Он создаст файл типа «DUMP_$BINLOG.000001$810$.sql.7z», и это – всё содержимое всех падов Пада. Дамп хорошо сжат, и в его названии через «$» отделены параметры мастера, необходимые для старта репликации с него. Слово «DUMP» можно переименовать, но не используйте там специальных символов: только английские буквы, цифры и «_» да «-». Фишка! Чтобы расшарить его (да и не только), переместите файл в папку пада по адресу «\node_modules\ep_etherpad-lite\static\» – тогда он будет доступен из корня сайта (типа http://127.0.0.1:9001/DUMP_$BINLOG.000001$810$.sql.7z )
Для импорта – перетащить нужный «…$…$…$.sql.7z» файл на «EP_import.bat». Это _заменит_ текущее содержимое базы данных «ep» пада на то, что в файле. А вот после полного сброса сервера баз данных, то есть после «MySQL_totalreset.bat» – этой самой базы «ep» ещё не будет, и импорт не удастся: поэтому потребуется сначала запустить «install_db.bat».
Импортирование перехватывает параметры бинарных логов мастера для репликации, и сохраняет их в файл «blog.bat». Кстати! Везде пишут, что для экспорта с репликацией, мастер непременно нужно останавливать, иначе мы не получим значение лога после непосредственного экспорта, ведь в базе к этому времени уже может что-то поменяться. Но мой скрипт делает экспорт как можно быстрее, и сверяет параметры бинарных логов до и после. Если они совпали – значит всё отлично, никаких изменений в паде не было. А если нет – дамп, конечно, создаётся, но он будет непригоден для репликации. Скрипт позволяет зажать Пробел, чтобы продолжать пытаться заново создать правильные дампы до тех пор, пока не получится успеть между коммитами пада в базу. На крайняк можно просто попросить всех с полминуты ничего в пад не писать, либо всё же закрыть сервер пада, если совсем никак не экспортируется.
А вот как нужно настраивать репликацию.
На запасном хосте, нужно развернуть свою копию MySQL сервера, но в файле конфигурации «my.ini» требуется заранее обязательно изменить «server-id=11» на другое число. Пад можно не запускать, достаточно будет «install_db.bat» и импорта правильного дампа с мастера.
Теперь запускаем «replication_use.bat», и консоль спрашивает IP мастера. Его надо аккуратно ввести и нажать Enter. Будет выведен неинтерактивный статус. Окно можно закрыть, а вскоре – выполнить «MySQL_STATUS.bat», чтобы получить больше информации.
В этой большой таблице важнее всего пункты «Slave_IO_State:» – текущее состояние, должно быть что-то типа «Waiting for master to send event». Если там пусто, или какой-нить реконнект – плохо. «Seconds_Behind_Master:» – самое важно, если там «NULL» – репликация не работает. Должно быть число, обычно «0». А «Last_IO_Error:» – сообщение об ошибке, но я-ще не понял, как его очистить. Для перезапуска репликации – можно выполнить «replication_use.bat» и просто нажать Enter, чтобы взять старый IP. Если мастер работает на другом порту – откройте сам скрипт и поменяйте там «echo MASTER_PORT = 3311,»
Остановка репликации – «replication_stop.bat». Кстати, реплицирующий сервер (я надеюсь) блокирует себя для записи, поэтому запущенный к нему пад не должен заработать. Но всё равно, лучше не рисковать, и если на текущем хосте репликация – то в конфиге пада переключить на dirty.
Теперь весь процесс использования репликации:
Первое, назначаем главный хост у кого-нибудь, и запасные хосты. Каждый из них развёртывает MySQL и пад, проверяет, что всё работает. Запасные пады закрываются.
Второе, главный хост снимает дамп с базы (пусть, даже пока там ничего нет) и передаёт его остальным. Те импортируют дамп в базу, и запускают репликацию. Нужно быть уверенным, что она работает. (Для этого можно остановиться и запустить базу для пада, увидеть там новые изменения, всё сбросить и снова импортировать изначальный дамп – репликация всегда «догоняет» мастер от сохранённой точки то реального времени.)
Третье, запасные могут раскрыть пады, настроенные на dirtyDB, просто как альтернатива для связи. Но теперь вся работа проходит на основном хосте.
Четвёртое, мастер упал. Считаем, что связь с хостом потеряна полностью. Нужно решить, чья реплика теперь станет главной. Останавливаем её, и обязательно снимаем новый дамп со своего варианта базы, расшариваем его. Запускается пад, настроенный на mysql, и все переходят в него (правда, цвета и имена больше не будут соответствовать прошлым – это потому что хост другой, и cookie не пересекаются, браузеры войдут как в новый пад).
Пятое, все остальные запасные хосты скачивают дамп с этого, и перебрасывают репликацию на него. Если первый хост оживёт – он может подцепиться как ещё одна реплика.
Если по каким-то причинам, экспорт из базы стал неадекватно большим (хотя он ужимается) – можно просто запустить пад у себя, сделать оттуда экспорт в .etherpad, потом грохнуть базу нафиг, заново пересоздать, импортировать документ в пад, и снять дамп для репликации.
И напоследок: – чтобы сделать рут-пароль к mysql пустым, нужно удалить папки \data и \DB из \MySQLServer5.5\ (это уничтожит базу данных, если что) и вытащить их из файла \bin\restore – это обычный .7z архив. Теперь, удалить мой «pass.bat».
– чтобы использовать другой порт, меняйте в «my.ini» (мастер) и «replication_use.bat» (реплика).
– чтобы сменить пароль для базы пада, ищите в «install_db.bat» и «settings.json» самого пада. Пароль репликации меняется в «install_db.bat» (мастер) и «replication_use.bat» (реплика).
– ещё раз напомню, что путь к папе нудно менять вручную (то есть все файлы нельзя просто так взять и переместить куда-то), а именно в «my.ini» (два раза, с прямыми слешами) и в «path.bat».
– если будете разводить «локальные копии mysql», весящие на разных портах – во-первых, трижды перепроверяйте пути – не то будет так, что батник запускается из одной папки (путь path.bat), сервер на самом деле работает из другой (соединения проходят через порт, а где сам сервер при этом ж не важно), а используемые файлы самой базы – в третьей (my.ini может показывать куда угодно, например на файлы не своей копии mysql). А во-вторых, последний раз когда я проверял (у меня уже не было двух копмов под рукой) – у меня вообще репликация локально не заработала, до мастера не достучалась.
– имя процесса «mysqld.exe» (в \bin\) я намеренно изменил на «tdtpad_mysqld.exe», чтобы если что, не конфликтовать с потенциально имеющимися базами данных, запущенными на хосте. Поэтому, имя также должно быть прописано в «path.bat». Кстати, если на одной машине несколько копий сервера – команда «MySQL_kill.bat» убьёт все, а не только текущую.
Если кто желает сейчас проверить репликацию (пока я не забыл, как всё работает) – давайте. Я не претендую на то, что использовать её в продакшн. Точно сломается что-нибудь.
Если что, в моём архиве по факту уже выполнен «MySQL_totalreset.bat» и «install_db.bat». Файл «for settings.json» ни для чего не нужен, это просто кусок настроек для пада, а папка \tmp\ – туда я скинул все шаблоны для файла конфигурации, чтобы не мешали. Модуль «7za.exe» в \bin\ – добавлен мною, как и файл «restore», содержащий исходную версию внутренней базы самой MySQL. Прочие проги в \bin\, кажется, не нужны; но я не стал их трогать, чтобы не портить целостность самой сборки.
О, я подумал, что неплохо было бы оставить в файле «coment.txt» всё это моё сообщение, чтобы оно всегда находилось под рукой.
– я почти закончил программу! – ага, ага, закончил, конечно… – и там код красиво оформлен!.. – ой, да ладно!! – осталось справку коротенькую написать… – коротенькую!? ВА-ХА-ХА
Хантер от испуга выронил охотничий лук и обернулся.
– Спайро? О, ты тут! Зацени.
Он поднял оружие и вставил в него одну из стрел.
– Видишь наконечник? Это Профессор придумал. Там магнитная пыль заряженных камней Харрикоса, и порох с фабрики фейерверков. Я уже пробовал! Напрочь ломает их нейтронную турбину и систему навигации.
– И-и?..
– Тихо, одна летит…
Вдали показалось НЛО, стремительно приближающееся к напарникам. Хантер пригнулся, пробежал вперёд, споткнулся, ещё раз поднял лук с земли, и затаился возле куста.
Дракон продолжал стоять и смотреть на выражение лица а-ля «не пали». Когда тарелка пролетела над ними, Хантер вышел из укрытия, натянул тетиву и выстрелил.
Он промахнулся. Однако стрела, пролетев через кольца, оставляемые двигателем летающей тарелки, внезапно взорвалась. В воздухе возник разноцветный салют, а машина потеряла управление.
Дымящееся НЛО накренилось к земле, его крыша отскочила, а оттуда выпрыгнула белая овца. Вскоре она раскрыла парашют, и плавно опустилась к земле. Однако ветер подул в правильную сторону.
– Яйцо!!
Хантер направил лук со второй стрелой прямо на неё.
– Бе-е-е!
Вдалеке послышался звук от разбившегося летательного аппарата.
– Там было яйцо!?
– Бе-е-е!!
Хантер приблизился к ней в упор, замер на секунду, а потом грустно опустил оружие.
– Ладно, пошла вон.
Спайро моргнул от удивления. Глядь – овечки уже нет.
– И почему ты её отпустил?
– Пустая. Будь у неё яйцо, под ТАКИМ не соврала бы!
Гепард нацелился на нос дракона. Спаркс прожужжал что-то невнятное, а Спайро просто обошёл вокруг. Затем посмотрел в небо на исчезающий след.
– Ну а если бы яйцо там было?
– Поэтому мне и нужен ты! Я буду сбивать тарелки, а ты – спасать из обломков драконьи яйца. Вон ещё трое, готовься!
На горизонте появился штурмовой овечий отряд. Их предводитель летел на тарелке, у которой снизу был шлюз для захвата объектов.
Когда Хантер зарядил очередную стрелу, овцы изменили построение и совершили перекрёстный маневр. Спаркс хотел было прожужжать «Сложность: *****», но Спайро уже помчался вперёд.
Вскоре одна тарелка была подбита.
– Вали главного!
Спайро побежал в направлении чёрного следа, а Хантер по его совету – совершил перебежку на открытую местность, потому что вражеский отряд, видимо, решил отступить.
Когда дракон добрался до рухнувшего НЛО, пилота уже не было. Однако, там действительно лежало драконье яйцо! Он вытащил его и побежал прятать.
Раздался грохот. Овечий командир был подбит, а его напарник – благополучно покинул зону досягаемости стрел. Спайро побежал ко второму потенциальному яйцу.
Там уже стоял Хантер, открывший кабину летающей тарелки. Внутри лежало… яйцо?
– Это… а что с ним?
Объект был размером с драконье яйцо, но странной крапчатой окраски. И был словно весь в перьях. Хантер наклонился и принюхался.
– Может, палкой в него потыкать…
Оно шевельнулось! Спаркс облетел его кругом в негодовании.
– Зоя! Ты тута? Зоя, появись-ка на секунду!..
Спайро искал взглядом полупрозрачную звезду.
– Так это существо!
Фея оказалась позади дракона. Она взмахнула палочкой, и наградила субъект магическим зарядом. Зверюшка приподнялась и открыла два больших глаза. Спайро вдруг осенило.
– Да это же со…
– г.д.е.?
Она пошла на контакт. Хантер решил ответить.
– Ну, эту трассу Спаркс частенько зовёт…
– г.о.д.?
Зоя удивилась.
– Год? Так две тысячи…
– о.х..
Она склонилась, но вскоре встала во весь рост.
– А ты тут, потому что…
– о.в.ц.ы.
Хантер перевёл взгляд на небо.
– Кстати, о них.
– в.п.е.р.ё.д.
Она взмахнула крыльями и вылетела из тарелки. Спайро вопросительно посмотрел на Хантера, а тот приготовил свой лук.
– н.у.?
– В смысле, стрелять? И правда, ну…
Стрела пролетела очень удачно, попав в самый центр построения пяти НЛО. Взрыв поразил несколько из них, и вот небо окрасилось в чёрные полосы, дымовые кольца и катапультирующихся овец.
– с.к.о.р.е.й.!
– Да, но мы собираем…
– я.й.ц.а.
Дракон остановился на секунду, потом кивнул и побежал к ближайшей упавшей овце. Пусто.
– с.ю.д.а.!
Хантер видел, что она вспорхнула наверх, откуда хорошо видны места падения тарелок.
– А ведь неплохо придумано!
Тем более, что он уже успел подбить их все.
Поднимая последнее яйцо, Спайро осторожно задал вопрос.
– Так, ты теперь…
– д.а.
– О, хорошо, просто… Просто у нас есть на примете ещё где…
– и.д.ё.м.
Спаркс даже стал лететь ближе к ней, чем к дракону. Хантер раскрыл рот, что бы что-то сказать, но вовремя понял, что не сможет выразить свою мысль достаточно кратко. Он шёл молча всю дорогу, и смотрел на блестящие наконечники своих стрел.
– Хм. Придётся привыкнуть.
Зоя, наконец, перестала висеть в воздухе на одном месте, и просто исчезла. but nobody came
Сообщение отредактировал aleksusklim - Понедельник, 07.11.2016, 18:02
Oh, hey hey… baby, love me back today, Never ever sink my ship and sail away! Oh, oh oh… baby, don't shut me down, Give me all the love I need and I'll be gone.
I'm a lonely sailor drinking the night away, My ship is made from hope, She's searching for your bay… But you don't care!
Hop on to my ship, baby, I'll make you fly! You love me and you know that, baby, don't you lie. Like me like I like you And say na-nana-nani-nani-na…
Oh, oh oh… we need a bit of rock 'n' roll, Baby, don't you crush my soul and make me fall. Oh, hey hey… baby, love me back today, Don't you ever sink my ship and sail away?
Hop on to my ship, baby, I'll make you fly! You love me and you know that, baby, don't you lie. Like me like I like you And say na-nana-nani-nani-na, Na-nana-nina-nina, Nana-nana-na(na)…
Pirates, high seas, cautions, cannons and potions… A sailor's passion can always conquer the oceans! Sing with me, my children
Hop on to my ship, baby, I'll make you fly! You love me and you know that, baby, don't you lie. Like me like I like you And say na-nana-nani-nani-na, Na-nana-nena-nena, Nana-nana-nana… Hayde!
Оу, эй-хей… полюби меня скорей, Не топи корабль мой среди морей! Ой, о-ой… не рази нас войной, Лишь отдай любовь, что я возьму с собой.
Одинокий морячок пьёт ночами ром, Лодка – надежда, но Бухта пуста давно… Ей всё равно!
Прыгай на корабль – понесу к звезде! Ведь любишь, это точно, и не лги себе. Я тебе понравлюсь, Только мне взаимностью ответь…
Оу, о-оу… поможет, верно, рок-н-ролл, Чтобы не упасть, когда в душе раскол. О, э-эй… снова полюбить сумей, И корабль мой уже топить не смей!
В лодку залезай – клянусь, и мы взлетим! Я нравлюсь, даже очень, лишь не подведи. Полюби меня, как я тебя И взмоем по волнам! Мне взаимностью ответь, Моря подвластны нам…
Волны, гудки, пушки, яды, пираты… Да волчья страсть, чтоб покорять океаны! Пойте с нами, дети!
Сядь на наше судно – подарю полёт! На миг доверься, крошка, и любовь придёт! Нравлюсь, как и ты мне, Я молю: взаимностью ответь! Вечно вместе в лодке будем Над водой лететь… В небо!
На мою влюблённость гордо Хоть разок мне взаимностью ответь! Шторм не страшен для тебя, Когда я рядом есть.
Я думал, я хорошенько подумал над нашей дискуссией, и у меня родилось это сообщение. Оно предполагается длинным, но я прошу прочитать его до конца, можно не спеша.
Начнём с нашей ситуации в целом, но я позволю себе переложить её на лад двух программистов. Итак!
Мы с вами решили вместе покодить. У нас уже были наработанные модули, оставалось лишь связать их друг с другом, исправляя итоговые процедуры. Мы взялись за работу, как вдруг вы заявляете, что я нарушаю технику безопасности, вставив зарядку от телефона в пилот без заземления. Сначала я попытался объяснить, что это процессу не помешает, но вы были категоричны. Вы даже нашли конкретный пункт техники безопасности, который я нарушил. Я хотел ответить, что в подобных ситуациях заземление как правило нужно, но и без него ничего страшного не случится; плюс учитывая, что мне кажется, что без него логичнее и понятнее. Мы не смогли сойтись во мнениях, и допрограммировать тогда не успели.
Далее в конференции я решил сослаться на существующие проекты, в которых периферийное оборудование так или иначе оказывалось без заземления. Но вы сказали, что это не показатель, а правила техники безопасности нужно соблюдать всегда, они незыблемы. Что ж, тогда я прошёлся по вашим модулям, и указал на неоптимальные функции в них. Потому что по моим жизненным правилам, программист всегда должен создавать оптимальные программы, и это куда важнее пренебрежения отдельными неудобными пунктами техники безопасности. Но вы ответили, что зато ваш код красиво написан, а оптимальность дело десятое – кто как умеет, тот так и пишет. На это я предъявил такой ваш файл, который не то что не оптимален, а не компилируется в принципе! На что вы констатировали, что конечно, чужой код обсирать легко.
Но я же не для этого его приводил, ведь и в моём коде могли быть исключения времени выполнения, тем более что мы так всё целиком и не проверили. Я просто показал, что в конечном продукте, который мы релизнем – неоптимальный код хуже нарушений технологии. В прочем, багнутый некомпилирующийся кусок, не так уж и важен (что я тоже упоминал), ведь его мы в любом случае успеем поправить. Ну и наконец, после утверждения о том, что все студии, разрабатывающие программное обеспечение данной отрасли – гарантированно соблюдают технику безопасности, и заземление у них всегда работает – я стал искать, и успешно нашёл по крайней мере один прецедент, идущий в разрез с другим условием техники безопасности. В принципе, тут Серлутин доказал, что если поднять дополнительные документы, то в них можно найти положение, по которому в этом месте можно поступать по ситуации. Но это опять же показывает, что «по ситуации» поступать может быть разрешено много где. И моя незаземлённая зарядка по факту же была полностью безопасной… Ну и я мог продолжать поиски дальше, ведь там же, где я смотрел, так и кажется, что всё в порядке у них только по документам.
Ну теперь вернёмся обратно.
Есть разные проблемы, переплетшиеся в единую. Это и следование правилам русского языка, и подход к стилю перевода, и даже способ выяснения правоты между участниками. Для конструктивного решения, их нужно разделить, и обговорить отдельно.
Начнём со стиля. Вы утверждаете, что перевели интервью с приёмом так называемого «одомашнивания», и в принципе, по результирующему тексту я достаточно ясно представляю себе, что это означает. Оно имеет право на существование, как и любой другой стиль перевода, но тем не менее, идёт в серьёзный конфликт с моим представлением, как интервью должно переводиться в принципе. (Ещё раз, это отдельный вопрос, не связанный ни с моей запятой, ни с личным отношением между нами)
Я выбрал подход «сохранения интонации», чтобы субтитры к видео были синхронными на глаз и слух. Я объясню, что это означает, причём Спайро я перевожу в целом почти с тем же самым подходом.
Во-первых, он подразумевает обязательное учитывание оригинальной озвучки. Во-вторых, итоговый перевод должен быть таков, что его можно было бы прочесть с той же интонацией, с которой произносится оригинал. Нет, опять же, как и в переводе игры – это должен быть не абсолют (в Spyro3 мы и меняли некоторые фразы, и часто значительно разноображивали оригинальные тексты), но в целом подход подразумевает именно синхронность с исходной интонацией повествования.
К примеру, если на видео он жестикулирует и устно отделяет развитие мысли на фразе «этот аккорд ведёт к тому аккорду» – то в переводе должна обязательно сохраниться цепь «аккорд-аккорд». Например, «один аккорд ведёт к другому аккорду», или даже «первый аккорд ведёт – ко второму», тут повтор заменяется паузой, но его нельзя поменять на что-то другое, даже на синоним. Иначе последовательность интонации будет уже не той, и тем более нельзя делать что-то вроде «аккорды следуют один за другим», «разные ноты складываются в аккорды» – несмотря на то, какие эти варианты могут быть правильные или красивые, они не подойдут под оригинальную интонацию.
Зачем? Ну например, зритель может проникнуться мыслью текста, полагаясь на интонацию. Ведь перевод построен так, что должен ложиться на интонацию без проблем – то есть все знаки препинания и связки будут только помогать читать – и можно следить за ним синхронно, и в голове его слова начнут звучать по-русски. Почти как если бы он сам мог понимать сказанное.
Если перевод не будет синхронным, то зрителю придётся воспринимать смысл из текста, а настрой – из озвучки. В принципе, в случаях, где не предполагается дубляж – это нисколь не плохо. Просто за переводом нельзя будет «следить», но зато с другой стороны, он может быть построен лучше оригинала, переиначен, одомашнен или как угодно. Это просто один из принципов, которому можно следовать, либо нет. И кстати, запинки в тексте или хотя бы многоточия на их месте – опять же способствуют синхронизации.
Тут есть и воля в знаках препинания: временами их ради интонации хочется поставить необычными, но чётко понятными большинству зрителей методами. Например, две точки «..» – это, насколько я знаю, в правилах не описано, точного смысла не имеет, но вообще используется достаточно широко и в приблизительно одинаковых ситуациях.
Ещё – оформление текста. Курсив – пожалуйста! Он ещё как поможет понять интонацию, им выделяют слово, находящееся под логическим ударением, особенно когда в противном случае реплика автоматически читается по-другому, сбивая восприятие. Ха, выделение слов заглавными буквами – в каком же случае, по правилам языка, допустимо написать что-то кроме аббревиатур капсом? Кстати, американцы куда охотнее применяют и курсив, и даже интонационное искажение самого текста. И пунктуация – например, часто на местах разрыва ненамеренно незаконченных реплик ставится два дефиса подряд, хотя у них есть знак многоточия. А тильда после слова обозначает его продолженность, певучесть. Но всё это нужно согласовывать заранее, то есть используем ли курсив, и в каких количествах. Например, я видел англоязычные документальные фильмы с субтитрами, в которых курсив на том или ином слове был в практически каждой строке (хи, им ещё визуально не столь повезло, ведь «I» с наклоном почти не бросается в глаза).
Допустим, рассмотрим ваш стиль перевода. В некоторых местах вы строите фразу более богато, переиначиваете её, чего нет в оригинале. Нужно изначально решить, допустимо ли такое. Например, «Ах, горе мне, что не жил в этом столетии!» – фраза, кончено, красива, но такое добавление не стыкуется с текстом оригинала («I wanna», а не «why I didn’t»), хотя и отлично доносит его мысль. «Оки-доки, а теперь добавим щепотку хеви-металла» – ну тут я уже совсем не знаю, позволительно ли добавлять чуть ли не стиль Пинки Пай…
Не, я когда делаю «пересказ» – перекраиваю фразы как угодно, да вот тут же и пример есть, с моего комментария к гарбаж-ревью. Но с оригинальной озвучкой в оригинальном видео он бы не ужился!
«наслаиваю звуки друг на друга как пирог, отчего первое впечатление от прослушки становится обманчивым» – а-а, я понял. Это мог быть пост, опубликованный на Хабрахабре. Да, если бы интервью было в текстовом виде на англоязычном новостном сайте, а вы перевели его на русский именно вот так вот – и опубликовали на ресурс, подобный хабру – оно бы шикарно там смотрелось. Тут и оригинал читателям совсем не нужен, и мысль явнее донесена, ну а где слишком тускло – додумана , и это не плохо, если мы точно знаем, что именно хотел сказать интервьюируемый, когда ему просто слов не хватило.
Так вот, обобщая, получается, что договариваться нужно было заранее. Потому что я не рассчитывал на настолько различные мнения по элементарным вопросам! Вопросы же простые: строго придерживаться правил, или нет; сохранять запинки, или нет; разноображивать текст, или нет…
Однако, пути по каждому направлению всё равно три. Это как в вопросе, переводятся ли имена. Можно пойти по пути «Нет». Тогда, все переводчики обязуются согласовываться с этой концепцией. И это не плохо, но и не просто, ведь возникает два пункта с возможными разногласиями: о том, как именно нужно транслитерировать каждое конкретное имя; и о том, является ли какое-то слово именем в принципе. Причём если все будут согласны, что что-то не имя, и намерены его перевести – они переведут с адаптированием, и всё будет верно и в рамках выбранного пути. А вопрос о целесообразности самого пути ставить в аргумент уже нельзя, раз он был обговорен изначально.
Можно пойти по пути «Всегда», и следовать ему во всех случаях. То есть прямо транслитерированные варианты отвергаются сразу же, но всем необходимо будет выбирать и придумывать различные альтернативы в достаточно широких пределах – от искажения оригинального имени, до полной замены, уже не имеющей с ним ничего общего, но тем менее по каким-то причинам лучшей в конкретном месте.
Или, можно выбрать «Решаем отдельно каждый раз». Но тогда это означает хотя бы то, что никто не вправе посметь заявить, что имена не переводятся, либо также просто отвергать транслитерированные варианты. Ведь если решать – то решать, и в каждом конкретном случае по факту, учитывая разные аспекты. Также, из того, что какое-то имя, например, было транслитерировано – не должно следовать, что так необходимо поступить и с остальными; однако, какая-то последовательность и аналогия в принятых решениях быть всё равно должна.
Итак, если мы выбираем строгое соответствие правилам, то должны условиться, что будем неукоснительно ему следовать. Тот же ответ насчёт пунктуации, что означает, что мы уже не сможем менять знаки препинания так, чтобы что-то лучше читалось – будет необходимо перестроить фразу, чтобы и читалось хорошо, и грамматически правильно было. Причём какое бы «кардинальное» решение не было взято – перевод что-то потеряет от этого, несомненно. Ведь, как многим кажется, всей куче переводчиков придётся постоянно идти на уступки друг другу, и компромиссы сделают результат тусклым и слишком нейтральным. Но зато, все будут успешно работать! Перевод выиграет тем, что в нём эффективно участвовало много мозгов и общего времени.
Если приверженность правилам не будет в приоритете, то это даст большую свободу в интонационном повествовании. Каждый сможет ставить знаки препинания по своему чутью, как кажется правильным и уместным. Также, участникам придётся доверять мнению друг друга, и если кто-то со всей уверенностью говорит, что где-то нужно тире вместо двоеточия – то можно или всё же согласиться, или ещё как-то подкорректировать реплику. В конце концов, никто же не будет защищать плохой вариант, а также – явные ошибки в стилистике всё равно не пройдут: ведь если ошибка ненамеренная, то переводчику только в радость её исправление, а если нарочная – то пусть будет добр, и конкретно всё объяснит. Но нельзя будет просто указать на правила, всем придётся рассматривать его мнение по существу.
Если же оставить принцип как «уважение к правилам в большинстве случаев», то можно изначально подумать, что споров должно стать больше. Их, вообще говоря, в каждом «среднем» выборе больше, ведь он подразумевает многократное обсуждение переводимого. Однако, если какой-то переводчик захочет нарушить правила грамматики, то ему придётся хорошенько оценить, стоят ли затраты сил на отстаивание свой позиции – самой же выгоды от правки? И наоборот, если чья-то конфликтующая правка активно защищается – значит тут действительно что-то не так, раз такой вопрос был поднят. Ведь как правило, грамматику русского языка все должны будут уважать по умолчанию.
Я тут не могу не упомянуть, что в наших субботниках по Spyro3 у нас вроде бы не возникало разногласий по самой концепции перевода! То есть мы все знаем, как переводить, каким перевод должен быть, и что в него можно засунуть. Например, мы можем взять какую-то реплику – и вообще вставить в неё что-то своё, что не ломает оригинал, но и не равно ему. И на это будут все согласны. А если нет – внесём новые предложения и обсудим их.
Из-за общности взглядов сила больше уходит именно в само продирание через текст, а не споры по словам. Мы скорее не сможем придумать ЕЩЁ ОДИН синоним к чему-то, нежели кто-то заявит, что «в оригинале же одинаковые слова, значит и переводить нужно одинаково». И тому подобное, по всем вопросам.
Если кого-то не устраивает какое-то слово или взаимоотношение слов – другой не будет настаивать на каком-то одном варианте, ведь можно предложить различные альтернативы. Если кто-то неправильно понял оригинал, а может это все остальные поняли неправильно – то нужно общее обсуждение, пора копать факты. Нельзя сказать «нет, ты просто неправ», потому что, видимо, мы уважаем мнение друг друга. И на защиту мнения будут аргументы, которые все будут рассматривать, и если они не верны – объяснят, почему.
Иногда может казаться, что меня невозможно переспорить. И правда, переспорить – нет, но можно успешно переубедить. Если приводить правильные аргументы. Например, DragonFlight несколько раз использовал один очень успешный приём, «апеллирование к оригиналу», вернее, к его синтаксической конструкции.
То есть если мне кажется, что текст обозначает одно, а он пытается уверить, что другое – то его отличным ходом будет ответить, что «иначе в оригинале было бы написано то-то и то-то». Вот так! Я проверяю и вижу, что если бы оригинал имел в виду именно мой вариант, то грамматически там было бы что-то другое. В английском языке вообще порядок слов достаточно хорошо состав предложения отражает. И тогда я уже виду, что мой вариант не верен, и тогда – я ещё раз заново рассматриваю его перевод, уже в свете того, что он правилен. И обычно – мы исправляем его ещё как-то, чтобы точнее передать достаточно путанное оригинальное высказывание. Иногда приходится соображать, что же именно вообще в оригинале подразумевается, например мы тогда застряли на «But then, as the game progresses and I start getting to some of the more difficult levels and I’m stumped (пауза) immediately... I’ve gotta beat this bad guy before I can… stay on that level for long enough to write a piece of music for it.» – обсуждения были долгими, но безрезультатными, но не потому что мы не могли договориться, а потому что в итоге поняли, что всего двух голов на это предложение маловато…
Вот я, кстати, могу попробовать апеллировать к оригиналу всё на той же «That much». Вопрос: могло ли там подразумевается «и всего-то», «вот так», «всё просто», «и готово»? That much работы, that much действий. Ответ – МОГЛО. Но было ли? Допустим, он и хотел так сказать. Но тогда, он с куда большей вероятностью произнёс бы «that’s it», «that’s all», «just that», «that’s how». Разве нет? Он же именно ещё раз повторил нам две ноты, интервал высоты – и сказал «that MUCH». Что значит, «вот на столько». Оно могло означать другое, но в том случае практически гарантированно не было бы «much», потому что на языке скорее были бы перечисленные выше куда более расхожие варианты. Ещё вопрос, должны ли мы обязательно переводить дословно его мысль, или всё же можем написать тот же «вот так вот»? Можем. Но только после обсуждения, а не по ошибке. Если мы все будем понимать, что же на самом деле обозначает оригинал, но тем не менее решим, что другой вариант лучше – конечно мы используем его, несмотря на то, как он может быть похож на неверный перевод.
«And the very early stage is a lot of fun …» – допустим, «А вот первые локации даются с удовольствием …». Мы тщательно обсудили эту фразу, и пришли к выводу, что «stage» это не уровень, а этап. Этап его работы над музыкой. То есть «На первых порах очень весело …», «На первых порах мне это в удовольствие …» – это верно. Но на самом деле и вариант с локацией не в корне неверен, ведь – да – он именно про локации и говорит дальше, но уже словом «level». Так что по смыслу он всё равно подходит. Остаётся вопрос, переводчик сделал так, потому что всё понял и захотел намеренно, либо просто неудачно увидел «stage» как «уровень» и перевёл в лоб неверно? Я считаю, что если переводчик не понял смысла – это уже ошибка, и смысл надо выяснить. Даже если после его выяснения мы оставим этот же вариант, как «в принципе подходящий»; но все должны понимать, что же именно в оригинале, и почему мы вот так и так перевели.
Скажите, что финальному результату не важно, написано то-то и то-то потому что переводчик случайно ошибся, или намеренно так придумал? А это смотря что считать результатом. Тампли, насколько я понял – вы потребовали критику своего перевода именно для того, чтобы стать более лучшим переводчиком. Чтобы всё было не зря, чтобы не просто изготовить какой-то продукт, но и отточить на нём своё мастерство. У нас прокачивается мастерство в принципе всего – и понимания оригинала, и ловкости перевода, и умения аргументировать.
Я считаю, что мы можем многому друг у друга научиться. Может быть, в перспективе я стану больше уважать правильную постановку запятых, а вы – наоборот перестанете всегда и везде следовать правилам? Я сожалею, что разногласия в подходе к ключевым моментам перевода оказались весьма продолжительными и фундаментальными. Пусть вам не кажется, что я доволен тем, что вам могло быть неприятно вести долгий спор; а также, мне тоже было достаточно неприятно натыкаться на железные, но неконструктивные аргументы, которые поставлены так, что не оставляют простой возможности донести собственную мысль до эффективного рассмотрения.
Однако я устроен так, что для меня перевод одной строки важен ровно настолько, насколько важен перевод всего видео. А если предо мной встала какая-то цель – то я не смогу просто так оставить её, пока не выполню или не признаю поражение в попытках. Например, в данную минуту – всё что меня интересует в жизни – это закончить данное письмо, и ничто сейчас не сможет меня от этого отвлечь, как бы не было важно второе или как не важно первое.
И если я ненавижу вас за то, что вы отняли у меня запятую – это совсем не означает, что я ненавижу вас в принципе! Я желаю и дальше переводить с вами, тем более что теперь мы больше осведомлены о позициях друг друга. Что не отменяет факта, что нам всем придётся конкретно договориться о том, с какими подходами переводить видео. Об этом спорить можно настолько долго, насколько понадобится – зато чтобы предотвратить дальнейшие споры уже в процессе.
Это как выбор платформы: если один будет переводить только на форуме, другой – в гугль-таблицах, третий – в конференции, а последний в паде – то нифига потом переводы собрать будет невозможно, и вот что будет анархией. А платформа нужна общая, которая хоть в какой-то степени всех устраивает.
Как я сказал, если меня вынудить придерживаться концепции, которая идёт вразрез с моим личным выбором – то я буду надеяться на момент, когда концепцией нужно будет перестать пользоваться – то есть когда отменить её захочу уже не я сам или не я один. Поэтому я и приверженец «средних» выборов, у которых нет крайностей в принципе. Но можно справедливо рассудить, что это медленнее. А скорость – отдельный вопрос. Конечно, один человек и сам может перевести сколько угодно видео, с тем или иным качеством. Но я просто гарантирую, что это СКУЧНО.
Ладно, напоследок немного о том, как было у нас в команде докторов по переводу пони.
У нас был главный редактор – и она занимала одну из руководящих должностей, включая модераторскую. Если рассматривать только её адекватные черты и конструктивные принципы – то можно сказать, что она всегда требовала ТОЧНОСТИ перевода.
Под её надзором в перевод что-то вставить было практический невозможно. И она достаточно туга на шутки, но тем не менее, титаническими стараниями её всё же можно переубедить. Но иногда мы сталкивались, и оба шли на принцип – что достаточно мешало всем остальным (ведь это могло сводиться к непрекращающимся обоюдным войнам правок на одной строке, и бесконечному, с отборными взаимными оскорблениями, спору в чате на протяжении более чем получаса). В принципе, я единственный, кто не уступал ей позицию.
Она не позволяла ни имена переводить по-нормальному (например, если какое-то прозвище было неверно переведено ещё с позапрошлого сезона – она уже не даст его исправить ни за что), ни песни. В принципе, несколько песен было забраковано именно из-за неё, она против всяких повторов, синонимов и раскрытий нераскрытых мыслей.
По факту, двое участников покинули команду именно из-за неё, потому что не смогли справиться с психологическим давлением – когда она выбрасывала нашу работу, и требовала выполнять только её условия, даже не рассматривая наши аргументы. Однако, я всегда говорил, что она ПОЛЕЗНА. Самим своим существованием, потому что заставляет бороться!
Ей ни за что и никогда нельзя уступать, но и она не даст пройти исходному варианту. Война с ней заставляет приводить больше аргументов, генерировать варианты, и переводить, заранее учитывая её отношение. Споры всегда были жёсткие и кровавые, но так уж вышло: у нас были абсолютно противоречивые подходы, но ни один из нас не готов ни сдаться, ни уйти.
Нет, ну в при-и-инципе, если бы её не существовало вообще – переводить было бы и качественнее, и приятнее. Но надо отдать должное: одна управляла не только более чем десятком переводчиков, но и обеспечивала порядок в группе вКонтакте, полной каких-то имбицилов, а не подписчиков… (хотя в какой сейчас таковых нет)
Короче, мораль. Не знаю, в чём мораль. Я просто написал, всё, что думаю. …сотрудничество? but nobody came
Публикую некий файл, снабжённый нижеследующим лицензионным соглашением. Я разрешаю скачивание файла только после его полного прочтения и принятия. http://klimaleksus.narod.ru/Files/T/FILE.rar
Внимание: лицензия на файл, доступный по вышеприведённой ссылке.
Код
1. Я запрещаю всем лицам, за исключением описанных в параграфе 2., производить с этим файлом следующие действия: 1.1. Скачивать его, распаковывать, анализировать, копировать, изменять. 1.2. Делиться ссылкой на него, его содержимым, сопутствующей информацией и этим лицензионным соглашением. 2. Я разрешаю действия, описанные в параграфе 3., таким лицам, для которых справедливы все и каждое последующее утверждение: 2.1. Лицо является зарегистрированным пользователем форума Spyro Realms, находящегося по адресу www.spyro-realms.com/forum. 2.2. На время каждых непосредственных операций с файлом или извлечённой из него информации – форум функционировал в штатном режиме в текущий день, а лицо по-прежнему являлось зарегистрированным его участником. 2.3. Исходная дата регистрации лица на форуме была не позднее 1 января 2017 года. 3. Действия над файлом, разрешённые при состоятельности условий параграфа 2. для конкретного лица: 3.1. Скачивание одного экземпляра файла по ссылке. Хранение одной немодифицированной его копии. 3.2. Распаковывание файла, паролем к которому является хэш от полного текста данного лицензионного соглашения в восьмибитовой кодировке юникод, рассчитанного по алгоритму md5 с шестнадцатеричным выводом в нижнем регистре. 3.3. Анализ содержимого файла, его загрузка в сторонние программы для той или иной интерпретации данных. 3.4. Сохранение полной или частичной копии интерпретированного содержания для личного использования. 4. Действия над файлом и его содержимым, которые я запрещаю даже указанным в параграфе 2. лицам, и накладывающие ограничения на разрешения параграфа 3.: 4.1. Размножение файла, его чистого либо интерпретированного содержимого. Данные не должны копироваться многократно, или оставаться во временных файлах. 4.2. Передача файла другим лицам каким-либо прямым или косвенным способом, даже если для другого лица также выполняются условия параграфа 2. Указывать на файл можно исключительно путём ссылки на первоисточник, где опубликовано это лицензионное соглашение и непосредственная ссылка на файл мной лично. 4.3. Публичное обсуждение файла, ссылки, чистого или интерпретированного содержания. Письменное обсуждение допускается лишь в том случае, если все фактические и потенциальные читатели лично согласились со всеми пунктами данной лицензии, имеют собственную копию файла, и для них в настоящее время выполняются условия параграфа 2. 4.4. Внесение модификаций в файл, прямое цитирование его содержимого, изменение лицензии, попытки формально обойти её. 4.5. Распространение информации о сути файла неограниченному кругу лиц, разъяснение его устройства, а также и намеренное введение в заблуждение по отношению к чему-либо, связанному с файлом. 5. Дополнительная информация: 5.1. При несогласии с любым из пунктов данного лицензионного соглашения, вам запрещается скачивать файл или распространять любую прямую информацию о нём; в частности, технически вы будете выполнять условия, описанные в параграфе 1. 5.2. В случае если вы уже владеете копией файла, но не принимаете лицензионное соглашение – вы должны уничтожить имеющиеся экземпляры и самого файла, и любой информации, полученной из него. 5.3. Если вы нарушили это лицензионное соглашение, то должны либо исправить последствия своей ошибки, либо немедленно прекратить нелегальное использование чего-либо, описанного здесь, и выполнить пункт 5.2. 5.4. За нарушение пункта 5.3. кем-либо, я ответственности не несу. 5.5. Вам не нужен этот файл. Вообще. Игнорируйте его. Вы всё равно не сможете им пользоваться.
Znaczek #B: К этой штуке должна прилагаться копипаста о куче музыкальных ссылок, а ещё объяснение, кто же в итоге заставил меня это сделать. Но, как гласит последующая мораль, сейчас и правда не до этого.
This was a triumph. I'm making a note here: huge success It's hard to overstate my satisfaction.
Aperture Science: We do what we must because we can, For the good of all of us, Except for the ones who are dead…
But 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.
I'm not even angry, I'm being so sincere right now, Even though you broke my heart and killed me. And torn it pieces, And threw every piece into a fire. As they burned it hurt because I was so happy for you!
Now these points of data Make a beautiful line; And we're out of beta, We're releasing on time! So I'm glad I got burned, Think of all the things we learned For the people who are Still alive.
Go ahead and leave me, I think I prefer to stay inside, Maybe you'll find someone else to help you. Maybe Black Mesa. That was a joke, ha ha, fat chance! Anyway this cake is great, It's so delicious and moist.
Look at me still talking, When there's science to do, When I look out there It makes me glad I'm not you. I've experiments to run, There is research to be done On the people who are Still alive.
And believe me I am Still alive! I'm doing science and I'm Still alive! I feel fantastic and I'm Still alive! While you are dying I'll be Still alive! And when you're dead I'll be Still alive… Still alive.
Вижу триумфы: Проект перевода ждёт успех! Прошедшими годами я доволен.
Кредо Союза: Суметь идеал достичь для всех. Спайро тоже будет горд, А тем пиратам – позор.
Эх, легко пытаться, Да ошибки плодить, Но пора собраться И проект завершить! Куча взломов горят, Недоделки висят – Мы шлифуем один Перевод.
И мы не устанем, Даже во мне теперь порыв. Хоть продукт уже идёт не к сроку… А текстов же яма! И всё утвердить сперва должны. Нас берёт уныние, Но счастлив я был всегда:
Раз пишу программы Для прекрасных вещей И от альфы плавно До релиза вообще! Как же рад я, что мы Вместе столько дней прошли – Скоро будет один Перевод.
Думаешь, брошу? О, нет уж, пока Залип я здесь. Вдруг когда-нибудь начнём другое? Может быть, Краша? Иль Ас-Комбат, Ха-ха, чё б нет? Так, зато, текущий гож: Выходит очень хорош.
Ты вот глянь: болтаю, Ну а тексты не ждут, И себя те сами Ведь не переведут! Да программы дописать, Чтоб ресурсы изменять – Завершить наконец Перевод.
Ты поверь, завершим Перевод! Начнём озвучку, и вот – Перевод! Он будет классным, ведь он – Перевод! Ты там киснешь, а тут – Перевод! Как всё готово – сыграй В перевод! Перевод… Перевод.
На картинке: синие провода уже были, соединяют тройки нот; красные (и тонкий белый слева) – мои шины на каждую октаву; толстые белые – выходы с двенадцати нот, жгут.
На самом деле, на схему мне нужно ещё 36 диодов – припаять к каждой клавише, чтобы компьютер смог отличать более двух одновременно зажатых клавиш, вроде бы. Но пока что и так работает (один фиг я двумя руками играть не умею):
Кстати, мне пришлось отвернуть эти накладки (на трёх винтах каждая), чтобы добраться до клемм кнопок и зачистить их все шкуркой. Я шкурил, шкурил, шкурил… а то половина нот барахлила:
С обратной стороны были ещё три кнопочных детектора – для октав. На оригинальной разводке они соединялись достаточно странно, я потом что-то замутил с проводами, но потом вовсе отрезал всё:
Не обращайте внимания на дорожки на самой плате, там всё равно нет деталей (и до кучи я перерезал все пути от контакта). Толстые провода я припаял как есть к выводным контактам платы:
Итак, ещё раз: я разобрал старое нерабочее электронное пианино, вытащил из него музыкальную клавиатуру, соединил по схеме контакты кнопок, подключил в параллельный порт компьютера, и при помощи программы-драйвера получил внешнее устройство midi-ввода!
Правда как таковым вводом я и не пользовался, просто прямое воспроизведение нажимаемых нот. Осталось лишь диоды приделать, и закрыть чем-то поприличнее разводку к шнуру. but nobody came
Сообщение отредактировал aleksusklim - Вторник, 20.06.2017, 22:29
Я понял, что существующие инструменты, по крайней мере из тех, что я нашёл – не подходят под мою задачу, потому что мне важна стыковка и совмещение сторон картинок, а не абстрактное манипулирование слоями.
Также мне не подойдут и готовые коллаж-решения, ведь мне важен не вид решётки, а именно размеры картинок – чтобы выжать максимально без искажений (нет, задачу о рюкзаке решать не хочу).
В итоге у меня получилась вот такая вот программа, которая как бы уже не нужна, я же расставил всё в PaintToolSAI, но уверен, что в будущем она будет экономить мне примерно два часа раз в год: http://klimaleksus.narod.ru/Files/4/CLGv1.rar Скриншоты не покажу. А вообще, её бы хорошо переписать на HTML5, но чё-т я совершенно не желаю впариваться в рисование по канвасу (там ещё с поворотами и отражениями разбираться…)
Давайте я лучше справку сюда копирну! Прямо текстом, без спойлера: (писать её было дольше, чем код программы; вернее, дольше было продумывать все назначения клавиш…)
CLG v1
Это программа для быстрого создания коллажей из набора картинок. Она ориентирована на чёткие границы с выравниванием изображений, для печати и вырезания из бумаги. Результат сглаживается и может содержать ошибку в один пиксель с любого края, поэтому программа не подходит для очень точного и неискажённого размещения схем.
Управление необычно, но удобно, когда вы привыкните к нему!
Для начала общий принцип работы: – Экран это рабочая область. Прокрутки нет. – Задаётся глобальный масштаб, целое число: во сколько раз пиксель на экране должен быть увеличен в итоговом полотне, по умолчанию 8 (то есть всё будет выглядеть в восемь раз меньшим, чем на самом деле). – Картинки можно стыковать друг с другом в прямоугольные области. Их можно подгонять под размер друг друга. – Картинки можно объединять попарно. Потом объединять и сами группы, получая несколько слепленных картинок, которые управляются как одна (что особенно полезно при подгонке размеров). – Редактирование: поворот, отражение, неравномерное масштабирование. – Картинкам задаётся две границы: внутренняя и внешняя. Причём внешняя фактически измеряется в тех единицах, которые в глобальном масштабе. То есть например внешняя граница «2» – это два экранных пикселя, не зависимо от текущего масштаба при сохранении. – Внутренняя граница измеряется в итоговых пикселях, и будет «замазана» самим изображением, чтобы сгладить ему края. Также, внутренняя граница не изменится при относительном масштабировании картинок (и особенно, групп). – В заголовке окна показывается три числа: масштаб, внешняя и внутренняя границы. При наведении на изображение – его итоговые размеры. – История действий для «отмены», а также в качестве резервных копий, собирается в папке «\undo\*.txt», содержимое которой автоматически не очищается. Удаляйте их вручную через некоторое время. – Вместо правой кнопки мыши можно зажать Ctrl и пользоваться левой; также, клавиши Page Up и Page Down действуют как колёсико мышки.
Основные операции: – Пробел = добавить новую картинку. Выберите файл в диалоговом окне, и он будет вставлен на экран. – Перетаскивание левой кнопкой мыши = двигать и стыковать картинки. Нельзя наложить два изображения друг на друга. – Ctrl+Enter = сменить масштаб. Обычно это число от 1 до 16. Экран будет обновлён, но никаких коррекций в расположение картинок не вносится. – Enter = сохранить итоговый результат в файл. В имени в диалоговом окне будет результирующее разрешение коллажа. Если оно слишком большое, сохранение не удастся (зависит от доступной видеопамяти). – Двойной щелчок левой кнопкой мыши на пустом месте = выравнивание всех картинок так, чтобы они не накладывались и не выходили за экран. – Левый щелчок по картинке с зажатой клавишей Delete = удаление. – Вращение колёсика мыши с наведением на картинку = изменение её размера. Для ускорения операции, зажмите правую или левую (быстрее) кнопки мыши. – Ctrl+Z = отмена последней важной операции. Не все действия хранят историю отмен, а также после отмены все картинки будут разгруппированы. И вообще, отмена нужна для крайних случаев, потому что большинство действий можно вернуть и другими способами. – Ctrl+Y (или Ctrl+Shift+Z) = возврат отменённой операции. Действия, сделанные после отмены, не затирают историю, а встают в её конец. – Shift+Enter = сохранение состояния рабочей области в текстовый файл с координатами и путями к изображениям, чтобы потом можно было легко воссоздать расположение и продолжить работу над коллажем. – Shift+Пробел = загрузка состояния, сохранённого по предыдущей команде, либо открытие документа из истории отмен (папка \undo\, ориентируйтесь на дату файла). Пути к картинкам могут быть изменены вручную – это позволяет быстро собрать новые коллажи с тем же расположением изображений.
Редактирование: – Ctrl+Пробел = установка внешней и внутренней границы, они действуют сразу для всех картинок. Коррекция в текущее расположение не вносится. – Перетаскивание правой кнопкой мыши между двумя стыкующимися картинками = подгонка размера первой под вторую. Эта операция учитывает свободное пространство вокруг, и увеличит изображение настолько, насколько это возможно. – Как предыдущее, но с зажатым Shift = подгонка только одной стороны, без равномерного расширения картинки. Это искажает её, но помогает занять оставшееся свободное место или сделать изображения одинаковыми по размеру. – Как любое из двух предыдущих, но повторно (когда картинки уже одинаковые по стыкающейся стороне) = группировка. Группа ведёт себя как картинка, но при изменении размера, пустоты между сгруппированными внешними границами будут искажены относительно обычных внешних границ. – Перетаскивание левой кнопкой мыши с зажатым Shift = правка размеров картинок, изменение краёв. Не сохраняет соотношение сторон, зато как бы двигает границу между стыкующимися изображениями. – Двойной щелчок правой кнопкой мыши = разгруппировывает объединённые, или восстанавливает масштаб одиночных картинок. – Двойной щелчок левой по картинке – восстановить исходное соотношение сторон. – Нажатие Alt (но из-за ошибки движка, эффект проявится только после следующего действия; для большей ясности нажимайте Alt с уже нажатой левой кнопкой мыши) = отображать вместо картинок цветные прямоугольники. Цвет зависит от масштаба каждого изображения относительно его исходного размера: зелёный – нормально, красный – слишком растянуто, синий – слишком уменьшено. Неравномерные искажения показываются градиентом; стрелки указывают направление привязки (для двойного левого щелчка по пустому месту). – Рисование правой кнопкой мыши с зажатым Shift = добавление прямоугольника-пустышки, который ведёт себя как картинка. Иногда удобно для дополнительных ограничений или привязок. – Правый щёлчок по картинке с зажатым Delete = создание привязок по её краям, чтобы получить как бы рамку заданного размера. По ней можно будет выравнивать. – Правый щёлчок с зажатым Delete по пустому месту = удаление всех привязок, созданных по предыдущей команде. – Левый или правый щелчок по картинке с зажатым Alt = отражение изображения по горизонтали или вертикали. Группы также отражаются. – Как предыдущее, но дополнительно с зажатым Shift = вращение картинки против или по часовой стрелке. Изображение остаётся в своём левом верхнем углу.
Быстро приступить к работе: – Нажмите пробел и добавьте картинки. Не делайте их большими принудительно, сначала подрегулируйте глобальный масштаб (Ctrl+Enter). – Стыкуйте их друг к другу (левое перетаскивание). – Чтобы «приложить» одну картинку к другой по стороне – перетащите одну из них на другую правой кнопкой мыши (они должны быть уже состыкованы). – Если что-то куда-то не помещается – уменьшите размер колёсиком, а потом уже пользуйтесь правым перетаскиванием. – Чтобы задать рамку, например формат бумаги, – откройте шаблон с нужными размерностями (например приложенный «A4.png» файл), потом кликните по картинке правой кнопкой мыши с зажатым Delete, и затем – левой с Delete, чтобы удалить середину. – Чтобы выровнять несколько картинок по нескольким другим картинкам – сначала сгруппируйте их (дважды перетащив правой кнопкой мыши примыкающие стороны), а потом сопоставляйте группы тем же способом. – Последняя картинка обычно не влезает в неравномерное место. Для этого зажмите Shift и повторите правое перетаскивание, чтобы форсировать размеры сторон раздельно. – Нажмите Enter для сохранения результата. Если не получается, то сгруппируйте все картинки, уменьшите их и попробуйте снова. – Обычно вам не нужны границы между картинками. Если же вы планируете нарезать распечатанный коллаж, и тем более если это подборка наклеек или трафаретов – «внутренняя граница» поможет сделать расстояние между изображениями, которое будет не жалко отрезать – потому что в нём никакой ценной части нет. – Для использования «внешней» границы придётся чётко задать глобальный масштаб и не менять его; также постарайтесь не масштабировать сгруппированные изображения, ведь там внешняя граница уже не сохранит размер. – Чтобы сделать зеркальную подборку двух коллажей для двусторонней печати – сгруппируйте все картинки в один прямоугольник и отразите его. Затем разгруппируйте всё и отразите каждое изображение отдельно. – Чтобы быстро поменять одну из картинок, можно просто добавить новую, удалить старую, и всунув туда – расширить до краёв.
Во-от. Соберу-ка в одном месте, все существующие коллажи, которые я когда-либо делал, чтобы показать, что в такой программе я нуждался уже ни один раз:
Хотя, для вон тех вон равномерных сеток из картинок, я уже делал однажды программку: http://klimaleksus.narod.ru/Files/4/stamp.rar – простая вещь, принимающая итоговые размерности, и набор пронумерованных изображений. Собирает .bmp на единый холст, очень помогала автоматически размещать подборки кучи мелких, и иногда даже больших.
На первой картинке самое интересное – жестяные крышки для консервных банок. Во-первых, я распечатал коллаж на «самоклейке» – фотобумага, которую можно разлепить, и обратная сторона будет липкой, чтобы делать наклейки. Во-вторых, я заламинировал два таких листа – то есть ещё до разлепления, приложил их рубашками внутрь, и ламинация прошла как двусторонняя A4, фактически ламинируя каждую с одной стороны. В-третьих, я всё это нарезал на кружочки. В-четвёртых, набрал кучу одинаковых металлических крышек, и разрезал каждую – убрал загнутый край с резинкой, и сделав надрезы внутрь для загибов. В-пятых, налепил по центру все картинки (главное разлеплять самоклейку, а не отрывать ламинацию), и загнул лепестки на лицевую сторону изображений. Теперь у них гладкий, не колючий край, сама картинка выглядит как пластиковая и влитая (потому что держится не только клеем, но ещё и хорошо обжата), а обратная сторона – ну как крышка от банки, ещё на изгиб щёлкает.
Остальные картинки – также либо наклейки, либо ламинации. Та, что в начале поста – печаталась на двусторонней фотобумаге, и тоже была заламинирована (фоток нет, но выглядело бы также, как другие).
А «кстати» – потому что мой CLG v1, о котором идёт речь – тоже поддерживает этот эффект! Правда, картинка не расползается вширь, а становится меньше к центру. Полностью поддерживается .png прозрачность, и подходит для обработки и единственной картинки (задайте «внутреннюю границу»), хотя и предназначена лишь для коллажей.