Новое время меняет направления развития, приоритеты деятельности и наполняет новым содержанием жизнь. Банальное, казалось бы, импортозамещение в истинном глубинном смысле – это самостоятельность, самодостаточность и суверенитет. А нам нужен суверенитет? До недавнего времени отдельные дегенераты и настоящие предатели, по моему мнению, в нашем правительстве считали, что нет, что «все можно купить». И не просто так считали, но и уничтожали нашу промышленность своим бездействием и прямыми указаниями. А это очень просто. Когда «за бугром» у конкурента кредит стоит на порядки дешевле, то отказ от госзаказа и прямого финансирования своего производителя ставит крест на его дальнейшей судьбе. И только чудо или гениальность руководителя конкретной компании может спасти положение. Такие примеры есть. Но, это редкий случай.
Пришло новое время, и пришли новые люди, которые решают новые задачи в новых условиях, где суверенитет является непреходящей ценностью. Прежние испугавшиеся патриоты уехали в те страны, патриотами которых они себя считают. Надеюсь, что навсегда. Внутри страны остались «спящие» патриоты зарубежных стран. Возможно, что разберутся и с ними.
Какие задачи ставит время и государство перед нашим братом программистом? Прежде всего, перенос всей инфраструктуры на рекомендованные операционные системы. Когда я последний раз интересовался, это были: «Astra Linux» (ГК «Астра»), ОС «Альт» («БазАльт СПО») и «Ред ОС» («Ред Софт») – рекомендованные Минцыфры. Проведя беглое исследование в течении целого дня(!), я определился со своим лидером как ОС для разработчика. Ей оказалась Ред ОС. Какие критерии были важными? Во-первых, средства разработки в репозитарии были достаточно свежими. Во-вторых, минимальная необходимость в использовании консоли – все-таки 21 век, а не далекий 1996 год, когда я последний раз работал в DOS. В-третьих, если уж консоль, то простая установка программ. Для примера: «dnf install lazarus», «dnf install firebird» - для Linux это великолепно(!) Кроме того, на сайте РЕЕД ОС есть прекрасная база знаний с удобным поиском: База знаний (red-soft.ru) . В-четвертых, ОС для дома должна быть максимально идентичной с рабочей станцией, что сразу отменяет Альт. Астра не выдержала конкуренцию, когда стало ясно, что репозиторий у неё тухлый – все нужное старющих версий.
Кроме того, 1С значительно улучшила свой инсталлятор для Linux. Но, тут, как раз, меньше всего проблем с переносом разработок. Что же касается повседневных задач: офис, браузер, картинки и фоточки – все одинаково достаточно хорошо для непритязательного пользователя каким я и являюсь. Речи не идет о полном переходе. Этот текст я пишу в Windows в MS Office. Но, у меня есть свободный ноутбук, куда я и поставил РЕД ОС. Впрочем, в виртуалках есть все. В них можно будет тестировать разработки.
Эта статья для разработчика windows приложений, которые недавно начали разрабатывать Linux приложения. Типичный универсальный программист под Windows имеет большой запас знаний Win API. И использует эти знания везде, где только можно, а средства разработки, до недавнего времени, только поощряли такое поведение. В книгах и статьях писалось о том как напрямую использовать Win API. Эта информация высоко ценилась. У Microsoft есть целый сайт с справкой по Win API. Поэтому, у нас скопилось очень много проектов, которые не так то просто перевести в режим кросс платформенной разработки. Это надо исправлять. Надо заметить, что Lazarus кросплатформенен и именно для такой разработки и предназначен с самого начала. Всего многообразия источников информации нет для Linux. Но, лиха беда начала. Эта статья, как раз, мой вклад в дело распространения информации такого рода. Присоединяйтесь в коментах.
Прежде всего, хочу показать дурацкий пример как точно не надо делать. Это пример получения размера памяти:
function GetFreeMemorySize : Int64; // эта функция вернет размер доступной памяти в килобайтах
var
{$IFDEF MSWINDOWS}
mse : TMemoryStatusEx;
{$ELSE}
L : TStringList;
Re : TRegExpr;
{$ENDIF}
begin
Result := -1;
{$IFDEF MSWINDOWS}
mse.dwLength := SizeOf(mse);
if GlobalMemoryStatusEx(mse) then
begin
Result := mse.ullAvailPhys div 1024;
end
else ShowMessage(SysErrorMessage(GetLastError));
{$ELSE}
L := TStringList.Create;
if FileExists('/proc/meminfo') then
begin
L.LoadFromFile('/proc/meminfo');
Re := TRegExpr.Create;
re.ModifierM := true;
Re.Expression := 'MemFree:\s+(\d+)';
if Re.Exec(L.Text) then
Result := StrToInt64(Re.Match[1]);
Re.Free;
end;
L.Free;
{$ENDIF}
//
end;
Пример я нашел тут: Определить размер свободной памяти - Lazarus - Киберфорум (cyberforum.ru). Пример демонстрирует разницу в подходах счастливого разработчика в Windows и депрессирующего в Linux. В данном примере читается текстовый файл, а потом парсится для получения значения. В этих строчках видится безысходность и тоска. Программист уверен, что Lazarus оставил его один на один, как Элохим Иисуса на кресте, с жуткой проблемой вызова syscall, только вид которого вводит в депрессию. Кстати, заметьте, что программист не пользуется конструкцией try finalli для освобождения памяти. Он уверен в оборудовании и бесконечности памяти. Быть уверенным в бесконечности… Ну, так себе установка.
Итак, модуль SysUtils. Надо сразу пояснить, что строение модулей Lazarus не так тривиально как Delphi когда я его последний раз смотрел. Есть такая порода файлов inc – включаемые. Они и включают в себя разные версии одного и того же для разных операционных систем и разного оборудования. И лежат зачастую в разных папках – вот уж головоломка. Поэтому, указав в своем модуле SysUtils, Вы можете вызвать GetHeapStatus(), который объявлен в heaph.inc, а реализован… Впрочем, поинтересуйтесь сами. Интересно для общего развития посмотреть разницу реализации, где лежат файлы на самом деле и прочие бесполезные подробности пока не случилось не экстраординарное событие (затык). В Delphi тоже были файлы inc, но в основном они использовались для дефайнов.
На данный момент я откопал следующее:
Function GetTempDir(Global : Boolean) : String;
Function GetTempDir : String;
Function GetTempFileName(Const Dir,Prefix : String) : String;
Function GetTempFileName : String;
function GetTempFileName(Dir,Prefix: PChar; uUnique: DWORD; TempFileName: PChar):DWORD;
Function GetAppConfigDir(Global : Boolean) : String;
Function GetAppConfigFile(Global : Boolean) : String;
Function GetAppConfigFile(Global : Boolean; SubDir : Boolean) : String;
Function GetUserDir : String;
Function VendorName : String;
Function ApplicationName : String;
function GetHeapStatus:THeapStatus;
Если у Вас установлена библиотека synapse, то представляет интерес модуль synsock с объявленной в ней:
function GetHostName: AnsiString;
Впрочем, если поискать по исходникам, то оно много, где еще объявлено. Этого не так много, просто мне пока больше ничего не понадобилось. Откопаю еще что-то – дополню.
Не думаю, что надо что-то пояснять. Главное, что мы знаем про что именно надо искать в справке Lazarus. А вот с этим все более-менее средненько. Найти можно.
Итак, не в коем случае не читаем файлы с настройками Linux, не вызываем консольные команды с последующем парсингом вывода. Используем только настоящие вызовы, которые так или иначе приводят нас к syscall или so в которых syscall.
Успехов!