суббота, мая 20, 2023

Нечёткие строковые операции.

 В программе возникла необходимость находить в списке строк слова, написанные с ошибками.

Например, при поиске названия группы человек полагает, что группа называется Beetlz. Или он приблизительно помнит, что в названии трека есть упоминание про Фореста Гампа.

Обычные методы определения вхождения подстроки работают в таких случаях так себе, обычно просто ничего не находят.

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


В итоге и группа правильно находится, и название трека.






воскресенье, ноября 27, 2022

Помогаем жителям Украины.

 Вся выручка от продажи этих программ переводится жителям Украины

Data for Last.FM - https://www.microsoft.com/store/apps/9WZDNCRFJ8HG

Movement and Health - https://www.microsoft.com/store/apps/9NG2X70MK525

Identification of musical tracks - https://www.microsoft.com/store/apps/9NDQ1BDRH25J

Total Dictantor - https://www.microsoft.com/store/apps/9WZDNCRD2BW3


воскресенье, декабря 26, 2021

Игрушечка-15, Shazam и командная строка

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

В процессе выяснилось, что сделать всё это не так уж и сложно, хоть и не без ухабов и шероховатостей (ну, у MS гладко только в примерах бывает) – например, в UWP-программе нет возможности динамически, в процессе исполнения, скрыть splash-экран или изменить размер окна приложения. Очень уж напрягает этот моргающий рисунок – похоже, изобретатели вовсе не предполагали запуска uwp-программ не из иконки на стартовом экране. Тем не менее, костылики для других способов запуска всё же приложили, за что спасибо. Наверное.

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

Lafm.exe --параметр <данные> ...

Подробности про параметры – на странице программы.

В клиенте Shazam потребовалось добавить соответствующие средства – отключение вывода информации в буфер обмена и вызов программы LastFm Writer с нужными параметрами – параметры --NoClipboard и --lafm соответственно. Подробности – на странице программы.

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

Следующим действием, вероятно, должна стать автоматизация запуска самого процесса “шазаминга”…


воскресенье, декабря 12, 2021

Игрушечка-14 и Shazam

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

Какое-то время назад новый владелец сервиса Shazam зачем-то взял и удалил из магазина Windows помянутый старенький клиент. С моего компьютера, правда, не удалил (не смог?), но работать клиент стал заметно хуже и один раз впал в кому, а вывести его из неё средствами Windows не удалось (сброс не помогал, переустановить нельзя). Пришлось восстановить систему из бекапа.

Все эти приключения подвигли на изучение проблемы и поиск решения, которое нашлось, как ни удивительно, на github. И даже не одно. Правда, для моих целей потребовались доработки (достаточно простые), в результате получился консольный клиент сервиса Shazam, который передаёт данные в буфер обмена, из которого моя программка отправляет их на Last.fm.

Ура! 



воскресенье, октября 31, 2021

Импортозамещение - 3.

 Продолжаем изучение возможностей обходиться без "фирменных" элементов в UWP-программках. Такие элементы иногда вполне неплохие, но вот "фирмы" бывают разными - к примеру, могут внезапно присоединиться к санкциям против государства, в котором тебя угораздило родиться и жить. Много чего могут…

На нынешнем этапе в деле замены на open-source пришла очередь контрола RadDataGrid фирмы Telerik. Ничего плохого не могу сказать про саму фирму, но политика есть политика - рано или поздно она за тобой придёт.

В качестве кандидата на замену выступает DataGrid из пакета Windows Community Toolkit. Несомненным преимуществом контрола является его бесплатность и открытsq код. Остальные его недостатки можно преодолеть путём высказывания некоторых магических слов в адрес разработчиков, сопровождаемое плотным сидением за монитором и клавиатурой. В процессе выяснилось, что отсутствие у контрола врождённой встроенной сортировки по колонкам исправляется буквально десятком строк кода. Отсутствие у колонок типа (они все там DataGridTextColumn) и параметров форматирования (типа CellContentFormat или FormatString) вполне компенсируется конвертером FormatStringConverter из того же Community Toolkit. Также на достаточно приличном уровне находится способность контрола автоматически выставлять ширину колонок. Конечно, среди отображаемых данных обязательно найдётся строка большой длины и вся табличка станет шире монитора, но программа при этом не валится.

На совершенно аховом уровне  - внешний вид контрола. Для раскраски совершенно не воспринимаются никакие "тематические" цвета наподобие {ThemeResource SystemChromeHighColor}, только константы типа White, Gray и т.п. В результате раскрасить строки в альтернативные цвета не получается, только "вырвиглаз" или смена цвета шрифта на серый (всякий другой выглядит плохо при смене темы dark/light). Про раскраску границ ячеек и всего контрола - только магические слова.

Но с получившимися табличками жить можно:




понедельник, июня 21, 2021

UWP vs WPF

 Вот такую диаграмму (9 графиков) изображает моя UWP-программка.



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

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

А вот для WPF существует «встроенный» подходящий с первого взгляда грид, а пакетов для рисования графиков можно найти даже два, что удивительно на фоне того, что MS платформу WPF не развивает практически с самого рождения и там нет много чего из того, что есть в UWP.

Такая вот дилемма.

среда, апреля 07, 2021

Импортозамещение-2


Предыдущий пост был про начало работы по замене контролов конторы SyncFusion на что-то более пристойное и, главное, поддерживаемое производителем.

Вторым шагом эпопеи стала НИР по замене контрола SfDataGrid для табличного вывода данных. Контрол с первого взгляда неплохой, до накопления в программе довольного большого количества данных (500-1000 строк в таблицах) работал сравнительно быстро. Со временем работа заметно замедлилась, а на слабых компьютерах стала и вовсе раздражать. Никакие предложенные производителем способы ускорения работы так и не помогли. Дополнительно выяснилось, что с увеличением сложности вёрстки страницы, на которой расположен контрол, отключается сортировка по столбцам, что сильно сказывается на возможности анализа данных пользователем. Да ещё и "санкции"… В общем, сильно захотелось попрощаться с контролом.

Кандидатов на замену нашлось ровно два - DataGrid из пакета Windows Community Toolkit и RadDataGrid от болгарской фирмы Telerik. Оба денег не просят и по уровню функциональности  показались примерно одинаковыми, однако контрол из ToolKit'а при тестировании оказался совсем уж примитивным и из соревнований выбыл. 

Болгарский RadDataGrid после приложения некоторых усилий по доведению внешнего вида до приемлемого (что-то, правда, так и не удалось сделать, но дарёному коню даже в зубы не смотрят, а тут пришлось бы сосем уж в неприличные места залезать…) был установлен на страницы программы и сборка отправлена в магазин. 

Главное, функциональность (сортировка и фильтрация в колонках таблицы) контрола не отключилась при переносе с простой страницы для тестов на сложные страницы программы. Ура, победа!


 




среда, октября 07, 2020

Попал под санкции или импортозамещение.

Где-то лет пять-семь назад "американская" фирма Syncfusion предложила бесплатную пожизненную  community-лицензию на свой пакет контролов для UWP. Ну, бесплатно же, отчего бы не взять.

По ходу дела выяснилось, что не так уж у них с контролами и хорошо, как в демо-роликах. Пришлось даже поучаствовать в доработках некоторых из них - во время общения с конторой стало понятно, что фирма, скорее, индийская. В частности, поэтому стал присматриваться, чем заменить их контролы, которые использовал в своих программках. В итоге к последнему времени таких контролов оставалось три: SfDataGrid для табличного вывода данных, SfChart для отображения графиков и  SfTimePicker для выбора периода времени.

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

Собственно, вот по этим причинам и решил заняться любимым делом наших вождиков, хотя они больше калякают об этом, чем делают.

Первым контролом к замене стал SfTimePicker. Очень криво сделанный и плохо работающий (только в светлой теме, на планшете пальцем проворачивать список значений - изматеришься), но единственный, который удалось приспособить для выбора и редактирования данных типа TimeSpan для интервалов времени – с часами, минутами и секундами. Было как-то странно при поисках - довольно много народу интересуется такими контролами, а к использованию никто ничего не предлагает.

Пришлось городить самому, без особых затей, но со всеми нужными свойствами. В итоге получился контрол, отображающий промежуток времени по заданному формату с всплывающим редактором значения. Можно использовать диапазон времени от нуля до 33 дней 23 час. 59 мин. 59 сек. Редактор, построенный на комбобоксах, работает несравненно быстрее и легче "американского", хоть и не такой "красивый”.




пятница, ноября 08, 2019

Игрушечка и Android

Собирался соорудить андроидный вариант программки LastFM Data - ну, нет там ничего похожего для ручной отправки данных на сервис Last.fm, ни в каком виде. Мне-то сильно хотелось данные от тамошнего Шазама отправлять - программка намного лучше той, что на Windows-системах.
Набрал разной литературы по разработке для Андроида и стало это выливаться во что-то такое долгоиграющее (много чего надо освоить и изучить) и монструозное (для частной задачи придётся делать почти полнофункциональное приложение).
После размышлений вспомнился обмен данными в приложениях Microsoft, которые присутствуют в обеих рассматриваемых системах. На этом и решил было остановиться: из Шазама на телефоне отправляю данные в OneNote, на компьютере копирую данные в клипборд и с помощью давно реализованной функции "Scrobble data from Clipboard" получаю искомый результат. Регулярку только немного надо подправить – андроидный Шазам суёт в данные для обмена ещё и URL на какой-то ролик.…
При немного более внимательном рассмотрении задачи, обнаружились средства для синхронизации буферов обмена на ПК и Андроиде. Там и отдельные программы, и расширения для Хрома – почти на любой вкус. Гугль также попутно рассказал, что MS даже собиралась свою систему синхронизации делать. Ещё осенью прошлого года собиралась, может, и до сих пор собирается. Smile with tongue out
Посмотрел на разные варианты и остановился вот на программке CliptoPro – с её использованием добавляется всего два действия к обычным при работе с данными Шазам: скопировать данные на телефоне и заскробблить данные из буфера обмена на ПК.



В итоге теперь не надо плющить мозги всеми этими кривыми Xamarin’ами от MS и Андроидной Студией от Google. Хотя, поупражняться с Kotlin в последней было бы интересно, но всё остальное сопутствующее… В другой раз как-нибудь.

суббота, апреля 13, 2019

Почитаем…

Когда-то довольно уже давно скачал архив библиотеки Lib.rus.ec – больше 100 Гб данных и клиент для доставания книжек из архивов и для обновления самих архивов. Несколько месяцев назад клиент почему-то перестал обновлять базу, а из существующей базы книжки доставал тоже как-то не очень уверенно.
Потыкался, потыкался, выяснилось, что можно и руками книжки доставать, но в архивах они имеют имена наподобие 12345678.fb2, что не очень радостно. Полез на трекеры - а там архив для скачивания уже больше 250 Гб. Провёл ревизию компьютеров - у меня и места-то столько нет, чтоб это всё хозяйство развернуть.
При более внимательном рассмотрении выяснилось, что к имеющимся у меня архивам можно скачать дополнительные файлы и получить более или менее актуальный архив библиотеки. С клиентом оказалось хуже - его автор бросает поддержку, отдаёт исходники, ковыряйтесь сами.
Решил пойти своим путём.
Соорудил WPF-программку, которая потрошит zip-архивы, достаёт оттуда fb2-файлы, фильтрует их по языкам и жанрам, переименовывает по названию книжки и раскладывает по системе папок типа \жанр\автор\язык.  Для экономии места используются жёсткие ссылки (когда книга имеет несколько жанров) и упаковка в zip-архивы (читалки, выяснилось, поддерживают книжки в таком формате).
Скачал все доступные на трекере (http://trec.to/viewforum.php?f=52)  обновления архива (получилось примерно 130 файлов с суммарным объёмом около 200 Гб). "Распаковка" заняла примерно неделю, по ходу дела потребовалось раз 20 модифицировать программку (из-за несоблюдения стандартов fb2 в файлах библиотеки и для учёта и исправления ошибок в данных, которых быть не должно бы, но пользователь у нас пытливый). Программку даже переделал под другую платформу - вместо .NET 4.7 использовал .NET Core 3. Из любопытства в основном.
Дальше уже чисто вручную, при помощи ФАРа. Выкинуть чепуху типа "Наука-политика" и т.п. жанры и выкинуть мелочи в отдельных жанрах. Думаю, за неделю потихоньку справлюсь и запущу на облака куда-нибудь.
Пускай теперь родимое государствие блокирует что угодно - книжек мне хватит лет на 500, даже если читать только известных мне авторов. ‍

понедельник, января 14, 2019

Windows 10 и антиквариат

Есть у меня пенсионного возраста Laptop-tablet на процессоре Intel Atom Z2760, заброшенный всеми – Intel, Samsung, Microsoft.  Объясняют отсутствием видеодрайвера, но ведь новые железки тоже продавать надо. Пару лет назад его (и другие устройства на таком же процессоре) объявили устаревшим и запретили установщику Windows 10 обновлять его до версий старше 1607 AU.
Какое-то время назад попробовал установить начисто версию 1803 – фокус удался, но работала машинка ужасно. Программы, для которых требовалась какая-никакая графика, использовать было невозможно. Даже плитки на стартовом экране отрисовывались почти никак. На этом успокоился и жил себе на разрешённой версии 1607, многого от устройства не требовал, хотя иногда многого не хватало и вообще тоскливо 😕.
Недавно один весьма шустрый вьюнош сообщил на комсомольском форуме, что установил знакомому на планшет версию 1809 и под ней всё работает. Правда, в дальнейшем выяснилось, что планшет быстренько отдан владельцу и узнать, что там и как работает, возможности нет. Правильно, по-комсомольски – прокукарекал, а там хоть не рассветай.
Выяснилось, что и вправду при «чистой» установке сборки 17763.107 x86 (получена при помощи MCT) с последующей установкой всех драйверов от Samsung (все почти от 2013 года для Windows 8.1) можно получить устойчиво работающую систему без явных глюков по вине видео.
После всевозможных усилий по настройке железа в сухом остатке (в том смысле, что можно потереть сухой тряпочкой и спокойно убрать подальше) осталась "док-станция". После подключения к планшету клавиатура и тачпад работают, но наполовину: иногда клавиши не так работают, как надо, иногда "мышиный" курсор не нажимается и т.д. Но при острой необходимости напечатать большой текст, например, или поставить планшет на стол для просмотра фильма, клавиатурой-доком вполне можно пользоваться.
Остальное железо – Wi-Fi, Bluetooth, Сотовая связь (для этой даже своих драйверов устанавливать не потребовалось, подключилась ещё на этапе установки), звук, разные сенсоры – функционирует нормально (BT-мышка отвалилась всего пару раз, что вполне нормально в режиме интенсивного тестирования). Жить можно, можно приступать к тестированию программ.
Программы для "общения" заработали практически без усилий - Telegram, WhatsApp, Edge с нужными расширениями.
"Системные" утилиты тоже работают – Far Manager, MetroCommander, Torrex.
В Проводнике при попытке переименования файла/папки (и при создании новых) не всплывает виртуальная клавиатура. Приходится запускать её пальцем из трея. Соответственно, убирать нужно тоже нужно пальцем. Та же история с клавиатурой в Хроме, кроме того, там и подсказок при печати не выводится. Наверное, когда благодетели сами перейдут на Хромиум, тогда и подсказки будут.
В Telegram тоже приходится пальцем вызывать, да ещё и откреплять от низа экрана – не сдвигается Телеграм кверху, как все прочие программы.
"Медийные" средства – тоже на месте: Shazam, TuneIn, FS Клиент, Data for Last.FM и др.
В игрушки особенно не играюсь, но вот пасьянс порадовал – почти не моргает (иногда пытается) и не заваливается, как на 1607 было.
Потерь среди ранее использовавшихся программ не так и много, но они досадные.
Очень плохо работает (точнее, вовсе не работает – открывается только главная страница, при попытке открыть функциональную страницу программа падает) HealthVault – программа для хранения разных данных о здоровье, клиент одноименного сервиса Microsoft. Досадно, но ладно – быстрее собственную версию доделаю.
Из Магазина, как оказалось, удалили насовсем Яндекс.Погоду, даже в "моей библиотеке" там её нет. Зачем так делать, понять нельзя – установленная ранее, вполне исправно работает, и часто правильнее "системной" Weather. Видимо, это такой особый россиянский "свой путь".
Раздражает некоторая задумчивость системы при реакции на кнопку "Старт", при выводе виртуальной клавиатуры (особенно, на экране входа для ввода пин-кода), но что уж ожидать от машинки возрастом в 7 лет… ‍
С другой стороны, лучше-то в смысле сочетания разных возможностей с разумной ценой практически никто и не сделал за последнее время.



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

четверг, августа 16, 2018

Игрушечка–12 или flac’и

Случился в системе какой-то смешной дефект: не может она прочитать метаданные из flac-файла - название, исполнитель и т.д. При этом Groove Music файл  проигрывает, но в библиотеку не включает. Моя программка тоже эти данные не читает.
И дело не в файлах - другие проигрыватели их воспроизводят и данные достают, проигрыватели на других машинах (в т.ч. и Groove) - тоже. Что-то в конкретной системе произошло... ‍
Как лечить - ХЗ, не переустанавливать же Windows начисто! Попробовал сверху поставить последнюю инсайдерку 17723 - почти никакого эффекта. Моя программка какие-то отрывки строк прочитывает, но это же хрень получается – откуда знать, что это только отрывок...
Посмотрел в FeedbackHub – там тоже народ жалуется. И никакого решения нигде не видно. В итоге нашёл на GitHub библиотеку для работы с метаданными flac-файлов и приделал её к своей программке. Теперь можно постить на Last.fm и эти данные…

понедельник, июня 26, 2017

Windows 10 и ремонт-2

В самом начале работы по модификации программки при попытке запустить отладку в Студии получил странное сообщение о невозможности разместить программу на компьютере:
Error : DEP0700 : Registration of the app failed. Another user has already installed a packaged version of this app. An unpackaged version cannot replace this.

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

Выясняется, что на такое наталкиваются уже давно и существует несколько рецептов исправить ситуацию с помощью PowerShell. Чуть дальше выясняется, что для Windows 10 рецепты не работают и нужно ремонтировать базу пакетов, где зависает запись об установке. Попробовал использовать китайский чудо-пакет Dism++, он эту неведомую запись увидел, но удалить не сумел.

Пришлось действовать руками, т.е. при помощи менеджера Фар. База с гнилой записью называется C:\ProgramData\Microsoft\Windows\AppRepository\StateRepository-Machine.srd, запись находится в таблице Package. С помощью плагина “Редактор баз данных SQLite” удалось (ну да, надо исхитряться) локализовать и удалить злополучную запись. Попутно пришлось дать по зубам системе, которая выпендривалась и не желала поставить на место отредактированную базу – по-простому объявил себя владельцем этого файла…

Есть подозрения, что эту гадость делает сама Студия, когда при попытке отладки изменённого приложения берётся удалить ранее установленное из магазина. Экспериментировать пока не хочется, но манию топтаться по собственным яйцам стрелять себе в ногу у неё не отнять – например, часто при сборке пакета вылезает ошибка типа “не могу удалить папку”, которую сама же и открыла…

Игрушечка-11 и Windows 10

Давно, собственно, чесались руки переделать программку для “ручного” скробблинга (вернее, её “универсальный” вариант) под UWP, которую сильно пропагандируют с появлением Windows 10. Но всё как-то было недосуг, да и особой нужды не возникало – версия под 8.1 нормально работала и на десктопной, и на телефонной десятке, а средства для изготовления UWP-программ были слабосильны и малочисленны.

Но в конце 2016-го появилась Visual Studio 2017 в более или менее рабочем состоянии и стали появляться разные пакеты для разработки программ. К тому же, потребовалось внести изменения в существующую программу, а для этого пришлось доставать из пыльного чулана Visual Studio 2015 (VS-2017 напрочь отказывается работать с проектами для Windows 8.1). Изменения-то внёс, но потом выяснилось, что на телефоне с десяткой не заработало. Разбираться не хотелось (на телефоне с 8.1 программка вполне работает), проще было написать версию  под десятку.

Проще, естественно, не было, было долго и нудно – пришлось переделать не только весь интерфейс, но и заметную часть “функционального” кода. По ходу дела пришлось выколачивать исправления из индийского производителя бесплатного пакета контролов, прикручивать разные расширения к пакету Microsoft.Toolkit.UWP, продираться через заросли колючек глюков в SDK, компиляторах и Nuget-пакетах. В конце пришлось даже немного поплясать вокруг системы лицензирования программ в магазине.

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