- Lazarus — бесплатная среда разработки DELPHI
- Как сделать форму видимой в LAZARUS
- Сворачивание исполняемого файла в lazarus
- SQLite3 в LAZARUS
- Выпуск базы данных:
- Прямой доступ к значениям SQLite3 в lazarus
- Ошибка Libsqlite3.so/sqlite3.dll при запуске
- Проблема памяти в компоненте dbgrid
- Проблема с отображением чисел с плавающей запятой
- MariaDB в LAZARUS
- Полезности
- Запуск внешней программы в lazarus
- Печать текста в lazarus
- Снимок экрана, принтскрин в lazarus
- Путь к профессионализму
- Инструкции по созданию и использованию динамической библиотеки DLL SO в LAZARUS
Lazarus — бесплатная среда разработки DELPHI
Для среды LAZARUS можно использовать базу данных SQLite3. Его преимущество в том, что все будет в одной программе и не нужно устанавливать дополнительный SQL-сервер. Эта среда разработки (DELPHI) полностью бесплатна и легальна. Также можно подключить базу данных MySQL или более новую версию базы данных MariaDB (преемник mysql), при этом база данных MariaDB, конечно же, должна быть запущена.
Оценочная версия:
Соединение LAZARUS и MariaDB в Linux LUBUNTU 16.04
SQLite версии 3.11.0
mariadb-client 10.0.31
лазарь 1.6.4
fpc-3.0.0
Когда-то отличной средой разработки для Паскаля был TurboPascal от Borland. Позже была создана и очень хорошая среда разработки для WINDOWS, DELPHI. До версии DELPHI 7 это была хорошая среда разработки, объектный паскаль был скрыт под поверхностью, иногда его называли визуальным паскалем. Затем его купила Microsoft, и он оказался таким же, как и все хорошие вещи, которые купила компания.
После этого была создана среда разработки LAZARUS , которая почти точно такая же, какой была DELPHI в период своего расцвета. Нет лишних вещей (MS .NET и т.д.), это бесплатно и легально. Кроме того, это многоплатформенная среда, она работает как под Windows, так и под Linux. Под поверхностью находится объектный паскаль. Кроме того, вы можете выбрать графическое приложение (проект меню, новый проект, приложение) или старое (бесплатное) приложение Pascal (проект меню, новый проект, простая программа).
Здесь я опишу установку и использование в LUBUNTU 16.04, которая представляет собой облегченную среду UBUNTU даже для менее мощных ПК.
Установка среды разработки LAZARUS выполняется из системы пакетов (например, synaptic) путем выбора пакета lazarus. Это также включит все зависимости, которые вы хотитеон скажет. Затем устанавливается вся среда разработки LAZARUS.
После запуска LAZARUS появится форма form1. На этой форме мы можем перетаскивать мышью отдельные визуальные компоненты, например кнопку (Tbutton). Нажимаем на кнопку, в инспекторе объектов устанавливаем для свойства заголовка значение «кнопка», а затем в меню файлов сохраняем все в отдельную директорию, например Experiment1. Теперь в меню мы можем запустить->сборка. Создается исполняемая программа.
Как сделать форму видимой в LAZARUS
сделать форму LAZARUS видимой
Внимание, иногда при открытии нового проекта в лазарусе ничего не появляется, т.е. не видно ни формы, ни исходного кода. Решение простое: введите project->forms->form1 в горизонтальном меню вверху.
Сворачивание исполняемого файла в lazarus
После перевода размер исполняемого файла составляет 22 МБ или более. Это связано с отладочной информацией, которая больше не нужна в окончательной версии. Его можно изменить с помощью следующей процедуры:
strip -s myfile
upx —best myfile (необходим пакет upx или upx-ucl)
Команда strip уменьшает размер кода примерно с 22 МБ до 4,6 МБ. Команда upx сожмет исполняемый файл примерно до 1,45 МБ, который будет разархивирован в памяти при запуске.
Еще лучше и эффективнее удалить отладочную информацию в настройках проекта. С помощью файла upx —best этот исполняемый файл можно уменьшить до 721 000 байт.
Инструкция по сжатию исполняемого файла (в windows exe, в linux elf) в LAZARUS — заходим в меню:
1. проект, параметры проекта, параметры компилятора, перевод и связывание,
- уровни оптимизации: 3 (-O3)
- стиль блока: «интеллектуальная муфта» (-CX)
- ссылка: «умная ссылка»(-ХХ)
2. проект, параметры проекта, параметры компилятора, отладка,
- генерировать отладочную информацию для GDB (флажок не установлен)
- удалить символы из исполняемого файла (-Xs)
Теперь известен (strip) и upx:
strip -s mujsobor — теперь уже не нужен, ничего не уменьшит
upx —best mujsobor (нужен пакет upx или upx-ucl)
Мой тестовый исполняемый файл был уменьшен
с 24 599 400 байт до -> 2 772 720 (отключение этой отладочной информации -> 941 772 байта! (upx —best file).
Уменьшен размер скомпилированного исполняемого файла LAZARUS с 24,5 МБ до 0,94 МБ, т.е. в 26 раз или на 3,8% от исходного размера!
SQLite3 в LAZARUS
LAZARUS с SQLite3
Чтобы использовать базу данных SQLite (SQLite3), вам необходимо установить пакет sqlite3 и все упомянутые в нем зависимости. Затем пакет sqlitebrowser для управления базами данных и таблицами sqlite3.
Если сообщается об ошибке » libsqlite3.so » при доступе к таблицам при запуске программ lazarus, все равно необходимо установить пакет libsqlite3-dev (+libsqlite3 is устанавливается автоматически) на машине разработки, на машине конечного пользователя необходимо установить только пакет libsqlite3 . динамически загружать ‘./libsqlite3.so’, см. исходный код ниже. Файл libsqlite3.so должен находиться в том же каталоге, что и исполняемый файл. Это лучшее решение, потому что пакеты libsqlite3.so называются по-разному в разных дистрибутивах (например, в debian 8 это libsql3.so.0), тогда приложение не завершится с ошибкой, см. раздел libsqlite3.so /sqlite3.dll ошибка при запуске.
Также установлена консоль, она запускается терминальной командой (из командной строки) sqlite3:
SQLite версии 3.11.0 2016-02-15 17:29:24
Введите «.help» для подсказок по использованию.
Подключен квременная база данных в памяти.
Используйте «.open FILENAME» для повторного открытия постоянной базы данных.
sqlite>
Выпуск базы данных:
Открыть базу данных .open studenti.db, а именно .help.
sqlite> .tables
Класс Студент СтудентТема Тема lidi
sqlite> выбрать * из студентов;
Ошибка: нет такой таблицы: студенты
sqlite> выбрать * у студента;
ID студента(2,’1.Б’,’Чтоботова’,’Новак’);
Тогда у нас есть некоторые данные в таблицах, и можно запускать команды SQL. Включим отображение заголовков:
sqlite> .заголовки
sqlite> выберите * из trida;
TridaIDтранзакция компонента соединения
SQLite3Connection1.Transaction := SQLTransaction1;
//соединяем компоненты запроса соединением
SQLQuery1.DataBase := SQLite3Connection1;
//подключаем компонент источника данных с запросом
DataSource1.dataset := SQLQuery1;
//подключаем DBgrid к источнику данных
DBGrid1.DataSource := DataSource1;
end;
процедура TForm1.FormActivate(Sender: TObject);
начать
попробовать
если SQLQuery1.Active, то
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add(‘Выбрать * из числа учащихся’);
SQLQuery1.Open;
кроме
On E :Exception do begin
MessageDlg(‘Error’, E.Message, mtConfirmation,[mbYes],0);
конец;
конец;memo1.Text:=Get(edit1.Text);
конец;
Прямой доступ к значениям SQLite3 в lazarus
процедура TForm1.FormActivate(Sender: TObject);
var
cislop,name: string;
начать
попробовать
если SQLQuery1.Active, то
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add(‘выберите NUMBER, items.NAME as namep,OPER,tepo.name as tname,ORI,STR,PRAC,D,TR,TB,TA FROM items JOIN tepo USING(NUMBER) WHERE NUMBER =»0300-0360-01″‘);
SQLQuery1.Open;
// ВЫБЕРИТЕ id КАК ‘ID’, Имя пользователя КАК ‘Пользователь’, InstEmail КАК ’email’ FROM fpdev ORDER BY id;
// ВСТАВИТЬ В fpdev(id, UserName, InstEmail) VALUES(:ID,:User,:email);
cislop:=SQLQuery1.FieldByName(‘CISLO’).AsString;
name:=SQLQuery1.FieldByName(‘name’).AsString;
panel1.Caption:=cislop+’:’+name;
кроме
On E :Exception do begin
MessageDlg(‘Error’, E.Message, mtConfirmation,[mbYes],0);
конец;
конец;
конец;
Ошибка Libsqlite3.so/sqlite3.dll при запуске
Не удается загрузить клиент SQLite
библиотеку «libsqlite3.so»
Эта ошибка при запуске программы означает, что библиотека libsqlite3.so (в Linux) или sqlite3.dll (вwindows) и загружается в исполняемый файл. В linux самый простой для конечного пользователя установить пакет sqlite3 с помощью системы упаковки — это динамически загрузить библиотеку sqlite3 ‘./libsqlite3.so’, в windows ввести исходный код в Form1.create : loadlibrary:=’sqlite3.dll’; (устарело), sqlite3dyn.SQLiteDefaultLibrary :=’sqlite3.dll’;. Библиотеку sqlite3.dll можно загрузить с http://sqlite.org/download.html (скачать «sqlite-dll-win32-x86-3071000»). Затем извлеките «sqlite3.def» и «sqlite3.dll» в каталог с вашим приложением .exe, программой. Начать все же необходимо с Uses. добавить sqlite3dyn.
unit adresar_u;
<$mode objfpc><$H+>
интерфейс
использует
классы, SysUtils, sqldb, db, sqlite3conn, sqlite3dyn , FileUtil, Forms, Controls,
Graphics, Dialogs, ComCtrls, DbCtrls, DBGrids, StdCtrls;
процедура TForm1.FormCreate(Sender: TObject);
начать
попробовать
<$IFDEF LINUX>
sqlite3dyn.SQLiteDefaultLibrary :=’./libsqlite3.so’;
<$ENDIF>
<$IFDEF WINDOWS>
sqlite3dyn.SQLiteDefaultLibrary :=’sqlite3.dll’;
<$ENDIF>
кроме
на E:Exception do begin
MessageDlg(‘Error’, E.Message, mtConfirmation,[mbYes],0);
выход;
конец;
конец;
конец;
Проблема памяти в компоненте dbgrid
Проблема Lazarus memo в компоненте dbgrid с sqlite3
В LAZARUS в таблице dbgrid все строки не отображаются со своим значением, а выписываются (памятка). Вероятно, мы этого не хотим, мы хотим отобразить значение из таблицы sqlite3 и тип текстового поля.
Решение очень простое, просто установите свойство dbgrid1.dgdisplaymemo.true в инспекторе объектов, оно задано в false по умолчанию. Если у вас нет доступного свойства dbgrid.displaymemo, вам необходимо перейти на более новую версию lazarus.
Но свойство displaymemo компонента DBEditу него его нет, поэтому он будет корректен в представлении в сетке (таблице) DBgrid, но в DBEdit он будет отображаться снова (MEMO). Эффективным решением является создание таблицы с текстовыми полями типа varchar(n) , см. выше и ниже:
СОЗДАТЬ ТАБЛИЦУ evidoso2 («рисунок» varchar(17), «описание» varchar(40));
СОЗДАТЬ ТАБЛИЦУ студентов
(
«StudentID» INTEGER PRIMARY KEY AUTOINCREMENT,
«tridaID» целочисленный KEY,
«имя» VARCHAR(15),
«фамилия» VARCHAR(15 ),
«prum_signs» float(3,2)
);
Проблема с отображением чисел с плавающей запятой
Числа с плавающей запятой неточны и неправильно отображаются в lazarus. Лучшее решение — щелкнуть правой кнопкой мыши, отредактировать столбцы, добавить. Затем установите формат отображения #.##
Для столбца с числовым значением float значения float отображаются правильно. Итак, при плохом отображении float в lazarus и SQLite3 — displayformat #.##
lazarus и числовое значение float — формат отображения решения #.##
lazarus, как установить float в SQLite3
lazarus, неправильное отображение чисел с плавающей запятой в SQLite3
Наконец в одном каталоге windows конечного пользователя должно быть:
- ваша_программа.exe
- sqlite3.dll
- sqlite3.def
- sqlite3database.db
Следующие файлы должны находиться в каталоге linux :
- исполняемая_скомпилированная_программа (эльф)
- libsqlite3.so (библиотека)
- sqlite3database.db
MariaDB в LAZARUS
Вы можете спросить, почему бы не продолжать использовать проверенный mysql? Поскольку mysql теперь принадлежит крупной (коммерческой) компании, которая диктует условия использования mysql. А так вы полностью зависите от воли коммерческой компании и ее капризов.
Так почему же MariaDB? Потому что это почти то же самое, разработчики из оригинального mysql, он бесплатный, не зависит от коммерческой компании, у них больше нет крупных дистрибутивов.mysql (DEBIAN 9 и выше), но MariaDB. Внимание, это не тривиальное дело, на Debian работает много мощных веб-серверов. И последнее, но не менее важное: известная поисковая система GOOGLE перешла на MariaDB и работает безупречно. Также необходимо дать нашим потенциальным клиентам гарантию того, что приобретенное ПО с базой данных будет работать в дальнейшем.
Поэтому вам необходимо установить пакет libmysqlclient-dev.
Добавьте в процедуру FormCreate следующее:
MySQL56Connection1.DatabaseName := ‘mydatabase’;
MySQL56Connection1.HostName := ‘localhost’;
MySQL56Connection1.UserName := ‘mydatabase’;
MySQL56Connection1.Password := ‘мой пароль’;
В LAZARUS 1.6.4 и MariaDB 10.0.31 на Lubuntu 16.04 непросто подключиться к базе данных MariaDB. С компонентом TMySQL5.6connection выдает ошибку, что ожидаемый клиент 5.6, а реальный 5.7. Компонент TMySQL5.7Connection не отображается на вкладке SQLdb.
Соединение Lazarus MySQL 56 не может работать с установленной версией клиента MySQL: Ожидается (5.6), получено (5.7.19)
Решение простое: просто добавьте mysql57conn в список используемых и создайте SQLConnection1 во время выполнения. Затем установите набор символов UTF-8 SQLConnection1.CharSet:=’utf8′:
использует
классы, SysUtils, db, sqldb, mysql57conn, FileUtil, Forms,
элементы управления, графику, диалоги, DBGrids;
TForm1 = class(TForm)
DataSource1: TDataSource;
DBGrid1: TDBGrid;
SQLConnection1: TMySQL57Connection;
SQLQuery1: TSQLQuery;
SQLTransaction1: TSQLTransaction;
процедура FormActivate(Sender: TObject);
процедура FormCreate(Sender: TObject);
частное
< частные объявления >
общедоступный
< общедоступные объявления >
конец;
var
Форма1: TForm1;
процедура TForm1.FormCreate(Sender: TObject);
begin
//В lazarus1.6.4 компонент MySQL57 не отображается на вкладке SQLdb
SQLConnection1 := TMySQL57Connection.Create(self);
SQLConnection1.CharSet:=’utf8′;
SQLConnection1.DatabaseName := ‘база данных’;
SQLConnection1.HostName := ‘localhost’;
SQLConnection1.UserName := ‘пользователь’;
SQLConnection1.Password := ‘мой-пароль’;
//соединяем компонент транзакции с компонентом соединения
SQLConnection1.Transaction := SQLTransaction1;
//соединяем компоненты запроса соединением
SQLQuery1.DataBase := SQLConnection1;
//подключаем компонент источника данных с запросом
DataSource1.dataset := SQLQuery1;
//подключаем DBgrid к источнику данных
DBGrid1.DataSource := DataSource1;
end;
процедура TForm1.FormActivate(Sender: TObject);
начать
попробовать
если SQLQuery1.Active, то
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add(‘Выбрать * из группы’);
SQLQuery1.Open;
кроме
On E :Exception do begin
MessageDlg(‘Error’, E.Message, mtError,[mbYes],0);
конец;
//application.Terminate;
конец;
конец;
Полезности
openurl (‘http://zmsoft.cz/’); — открывает указанную страницу в веб-браузере (модуль lclintf )
openDocument (‘ctimne.txt’); — открывает документ в редакторе/браузере системного набора (модуль lclintf )
memo1.Text:= Get (‘http://zmsoft.cz/’); — извлекает содержимое указанного URL (модуль LCLINtf, fphttpclient)
Считыватель XML
xml-файл navod.xml
использует laz2_XMLRead, laz2_DOM;
процедура TForm1.Button1Click(Sender: TObject);
var
PassNode: TDOMNode;
Документ: TXMLDocument;
begin
memo1.Text:=»;
попытаться
// прочитать XML-файл с диска
ReadXMLFile(Doc, ‘navod.xml’);
synedit1.Text:= Doc.XMLVersion;
PassNode := Doc.DocumentElement.FindNode(‘username’);
memo1.Lines.Add(PassNode.FirstChild.NodeValue);
PassNode := Doc.DocumentElement.FindNode(‘password’);
memo1.Lines.Add(PassNode.FirstChild.NodeValue);
наконец
Doc.Free;
конец;
конец;
Запуск внешней программы в lazarus
Ранее в DELPHI это использовалось Shellexecute() . Забудь это. Теперь лучшим выбором в модуле (unit) является процесс TProcess.execute() . Он кроссплатформенный, поэтому его не нужно пересобирать для WINDOWS LINUX.
использует
классы, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Process;
TForm1 = class(TForm)
Button1: TButton;
Правка1: TПравка;
Ярлык1: TLabel;
процедура Button1Click(Отправитель: TObject);
частное
< частные объявления >
общедоступный
< общедоступные объявления >
конец;
var
Форма1: TForm1;
процедура TForm1.Button1Click(Sender: TObject);
var
AProcess: TProcess;
begin
AProcess := TProcess.Create(nil);
попробуйте
AProcess.Executable:= edit1.Text; // galculator (калькулятор lubuntu)
// AProcess.Parameters.Add(‘-h’);
// AProcess.Options := AProcess.Options + [poWaitOnExit];
AProcess.Execute;
кроме
On E :Exception do begin
MessageDlg(‘Error’, E.Message, mtError,[mbYes],0);
конец;
конец;
AProcess.Free;
конец;
Печать текста в lazarus
Для печати текста вам понадобится юнит (юнит) принтеров в лазарусе. В примере показана печать из компонента ListBox. Но он по-прежнему работает из MEMO.
процедура TForm1.BitBtn3Click(Sender: TObject);
var
count,i, xpos, ypos, LineHeight: integer;
s : string;
begin
// печать из компонента ListBox1 на принтер
xpos:=100; // левое поле
count:=listbox1.items.Count;
если количество > 0 затем начните
с Printer do begin
BeginDoc;
Canvas.Font.Name := ‘Courier New’;
Canvas.Font.Size :=10;
Canvas.Font.Color := clBlack;
LineHeight := Round(1.2 * Abs(Canvas.TextHeight(‘I’))); // межстрочный интервал
ypos:= 2 * LineHeight; // верхняя граница
для i:=0 to count-1 do begin
s:=listbox1.Items[i];
Canvas.TextOut(xpos,ypos,s);
inc(ypos,LineHeight);
конец;
Конечный документ;
конец;
messagedlg(‘Идет печать, подождите.’,minformation,[mbok],0);
end else begin
messagedlg(‘Данных нет! Количество строк: ‘+inttostr(count),mterror,[mbok],0);
конец;
конец;
Снимок экрана, принтскрин в lazarus
Есть пример (помощь) для фотографирования, фотосъемки или если вы хотите принтскрин в лазарусе.
Путь к профессионализму
двоичный значок
Если вы собираетесь создавать профессиональную программу, то однозначно рекомендую, кроме описанной выше редукции кода, также включить автоматическую нумерацию сборки, © Ferda 2019, загрузить иконку в бинарный код, см. сделанные снимки экрана (номер сборки, значок двоичного файла).
Он будет установлен в меню, проекте, параметрах проекта, информации о версии, включить информацию о версии в исполняемый файл.
Инструкции по созданию и использованию динамической библиотеки DLL SO в LAZARUS
Динамические библиотеки (Dynamic-Link Library) называются DLL в WINDOWS, SO-файлами в LINUX. Здесь мы продемонстрируем создание динамической библиотеки в среде разработки LAZARUS.
Как создать DLL (SO) в LAZARUS? Это очень просто:
- создать новый проект библиотеки типов
- Сохранить как, например, libraryvzor.lpi
Скелет библиотеки:
будет сгенерирован
Дополним каркас динамической библиотеки функциями и ключевым словом export:
функция contentquare(a:integer):integer; // вычисляем содержимое квадрата
begin
content:= a*a;
end;
содержимое прямоугольника функции(a,b:integer):integer; // вычисляем содержимое прямоугольника
begin
контент:= a*b;
конец;
экспорт
контента, // входные параметры 1 целочисленного типа, выход 1 целочисленного типа
контент;// входные параметры 2 целочисленного типа, выход 1 целочисленного типа
Теперь в меню среды разработки LAZARUS введите run->build
Библиотека будет собрана с префиксом lib, поэтому liblibrary.so в linux или library.dll в windows.
Теперь в новом каталоге мы создадим проект, который будет использовать нашу динамическую библиотеку:
- В меню создается новый проект
- Сохраняем как startlib.lpi и startlib_u.pas
- Мы помещаем компоненты button1 = квадрат, buton2 = прямоугольник, groupbox1 = контейнер, memo1 = результаты на форме.
- Мы заполним Uses. Динамические библиотеки
- Мы добавим:
процедуру Button1Click(Sender: TObject);
процедура Button2Click(Отправитель: TObject);
процедура FormClose(Sender: TObject; var CloseAction: TCloseAction);
процедура FormCreate(Отправитель: TObject); - Мы построим
- Запускаем скомпилированный бинарный код в linux elf в windows exe файле
- Это сообщит об ошибке несуществующей библиотеки
- Копируем ранее созданную динамическую DLL или SO-библиотеку в текущий каталог и снова запускаем программу. Теперь он должен запускаться без проблем и самое главное должен работать.
, новый проект типа приложения
использует
классы, SysUtils, FileUtil, формы, элементы управления, графику, диалоги, StdCtrls,
Dynlibs;
TForm1 = class(TForm)
Button1: TButton;
Кнопка2: TButton;
GroupBox1: TGroupBox;
Памятка1: TMemo;
процедура Button1Click(Отправитель: TObject);
процедура Button2Click(Отправитель: TObject);
процедура FormClose(Sender: TObject; var CloseAction: TCloseAction);
процедура FormCreate(Sender: TObject);
частное
var
Форма1: TForm1;
var
MyHandle:TLibHandle;
процедура TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
FreeLibrary(MyHandle);
end;
процедура TForm1.Button1Click(Sender: TObject);
тип
tctverec = function (a:integer): integer; стандартный вызов; // Square
var
square: tctverec;
begin
square := tctverec(GetProcedureAddress(MyHandle,’contents’));
if Assigned(square) then begin
memo1.Text:=’Содержимое квадрата: ‘ + inttostr(square(3));
конец;
конец;
процедура TForm1.Button2Click(Sender: TObject);
тип
tobdelnik = function (a,b:integer): integer; стандартный вызов; // прямоугольник
var
обдельник: тобдельник;
begin
обдельник := тобделник(GetProcedureAddress(MyHandle,’обсахобдельника’));
if Assigned(прямоугольник) then begin
memo1.Text:=’Содержимое прямоугольника: ‘ + inttostr(rectangle(5,7));
конец;
конец;
процедура TForm1.FormCreate(Sender: TObject);
начать
<$IFDEF WINDOWS>
MyHandle := SafeLoadLibrary(библиотека);
<$ELSE>
MyHandle := SafeLoadLibrary(‘./’+library);
<$ENDIF>
если MyHandle=0, то начните
MessageDlg(‘»‘+ExtractFileName(paramstr(0))+'»! ‘, ‘Не удалось загрузить библиотеку «‘+library+'»! Выйти из программы?’, mtError, [mbOK],0);
application.Terminate;
конец;
конец;
Ссылки:
Комментарии
SSL для веб-сайтов с ноября 2015 г. бесплатно
MS WINDOWS 10 — сбор информации о пользователе
DEBIAN 11 — бесплатная ОС Debian, выпущенная 14/08/2021
debian — загрузите последнюю версию DEBIAN для ПК
debian edu — debian для школ и учебных заведений
Уязвимость маршрутизаторов «ROM-0»
Они передали данные спецслужбам
Они передали данные Microsoft, Yahoo, Google, Facebook Агентству национальной безопасности США (АНБ).
Италия предпочитает открытый исходный код
Итальянский парламент принял закон, обязывающий государственные учрежденияприобрести открытое программное обеспечение до коммерческого. Это означает LINUX вместо MS-WINDOWS, LIBRE OFFICE вместо MS OFFICE и т. д.