OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 06 Август, 2021 06:04

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 79 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
СообщениеДобавлено: Четверг, 06 Май, 2021 16:59 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 496
Коллеги, вопрос: как узнать, какие расположения заданы для USE, CUSTOM и STANDARD?

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

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Четверг, 06 Май, 2021 21:25 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3125
слои - это особенность реализации, так что на абстрактный уровень бы не тащил это...

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

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2021 13:09 
Аватара пользователя

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

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

Так?

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2021 15:22 
Аватара пользователя

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2021 15:25 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3125
adimetrius писал(а):
PROCEDURE Dialog.GetInfo (OUT info: Dialog.Info)

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 07 Май, 2021 17:25 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 496
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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3125
Не надо эти этажи тащить в интерфейс — уверен. Это усложнение.

Где-то на форуме обсуждали, что надо бы добавить симметрично к:
Код:
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 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9428
Откуда: Россия, Орёл
Ну вообще, конечно, к базовым объектам типа File, Locator, Store и др. просится добавить HandleMsg.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Май, 2021 11:40 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 496
Иван Денисов писал(а):
Не надо эти этажи тащить в интерфейс — уверен. Это усложнение.


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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Май, 2021 18:27 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3125
adimetrius писал(а):
Иван Денисов писал(а):
Не надо эти этажи тащить в интерфейс — уверен. Это усложнение.


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

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

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

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 10 Май, 2021 22:35 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 496
Интересная идея, надо обдумать. Это, я полагаю, все равно изменение интерфейса Files, просто той части, которую описывают в документации, она на языке программирования не формализуется.

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

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2021 05:49 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2418
Откуда: Россия, Томск
adimetrius писал(а):
ПС тогда уж "STANDARD:///home/user/blabla"
))

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2021 06:14 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3125
adimetrius писал(а):
ПС тогда уж "STANDARD:///home/user/blabla"

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2021 10:28 

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 10:28
Сообщения: 1384
Мне кажется, нынешняя система устроена так, чтобы скрыть наличие всех этих "теневых папок". А вы сейчас обсуждаете, как это все удобнее взломать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2021 11:03 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3125
Trurl писал(а):
Мне кажется, нынешняя система устроена так, чтобы скрыть наличие всех этих "теневых папок". А вы сейчас обсуждаете, как это все удобнее взломать.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2021 11:29 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 496
Кажется, мы о разном. Вы предлагаете мне 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 
Аватара пользователя

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


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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Май, 2021 13:01 
Аватара пользователя

Зарегистрирован: Суббота, 16 Февраль, 2008 02:47
Сообщения: 496
Вы, конечно, заметили наверняка, что 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 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3125
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' .


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 79 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2021, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB