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

Позднее Ctrl + ↑

Проблема печати HP LaserJet P1566

Столкнулся недавно с проблемой печати принтера HP LaserJet P1566, аппараты в общем-то неплохие, хороший ресурс, простое обслуживание. Но в виду того, что сейчас каждый кому не лень занимается заправкой картриджей и при этом не вычищает отработку, очень частой проблемой становиться засорение внутренних отсеков принтера, что может вызвать проблемы с печатью.

Несмотря на популярность принтера, информации о проблемах практически никакой нет.

HP LaserJet P1566

Симптомы проблемы

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

Причина неисправности

Главной причиной неисправности при подобном застревании бумаги, является неправильная работа датчика протяжки бумаги. Зачастую, датчик засоряется, высыпающейся из картриджей, отработкой. Решается данная проблема либо полным ТО принтера, либо можно обойтись качественной продувкой при помощи мощного компрессора, чтобы очистить датчик от налипшей отработки.

В моём случае, проблема решилась простой чисткой компрессора.

Выводы

Очень часто приходится сталкиваться с проблемой экономии на заправке картриджей, зачастую, картриджи сейчас стали заправлять прямо на месте, либо при заправке просто не проводят ОБЯЗАТЕЛЬНУЮ чистку отсеков отработки и подвижных частей картриджа. При этом, как правило, экономия на заправке и чистке нивелируется в дальнейшем необходимостью проведения полного ТО или более дорогостоящего ремонта.

Экономить надо с умом.

Report Builder for Synadyn Broadcast 1.0

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

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

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

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

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

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

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

Прошло довольно много времени с момента написания первой статьи «Аудио-плеер на 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/

Библиотека libxml2.dylib

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

Update local File Cache

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

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

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

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

Проект

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

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

Файл libbass.a

Но, одного файла для работы будет недостаточно. Так же, в проект необходим добавить ещё 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 или история одного телефона

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

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

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

Заказ товара Xaomi Redmi Note 2

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

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

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

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

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

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

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

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

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

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

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

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

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

Ранее Ctrl + ↓