OberonCore
https://forum.oberoncore.ru/

#022 Добавить второй уровень рабочих папок
https://forum.oberoncore.ru/viewtopic.php?f=134&t=6554
Страница 4 из 5

Автор:  adimetrius [ Четверг, 06 Май, 2021 16:59 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Коллеги, вопрос: как узнать, какие расположения заданы для USE, CUSTOM и STANDARD?

В центральном форуме Гельмут предложил мне вот такой хак, чтобы узнавать USE-папку:

VAR loc: Files.Locator;
loc := Files.dir.New(''); path := loc(HostFiles.Locator).path$

что имхо должно квалифицироваться именно как хак и грубое нарушение из-за импорта Host.

Кмк, надо куда-то в платформонезависимое место включить нормальный интерфейс, чтобы эту информацию узнавать - и уже про все три этажа. Есть ли идеи, как именно и куда?

И, кстати, предлагаю русские термины:
Трехэтажная файловая система в ББ состоит из рабочего, пакетного и стандартного этажа. Или
Трехслойная файловая система в ББ состоит из рабочего, пакетного и стандартного слоя.

Автор:  Иван Денисов [ Четверг, 06 Май, 2021 21:25 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

слои - это особенность реализации, так что на абстрактный уровень бы не тащил это...

Может в Dialog вместо зоопарка

Код:
   PROCEDURE IsLinux (): BOOLEAN;
   PROCEDURE IsMac (): BOOLEAN;
   PROCEDURE IsWindows (): BOOLEAN;
   PROCEDURE IsWine (): BOOLEAN;


сделать запрос Dialog.GetInfo, который возвращает запись, содержащую разные поля с информацией про запущенную среду: операционная система, пути директорий...

Автор:  adimetrius [ Пятница, 07 Май, 2021 13:09 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Я удивлен, что слои - это особенность реализации. Т.е. вы предполагаете возможность неких сборок или приложений, в которых будет другая реализация, без трехэтажной ФС?

PROCEDURE Dialog.GetInfo (OUT info: Dialog.Info)

Так?

Получается, что TYPE Info нужно определить в Dialog, т.е. на платформонезависимом уровне.

ПС.
Одноэтажная ФС - это ведь частный случай трехэтажной...

Автор:  Иван Денисов [ Пятница, 07 Май, 2021 15:22 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

adimetrius писал(а):
Я удивлен, что слои - это особенность реализации. Т.е. вы предполагаете возможность неких сборок или приложений, в которых будет другая реализация, без трехэтажной ФС?
ПС.
Одноэтажная ФС - это ведь частный случай трехэтажной...

Ну, конечно, может быть без слоёв. Например MemFiles над памятью. Там какие этажи? Или над какой-нибудь магнитной лентой.
И в продакшн многих проектов я бы не выпустил многослойный Files. Сложность - причина возможных ошибок.
В режиме IDE, когда есть эталон, есть пакеты расширений и сам проект - да, многослойность помогает решить проблемы. В конечном приложении пользователя - это возможный источник недопонимания пользователем поведения системы.

Автор:  Иван Денисов [ Пятница, 07 Май, 2021 15:25 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

adimetrius писал(а):
PROCEDURE Dialog.GetInfo (OUT info: Dialog.Info)

Да как то так, только сделать через ключ-значение, чтобы не было ограничений на количество информации и её структуру.
Код:
SysInfo = POINTER TO RECORD
   key, value: ARRAY 256 OF CHAR;
   next: SysInfo
END;

Автор:  adimetrius [ Пятница, 07 Май, 2021 17:25 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

1) Не совсем понимаю, как нестандартные реализации файловых систем будут конфликтовать с этажностью. Есть локатор, он в ББ связан с неким текстовым обозначением расположения, причем как это обозначение соотносится с реализацией ФС - не определено. Так вот, есть три расположения, есть три локатора - вот вам и три этажа. Могу вообразить запуск ББ, при котором стандартный этаж - это то, что упаковано в .exe, пакетный этаж - где-то на накопителе, а рабочий этаж - в ОЗУ, через MemFiles.

2) Я правильно понял, что вы предполагаете два разных HostFiles: один для разработки, другой для эксплуатации? Если так, то ведь в каждом модуле свои ошибки )). Только в идеальном мире можно взять и заменить идеальный разработочный HostFiles на идеальный эксплуатационный HostFiles; а в реальном - с новым HostFiles все тестирование (и наладку) начинай с начала. Не?

3) Пары ключ-значение, нагружающие динамическую память, и запись с полями - это очень разные подходы. Я прям не вижу причин, чтобы в развитом языке и среде, как ББ, завязываться на этот механизм. Это ж какой геморрой: мне нужен один параметр, а я должен получить их все, перебрать, и найти этот единственный. И почему обязательно строковое значение параметра предполагается? И зачем нагружать динамическую память и сборщик мусора? Это какой-то сборник переменных окружения получается.

Надо, пожалуй, договориться сначала по пунктам 1 и 2, а потом уж договариваться, как узнать расположения (пути) этажей. Можно, если это нужно, и не вводить трехэтажность на уровень System, а, например, на уровень Std или Dev.

П.С. и кстати трехэтажность - не принципиальный момент. Как я писал выше, в двухэтажном ББ тоже эта проблема стоит, и решается через хак Гельмута; т.е. не решается.

К слову, если перейти к "герметизации", то вместо HostFiles, которые разные, но одноименные в Windows и Linux, будут LinFiles и WinFiles. И тогда хак Гельмута не пройдет: клиентский модуль не может одновременно импортировать и то, и другое, чтобы написать
IF чегонибудь THEN path := loc(LinFiles).path$ ELSE path := loc(WinFiles).path$ END
Так что если захотим герметизации и однозначного соответствия имяМодуля-телоМодуля в модульном наборе ББ - то придется и этот вопрос как-то решать, и формализовать на платформонезависимом уровне работу с путями, т.е. прояснять взаимосвязи между локаторами.

Автор:  Иван Денисов [ Пятница, 07 Май, 2021 18:24 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Не надо эти этажи тащить в интерфейс — уверен. Это усложнение.

Где-то на форуме обсуждали, что надо бы добавить симметрично к:
Код:
PROCEDURE (l: Locator) This* (IN path: ARRAY OF CHAR): Locator, NEW, ABSTRACT;

Что-то вроде процедуры для взятия текстового идентификатора локатора:
Код:
PROCEDURE (l: Locator) GetPath* (OUT path: ARRAY OF CHAR), NEW, ABSTRACT;

Но опять же получим несовместимости по интерфейсам, от которых только недавно избавились. Поэтому стоит ли... надо подумать над обходными путями.

Не согласен с тезисом про проблемы с разными версиями модулей для разработки и для эксплуатации. Это нормальная практика. В случае с КП - модификации в HostFiles.Init ювелирны, и решаются фолдом, который скрывает возможность чтения эти переменных окружения, так что их не нет, к примеру. У меня существуют версии программ с модифицированным ядром, к примеру в котором есть возможность отключать сборку мусора во время приёма данных. Как я понял, очень многие реальные проекты живут как раз на модифицированных для производства версиях Блэкбокса... Поэтому и стараемся интерфейсы сохранять простыми.

Автор:  Илья Ермаков [ Пятница, 07 Май, 2021 19:16 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Ну вообще, конечно, к базовым объектам типа File, Locator, Store и др. просится добавить HandleMsg.

После чего можно не насиловать интерфейс, а просто некоторые реализации могут поддерживать какие-то сообщения. Сами специфические сообщения можно выносить в отдельные модули.

Автор:  adimetrius [ Понедельник, 10 Май, 2021 11:40 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Иван Денисов писал(а):
Не надо эти этажи тащить в интерфейс — уверен. Это усложнение.


Коллега, тогда предложите, как решить вот такую задачу:

Есть команда Info->Source. Я хочу еще добавить Info-Standard source, да еще чтобы она умела стать серенькой, если в стандартном слое нет модуля, и еще добавить галочку, если в фокусном окне - документ из стандартного слоя.

Автор:  Иван Денисов [ Понедельник, 10 Май, 2021 18:27 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

adimetrius писал(а):
Иван Денисов писал(а):
Не надо эти этажи тащить в интерфейс — уверен. Это усложнение.


Коллега, тогда предложите, как решить вот такую задачу:

Есть команда Info->Source. Я хочу еще добавить Info-Standard source, да еще чтобы она умела стать серенькой, если в стандартном слое нет модуля, и еще добавить галочку, если в фокусном окне - документ из стандартного слоя.

Предлагаю добавить в локатор поддержку префиксов.
standard: custom: use:
Они будут явно указывать, где разместить локатор.

В интерфейсе Files ничего менять не придётся :)

Пример:
Код:
Files.dir.This("standard:System/Mod")

Автор:  adimetrius [ Понедельник, 10 Май, 2021 22:35 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Интересная идея, надо обдумать. Это, я полагаю, все равно изменение интерфейса Files, просто той части, которую описывают в документации, она на языке программирования не формализуется.

Однако, если не менять интерфейс Files, то как узнать эту строку, имея локатор?

ПС тогда уж "STANDARD:///home/user/blabla"
))

Автор:  Александр Ильин [ Вторник, 11 Май, 2021 05:49 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

adimetrius писал(а):
ПС тогда уж "STANDARD:///home/user/blabla"
))

"STANDARD!!!:!!!home!user!blabla"

Автор:  Иван Денисов [ Вторник, 11 Май, 2021 06:14 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

adimetrius писал(а):
ПС тогда уж "STANDARD:///home/user/blabla"

Это работать не будет... так как тут абсолютный путь используете. А эти префиксы только для относительных путей. Относительно этих директорий.
И думаю, что это не изменение интерфейса, так как без этих префиксов всё будет прекрасно работать, как раньше.
А для открытия модулей вам не надо узнавать путь, так как по имени модуля можно вычислить ведь.

Автор:  Trurl [ Вторник, 11 Май, 2021 10:28 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Мне кажется, нынешняя система устроена так, чтобы скрыть наличие всех этих "теневых папок". А вы сейчас обсуждаете, как это все удобнее взломать.

Автор:  Иван Денисов [ Вторник, 11 Май, 2021 11:03 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Trurl писал(а):
Мне кажется, нынешняя система устроена так, чтобы скрыть наличие всех этих "теневых папок". А вы сейчас обсуждаете, как это все удобнее взломать.

Не думаю, что оно сделано, чтобы скрыть в значении безопасности. Оно скрыто для удобства, чтобы не затереть случайно проектом рабочий Блэкбокс. Так что обсуждаем, как взять оттуда файл, когда это необходимо для задач разработки.
Например, чтобы сравнить реализацию из проекта со стандартной реализацией.

Автор:  adimetrius [ Вторник, 11 Май, 2021 11:29 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Кажется, мы о разном. Вы предлагаете мне loc := Files.dir.This("STANDARD:Subsys/Mod"), как я понял. Такой локатор будет указывать на Subsystem/Mod в стандартном слое, а как уж это реализовано - дело реализации.

Но:

VAR w: Windows.Window; loc: Files.Locator;

w := Windows.dir.First(Controllers.frontPath);
loc := w.loc;

Теперь что делать?
1) Как узнать текстовое обозначение расположения loc
2) Каким оно будет, если, например, открыт документ из стандартного слоя
3) Как определить, что это расположение - в стандартном слое?

Случай из практики: мне надо в Гершеле запустить скомпилированный и скомпонованный .exe, причем он расположен в Hr/Demo/Exe. И вот загвоздка: оказывается, в MS Windows рабочий каталог процесса BlackBox.exe и рабочая папка USE могут отличаться. Поэтому если я буду запускать строку "Hr/Demo/Exe/some.exe", то файл не найден - он его отсчитывает неизвестно откуда. Так что в этой ситуации мне нужно знать точный абсолютный путь к рабочему слою, и тогда "C:\User\Work\BBUSE\Hr\Demo\Exe\Some.exe" найдется.

Автор:  Иван Денисов [ Вторник, 11 Май, 2021 12:06 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Согласен. Для этой задачи надо иметь возможность узнать буквенное обозначение локатора:
Код:
PROCEDURE (l: Locator) GetPath* (OUT path: ARRAY OF CHAR), NEW, ABSTRACT;


Тогда бы легко вызвали.
Код:
Files.dir.This('standard:').GetPath*(OUT path: ARRAY OF CHAR)

Автор:  adimetrius [ Вторник, 11 Май, 2021 13:01 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Вы, конечно, заметили наверняка, что GetPath расширяет интерфейс Files ))

Но мне эта идея нравится, т.к. убивает двух зайцев: избавляет от импорта HostFiles для доступа к пути и в то же время позволяет узнать расположение слоев.

Остается открытым вопрос: по вашей мысли, должен ли .GetPath возвращать префикс слоя, или нет? Мне кажется, необязательно.

Т.е. получается два нововведения:
1) PROCEDURE (loc: Locator) GetPath
2) PROCEDURE (dir: Directory) This* (IN path: ARRAY OF CHAR); распознает (необязательный) префикс слоя в пути
Path = [Layer ':' ] RelativeHostPath | AbsoluteHostPath.
Layer = 'USE' | 'CUSTOM' | 'STANDARD' .

Автор:  Иван Денисов [ Вторник, 11 Май, 2021 13:46 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

adimetrius писал(а):
Вы, конечно, заметили наверняка, что GetPath расширяет интерфейс Files ))

Но мне эта идея нравится, т.к. убивает двух зайцев: избавляет от импорта HostFiles для доступа к пути и в то же время позволяет узнать расположение слоев.

Да, для решения этой задачи - надо расширить интерфейс. А для решения предыдущей, которую вы приводили, — не надо :)


adimetrius писал(а):
Остается открытым вопрос: по вашей мысли, должен ли .GetPath возвращать префикс слоя, или нет? Мне кажется, необязательно.

Не должен. Он возвращает системный путь.

adimetrius писал(а):
Т.е. получается два нововведения:
1) PROCEDURE (loc: Locator) GetPath
2) PROCEDURE (dir: Directory) This* (IN path: ARRAY OF CHAR); распознает (необязательный) префикс слоя в пути
Path = [Layer ':' ] RelativeHostPath | AbsoluteHostPath.
Layer = 'USE' | 'CUSTOM' | 'STANDARD' .

Автор:  Иван Денисов [ Воскресенье, 13 Февраль, 2022 21:13 ]
Заголовок сообщения:  Re: #022 Добавить второй уровень рабочих папок

Добавлена возможность узнать пути CUSTOM и STANDARD

Вложение:
Clipboard - 31 января 2022 г., 19_10.png
Clipboard - 31 января 2022 г., 19_10.png [ 65.72 КБ | Просмотров: 4783 ]



Это пока не полная поддержка идеи префиксов. Но два зарезервированных пути для локаторов. Это покрывает собственно все задачи. Так как от таких локаторов уже возможно строить пути дальше через This.


Код:
   PROCEDURE (d: Directory) This (IN path: ARRAY OF CHAR): Files.Locator;
   BEGIN
      IF path = "STANDARD:" THEN
         RETURN NewLocator(startupDir);
      ELSIF path = "CUSTOM:" THEN
         IF isCustomDir THEN
            RETURN NewLocator(customDir)
         ELSE
            RETURN d.startup.This("")
         END
      ELSE
         RETURN d.startup.This(path)
      END
   END This;

Страница 4 из 5 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/