Найти в Дзене

API Linux

Новое время меняет направления развития, приоритеты деятельности и наполняет новым содержанием жизнь. Банальное, казалось бы, импортозамещение в истинном глубинном смысле – это самостоятельность, самодостаточность и суверенитет. А нам нужен суверенитет? До недавнего времени отдельные дегенераты и настоящие предатели, по моему мнению, в нашем правительстве считали, что нет, что «все можно купить». И не просто так считали, но и уничтожали нашу промышленность своим бездействием и прямыми указаниями. А это очень просто. Когда «за бугром» у конкурента кредит стоит на порядки дешевле, то отказ от госзаказа и прямого финансирования своего производителя ставит крест на его дальнейшей судьбе. И только чудо или гениальность руководителя конкретной компании может спасти положение. Такие примеры есть. Но, это редкий случай. Пришло новое время, и пришли новые люди, которые решают новые задачи в новых условиях, где суверенитет является непреходящей ценностью. Прежние испугавшиеся патриоты уехали в

Новое время меняет направления развития, приоритеты деятельности и наполняет новым содержанием жизнь. Банальное, казалось бы, импортозамещение в истинном глубинном смысле – это самостоятельность, самодостаточность и суверенитет. А нам нужен суверенитет? До недавнего времени отдельные дегенераты и настоящие предатели, по моему мнению, в нашем правительстве считали, что нет, что «все можно купить». И не просто так считали, но и уничтожали нашу промышленность своим бездействием и прямыми указаниями. А это очень просто. Когда «за бугром» у конкурента кредит стоит на порядки дешевле, то отказ от госзаказа и прямого финансирования своего производителя ставит крест на его дальнейшей судьбе. И только чудо или гениальность руководителя конкретной компании может спасти положение. Такие примеры есть. Но, это редкий случай.

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

Какие задачи ставит время и государство перед нашим братом программистом? Прежде всего, перенос всей инфраструктуры на рекомендованные операционные системы. Когда я последний раз интересовался, это были: «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.

Успехов!