Вы мне предлагаете поспорить о вкусах. Я знаком с проблемами и сложностями проектирования GUI, не интересно.
Ну, на нет и суда нет. Верю, что вам не интересно, плохо не это, плохо то, что это никому не интересно. Книги на эту тему всего лишь пережевывание MSDN. Однако мне интересно, поэтому, хотя бы одна книга, написанная на данную тему, увлеченным автором должна быть. Поэтому, как накоплю достаточно практического опыта, так и опубликую свой опус. А потом посмотрим, заинтересуется ею хоть кто-нибудь.
Не знаю будет ли это хорошим примером, но интересна ли вам проблема числа 10958?
Не интересна! Когда я был маленьким, море подобных задач публиковалось в журнале «Наука и Жизнь». Тогда это было хоть немного интересно. А сейчас…
Вот смотрите, я придумал новый алгоритм внешней сортировки «естественным слиянием» ( emery-emerald.narod.ru/Cpp/2E1562.html ), который использует частичный порядок даже в произвольных последовательностях. Самое интересное, что случайная последовательность обладает частичным порядком больше минимального, который теоретически равен 2! А именно, после обсуждения на форуме математиков dxdy.ru, удалось доказать, что средняя длина упорядоченной подпоследовательности L для равномерно распределенной случайной последовательности данных равна: L = 2e – 3 = 2.436563656918.
Поэтому, если хотите решить задачу числа 10958, обратитесь на этот форум, очень вероятно, что вам помогут. Недавно я там обсуждал тему, связанную с распознаванием встроенных субтитров обучающих видео: «Как группировать бинарные матрицы по степени их похожести?» ( dxdy.ru/topic142232.html ). В результате нашел подходящий алгоритм решения, не связанный с OpenCV.
Или доказательства/опровержения существования и единственности решения системы уравнений Навье-Стокса?
Это вы собираетесь доказать экспериментально, с помощью компьютерного моделирования?
Вы сами только что ответили «Я не хочу Си, я хочу С++.». Все дальнейшие разговоры непродуктивны, как и непродуктивны выши комментарии к данному посту.
Претензия ко всем туториалам, для начинающих, это увлечение консольными приложениями в ущерб оконным. Зачем ломиться в открытую дверь? С консольным программированием нет проблем, когда примеров учебного кода порядка 99%. Если бы ваш любимый «D» дал бы примеры нетривиального подхода к программированию пользовательского интерфейса, то это было бы интересно всем, кому уже надоела консоль.
Я лишь прокомментирую «Зачем мне «умножать сущности без необходимости»?». Это надо делать, чтобы быть профессионалом. Недостаточно знать один язык, надо знать около 5 языков.
А кто вас сказал, что я не знаю «5 языков»? Пожалуйста, Ассемблер (MASM-32) (можете посмотреть мои статьи на erfaren.narod.ru ), Object Professional (Pascal), Adobe Action Script (AS3) ( scholium.webservis.ru ), Visual FoxPro 9 и C++ (с фреймворками), наконец. Кстати, кормит меня 1С и VFP-9.
А С++ это язык для удовольствия.
У D есть много интересных решений, которые сделают вас лучшим специалистом, особенно, если вы пишете код на С++.
Интересного есть много где. Мои задачи мне поможет решить С++ / WTL, а не «D». А курс «Программирование пользовательского интерфейса на С++ / WTL / ATL» в университете, не исключено я буду вести лично, благо образование позволяет.
У D действительно не так много библиотек как у C/C++. Но любые С либы можно использовать в D т.к. этот язык ABI совместим с С
А зачем? Я не хочу Си, я хочу С++. Для меня это идеальный язык программирования. Зачем мне «умножать сущности без необходимости»?
Что касается опенсорсных библиотек, веб фреймворк vibe.d и mir-algorithm приходят на ум. У D около 1.8к пользовательских библиотек, не говоря об очень большой стандартной библиотеке.
Вы меня сможете заинтересовать, если покажите пример опесорса, типа «2С» (достаточно одного только интерфейса, без содержательной части), но сделанного красиво и удобно. Главные требования: MDI, закладки (табы) окон, грид (форма списка), поддерживающий группы элементов, как в 1С77 и согласованный с деревом (TreeView), удобные настраиваемые панели инструментов, а также полноценные локальные меню в дочерних окнах, поддержка ГУИ-шной мультипоточности и т.п.
Это на ваш взгляд, а для меня нет хуже задачи, чем GUI. Занимался им на Qt и на Flash. Я верю, что вам и многим другим нравится, но на нём свет клином не сошёлся.
Вполне верю, но у вас просто не было амбициозной задачи, требующей хорошего интерфейса. Вот, я только что написал в соседней реплике: «Для примера, сделайте аналог интерфейса пользователя (но более современно выглядящий) для учетной платформы 1С77. Не надо движков баз данных, макетирования отчетов, запросов и т.п. Сложно это или просто? С учетом любых доступных систем программирования и опенсорса. Можно посмотреть в сторону опенсорса «2С», но там ужасная реализация GUI на MFC. Если сделаете, цены вам не будет. А все остальное мы уже «припердолим» сами :) .»
Про опенсорс согласен, хотелось бы больше. Не хватает какой-то библиотеки, которая подняла бы D своей популярностью. Я надеялся, что vibe.d станет ею, но разочаровался — удобно, но не быстро, не хватает какой-то изюминки.
Как по мне, то С++ с существующими фреймворками вполне хорош! Поэтому лично у меня нет потребности в другом языке программирования. Я много чего перепробовал, но остановился на С++ / WTL ( возможно еще ATL). Все остальное – опенсорс, которого более, чем достаточно, успевай только осваивать. Super!
А какое отношение этот опус имеет к университетскому программированию?
А что университетское программирование это типа учебного, т.е., ненастоящего программирования? Чтобы, придя на предприятие, сказали: «Забудьте все то, чему вас учили!»?
А так, мое мнение, программистам надо давать отдельный курс, вроде: «Программирование пользовательского интерфейса на С++ / WTL / ATL», вплоть до программирования собственных контролов, типа форм списков. Вообще, почти все стандартные контролы Windows требует «напильника», чтобы довести их до ума. Те же закладки для MDI-окон, вроде не сложно, но хороших примеров нет, а то, что есть, имеет явно избыточный вес.
Впрочем из GUI на D лично я собирал еще в 2014г демки с разными библиотеками — DWT, GtkD, DFL. Недавно — с DlangUI
Это все опенсорс, включая компилятор и стандартную библиотеку.
Не интересно GUI вообще, интересно иметь легкий рабочий вариант. Для примера, сделайте аналог интерфейса пользователя (но более современно выглядящий) для учетной платформы 1С77. Не надо движков баз данных, макетирования отчетов, запросов и т.п. Сложно это или просто? С учетом любых доступных систем программирования и опенсорса. Можно посмотреть в сторону опенсорса «2С», но там ужасная реализация GUI на MFC. Если сделаете, цены вам не будет. А все остальное мы уже «припердолим» сами :).
Самое интересное в программировании, на мой взгляд, это кодирование пользовательского интерфейса. Для С++ используются такие фреймворки, как 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-ти байтные при терабайтах памяти?
И, интересно, а дома вы какую операционку используете?
Ну, на нет и суда нет. Верю, что вам не интересно, плохо не это, плохо то, что это никому не интересно. Книги на эту тему всего лишь пережевывание MSDN. Однако мне интересно, поэтому, хотя бы одна книга, написанная на данную тему, увлеченным автором должна быть. Поэтому, как накоплю достаточно практического опыта, так и опубликую свой опус. А потом посмотрим, заинтересуется ею хоть кто-нибудь.
Не интересна! Когда я был маленьким, море подобных задач публиковалось в журнале «Наука и Жизнь». Тогда это было хоть немного интересно. А сейчас…
Вот смотрите, я придумал новый алгоритм внешней сортировки «естественным слиянием» ( emery-emerald.narod.ru/Cpp/2E1562.html ), который использует частичный порядок даже в произвольных последовательностях. Самое интересное, что случайная последовательность обладает частичным порядком больше минимального, который теоретически равен 2! А именно, после обсуждения на форуме математиков dxdy.ru, удалось доказать, что средняя длина упорядоченной подпоследовательности L для равномерно распределенной случайной последовательности данных равна: L = 2e – 3 = 2.436563656918.
Поэтому, если хотите решить задачу числа 10958, обратитесь на этот форум, очень вероятно, что вам помогут. Недавно я там обсуждал тему, связанную с распознаванием встроенных субтитров обучающих видео: «Как группировать бинарные матрицы по степени их похожести?» ( dxdy.ru/topic142232.html ). В результате нашел подходящий алгоритм решения, не связанный с OpenCV.
Это вы собираетесь доказать экспериментально, с помощью компьютерного моделирования?
Да нет, не шучу! Но я вполне понимаю вашу неприязнь к GUI, а вы мою любовь к пользовательскому интерфейсу оценить не в состоянии :).
Претензия ко всем туториалам, для начинающих, это увлечение консольными приложениями в ущерб оконным. Зачем ломиться в открытую дверь? С консольным программированием нет проблем, когда примеров учебного кода порядка 99%. Если бы ваш любимый «D» дал бы примеры нетривиального подхода к программированию пользовательского интерфейса, то это было бы интересно всем, кому уже надоела консоль.
А кто вас сказал, что я не знаю «5 языков»? Пожалуйста, Ассемблер (MASM-32) (можете посмотреть мои статьи на erfaren.narod.ru ), Object Professional (Pascal), Adobe Action Script (AS3) ( scholium.webservis.ru ), Visual FoxPro 9 и C++ (с фреймворками), наконец. Кстати, кормит меня 1С и VFP-9.
А С++ это язык для удовольствия.
Интересного есть много где. Мои задачи мне поможет решить С++ / WTL, а не «D». А курс «Программирование пользовательского интерфейса на С++ / WTL / ATL» в университете, не исключено я буду вести лично, благо образование позволяет.
А зачем? Я не хочу Си, я хочу С++. Для меня это идеальный язык программирования. Зачем мне «умножать сущности без необходимости»?
Вы меня сможете заинтересовать, если покажите пример опесорса, типа «2С» (достаточно одного только интерфейса, без содержательной части), но сделанного красиво и удобно. Главные требования: MDI, закладки (табы) окон, грид (форма списка), поддерживающий группы элементов, как в 1С77 и согласованный с деревом (TreeView), удобные настраиваемые панели инструментов, а также полноценные локальные меню в дочерних окнах, поддержка ГУИ-шной мультипоточности и т.п.
Вполне верю, но у вас просто не было амбициозной задачи, требующей хорошего интерфейса. Вот, я только что написал в соседней реплике: «Для примера, сделайте аналог интерфейса пользователя (но более современно выглядящий) для учетной платформы 1С77. Не надо движков баз данных, макетирования отчетов, запросов и т.п. Сложно это или просто? С учетом любых доступных систем программирования и опенсорса. Можно посмотреть в сторону опенсорса «2С», но там ужасная реализация GUI на MFC. Если сделаете, цены вам не будет. А все остальное мы уже «припердолим» сами :) .»
Как по мне, то С++ с существующими фреймворками вполне хорош! Поэтому лично у меня нет потребности в другом языке программирования. Я много чего перепробовал, но остановился на С++ / WTL ( возможно еще ATL). Все остальное – опенсорс, которого более, чем достаточно, успевай только осваивать. Super!
А что университетское программирование это типа учебного, т.е., ненастоящего программирования? Чтобы, придя на предприятие, сказали: «Забудьте все то, чему вас учили!»?
А так, мое мнение, программистам надо давать отдельный курс, вроде: «Программирование пользовательского интерфейса на С++ / WTL / ATL», вплоть до программирования собственных контролов, типа форм списков. Вообще, почти все стандартные контролы Windows требует «напильника», чтобы довести их до ума. Те же закладки для MDI-окон, вроде не сложно, но хороших примеров нет, а то, что есть, имеет явно избыточный вес.
Не интересно GUI вообще, интересно иметь легкий рабочий вариант. Для примера, сделайте аналог интерфейса пользователя (но более современно выглядящий) для учетной платформы 1С77. Не надо движков баз данных, макетирования отчетов, запросов и т.п. Сложно это или просто? С учетом любых доступных систем программирования и опенсорса. Можно посмотреть в сторону опенсорса «2С», но там ужасная реализация GUI на MFC. Если сделаете, цены вам не будет. А все остальное мы уже «припердолим» сами :).
Программированию интерфейсу, как таковому, уделяется слишком мало внимания. Соответственно, как только сталкиваешься с реальной задачей, так сразу возникает куча проблем на ровном месте. Как сделать то, это и другое. Общий подход, что позволяет делать официальный фреймворк, то и делай, все остальное от лукавого. Подход, почти как в «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», тогда и посмотрим.
Те же философы для снятия некоторых логических ограничений предложили перейти от логики, как таковой, к дилогике, дуальной логике, логике диалога. Пример из политики, проблемы хорошо решаются в диалоге равных по силе и возможностям, за столом переговоров, и плохо решаются в одиночку, каким бы ты там «Царем Горы» ни был.
Также и здесь. Да, можно развивать искусственный интеллект в направлении переработки вторичного сырья (ранее полученного человеком, те же «полтора триллиона слов»), но это не перспективный вариант. А наш ведь Президент уже сказал, что: «Кто будет управлять искусственным интеллектом, тот будет управлять Миром!». А он знает, что говорит.
Поэтому, переходите к дуальности в алгоритмах искусственного интеллекта. Т.е., сначала создавайте модели окружающей реальности (простые, сложные, какие угодно, существуют уже игровые движки способные генерировать реалистические пейзажи, городские кварталы, людей с искусственными лицами и внешностью и много чего еще), а потом алгоритмы, сначала просто описывающие эти объекты и субъекты, а потом делающие некоторые логические умозаключения об отношениях между ними. Этот подход и проще и интересней, доступный даже индивидуальным программистам (если начинать с элементарных вещей).
По воробьям можно стрелять и из пушки, какой-то эффект обязательно будет. Но нужно ли? Тоже и с «большими данными», скажем, в распознавании текста. Не всегда в этом есть абсолютная необходимость, часто просто дань моде.
А мозг это, прежде всего, «приемник» и только потом «генератор». И накапливает он уже осмысленную информацию, а не вообще любую доступную. Поэтому и демонстрирует высокое качество при умеренных ресурсах.
Кстати, смысл это есть часть реальности. В этом его объективная сущность. А субъективная – проекция этой части реальности, в т.ч., и в осмысленный текст.
Так что, не уверен, что «честно». Этот алгоритм пытается сгенерировать наиболее вероятный шаблон из известной ему информации. Примерно, как в шахматах, путем перебора огромного количества вариантов и выбора из них наиболее подходящего по формальному критерию. Это не интеллект, это простая выборка из больших данных.
Я ведь привел пример. Делаете: а) модель реальности с элементами непредсказуемости и случайности и б) строите систему, отражающую поведение этой модели в виде осмысленного текста (или речи). Причем о смысле можно особо не беспокоиться, поскольку этот текст будет отражать реально существующий прототип, а раз прототип работает, то тем самым способен порождать смысл. При этом самое интересное будет в индивидуальных фильтрах, когда алгоритм сможет общаться со своей копией, но другими настройками, обсуждая какую-нибудь общую для них реальность.
Это неправильный подход. Текст это отражение действительности, как, скажем, фото и видео. Но пропущенное через индивидуальный фильтр. Чтобы машина могла создавать осмысленный текст она должна уметь работать с моделями реальности, в том числе и с искусственными или виртуальными.
Можно начать с простого. Допустим, генератора футбольного комментатора. Идет случайная игра, и электронный комментатор ее просто описывает, естественно, с искусственными восторгами («го-о-о-о-о-л!!!!!»). Т.е., это не вероятностная генерация слов, а отражение в текстовом (или даже голосовом виде) реального случайного процесса.
На Хабре много программистов, которым вполне по силам создать: а) простейшую случайную имитацию некоторой командной игры, типа футбола и б) дать ее отражение в тексте, а может быть даже в виде эмоционально окрашенной речи.
А дальше развивать подобную технологию в этом направлении.
Это как поступление на математику мехмата МГУ. Очень легко было поступить (абсолютно ничего сверх стандартной школьной программы), но очень трудно было удержаться. Излишне расслаблялись и вылетали за неуспеваемость даже призеры международной математической олимпиады. Но если ты позволяешь себе «отдохнуть» не более двух недель в семестр, а все остальное время пашешь, пашешь, пашешь, то можно удержаться в университете даже простому смертному, то бишь, не вундеркинду.
Я открываю видео, получаю хэндл окна видеопроигрывателя из второго потока и подчиняю его клиентской области главного окна приложения.
Все замечательно, видео проигрывается, интерфейс главного окна работает независимо. Но если в главном окне добавить несколько видов и начать переключаться между ними, с помощью функции «::BringWindowToTop(m_hWndClient);», то пока поток один, все хорошо, а если присутствует окно видео из второго потока, то создается впечатление, что указанная функция работает только с окнами своего потока, тогда как другие функции, вроде SetParent() или ShowWindow() и подобные, могут иметь дело со всеми окнами из всех потоков.
Просмотрев много информации по потокам, я не нашел нигде работу с окнами из разных потоков. Второй и другие потоки это практически всегда, грубо говоря, консольные потоки. Поэтому меня интересует вопрос, как правильно организовать переключение между клиентскими окнами (в SDI приложении), в случае, если это окна из разных потоков? Должен ли я создавать видео окно в первом потоке и из второго потока только управлять его содержимым или существует другой, более простой, способ управления дочерними окнами (с одним единственным родителем) из разных потоков?
Спасибо!
Но меня больше интересует математическая сторона предложенной теории.
Сюда отлично вписывается рекурсивный алгоритм построения простых чисел (решето Эратосфена). Простые правила (последовательное удаление оставшихся кратных натуральных чисел, начиная с двойки) порождают сложную структуру – простые числа.
Но ведь, согласитесь, мало построить сложную итерационную структуру из простых правил, нужно еще объяснить или выявить свойства этой структуры. По простым числам много чего известно, но далеко не все.
Можно ли рассчитывать на получение нетривиальных свойств полученных сложных структур? И каким образом? Только ли путем экспериментальных вычислений? В математике всегда были интересны не только рекурсивные формулы, но и их явные эквиваленты.
У нас вылетали с мехмата за неуспеваемость призеры международных математических олимпиад и выпускники физмат-школы при МГУ, не считая поехавших умом. Т.е., трудно было реально и прежде всего в первых четырех семестрах и именно по матану Камынина / Штерна. Другие препы были по сравнению с ними на порядок легче. Но были и те, кто всю учебу воспринимал играючи, вундеркинды они и в Африке вундеркинды.
Нас тоже серьезно гоняли, кстати, именно в университете я впервые встал на коньки и поехал, причем даже ни разу не упал.
Хорошо было на старших курсах, первая пара – бассейн. Спускаешься с 24-го этажа жилого крыла Главного Здания и на лифте, на минус третий этаж. А там настоящий бассейн, поплавал, сходил в местную столовую, на минус первом этаже, выпил двойную порцию двойного кофе (запах молотой арабики был слышен на многих этажах выше), взбодрился слегонца, все, можно идти на следующую пару, с надеждой не заснуть (про студенческую ночную жизнь не буду здесь говорить).
Я вот делаю сейчас распознавание встроенных субтитров в обучающих видео, с целью их перевода, а заодно и адаптирую внешний консольный опенсорсный плейер 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-ти байтные при терабайтах памяти?
И, интересно, а дома вы какую операционку используете?