Трудности использования SubVi
Трудности использования SubVi
День добрый, уважаемые знатоки.
Меня мучает проблема следующего характера: очень часто складывается ситуация, что при выполнении тех или иных задач (чаще связаных с графикой, листбоксами или Вейформграфами) приходится оперировать со свойствами объектов, причем код получается внушительных размеров и вызываться должен многократно во многих местах программы. Моя головная боль, что я не могу нормально упаковать такой код в SubVi.
Передача ссылок в SubVi ни к чему особо хорошему не приводит по следующим причинам: 1) не выполняются никакие события => невозможно сделать готовую библиотеку стандартной работы с графикой на базе SubVi; 2) Случаются утечки памяти и конфликты типизации при работе с Вейформграфами. 3) SubVi со ссылками в качестве аргументов невозможно инлайнить вообще и скорость их выполнения выбешивает; 4) каждый раз увазяать ниточками и передавать по 20 ссылок в виайку некруто, а попытки создать некий кластер, содержащий ссылки на все нужные мне элементы управления, и передавать уже именно его добром не закончились (а именно была ругань со стороны SubVi на неопределенные типы, с которыми она знаться не желает. Типы проставлял руками согласно типам объектов - не помогло)
В связи с вышеизложенным вопрос: могу я как-то добраться до внутренних свойств у объектов лицевой панели, дабы перетаскивать непосредственно их? Особо это касается Листбоксов, так как они вообще не оборудованы методами обработки содержимого, а удобство использования публичных свойств оставляет желать лучшего.
Ну или как еще можно свернуть в SubVi нечто, что оперирует со свойствами объектов лицевой панели таким образом, чтобы это выполнялось достаточно быстро.
Версия LabView 2010
Буду благодарен за любые мнения и советы. Заранее спасибо
Меня мучает проблема следующего характера: очень часто складывается ситуация, что при выполнении тех или иных задач (чаще связаных с графикой, листбоксами или Вейформграфами) приходится оперировать со свойствами объектов, причем код получается внушительных размеров и вызываться должен многократно во многих местах программы. Моя головная боль, что я не могу нормально упаковать такой код в SubVi.
Передача ссылок в SubVi ни к чему особо хорошему не приводит по следующим причинам: 1) не выполняются никакие события => невозможно сделать готовую библиотеку стандартной работы с графикой на базе SubVi; 2) Случаются утечки памяти и конфликты типизации при работе с Вейформграфами. 3) SubVi со ссылками в качестве аргументов невозможно инлайнить вообще и скорость их выполнения выбешивает; 4) каждый раз увазяать ниточками и передавать по 20 ссылок в виайку некруто, а попытки создать некий кластер, содержащий ссылки на все нужные мне элементы управления, и передавать уже именно его добром не закончились (а именно была ругань со стороны SubVi на неопределенные типы, с которыми она знаться не желает. Типы проставлял руками согласно типам объектов - не помогло)
В связи с вышеизложенным вопрос: могу я как-то добраться до внутренних свойств у объектов лицевой панели, дабы перетаскивать непосредственно их? Особо это касается Листбоксов, так как они вообще не оборудованы методами обработки содержимого, а удобство использования публичных свойств оставляет желать лучшего.
Ну или как еще можно свернуть в SubVi нечто, что оперирует со свойствами объектов лицевой панели таким образом, чтобы это выполнялось достаточно быстро.
Версия LabView 2010
Буду благодарен за любые мнения и советы. Заранее спасибо
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Трудности использования SubVi
Для доступа к свойствам объекта в SubVI в него нужно передавать ссылку (вы об этом в принципе знаете).
Чтобы не тянуть 20 ссылок, объединяйте их в кластер (тоже делаете).
Единственная проблема, которая мне видится, это неправильная организация именно кластера. Для этого делается control (Type Def) и сохраняется, далее в проекте используется именно он, что бы структура везде была типизирована. Это позволит решить множество проблем при модифицировании.
-----------
Свое мнение по поводу всего остального опущу.
Чтобы не тянуть 20 ссылок, объединяйте их в кластер (тоже делаете).
Единственная проблема, которая мне видится, это неправильная организация именно кластера. Для этого делается control (Type Def) и сохраняется, далее в проекте используется именно он, что бы структура везде была типизирована. Это позволит решить множество проблем при модифицировании.
-----------
Свое мнение по поводу всего остального опущу.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Трудности использования SubVi
дополнение к предыдущему, на сонове существенной строки
И менно эту константу поместить в typedef. Тогда типы ссылок будут точно соотвесттвовать типам контролов.
правой на интересующем контроле - создать реф. дальше собрать все рефы в кластер (bundle), правой на выходе bundle - создать константу.Ermak337 писал(а):Типы проставлял руками согласно типам объектов - не помогло
И менно эту константу поместить в typedef. Тогда типы ссылок будут точно соотвесттвовать типам контролов.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Трудности использования SubVi
Не вызывайте в СабВИ Property / Invoke Nodes и вообще не дёргайте UI Thread, тогда и инлайнить сможете, и скорость работы будет максимально возможная (в тех пределах, что позволяет ОСь и железо). А вообще, выносите работу с (G)UI в отдельный поток (цикл), тогда и не будет таких проблем. Больше здесь мне добавить нечего.Ermak337 писал(а):SubVi со ссылками в качестве аргументов невозможно инлайнить вообще и скорость их выполнения выбешивает;
По передаче большого числа параметров в СабВИ см. тему http://labviewportal.org/viewtopic.php? ... 88&p=67757
Re: Трудности использования SubVi
Господа, еще раз. При засовывании в кластер ссылок на такие динамически изменяемые объекты, как Вейформграфы, о да, в пределах окна я могу использовать строгие ссылки на данные окна, разворачивать их из кластера и все такое. Но мне лично никаким способом не удалось передать кластера такого вида в SubVi (о чем и тема), так как ссылки получаются не строгими на сколько я понимаю и далеко не все свойства можно будет менять. И с методами та же байда.
Даже к свойству Value доступ будет только через вариант, а про остальное я вообще молчу.
На счет можно будет инлайнить. Уважаемый dadreamer, попробуй выставить в VI propertis/Execution параметр inline для чего либо, содержащего на входе кластер из двух и более разнородных ссылок, а потом рассказывай. И 25000 double это тоже не баран чихнул, так что инлайнить я вынужден. Если же вы рассказать мне хотите, что проперти мне не нужны, то расскажите заодно как мне выводить на график (который на мордопанели) данные, полученные на основе этих 25000 точек, с учетом того что я вынужден пересчитывать их вручную, переставлять шкалы, выставлять смещение и умножение и еще кучу разных вещей. И на 200 разных событий обработку плотов по мыши тоже бы хотелось субвиайкой, а плоты - это снова свойства. Сказать "не используй в подпрограммах ничего, кроме самых простых действий" всякий может, но толку от таких подпрограмм?
По поводу "вынеси GUI отдельно" легко говорить тем, кто с сигналами не работает. А я не могу выплюхивать результаты их обработы как цифорки: надпись "Недостаточно памяти для завершения операции" не радует меня ни сколько. И для вывода их в мне кучу промежуточных преобразований надо делать. Однотипных. Часто-часто.... Ну вы поняли о чем я
Зы: Всем за поддержку спасибо. Решением своей проблемы выбрал тупую копипасту кусков кода. Только так и никак иначе увы, а очень жаль. LabView хороший язык для своих задач, а все извращенцы вроде меня, которые пытаются совместить на нем реализацию сложных пользовательских интерфейсов и реальную обработку сигналов получат все, что полагается за это получить.
Даже к свойству Value доступ будет только через вариант, а про остальное я вообще молчу.
На счет можно будет инлайнить. Уважаемый dadreamer, попробуй выставить в VI propertis/Execution параметр inline для чего либо, содержащего на входе кластер из двух и более разнородных ссылок, а потом рассказывай. И 25000 double это тоже не баран чихнул, так что инлайнить я вынужден. Если же вы рассказать мне хотите, что проперти мне не нужны, то расскажите заодно как мне выводить на график (который на мордопанели) данные, полученные на основе этих 25000 точек, с учетом того что я вынужден пересчитывать их вручную, переставлять шкалы, выставлять смещение и умножение и еще кучу разных вещей. И на 200 разных событий обработку плотов по мыши тоже бы хотелось субвиайкой, а плоты - это снова свойства. Сказать "не используй в подпрограммах ничего, кроме самых простых действий" всякий может, но толку от таких подпрограмм?
По поводу "вынеси GUI отдельно" легко говорить тем, кто с сигналами не работает. А я не могу выплюхивать результаты их обработы как цифорки: надпись "Недостаточно памяти для завершения операции" не радует меня ни сколько. И для вывода их в мне кучу промежуточных преобразований надо делать. Однотипных. Часто-часто.... Ну вы поняли о чем я
Зы: Всем за поддержку спасибо. Решением своей проблемы выбрал тупую копипасту кусков кода. Только так и никак иначе увы, а очень жаль. LabView хороший язык для своих задач, а все извращенцы вроде меня, которые пытаются совместить на нем реализацию сложных пользовательских интерфейсов и реальную обработку сигналов получат все, что полагается за это получить.
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Трудности использования SubVi
судя по праведному гневу это вы поленились прочиать/воспроизвести.Ermak337 писал(а):Господа, еще раз. При засовывании в кластер ссылок на такие динамически изменяемые объекты, как Вейформграфы, о да, в пределах окна я могу использовать строгие ссылки на данные окна, разворачивать их из кластера и все такое. Но мне лично никаким способом не удалось передать кластера такого вида в SubVi (о чем и тема), так как ссылки получаются не строгими на сколько я понимаю и далеко не все свойства можно будет менять. И с методами та же байда.
Artem.spb писал(а):правой на интересующем контроле - создать реф. дальше собрать все рефы в кластер (bundle), правой на выходе bundle - создать константу.
И менно эту константу поместить в typedef. Тогда типы ссылок будут точно соотвесттвовать типам контролов.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Трудности использования SubVi
Так? Другой вопрос, что дальше вам разрешит с этими ссылками делать в инлайн SubVI.Ermak337 писал(а):На счет можно будет инлайнить. Уважаемый dadreamer, попробуй выставить в VI propertis/Execution параметр inline для чего либо, содержащего на входе кластер из двух и более разнородных ссылок, а потом рассказывай.
Я вообще-то ясно написал:Ermak337 писал(а):Если же вы рассказать мне хотите, что проперти мне не нужны
Ни слова о том, чтобы не использовать Property / Invoke Nodes в других циклах и ВП, где не требуется инлайн и времякритичные операции.dadreamer писал(а):Не вызывайте в СабВИ Property / Invoke Nodes и вообще не дёргайте UI Thread
Уже говорил. Вся работа с UI-потоком оформляется как отдельный цикл, связь этого цикла с остальными выполняется через очередь или какой-то другой инструмент синхронизации. Очередь может быть, например, строкового типа. Команда для отправки может иметь базовый вид "объект:действие:[данные]", скажем, "WFGraph1:Отобразить:Y1,Y2,Y3". Вам лишь нужно сделать простенький парсер на принимающей стороне и формирователь команд на отправляющей.Ermak337 писал(а):расскажите заодно как мне выводить на график (который на мордопанели) данные, полученные на основе этих 25000 точек
Вам такого не говорили. Было сказано о том, что не стоит переключаться в UI-поток, если важна скорость работы SubVI и inline. Кроме собственно Property / Invoke Nodes в этом случае не следует использовать не реентерантные DLL и CIN (оранжевый цвет), работу с экраном, с клавой и с мышью. Более подробно написано здесь:Ermak337 писал(а):Сказать "не используй в подпрограммах ничего, кроме самых простых действий" всякий может, но толку от таких подпрограмм?
Multitasking in LabVIEW
The UI Thread, Root Loop, and LabVIEW: What You Need to Know
Все остальные инструменты использовать не возбраняется.
Использовать с палитры Synchronization религия не позволяет?Ermak337 писал(а):По поводу "вынеси GUI отдельно" легко говорить тем, кто с сигналами не работает. А я не могу выплюхивать результаты их обработы как цифорки: надпись "Недостаточно памяти для завершения операции" не радует меня ни сколько. И для вывода их в мне кучу промежуточных преобразований надо делать. Однотипных. Часто-часто.... Ну вы поняли о чем я
Сами спросили, сами себе ответили. Зачем было тему на форуме создавать...Ermak337 писал(а):Зы: Всем за поддержку спасибо. Решением своей проблемы выбрал тупую копипасту кусков кода. Только так и никак иначе увы, а очень жаль.
Re: Трудности использования SubVi
В ближайшее время выкину снапшоты того, что пробовал и что из этого вышло. Сейчас сделать не могу, ибо попытки успехом не увенчались и как следствие не выжили. Но набрать руками кластер для тайпдефа из референсов... А вы пробовали? Там штуковины типо локал вариэйблов. Я пораждал от них индикаторы и складывал в кластер - к добру не привело. То есть в пределах окна свертывается и развертывается, но не далее.
Неименованными кластерами религия пользоваться не позволяла - так что извеняйте. Но потом, науки ради, может я и попробую (но пользоваться неименованными кластерами все равно не буду - при наличии однотипных параметров в кластере немыслимо для меня это)
Я извиняюсь, что своевременно не сделал все необходимые снапшеты. Воспроизведу в течении пары дней (сейчас очень все срочно и напряжно. Сначала результат, потом чистая наука)
dadreamer, еще раз. У меня в данный момент массив длинной 17000 точек на 200 параметров (двумерный массив). Он бывает и другим (больше или меньше) и я его должен выводить в форме графиков, с возможностью динамического масштабирования. Такое кол-во точек ни в один граф вывести нельзя - по памяти отвалимся, да и не нужно - видно их не будет. Поэтому у меня идет преобразование до разрешения 600х200 из рассматриваемого куска и выкидываю на график уже это и живем. При этом мне надо согласно масштабированию накрутить график в смысле состояния его офсетов, мултиплеров и пределов. Я лишь говорю, что было бы хорошо мочь менять проперти в SubVI и это сэкономило бы мне кучу кода.
Кстати, адекватные люди подсказали решение: запустил цикл, в котором все критичные мне проперти всех нужных контролов постоянно переустанавливаются переменными вида кластеров и ифами вызываются методы. В субвиайках делаю что хочу, а на выводе нужные состояния вгужаю в эти перемннные. Работает без проблем, хотя по вашей религии может и неправильно
Неименованными кластерами религия пользоваться не позволяла - так что извеняйте. Но потом, науки ради, может я и попробую (но пользоваться неименованными кластерами все равно не буду - при наличии однотипных параметров в кластере немыслимо для меня это)
Я извиняюсь, что своевременно не сделал все необходимые снапшеты. Воспроизведу в течении пары дней (сейчас очень все срочно и напряжно. Сначала результат, потом чистая наука)
dadreamer, еще раз. У меня в данный момент массив длинной 17000 точек на 200 параметров (двумерный массив). Он бывает и другим (больше или меньше) и я его должен выводить в форме графиков, с возможностью динамического масштабирования. Такое кол-во точек ни в один граф вывести нельзя - по памяти отвалимся, да и не нужно - видно их не будет. Поэтому у меня идет преобразование до разрешения 600х200 из рассматриваемого куска и выкидываю на график уже это и живем. При этом мне надо согласно масштабированию накрутить график в смысле состояния его офсетов, мултиплеров и пределов. Я лишь говорю, что было бы хорошо мочь менять проперти в SubVI и это сэкономило бы мне кучу кода.
Кстати, адекватные люди подсказали решение: запустил цикл, в котором все критичные мне проперти всех нужных контролов постоянно переустанавливаются переменными вида кластеров и ифами вызываются методы. В субвиайках делаю что хочу, а на выводе нужные состояния вгужаю в эти перемннные. Работает без проблем, хотя по вашей религии может и неправильно
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Трудности использования SubVi
Ermak337, Так в кластер надо реальные референсы ваших контролов закидывать, т.е перед передачей в SubVI ее надо заполнять. А так структура обеспечивает только контроль типов и соответственно доступ к определенных методов для контролов.
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Трудности использования SubVi
Получается разговор глухого с немым.Ermak337 писал(а):В ближайшее время выкину снапшоты того, что пробовал и что из этого вышло. Сейчас сделать не могу, ибо попытки успехом не увенчались и как следствие не выжили. Но набрать руками кластер для тайпдефа из референсов... А вы пробовали? Там штуковины типо локал вариэйблов. Я пораждал от них индикаторы и складывал в кластер - к добру не привело. То есть в пределах окна свертывается и развертывается, но не далее.
Вам с самого начала говорят, как нужно сделать, посмотрите видео, может станет понятнее.
По поводу inline...
Вы не верно ассоциируете причинно следственные связи.Ermak337 писал(а):На счет можно будет инлайнить. Уважаемый dadreamer, попробуй выставить в VI propertis/Execution параметр inline для чего либо, содержащего на входе кластер из двух и более разнородных ссылок, а потом рассказывай.
Не получается нормально сделать, т.к. (http://zone.ni.com/reference/en-XX/help ... I_Overhead):
A subVI that you want to inline cannot have any of the following characteristics:
- Contains recursion
- Uses automatic error handling
- Contains certain block diagram nodes, such as Property Nodes and Invoke Nodes. These nodes generate edit-time error messages if you enable subVI inlining.
.....
hGisgGgv6-Y
сценарий не продумывал, так что извиняйте.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- professor
- Сообщения: 3409
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 176 раз
- Контактная информация:
Re: Трудности использования SubVi
нет, конечно. Зачем пробовать? я сразу даю глупые советы, чтобы поиздеваться над людьми.Ermak337 писал(а):В ближайшее время выкину снапшоты того, что пробовал и что из этого вышло. Сейчас сделать не могу, ибо попытки успехом не увенчались и как следствие не выжили. Но набрать руками кластер для тайпдефа из референсов... А вы пробовали?
я не только пробовал, но и постоянно так делаю. впрочем, Иван уже выложил видеоинструкцию.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Трудности использования SubVi
Есть еще один вариант: использование Shared Variables. Контролам назначается переменная через Data Binding в их свойствах. Тогда никаких референсов тянуть не надо. А если еще данные группировать в кластеры, то получается весьма компактная конструкция, без этих извращений с референсами.
Но вообще - если индицированных данных много, то что-то с программой.
Но вообще - если индицированных данных много, то что-то с программой.
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Re: Трудности использования SubVi
Ermak337, у вас нет понимания того, что Вам рекомендуют. А рекомендуют всё верно.
Начинать нужно с архитектуры приложения. Необходимый минимум:
1. Цикл с по работе с UI
2. Цикл на сбор данных
3. Цикл на обработку данных
4. Цикл на визуализацию
5. Цикл сохранения данных
6. Цикл логирования
7. Цикл на property/invoke(в вашем случае для масштабирования графиков)
Связь между циклами через очереди/уведомители(надеюсь вы ими не брезгуете пользоваться).
Ну дк можно же менять. Другое дело, что из-за этого у вас производительность просядет(если будете дёргать постоянно в SubVI свойства графика в том числе).А это следствие того, что кто-то выбрал плохую архитекртуру для приложения, напрограммировал что называется "как смог", а теперь имеет любовь с этим делом.
Начинать нужно с архитектуры приложения. Необходимый минимум:
1. Цикл с по работе с UI
2. Цикл на сбор данных
3. Цикл на обработку данных
4. Цикл на визуализацию
5. Цикл сохранения данных
6. Цикл логирования
7. Цикл на property/invoke(в вашем случае для масштабирования графиков)
Связь между циклами через очереди/уведомители(надеюсь вы ими не брезгуете пользоваться).
У меня есть проект, в котором ~300 контролов/индикаторов. Эти контролы/индикаторы разделены на 17 кластеров. 17, Карл!!! На каждый кластер создан референс, все референсы в отдельный кластер. Так же на сотню контролов созданы отдельные рефы и так же собраны в кластер, для того чтоб можно было их свойства дёргать(цвет менять, дизейблить, скрывать и т.д.).Ermak337 писал(а):Но набрать руками кластер для тайпдефа из референсов... А вы пробовали?
Можно и через вариант. Что в этом такого? Не умеете работать с этим типом данных? Выше вон рассказали про TypeDef-ы, кластера, и т.д. Не надо это игнорить, это решение проблемы.Ermak337 писал(а):Даже к свойству Value доступ будет только через вариант, а про остальное я вообще молчу
А давайте посчитаем память? Значит : 17000(кол-во точек)х8(размерность типа данных double,8 байт)х200(кол-во параметров) = 27.200 000 байт(27 МБ)! У вас нет 27 МБ памяти? А теперь проведём натуральный эксперимент: создаём двумерный массив: 200 "типа параметров", каждый содержит 17000 точек. Всё работает. Другое дело, сколько времени потратится на отрисовку и визуальный анализ всего этого хозяйства. Поэтому для таких объемов информации создают несколько графиков и по ним группируют отображаемые сигналы. Можно еще и децимацию добавить, если точность не так важна.Ermak337 писал(а):У меня в данный момент массив длинной 17000 точек на 200 параметров (двумерный массив). Он бывает и другим (больше или меньше) и я его должен выводить в форме графиков, с возможностью динамического масштабирования. Такое кол-во точек ни в один граф вывести нельзя - по памяти отвалимся, да и не нужно - видно их не будет.
Ermak337 писал(а):Я лишь говорю, что было бы хорошо мочь менять проперти в SubVI и это сэкономило бы мне кучу кода.
Ну дк можно же менять. Другое дело, что из-за этого у вас производительность просядет(если будете дёргать постоянно в SubVI свойства графика в том числе).А это следствие того, что кто-то выбрал плохую архитекртуру для приложения, напрограммировал что называется "как смог", а теперь имеет любовь с этим делом.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын