All streams
Search
Write a publication
Pull to refresh
6
0.3
Send message
Самое интересное в программировании, на мой взгляд, это кодирование пользовательского интерфейса. Для С++ используются такие фреймворки, как Qt, wxWidgets, Win32++, WTL / ATL и т.п.

Программированию интерфейсу, как таковому, уделяется слишком мало внимания. Соответственно, как только сталкиваешься с реальной задачей, так сразу возникает куча проблем на ровном месте. Как сделать то, это и другое. Общий подход, что позволяет делать официальный фреймворк, то и делай, все остальное от лукавого. Подход, почти как в «1С» – ешьте, что дают и, смотрите, не обляпайтесь.

Но ведь С++ это фундаментальный язык, поэтому с ограничениями фрейморков можно согласиться, только если это высокоуровневые платформы, типа Qt и wxWidgets. Но WTL, скажем, это почти уровень WinAPI, так что его ограничения трудно принять.

Возьмем, например, парадигму MDI. Не знаю, с какого бодуна, наверное, еще со времен Windows-3.1, но существует запрет, на уровне системных dll, использования локального меню в дочерних MDI-окнах. Вот народ и изгаляется. Создает контекстное меню, кнопочное меню, командные бары и панели, панельное меню и даже html-окна с меню в виде ссылок. Хорошей иллюстрацией этого служат разные версии продуктов 1С77-1С8х.

Что толку в новом языке, если он будет поддерживать подобные ограничения.

Хорошо, идем дальше. Вот язык D демонстрирует работу в консольных окнах. Замечательно! Но нам надо оконный интерфейс, запускаемый в консоли. При этом происходит мигание консольного окна перед созданием GUI. В С++ проблема решается разными точками входа. Вместо консольного main() используется графическая WinMain() и все хорошо, пока это возможно. Но возьмем, для примера, консольный опенсорный видеоплейер FFPlay.c. Замечательная программа, но использует окна из SDL фреймворка, а те просто не работают, по определению, с WinMain(), только с main(). Соответственно, с графическим окном видеоплейера болтается рядом консольное окно, которое нам, в принципе, не нужно. Да, его можно удалить с помощью вызова FreeConsole(), но мигание останется, что выглядит очень непрофессионально.

Те же эксперименты с видеоплейером FFPlay.c, в программе с графическим пользовательским интерфейсом, ненавязчиво подводят нас к GUI-шной мультипоточности. И опять, хороших примеров подобной связки в Интернете нет. А если использовать адаптированный код работы с потоками мастера Multi-SDI из WTL, то упираемся в ограничение данной модели мультипоточности, связанной с невозможностью реструктуризировать Си код в код С++ (проще говоря, переписать FFPlay.c в виде классов).

После долгой возни со всеми описанными проблемами их, в конечном счете, можно решить на приемлемом уровне. Но это все как бы достаточно стандартные вещи, а не какие-то там изобретения, но народ почему-то к интерфейсу пользователя относится по остаточному принципу. Есть, хорошо, нет – обойдемся. Но, то что простительно для концепции «1С» не слишком подходит к С++ или там другим новомодным языкам программирования.

И последний момент, которой не способствует особому интересу к «D», как к «C++ сделанному правильно». Это опенсорс. Когда будет приемлемый опенсорс на «D», тогда и посмотрим.
«Приемник», в смысле, принимает (воспринимает) отражение окружающей реальности В этом ключ – наличие внешней реальности. А алгоритмы, типа GPT-3, не работают с внешней реальностью, только с внутренней. Они, как бы, «вещь в себе», по Гегелю. Другими словами, пытаются из чужих мертвых отражений породить живую, неисчерпаемую действительность. Это трудно объяснить словами, но это философский тупик.

Те же философы для снятия некоторых логических ограничений предложили перейти от логики, как таковой, к дилогике, дуальной логике, логике диалога. Пример из политики, проблемы хорошо решаются в диалоге равных по силе и возможностям, за столом переговоров, и плохо решаются в одиночку, каким бы ты там «Царем Горы» ни был.

Также и здесь. Да, можно развивать искусственный интеллект в направлении переработки вторичного сырья (ранее полученного человеком, те же «полтора триллиона слов»), но это не перспективный вариант. А наш ведь Президент уже сказал, что: «Кто будет управлять искусственным интеллектом, тот будет управлять Миром!». А он знает, что говорит.

Поэтому, переходите к дуальности в алгоритмах искусственного интеллекта. Т.е., сначала создавайте модели окружающей реальности (простые, сложные, какие угодно, существуют уже игровые движки способные генерировать реалистические пейзажи, городские кварталы, людей с искусственными лицами и внешностью и много чего еще), а потом алгоритмы, сначала просто описывающие эти объекты и субъекты, а потом делающие некоторые логические умозаключения об отношениях между ними. Этот подход и проще и интересней, доступный даже индивидуальным программистам (если начинать с элементарных вещей).

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

По воробьям можно стрелять и из пушки, какой-то эффект обязательно будет. Но нужно ли? Тоже и с «большими данными», скажем, в распознавании текста. Не всегда в этом есть абсолютная необходимость, часто просто дань моде.
А может и не перейти. Я допускаю, что можно, путем титанических усилий, сгенерировать какого-нибудь электронного собеседника на уровне «Эллочки – Людоедки», для беседы с такими же «Митрофанушками». Даже более того, я встречал еще ДОСовские программы (студенческие поделки) которые имитировали виртуального персонажа, с которым можно было вести некий элементарный диалог. Для того времени было очень круто.

А мозг это, прежде всего, «приемник» и только потом «генератор». И накапливает он уже осмысленную информацию, а не вообще любую доступную. Поэтому и демонстрирует высокое качество при умеренных ресурсах.
Пожалуйста, работайте со словами, генерируйте спам, создавайте псевдо информацию. Где-то это даже может быть востребовано. Но не всем это интересно, тем более, что для генерации простого осмысленного текста (типа футбольного комментария для случайной игры) вполне достаточно усилий одного квалифицированного программиста, без использования всего лишь «полутора триллионов слов».
Т.е., GPT-3 не отражает реальность, она работает с уже отраженной реальностью, которая получена человеком. Другими словами, не создает нового смысла, только комбинирует чужой смысл, полученный другим интеллектом.

Кстати, смысл это есть часть реальности. В этом его объективная сущность. А субъективная – проекция этой части реальности, в т.ч., и в осмысленный текст.

Так что, не уверен, что «честно». Этот алгоритм пытается сгенерировать наиболее вероятный шаблон из известной ему информации. Примерно, как в шахматах, путем перебора огромного количества вариантов и выбора из них наиболее подходящего по формальному критерию. Это не интеллект, это простая выборка из больших данных.

Я ведь привел пример. Делаете: а) модель реальности с элементами непредсказуемости и случайности и б) строите систему, отражающую поведение этой модели в виде осмысленного текста (или речи). Причем о смысле можно особо не беспокоиться, поскольку этот текст будет отражать реально существующий прототип, а раз прототип работает, то тем самым способен порождать смысл. При этом самое интересное будет в индивидуальных фильтрах, когда алгоритм сможет общаться со своей копией, но другими настройками, обсуждая какую-нибудь общую для них реальность.
Она работает с вероятностью появления определенной последовательности слов.

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

Можно начать с простого. Допустим, генератора футбольного комментатора. Идет случайная игра, и электронный комментатор ее просто описывает, естественно, с искусственными восторгами («го-о-о-о-о-л!!!!!»). Т.е., это не вероятностная генерация слов, а отражение в текстовом (или даже голосовом виде) реального случайного процесса.

На Хабре много программистов, которым вполне по силам создать: а) простейшую случайную имитацию некоторой командной игры, типа футбола и б) дать ее отражение в тексте, а может быть даже в виде эмоционально окрашенной речи.

А дальше развивать подобную технологию в этом направлении.
Попасть на борт — это ещё не самая сложная задача. Самое сложное — это удержаться на борту данной компании.

Это как поступление на математику мехмата МГУ. Очень легко было поступить (абсолютно ничего сверх стандартной школьной программы), но очень трудно было удержаться. Излишне расслаблялись и вылетали за неуспеваемость даже призеры международной математической олимпиады. Но если ты позволяешь себе «отдохнуть» не более двух недель в семестр, а все остальное время пашешь, пашешь, пашешь, то можно удержаться в университете даже простому смертному, то бишь, не вундеркинду.
У меня есть два потока. Один это графический интерфейс (C++ / WTL) и второй опенсорсный консольный видеоплейер FFPlay.

Я открываю видео, получаю хэндл окна видеопроигрывателя из второго потока и подчиняю его клиентской области главного окна приложения.

Все замечательно, видео проигрывается, интерфейс главного окна работает независимо. Но если в главном окне добавить несколько видов и начать переключаться между ними, с помощью функции «::BringWindowToTop(m_hWndClient);», то пока поток один, все хорошо, а если присутствует окно видео из второго потока, то создается впечатление, что указанная функция работает только с окнами своего потока, тогда как другие функции, вроде SetParent() или ShowWindow() и подобные, могут иметь дело со всеми окнами из всех потоков.

Просмотрев много информации по потокам, я не нашел нигде работу с окнами из разных потоков. Второй и другие потоки это практически всегда, грубо говоря, консольные потоки. Поэтому меня интересует вопрос, как правильно организовать переключение между клиентскими окнами (в SDI приложении), в случае, если это окна из разных потоков? Должен ли я создавать видео окно в первом потоке и из второго потока только управлять его содержимым или существует другой, более простой, способ управления дочерними окнами (с одним единственным родителем) из разных потоков?

Спасибо!
Круто! Но пройдет много времени, пока люди оценят это и смогут широко использовать.

Но меня больше интересует математическая сторона предложенной теории.

Но как только мы смотрим на результаты многоитерационного рекурсивного применения этих правил, то становится ясно насколько элегантно они связаны с современной математикой.

Сюда отлично вписывается рекурсивный алгоритм построения простых чисел (решето Эратосфена). Простые правила (последовательное удаление оставшихся кратных натуральных чисел, начиная с двойки) порождают сложную структуру – простые числа.

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

Можно ли рассчитывать на получение нетривиальных свойств полученных сложных структур? И каким образом? Только ли путем экспериментальных вычислений? В математике всегда были интересны не только рекурсивные формулы, но и их явные эквиваленты.
Глупый спор получается, в смысле, «никакая работа не кажется безнадежной, если ее делать другому».

У нас вылетали с мехмата за неуспеваемость призеры международных математических олимпиад и выпускники физмат-школы при МГУ, не считая поехавших умом. Т.е., трудно было реально и прежде всего в первых четырех семестрах и именно по матану Камынина / Штерна. Другие препы были по сравнению с ними на порядок легче. Но были и те, кто всю учебу воспринимал играючи, вундеркинды они и в Африке вундеркинды.

Физкультура ещё была. Из-за физкультуры я тоже чуть не вылетел, дважды.

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

Хорошо было на старших курсах, первая пара – бассейн. Спускаешься с 24-го этажа жилого крыла Главного Здания и на лифте, на минус третий этаж. А там настоящий бассейн, поплавал, сходил в местную столовую, на минус первом этаже, выпил двойную порцию двойного кофе (запах молотой арабики был слышен на многих этажах выше), взбодрился слегонца, все, можно идти на следующую пару, с надеждой не заснуть (про студенческую ночную жизнь не буду здесь говорить).

Когда я несколько лет назад занимался машинным обучением, у меня не было проблем с тем, чтобы взять произвольную статью с arxiv и зашарить, что там происходит. Математика в машинном обучении на самом деле довольно простая.

Я вот делаю сейчас распознавание встроенных субтитров в обучающих видео, с целью их перевода, а заодно и адаптирую внешний консольный опенсорсный плейер FFplay.c в свой проект (для удобной интерактивной работы с видео). Да, можно использовать готовые алгоритмы, но они, как правило, не всегда дают тот эффект, который ожидаешь. Начал кодировать свои собственные идеи. Пока нравится больше. А некоторые алгоритмические моменты обсуждал на сайте математиков: dxdy.ru/topic142232.html.

Хотите запредельное — возьмите Жирара и почитайте восьмую главу и дальше.

Чем-то похоже на формализм теории доказательств из математической логики. В математике легко найти и позапредельнее, никто спорить не будет. Но я лучше дам вам школьную задачку, на квадратные уравнения (которые мы проходили в пятом классе). Нужно найти ошибку в рассуждениях. Правда, содержимое будет из квантовой механики, но это для маскировки :).

Общее уравнение Шредингера (УрШ) можно рассматривать как квадратное уравнение относительно постоянной Планка h. Решаем его, получаем формально два корня. Но постоянная Планка то одна, поэтому либо дискриминант квадратного уравнения равен нулю, либо у постоянной Планка есть второе фундаментальное значение. Оба случая интересны. В первом варианте получаем из одного уравнения два, что упрощает решение и анализ УрШа. А, во втором, делаем научное «открытие», постоянная Планка имеет два разных значения. Ура, товарищи! Куда обращаться за Нобелевской Премией? :)
Ничего запредельного там нет. За запредельное получают Филдса, а не зачёт по матану и линалу на младших курсах. Давайте всё же не девальвировать определения.

Что-то я смотрю в этом топике собралось много математиков :). Ладно, вы на мехмате МГУ учились? Сдавали матан по 4-х томному ротапринтерному изданию Л.И. Камынина (в Интернете нашел только первый типографский том, 430 стр., для первых двух семестров: fileskachat.com/getfile/27047_d05727eb8e4a7ae1f574f7fd501e2c21 ). Во втором типографском томе 620 страниц. Для многих вчерашних школьников это был «шок и трепет».

Замечу, что в ротапринтерном издании, по которому мы сдавали экзамены, текста практически не было, одни формулы. А конспектировать лектора Камынина было почти нереально. Он писал мелом на доске слишком быстро, понять ничего было невозможно. Иногда поворачивался к нам лицом и говорил: «Что? Не понимаете, что я пишу? Тогда переходите на факультет почвоведения!». Юморист!

А кроме него был еще семинарист А.И. Штерн. Сдать ему зачет с первой попытки было почти невозможно. Он начинал принимать зачеты за две недели до их официального начала и заканчивал через две недели после последнего экзамена, коих было по пять-шесть, по десять дней на каждый. Не получил зачет, не допускаешься к экзаменам. Экзамены переносятся на конец лета. Не успел пересдать до начала семестра, вылетаешь из универа. Сдать зачет формально было просто нельзя.

Начинал он с того, что каждому раздавал индивидуальные задачи. Решай их самостоятельно, дома, в общаге. Пользуйся, чем хочешь. Помощи от сокурсников можно было не ждать, ибо все были в похожем состоянии. Если решишь задачу за три дня, то ты почти гений. За неделю – хорошо. А некоторым и месяца не хватало.

Потом был очный зачет. С восьми утра до восьми вечера. Если уложишься, молодец! Тем, кто посещал все семинары и лекции (у нас было свободное посещение) и решал все домашние задачи, было значительно легче. А все задачи между семинарами решить было очень сложно. Не было тогда программ помощников, типа «Maple», да и компьютера были в зачаточном состоянии. Давал он всего лишь по 30 задач, среди которых встречались такие: lim((sin(tg(x)) – tg(sin(x)))/x^7), при x->0. Можно было, конечно, разделять задачи между одногруппниками, то технически это тоже было непросто.

При этом Штерн был очень дотошен в части доказательств. Доказывать ему надо было абсолютно безупречно. Его любимое хобби, искать ошибки в учебниках и монографиях. Скажем, в 22-м издании «Линейной алгебры» Куроша он нашел всего две (!) ошибки (не опечатки). Вот и попробуйте ему что-либо доказать «на пальцах». Некоторые ребята реально сходили с ума и их реально забирали в Кащенко.

Да были у нас уникумы, которые читали опусы Камынина, как художественную литературу. День-два почитали и как молодые горные козлики побежали к девочкам в гости или там играть в футбол. А ты, как дурак, сидишь над учебниками и конспектами десять дней подряд, по 12 часов, и усваиваешь только часть материала. А там, как повезет, счастливый билет или не очень. А нужно было еще не просто сдать экзамены, а сдать на стипендию.

Хорошо, вернемся к OpenCV. Вы там со всеми алгоритмами на «ты»? Библиотека огромная, реализованных алгоритмов – невероятное количество. Вот так просто берем и лихо их применяем? Я пробовал адаптировать готовые примеры для своих целей. Получалось плохо, пока не начал вникать в алгоритмы и не писать, для лучшего их освоения, собственные аналоги. Стало и проще и эффективнее.
Спасибо. Талант не талант, но все свои наработки всегда документирую. Как для других, так и для себя.

Я книгу по программированию написать не думали? Я бы хотел наваять что-нибудь на тему интерфейса пользователя и модульности в C++ / WTL (не дожидаясь стандарта С++20). Но пока опыта маловато, я ведь не профессиональный программист, просто любитель.

Однако мне нравится роль «свободного художника», никому ничего не обязан, делаешь, что хочешь. У вас ведь в корпорации очень круто, но программист должен быть интегрирован в систему, ее культуру и т.п. Для молодых мозгов это может быть интересно, но я уже как бы вышел из этого возраста. Запад мне резко перестал быть интересен, с какого-то времени. Многие мои однокурсники по мехмату МГУ, в смутные времена, уехали в Штаты и Западную Европу. Сейчас практически все вернулись. По этому поводу я всегда вспоминаю предсказание одного старца: «Возвращайтесь в Россию! Скоро туда будут ехать на подножках товарных вагонов.».

Сам я живу в непризнанной республике ЛНР. Здесь можно достаточно быстро и без проблем получить российское гражданство и выехать в Россию учиться или работать. Хотя есть много оснований для сценария типа «Крым-2», но для Донбасса. Тем более что Донбасс в царские времена был исконно российской территорией (пока его дедушка Ленин не подарил хохлам). Даже сроки называются, до 2024 года (симсоны так вообще называют конкретную дату – сентябрь 2024 года).

Россия мне очень интересна. В свое время я работал в Белгороде, в НИИ, мог даже получить квартиру там, но предпочел уехать в Москву, на учебу, а потом вернулся домой, в Луганскую, тогда, область.

Сейчас, конкретно, пишу программу по распознаванию встроенных субтитров в обучающих видео, вроде «Easy French» на Ютубе. Цель, заменить английский перевод, русским. Во французский язык я влюбился благодаря певице ZAZ (для примера, www.youtube.com/watch?v=MOk5yYLAQvU ). Там будет встроенный видеопроигрыватель, адаптированный для целей обучения. В общем, проект для меня интересный, хотя к Франции я относительно равнодушен, но может быть кто-то из моих предков, царских времен, хоть и жил в России, но разговаривал на французском…
Благодарю за развернутый ответ!

Вы хорошо объясняете, может быть, у вас талант технического писателя? Однако для меня это все темный лес. Тем более что IBM это корпорация как «государство в государстве». Какой смысл вникать в ее закрытые системы, если нет ни желания, ни возможности там работать?

Однако открытые стандарты IBM могут быть интересны. Как, скажем, Intel открыла доступ к своему корпоративному продукту OpenCV (который разрабатывала, в том числе, команда Вадима Писаревского из России).
Ваша система вызывает страх и ужас. Своей изощренностью, закрытостью и уникальностью. Это действительно другой мир, который принять могут «не только лишь все». Хотя, наверное, иметь представление о ней надо, это расширит кругозор и опыт восприятия реальности.

Думаю, что сразу можно предположить, что в системах подобного типа нет вирусов. Это так? А как насчет интерфейсов программ? Насколько удобно иметь с ними дело? И почему указатели 16-ти байтные при терабайтах памяти?

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

Я уже писал об этом где-то выше (мера рациональных чисел на любом отрезке равна нулю).

Только вот эта функция не имеет никакого отношения к x^x. И поэтому обсуждать, чему равен интеграл от функции дирихле я не стану.

А зачем об этом вообще сообщать? Мы и так знаем, что интеграл Римана для функции Дирихле не существует, а интеграл Лебега, на любом конечном промежутке равен нулю.
Спасибо! Но чужая платформа – потемки! Как-то все сложновато для человека, привыкшего к Windows и C++ / WTL. Хотя, идея минимальной зависимости модулей достаточно естественна, вопрос только, насколько реализуема при использовании чужих фреймворков.
Увы, реализация нужного алгоритма очень глубоко интегрирована в фреймворк — просто так его не «выкусить» отдельно.
Что тут можно сделать? Портировать весь фреймворк на нашу платформу. Возможно.

Достаточно интересная проблема. Я ее называю проблемой модульного программирования. Ладно там в языках свервысокого уровня, типа 1С, когда просто сама платформа ограничивает вас в ваших хотелках. Но ведь даже в С++ писать на уровне слабосвязанных модулей, так чтобы можно было их легко менять «как перчатки» очень тяжело.

Интересовался этой темой в Интернете. Как всегда, ничего путного нет. Хотя на абстрактном уровне вроде все понятно. Программные модули в С++ можно структурировать на уровне:

– Каталогов / файлов;
– Классов / структур;
– Процедур / функций, в т.ч., inline functions.

Однако проблемы здесь связаны с иерархическими зависимостями и распределенным использованием. Как с этим бороться? Непонятно!

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

Но даже для собственных модулей встают вопросы. Где описывать хидер файлы общего назначения? Только в общем файле StdAfx.h или как-то раздельно для каждого включаемого пакета? Как отслеживать точки входа и выхода для используемых классов? А ведь могут быть еще и другие точки управления. Может быть, это все описывать в каком-либо внешнем скрипте, по которому некий мастер будет генерировать конечный код проекта? И т.д. и т.п., вопросов много, а ответы приходится искать методом «научного втыка» :).

А как вы решаете проблемы модульности собственного кода?
Попросите свой вольфрам построить функцию Дирихле (принимающую единицу на рациональных числах, и нуль – на иррациональных). Боюсь, что он вам выдаст функцию y = 1 или y = 0.

Однако то, что предел слева существует и равен единице, я уже согласился в посте выше.
То, что предел слева тоже равен единице, я могу согласиться (тем не менее, 0^0 – неопределенная величина). Однако согласитесь, что справа мы имеем однозначную вещественную функцию, а слева – многозначную комплексную (вообще говоря). При этом возникают тонкости в понятиях неопределенность и многозначность для отрицательных иррациональных чисел (разные подпоследовательности могут давать разные пределы). Все это и вызвало наш спор, который по сути сводиться к терминологическим разногласиям (как и большинство всех споров).
Ну, на счет различия понятий «неопределенна» и «многозначна» могу согласиться. Как я понимаю, «неопределенна» это определенность с точностью до подпоследовательности, сходящейся к аргументу, когда разные подпоследовательности могут давать разные значения. В этом смысле неопределенными являются функции sin(1/x) в нуле и функция x^x в точке x = –pi. Во втором случае, как я писал выше, можно взять две подпоследовательности рациональных чисел, сходящихся к –pi, в первой из которых все числители четные, а во второй – нечетные. Знаменатель во втором случае нечетный. Тогда пределом функции будет, в первом случае, положительное число, а, во втором, отрицательное, не равное нулю. Также можно подобрать последовательность, сходящуюся к комплексному числу.

Многозначность, как я понимаю, это значение корня функции, дающее одно и то же значение, не чувствительное от некоторой константы или ее кратной величины. Пример, x = arcsin(y). Если y0 – корень, то и y0 + 2pi*n – тоже корень. В этом смысле также многозначна функция Ln(z) в комплексной плоскости (и в отрицательной вещественной полуплоскости), с точностью до 2pi*i.

Однако функция у = x^x, при x = 0 – неопределенна, хотя имеет там предел по непрерывности, равный 1.

Наш спор, по-видимому, заключается в нюансах понятий «неопределенна» и «многозначна». Т.е., разные подпоследовательности могут давать разные значения, которые можно списать на многозначность. Именно в этом смысле я отождествлял эти понятия. Хотя, допускаю, более тонкий анализ может внести некоторые коррективы в наши рассуждения, если определиться с терминологией.

Information

Rating
2,396-th
Registered
Activity