Psytronica

Web-разработка, иностранные языки, Eclipse и разные разности

Zygo Profile

Плагин расширенного профиля Joomla 3.x с поддержкой аватаров (генерация миниатюр). Позволяет добавлять поля в профиль, выводить их содержимое в модуле и материалах.

Санскрит - словоформы

Программа, позволяющая практиковаться в составлении форм санскритских глаголов.

Verbos Irregulares

Приложение-тренажер, позволяющее более эффективно запоминать неправильные испанские глаголы. Легкая и увлекательная подготовка к экзамену.

С Днем Защитника Отечества!

23.02.2017
С днем защитника отечества

Дорогие мужчины, поздравляю вас с Днем Защитника Отечества!

Желаю вам силы, стойкости, воли и выдержки, веры в себя, внутреннего равновесия, крепкого здоровья. Чтобы вас вела ясная и светлая цель как путеводная звезда, желаю вам решительно и уверенно идти по вашему пути, не сдаваться и показывать настоящий пример мужества себе и всем, кто вас окружает.

    Zygo Joomshopping Review Captcha - капча KCaptcha для отзывов в интернет-магазине Joomshopping

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

    KCaptcha используется в разных полезных расширениях, в том числе, в jComments. Эта капча не относится к откровенно издевательским капчам, в которых тест Тьюринга не пройдет даже простой смертный.

      Скачать Zygo Joomshopping Review Captcha
      Демо - сайт с установленным расширением

    В админ-панели достаточное количество настроек, которыми можно варьировать:
    Дальше >>

    Подарок от Евгения

    04.02.2017
    Сегодня мне один очень хороший человек по имени Евгений сделал анимированный подарок.



    Помимо того, что Евгений хороший человек, он еще и прекрасный специалист, великолепно владеет autoCAD'ом, а какое-то время назад открыл для себя новое направление и теперь занимается светодиодными экранами и разными другими интересными вещами.

    Все началось с того, что несколько лет назад Евгений установил плагин Shnodoubles для уничтожения дублей под cms Joomla, который я тогда написала. Ни для кого не секрет, что cms Joomla позволяет доступиться к одной и той же странице по бесконечному числу ссылок.

    Пример таких ссылок:
    1. http://сайт/my_cat/my_page.html
    2. http://сайт/my_cat/my_page
    3. http://сайт/index.php?option=com_content&view=article&id=5:my_page&Itemid=10
    4. http://сайт/index.php?option=com_content&view=article&id=5

    Суть плагина состояла в том, что он вычислял единственную верную ссылку на нужную страницу и перенаправлял с остальных неверных. Рассмотрим это на нашем примере: пусть правильно сформированная ссылка будет ссылка 1. Тогда при переходе по ссылкам 2, 3 или 4 плагин будет автоматически перенаправлять посетителя на ссылку 1 (301 редирект).

    Два года назад я передала этот плагин студии JoomLine, все это время они его развивают, выпускают новые версии. Теперь плагин называется JL No Doubles.


    Студией JoomLine руководит очень отвественный человек - Вадим Куницин, все их расширения, с которыми я имела дело, оставили у меня самое приятное впечатление.

    Inno - создание инсталлятора. Рекурсивное копирование файлов внешней директории, учитывая даты.

    02.02.2017
    У меня появилась задачка - сделать инсталлятор для программы Windows, причем в качестве основы взять один из свободно распространяемых GUI-инсталляторов. Инсталлятор мой должен был выполнять не совсем обычный функционал - копировать файлы из уже существующих директорий, вызывать некоторые другие программы на разных этапах установки, даже делать несложные расчеты. Пересмотрела я много чего и поняла, что по большей части существует 3 группы инсталляторов:
    • развесистые монстры, которые могут как джинн выполнить почти любую, даже самую замысловатую прихоть
    • простые и довольно ограниченные в функционале заготовки под типовые задачи
    • инсталляторы на базе скриптов
    Что касается первых - искать среди них свободные и бесплатные явно не приходится. Вторые не подходили под мою не совсем тривиальную задачку. Среди третьей группы лидирует NSIS, вещь грандиозная, можно сделать что угодно, правда он полностью базируется на скриптах. Имеется плагин под Eclipse, который позволяет в конструкторе форм создавать формы страниц инсталлятора, поддерживается подсветка синтаксиса и другие полезности.

    В результате я остановилась на вполне удачном варианте - Inno. При помощи Wizard генерируется код заготовки под инсталлятор, потом есть возможность дополнять и менять этот код. Пишется этот код на паскале.

    А вот и задачка, с которой я столкнулась: по завершению инсталляции скопировать директорию, не включенную в инсталлятор, при этом заменяя файлы, сравнивая их по timestamp'ам. Откуда копировать директорию и куда - указывается во время установки.

    Вначале я сделала попытку:
    Source: "{code:GetFromDir}\*.*"; DestDir: "{code:GetToDir}"; Flags: comparetimestamp recursesubdirs;
    К желаемому результату это не привело. Скрипт вываливался с ошибкой. Как я потом поняла, Source директория определяется во время компиляции инсталлятора, поэтому секция code еще не выполняется

    Добавление флажка 'external' не дало желаемого результата, поскольку, хоть при наличии этого влажка Source директория определяется во время выполнения кода, тем не менее, это происходит раньше, чем я получаю значение из соотвествующего поля инсталлятора.

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

    function CmpFileTimes(Source, Dest: TFileTime): Boolean;
    begin
      if Source.dwHighDateTime > Dest.dwHighDateTime then
    
           Result := True
    
      else if (Source.dwHighDateTime = Dest.dwHighDateTime) and 
              (Source.dwLowDateTime > Dest.dwLowDateTime) then
    
           Result := True
      else 
           Result := False
    
    end;
    
    procedure DirectoryCopy(SourcePath, DestPath: string);
    var
      FindRec: TFindRec;
      SourceFilePath: string;
      DestFilePath: string;
    
      SourceLastWriteTime: TFileTime;
      DestLastWriteTime: TFileTime;
    
      DestFindRec: TFindRec;
    
    begin
      if FindFirst(SourcePath + '\*', FindRec) then
      begin
        try
          repeat
            if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
            begin
              SourceFilePath := SourcePath + '\' + FindRec.Name;
              DestFilePath := DestPath + '\' + FindRec.Name;
              SourceLastWriteTime := FindRec.LastWriteTime;
    
              if (FileExists(DestFilePath))then
              begin
                   if FindFirst(DestFilePath, DestFindRec) then
                   begin
                      DestLastWriteTime := DestFindRec.LastWriteTime;
                   end;
              end;
    
              if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
              begin
                if not(FileExists(DestFilePath)) or CmpFileTimes(SourceLastWriteTime, DestLastWriteTime)  then 
                begin
    
                    if FileCopy(SourceFilePath, DestFilePath, False) then
                    begin
                      Log(Format('Copied %s to %s', [SourceFilePath, DestFilePath]));
                    end
                      else
                    begin
                      Log(Format('Failed to copy %s to %s', [SourceFilePath, DestFilePath]));
                    end;
    
                end
                    else
                begin
    
                     Log(Format('File: %s in actual state', [SourceFilePath]));
                end;
              end
                else
              begin
    
                if not(DirExists(DestFilePath))then 
                begin
    
                    if CreateDir(DestFilePath) then
                    begin
                      Log(Format('Created %s', [DestFilePath]));
                      DirectoryCopy(SourceFilePath, DestFilePath);
                    end
                      else
                    begin
                      Log(Format('Failed to create %s', [DestFilePath]));
                    end;
                end
                  else
                begin
                      Log(Format('Existed %s', [DestFilePath]));
                      DirectoryCopy(SourceFilePath, DestFilePath);
                end;
              end;
            end;
          until not FindNext(FindRec);
        finally
          FindClose(FindRec);
        end;
      end
        else
      begin
        Log(Format('Failed to list %s', [SourcePath]));
      end;
    end;
    

    TiddlyWiki: сохранение 10 последних резервных копий на сервере.

    30.01.2017
    Некоторое время назад я познакомилась с замечательной вещью - TiddlyWiki, которая позволяет сохранять информацию и структурировать ее по своему желанию. Для тех, кому надо держать свои наработки и данные в упорядоченной структуре, это прекрасное решение. От других решений она отличается большой гибкостью в своей настройке. Использовать можно на локальном компьютере, открывая ее в браузере, на нескольких компьютерах, храня файл tiddlyWiki в файлообменнике (dropbox, mail.ru облако и т.п.), а так же при необходимости можно использовать на сервере. Существуют решения и для мобильных устройств.

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

    Если в файле store.php переменная $CLEAN_BACKUP установлена true, то происходит уничтожение старых резервных копий. Но уничтожение файлов происходит исходя из их дат - сохраняются все резервные копии за текущий час, одна резервная копия за каждый прошлый час, по резервной копии за каждый прошлый месяц, и, соотвественно, за каждый прошлый год. Таким образом, если часто редактировать wiki у себя на сервере, количество копий может возникнуть немереное. А на сервере может быть лимит места.

    Это можно решить так: сохранять на сервере только несколько последних резервных копий. Для этого можно заменить функцию cleanFiles в store.php на следующую:


     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    function cleanFiles($dirname, $prefix){
    
    	// максимальное количество сохраняемых резервных копий
        $countBackups =10;
    
        $files = glob($dirname.'/'.$prefix.'.*.html');
    
        if(count($files) <= $countBackups) return array();
    
        usort($files, function($a, $b) {
            return filemtime($a) < filemtime($b);
        });
        return array_slice($files, $countBackups);
    }
    


    P.S: чтобы TiddlyWiki корректно работала на вашем сервере под PHP7, необходимо в store.php заменить все функции split на explode


    P.P.S: инструкция по сохранению tiddlyWiki на собственном сервере: Saving on a PHP Server
    Облако тегов
    Меню
    Архив
    << < 123 > >>
    © Psytronica.ru. Блог существа SherZa. 2015-2017 Наверх