Обновить
34
0
Виталий Новичков@Wohlstand

Инженер-Программист С++

Отправить сообщение

Ctrl+Shift

Одним мезинцем жму обе клавиши и вполне удобно (мне лично), и это сочетание я использую для переключения языков. Но хотя не спорю, что зависит от размеров и комплекции рук/пальцев разных людей, и от типа клавиатуры.

От себя тоже добавлю:

Использую у себя корпус от компьютера "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, которых я мал по малу выпиливаю); либо песочница для собственных костылей и для себя; либо конкретно, чтобы вкладываться в оригинал.

А как же энтузиасты, которые не просто находят баги, а ещё исправляют их самостоятельно и отправляют разработчикам патчи? У меня как раз именно так и происходит, одна часть жалоб от простых пользователей, которые тупо нашли баг, но исправить не могут, или даже не знают её причины; и другая часть - те, кто присылает мне патч с исправлением и объяснением причин бага. С первой частью разработчики чинят ошибки в зависимости от настроения и приоритетов, а со второй частью разработчики даже спасибо говорят, если всё сделано всё чётко и качественно (ага, потому что сразу на блюдечке подали готовый результат, остаётся только заценить и принять или отправить лесом).

Microsoft XNA. Не движок, но фреймворк для создания игр на C#, больше не поддерживается. Но на нем создают довольно много разных инди игр и по сей день, одна из самых популярных это Stardew Valley.

Всё благодаря проекту 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 продаёт, давно я там не был и забыл уже...

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Зарегистрирован
Активность

Специализация

Фулстек разработчик, Разработчик игр
Старший
C++
Git
Cmake
Linux
Bash
Unix
ООП
Базы данных