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

Портфолио

Санскрит

Verbarium

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

ZygoProfile: добавлены поля checkbox, checkboxes, html

24.11.2016
По просьбам пользователей я добавила в плагин Zygo Profile 3 новых поля:

checkbox - одинарный чекбокс
checkboxes - несколько чекбоксов, по сути поле соответствует полю списка множественного выбора
html - произвольный html-код


Поля checkbox и checkboxes генерируются на основе стандартных полей Joomla

ZygoProfile - назначение полей группам пользователей.

28.10.2016
В плагине ZygoProfile появился новый функционал - теперь можно назначать дополнительные поля одной или нескольким группам пользователей. Так, например, поле, которые Вы назначили пользователям группы manager, будет отображаться в профиле у пользователей, приналежащих этой группе. Так же у них появится возможность редактировать содержимое данного поля.


Отдельное спасибо Aoki Daisuke, который нашел проблему с отображением календаря. Я ее поправила и сделала возможность отображать календарь либо средствами Joomla (по умолчанию), либо средствами HTML5



Санскрит - запоминание глагольных форм

21.10.2016

Намасте! Перед Вами программа, которая позволяет практиковаться в составлении форм санскритских глаголов.

Описание работы программы:
Дальше >>
Облако тегов
Меню
Архив
© Psytronica.ru 2015-2018 Наверх