Category: Soft/Programming

  • Прием платежей PayPal

    Инструкции как прикрутить прием платежей в PayPal на своем сайте:
    http://www.askdev.ru/question/946/%D0%9F%D1%80%D0%B8%D0%B5%D0%BC-PayPal-%D0%BD%D0%B0-%D1%81%D0%B0%D0%B9%D1%82%D0%B5/

  • ePUB

    Нужно будет написать новый парсер для этого формата в свой SMWord suite

    http://fantaseour.livejournal.com/141276.html
    **************************************************************

    Ответ на мои грустные вздохи о смерти CHM и не возможности читать архивы прямо из браузера лежал на поверхности.

    Это EPUB (electronic publication) (also sometimes ePub, EPub, or epub) — открытый стандарт для электронных книг.


    В основе решения все те же xhtml+css. Правда в стандарте набор тегов и возможностей ограничен, но это скорее для того, чтобы читалки можно было совместимые делать.

    Итак внутри xhtml+css+media, плюс xml-файлы с мета-информацией, шрифт можно тоже положить и указать потом в css. Все это пакуется в несколько специфичный зип: Метаинформация идет в начале зип-файла и она не сжимается, дальше остальной контент, уже пожатый. Делается двумя командами:

    zip -X0 “full path to new epub file” mimetype
    zip -rDX9 “full path to new epub file” * -x mimetype

    Читается практически всеми читалками, кроме Kindle, но легко переводится в совместимый формат, и скорее всего будет читаться в будущем. Свободных конвертилок из chm в epub я не нашел, ну не велика беда — понятно, что это можно и самому написать.

    На десктопе есть несколько читалок разной степени паршивости, плагин для Mozilla, виджет для Оперы, и читалка в онлайне (см. далее).
    Для Сафари плагина не нашел, но в айфоне Сафари читает книжки из веба по протоколу epub://, значит скоро и на десктопе будет поддержан.

    DRM тоже как-то предусмотрен, но я в подробности не вдавался.

    Книжки в таком формате уже довольно популярны. На epubBooks.com, можно взять бесплатных книг и поиграть с ними. O’Reilly широко использует этот формат для своих книжек. У Гугла есть поиск по книгам, где также ищутся книги в этом формате.

    Книжку можно собрать, как руками из нужных файлов (т.е. своей программой:), так и с помощью бесплатного кросс-платформенного редактора Sigil. Кроме того Adobe Indesign, также поддерживает этот формат, а из документов офиса можно получить epub через конвертор Callibre.

    Звучит неплохо.

    Теперь про читалки для десктопа.
    Adobe Digital Editions
    Ридер бесплатный.
    Я его сейчас ставить не стал, т.к. я им немного пользовался. Он на флеше, по ощущениям неуклюж, по отзывам верстка там едет (хотя редеринг сделан на WebKit).
    Вот описание его глюков от конкурирующей фирмы:
    Adobe Digital Editions Quirk

    Calibre
    www.calibre-ebook.com
    Open Source, Кросс-платформенный.
    Читалка и конвертилка практически из любого формата в любой. CHM не умеет.
    Рендеринг — WebKit. На вид приятен и опрятен.
    Может сделать epub из архива с html, но перепутает порядок файов и вложенность, т.к. нет xml-файла с оглавлением.
    Показывает хорошо, но на больших длинных файлах fb2 тормозит безбожно. И вообще немного задумчив.
    Позволяет закачивать выкачивать книги из мобильных девайсов (не проверял).

    Lexcycle Stanza
    www.lexcycle.com
    Куплен Амазоном
    Использует уже знакомый нам рендеринг WebKit. Работает на айфоне и десктопе. Умеет конвертить epub в формат Kindle.
    Мне не понравился, тем, что не отображает слева разделов содержания, этот момент мне очень нравится в CHM.

    Mobipocket
    www.mobipocket.com
    Еще один купленный Амазоном проект. Умеет читать EPUB, поддерживает свой формат, также представляющий собой архив с html+дополнительная информация. Свободно конвертирует между этими двумя форматами.
    Работает на очень большом количестве карманных читалок.
    Не работает на Линукс и Мак.
    Формат mobipoket читается упомянутыми Stanza и Calibre, а также Okular
    На десктопе также не показывает оглавление, что для меня является приговором.

    Okular
    http://okular.kde.org/
    KDE-универсальная читалка. Читает буквально все — DJvu, CHM, PS, PDF, EPUB, FB2
    болшой скриншот

    bookworm
    http://bookworm.oreilly.com/

    Онлайновая читалка от O’Reilly. Регистрируешься и можешь закачивать книги. Потом можно читать. Выглядит красиво.
    OpenSource, написана на С и Python, живет на googlecode.

    EPUBReader
    https://addons.mozilla.org/en-US/firefox/addon/45281

    Плагин для Огнелиса. В замен устаревшего OpenBerg Lector.
    Выглядит также весьма опрятно.

    Opera Ebook reader
    http://widgets.opera.com/widget/10312/

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


    **************************************************************

  • нотификации в Windows

    Вот чего мне не хватает в Windows, так это нотификаций по событиям.
    Например, при удалении определенного файла или каталога я хочу отсылку email админу. А при изменении некоторых файлов мне нужно скопировать их на флешку.

    Разумеется там должны поддерживаться много нотификаций на одно и тоже событие (например, и email, и запустить какую-то программу с параметрами при добавлении файла), и условия (например, файл должен быть изменен из программы XXX).

    А то Microsoft пошел по пути навешивания рюшечек, а в ядре нет еще очень многих базовых функций.

  • drag’n’drop from external applications

    In Friday in our SIM (Shareware Information System) I added the possibility to drag’n’drop the mail content from external mailer (MS Outlook, Outlook Express etc)

    To add this feature you need:
    1. declare two new Cliboard formats that need to be registered:

    var
      CF_FILECONTENTS,
      CF_FILEDESCRIPTOR: Integer;initialization
    
      // Initialize the OLE libraries
      OleInitialize(nil);
    
      // Register the clipboard formats that we need to handle in the
      // OLE drag drop operation
      CF_FILECONTENTS := RegisterClipboardFormat(CFSTR_FILECONTENTS);
      CF_FILEDESCRIPTOR := RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR);
    
    finalization
      OleUninitialize;
    

    2. in OnCreate event for your form allow window to accept drop events. Just execute the next code:

    OleCheck(RegisterDragDrop(Handle, Self));
    

    3. for your form you need implement a few methods for IDropTarget interface:

    type
      TfrmOrderWizard = class(TForm, IDropTarget)
      ...
      private
        { IDropTarget }
        function DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
                           var dwEffect: Longint): HResult; stdcall;
        function DragOver(grfKeyState: Longint; pt: TPoint;
                          var dwEffect: Longint): HResult; stdcall;
        function DragLeave: HResult; stdcall;
        function Drop(const dataObj: IDataObject;
                      grfKeyState: Longint; pt: TPoint;
                      var dwEffect: Longint): HResult; stdcall;
        { IUnknown
         Ignore referance counting }
        function _AddRef: Integer; stdcall;
        function _Release: Integer; stdcall;
        ...
    

    where:

    function TfrmOrderWizard.DragEnter(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
         var dwEffect: Longint): HResult;
    begin
      dwEffect := DROPEFFECT_COPY;
      Result  := S_OK;
    end;
    
    function TfrmOrderWizard.DragOver(grfKeyState: Longint; pt: TPoint;
         var dwEffect: Longint): HResult;
    begin
      dwEffect := DROPEFFECT_COPY;
      Result := S_OK;
    end;
    
    function TfrmOrderWizard.DragLeave: HResult;
    begin
      Result := S_OK;
    end;
    
    function TfrmOrderWizard._AddRef: Integer;
    begin
       Result := 1;
    end;
    
    function TfrmOrderWizard._Release: Integer;
    begin
      Result := 1;
    end;
    
    function TfrmOrderWizard.Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
      var dwEffect: Longint): HResult;
    const
      PT_TSTRING = ULONG(30);
      PT_UNICODE = ULONG(31);
      PR_BODY    = PT_TSTRING or ($1000 shl 16);
      PR_BODY_W  = PT_UNICODE or ($1000 shl 16);
    var
      aFmtEtc: TFORMATETC;
      aStgMed, stgmitem: TSTGMEDIUM;
      pData: PChar;
      pfgd: PFileGroupDescriptor;
      dwCount, dwfetch: Integer;
    
      stat: STATSTG;
      pstg: IStorage;
      pstm: IStream;
    begin
      {Make certain the data rendering is available}
      if (dataObj = nil) then
        raise Exception.Create('IDataObject-Pointer is not valid!');
      with aFmtEtc do
      begin
        cfFormat := CF_TEXT;
        ptd := nil;
        dwAspect := DVASPECT_CONTENT;
        lindex := -1;
        tymed := TYMED_HGLOBAL;
      end;
      {Get the data}
      OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
      try
        {Lock the global memory handle to get a pointer to the data}
        pData := GlobalLock(aStgMed.hGlobal);
        { Replace Text }
        MemoOrder.Text := pData;
      finally
        {Finished with the pointer}
        GlobalUnlock(aStgMed.hGlobal);
        {Free the memory}
        ReleaseStgMedium(aStgMed);
      end;
    
      // Get the file descriptors
      with aFmtEtc do
      begin
        cfFormat := CF_FILEDESCRIPTOR;
        ptd := nil;
        dwAspect := DVASPECT_CONTENT;
        lindex := -1;
        tymed := TYMED_HGLOBAL;
      end;
      OleCheck(dataObj.GetData(aFmtEtc, aStgMed));
      try
        pfgd := PFileGroupDescriptor(GlobalLock(aStgMed.hGlobal));
        // Iterate each of the files
        for dwCount := 0 to pfgd.cItems-1 do
        begin
          // Set up for getting the file data
          with aFmtEtc do
          begin
            cfFormat := CF_FILECONTENTS;
            ptd := nil;
            dwAspect := DVASPECT_CONTENT;
            lindex := dwCount;
            tymed := TYMED_ISTORAGE;
          end;
          if (dataObj.GetData(aFmtEtc, stgmitem) = S_OK) then
          begin
            // IStorage (handle the outlook item)
            pstg := IStorage(stgmitem.stg);
            // Hard coded to open the outlook message item stream
            if (pstg.OpenStream('__substg1.0_1000001F', nil, STGM_SHARE_EXCLUSIVE or STGM_READ, 0, pstm) = S_OK) or
               (pstg.OpenStream('__substg1.0_1000001E', nil, STGM_SHARE_EXCLUSIVE or STGM_READ, 0, pstm) = S_OK) then
            begin
              pstm.Stat(stat, STATFLAG_DEFAULT);
              pData := AllocMem(stat.cbSize);
              try
                pstm.Read(pData, stat.cbSize, @dwFetch);
                // Set the msg body
                MemoOrder.Lines.Add(String(pData));
              finally
                // Free buffer memory
                FreeMem(pData);
              end;
              // Free the stream
              pstm := nil;
            end;
            // Free the storage
            pstg := nil;
            // Release the storage medium
            ReleaseStgMedium(stgmitem);
          end;
        end;
      finally
        // Unlock the memory
        GlobalUnLock(aStgMed.hGlobal);
        // Release the storage medium
        ReleaseStgMedium(aStgMed);
      end;
    
      Result := S_OK;
    end;
  • Delphi 2009

    Для того, чтобы на одном компе могли одновременно работать Delphi 2009 и новый 2010 необходимо поставить Service Pack 3 for Delphi 2009. На домашнем лаптопе это прошло без сучка и задоринки.
    На рабочем компьютере я уже задолбался. Принес скачаные файлы из дому и запустил сетап, а он через полчаса работы отвалился, т.к. Kaspersky Antivirus удалил там какой-то файл (как подозрительный). Покопался в google – разработчики в Borland/CodeGear/Embacadero используют какой-то свой слишком навороченый алгоритм упаковки exe-файлов, которые Kaspersky детектит как вирус.

    Снес Kaspersky временно и запустил инсталляцию еще раз, а она вообще просто тупо отваливается через минут двадцать (и так пару раз).

    Решил снести весь D2009 и поставить его заново. А умники из CodeGear свой какой-то инсталлятор замутили. Сначала деинстал идет в течении 3-4 часов с миганием названия для каждого мелочного файла, а потом инсталляция еще столько же и с тем же показом всех файлов.
    Ну спрашивается, зачем показывать эту информацию и зачем использовать такие медленные алгоритмы сжатия-разжатия файлов? Почему Visual Studio ставится легко и быстро и приятно, а эта фигня отнимает и время, и ресурсы, и нервы:-(

  • Regsoft order message

    RegSoft changed the default template for mails with order notifications. They included there the IP address.

    I waited this feature 10 years:-) Until today I saw the IP for orders in online reports only (in their control panel) but today I changed the parser and now IP inserted in our database automatically. Not manually as before:-)

    Now I’m waitinh when they will include in message template the order time (not only date part) and Auth Code which are available now from online report only

  • directives for Embacaderro Studio 2010 complier

    {$IFDEF VER210}
      {$DEFINE SMForDelphi3}
      {$DEFINE SMForDelphi4}
      {$DEFINE SMForDelphi5}
      {$DEFINE SMForDelphi6}
      {$DEFINE SMForDelphi7}
      {$DEFINE SMForDelphi2005}
      {$DEFINE SMForDelphi2006}
      {$IFDEF BCB}
        {$DEFINE SMForBCB2006}
        {$DEFINE SMForBCB2007}
        {$DEFINE SMForBCB2009}
        {$DEFINE SMForBCB2010}
      {$ENDIF}
      {$DEFINE SMForDelphi2007}
      {$DEFINE SMForRADStudio2007}
      {$DEFINE SMForDelphi2009}
      {$DEFINE SMForDelphi2010}
    {$ENDIF}
  • “реклама” продуктов

    Когда я начинал свою шароварную деятельность, основными каналами для генерации продаж были newsgroups и програмерские форумы. Для моих компонент (не enduser tools) общение с программистами всегда было и интересней, и полезней, чем сабмит по каталогам-статьям.
    Более того я даже сейчас уже и не смогу смело вспомнить, что было первично – мои посты в ньюсгруппах, или написание компонент на продажу. Они как-то паралельно шли всегда.

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

    В последнее время частичный переход от компонент к end-user тулзам, ограничение доступа к nntp/newsgroup’ам и закрытие “моих” форумов (delphipages, for example) привели к тому, что эти каналы практически зачахли. Это меня бы не сильно парило, если бы меня интересовали только деньги.
    Мне не хватает “общения”:-) Мне не нужны всякие livejournal, facebook и одноклассники. Я их могу почитывать, но не пишу туда.
    Причем всякие “бонусы” меня даже не интересовали. Например, я узнал о системе накопления очков/points на delphipages.com совершенно случайно, когда меня поздравили с какой-то круглой суммой набранных экспертных очков. Я отвечал-общался там, т.к. мне было интересно.

    В последнее время обратил свое внимание на Yahoo Answers и StackOverflow
    Т.е. про их существование я знал давно, конечно. И иногда туда заходил из поисковых запросов. Но как-то личного кайфа от этого не имел. Для меня они были в категории Expert Exchange – фигни, обвешанной рекламой и где на 1% полезного есть 99% мусора.

    А вот в последние дни свое мнение кардинально поменял. Похоже эти двое Yahoo Answers и StackOverflow – реинкарнация старых newsgroups в сегодняшнем web’е.