Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: serg_aka_lain
Дата сообщения: 14.09.2008 14:23
adamov3

Цитата:
как из MainForm убрать все надписи?

Вроде уже хотели как то убрать, но так ни чего не получилось.
Автор: Meceniy
Дата сообщения: 14.09.2008 15:34
Народ!Привет! Не подскажите как сделать так чтоб при установке на рабочий стол выводились ярлыки на нужные мне фаилы?
Автор: serg_aka_lain
Дата сообщения: 14.09.2008 16:28
Meceniy

Цитата:
Не подскажите как сделать так чтоб при установке на рабочий стол выводились ярлыки на нужные мне фаилы?


Читать Help.

[Icons]
Name: "{userdesktop}\My Program"; Filename: "{app}\MYPROG.EXE"; WorkingDir: "{app}";
Автор: LinkX
Дата сообщения: 14.09.2008 17:42
Возможно поставить один Checkbox вместо двух RadioButton на странице wpLicense?
Автор: Diawer
Дата сообщения: 14.09.2008 18:18
Вот нашёл [more=код][Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Code_]
var
Page: TInputOptionWizardPage;
IsRegisteredUser: Boolean;

procedure InitializeWizard();
begin
Page := CreateInputOptionPage(wpSelectTasks,
'License Information', 'Are you a registered user?',
'If you are a registered user, please check the box below, then click Next.',
False, False);

Page.Add('I am a registered user');
Page.Values[0] := False;
end; [/more] как сделать вторую страницу дополнительных задач, но не могу понять как связать с другими
секциями [Registry], [Icons], как на стантартной странице дополнительных задач где связь идёт через [Tasks]


Добавлено:
Вопрос снят, ответ нашёл.
Автор: serg_aka_lain
Дата сообщения: 14.09.2008 19:26
LinkX

Цитата:
Возможно поставить один Checkbox вместо двух RadioButton на странице wpLicense?


Конечно, возможно.
Автор: Sampron
Дата сообщения: 14.09.2008 20:03
adamov3
Попробуй так:

[LangOptions]
TitleFontSize=10000
Автор: LinkX
Дата сообщения: 14.09.2008 22:09
serg_aka_lain, хорошо, где его можно найти.
Автор: serg_aka_lain
Дата сообщения: 14.09.2008 22:36
LinkX

Цитата:
хорошо, где его можно найти.


[More=Вот простенький пример ...]


[Setup]
AppName=My License
AppVerName=My License v 1.3
CreateAppDir=False
OutputDir=.
licenseFile=compiler:license.txt


[Languages]
Name: rus; MessagesFile: "compiler:Languages\Russian.isl";

[Code]

var
CheckLicense: TCheckBox;


procedure LicenseOnClick(Sender: TObject);
begin
if (CheckLicense.Checked) = True then
begin
WizardForm.LicenseAcceptedRadio.Checked := True;
end else
begin
WizardForm.LicenseNotAcceptedRadio.Checked := True;
end;
end;


procedure InitializeWizard();
begin
WizardForm.LicenseNotAcceptedRadio.Hide;
WizardForm.LicenseAcceptedRadio.Hide;
WizardForm.LicenseMemo.Height := ScaleY(175);

CheckLicense := TCheckBox.Create(WizardForm);
CheckLicense.Left := ScaleX(0);
CheckLicense.Top := ScaleY(216);
CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
CheckLicense.Width := ScaleX(417);
CheckLicense.OnClick := @LicenseOnClick;
CheckLicense.Parent := WizardForm.LicensePage;
end;


[/more]
Автор: LinkX
Дата сообщения: 14.09.2008 23:11
Да, это именно то, что мне надо, но есть баг - если галочку поставить и потом снять (то-есть не согласен), кнопка "Далее" остаётся доступной для нажатия.
Автор: serg_aka_lain
Дата сообщения: 14.09.2008 23:36
LinkX

Цитата:
но есть баг - если галочку поставить и потом снять (то-есть не согласен), кнопка "Далее" остаётся доступной для нажатия.


Действительно, [more=Исправил...]


[Setup]
AppName=My License
AppVerName=My License v 1.3
CreateAppDir=False
OutputDir=.
licenseFile=compiler:license.txt


[Languages]
Name: rus; MessagesFile: "compiler:Languages\Russian.isl";

[Code]

var
CheckLicense: TCheckBox;


procedure LicenseOnClick(Sender: TObject);
begin
if (CheckLicense.Checked) = True then
begin
WizardForm.LicenseAcceptedRadio.Checked := True;
end else
begin
WizardForm.LicenseNotAcceptedRadio.Checked := True;
end;
end;


procedure InitializeWizard();
begin
WizardForm.LicenseNotAcceptedRadio.Hide;
WizardForm.LicenseAcceptedRadio.Hide;
WizardForm.LicenseMemo.Height := ScaleY(175);

CheckLicense := TCheckBox.Create(WizardForm);
CheckLicense.Left := ScaleX(0);
CheckLicense.Top := ScaleY(216);
CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
CheckLicense.Width := ScaleX(417);
CheckLicense.OnClick := @LicenseOnClick;
CheckLicense.Parent := WizardForm.LicensePage;
end;

[/more]
Автор: Artem_Butenko
Дата сообщения: 15.09.2008 01:49
Genri - извините меня пожалуйста, но снова нуждаюсь в Вашей помощи. Можно ли в предложенный Вами скрипт выбора директории с исходниками вставить мессагу, т.е. сообщение, которое бы сигнализировало о том, что директория исходников указана неверно или в ней отсутствуют необходимые файлы. Заранее благодарю Вас за творческое содействие!
Автор: LinkX
Дата сообщения: 15.09.2008 01:59
,спасибо, по моему так выглядет правельнее. Зачем делать две строчки, когда можно одну + окно для текста больше.

Добавлено:
serg_aka_lain


Добавлено:
Кто пробовал, как Splash-заставка взятая из "Руководство по расширенным возможностям Inno Setup 5 (не для чайников) от Kindly" - раздел - "Сплеш-заставка с эффектом затухания и возможностью проигрывания wave-файла, используя библиотеки от инсталлятора NSIS" она работает в Wondows Vista? (нет возможности проверить но очень надо знать)
Автор: Diawer
Дата сообщения: 15.09.2008 07:11
Просмотрел все предыдущие посты, но ответа не нашёл на тему, как можно удалить сообщение "UninstalledMost=Деинсталляция %1 завершена.%n%nЧасть элементов не удалось удалить. Вы можете удалить их самостоятельно."
Автор: Sig666
Дата сообщения: 15.09.2008 13:39
Подскажите, плиз, как удалить неучитываемые инсталлятором файлы и каталоги в папке программы при отмене установки. DeinitializeSetup не подходит для моего случая.
Автор: An4eus
Дата сообщения: 15.09.2008 14:55
serg_aka_lain
как сделать, что б сначало был выбор компонент, а только потом выбор папки для установки?
Как в теге [Registry] сделать проверку на выбор компонент?
Автор: serg_aka_lain
Дата сообщения: 15.09.2008 18:02
An4eus

Цитата:
как сделать, что б сначало был выбор компонент, а только потом выбор папки для установки?

- Уже спрашивали, примерно так- [more=По-моему пример Genri ... ]

procedure CurPageChanged(CurPageID: Integer);
begin
with WizardForm do
begin
if CurPageID = wpSelectDir then
begin
SelectDirPage.Notebook.ActivePage := SelectComponentsPage;
end;
if CurPageID = wpSelectComponents then
begin
SelectComponentsPage.Notebook.ActivePage := SelectDirPage;
DiskSpaceLabel.Caption := ComponentsDiskSpaceLabel.Caption;
end;
end;
end;

[/more] (Только на Mainpanel текст надо поменять.)


Цитата:
Как в теге [Registry] сделать проверку на выбор компонент?


- А это так [more=Пример ...]

[Components]
Name: "main"; Description: "Main Files1"; Types: full compact custom; Flags: fixed
Name: "main2"; Description: "Main Files2"; Types: full

[Registry]
Root: HKLM; Subkey: "Software\My Company"; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: "Software\My Company\My Program"; Flags: uninsdeletekey;
Root: HKLM; Subkey: "Software\My Company\My Program\Settings1"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Components: main;
Root: HKLM; Subkey: "Software\My Company\My Program\Settings2"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Components: main2;

[/more]



Добавлено:
LinkX

Цитата:
Кто пробовал, как Splash-заставка взятая из "Руководство по расширенным возможностям Inno Setup 5 (не для чайников) от Kindly" - раздел - "Сплеш-заставка с эффектом затухания и возможностью проигрывания wave-файла, используя библиотеки от инсталлятора NSIS" она работает в Wondows Vista?


Работает. на Vista x86 точно.
Автор: ComradG
Дата сообщения: 15.09.2008 20:53
LinkX

Цитата:
Возможно поставить один Checkbox вместо двух RadioButton на странице wpLicense?

Этвет на твой вопрос.
[Setup]
AppName=License
AppVerName=License
DefaultDirName={pf}\License
CreateAppDir=false
LicenseFile=compiler:license.txt

[_Code]
var
CheckBox: TCheckBox;

procedure CheckBoxOnClick(Sender: TObject);
begin
if CheckBox.Checked then
WizardForm.LicenseAcceptedRadio.Checked:=true
else
if not(CheckBox.Checked) then
WizardForm.LicenseNotAcceptedRadio.Checked:=true
end;

procedure InitializeWizard();
begin
CheckBox:= TCheckBox.Create(WizardForm);
CheckBox.Top:= ScaleY(217);
CheckBox.Left:= ScaleX(0);
CheckBox.Width:= ScaleX(140); {может быть и шире, в зависимости от заголовка}
CheckBox.Caption:= 'Yes, I agree with terms.';
CheckBox.OnClick:= @CheckBoxOnClick;
CheckBox.Parent:= WizardForm.LicensePage;

WizardForm.LicenseAcceptedRadio.Hide;
WizardForm.LicenseNotAcceptedRadio.Hide;
WizardForm.LicenseMemo.Top:=ScaleY(37);
WizardForm.LicenseMemo.Height:=ScaleY(173);
end;

Добавлено:
О!оказывается тебе уже дали ответ, не заметил.
Artem_Butenko
Если тема патчинга интересна, есть предложение.
Автор: Artem_Butenko
Дата сообщения: 15.09.2008 23:40
ComradG - а именно? Если можно, то конкретнее, что Вы хотите реализовать в области построения патчера на Inno Setup? И еще, если можно, хотя бы скажите как называется дампер, позволяющий восстановить секцию [Code] из файла .bin, после распаковки инсталлятора анпакером.
Автор: Victor_Dobrov
Дата сообщения: 16.09.2008 01:46
serg_aka_lain - предыдущие примеры обмена страниц компонентов и выбора папки не проверяют параметр DisableDirPage=true

Вот [more=исправленный скрипт]
[Setup]
AppName=My program
AppVerName=My program 1.5
DefaultDirName={pf}\My program
DisableDirPage=false
;DisableDirPage=true

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Components]
Name: WB; Description: 'Мой компьютер' - Настройки; ExtraDiskSpaceRequired: 1048576

[Code]
function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
    if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
Case CurPageID of
wpSelectDir: if WizardForm.Tag = 1 then
    begin
        WizardForm.SelectDirPage.Notebook.ActivePage:= WizardForm.SelectComponentsPage;
        WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectComponents)
        WizardForm.Hint:= WizardForm.PageDescriptionLabel.Caption; // запомнить SetupMessage(msgSelectDirDesc)
        WizardForm.PageDescriptionLabel.Caption:= SetupMessage(msgSelectComponentsDesc)
    end;
wpSelectComponents: if WizardForm.Tag = 1 then
begin
        WizardForm.SelectComponentsPage.Notebook.ActivePage:= WizardForm.SelectDirPage;
        WizardForm.DiskSpaceLabel.Caption:= WizardForm.ComponentsDiskSpaceLabel.Caption;
        WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectDir)
        WizardForm.PageDescriptionLabel.Caption:= WizardForm.Hint // иначе вместо названия программы [name]
end;
end;
End;

Procedure InitializeWizard;
Begin
    PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage
End;
[/more], который меняет описания Mainpanel и учитывает, что страница выбора папки может быть отключена.
Автор: LinkX
Дата сообщения: 16.09.2008 08:48
ComradG, да serg_aka_lain уже помог, но спасибо.
Чем больше тем лучше.
Автор: IZUverSS
Дата сообщения: 16.09.2008 13:22
Доброго времени суток господа IT-специалисты!
Сам реально столкнулся с проблемой создания Setup файла для своей программы в Visual Studio 2005, что меня очень удивило.

Вопрос №1 (больше подходит для пожелания Microsoft, ибо ответить, наеврно, смогут только они)

Зачем создавать такую сложную систему? Если бы я захотел сделать нестандартный инсталлер с множеством опций (в большинстве своем ненужных), то я бы наеврно сделал сам, либо воспользовался кучей готовых решений.

Вопрос №2

Где можно было б достать утилиту как в Visual Studio 6, где не надо ломать голову как что делать, не надо заботаться о том что какие то библиотеки не попадут в инсталлер... где надо всего лишь указать файл проекта и компилятор все соберет и сделает сам?
Автор: SotM
Дата сообщения: 16.09.2008 13:36
IZUverSS
Прочитав весь пост, я подумал в конце "А при чём здесь Inno?"
Может упростишь?
Автор: IZUverSS
Дата сообщения: 16.09.2008 13:50
to SotM

Если применительно к Inno, то у меня есть к ним совет добавить мастер быстрого создания инсталлера... опять же по аналогии с Package & Deployment Wizard из Visual Studio 6
Автор: serg_aka_lain
Дата сообщения: 16.09.2008 16:15
Victor_Dobrov

Действительно, в том примере есть косячок со страницей, Я о DisableDirPage=true и не подумал как-то.
Этот вопрос и не интересовал, менять страницы местами не стал бы, делал бы новую страницу.
(Для примера добавлю скрипт в архивчик.)
Автор: cepbl4
Дата сообщения: 16.09.2008 18:57
можно как-то сделать так, чтобы при внесении установщиком значений в реестр, адрес к файлу указывался в коротком виде (без пробелов):
D:\Distrs\FACEFI~1.1\data1.hdr

Заранее спасибо
Автор: 203igor
Дата сообщения: 16.09.2008 20:02
нужен ввод ключа вместо пароля
напромер: пароль *******
надо так 1234-1234-1344-1431 что бы было четыре ячейки, а не одна
Автор: Raf_SE
Дата сообщения: 16.09.2008 20:09
А ктонить может подправить код боковушки в Inno так, чтобы в него можно было встроить кроме Русского, Английский и Украинские языки интерфейса? (в зависимости от того, какой юзер выбрал).
Скрипт с библиотекой; [more=Только скрипт]
[CustomMessages]
en.Text = Text:
ru.Text = Текст:
ua.Text = Текст:
en.Text_English = English
ru.Text_English = Английский
ua.Text_English = Англійський
en.Text_Ru = Russian
ru.Text_Ru = Русский
ua.Text_Ru = Російський

en.Voice = Voice:
ru.Voice = Озвучка:
ua.Voice = Озвучування:
en.Voice_English = English
ru.Voice_English = Английская
ua.Voice_English = Англійське
en.Voice_Russian = Russian from:
ru.Voice_Russian = Русская от:
ua.Voice_Russian = Російське вiд:

en.Voice_Ru_Fargus = Fargus
ru.Voice_Ru_Fargus = Фаргус
ua.Voice_Ru_Fargus = Фаргус

en.Voice_Rus_8bit = 8bit
ru.Voice_Rus_8bit = 8bit
ua.Voice_Rus_8bit = 8bit

en.Voice_Ru_RusProg = Russian Project
ru.Voice_Ru_RusProg = Русский проект
ua.Voice_Ru_RusProg = Російський проект

en.Video = Video:
ru.Video = Видео:
ua.Video = Відео:
en.Video_English = English
ru.Video_English = Английское
ua.Video_English = Англійське
en.Video_Russian = Russian from:
ru.Video_Russian = Русское от:
ua.Video_Russian = Російське вiд:

en.Video_Ru_Fargus = Fargus
ru.Video_Ru_Fargus = Фаргус
ua.Video_Ru_Fargus = Фаргус

en.Video_Rus_8bit = 8bit
ru.Video_Rus_8bit = 8bit
ua.Video_Rus_8bit = 8bit

en.Video_Ru_RusProg = Russian Project
ru.Video_Ru_RusProg = Русский проект
ua.Video_Ru_RusProg = Російський проект

en.Versi = Version:
ru.Versi = Версия:
ua.Versi = Версія:

en.Music = Music
ru.Music = Музыка
ua.Music = Музика




[Components]
Name: "Text"; Description: {cm:Text}; Types: full compact custom; Flags: fixed
Name: "Text\English"; Description: {cm:Text_English}; Flags: exclusive
Name: "Text\Russian"; Description: {cm:Text_Ru}; Flags: exclusive;

Name: "Voice"; Description: {cm:Voice}; Types: "full";
Name: "Voice\English"; Description: {cm:Voice_English}; Flags: exclusive
Name: "Voice\Russian"; Description: {cm:Voice_Russian}; Flags: exclusive
Name: "Voice\Russian\Fargus"; Description: {cm:Voice_Ru_Fargus}; Flags: exclusive;
Name: "Voice\Russian\8bit"; Description: {cm:Voice_Rus_8bit}; Flags: exclusive
Name: "Voice\Russian\RuProgect"; Description: {cm:Voice_Ru_RusProg}; Flags: exclusive

Name: "Video"; Description: {cm:Video}; Types: "full";
Name: "Video\English"; Description: {cm:Video_English}; Flags: exclusive
Name: "Video\Russian"; Description: {cm:Video_Russian}; Flags: exclusive
Name: "Video\Russian\Fargus"; Description: {cm:Video_Ru_Fargus}; Flags: exclusive
Name: "Video\Russian\8bit"; Description: {cm:Video_Rus_8bit}; Flags: exclusive;
Name: "Video\Russian\RuProgect"; Description: {cm:Video_Ru_RusProg}; Flags: exclusive

Name: "Version"; Description: {cm:Versi}; Types: full compact custom; Flags: fixed
Name: "Version\107"; Description: 1.07; Flags: exclusive
Name: "Version\108"; Description: 1.08; Flags: exclusive
Name: "Version\109d"; Description: 1.09d; Flags: exclusive
Name: "Version\110"; Description: 1.10; Flags: exclusive
Name: "Version\111b"; Description: 1.11b; Flags: exclusive
Name: "Version\112a"; Description: 1.12a; Flags: exclusive; Types: full

Name: "Sound"; Description: {cm:Sound}; Types: "full";


[Files]
Source: "descctrl.dll"; Flags: dontcopy


[Code]
//_-=Код Боковушки с описанием компонентов=-_
function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
//ComponentsListHandle Боковой КомпонентБокс
//DescLabelHandle Боковой текст
//DescStrings Строки описания разделяються точкой с запятоый ";".

function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
Info: TNewStaticText;
InfoCaption: TNewStaticText;
InfoPanel: TPanel;

procedure DeinitializeSetup();
begin
//Контроль описания
disabledesc();
end;

procedure InitializeWizard();
begin
// Приспособьте размер списка Компонентов
WizardForm.TYPESCOMBO.Visible:= false;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(200);
//Создаеться вертуальный GroupBox (боковушка), ибо Inno Setup неспособен создать реальный.
InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := 'Описание';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;
// Параметры текста
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := 'Переместите ваш указатель мыши на компоненты чтобы увидеть их описание.';
Info.WordWrap := true;
//Впишыте описание компонентов
enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
'Выберите язик внутриигрового текста;'+ //Text
'Английскай, огигинальный текст;'+ // Text\English
'Руссский текст, остновываеться на переводе фирмы Фаргус;'+ // Text\Russian
'Озвучка внутриигровых монологов;'+ // Voice
'Оригинальная, английская озвучка;'+ // Voice\English
'Выберите локализатора;'+ // Voice\Russian
'Пофесиональная озвучка от фирмы "Фаргус";'+ // Voice\Russian\Fargus
'Качевственная озвучка от фирмы "8bit";'+ // Voice\Russian\8bit
'Качевственная озвучка от фирмы "Русский Проект";'+ // Voice\Russian\RuProgect
'Озвучка внутриигрового видео;'+ // Video
'Оригинальная, английская озвучка;'+ // Video\English
'Выберите локализатора;'+ // Video\Russian
'Любительская, одноголосая озвучка;'+ // Video\Russian\Fargus
'Професиональная, дублированная озвучка;'+ // Video\Russian\8bit
'Качевственная, многоголосая закадровая озвучка;'+ // Video\Russian\RuProgect
'Выберите версию игры;'+ // Version
'Оригинальная верся игры;'+ // Version\107
'Дата выпуска: 28.06.2001;'+ // Version\108
'Дата выпуска: 05.12.2001;'+ // Version\109d
'Дата выпуска: 28.10.2003;'+ // Version\110
'Дата выпуска: 13.09.2005;'+ // Version\111b
'Дата выпуска: 17.06.2008;'+ // Version\112a
'Внутриигровая музыка;' // Sound
);
end;
[/more]

P.S.
В Паскале я не понимаю, пробывал через обычную [CustomMessages], но нифига не вышло
Автор: SotM
Дата сообщения: 17.09.2008 08:26
Raf_SE
Хоть я и не знаю пока ответа на твой вопрос, но поработай еще над своим русским, а то у тебя в коде чуть ли не в каждом предложение ашипка. Да и английские названия написаны не правильно.
Автор: Raf_SE
Дата сообщения: 17.09.2008 08:36
SotM
Проблема в том, что в Украинских школах не преподавали Русский А с Английским у меня очень туго...

P.S.
Ашибки вродь проверял через Word, он не жаловался...

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

Предыдущая тема: Презентация


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.