Виталий Новичков@Wohlstand
Инженер-Программист С++
Информация
- В рейтинге
- Не участвует
- Откуда
- Москва, Москва и Московская обл., Россия
- Зарегистрирован
- Активность
Специализация
Фулстек разработчик, Разработчик игр
Старший
C++
Git
Cmake
Linux
Bash
Unix
ООП
Базы данных
Одним мезинцем жму обе клавиши и вполне удобно (мне лично), и это сочетание я использую для переключения языков. Но хотя не спорю, что зависит от размеров и комплекции рук/пальцев разных людей, и от типа клавиатуры.
От себя тоже добавлю:
Использую у себя корпус от компьютера "Helios Profice VL 550" 15 августа 2003 года:
А внутри:
Intel Core i7-11700KF
32 ГБ оперативки
Видео RTX 3060
Несколько жёстких и твердотельных дисков под разные нужды
Очередное доказательство того, что стандарт ATX настолько удачный, что в корпус 2003го года свободно помещается железо 2021-2022х годов.
В таких случаях всегда приходит в голову поднимать самопал, это либо собственный сервер Gitlab, либо легковесный Gitea, либо вообще голый Git (ssh + cgit + голые репы) для личных проектов. Кстати, разработчики проектов на Mercurial так и поступили, когда многие хостинги отказались от Mercurial вовсе (Google Code сдох, потом Bitbucket совсем отказался от Mercurial-репозиториев, потому что большинство использует именно git).
Сначала я использовал QMake в своих проектах (даже не-Qt-шных), и потом как мой основной проект начал разрастаться, то пользоваться QMake без суровых костылей стало невыносимо. И тут я перевёл все свои основные проекты на CMake, потому что эта система намного более универсальная, более гибкая по функционалу, и, следовательно, более сложная в использовании. По себе я скажу так:
Для маленьких личных проектов, QMake шикарен, не перегружен и удобен. Если надо создать всякую мелочёвку для личных дел, использую QMake до сих пор.
Для больших проектов лучше всё же CMake, потому что выше вероятность возникновения уймы узких мест, с которыми QMake не справится вообще. Использую CMake для создания публичных проектов, с учётом того, что их можно будет собрать под огромный спектр платформ, особенно тех, куда Qt-модули вообще нини.
Над эмулятором чипа YM2612 я сделал библиотеку MIDI-синтезатор libOPNMIDI, и как раз разного рода документации встречал и хорошо понимаю разницу между чипами. Дополню от себя:
По поводу встроенного ЦАП, чтобы выводить на него, надо иметь ИДЕАЛЬНУЮ синхронизацию, чтобы посылать сэмплы на ЦАП-канал. Если это делать процессором, звук будет плавать. На звуковых картах обычно используется буферный чип, от которого уже звук и идёт на ЦАП, а программы лишь копируют в него кусочки буфера. Тут сам ЦАП напрямую, и тут надо каждый сэмпл посылать строго вовремя, иначе, как я уже сказал, звук поплывёт.
Про регистры, у OPL и OPN сами наборы регистров разные, адреса разные, и разные возможности, но они в общем похожи:
Имеется характеристики нарастание, затухание, стабиль и отпуск.
У OPN имеется два затухания: первое затухание такое же как и у OPL, а второе затухание идёт во время стабильной фазы.
На OPL указанные характеристики имеют диапазон от 0 до 15, а на OPN, нарастание, затухание-1 и затухание-2 имеют диапазон от 0 до 31.
На OPL имеется два НЧГ с постоянной частотой: самый быстрый выполняет вибрато частотой, и самый медленный выполняет вибрато громкостью. На каждом операторе имеется два флага, каждый из которых можно включить частотное (вибрато) и/или амплитудное (тремоло) вибрато.
На OPN имеется один НЧГ, но с возможностью регулировать частоту, выбирая один из 8 вариантов (от 3,98 до 72 герц). Амплитудное или частотное вибрато настраивается отдельно для всего канала уровнем чувствительности, и для каждого оператора можно установить один флажок, чтобы применять к нему модуляцию.
На OPN имеется ПУЗГ-ГО (SSG-EG), функция, которая позволяет серьёзно изменить поведение генератора огибающей, устанавливая четыре флажка в разные состояния. В документации к Sega Megadrive эта фукнция обозначена как "проприетарная". Такая возможность используется в музыке к игре Asterix & Obelix the Great Rescue. На кривых эмуляторах чипа, по типу старого GENS, музыка будет играть очень криво и глючно.
OPL2-OPL3 чипы поддерживают разные формы волн на каждом оператре. На чипах семейства OPN поддерживается только синусная волна. Также на чипе OPL1.
Чип OPL3 поддерживает 18 каналов двух-операторного синтеза, а также поддерживает возможность включить 4-х операторный сиинтез с 6-ю каналами. Также поддерживается режим ударных (который был ещё на OPL2-чипе), то есть, занимаются два канала под пять ударных инструментов - бочка, рабочий барабан, тарелка, шляпа, и том.
Чипы семейства OPN чисто 4-х операторные. Чип OPNA - это более прокаченная версия OPN2, у него есть встроенный простой звукогенератор на 4 канала (прямоугольник или шум), а также 6 ударных инструментов на основе встроенных предзаписанных в ПЗУ чипа ADPCM-кусочков.
Чипы OPN-семейства поддерживают незначительное тоновое смещение на каждом операторе, чтобы звук не был монотонным и плавно переливался во время удержания длинных нот.
На чипе OPN-семейства поддерживается 8 разных алгоритмов 4-х операторного синтеза. На OPL3-чипе поддерживается только 4 при нормальном 4-х операторном синтезе, а для поддержки остальных 4-х вариантов нужно костныльно использовать двухоператорный синтез, занимая два канала. Однако, некоторые виды алгоритмов, возможные на OPN-чипе, вовсе недостижимы на OPL3-чипе.
На OPL-чипе уровень громкости каждого оператора в логарифмическом диапазоне между 0 и 63. На OPN-чипах шире диапазон (от 0 до 127), но логарифмическая огибающая более глубокая, поэтому звук заглохнет ближе к среднему значению.
На OPL-чипе имеется масштабирование огибающей (короче на высоких нотах, длиннее на низких), которое может влиять не только на масштаб ошибающей, но и на уровень громкости (чем выше тон, тем тише звук). На OPN-чипах масштабирование работает только по длине огибающей.
Формула рссчёта частоты отличается одним коэффициентом (зависимый от частоты работы выбранного чипа) и шириной значений октавы и герцовой частоты.
Компания-разработчик - "The Qt Company", а не "Trolltech".
"Trolltech" это её раннее название, которым называлась компания в 90е годы вплоть до продажи её бизнеса компании Nokia в 2008м году и дальнейшей продаже бизнеса компании Digia к 2012му году.
Имелось ввиду, не очень удачное сравнение. По большому счёту, вне работы тот же инженер вполне может заниматься и моддингом существующих авто (если не строить новое авто с полного нуля). И да, создать собственное авто можно легко (не только проект, но и физический прототип), но вот на дороги общего пользования его легально можно пустить после проверок на соответствие всем местным законам (и безопасности, и сигнализации, и т.п.). И, как уже сказано выше, проверки стоят недёшево, и следовательно, заплатить за них можно если денег предостаточно.
Для чего тогда существуют свободные проекты, развиваемые энтузиастами в своё свободное время?
Имено так я и делаю:
На работе выполняю поставленные работодателем задачи. Тут естественно, и требования к выполнению задачи, и возможно ограничение по сроку выполнения задачи, а также ещё и паника в предверии очередного показа продукта высшему руководству.
В свободное от работы время, занимаюсь своими личными проектами с открытым исходным кодом, кооперируясь с различными другими разработчиками. Здесь, в отличии от коммерческих проектов работодателей, я сам себе царь, и сам решаю, как быстро, когда и как реализовать то или иное решение, обсуждая попутно с товарищами и с пользователями об эффективности / оптимальности выбранного решения. Здесь я просто иду к цели (именно, добиться от проекта должной работоспособности), и не гонюсь за сроками. Редко бывает, когда объявляется некий коммерческий заказчик, который предлагает солидное пожертвование дабы в повышенном приоритете реализовать желаемую функциональность. Но всё же, это не так больно, как разработка будучи сотрудником какой-то компании.
У меня также есть друг, который в одиночку построил большой проект по Discord-боту с платными сервисами, и неплохо на этом зарабатывает. Тоже, сам себе царь, и сам решает, как и в каком виде реализовать ту или иную функциональность, и т.п. И также полностью сам решает о том, как распределять время выполнения своей работы. Кроме, разве что, когда происходит авария, и ему экстренно приходится восстанавливать работу своего творения.
P.S. Недавно я рассказал одной знакомой американке про Никитино сравнение русскоязычной и иностранной аудиторий, и про мою теорию о том, что в любом локальном (не международном) сообществе будет такое же быдло с такой же токсичностью и ненавистью, и она подтвердила.
То есть: Никита сравнивал локально-ориентированное русское сообщество с международным. И я чётко утверждаю, что сравнение в корне не правильное, потому что:
Международное сообщество, призванное объединять людей со всего мира, состоит из людей, для которых английский язык неродной, они его специально изучали, чтобы на нём общаться с другими иностранцами и читать статьи/книги, смотреть фильмы/видео, и т.п. Как я уже говорил, иностранные языки изучают и знают преимущественно образованные люди, простой народ попросту забивает на язык и живёт своей беззаботной жизнью (даже в европейских странах это обыденность). Поэтому всё лютейшее быдло напрочь отсекается, ибо они попросту не знают английского.
Локальное сообщество (и русское, и американское, и немецкое, и китайское) состоит из людей своей страны, или говорящей на одном языке. Здесь естественно будут попадаться люди все подряд, и образованные, и токсичные ненавистники. Абсолютно не зависимо, какая страна и какой язык, сам факт, что платформа ориентирована на локальное сообщество. И, как я уже сказал, американка чётко подтвердила, что у неё в местных платформах абсолютно такое же быдло с такой же токсичностью и такой же ненавистью.
Поэтому, я крайне рекомендую Никите залезть на локальные форумы разных стран и самостоятельно убедиться в этом. Те же Twitter и Facebook давно считаются помойками (в плане
фауныкондингента).Сразу вспомнил "тэн" это в японском 天「てん」 это "небеса", и я сразу вообразил, что могло бы быть 天チャット "ТэнЦятто" - "небесный чат".
А как же "Профессионалы.Ру"? Эта сеть уже существует очень давно. Ещё был т.н. "Мой Круг" от Яндекса, который потом перебрался на Хабр и стал "Хабр-Карьерой". Ещё наверняка что-то есть, о чём я не знаю...
Ну это ещё смотря по какой причине и как форк бы создан: или форк был создан, чтобы продолжить разработку брошенного проекта (воскресить его) (первое, что пришло в голову, это проект TrueCrypt, который был внезапно похоронен своими создателями, и который продолжил жизнь как VeraCrypt); либо чтобы сделать альтернативное решение, но базированное на первоначальном варианте (как пример, мой проект libADLMIDI, который я создал на основе adlmidi от Bisqwit. В результате, мой проект значительно отличается от оригинала и имеет значительно более широкий функционал и более качественную работу, хоть и сохраняет остатки первозданного ядра оригинального adlmidi, которых я мал по малу выпиливаю); либо песочница для собственных костылей и для себя; либо конкретно, чтобы вкладываться в оригинал.
А как же энтузиасты, которые не просто находят баги, а ещё исправляют их самостоятельно и отправляют разработчикам патчи? У меня как раз именно так и происходит, одна часть жалоб от простых пользователей, которые тупо нашли баг, но исправить не могут, или даже не знают её причины; и другая часть - те, кто присылает мне патч с исправлением и объяснением причин бага. С первой частью разработчики чинят ошибки в зависимости от настроения и приоритетов, а со второй частью разработчики даже спасибо говорят, если всё сделано всё чётко и качественно (ага, потому что сразу на блюдечке подали готовый результат, остаётся только заценить и принять или отправить лесом).
Всё благодаря проекту FNA, который его возродил из пепла. Теперь даже Terraria, некогда созданная с помощью XNA, теперь сидит на FNA, и даже имеет нативную сборку под Linux (установил игру из Steam и увидел в файлах факт использования FNA).
Однажды, в 2014м, году брат притащил этот вирус на флэшке из универа, и этот гад заразил мою Windows 7 и, считай, полностью убил её: из-за повреждений, оставленных вирусом, ось стала непригодной для работы вовсе. К этому моменту я параллельно работал на Linux Mint, мал по малу осваивая ось, и после того ключевого момета, Linux Mint стал моей основной системой. Но это ещё не всё: вирус зарылся на моём файловом архиве и спрятался по щелям, в точности как колония тараканов. Я ещё пять лет выкорчёвывал её от туда, случайно находя следы её активности там, где я вообще её не ждал. Потом мне это надоело, и я прошёлся ClamAV-ом по архиву, чтобы удалить всё, что было съедено Нештой. Но и это не помогло, потому что я нашёл ещё одну папку где Нешта спряталась, и там её выкорчёвывал, но на этот раз уже окончательно. Нешта за это время успела мне убить одну из виндовых виртуалок (пришлось полностью переустанавливать), а также испортила мне Wine-бутылку, которую тоже потом пришлось полностью пересобирать.
Спасибо, уже прочитал, и даже написал комментарий в ответ. :)
Ух ты! Интересная статья!
Как-то раз я брал PVS Studio для работы над своими проектами, но так и не смог его нормально использовать (другие дела, а также трудности с интеграцией анализатора в среду Qt Creator при CMake-проекте), но очень хочется взять его на вооружение. Помню давным давно я брал Trial-версию на две недели (тогда ещё не было лицензии для OpenSource, и тогда мой проект был ещё на QMake), и я смог исправить несколько багов и выучить урок, который я дальше стал использовать уже в новом коде.
Что по ошибкам:
Фрагмент 1, 2, 4: в жизни бы не заметил, либо глаз и так замылился от стольких условий в ветках, и да, очередное подтверждение байки (которая давно уже ходит в сообществе SMBX), что Эндрю знатно выпивал, пока писал код игры.
Фрагмент 3: Если бы не мусор в старых уровнях, фикс бы выжил. Однако, я решил сделать альтернативый метод управления автопрокрутки, более совершенный и более удобный. У старого метода есть огромный недостаток - (при корректной работе кода) любое другое событие моментально собьёт автопрокрутку, потому что здесь нет различия того, включать или выключать автопрокрутку, и куда её вести. С новым методом есть чёткая галка, "назначить автопрокрутку", и по умолчанию галка снята, значит, на автопрокрутку влиять никак не нужно.
Фрагмент 5: Это уже мой косяк (удаление сохранений реализовал уже я в своём порте, в оригинале SMBX-игры не было такой возможности). При этом, очень серьёзный баг: из-за него, если попытаться удалить сохранение, зайдя в режиме двух игроков, пользователь будет заблокирован в меню, потому что логика его не выпустит из него никак.
Фрагмент 6, 7, 8: И снова Эндрю в своём репертуаре.
Фрагмент 9: Это суровые и грязные костыли, применяемые Эндрю в VB6, таким образом он решил "закомментировать" часть кода, просто выставив условие в ложь. По хорошему, здесь нужно выставить `#if 0 / #endif` на весь блок и не повторять сию дурь в новом коде. Там был код, который позволял в ранних версиях SMBX возродить второго игрока, пнув любой блок. Однако, потом Эндрю сделал так, что второй игрок просто спускается с небес и всё, этот код больше не нужен стал.
Фрагмент 10: уже и не помню, скопировал ли я код с VB6, или сам так по ошибке написал, оно верно.
Фрагмент 11: Эта логика отвечает за то, как часто будут повторно открываться блоки с монетками, если играть за Кинопио (за Тоада). Проверка whatPlayer безполезна, потому что whatPlayer всегда идёт от 1 до maxPlayers, и если выходит за пределы диапазона - срабатывает ловушка выхода за пределы диапазона Player (хотя Player[0] есть, по факту, не используется, либо как буфер). Поэтому, тут лучше поставить `IF_INRANGE(whatPlayer, 1, maxPlayers)`, чтобы проверка диапазодна была чёткой.
Фрагмент 12: И этот код тоже из оригинала:
Фрагмент 13: Это мой косяк, там я выуживаю размер изображения из JPEG-картинки, не декодируя её.
Фрагмент 14: Неисправленный косяк при переносе с VB6, всё потому что в VB6 любая логика всегда работает через побитовые операции.
Фрагмент 15: Очень давний баг, в этом модуле, мой.
Фрагмент 16: Эндрю таким убогим способом рассчитывал коллизии мышки со строчками меню, рассчитывая длину надписей. Я уже давно чищу код здесь, и в ближайшем будущем вообще собираюсь заменить код меню на новый, более практичный и универсальный, ибо с этим невозможно нормально работать, чтобы добавлять новые разделы и т.п...
Большую часть всего упомянутого исправил, благодарю за рецензию!
Смотря какой баг, и смотря изменится ли логика работы формулы после исправления или нет. Если изменится, значит, придётся сделать очередной флаг в compat.ini и добавить на отключение в режим совместимости, чтобы логика была такая же, какая и была.
Мне один друг рассказал, что это костыльная попытка добиться синхронности без вертикальной синхронизации, потому что окна в Windows обновляют орисовку именно с такой частотой. Я сам считал это значение очень странным ещё задолго до открытия исходников игры.
Из любопытства глянул, в американском подразделении, у них напитки наоборот от CocaCola:
Проверил Макдональдс, там тоже у американцев одна CocaCola, однако, спросил у друга (сам не смог проверить), американский KFC тоже продаёт напитки от PepsiCo, говорит, что они заключили контракт очень давно.
P.S. И наш Макдональдс тоже CocaCola продаёт, давно я там не был и забыл уже...