В наушниках по жизни

В наушниках по жизни

Здесь я пишу свои идеи, мысли, описываю события своей жизни и просто делаю личные и рабочие заметки. «А Вы что, собираетесь жить вечно?»

Report Builder for Synadyn Broadcast 1.0

15 января 2016, 23:00

Достаточно давно, ещё когда я работал на «Восточном Экспрессе» я написал и выложил в свободный доступ программу для генерации отчётов в РАО на основании отчётов о проигранных файлах, которые оставляет Synadyn Broadcast.

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

Скомпилированная версия 1.0:
Report Builder for Synadyn Broadcast 1.0

Так же, для всех желающих, я выложил в открытый доступ исходные коды проекта:
GitHub Report Builder for Synadyn Broadcast

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

Данное программное обеспечение является совершенно бесплатным и поставляется как есть.

Аудио-плеер на Delphi для iOS с применением библиотеки BASS.

4 января 2016, 2:00

Прошло довольно много времени с момента написания первой статьи «Аудио-плеер на Delphi для Android с применением библиотеки BASS». И теперь я решил написать вторую часть статьи про запуск и использование библиотеки BASS под iOS. В данном конкретном случае, так же? как и в предыдущей статье, целью подключения библиотеки, стало использование функции проигрывания сетевого аудиопотока.

Настройка

Как и в случае с настройкой под Android, для iOS нам потребуются дополнительные библиотеки, без которых скомпилировать проект не получиться. Воспользуемся набором библиотек DPF iOS Native Components. Данные библиотеки нужны для подключения iOS фреймворка работы со звуком.

Скачиваем архив с файлами с официального сайта или с моего сайта.

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

Я рекомендую (во избежании дополнительных проблем с подключением) распаковать файлы в папку DPF.iOS.Native.Components.v9.6.1.zip в корень диска C.

В каталоге с файлами, имеется файл Install.txt. У кого хорошо с английским, могут сделать всё по инструкции описанной в файле, для тех, кто не совсем понимает, что необходимо делать, я опишу процесс подробно.

Запускаем Codegear RAD Studio. Далее в верхнем меню открываем Tools->Options->Delphi Options->Library.

Затем, в выпадающем списке поочерёдно выбираем следующие пункты платформ:

  1. 32-bit windows
  2. iOSSimulator
  3. iOSDevice32
  4. iOSDevice64

В каждом из пунктов добавляем в раздел «Library path» путь к нашим компонентам. В нашем случае C:\DPF.iOS.Native.Components.v9.6.1\

Добавление фреймворка Добавление фреймворка

Теперь, необходимо в разделе SDK Manager указать, какие фрейворки iOS нам потребуются. Для этого открываем Tools->Options->SDK Manager, пролистываем появившийся список вниз до раздела Frameworks, выбираем в списке один из фремворков, нажимаем на кнопку Add the new path item и добавляем следующие фреймворки:

  • /System/Library/Frameworks/EventKit
    /System/Library/Frameworks/MessageUI
    /System/Library/Frameworks/AudioToolbox
    /System/Library/Frameworks/Social
    /System/Library/Frameworks/QuickLook
    /System/Library/Frameworks/SystemConfiguration
    /System/Library/Frameworks/GameKit
    /System/Library/Frameworks/CoreBluetooth
    /System/Library/Frameworks/Accounts
    /System/Library/Frameworks/AdSupport
    /System/Library/Frameworks/ExternalAccessory
    /System/Library/Frameworks/AddressBookUI (No need in XE8 and later)
    /System/Library/Frameworks/AddressBook (No need in XE8 and later)
    /System/Library/Frameworks/MobileCoreServices (No need in XE8 and later)
    /System/Library/Frameworks/MapKit (No need in XE8 and later)
    /System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication (iOS 8.0 and later)

В качестве пути на удалённом хосте требуется указывать путь «$(SDKROOT)/System/Library/Frameworks», а качестве имени, название фремворка. Для примера:
Путь: $(SDKROOT)/System/Library/Frameworks
Имя: EventKit
Больше нигде никаких галочек ставить и выбирать не требуется.

Должно получиться так.

Добавление фреймворков Список фремворков

В разделе Libs, аналогичным образом необходимо добавить библиотеку /usr/lib/libxml2.dylib. Путь к ней указать, как $(SDKROOT)/usr/lib/

После добавления всех фреймворков в список необходимо обязательно нажать на кнопку Update local File Cache. При этом MAC с запущенным PAServer'ом должен быть настроен и доступен.

Теперь нам потребуется скомпилировать и установить компоненты. Для этого нажимаем File -> Open Project. Открываем проект из папки компонентов, соответствующий вашей среде программирования.

Нажимаем правой кнопкой на проекте в инспекторе проекта и выбираем пункт «Build», начнётся построение проекта.

После завершение построение, опять нажимаем правой кнопкой на проекте в инспекторе и выбираем пункт «Install».

Компоненты готовы к работе. Приступим к созданию проекта.

Проект

И вот, всё почти готово, для использования библиотек Bass на iOS. Осталось задействовать саму библиотеку и добавить некоторый код в проект.

Для работы с библиотекой, нам потребуется файл libbass.a. Его необходимо добавить в корень каталога проекта. Откуда конкретно у меня данный файл, я точно сказать не смогу, я нашёл его где-то на просторах форума un4seen.com. Здесь я выкладываю рабочий файл из своих проектов.

Но, одного файла для работы будет недостаточно. Так же, в проект необходим добавить ещё 2 файла *.pas. Первый будет необходим для работы с функциями libbass, второй послужит для работы с фреймворком iOS для работы с сетевыми потоками.

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

В раздел implementation необходимо добавить следующий код:

{$O-}
  function BASS_Init(device: LongInt; freq: DWORD; flags: DWORD; win: Pointer; clsid: Pointer) : BOOL; cdecl; external 'libbass.a' name 'BASS_Init';
  function BASS_StreamPutData(handle: HSTREAM; buffer: Pointer; length: DWORD): DWORD; cdecl; external 'libbass.a' name 'BASS_StreamPutData';
  function BASS_StreamFree(handle: HSTREAM): BOOL; cdecl;  external 'libbass.a' name 'BASS_StreamFree';
  function BASS_StreamCreate(freq: DWORD; chans: DWORD; flags: DWORD; proc: Pointer; user: Pointer): HSTREAM;  cdecl;  external 'libbass.a' name 'BASS_StreamCreate';
  function BASS_StreamCreateFile(mem: BOOL; f: Pointer; offset, length: QWORD; flags: Cardinal): HSTREAM; cdecl; external 'libbass.a' name 'BASS_StreamCreateFile';
  function BASS_StreamCreateURL(url: Pointer; offset: Cardinal; flags: Cardinal; proc: DOWNLOADPROC; user: Pointer):HSTREAM; cdecl; external 'libbass.a' name 'BASS_StreamCreateURL';
  function BASS_ChannelPlay(handle: HSTREAM; restart: BOOL): BOOL; cdecl;  external 'libbass.a' name 'BASS_ChannelPlay';
  function BASS_ChannelStop(handle: DWORD): BOOL; cdecl; external 'libbass.a' name 'BASS_ChannelStop';
{$O+}

Работа с аудиопотоком

Для корректной работы с аудипотоками, требуется подключение аудио-фреймворка iOS. Самый простой способ сделать это, кинуть на форму компонент DPFAVPlayer, что именно я и сделал. Это исключает необходимость выполнения дополнительных манипуляций.

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

Глобальные переменные.

uStream:HSTREAM;
chan: HSTREAM = 0;

При нажатии на кнопку Play в приложении запускается поток:

// Запускаем поток вещания
IdThreadComponent1.Start;

«Тело» потока:

try

    // Инициализируем libbass
    BASS_Init(-1,44100,0,Handle,nil);

    // Закрываем предыдущие потоки (не обязательно, взято из примера)
    BASS_StreamFree(uStream);

    messageText := 'Буферизация...';
    IdThreadComponent1.Synchronize(ShowMess);
    // Создаём поток данных
    uStream:=BASS_StreamCreateURL(Pchar(stantion),0,BASS_STREAM_STATUS or BASS_UNICODE,nil,nil);

    if uStream = 0 then
    begin
      ShowMessage('Ошибка создания потока!');
    end
    else
    begin

      if not Bass_ChannelPlay(uStream,true) then
      begin
        ShowMessage('Не удалось воспроизвести поток!');
      end;

      messageText := currentLabel;
      IdThreadComponent1.Synchronize(ShowMess);
      IdThreadComponent1.Synchronize(deactivateIndicator);
    end;

  except on E: Exception do
    begin
      {$IFDEF DEBUG}
        ShowMessage(e.Message);
      {$ELSE}
        ShowMessage('Ошибка подключения к выбранной радиостанции.');
      {$ENDIF}
    end;
  end;

  IdThreadComponent1.Terminate;

Остановка проигрывания

// Останавливаем плеер
BASS_ChannelStop(uStream);

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

Данный набор минимальных настроек, позволит вам работать с библиотекой Bass на устройствах под управлением iOS.

Проигрывание в фоне

Чтобы заставить ваше приложение продолжать проигрывание в фоне, необходимо сделать дополнительные настройки проекта. В XE10 наконец-то появился параметр UIBackgroundModes. В настройках проекта устанавливаем значения: audio И remote-notification (в случае использования Push уведомлений).

Окончание

Ну вот в общем и всё, что требуется сделать для создания проекта с использованием libbass на iOS. Возможно, при написании статьи я допустил какие-либо неточности и недочёты, т. к. проекты сделаны давно, а статья написана по следам этих проектов, поэтому я мог упустить нюансы. Обо всех замеченных недочётах и ошибках вы можете писать мне в комментариях, буду рад вашим отзывам.

JD.ru или история одного телефона

18 декабря 2015, 9:38

Случилось мне заказать по акции как-то на сайте JD флешку и PowerBank во время распродаж по 5 центов. Ну, понятно, все дела, акции, распродажи, куча заказов. Но, тем не менее, получил свои заказы как положено. Хотя читал в интернете отзывы, что были ошибки, мол, присылали только провода от PowerBank, но чем закончилось не в курсе.

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

В общем, нашёл интересующий меня товар Xaomi Redmi Note 2 со скидкой в $20 и устраивающим меня сроком отправки и доставки, сделал заказ. Товар обещали отправить в течение 6 дней, доставка до места ещё от 3 до 7 дней. Всё официально заявлено в карточке товара.

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

Сделав заказ 4 декабря 2015 года, я стал ждать отправки. Прошла неделя, но товар так и не отправили. К этому времени стали появляться комментарии к товару, в которых люди жаловались, что товар не отправляют, хотя заказывали ещё в период с 12 по 28 ноября. При этом ничего вразумительного продавец так и не смог ответить.

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

На данный момент, товара опять нет в наличии, и его рассылка не осуществляется. Те счастливчики, кто удостаивается ответа от продавца, слышат постоянные «завтраки» по поводу отправки, при этом никаких конкретных сроков не называется.

На форуме 4PDA к моменту написания данной статьи набралось уже порядка 1138 страниц обсуждения, все делятся эмоциями и последней информацией, составили даже небольшую таблицу заказавших.

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

На ответ у продавца ушло 4 дня и к 17 декабря, телефон так и не выслан.

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

Ситуация усугубляется ещё несколькими факторами:

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

Ещё одной проблемой стала оплата через Яндекс.Деньги — НЕ ВЗДУМАЙТЕ ПЛАТИТЬ ЧЕРЕЗ ЯНДЕКС. В случае проблем с доставкой, комплектовкой и обманом продавца, вернуть свои деньги будет практически невозможно, т. к. Яндекс не особо хочет нести ответственность за недобросовестных продавцов, в отличие от PayPal.

Комментариев к товару стала так много, что листать их практически нереально, многие комментарии подобного рода.

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

Настройка префикса F7 для сканера Eclipse MS 5145 LS USB

27 ноября 2015, 22:45

Прошло достаточно много времени с момента написания мной статей про подключение и настройку торгового оборудования в 1С. Статьи стали довольно популярными и у читателей часто стал вопрос про настройку префикса у сканеров-штрих кодов. Поэтому, в дополнение к статье про настройку сканера Eclipse MS 5145 LS я решил написать данный мануал, по настройке префикса.

Преамбула

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

Поясню. Если в новой конфигурации, в режиме COM порта, при сканировании ШК товара, конфигурация сама автоматически вызывает окно поиска, вставляет туда ШК и нажимает Enter, то в старых конфигурациях такой обработки нет. Требуется нажатие на кнопку F7, чтобы вызвать меню поиска, затем считать сканером ШК и только после этого, товар будет добавлен в список, например, в режим Кассира.

Согласитесь, это крайне неудобно. Было бы куда проще, если бы сканер, перед вставкой ШК сам программно «нажимал» F7. Такая функция существует. За работу в таком режиме отвечают префиксы.

По идее, можно было бы просто зайти в 1С и в настройках оборудования, задать сканеру ШК префикс. Но проблема в том, что префикс клавиши F7, вводится, как код 150, а в списке указаны коды только доя 127. Конечно, можно самому изменить конфигурацию, но как-то это не по нашему, не правильно, да и не логично. Поэтому гораздо более правильный вариант, это задать префикс в настройках самого сканера.

Настройка

И так. Нам понадобится инструкция сканера Eclipse MS 5145 LS USB. Алгоритм задания префикса следующий:

  1. Сначала код со страницы 1-1 — для ввода сканера в режим конфигурации.
  2. Затем код Prefix #1 на странице 8-1 — для указания, что мы собираемся задать первый префикс
  3. Теперь кодами со страницы 16-1 и 16-2, надо набрать код 150, т. е. считать сначала код для цифры 1, затем для цифры 5, затем для цифры 0 — коду 150 соответствует нажатие на кнопку F7.
  4. И в конце, опять считываем код со страницы 1-1 — для завершения конфигурирования.

Примечание! Для работы сканера по данной схеме, сканер должен быть подключен в режиме USB, будьте внимательны.

Всё. Теперь при считывании ШК, сканер будет выдавать следующую последовательность:

F7 + ШК + Enter

Это должно работать в бОльшей части старых конфигураций, которые не умеют нормально работать с оборудованием в режиме COM порта.

Ctrl + ↓ Ранее