Запускаем закрытую программу в Windows

Если ваша или не ваша программа по непонятным причинам закрывается, то лучше, конечно, разобраться по какой причине это происходит. Но бывают случаи, когда проще проверить запущен ли нужный процесс и если нужного процесса нет среди запущенных, то запустить его. Особенно это актуально, если программа чужая и исходников нет.
У меня такая ситуация случилась на сервере с ботами, которые должны трудиться круглые сутки, а они иногда «молча» выключаются.
В крон или планировщик вставляю следующий «батник»:

set fullname=c:\program\program.exe
set name=program.exe

tasklist /FO CSV /NH | find /I "%name%">nul

if %errorlevel% NEQ 0 (
start %fullname% 
echo %date% %time% "start closed process" >> loader.log
)

Пояснение построчно:

  • Строка 1: Полный путь к запускаемой программе
  • Строка 2: Название процесса, который надо мониторить в списке запущенных процессов
  • Строка 4: Команда tasklist получает список всех процессов, а команда find ищет в этом списке процесс, заданные в строке 2.
  • Строка 6: Если предыдущая команда (в строке 5) не вернула ошибку, то есть процесс найден в списке, то выполняется строка 7
  • Строка 7: запуск программы.
  • Строка 8: Запись в лог времени запуска нашей программы.

Можно было строку 2 (название запускаемого процесса) заменить на автоматическое получение из строки 1 таким образом:

for %%a in ("%fullname%") do set name=%%~nxa

Но в моем случае запускаемая программа и процесс имели разные названия.
Чаще всего запускаемый процесс и искомый в памяти — равны, так что лучше использовать в строке 2 вариант автоматического получения имени.

Поиск с подсказками на jQuery + PHP

autocomplete В этой статье я кратко опишу свой опыт в реализации поиска в базе MySQL с автодополнением (это когда по мере набирания текста, во всплывающем окошке показываются похожие результаты, такое можно наблюдать при наборе текста в поисковиках и уже во многих сайтах). Это очень удобно, так как при поиске товара или чего-либо еще на сайте, рядом со строкой поиска появляется окно с уже найденными вариантами написания и пользователю уже легче ориентироваться, а так же меньше надо набирать текст.
Читать далее Поиск с подсказками на jQuery + PHP

Как программно создать фильтр для dxDBGrid

При использовании замечательно компоненты ExpressQuantumGrid Suite удобно в шапке Grid’а устанавливать фильтры. Но если надо установить фильтр программно, то я столкнулся с таким нюансом. Если просто надо отфильтровать данные по какому-то значению, то это делается легко вызовом такой процедуры:

dxDBGrid1.Filter.Add(AColumn: TdxDBTreeListColumn; const AValue: Variant; const ADisplayValue: string);

где
AColumn — какую колонку фильтруем
AValue — по какому значению фильтруем
ADisplayValue — что отобразить в панели статуса фильтра

Вот мой пример использования:
Читать далее Как программно создать фильтр для dxDBGrid

Меняем программно папку установки в Inno Setup

При использовании замечательного установщика Inno setup понадобилось сделать проверку на существование папки для установки программы. Если такая папка есть, то переименовать ее по определенному алгоритму (в моем случае добавлять единичку в конце имени) и не озадачивать пользователя переименованием; и уж тем более не перезаписывать программу. Вот такая задача: дать возможность ставить одну программу несколько раз в разные папки.

В скрипте меняем параметр DefaultDirName вот так:

DefaultDirName={code:newTargetDir}

И в конце скрипта в секции code пишем объявленную функцию newTargetDir:

function newTargetDir(Param : string):string;
var
 entry: String;
 i: integer;
begin
  entry := ExpandConstant('{sd}') + '\MyProgram\';
  i := 1;
  if DirExists(entry) then
    repeat
      entry := ExpandConstant('{sd}') + '\MyProgram' + IntToStr(i) + '\'; 
      i := i + 1;
    until not dirExists(entry);
  result := entry;
end;

Здесь встроенная переменная {sd} означает системный диск.

Копирование в буфер обмена в Delphi

Обычное копирование в буфер обмена командой

Clipboard.AsText := str;

работает если копируется строка с английскими символами и/или цифрами.
Строка из русских букв будет скопирована в неверной кодировке.
Вот тут нашел простое решение:

type
    TMyClipboard = class(TClipboard);

  procedure StrToClipboard(const AStr :string);
  var
    vLangID :LANGID;
  begin
    with TMyClipboard(Clipboard) do begin
      Open;
      try
        AsText := AStr;
        vLangID := GetUserDefaultLangID;
        SetBuffer(CF_LOCALE, vLangID, SizeOf(vLangID));
      finally
        Close;
      end;
    end;
  end;

Как исправить поврежденную базу MS SQL (Suspect Mode)

Так случилось, что MS SQL база перешла в «подозрительный» режим (Suspect mode). Никакие манипуляции с базой в таком режиме сделать невозможно, даже отключить. Помогла следующая серия команд в management Studio.
Для начала необходимо перевести базу данных в режим EMERGENCY:

EXEC sp_resetstatus 'yourDBname'
GO
ALTER DATABASE yourDBname SET EMERGENCY
GO

Далее появляется выполнять тестирование и исправление базы:

DBCC checkdb('yourDBname')
GO
ALTER DATABASE yourDBname SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DBCC CheckDB ('yourDBname', REPAIR_ALLOW_DATA_LOSS)
GO
ALTER DATABASE yourDBname SET MULTI_USER
GO

Как вводить только цифры в UITextField и ограничить длину строки ввода

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

Объявим константы

#define NUMBERS_ONLY @"1234567890"
#define CHARACTER_LIMIT 4

И пишем в делегате UITexField

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS_ONLY] invertedSet];
    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
    return (([string isEqualToString:filtered])&&(newLength <= CHARACTER_LIMIT));
}