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

Zygo Profile

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

Verbos Irregulares

Новый релиз Zygo Profile: автообновления, камера, поддержка Joomla 3.7

26.02.2017
Сегодня, после тестирования плагина Zygo Profile ветки development, выкладываю релиз:
  Скачать новый релиз Zygo Profile
Релиз содержит ряд ценных наработок от docenttmp, включающих:
  • Поддержку автоматических обновлений из админ-панели Joomla
  • Поддержку веб-камеры при создании аватаров

А так же:
  • Сделана поддержка Joomla 3.7
  • Сделан плагин Zygo Kunena Avatars для отображения аватара из Zygo Profile в форуме Kunena
  • Cделан ряд фиксов и минорных изменений

Приглашаю всех пользователей установить релиз и поделиться отзывами и советами здесь или в нашей ветке на Joomlaforum.ru

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
Облако тегов
Меню
Архив
© Psytronica.ru. Блог существа SherZa. 2015-2017 Наверх