Создание опытного функционала

velkin velkin

Импотенты компьютерной индустрии


У меня раньше были темы.
1. Каких программ вам не хватает?
2. Заинтересованность игроков в компьютерных играх

Уже не первый год и даже десятилетия идут обсуждения, что компьютерная индустрия не развивается. Большие компании не рискуют создавать опытный функционал. У них и такой задачи по сути нет. А это типичный пример, когда потребность на рынке есть, а услуг никто не предоставляет.

Люди работают за деньги. Можно ли рассчитывать, что появится то, что я или кто-то другой как пользователь нафантазировал у себя в голове. Скорее всего нет, а если есть какое-то решение, то оно не будет всеобъемлющим, сочетающимся с другими решениями.

Пирамида потребностей людей


Мне вспоминается Пирамида потребностей по Маслоу, то есть пирамида потребностей людей.

1. Физиология. еда. вода. сон.
2. Безопасность. жильё. доход. защита.
3. Общество. общение. дружба. семья.
4. Признание. уважение. одобрение. достижения.
5. Творчество. познание. создание.


Собственно не то, чтобы функционал было сложно создать, хотя для новичка это не легко.
1. Физиология. На создание функционала потребуется время, а так же повышенный расход еды, воды и сна.
2. Безопасность. Если это работа для себя, то понятное дело за это платить не будут, это просто потребление уже существующих возможностей.
3. Общество. Скучно создавать что-то без общения, а я напоминаю пункт 2 плюс ко всему никто за это не платит.
4. Признание. И даже если сделаешь что-то интересное и никому не покажешь, то и ответных отзывов не будет.
5. Творчество. Как раз из разряда того, что хочется что-то создать, только я этим закончил, а по идее в программировании с этого всё и начинается.

Почему люди так любят политику?


Потому что они не тратят особых мозговых усилий. Им не нужно принимать сложные решения, рассматривать множество вариантов, разбирать старое, собирать новое. Да и ответ им по сути уже спущен сверху с помощью СМИ преимущественно по географическому признаку. Вы сами знаете, что люди те же животные, которые сражаются за территории.

Почему люди так любят игры?


Я уже когда-то думал, что мне всё надоело. Но потом ещё играл в Left 4 Dead 2 с модами, без модов игра стрёмная. Потом ещё вышел Overwatch, в него сколько-то играл. Ещё пытался играть в кучу других игр, вроде Cities Skylines, Diablo 3, Dead Or Alive 5 и прочее. В Cities Skylines лично для меня играть интереснее, чем программировать, но и то и другое надоедает.

А сейчас иногда играю только Heroes of the Storm в основном за чистых магов, по сути как в Diablo 3.

http://files.rsdn.org/99832/fuctional_01.png

http://files.rsdn.org/99832/fuctional_02.png

Размышления о функционале


И чтобы не засорять каждый день форум новой темой, я решил создать опытную тему в которую буду сбрасывать размышления и описания нафантазированного функционала и возможно даже вместе с решением. Сначала функционал, если получится его как-то формализовать, тогда можно будет накодить решение.

Для чего это скидывать на форум? Потому что мне одному даже размышлять над функционалом будет скучно. А по Маслоу в одиночку выходит, что я только расходую все виды ресурсов и ничего не получаю взамен.

Переход на другие ресурсы


Некоторые условно заинтересованные лица ещё говорят, давайте куда-то перейдём, в какой-нибудь чат или ещё куда, но обычно это не работает. Даже мне непривычна другая среда общения. Плюс в реальном времени ещё есть такой нехороший эффект, когда в тех же ММОРПГ вместо приятной игры людей заставляют заходить и дрочить. Например, в определённое время обязательное убийство босса, хоть убейся, но ты должен прийти и помочь клану.

Конец это начало


Вот такая сегодня тема. Я уже не раз создавал подобное в своём rsdn блоге, просто с более конкретными целями. А сейчас хочу впихнуть в одну тему больше разнообразия. Сами понимаете, инклюзивити, дивёрсити. В общем ставьте лайки и подписывайтесь, а я пока подумаю с чего начать.
velkin
velkin Запись печатания текста
28.08.2023 05:45

Запись печатания текста


Давайте начнём с записи текста при печатании. Идея довольно простая, хотя я не говорю про реализацию.

Предположим у нас есть.
1. Текстовый редактор.
2. События клавиатуры.

Пока не касаемся других событий.
3. События мыши.
4. События выделения текста.
5. События вырезания, копирования, вставки.

По сути нужно перехватить события клавиатуры.
1. Переопределение виртуального метода события нажатия клавиатуры.
2. Подключение сигналов/слотов.

И установить.
1. Временной штамп.
2. Или смещение от какого-то начального временного штампа.

А что, если пользователь.
1. Перевёл часы, пока печатал текст.

Потому даже если все записанные временные штампы абсолютны.
1. Смещение времени должно зависеть хотя бы от начала работы программы.
2. Нужно учитывать последовательность временных штампов при предыдущих запусках.

Если подумать, абсолютный временной штамп не особо и нужен. Но в распределённой системе его всё равно придётся использовать. Я может и забегаю вперёд, но здесь главное, чтобы в одном логе записи всё шло строго по порядку.

Виды временных штампов


1. Абсолютный временной штамп.
[2023.08.28 21:00:00]
2023.08.28 21:00:00
2023.08.28 21:00:01
2023.08.28 21:00:02

2. Временной штамп относительно запуска программы.
[2023.08.28 21:00:00]
0
1
2

3. Временной штамп относительно предыдущего события клавиатуры.
[2023.08.28 21:00:00]
0
1
1

Положение курсора


Видимо следующее, что надо записать положение текстового курсора. Кто не знает, это выглядит как мигающая каретка. Не путайте его с курсором мыши.

Вспомнил ещё такую тему, некоторые люди возмущались, что каждая клавиатура или мышь не имеет собственного курсора, а использует общий. Типа это признак того, что софт и в частности операционки не развивались. Как раз эти импотенты, ничего нормально сделать не могут.

Видимо здесь можно применить такой же принцип.

1. Абсолютное положение от начала.
"WASD"
W 0
A 1
S 2
D 3

2. Относительное положение от предыдущего положения.
"WASD"
W 0
A 1
S 1
D 1

Виды операций


Понятно, что всё не может быть так просто, ведь мне надо ещё записать вид операции.

Вспоминается принцип CRUD.
┌─┬──────┬──────┬──────┬──────┬───────────┐
│1│Create│Read  │Update│Delete│Базы данных│
├─┼──────┼──────┼──────┼──────┼───────────┤
│2│Insert│Select│Update│Delete│SQL        │
├─┼──────┼──────┼──────┼──────┼───────────┤
│3│New   │Read  │Write │Delete│Объекты    │
├─┼──────┼──────┼──────┼──────┼───────────┤
│4│Add   │Read  │Write │Remove│Списки     │
└─┴──────┴──────┴──────┴──────┴───────────┘

Но у клавиатуры же всё не совсем так.

Для удаления есть клавиши.
1. Delete.
2. Backspace.

Они ведут себя.
1. Одинаково, если есть выделение.
2. По разному, если его нет, то есть просто каретка с позицией.

Наверное можно было бы.
1. Хранить символ или строку с типом операции CRUD, не будь вот таких различий.
2. А так придётся хранить конкретное нажатие клавиш.

Проверка идей на практике


Если говорить о практике, надо посмотреть, что там выводит QKeyEvent. Потому что лично я буду проверять идеи на Qt.

А если вы где-то уже видели реализацию описываемых идей, напишите название программ.

Как говорится продолжение когда-нибудь следует.
1. Или продумывание этой идеи.
2. Или описание следующей.

Я ешё забыл сказать для чего надо записывать печатание текста, но я думаю вы сами догадаетесь. Да и в принципе это просто размышления в реальном времени, чтобы мне не было скучно.
velkin
velkin
30.08.2023 12:17

Незаконченный код против программиста


Я тут понабирал всякую ерунду, поиграл в игру и подумал, а в чём отличие незаконченного кода от говнокода. Можно ведь дойти до того, что незаконченный код говно, легаси говно. А это к тому, что я объяснил вначале, что эта тема главным образом для того, чтобы мне не было скучно исследовать возможности опытного функционала, который я хотел бы сделать, но не сделал, потому что мне было скучно.

Если так подумать, то программист это даже не тот, кто разбирается в коде. Хотя не нужно делать неверных выводов, в коде нужно уметь разбираться. Но некоторые говорят, что для успешного успеха в профессии должно быть интересно. А интересно обычно, когда ничего не знаешь, а когда знаешь уже неинтересно. Вот и получается, что программисты это люди, которые не смотря ни на что просто умеют херачить код днями на пролёт.

Те кто играют в игры, они ведь не то, что не задумываются над хорошо они играют или нет, они просто играют, играют и играют. Кто-то играет в короткие сессионки, кто-то дрочит днями на пролёт. Понятно, что если бы люди вместо игр или написания своего сверх ценного мнения в разделе политика программировали, они может быть уже написали шедевр мирового софтостроения.

Но нет, вон в играх выдают награду нарисованным золотом, кристаллами, осколками, лутбоксами, у кого на что хватит фантазии. Или вон ещё пишут победа и интерактивно повышается опыт и уровни, чтобы игрок наглядно видел, что да, он прямо сейчас становится лучше, что он победитель, а не неудачник как в жизни, ведь он победил специально ослабленного компьютерного бота.

А в программировании, ну я не знаю, получишь программу и всё. По крайне мере конкретно здесь исследуется функционал и какого-то другого вознаграждения не предполагается. А потом вообще забудешь, что такое когда-то писал.

В итоге я решил публиковать незаконченный код, хотя бытует мнение что.
1. Программа никогда не бывает закончена.
2. Совершенство достигается не тогда, когда нечего добавить, а когда нечего убрать.

http://files.rsdn.org/99832/fuctional_03.png

Версионирование незаконченного кода


Есть разные системы нумерования версий кода.

Из классики


Major.Minor.Patch

Выпуск. Для внешних пользователей.


1. Главная версия. Major. Старшая версия.

Относится к релизу, то есть публикации программы в свободный доступ, например, для продажи. За главную версию можно заново срубить деньжат с людей. Или как в Overwatch 2 урезать Overwatch 1 и сменить систему монетизации по сути кинув людей. В коммерческих проектах считается, что первая версия это первый выпуск программы. А в некоммерческих любят начинать с нулевой версии. И вроде как смена главных версий должны нести радикальные изменения программы. Но комерсы есть комерсы им ведь плевать не технологии, у них задача заработать деньги.

2. Незначительная версия. Minor. Младшая версия.

По сути это якобы незначительные обновления, тоже для свободного доступа за которые можно брать деньги, а можно и не брать. Типа вот мы какие добренькие, не берём с тебя за незначительные обновления деньги, только за значительные. Или всё же берём деньги и за незначительные обновления, а почему бы и нет. Номер сменился? Сменился. Деньги на бочку.

- Ты будешь платить пидор!?
— Я заплачу, я заплачу!
— Заплатишь. пидор, заплатишь!


Разработка. Внутри компании разработчика.


3. Заплатка. Patch (maintenance, age, micro). Функционал.

По сути это версия не для выпуска, а наращивание функционала разработчиком. Но в наше время цифровой дистрибуции люди привыкли, что можно постоянно обновлять версии. А не коммерческим разработчикам, которые работают на энтузиазме тем более плевать на проверку качества. И вот пошла такая ерунда с публикацией ещё одной цифры. Например, я использую Qt 5.9.9, можно посмотреть историю версионирования Qt, но по факту Qt 5.9.9 это по сути законченная версия Qt 5.9.

4. Прочие описания

Есть всякие alpha, beta, rc, release и прочее. Есть номера сборок, может быть номер в репозитории или ещё что. Но мы же уже выше договорились, что я буду публиковать незаконченный код. Потому я думаю, что буду использовать только major.minor и при этом числа с 0 до 9, да я не ошибся именно числа.

Создание действий


Я хотел сделать редактор по CRUD, а пока получается редактор записи нажатий, что совсем не тоже самое. Здесь работает абсолютно другой принцип, захватываются нажатия клавиш клавиатуры, потом воспроизводятся обрабатываясь движком текстового редактора. Ну ладно, хотя бы сделав одно пойму, чем оно отличается от другого.

Давайте тогда назовём эту программы tapeditor, не путайте с fapeditor.

Далее создадим минимальный набор действий.
Файл       Правка     Вид
---        ---        ---
Открыть    Записать   Журнал событий
Сохранить  Проиграть
---
Выход


А вообще мне надоело всё это писать. Пусть будет такая полностью недоделанная первая опубликованная версия. Потом допишу остальное, тем более мне надо проверить кучу других идей, то есть переходить к более полезным вещам.

Скачать: tapeditor-0.1.7z

http://files.rsdn.org/99832/tapeditor_01.png

https://www.youtube.com/watch?v=XXVMdjyhKig
velkin
velkin Множественное редактирование файлов
30.08.2023 07:31

Множественное редактирование файлов


Следующая идея так же относится к текстовым редакторам, как и запись печатания текста. И непонятно почему не является основной функциональностью, если и не всех текстовых редакторов, то хотя бы популярных.

Если кто знает какой-то плагин или дополнение к какому-то редактору похожий на изложенную ниже мысль напишите об этом. Хотя я всё равно попробую написать какую-нибудь реализацию.

С самого начала у меня была какая-то тактика и я её придерживался.


Примеры использования редактора


Иногда хочется почитать программу целиком. Просто мотать её туда сюда и читать. Не открывать кучу SDI и MDI окон. И даже не мотать лентой те же самые окна. Переход между окнами требует нажатия других клавиш и он затратен, если говорить о конвейерной работе.

А я хочу в одном окне редактировать множество файлов. Как это реализовано поверх исходного редактора не важно.

Это может быть.

1. Однодокументный интерфейс (SDI).
2. Многодокументный интерфейс (MDI).
3. Однодокументные вкладки (QTabWidget).
4. Переключение по списку (QStackedWidget).
5. Лента из документов (QVBoxLayout).

Строковые элементы файлов


Редактор текста отталкивается от редактирования строк.

У файла есть.

1. Путь.

Набор символов показывающий расположение файла или каталога в файловой системе.

2. Атрибуты.

Метаданные, которые описывают файл.

3. Содержимое.

Содержимое в текстовом файле это тоже строки, как и путь в файловой системе. Атрибуты так же можно представить в виде строк в определённом формате. И эта простая идея даёт огромные возможности по быстрому редактированию пути, атрибутов и содержимого в одном текстовом редакторе.

Примеры текстовых файлов


Давайте возьмём файл с одним атрибутом.

1. Полный путь. "d:/кошка.txt"
2. Создан. "2023.08.30 22:16"
3. Содержимое. "Кошка любит рыбу"

И другой файл с одним атрибутом.

1. Полный путь. "d:/собачка.txt"
2. Создан. "2023.09.01 23:34"
3. Содержимое. "Собачка ест мясо"

По идее полный путь можно разбить на путь к файлу, название файла, расширение файла, но пока это не важно.

Символьный или строковый разделитель


Для начала нам нужен символ или строка разделитель.

1. Самым логичным вариантом был бы символ переноса строки.
2. А так это может быть всё, что угодно, потому что главное не сам символ или строка, а диапазон.
3. Хотя стоит помнить о механизме блоков в текстовых редакторах Qt.
4. Разные типы строк могут разделять разные разделители, например, один или два переноса строки.

Примеры открытия файлов


Полное открытие двух файлов в текстовом редакторе.
d:/кошка.txt
2023.08.30 22:16
Кошка любит рыбу
d:/собачка.txt
2023.09.01 23:34
Собачка ест мясо

Открытие только путей файлов в текстовом редакторе.
d:/кошка.txt
d:/собачка.txt

Открытие только содержимого в текстовом редакторе.
Кошка любит рыбу
Собачка ест мясо

Открытие частей содержимого в текстовом редакторе.
Кошка любит
Собачка ест

Произвольное открытие частей содержимого в текстовом редакторе.
Кошка
Собачка
любит
ест
рыбу
мясо

Список открытых частей файлов


Во всех примерах файлы одни и те же, но есть указатель того, что нужно вывести.

Список открытых частей файлов для вывода.
Полный путь.   Создан.    Содержимое (диапазон).
d:/кошка.txt   дата/время [0 смещение .. 16 символов]
d:/собачка.txt ---        [12 смещение ..4 символа]

Даёт результат в текстовом редакторе.
d:/кошка.txt
2023.08.30 22:16
Кошка любит рыбу
d:/собачка.txt
мясо

Редактирование текста


1. Если воздействовать на путь, то можно изменить расположение и название файла.
2. Если воздействовать на атрибуты, то изменятся даты, права доступа и многое другое.
3. Если воздействовать на диапазон содержимого, тогда изменится именно эта часть содержимого.

В перспективе это выгодно, поскольку можно использовать операции автозамены в том числе с регулярными выражениями. Причём в параметрах явно указывать элементы какого типа могут быть затронуты.

Для реализации этого функционала нужно написать свои методы.

1. Открыть (файл).
2. Сохранить (файл).

Открытие содержимого файлов


Нужна будет поддержка дополнительной структуры данных, которая будет хранить параметры открытия файлов.

Здесь возникают вопросы по поводу открытия содержимого файлов.

1. Копировать ли полностью содержимое файла в оперативную память.
2. Копировать лишь части содержимого файла в оперативную память.

Диапазоны содержимого могут пересекаться.

1. До частичного совпадения.
2. До полного совпадения.

Скорее всего полное копирование содержимого файла в оперативную память проще всего, особенно когда дело коснётся записи, но этот вопрос ещё надо рассмотреть.