вторник, 26 марта 2013 г.

FastReport 4 font reading and huge file size workaround solution

Information for Russian-speakingсDevelopers is in Russian version of this article

Environment:
Delphi 7 application, Fast Report 4 VCL


Problem 1:
Export files from FastReport to PDF is unreadable on Android-devices, iOS-devices and web mailers.


Solution 1 - PDF is unreadable on Android-devices, iOS-devices and web mailers
embed fonts in the report file.
In export component set this property to "true":
TfrxPDFExport.EmbeddedFonts

With embedded font report became readable on any client OS and Web Mailers.


Problem 2 (a consequence of the solution of the problem 1)
The report file is huge: approximately 1MB


Reason: embedded font (which we embed in pdf file to solve problem 1)

Particular Solution 2 -
The huge file-size of FastReport export to PDF with embedded fonts:

I must say that the general solution I have not found. Tried to use third-party filters, but they have bugs. Virtual pdf printer - is not suited for me as a solution, because it's hard to maintain. But I found a partial solution that work in my environment, hope it may be useful to someone:

The Main Idea of the solution: use a font with small file-size. Naturally this font you need to install on your development computer and on the client computer (only to computer of pdf-exporter customer).

Disadvantages solutions: font need to be installed on client computer.

Small in size (57KB) Arial-like font with Cyrillic Charset I've found here:
http://weblast.ru/fonts-493.html
direct link: http://weblast.ru/fonts/ukrainian/ARICYR.ttf

I've set Font property of all  labels and bands in a report to new font, and (BINGO!) export file reduced from 1MB to 120KB.

Please note that labels did not pickup new font when their CharSet property was setted to RUSSIAN_CHARSET, I had to change down all charsets to DEFAULT_CHARSET

Case history

The problem must be solved in 5 FastReport VCL (it includes only used font-characters in exported file), but there is stil not FastReport 5 VCL on developer's site, and who knows when it will be. Wrote to support - no answer.

Related Links

http://www.fast-report.com/en/forum/index.php?showtopic=7265

http://stackoverflow.com/questions/6844831/any-good-pdf-export-filter-that-works-with-fast-report



FastReport 4 экспорт в PDF шрифты и большой размер файла: обходное решение

Окружение:
Программа на Delphi 7, FastReport 4 (VCL)

проблема 1: 
экспорт из FastReport в PDF не читается на андроид-устройствах, iOS-устройствах и веб-почтовиках.

решение проблемы 1 - PDF из FastReport не читается на Android, iOS, веб-почтовиках:
внедряем шрифт в файл.
в компоненте-экспорте свойство: TfrxPDFExport.EmbeddedFonts устанавливаем в true

и отчет нормально читается на всех клиентских машинах.

Проблема 2 (вытекает из решения проблемы 1)
Файл отчета становится большим: примерно 1Мб

Причина: внедренный шрифт (который мы внедрили для решения проблемы 1)

Частное Решение проблемы 2 - 
Большой размер файла экспорта из FastReport в PDF с внедренными шрифтами:

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

Суть решения: использовать маленький по размеру шрифт. Естественно шрифт нужно установить и на компьютере разработчика и на компьютере клиента.

Недостатки решения: на компьютер клиента нужно установить используемый шрифт.

Маленький по размеру (57Кб) Arial-подобный шрифт с кириллицей нашел здесь:
http://weblast.ru/fonts-493.html
прямая ссылка: http://weblast.ru/fonts/ukrainian/ARICYR.ttf

перевел все надписи и банды в отчете на новый шрифт, и экспортный файл уменьшился с 1Мб до 120Кб.

Обратите внимание: шрифт не хотел подхватываться если у надписей в отчете стоял RUSSIAN_CHARSET, нужно было все надписи сбить в DEFAULT_CHARSET


История вопроса

Проблема должна была решиться в FastReport 5 VCL (типа там из всего шрифта в экспортный файл должны внедряться только реально используемые символы), но пятой версии нет, и неизвестно когда будет. Писал в поддержку - ответа не получил.

Ссылки по теме

http://www.fast-report.com/en/forum/index.php?showtopic=7265

http://stackoverflow.com/questions/6844831/any-good-pdf-export-filter-that-works-with-fast-report


среда, 20 февраля 2013 г.

MS SQL - убирание всех соединений с базой

Задача:
обновить MS SQL базу, когда к базе есть подключения. нужно все подключения удалить

помог такой код с этой страницы http://www.julian-kuiters.id.au/article.php/sql-server-2005-snippet-drop-db-conn


USE master
GO

ALTER DATABASE database name
SET OFFLINE WITH ROLLBACK IMMEDIATE


ALTER DATABASE database name
SET ONLINE



этот совет помогает, но почему-то приходится делать команды по очереди (одним запросом перевел базу в офлайн, другим - в онлайн)
и имя базы нужно брать в квадратные скобки [ ]







понедельник, 11 февраля 2013 г.

Битрикс. Не выгружаются заказы с сайта

Суть проблемы
Перестали выгружаться заказы с сайта на Битриксе в 1С.

Симптомы
ошибок нет, при попытке загрузки заказов из 1с просто пишет, что изменения не зарегистрированы. и в выгружаемых файлах нет информации о заказах.


Расследование
Судя по всему хостер перенес мой сайт на другой сервер, с другой конфигурацией. И сайт стал читать локальный php.ini.

Решил проанализировать время с помощью php функции date()
Вывел в выводном фромате часовой пояс и обнаружил, что смещение идет на 4 часа вместо нужных 2-х.

Как анализировал:

Административная панель битрикса/Настройки/Инструменты/Командная PHP-строка
Ввел

echo (date("l dS of F Y H:i:s Z"));

Общение с поддержкой хостинга подтвердило мои догадки. Они посоветовали правильно настроить временную зону


Решение

Подредактировал php.ini,
установил параметр

date.timezone = "Europe/Kiev"

(ранее там было значение "Europe/Moscow")


Вопросы/пожелания/предложения оставляйте в комментариях

Справочные материалы


php-настройка временных зон

php-доступные временные зоны для европы

Про функцию дате - здесь:
http://www.codenet.ru/webmast/php/date.php





четверг, 7 февраля 2013 г.

Delphi отправить сообщение с уведомлением о доставке Indy-компоненты

Задача
Отправить сообщение с уведомлением о доставке

Средства реализации
Delphi 7, компоненты Indy 10

Решение

В сообщении TIdMessage устанавливает поле ReceiptRecipient

 lMessage.ReceiptRecipient.Text:= 'a@b.com';


Что происходит на фоне: устанавливается заголовок  в письме Read-Receipt-To


Продолжение темы
Если вы захотите автоматически разбирать подтверждения о доставке, смотрите статью
Delphi Indy 10 POP3 пример


UPD
Возникла проблема, которую пока не знаю как решить. Веб-интерфейс mail.ru игнорирует адрес из заголовка ReceiptRecipient. Уведомления о доставке он отправляет на адрес отправителя.

Вопросы/пожелания/предложения оставляйте кв комментариях

см. также

Общие вопросы отправки почты через Indy 10
http://dev-doc.blogspot.com/2012/08/delphi-indy-10.html

заголовки почтовых сообщений
http://www.activexperts.com/smtp-pop3-component/headers/


тут еще есть ссылка на заголовок X-Confirm-Reading-To
я его не использовал
http://delphimaster.net/view/6-25490

обсуждение вопросов гарантированной доставки
http://stackoverflow.com/questions/3525145/email-open-notification-ruby-on-rails/3525199#3525199

описание класса TIDMessage
http://kumanov.com/docs/prog/indy/007544.html

Delphi Indy 10 POP3 Пример

Простой пример обработки входящей почты с использованием POP3 компонент Indy10 для Delphi 7

(практическая задача была: обработать уведомления о доставке)

на форме компоненты:

  IdPOP3: TIdPOP3;
  IdMessage: TIdMessage;


Ниже: текст процедуры


...
var
  msgs: integer;
  i: integer;
  flag: boolean;

  msgcnt: integer;
begin
  IdPOP3.Host:= 'XXXX';
  IdPOP3.Username:= 'XXXX';
  IdPOP3.Password:= 'XXXX';
  IdPOP3.Port:= 110;

  IdPOP3.Connect;
  try
    msgcnt:= IdPOP3.CheckMessages;
    
    for I:= msgcnt to 1 do
    begin
      IdMessage.Clear;
      flag:= false;

      if (IdPOP3.Retrieve(i, IdMessage)) then
      begin
        ProcessMessage(IdMessage.From.Address, IdMessage.Subject);        
        flag:= true;        
      end;
      if flag then
      begin
        IdPOP3.Delete(i); //удаление письма
      end;
    end;    
  finally
    IdPOP3.Disconnect;
  end;
end;


UPD если нужно извлечь текст сообщения, может помочь такой код

var
  locBody: string;
...

        if (locBody = '') then
        begin
          for j:= 0 to IdMessage.MessageParts.Count - 1 do
          begin
            if (IdMessage.MessageParts[j] is TidText) then
            begin
              locBody:= (IdMessage.MessageParts[j] as TidText).Body.Text;
              if locBody <> '' then break;
            end;
          end;
        end;
...


Вопросы/пожелания/предложения оставляйте в комментариях.

см. также

Отправка почты через Smtp компоненты Indy10 в Delphi7
http://dev-doc.blogspot.com/2012/08/delphi-indy-10.html


За основу взял код на стековерфлоу
http://stackoverflow.com/questions/5336984/how-to-receive-emails-using-indy-10-and-delphi-7-with-the-file-attachment

Еще один простой пример
http://www.lazarus.freepascal.org/index.php?topic=17626.0

среда, 23 января 2013 г.

Атака Ботов. Повышение нагрузки из за ботов на сайт Битрикс и борьба с ними

Суть вопроса

Сайт на Биртиксе стал перегружать хостинг (хостинг http://1gb.ua)
Нужно было решить вопрос, чтобы сайт не закрыли

Задача:
Определить причину перегрузки сайта на Битриксе и устранить её.

1.Определение причины
 Как определил, что перегружают боты
Поддержка хостинга посоветовала посмотреть статистику нагрузки по IP адресам
Статистика процессорной нагрузки/Детализация по страницам, IP адресам

На этой странице видно было что пиковую нагрузку создавал msnbot

После выяснения того что в нагрузке на сайт виновны боты, появился уточненный вариант задачи

Задача уточненная
Уменьшить нагрузку на сайт от поисковых ботов


2. Решение проблемы.
Замедление ботов

Опять же поддержка посоветовала править robots.txt
(тут идея такая: в корне сайта нужно создать файл robots.txt в котором можно настроить ограничения для поисковиков
подробнее про файл robots.txt в ссылках ниже
(также в ссылках ниже есть информация про параметр Crawl-delay, который замедляет боты)

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


# замедляем боты
User-agent: msnbot
User-agent: bingbot
User-agent: MSNBOT/0.1
Crawl-delay: 30





Доп информация по теме

инфо про файл robots.txt
http://robotstxt.org.ru/
http://dataword.info/robots.php

http://lermont.ru/blog/msg.php?msg=7 (тут есть инфо про замедление ботов)
http://webartsolutions.com/articles/doklad-robotstxt.html (тут есть примеры замедления ботов)


несколько ссылок с именами ботов
http://forum.searchengines.ru/showthread.php?t=12731
http://www.jafsoft.com/searchengines/webbots.html
http://mastertalk.ru/discussion/119161/podskazhite-imena-botov-poiskovyh-sistem/#Item_5


История общения с поддержкой



2013-01-22 11:02 Вы: Добрый день!
проблемы с магазином на битриксе
vavilon-shop.com.ua
: после переноса на новый сервер с PHP 5.3 он вызывает перегрузку оборудования
на старом сервере такого не было (был установлен акселлератор).

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

вопрос: появился ли у вас сервер с PHP 5.3 на Fast/CGI ?

2013-01-22 11:02 1Gb.ua: Дежурит специалист(ов): 5
Задавайте вопрос (если есть) - свободный специалист ответит вам.
(если вы уже задали вопрос - ожидайте ответа)

2013-01-22 11:03 1Gb.ua: Здравствуйте

2013-01-22 11:03 Вы: у вас заявлено соответсвие параметрам битрикса начиная с тарифного плана основной+,
а у нас сайт не может нормально работать на плане Максимальный
http://www.1gb.ua/price_bitrix.php#p2

2013-01-22 11:04 1Gb.ua: PHP 5.3 на Fast/CGI пока нет

2013-01-22 11:04 Вы: что с ресурсом делать? каждый день приходят письма о больших перегрузсках с угрозой отключить ресурс

2013-01-22 11:07 1Gb.ua: это не угроза, просто предупреждение. Нагрузка никак не связана с переходом на другой тип сервера

2013-01-22 11:07 1Gb.ua: судя из логов большую часть нагрузки создает msnbot

2013-01-22 11:08 Вы: а что это? есть где почитать

2013-01-22 11:08 Вы: просто раньше таких проблем в принципе не было

2013-01-22 11:09 Вы: а при переносе на сервер с пхп 5.3 с отключенным акселлератором производительность битрикса упала с 30-ти до 7-ми пунктов

2013-01-22 11:09 1Gb.ua: Настроить скорость проходения поисковых ботов можно в файле robots.txt
Так же в нем можно вообще запретить к индексации msn ботом Ваш сайт

2013-01-22 11:10 1Gb.ua: детальнее http://robotstxt.org.ru/

2013-01-22 11:10 Вы: ок, это может помочь.
посдскажете ссылки где почитать про скорость прохождения ботами?

2013-01-22 11:10 Вы: ок, спсб

2013-01-22 11:11 1Gb.ua: смотрите так же статистику https://www.1gb.ua/c/cpustat

2013-01-22 11:11 Вы: подскажите пож как вы статистику смотрели?
(чтобы я в след раз сам идентифицировал проблему)

2013-01-22 11:11 1Gb.ua: "Детализация по страницам, IP адресам"

2013-01-22 11:12 1Gb.ua: на крайний случай, можно просто напрямую заблокировать ip которые создают нагрузку, их там не много

2013-01-22 11:14 Вы: читаю http://robotstxt.org.ru/
не вижу раздела про скорость прохождения.
может подскажете?

2013-01-22 11:16 1Gb.ua: там довольно много информации смотрите, так же можете посмотреть и на других ресурсах, msnbot можно вообще заблокировать. Ваша целевая аудитория им точно не польщуется

2013-01-22 11:27 Вы: здесь
http://dataword.info/robots.php
нашел про Crawl-delay,
спасибо, буду пробовать

2013-01-22 11:27 1Gb.ua: пожалуйста

2013-01-22 11:27 1Gb.ua: Всего доброго