Так, я тут немного отпинал себя за отвлечение и вернулся к обновлению Inspirer. И блин... ну вот почему так происходит, а? Работала ж себе вторая версия. Да, там тоже были упущенные проблемы. Одну даже я обнаружил уже в процессе тестирования некоторых элементов обновления. Но работало ж. И тут такое...
В общем, стал я тут копать, как уйти от требования полного доступа к файловой системе. Ну оно не надо, все-таки, не того уровня приложение я пишу. И выясняется, что во второй версии я вообще ВСЁ сделал не так, по крайней мере, в части работы с файлами.
Во-первых, файловая библиотека. Отмету тот факт, что я вообще удалил ее класс (теперь использую другой, с новыми алгоритмами) и полностью переделал подход к ней, внешне я не планировал ее сильно менять. Мне не особо нравилось, что в нее можно просто взять и зайти каким-нибудь файловым менеджером. При этом я по каким-то своим соображениям не хотел пихать ее в изолированное пространство приложения. Ну как по каким-то... в андроиде есть возможность удалить файлы приложения без удаления самого приложения. Такое себе, если честно. База данных при этом тоже вроде сносится. С другой же стороны, а зачем нужна БД без файлов? Или файлы без БД? Но главное, для работы в этом пространстве разрешений по файлам не надо никаких. Задумался, если честно. Может и правда перенесу файловую библиотеку во внутрь, буду хранить рядом с настройками и файлами систем отказоустойчивости (и да, ее тоже буду к особо важным узлам прикручивать).
Но! Во-вторых и в-главных. Оказывается, есть все-таки в системе андроид встроенный файловый диалог. Ну когда-то на заре своего знакомства с программированием, я учился вызывать стандартное диалоговое окно windows. И при разработке первых версий Inspirer был неприятно удивлен отсутствием таковых в Android. А теперь выяснилось, что я очень плохо искал, ибо такие штуки очень даже есть и именно через них можно аккуратно убрать лишние разрешения на работу с фалами.
В общем, снижаем уровень доступа, приходим к стандартам разработки Google. Наверное, это правильно, но блин, поздновато.
Навигация по проекту
пятница, 11 сентября 2026 г.
пятница, 4 сентября 2026 г.
Бардак в сезонах
Ладно, признаю, пауза в контенте на моем канале затянулась. Дело вот в чем, мне для завершения текущего третьего сезона надо выложить 2 видео. Одно по моб.разработкам, одно DIY, точнее, по ПКМ. Без этого сезон будет неполным.
Я их постараюсь снять и выложить, но уж очень много чего происходит. Помимо всего прочего, я новый музыкальный проект создал и продвигаю. Но главное здесь - я еще почти год назад снял два видео для нового четвертого сезона. И держал их скрытыми в надежде, что недостающие два видоса получится снять и выложить, закрыв третий сезон. Не получилось.
В общем, решил я выпустить эти два ролика, открыв четвертый сезон. Третий пока тоже останется открытым. Будем закрывать по мере реализации соответствующих проектов.
Я их постараюсь снять и выложить, но уж очень много чего происходит. Помимо всего прочего, я новый музыкальный проект создал и продвигаю. Но главное здесь - я еще почти год назад снял два видео для нового четвертого сезона. И держал их скрытыми в надежде, что недостающие два видоса получится снять и выложить, закрыв третий сезон. Не получилось.
В общем, решил я выпустить эти два ролика, открыв четвертый сезон. Третий пока тоже останется открытым. Будем закрывать по мере реализации соответствующих проектов.
суббота, 8 августа 2026 г.
среда, 15 июля 2026 г.
Здесь есть обновление
Так, я тут еще немного докрутил мобильную часть этой творческой платформы (blogspot). Случайно выяснилось, что с телефона не работает плеер (скрипт просто не запускался), нет каруселей с навигацией а еще внизу страницы наблюдаются какие-то странные белые прямоугольники.
Плееру добавил параметр, запускающий его в мобильной версии. Теперь все мои старания (и страдания) доступны с телефона. Навигацию добавил простую и сделал ее доступной только в мобильной версии. А то пользователям приходилось перебирать записи в поисках релизов. Теперь в топе на них есть прямые ссылки.
Ну а прямоугольники после некоторых манипуляций были опознаны как ссылки для переходов на главную страницу и между порциями постов. Пришлось немного подкрутить css в этой области, чтобы это стало очевидно не только мне как админу, а всем заглянувшим на огонек.
p.s. по нейрорелизу есть продвижение. Осталось всего два текста до завершения.
Плееру добавил параметр, запускающий его в мобильной версии. Теперь все мои старания (и страдания) доступны с телефона. Навигацию добавил простую и сделал ее доступной только в мобильной версии. А то пользователям приходилось перебирать записи в поисках релизов. Теперь в топе на них есть прямые ссылки.
Ну а прямоугольники после некоторых манипуляций были опознаны как ссылки для переходов на главную страницу и между порциями постов. Пришлось немного подкрутить css в этой области, чтобы это стало очевидно не только мне как админу, а всем заглянувшим на огонек.
p.s. по нейрорелизу есть продвижение. Осталось всего два текста до завершения.
четверг, 9 июля 2026 г.
И еще технические новости
Еще одна позитивная техническая новость. Вчера удалось заставить прототип приложения Inspirer зазвучать. Пока в основной проект я этот момент не перенес, как и то, ради чего создавался этот прототип, но результат уже вполне себе интригующий.
Под прототипом я подразумеваю тестовое приложение, в котором гораздо удобнее, чем в основном проекте, было писать элемент управления для вывода нот (и не только, у него есть и обратная связь, а еще я в нем прописал математические функции, которые будут считать длительности в тактах), также в нем создавал и доводил до ума т.н. 'Piano Roll', элемент управления с клавишами от рояля. И на последнем, собственно, налаживал звучание, т.к. именно к нему было удобнее всего привязывать эту часть функционала.
Теперь небольшое опровержение. Я говорил, что у меня есть два приложения в исходниках под анализ, извлечение звукового функционала и перенос. Одно является плеером (что мне не особо подходило, но в принципе, читая код C++, я понимал, как можно это все вытащить на поверхность и использовать в своих корыстных целях), второе же - эмулятор пианино (что подходило мне куда больше, но на первый взгляд казалось переусложненным всякими ненужными мне дополнениями). В общем, оба отложены на потом ))
Я тут нашел еще одно приложение в исходнике, типа самое-самое простое (и оно таковое и есть). И в нем все сделано на редкость изящно и удобно для переноса. Настолько, что мне хватило пары часов, чтобы в нем разобраться, перенести из него функциональную часть в прототип, адаптировать вызовы и запустить это все. Хотя я был уверен, что у меня уйдет не меньше пары недель для запуска звукового блока, исходя из предварительного анализа тех двух приложений.
Вообще, я не исключаю, что вернусь к тем двум, даже скорее, к плееру, т.к. он гораздо функциональнее. Но это потом, может уже к 4-й версии Inspirer. А может и позже. На данный момент текущего функционала звукового движка мне достаточно (надеюсь).
Сомнения у меня из-за возможных подводных камней. В частности, звук хочу пускать еще и через различные наушники, как проводные, так и беспроводные, а это можно проверить только на реальном устройстве. Но проверить надо обязательно.
Зато другую часть сомнений мне удалось рассеять. Речь про многоканальность. Пример показывал отправку нескольких нот (аккордов) в звук, и это работало. Но они все шли одним инструментом. И у меня была мысль создать несколько экземпляров движка, по одному на дорожку. Но при адаптации вызова я засомневался, что так вообще получится. Однако, и это важно, Inspirer должен предусматривать многодорожечность. И я провел несколько тестов, отправляя одновременно несколько нот на разные инструменты. И это сработало. Это означает, что одним экземпляром вполне можно обойтись, что хорошо с точки зрения оптимизации. Короче, я полноценно вернулся к разработке Inspirer, результаты мне нравятся, процесс идет.
p.s. обещанный релиз нейросетевой музыки застрял по части текстов. Не знаю, чего мне не хватает, но пока не получается их дописать. Как допишу - обязательно сообщу.
Под прототипом я подразумеваю тестовое приложение, в котором гораздо удобнее, чем в основном проекте, было писать элемент управления для вывода нот (и не только, у него есть и обратная связь, а еще я в нем прописал математические функции, которые будут считать длительности в тактах), также в нем создавал и доводил до ума т.н. 'Piano Roll', элемент управления с клавишами от рояля. И на последнем, собственно, налаживал звучание, т.к. именно к нему было удобнее всего привязывать эту часть функционала.
Теперь небольшое опровержение. Я говорил, что у меня есть два приложения в исходниках под анализ, извлечение звукового функционала и перенос. Одно является плеером (что мне не особо подходило, но в принципе, читая код C++, я понимал, как можно это все вытащить на поверхность и использовать в своих корыстных целях), второе же - эмулятор пианино (что подходило мне куда больше, но на первый взгляд казалось переусложненным всякими ненужными мне дополнениями). В общем, оба отложены на потом ))
Я тут нашел еще одно приложение в исходнике, типа самое-самое простое (и оно таковое и есть). И в нем все сделано на редкость изящно и удобно для переноса. Настолько, что мне хватило пары часов, чтобы в нем разобраться, перенести из него функциональную часть в прототип, адаптировать вызовы и запустить это все. Хотя я был уверен, что у меня уйдет не меньше пары недель для запуска звукового блока, исходя из предварительного анализа тех двух приложений.
Вообще, я не исключаю, что вернусь к тем двум, даже скорее, к плееру, т.к. он гораздо функциональнее. Но это потом, может уже к 4-й версии Inspirer. А может и позже. На данный момент текущего функционала звукового движка мне достаточно (надеюсь).
Сомнения у меня из-за возможных подводных камней. В частности, звук хочу пускать еще и через различные наушники, как проводные, так и беспроводные, а это можно проверить только на реальном устройстве. Но проверить надо обязательно.
Зато другую часть сомнений мне удалось рассеять. Речь про многоканальность. Пример показывал отправку нескольких нот (аккордов) в звук, и это работало. Но они все шли одним инструментом. И у меня была мысль создать несколько экземпляров движка, по одному на дорожку. Но при адаптации вызова я засомневался, что так вообще получится. Однако, и это важно, Inspirer должен предусматривать многодорожечность. И я провел несколько тестов, отправляя одновременно несколько нот на разные инструменты. И это сработало. Это означает, что одним экземпляром вполне можно обойтись, что хорошо с точки зрения оптимизации. Короче, я полноценно вернулся к разработке Inspirer, результаты мне нравятся, процесс идет.
p.s. обещанный релиз нейросетевой музыки застрял по части текстов. Не знаю, чего мне не хватает, но пока не получается их дописать. Как допишу - обязательно сообщу.
суббота, 4 июля 2026 г.
Еще одна техническая новость
Итак, кажется, получилось. По крайней мере, последние тесты показали, что проделанная работа была проделана не зря. Плееры работают, скрипт действует корректно. И даже некоторые внезапно обнаруженные проблемы тоже решаемы.
По порядку. Самое главное достижение, как по мне, я свел обертку к одной строке. То есть, теперь для запуска плеера не нужно копипастить всю его разметку, достаточно одной строки div с указанием класса и несколькими параметрами, главный из которых - id плейлиста в библиотеке iBroadcast. На этом все, остальную часть разметки (которая у всех будет одинаковой!) скрипт запихнет сам. К тому же, это сильно упростит возможную будущую доработку скрипта. Дело в том, что для переделки алгоритма пришлось переломать еще и разметку. Так вот, чтобы больше не бегать по постам и не искать, где там еще надо что-то поправить, теперь код разметки зашит в самом скрипте и если её надо будет поправить, будет достаточно исправления в самом скрипте.
Дальше, я отказался от использования id элементов, как это было в предыдущей рабочей версии. Это устранило ошибки, возникающие от самого наличия нескольких плееров с однинаковым id на странице (это когда несколько постов с релизами на одной странице). Теперь для поиска используется class, поиск идет по всем плеерам, сколько их есть на странице, столько скрипт и обрабатывает.
Переписал и блок стилей css, и сам скрипт. От оригинального кода в скрипте вообще мало что осталось, я сознательно писал в более удобном мне стиле. Предыдущая версия собиралась, скажем так, из кусков, оттуда там был некоторый бардак. Где-то обработчики событий задавались прямо в разметке, где-то цеплялись скриптом и т.д. Сейчас все одинаково задается. Самое забавное то, что пользователи этого не заметят, я полностью сохранил прежний внешний вид. А css переписать пришлось из-за перехода с id на class.
Интересный момент, я говорил в прошлом посте, что единый плеер, исключающий воспроизведение нескольких треков одновременно получится сам по себе. Это оказалось не так, первые же тесты показали, что прекрасно запускается какофония из треков, было бы желание. Однако, я все-таки реализовал защиту от какофонии, так что в пределах страницы на треки можно тыкать как угодно, играть всегда будет только один.
И последнее, самое неочевидное, что всплыло внезапно и оказалось несколько проблематичным к исправлению. Отказоустойчивость. Пока оно все работает - оно работает. Но бывает, что какой-то из плееров не прогружается. И приходится обновлять страницу. Еще веселый момент, токен доступа к iBroadcast имеет срок жизни час. Соответственно, если загрузить страницу, подождать час и попытаться проиграть трек - будет тишина, плюс, сам плеер будет вести себя неадекватно. Решение придумал простое. Переделал обработку ошибок в блоке запроса плейлиста (откуда ссылки на треки получаются с как раз токенами), и сделал проверку на ошибку на выходе из этого запроса. И если выпадает ошибка - поставил перезапуск запроса с двухсекундной задержкой. Причем, эта штука вызывается и в случае ошибки воспроизведения, только там есть проверка, если плейлист пустой, значит идет первичная загрузка плейлиста, если плейлист не пустой - попытка проиграть музыку провалилась и надо обновить токены в плейлисте. И это, пришлось еще в случае такого провала дать пользователю понять, что надо чуть подождать, в плеере возвращаются надписи, как до загрузки.
По порядку. Самое главное достижение, как по мне, я свел обертку к одной строке. То есть, теперь для запуска плеера не нужно копипастить всю его разметку, достаточно одной строки div с указанием класса и несколькими параметрами, главный из которых - id плейлиста в библиотеке iBroadcast. На этом все, остальную часть разметки (которая у всех будет одинаковой!) скрипт запихнет сам. К тому же, это сильно упростит возможную будущую доработку скрипта. Дело в том, что для переделки алгоритма пришлось переломать еще и разметку. Так вот, чтобы больше не бегать по постам и не искать, где там еще надо что-то поправить, теперь код разметки зашит в самом скрипте и если её надо будет поправить, будет достаточно исправления в самом скрипте.
Дальше, я отказался от использования id элементов, как это было в предыдущей рабочей версии. Это устранило ошибки, возникающие от самого наличия нескольких плееров с однинаковым id на странице (это когда несколько постов с релизами на одной странице). Теперь для поиска используется class, поиск идет по всем плеерам, сколько их есть на странице, столько скрипт и обрабатывает.
Переписал и блок стилей css, и сам скрипт. От оригинального кода в скрипте вообще мало что осталось, я сознательно писал в более удобном мне стиле. Предыдущая версия собиралась, скажем так, из кусков, оттуда там был некоторый бардак. Где-то обработчики событий задавались прямо в разметке, где-то цеплялись скриптом и т.д. Сейчас все одинаково задается. Самое забавное то, что пользователи этого не заметят, я полностью сохранил прежний внешний вид. А css переписать пришлось из-за перехода с id на class.
Интересный момент, я говорил в прошлом посте, что единый плеер, исключающий воспроизведение нескольких треков одновременно получится сам по себе. Это оказалось не так, первые же тесты показали, что прекрасно запускается какофония из треков, было бы желание. Однако, я все-таки реализовал защиту от какофонии, так что в пределах страницы на треки можно тыкать как угодно, играть всегда будет только один.
И последнее, самое неочевидное, что всплыло внезапно и оказалось несколько проблематичным к исправлению. Отказоустойчивость. Пока оно все работает - оно работает. Но бывает, что какой-то из плееров не прогружается. И приходится обновлять страницу. Еще веселый момент, токен доступа к iBroadcast имеет срок жизни час. Соответственно, если загрузить страницу, подождать час и попытаться проиграть трек - будет тишина, плюс, сам плеер будет вести себя неадекватно. Решение придумал простое. Переделал обработку ошибок в блоке запроса плейлиста (откуда ссылки на треки получаются с как раз токенами), и сделал проверку на ошибку на выходе из этого запроса. И если выпадает ошибка - поставил перезапуск запроса с двухсекундной задержкой. Причем, эта штука вызывается и в случае ошибки воспроизведения, только там есть проверка, если плейлист пустой, значит идет первичная загрузка плейлиста, если плейлист не пустой - попытка проиграть музыку провалилась и надо обновить токены в плейлисте. И это, пришлось еще в случае такого провала дать пользователю понять, что надо чуть подождать, в плеере возвращаются надписи, как до загрузки.
понедельник, 29 июня 2026 г.
И все-таки кое-что надо доделать
Так, все-таки не до конца получилось продумать эту ситуацию.
Начал же переносить посты на blogspot. Вообще, я догадывался, что такая проблема может возникнуть, но все-таки хотелось начать процесс портации. Перенес по закрытому проекту все релизные посты и обнаружил, что проблема действительно имеется.
Как это выглядит. Если разместить несколько плееров на странице (например, несколько постов с релизами), то происходит крайне неприятная ситуация, скрипт ловит только верхний элемент, берет из него id плейлиста и загружает только его. Все остальные даже не запускают запросы к данным и висят в неоформленном состоянии.
А значит это, что скрипт не запускается для каждого экземпляра плеера, а отрабатывает глобально на странице.
Главный минус сей новости в том, что придется плеер дописывать с учетом этой ситуации. Само собой, меня это не остановит, я добьюсь своего, тем более, ну нет ничего нереального в этом.
Но есть и плюсы. Да, вот так. Первый и главный - я смогу сделать то, что не мог сделать на сайте, контроль воспроизведения. Даже усилий не придется прикладывать, это будет само работать, когда я закончу. На сайте же (можете прямо сейчас проверить) можно запустить несколько альбомов играть одновременно, и ничто вас в этом не остановит.
Второй плюс, уже на будущее, можно добавить еще и глобальный интерфейс плееру. Чтобы как на солидных площадках внизу можно было видеть, какая песня играет, вне зависимости от того, в какой точке блога находится пользователь. У этого, правда, пока будет одно ограничение, при переходе между страницами плеер будет останавливаться, но сам факт такой возможности радует.
Правда, вторым пунктом я займусь сильно позднее. Пока что надо сделать, чтобы в блоге работали все плейлисты. И хорошо, что обнаружилось это сразу, не так много переделывать. Хотя, похоже, придется таки переломать и стили (это надо теперь делать во всех блогах), и сами скрипты, а потом еще раскопировать по блогам.
В общем, веселье продолжается, но как по мне, самое сложное все-таки позади. Тем более, что большая часть у меня есть, осталось научить ее работать не на одном, а на нескольких блоках. Только и всего )))
p.s. зато везде разместил слайдеры с навигацией, теперь из проблем остался только "глобальный плеер" ))
Начал же переносить посты на blogspot. Вообще, я догадывался, что такая проблема может возникнуть, но все-таки хотелось начать процесс портации. Перенес по закрытому проекту все релизные посты и обнаружил, что проблема действительно имеется.
Как это выглядит. Если разместить несколько плееров на странице (например, несколько постов с релизами), то происходит крайне неприятная ситуация, скрипт ловит только верхний элемент, берет из него id плейлиста и загружает только его. Все остальные даже не запускают запросы к данным и висят в неоформленном состоянии.
А значит это, что скрипт не запускается для каждого экземпляра плеера, а отрабатывает глобально на странице.
Главный минус сей новости в том, что придется плеер дописывать с учетом этой ситуации. Само собой, меня это не остановит, я добьюсь своего, тем более, ну нет ничего нереального в этом.
Но есть и плюсы. Да, вот так. Первый и главный - я смогу сделать то, что не мог сделать на сайте, контроль воспроизведения. Даже усилий не придется прикладывать, это будет само работать, когда я закончу. На сайте же (можете прямо сейчас проверить) можно запустить несколько альбомов играть одновременно, и ничто вас в этом не остановит.
Второй плюс, уже на будущее, можно добавить еще и глобальный интерфейс плееру. Чтобы как на солидных площадках внизу можно было видеть, какая песня играет, вне зависимости от того, в какой точке блога находится пользователь. У этого, правда, пока будет одно ограничение, при переходе между страницами плеер будет останавливаться, но сам факт такой возможности радует.
Правда, вторым пунктом я займусь сильно позднее. Пока что надо сделать, чтобы в блоге работали все плейлисты. И хорошо, что обнаружилось это сразу, не так много переделывать. Хотя, похоже, придется таки переломать и стили (это надо теперь делать во всех блогах), и сами скрипты, а потом еще раскопировать по блогам.
В общем, веселье продолжается, но как по мне, самое сложное все-таки позади. Тем более, что большая часть у меня есть, осталось научить ее работать не на одном, а на нескольких блоках. Только и всего )))
p.s. зато везде разместил слайдеры с навигацией, теперь из проблем остался только "глобальный плеер" ))
Подписаться на:
Сообщения (Atom)