Comments 19
Ох… Винапи для интерфейса / микс из си и си++
Ностальгия, я так писал году эдак в 2003, когда учился в техникуме. Разве что как-то с ходу понимал необходимость использования констант и знал оператор switch-case.
Клиент хочет приложение в полтора мегабайта, «как раньше», вместо приложения в полтора гигабайта, «как модно» — клиент его получает. Насчёт микса — это эмбеддерская деформация, в голове всё равно ассемблер, даже когда в коде он не фигурирует. Иногда плохо влияет на читаемость, поэтому периодически борюсь с.
Последнее предложение, надеюсь, шутка или ирония…
Про последнее предложение - ваш код выглядит как лаба первокурсника с кучей нарушения “best practices”. Если это черновик или программирование не ваш профиль, то достаточно было выложить всё это на гитхаб и дать ссылку, а не размазывать по статье.
С профдеформацией эмбеддед разработчиков многократно сталкивался когда собеседовал людей на предыдущем месте работы. Нам нужны были хорошие с++ с приемлемым знанием с99. И если в си люди более менее шарили, то с плюсовым кодом постоянно выдавали плохочитаемый спагетти код без каких либо признаков архитектуры и паттернов. Я такое категорически не поддерживаю. На си тоже можно (и нужно) писать чисто и аккуратно.
По поводу «клиент хочет» - нужно требовать техническую и бизнес аргументацию для каждой хотелки. Взять тот же Qt5 с каким нибудь upx и на выходе получится бинарь на 8-15 мегабайт. Не думаю что это так уж критично даже для десктопов 10-летней давности. В своё время ужимал Qt4 вообще до 4-х, включая gui, сеть и некоторые другие мелочи.
У меня идеологически другой взгляд, я саму идею превращать любой открытый проект в «ярмарку невест» и демонстрацию своих скиллов к „best practices“ не отношу от слова «наоборот». Ужасные вещи люди творят в опенсорсе из страха показаться кому-то какими-то не такими. И вываливают всё подряд до состояния «взглянули гости на пейзаж и прошептали: „Ералаш!“», а то вдруг кто-то всерьёз подумает, что они один из базовых операторов Си не знают.
А так — да, черновик. Но я смысла не вижу «выложить и дать ссылку», учитывая, что конечная цель этого проекта — разбор его тонким слоем по косточкам, после которого любой заинтересовавшийся сможет ту или иную часть (клавиатура для Андроида, для электронной книжки, консоли или приставки, поиск оптимальной раскладки — кому что интереснее) воплотить самостоятельно, с учётом того, что уж написать-то это читатель сможет получше и куда как более адаптированно к своим задачам. Черновик для разбора на отдельные главы, по которым чистовики будет кто-то ещё писать (а если и я, то я пока не знаю, чем именно из этого на практике воспользуюсь).
Там не просто так комментарии с половину кода и плюс пол-статьи — ПО на этом обеде вообще ни разу не главное блюдо. Пусть хоть как что оно выглядит, оно свой жизненный цикл уже по факту завершило — и не отобрало сверх минимально необходимого ни единой лишней минуты у главной задачи, то есть у туториала для DIY-щиков, которым может быть интересна идея, но вообще ну никак и ничем не пригодится готовый проект, максимум — отдельные части типа таблицы «спеллов».
А так-то, конечно, всё нормально, нельзя требовать от окружающих, чтобы они глубоко вчитывались в тему — у нищих слуг нет, поэтому я спокойно отношусь к тому, что люди судят по тому, «как выглядит», не учитывая всего этого. Вот в этом вот покойном проекте (тупо никого не заинтересовал) люди чуть ли не грудью оземь бились, увидев в синхронизации тредов на атомарках страшное слово Sleep (100), и даже ArchRAR->State=STATE_ERROR всего через одну строчку выше их не смутило. Ну что ж ещё делать в состоянии критической ошибки-то? Только спать в цикле, ожидая, пока вызывающий тред «примет твою отставку с поста». Реакция была в стиле «обожемой, он вставил задержку, чтобы симптоматически побороть рассинхронизацию тредов!» — сами придумали, сами обиделись. Необычайно показательный пример, поэтому и запомнился.
Не хотел вас так сильно задеть. Про Sleep я ничего не писал, можете перечитать мой комментарий и убедиться. Не ожидал что развернется такой флейм. Повторюсь - я за то чтобы разжёвывался качественный код. А ваш код сильно затрудняет чтение самой статьи, потому что если рассматривать его в отрыве от содержания, то это пример того как не надо писать код.
Изначально меня смутило изобилие констант, которые совершенно не читаемы человеку со стороны и куча if-ов в тех местах где намного понятнее (и чуточку быстрее) был бы switch-case.
Тогда может проще было описать просто логику работы? Или блок-схемой. Или упростить выкинув всё лишнее. Таки это не лаба, где надо отчитываться за каждую строчку кода.
Читаемость кода, когда он не влезает в окошко — примерно никакая, а понять его смысл и того сложнее. Человек — не контроллер, ему подавай меньше оптимизаций — больше простоты.
Какие-то микрооптимизации ради оптимизаций. В статье так и не раскрыт вопрос — "зачем", если есть простая полноценная qwerty клавиатура. Допуская, что цель — уйти от клавиатуры в сторону джойстика с двумя стиками, получаем необходимость иметь джойстик с двумя стиками под рукой.
Работая за ноутом страдаю от неполной клавиатуры и вынужден пользоваться комбинациями вида Shift+Fn+Del (Insert) и Fn+Up (PgUp) и мне не так удобно, как если бы не было этой вынужденной фигни с Fn. Но увы, на ноутбуках 13" редко попадаются полноценные клавиатуры. А тут просто мысленный эксперимент по взрыву мозга ради достижения скорости ввода, сопоставимого с обычной клавиатурой. Очень спорно, зачем такое хотеть, и как применить на практике.
Первое, что напрашивается — люди с ограниченными возможностями и ввод на девайсах вроде Steam Deck
Супермелочь типа GPD Win, электронные книги, чехол на мобилу с двумя ушками-приливами…
В принципе, можно на самом смартфоне вообще с тыльной стороны их сделать под указательные пальцы, тогда потеря экранной поверхности станет равна нулю (никаких занимающих пол-экрана экранных клавиатур, никаких ушей со стиками), но тогда будет слишком видно, кто что кому набирает. А уши под стик нужны крошечные.
На смарте для простого ввода текста (попытки писать код я, по очевидным причинам, не рассматриваю) тягаться по скорости с вводом свайпами невозможно. Ну разве что нейролинк подоспеет.
Супермелочь типа GPD Win, электронные книги, чехол на мобилу с двумя ушками-приливами…
Книги тоже сейчас часто на андроиде, так что метод там тоже подходит. На субноуте — тут сложнее...
В принципе, можно на самом смартфоне вообще с тыльной стороны их сделать под указательные пальцы,
Предлагаю сделать макет и попробовать, на сколько это вообще реально использовать ;)
А вообще я мечтаю о нормальном телефоне, который можно держать одной рукой, а не необходимо держать двумя. Хотя именно в эту сторону сейчас всё и идёт :(
Насчёт бучных клавиатур — про клавиатуру Лапера у меня тоже понемногу материал готовится.
А о какой клавиатуре из 4 стиков в начале статьи говорится?
Я как раз сейчас разрабатываю такую, но не аккордовую, вместо аккордов использую круговые движения, в настольном варианте можно будет печатать двумя руками поочерёдно указательными и средними пальцами, или работать одной рукой, когда вторая занята мышью, ну или двумя большими пальцами если клавиатура в руках. На двух стиках получается 12 смещений в 6 сторон, и 24 смещения в сторону и переход в соседний сектор, и по 24 на каждый последующий сектор, можно разместить сколько угодно кнопок.
Цель разработки — заменить громоздкую клавиатуру на сверхкомпактную, при этом будет высокая скорость печати, появляется возможность работы одной рукой двумя или одним пальцем, вместо джойстиков можно использовать тачпад или сенсорный экран, с сохранением возможности печати вслепую. На двух руках при использовании аккордов можно будет сделать псевдостено ввод, за одно движение печатать сразу несколько частых сочетаний букв.
Я честно пытался её найти, про неё тут писал её непосредственный создатель (если память не врёт), но поиск ничего не дал О_о хотя недавно вроде её в комментариях снова вспоминали.
Она уже довольно-таки давно известна, появилась чуть ли не во времена «первичного неприятия» экранных клавиатур, когда все требовали аппаратную QWERTY, а экранные клавиатуры только завоёвывали рынок (ну или чуть позже, когда они его завоевали — но фанаты тактильного отклика хотели взять реванш). Но четыре стика — всё-таки довольно много, и как-то оно не взлетело, подозреваю, что как раз из-за этого.
Ваш вариант радует возможностью работать одной рукой :) мой, за счёт отказа от круговых движений в пользу более коротких и грубых 90-градусных линейных, требует всегда двух рук (ну или хотя бы двух пальцев, но на практике стики удобнее всего ворочать именно большими). А больше всего радует то, что можно сделать оба варианта сразу, потому что разница чисто софтовая, на уровне выбора режима работы :)
Ещё у меня где-то лежали наработки по эдакому «аккордеончику», где на задней стенке 8 (или 6, не помню уже) кнопок. Половина под левую руку, половина под правую. Но я на него забил по той причине, что он требует строго фиксированного положения телефона в руках — горизонтально, а-ля гармошка, и аккуратной работы всеми пальцами одновременно. Стики, даже в моём варианте — хоть и требуют двух рук, но хотя бы можно держать криво-косо, лишь бы дотягиваться (вроде бы разница невелика, но первая же попытка чатиться, валяясь на диване, покажет эту разницу очень остро).
Я клаву делаю на своём железе, стики от PSP, контроллер Pro Micro, подключается к компьютеру через USB, операционная система видит его как стандартную клавиатуру, будет работать везде. Но это решение только для печати текста, не для игр.
Для уже готовых игровых контроллеров можно сделать переходник, который будет перехватывать его действия, и преобразовывать в необходимые USB HID устройства, то есть, можно сохранить работу самого джойстика для игр, а клавиатуру включать специальной комбинацией кнопок или стиков.
Готовые контроллеры обычно имеют только четыре положения под правым пальцем (четыре кнопки), то есть прокатывают максимум для моего варианта с его квадратно-гнездовыми аккордами. А если самостоятельно делать двухрежимный («клавиатура/пад»), то появляется ещё одна мысль…
Жаль, я не могу точно сказать, насколько это адекватно, потому что практически не играю на геймпадах и не представляю, насколько там задействованы сложные комбинации из кнопок под правым большим пальцем. Но на всякий случай изложу: мысль в том, чтобы накрыть эти четыре кнопки большим плоским поворотным «блином»-энкодером, который можно большим пальцем вращать достаточно точно и, главное, без ограничения угла поворота, который есть у всяких мышиных колёс (их нужно периодически «перехватывать»). То есть можно поставить палец один раз и крутить, как диджей пластинку, туда-сюда сколько нужно. Плюс возможность нажать на край посильнее и наклоном этого энкодера продавить кнопку под ним.
Итого: почти стандартный геймпад, под который заточено управление у аркад (но «цветные» кнопки нельзя произвольно нажимать — только по одной или максимум две соседние, поэтому «почти»), плюс эдакая «одномерная мышь», которая в обычные (неконсольные) шутеры хотя бы на уровне оригинального первоDoom позволит играть (по вертикали там обычно самонаведение).
Ваш вариант клавиатуры сможет работать с такой «вертушкой» вместо второго стика? В теории там даже без учёта показаний самого энкодера можно имитировать не 4 положения (как со стандартными кнопками), а 8 — если зажать край и вращать диск энкодера, он будет зажимать по очереди зелёную, зелёную с жёлтой, жёлтую, жёлтую с синей и т. д., причём почти таким же движением одного пальца, как если бы это был второй стик (если бы были стандартные «голые» кнопки, потребовалось бы четыре пальца, чтобы делать кнопками подобия круговых движений). То есть теоретически оно должно заменять второй стик в любом случае — но я могу не знать каких-то важных деталей.
Да, эти стики могут работать как энкодер, ещё и с определением угла отклонения, без сложной механики, и ещё можно определять когда его отпускаешь. Получается миниатюрный энкодер, на который можно повесить множество функций, например: если отклонил вверх, это регулировка громкости звука, если вниз, это регулировка яркости, влево — перемотка песен, вправо — переключение рабочих экранов, на одном миниатюрном стике, размером с клавиатурную кнопку, получаем 4 кнопки и 4 энкодера.
Я пробовал стелать магнитный энкодер из маленького шатового двигателя, но он по габаритам гораздо больше, и его сложно считывать, механический энкодер при активном использовании быстро выйдет из строя, конкакты начинают дребезжать, а стик от игроприставки дешёвый, компактный, долговечный.
Мне её нашли, помогли :) Там не 4, а два ряда по 4 :)
https://habr.com/ru/companies/octodon/articles/210956/
Поэтому и не взлетело. Этот аккордеон размером с четыре телефона? Серьёзно?
Про Октодон знаю, двухстиковая будет компактнее телефона, можно сделать на замену телефонной клавы для печати вслепую.
И, что радует, не нужно сильно много нестандартного выдумывать: аппаратно можно сделать просто накладывающуюся сзади «скобку», цепляющуюся за верх и низ, типа такого неполного чехла, а на ней — два стика, которые с точки зрения протокола — обычный геймпад, воткнутый в OTG. Оно получается небольшое и, при раздвижной скобке, достаточно универсальное. Можно даже не скобку, а гибкую наклейку с шлейфом :) Короче, что-то такое, чтобы «на спину» стики прилепить, обеспечив возможность при горизонтальном положении телефона орудовать по ним средними пальцами :) и, возможно, дотягиваться как-то указательными при вертикальном положении телефона :-/
И дальше уже на самом Андроиде конвертировать шатания совершенно стандартных джойстиков сообразно любому из наших протоколов (аккорды, вращения, да что угодно из выпадающего списка) и любой раскладке :)
Жаль, народ не возбудился, если бы краудсорсово массово запустили подбор — возможно, нашли бы комбо на общую сумму менее 2.5 движений. Но это сначала нужно «более лучшую» статистику частотности найти, правда. Без «ЪУЪ», как минимум. Была бы хотя бы русская раскладка готова, я бы хотя бы себе её сделал.
72 клавиши из 8 положений стиков