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

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

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

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

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

image

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

image

image

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

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

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

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

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

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

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

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

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

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

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

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

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

Ура!

Очередная телеопупея или сплошные недоделки…

Досталась мне тут в подарок Smart TV приставка от фирмы IconBit на Андроиде, как бы восполняющая отсутствие на моём ящике соответствующих функций. Штуковинка подключается через HDMI и стала третьим аппаратом, который нужно подключить к двум разъёмам телевизора. По такому случаю пришлось заказать у китайцев (у них вдвое дешевле и присылают на почту, до которой 5 минут ходьбы) HDMI-концентратор, который должен позволить подключить весь зоопарк.

В итоге да, подключил — компьютер, телеприставку с цифровыми каналами, Smart TV приставку и планшет. Собственно, первые два аппарата всегда были подключены, с их помощью смотрим кино, сериалы и биатлон с Формулой.

Целью подключения планшета было немножко сэкономить на просмотре сериалов — всё же, десктоп и электричество жрёт заметно, и диски попусту крутятся… Можно сказать, такая цель достигнута — сериалы смотреть можно. Правда, качество показа чуть похуже — на планшете видео 720р, на десктопе и  телевизоре — 1080. В итоге, конечно, заметна разница по сравнению с десктопом. Когда припрёт с электричеством — будем экономить…

На Smart TV приставку возлагалось довольно много надежд — рекомендуется как HD-устройство, умеет качать по сети что угодно, воспроизводить любые медиафайлы, реализует технологию miracast

Из всех приложений, какие на приставке были установлены, HD-изображение удалось получить только от ivi.ru (да и то если не сильно придираться). Все прочие каналы, сервисы, кинотеатры и т.п. изображают видео откровенно плохо. Была надежда запустить через плеер VLC (из соображений, что он одинаковый на Windows и на Android) трансляцию канала Спорт-1 HD с сервера службы Torrent-tv. Но надежда эта рассеялась достаточно быстро: обычные каналы как-то ещё воспроизводятся (на телефоне с экраном в 4-5", наверное, можно и посмотреть), но на HD — облом, признаётся, что жидковат аппарат для этого. В общем, Smart-кино и спорта не получилось, придётся по старинке…
Надо признать, впрочем, что если сунуть в эту умную приставку флешку с HD-фильмом, то андроидный плеер его довольно прилично воспроизводит. Правда, это же самое умеет делать телеприставка для цифровых каналов и вся суета с подключениями не нужна…

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

Остаётся технология miracast… И планшет, и десктоп под Windows 10 признают наличие подходящего устройства:

image

Телефон под WinPhone 8.1 ничего подходящего не видит, хотя одна из “дополнительных” бодро рассказывает, что должно работать. Ну, не привыкать…

wp_ss_20160217_0001

В десктопно-планшетной Windows 10 нашлись ровно две программы, которые могут транслировать мультимедию на “устройство” eHomeMediaCenter – браузер Edge и программка “Кино и ТВ”.

В браузере это называется “перенести на устройство”:

image

Таким способом можно показать на телевизоре одну фотографию, но перелистывать их или запустить слайд-шоу – не получается.
Спасибо, конечно, и на том, программка «Фотографии» и этого не умеет.

Фокус с “переносом” видео Youtube на большой экран не удаётся вовсе.

“Кино и ТВ” работает в этом смысле намного интереснее – если видео подключается (а не всякое можно “подключить”), то оно на телевизоре показывается на полном экране (ну, почти – есть какая-то чёрная рамка) независимо от размера окна на десктопе/планшете.

image

При этом на планшете получается крутить сериал и одновременно листать фейсбук (справа на заднем плане – телевизор 42" с фильмом, слева на переднем плане – планшет 10", четверть экрана которого занята проигрывателем “Кино и ТВ”):

WP_20160216_001

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

В общем, ещё один потенциальный способ экономии электричества и HDMI-провода при просмотре сериалов.

По итогам описанных экспериментов можно сказать, что ни Андроид, ни Windows 10 не обеспечили ничего – все надежды на улучшения жизни с их помощью рухнули.
Покупать приставку типа той, с которой я тут упражнялся, не стоит (если, конечно, экран телевизора больше 20-23", для маленького можно и приспособить). Экономия (а она весьма дешёвая) вылезает боком. Может, какая-нибудь Apple TV или “свисток” от Intel с Windows 10 и получше будет, но пока нет никакого желания новых экспериментов. Да и денег жалко, потенциальный эффект столько не стоит.

Игрушечка-3 или Универсальные приложения.

Модное направление — как бы из одного кода получать приложения как для Windows 8.1 — десктоп, планшет – так и для смартфонов под Winphone 8.1.

clip_image001

Что называется, уговорили, черти красноречивые… Пришлось запустить вторую версию программки, теперь в технике “универсального” приложения. 

Microsoft для изготовления таких приложений выпустила специальное обновление для Студии 2013, которое, в общем-то, нормально в работе помогает — шаблоны проектов, ссылки на общие файлы, конвертация предыдущих проектов и т.п.

Самое большое, что пришлось переделывать – это вызов страниц типа “About program”, “Settings” и т.п. В предыдущей версии (для Windows) программы для этого использовались страницы типа SettingsFlyout с вызовом через системные средства:

2.settings

В телефонном API таких средств не находится, поэтому пришлось делать отдельные страницы типа Page и запускать их через системное меню:

form-2-green-2

Самое крупное, до чего не додумались почему-то в Microsoft – это условная компиляция XAML, наподобие #if … #endif в C#. Очень скоро выяснилось, что без этого жить сильно сложно — внешний вид в win- и wp-приложениях может (иногда и должен) сильно различаться: расположение и оформление контролов, даже разный их набор… Можно, конечно, разрулить кодом, но тогда зачем XAML?

Хорошие ребята, всё же, до нужного решения додумались — XAML Conditional Compilation. C этим решением возможны конструкции наподобие такой:

clip_image001

Студия, правда, не сильно это понимает, талдычит об ошибках там и сям и неправильно рисует внешний вид страниц в конструкторе. Иногда приходится по-разному называть контролы — по мнению Студии, имена используются дважды… Увеличивается количество строк в ресурсах для локализации… При сборке приходится дополнительно запускать очистку решения — но эти неудобства перекрываются тем, что не нужно писать массу "художественного" — для отрисовки — кода (которого и без этого хватает).
Выяснились некоторые другие проблемы отрисовки на телефоне некоторых элементов – AppBarButton, ComboBox.

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

В случае надписей “при полях ввода” достаточно установить стандартный стиль:

 

clip_image001

 

Для “заголовков”, которые хочется видеть “пожирнее”, стили нужны разные:

 

clip_image002

 

В итоге получается достаточно пристойно на разных устройствах. Становится хуже, если начать крутить в настройках телефона размер шрифта — можно на максимуме получить наползающие друг на друга строки и т.п. Как с этим бороться — ХЗ. Скорей всего, и не стоит: которые крутят на максимум — ССЗБ.

 

В связи с малыми размерами телефонов пришлось добавить ещё один способ ввода регулярных выражений – загрузку из текстового файла (попытка набить с клавиатуры закончилась на втором переключении на спецсимволы…). Файл со всеми актуальными — известными мне на сегодня — выражениями повесил на сайт с описанием программы. И с планшета, и с телефона получилось этот файл загрузить на устройство и прочитать текст.

 

Гораздо смешнее оказалась ситуация с получением данных о проигрываемой музыке от других программ. Этот режим стал для меня лично основным режимом использования программы: слушаю на планшете, например, калифорнийское джазовое радио через турецкую программу RADYO,  периодически нажимаю кнопку шаринга и отправляю данные на Last.fm. Буквально 4 движения-нажатия. Набралось несколько и других программ, через которые иногда слушаю музыку.

Во второй, универсальной, версии, расширил перечень принимаемых при обмене форматов в попытке получить дополнительную информацию. Получилось извлечь нужную информацию из данных от программ  jamendo и 22tracks, в которых тоже есть неплохая музыка. Но всё это в Windows-окружении.

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

Те программы, аналоги которых на Windows работают как требуется, для телефонов либо отсутствуют, либо обмениваются только “текстом” с адресом страницы. Обмен в "нормальном" виде, с информацией о треке — только с Твиттером и Фейсбуком, чистый хардкод.

В принципе, для телефонов есть пара клиентов Last.fm, передающих информацию о проигрываемых треках, однако не все проигрыватели пользуются стандартными средствами и скробблеры их не понимают. Так что, для статистики на last.fm они потеряны.

 

Из функций программки, в итоге, телефону достаются только ручная набивка данных в форме и скробблинг по файлам на диске. До появления программ, разработанных под WinPhone 8.1, вовсе не обязательно “универсальных”.

 

Страница с описаниями —  https://sites.google.com/site/dyakovkm/lastfmuniwrite

 

Программы можно взять в магазинах:

 

  

Settins & Versions

Хорошая вещь Properties.Settings, но не до конца продуманная.
Засада — в хранении пользовательских настроек. Без всяких споров/разговоров сохраняются в файле %USERPROFILE%Local SettingsApplication Data<Company Name><appdomainname>_<eid>_<hash><verison>user.config .
И вот из-за этой <verison> и всё горе — используется значение атрибута assembly:AssemblyVersion , которое у меня обычно выставляется автоматом наподобие "1.0.0.*", что довольно удобно при протоколировании . Но при отладке всё, естественно, корёжится.
Пришлось начать использовать атрибут assembly:AssemblyFileVersionAttribute, который студия (Express, по меньшей мере) автоматом менять не умеет. Для получения версии исполняемого файла пользуюсь процедурой
public static string AnyVersion( Assembly assembly) {
object[] attrs=null;
try{
    attrs=assembly.GetCustomAttributes(
typeof(AssemblyFileVersionAttribute ),false);
}
catch{}
if (attrs != null && attrs.Length > 0) {
   
return ((AssemblyFileVersionAttribute)attrs[0]).Version;
}
return assembly.GetName().Version.ToString(4);
}
 
Использование — AnyVersion(Assembly.GetExecutingAssembly()) или ещё как…