Сообщество программистов Autodesk в СНГ

Статьи => Опубликованные статьи => Тема начата: Александр Ривилис от 12-12-2013, 01:30:03

Название: Переменные окружения
Отправлено: Александр Ривилис от 12-12-2013, 01:30:03
Переменные окружения
Название: Re: Переменные окружения
Отправлено: Андрей Бушман от 12-12-2013, 10:40:44
Реализовать функционал не зависимым от регистра, разработчикам ничего не стоило. Это банальная кривизна реализации, т.е. попросту говоря - баг...

В компаниях, администраторы нередко при помощи политик блокируют пользователям возможность запуска regedit.exe, в виду чего у них не представляется возможность посмотреть нужную ветку реестра на предмет того, как же там записано имя переменной: САМАЯКРУТАЯПЕРЕМЕННАЯ, самаякрутаяпеременная, СамаяКрутаяПеременная или же вовсе: Самая Крутая Переменная (наименования параметров в реестре вполне могут содержать пробелы).
Название: Re: Переменные окружения
Отправлено: Александр Ривилис от 12-12-2013, 11:06:56
Андрей. Ты же не считаешь, что в C-подобных языках (C/C++/C# и т.д.) тот факт, что имена переменных являются регистрозависимыми - это баг? Скорее уж баг то, что переменные окружения в Windows не регистрозависимые. Но это уже от Autodesk никак не зависит.
Название: Re: Переменные окружения
Отправлено: Андрей Бушман от 12-12-2013, 11:12:16
Не следует путать белое с пушистым: доступ к реестру ОС осуществляется посредством API, предоставляемым этой ОС. Если в этом API нет зависимости от регистра, то и реализация от Autodesk должна работать аналогично. В данном случае музыку заказывает Microsoft, а Autodesk должна следовать существующим правилам, не впадая в рассуждения о "сферических конях в вакууме", поскольку программисты, ранее работавшие с реестром, логично ожидают, что зависимости от регистра не будет.

Кроме того, в подобных ситуациях независимость от регистра достаточно удобна (имхо). Выше я привёл пример, когда зависимость от регистра может вызвать определённые затруднения в использовании таких переменных рядовыми пользователями AutoCAD (обратите внимание). В нашей компании как раз действует обозначенный мною запрет.
Название: Re: Переменные окружения
Отправлено: Александр Ривилис от 12-12-2013, 13:18:26
Не следует путать белое с пушистым:
Ну если по большому счету, то функция (getenv) в AutoLisp появилась в том незапамятном году, когда никто о том, что когда-нибудь появится Windows и в нем будет понятие реестра даже и предполагать не мог. Зато AutoCAD работал под Unix, в котором принята регистрозависимость. И хранилась эта информация в файле настроек, а не в реестре.
Короче говоря так исторически сложилось.
Кроме того, в подобных ситуациях независимость от регистра достаточно удобна
С этим я могу согласится. Точнее могу согласится с желательностью единообразия. Т.е. если имя переменной окружения регистронезивисимое, то и имя ключа в реестре должно быть регистронезависимым.
зависимость от регистра может вызвать определённые затруднения в использовании таких переменных рядовыми пользователями AutoCAD (обратите внимание).
А зачем рядовым пользователям AutoCAD использовать "такие" переменные?

P.S.: Что касается этой статьи, то в ней есть на мой взгляд неосвещенный вопрос - в ряде случаев информация берется из ключа реестра HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:YYY\FixedProfile\General
Название: Re: Переменные окружения
Отправлено: Андрей Бушман от 12-12-2013, 14:27:16
Короче говоря так исторически сложилось.
Ясно. Хотя с тех пор, как AutoCAD перешёл на Windows прошло много лет и внести соответствующие изменения (убрать зависимость от регистра) можно было бы уже давно, ибо не под Unix пишут...
А зачем рядовым пользователям AutoCAD использовать "такие" переменные?
Юзер может и не использовать сам по себе - использовать могут всякие программки, загружаемые им в AutoCAD. В readme.txt программок автор может указать имена переменных, влияющих на поведение программки, но при этом ошибиться с регистром. Этот факт вскроется при просмотре ветки реестра с помощью regedit.exe.
P.S.: Что касается этой статьи, то в ней есть на мой взгляд неосвещенный вопрос - в ряде случаев информация берется из ключа реестра HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-YYYY:YYY\FixedProfile\General
Есть такое дело... Возможно Алексей, сказав "А", скажет и "Б" на тему обозначенной вами ветки реестра... :) В частности в ветке FixedProfile будет создана произвольная пользовательская переменная "Самая Крутая Переменная", о которой я писал выше. Насколько я понимаю, в обозначенной ветке хранится общая для всех профилей AutoCAD информация.
Название: Re: Переменные окружения
Отправлено: Александр Ривилис от 12-12-2013, 14:37:03
В readme.txt программок автор может указать имена переменных, влияющих на поведение программки, но при этом ошибиться с регистром.
Мне кажется, что этот вопрос можно решить трояко:
1) Сообщить об этом автору, если (getenv "имя переменной") возвратит nil
2) Кроме regedit.exe есть еще масса программ, позволяющих посмотреть реестр (или хотя-бы получить текстовый файл со списком ключей/переменных). Например:
Код - INI [Выбрать]
  1. reg query HKCU\Software\Autodesk\AutoCAD\R19.0\ACAD-B001:409\FixedProfile\General
3) Обратится к сисадминам, чтобы они помогли проверить имя/значение переменной в реестре.
Название: Re: Переменные окружения
Отправлено: Андрей Бушман от 12-12-2013, 14:50:13
Я вам привёл примеры не для того, чтобы вы изо всех сил пытались защищать программистов Autodesk. Регистровая зависимость имени параметра в реестре, противоречащая самому API операционной системы - это неудобно и неправильно (не зависимо от того, какие варианты обхождения бага вы бы не предлагали). В Unix это была бы правильная реализация, но в Windows такая реализация является багом. Мы работаем в Windows, поэтому Unix не может служить оправданием.
1) Сообщить об этом автору, если (getenv "имя переменной") возвратит nil
Это не всегда удобно (по времени, необходимом на такого рода переписку) или не всегда возможно (нет обратной связи).
Мне кажется, что этот вопрос можно решить двояко:
2) Кроме regedit.exe есть еще масса программ, позволяющих посмотреть реестр (или хотя-бы получить текстовый файл со списком ключей/переменных). Например:
Это у вас дома может быть масса таких программ, прошу не путать с рабочей обстановкой... В нормальной компании юзер не имеет админских прав, необходимых для установки софта. Кроме того, много ли вам  таких пользователей известно, которые умеют пользоваться командой reg и знают, какой именно параметр ей нужно указать? Вопрос риторический...
Цитата: Александр Ривилис
3) Обратится к сисадминам, чтобы они помогли проверить имя/значение переменной в реестре.
По такому вопросу сисадмин с вероятностью 99,9% пошлёт юзера гулять лесом, поскольку искомая запись находится в юзерской ветке реестра, а войдя под админской записью админ в HKCU получит др. ветку (свою, а не юзера). Ковыряться в ветке в USERS в поисках нужной записи админу будет лень\некогда. У нас именно так и происходит (полагаю, что не только у нас). И вообще, если бы не было зависимости от регистра, данной проблемы вообще не возникало бы (приехали туда, откуда отправлялись)...
Название: Re: Переменные окружения
Отправлено: Александр Ривилис от 12-12-2013, 15:00:00
Регистровая зависимость имени параметра в реестре, противоречащая самому API операционной системы
Причем здесь API операционной системы? Функция (getenv) в действительности в ряде случаев использует API для работы с реестром в Windows. Ну и что?
P.S.: Кстати это документированное поведение функции. Цитата из первоисточника (ObjectARX SDK Docs):
Цитировать
Input environment variable name to get, which is case sensitive in all environments (Visual LISP, ObjectARX, and VB/ActiveX)
Название: Re: Переменные окружения
Отправлено: Андрей Бушман от 12-12-2013, 15:08:41
Причем здесь API операционной системы?
При том, что используя этот API я получаю нужный раздел или параметр вне зависимости от регистра символов, которыми набрано искомое имя.
Кстати это документированное поведение функции
И что? Задокументированный баг. На это я вам процитирую Джона Роббинса:
Цитата: Джон Роббинс
Баг - это всё что угодно, что заставляет пользователя страдать:
  • аварии и зависания
  • низкая производительность и масштабируемость
  • неверные результаты
  • нарушение безопасности
  • противоречивые пользовательские интерфейсы
  • неудовлетворённые ожидания
В данном случае, зависимость от регистра может временами "заставить пользователя страдать" ибо появляются "неудовлетворённые ожидания".

P.S. В общем это всё ИМХО и более ничего доказывать не хочу\не буду.
Название: Re: Переменные окружения
Отправлено: Александр Ривилис от 12-12-2013, 15:15:42
По такому вопросу сисадмин с вероятностью 99,9% пошлёт юзера гулять лесом, поскольку искомая запись находится в юзерской ветке реестра, а войдя под админской записью админ в HKCU получит др. ветку (свою, а не юзера). Ковыряться в ветке в USERS в поисках нужной записи админу будет лень\некогда.
Это говорит лишь о том, что организация труда у вас неправильная. Сисадмины должны помогать, а не препятствовать проектировщикам, ибо именно проектировщики приносят в организацию деньги. А дойную корову нужно любить и уважать.
Но этот вопрос - оффтопик в данной теме.
Факт остаётся фактом - функция работает два десятка лет по одному и тому же описанному в документации алгоритму. Менять поведение этой функции не будут, так как это вызовет побочные и очень трудно диагностируемые эффекты в уже существующих программах (в том числе и в самом AutoCAD). Аминь!  :)