• Как я отлавливал стили :before для фокус-элемента
    +2
    Возможно я что-то не так понял, но ведь чтобы отлавливать состояние, достаточно выбрать его в инспекторе:
    Пример
    image

  • Как я отлавливал стили :before для фокус-элемента
    +4
    Вот ещё древний лайфхак, когда ещё не было бейкпоинтов на дом-е:
    setTimeout(function(){
      debugger;
    }, 4000);
    

    У вас будет 4 сек, чтобы сделать ховер/фокус на нужном элементе, а потом запустится отладка..)
  • N+7 полезных книг
    +2
    Запомнилась история о бостонском брокере: раз в неделю вы получаете точный прогноз об изменении цены акций компании А, после десяти недель правильных прогнозов от этого брокера вам приходит письмо, в котором этот брокер просит «символическую» сумму в обмен на дальнейшие прогнозы. У тут вы, вдруг, начинаете доверять его прогнозам, потому что ну не может же человек без специальных знаний делать настолько точные прогнозы и перечисляете ему эту сумму. Больше вы о нем ничего не услышите — он уже начал тратить ваши деньги.
    На самом деле этот «брокер» сначала отослал 10240 писем разным людям, в половине которых был прогноз на повышение цены акций, а в другой половине — на снижение. На следующей недели он отправлял точно такой же прогноз людям, у которых его прогноз с предыдущей недели оправдался и так далее, пока не осталось около 10 человек, у которых были абсолютно правильные прогнозы. Этим людям он и отправил письмо с просьбой перевести «символическую» сумму.
    Это далеко не всё) Я сам только начал её читать, рекомендую
  • Руководство по ML.NET — первое приложение за 10 минут
    0
    Сразу глобальный вопрос. Хочу прокинуть GPU в гостевую машину.

    Windows 10 Hyper-V -> Ubuntu 18.04.1 LTS

    Что делать? Очень не хочется ставить esxi
  • Распознавание образов в эйдетическом искусственном интеллекте
    0
    Согласен. Гипноз — зыбкая почва для доказательств и исследований.
    Если Вам интересно: в какой объём вы бы оценили собственную память?
    Начать подсчёт можно прямо со словарного запаса (50-200 тысяч слов взависимости от глубины зания языка) + ностранный язык.
    Научные знания: формулы, теоремы, научная картина мира.
    Школьные знания: география, русский язык… Правила…
    Профессиональные знания: тут Вам видней.
    Бытовые знания: как одеться, как покупать билет в метро, как вызвать такси, как делать покупрки в магазинах и т.п.
    Знания «в теле» — как ходить, бегать, прыгать. Как правильно заниматься фитнесом.
    Личные знания: воспоминания детсва (которые хорошо помните и можно проверить — спросить у родственников, как было дело).
    Прикладные знания: правила дорожного движения, этикет, правила поведения в обществе.
    Культурные знания: нотная грамотность, сюжеты книг и художественных фильмов. Стихи, которые помните наизусть.
    Хобби, увлечения…
    И т.д. и т.п.
    Кстати, чтобы по вашему меткому выражению «мозгу вводить сознание в заблуждение» — тоже ведь для рендеринга база знаний нужна. Картинки, схемы, фоны, текстры… Фантазии ведь можно нарисовать. Мы их видим. База изображений стало быть наличествует. Какие-никакие а базовые изображения или хотя бы их схемы должны храниться в памяти. Например — кошка — это лапы, хвост, пушистое домашнее животное. Значит мы должны хранить в памяти понятия «пушистости», «дом», «животное» и т.д. чтобы из них собрать какой-никакой скелет. В моём понимании на каждое из слов в словаре должна быть иллюстрация, схема. Ну хорошо, пусть не на все, а на базовые понятия, пусть 10% языка. Тоже если интересно — можно попробовать оценить объём.
  • Открытый курс «Deep Learning на пальцах»
    +1
    Мат. анализ:
    Для практической работы и общего понимания курса нужны будут только его некоторые небольшие части, касающиеся вычисления производных в одномерном и многомерном случае. Поскольку на них построен весь DL, нужно эту тему хорошенько освежить в памяти.
    Если кто знает/найдёт хорошие видео- или текстовые лекции с объяснением производных одной переменной и частных производных, пожалуйста, шлите ссылки в ответ на этот комментарий.

    Для работы со звуком будет упоминаться преобразование Фурье.

    Высшая алгебра:
    Нужно умение складывать, умножать и транспонировать матрицы. Умножать матрицу на константу. Знать про некоммутативность умножения матриц. Операции над векторами как аффинные преобразования (матриц). Скалярное произведение векторов.
    Будет упомянуто сингулярное разложение матриц (может даже дважды).

    Мат. статистика:
    Базовое понятие среднего и дисперсии, базовое понимание распределения случайной величины, что такое нормальное распределение. Формула полной вероятности (что сумма вероятностей равна 1). Желательно вспомнить теорему байеса и решить пару задач на вероятность.
    Например, такую задачу.
    Ночью таксист совершил наезд и скрылся с места происшествия. В городе работают две компании такси, «Зеленая» и «Синяя». Вам представили такие данные:
    85% городских такси — из «Зеленой» компании, а 15% — из «Синей».
    Свидетель опознал такси как «Синее». Судебная экспертиза проверила надежность свидетеля в ночных условиях и заключила, что свидетель правильно опознает каждый из двух цветов в 80% случаев и неправильно — в 20% случаев.
    Какова вероятность того, что такси, совершившее наезд, было «Синим», а не «Зеленым»?

    Из дискретной математики:
    Помнить идею, что при выборке из N предметов без повторений число сочетаний — очень быстро растёт при увеличении N.

    Базовые знания математики:
    Знание графиков логарифма и экспоненты, косинуса и тангенса, умение упрощать и преобразовывать формулы, уметь вычислять значение функции в точке, знать геометрический смысл производной. Арифметическое и геометрическое среднее двух чисел.

    Вычислительная математика и программирование на Python:
    Умение запрограммировать математическую функцию на Python и проверить её работоспособность. Базовые навыки программирования на Python: циклы, условные операторы, функции, классы. Работа со встроенными типами: строками, массивами, словарями. Типы данных: bool, int, float32. Работа с библиотеками: базовые навыки поиска документации, работы с новыми библиотеками, вызов методов, понятие модуля в питоне.
    Передача функции в качестве аргумента. Навыки тестирования и отладки кода.
    Области существования переменных (scopes), идея сборки мусора.
    Знание основ теории сложности программ — это которая про O(N).
  • Распознавание образов в эйдетическом искусственном интеллекте
    0
    Глаз — одновременно и камера и нейронная сеть. Через глазной нерв в мозг проходит порядка 1 мбит информации в секунду, обратно в глаз приходит некоторое количество информации для настройки зрения и по другому каналу приходит информация для мышц.
    «Софт сложнее»: это безусловно так, у мозга порядка 400 частей, каждая из которых берёт на себя какую-то работу. Можно считать, что 400 разных нейросетей. Параметры обучения и связи некоторых из них весьма жестко заданы (примерно половина всех генов человека, т.е. 10к-12к генов, кодирует устройство мозга!). Часть из них называются зонами коры и имеют примерно одинаковую внутреннюю структуру и структуру связей, другие части выполняют специальные функции.
    Эта большая сложность не мешает человеку успешно обучаться задаче на примерах, в этом плане тот комментатор прав, и я по-прежнему не понимаю, почему вы его одёргиваете абстрактными словами без конкретики. Активация первых зон визуальной коры человека V1, V2, V4 похожа на наблюдаемую в первых слоях нейросети. А вот далее идут два пути: V4t и MT, одна зона больше интересуется самим объектом, второе — его параметрами движения.
    А вот бездумно применять аналогии и заявлять, что любая коннекционистская структура похожа на другую похожую — чрезвычайно наивно и не вписывается в современный научный подход, это уже какое-то верование, или даже мифология.
    Смысла интернета в целом нет, так же, как нет его у человека, находящегося в вегетативном состоянии.
  • Распознавание образов в эйдетическом искусственном интеллекте
    +1
    На философский вопрос
    что было раньше, курица или яйцо?
    дадим ответ науки — бульон, первичный) В этом ключе ответ на вопрос отличия обучения человека от обучении искусственной нейросети состоит в следующем:

    1. Мозг человека результат миллиардолетней истории, в результате кот. эволюция методом проб и ошибок исследовала окружающий мир, и зашила его основные свойства, имеющие отношение к выживанию видов, в структуру мозга. Мозг состоит из различных отделов, с различной структурой сетей, свойствами нейронов, и все это базируется на более древних системах управления, внутриклеточной, гуморальной, эпигенетической настройки, и наконец, самой генетической программе. Мозг ребенка исходно настроен на то что окружающий мир состоит из объектов разных типов и форм, что они определенным образом связаны, распределены в пространстве и связаны во времени, и тд. Необходимо лишь наполнить эту структуру конкретными объектами и их отношениями, актуальными на период появления и жизни индивида, путем обучения и самоубучения. И здесь переход к п.2
    2. Человек существо социальное, его обучение происходит в большой степени не самостоятельно (результат самостоятельного обучения мы представляем по одичавшим детям), а в текущем культурном контексте, который дополнительно настраивает, и уточняет связи в мозге. В этом состоит эффективность быстрого обучения человека.
    3. ИНСы исходно не специализированы на обучение определенной информации. Это компенсируется большими объемами обучающих выборок. В последнее время появляются специализированные сети, оптимизированные под решение определенных классов задач, но остается не решенным вопрос об объединении таких разнородных сетей в единую систему, по аналогии с объединением и согласованной работы различных отделов мозга у человека.
    4. В практическом плане нет никакого смысла повторять достижения естественной (п.1) и культурной (п.2) эволюции и воспроизводить их в ИНСах. Это пройденные этапы, ИНСы просто очередная надстройка в этой эволюционной череде. Их нужно воспринимать как расширение возможностей естественного интеллекта человека. Моделирование в ИНСах пред. этапов интересно только в исследовательских целях, в основном, для решения биомедицинских задач.
    5. Так же, как социальная эволюция человека решила (в основном) задачу защиты самого человека от произвола собственного интеллекта, путем внедрения морально-этических норм на уровне структур мозга, необходимо зашить ограничения такого же порядка в возможный будущий автономный ИИ, как защиту от его произвола по отношению, как к человеку, так и самому носителю ИИ. Так же как с человеком на этом пути возможны отдельные непредвиденные эксцессы, но в целом это посильная задача.
  • .Net Бинарная сериализация без ссылки на сборку с исходным типом или как договориться с BinaryFormatter
    +1
    А у нас была задача заставить авро сериализатор работать с динамическими типами. Проще всего было генерить тип на лету.
            public static Type CreateType(this IDictionary<string, PropertySchema> properties, string typeName)
            {
                var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName(Guid.NewGuid().ToString()), AssemblyBuilderAccess.Run);
                ModuleBuilder module = assemblyBuilder.DefineDynamicModule("tmp");
                
                TypeBuilder typeBuilder = module.DefineType(typeName, TypeAttributes.Public | TypeAttributes.Class);
    
                AddAttribute<DataContractAttribute>(typeBuilder);
                // Loop over the attributes that will be used as the properties names in out new type
                foreach (var prop in properties)
                {
                    string propertyName = prop.Key;
    
                    var propType = prop.Value.Type;
    
                    if (propType == typeof(TimeSpan)) propType = typeof(DateTime);//timespan is not supported by avro core lib
    
                    // Generate a private field
                    FieldBuilder field = typeBuilder.DefineField("_" + propertyName, propType, FieldAttributes.Private);
                    // Generate a public property
                    PropertyBuilder property =
                        typeBuilder.DefineProperty(propertyName,
                                         PropertyAttributes.None,
                                         propType,
                                         new Type[] { propType });
    
    
                    if (prop.Value.IsNullable) {
                        AddAttribute<NullableSchemaAttribute>(property);
                    }
                    AddAttribute<DataMemberAttribute>(property);
    
                    MethodAttributes GetSetAttr =
                        MethodAttributes.Public |
                        MethodAttributes.HideBySig;
    
                    MethodBuilder currGetPropMthdBldr =
                        typeBuilder.DefineMethod("get_value",
                                                   GetSetAttr,
                                                   propType,
                                                   Type.EmptyTypes);
    
                    ILGenerator currGetIL = currGetPropMthdBldr.GetILGenerator();
                    currGetIL.Emit(OpCodes.Ldarg_0);
                    currGetIL.Emit(OpCodes.Ldfld, field);
                    currGetIL.Emit(OpCodes.Ret);
    
                    MethodBuilder currSetPropMthdBldr =
                        typeBuilder.DefineMethod("set_value",
                                                   GetSetAttr,
                                                   null,
                                                   new Type[] { propType });
    
                    ILGenerator currSetIL = currSetPropMthdBldr.GetILGenerator();
                    currSetIL.Emit(OpCodes.Ldarg_0);
                    currSetIL.Emit(OpCodes.Ldarg_1);
                    currSetIL.Emit(OpCodes.Stfld, field);
                    currSetIL.Emit(OpCodes.Ret);
    
                    property.SetGetMethod(currGetPropMthdBldr);
                    property.SetSetMethod(currSetPropMthdBldr);
                }
    
                return typeBuilder.CreateType();
            }
  • Архитектура карьерного роста
    +18
    Получилось длинновато, но колоритно. Хоть в отдельную статью выноси:

    Вася и Петя растут

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

    Вася любил думать только над теми задачами, которые сулили ему что-то заманчивое и интригующее. Он мог быстро переключаться с одной проблемы на другую, как будто браузил интернет, читая только заголовки и предложения со ссылками, кликая только на интересующие его ссылки. Книги он читать не любил, и жадно почитывал статьи на хабре и не только. Именно он придумал сделать сайт ShaaS (Shpora-as-a-Service) и тут же потерял интерес к его реализации.

    Петя любил доводить дело до конца. Если он брался за задачу, то доводил ее до блеска. Причем настолько обстоятельно, что по ходу обнаруживал много интересных закономерностей, так что задачи того же класса решал значительно быстрее и качественнее. Именно Петя реализовал ShaaS, как фронт-энд, так и бэк-энд. Еще и использовал штук 10 GoF паттернов на Go – и все по делу!

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

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

    Вася решил выяснить, откуда вообще берутся баги. Он пригласил самую симпатичную из тестерш на чай и в разговоре выяснил у нее детали процесса заведения багов. Сходил пару раз с ней на перерыв и через пару дней втесался в доверие во вражеский клан тестировщиков. Разузнав, по какому принципу они гоняют тестовые сценарии, он понял, что основной причиной появления бага является невозможность разработчика узнать, ломает ли его изменение тестовые сценарии или нет. Пораскинув мозгами он придумал механизм прогона девелоперских бинарей в sandbox-е и пошел с этим предложением к своему тимлиду. Тимлид был не в духе из-за проколотого колеса и объяснил Васе, что не его джуниорское дело думать о высших материях. Вася не смутился, и замутил свою идею с новыми друзьями из команды автоматического тестирования. Когда они научились подменять нужные бинари в виртуалке, к их проекту подключились энтузиасты из билд-инженеров, научившиеся выкладывать их системе измененный модуль при циклическом билде вместе с мылом автора коммита. В результате их усилий профи, пишущие свои хитроумные баги, начали получать письма еще до того, как коммит мерджился в основной бранч. Когда профи пришли первые письма с уведомлением, что они написали баг, они сначала рассердились, но потом привыкли и попросили включить в письма дифф изменения, вызвавшего разлом. Внедрять запрошенный функционал назначили Васю. Вася больше ни фиксил баги, Вася писал фичу. А еще его приглашали на дни рождения в отделе тестирования.

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

    На аттестации обоим подняли зарплату. Васе почему-то больше. А еще перевели в новооткрытый отдел внутренних процессов менеджером проектов.
  • Учим английский: фильмы, книги, словари
    +1
    Письменный и разговорный английский — это две большие разницы, два разных царства, и учить их тоже нужно по-разному. Чтобы научиться говорить — нужно развить «английские мышцы языка», для этого нужно тренироваться в произношении любимых слов и выражений. Повторять их много-много раз, как можно громче, отчётливей, быстрей. И всё это для того, чтобы в обыденной обстановке эта фраза с ваших уст слетала как родная. А громкость нужна для того, чтобы за несколько часов тренировки нагнать несколько лет практики коренных англичан.

    Именно этот секрет изучения разговорного языка помог мне наконец-таки заговорить.
  • Именованные события: программируем GUI
    +2
    Вы описали патерн «шина событий», известный давно, и имеющий ряд недостатков:
    1. связанность. Да-да, именно она. Для того, чтобы слушать событие, мне нужно знать его имя, как следствие слушатель уже что-то знает об отправителе.
    2. отсутствие контроля. Без дополнительных абстракций вещать может кто угодно и что угодно. Если модуль А и модуль Б назовут свои события одинаково, будет конфликт.
    3. хаос потока исполнения. В идеальном мире модули общаются только через шину событий. Неоднократно в проектах реализующих данный патерн натыкался на ситуации, когда одно событие порождает множество других. Это очень сложно отлаживать, особенно если некое событие отправляется из нескольких мест.

    Поставленную задачу низкой связанности гораздо лучше решает связка патернов «машина состояний» (redux) и «наблюдатель» (rx.js)
  • Плюсы и минусы ведения бизнеса в США: наблюдения после года развития своей компании
    0
    Но, если владелец завода содержит 10 000 рабочих, рабочим платит 1000, а себе чистыми берет 1 000 000 то

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

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

    А с какого момента социальной напряженности нет? Что-то сильно изменится с этой точки зрения при налоге в 50% или даже 75%?

    Это уменьшает как платежеспособный спрос населения так и емкость рынка

    Где-то рядом регулярно выдвигаемые в тредах о БД утверждения, что БД выгоден богатым производителям, потому что на разданные им деньги придут и купят его товары. Это очевидный бред по ряду причин.

    а чо это я буду государству что то отдавать, я лучше новые станки куплю, некоторых рабочих на курсы отправлю, столовую открою, нужны исследования по материалам — дам денег в НИИ, может что откроют

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

    То есть прогрессивный налог способствует оборотам денег в экономике.

    Его отсутствие тоже не мешает, если у вас экономика инфляционная, а не дефляционная. Собственно, инфляция — это уже налог на деньги в известном смысле.
  • Долой таблички! Как выучить английские времена
    +3
    Вот что вчера по поводу Present Continuous в будущем написал наш методист:
    А с Present Continuous все довольно просто. Особенно если знаешь разницу между plans и arrangements. То есть plans — это то, что ты строишь у себя в голове и можешь поменять в любой момент, если вдруг что. А arrangements — это то, что уже отчасти подготовлено, к чему привлечены другие люди/службы, и отменить это так запросто не выйдет. Для последнего и используется Present Continuous. I'm flying to Moscow — значит, билеты куплены, в график внесено. I am meeting my boss tomorrow — значит мой босс тоже в курсе, что мы встречаемся, мы с ним договаривались, у нас назначена встреча. I will meet my boss — я думаю, что я его встречу, возможно, он придет в офис, и я смогу его увидеть (но если Я не приду, он возможно и не узнает, что я должен был там быть). I'm going to meet my boss — что-то среднее: у меня-то это в планах есть, но начальник еще не в курсе, и встречусь ли я с ним еще не факт!
  • Ответ Л.П. Плеханова на замечания по книге «Основы самосинхронных электронных схем»
    0
    Мне тут ответы подошли от разных сотрудников отдела, на все комменты по этой статье:
    1.
    > Вот, в частности, упомянута реализация FMA (Fused Multiply Add, я так понимаю?) для Комдива.
    > Получилось ли в итоге компактнее или быстрее или эффективнее по мощности, чем стандартные
    > 3-5 стадий пайплайна? А насколько?

    ОТВЕТ:
    CC схемы изначально характеризуются избыточными аппаратурными затратами, необходимыми для реализации индицируемости элементов схемы, обеспечивающей контроль за окончанием переключения каждого фрагмента СС схемы в очередную фазу работы. Поэтому они никогда не смогут быть «компактнее» своих синхронных аналогов, если речь не идет о реализации отказоустойчивых цифровых устройств.
    Вопрос о быстродействии и энергопотреблении пока остается открытым, т.к. спроектированный СС блок Fused Multiply Add еще находится в стадии изготовления. Тестирование более простого устройства — четырехразрядного Микроядра, аналога цифрового ядра микроконтроллера PIC фирмы Microchip, содержащего регистровую память, умножитель, сдвигатель и отказоустойчивый последовательно-параллельный 8-разрядный порт — изготовленного по КМОП технологии с 1.5-мкм проектными нормами на основе базового матричного кристалла 5503БЦ7У (МИЭТ, Москва), в сравнении с синхронным аналогом показало, что быстродействие СС варианта Микроядра в зоне работоспособности синхронного аналога, гарантированной изготовителем БМК, в среднем почти в 2 раза выше быстродействия синхронного аналога на статистически средней последовательности операций. Во всем диапазоне подтвержденной работоспособности протестированных кристаллов энергетическая эффективность (отношение производительности к мощности потребления) СС Микроядра по сравнению с синхронным аналогом была также в 2 раза выше.

    2.
    > Самый интересный вопрос: как оценивается работоспособноть схемы после производства?
    > В обычной методологии есть дорогой, но понятный Design For Test со всеми регистрами
    > в скан-чейне, пачкой тестовых векторов и ожидаемыми результатами комбинационной логики.
    > А здесь? Скорость работы такого юнита, как я понимаю, будет варьироваться от чипа к чипу.

    ОТВЕТ:
    СС схемы не имеют дерева синхронизации, и проверять их работоспособность традиционным синхронным методом напрямую нельзя, т.к. время выполнения операции цифровой СС схемой зависит от содержимого операндов. Однако достаточно внести в схему проверки запрос-ответный механизм и можно применять те же самые «Design For Test со всеми регистрами в скан-чейне, пачкой тестовых векторов и ожидаемыми результатами комбинационной логики». Вся разница будет только в том, что в синхронной схеме тестовые вектора подаются на тестируемую схему строго периодически, а в СС схеме смена одно тестового вектора другим будет происходить при наличии сигнала готовности результата, выдаваемого СС схемой. Кстати сказать, и в синхронных схемах изготовленные кристаллы с целью повышения выхода годных разбраковываются на разных частотах. Возьмите, к примеру, линейку процессоров фирмы Intel: один и тот же, с точки зрения начинки, процессор продается по разной цене в зависимости от пиковой устойчивой производительности, продемонстрированной им при тестировании.

    > Как это вписывается в фиксированный процессорный конвейер?

    ОТВЕТ:
    Вписаться в процессорный конвейер с фиксированной частотой, действительно, непросто. Но, во-первых, есть и асинхронные конвейеры (и даже целые асинхронные процессоры, например, семейство Amulet), и во-вторых, существует целый ряд приложений, в которых отдельные функциональные блоки, например, делитель, используются эпизодически и могут быть встроены в общий синхронный конвейер с помощью дополнительных блоков входного и выходного FIFO. Конечно, это задача более сложная, нежели построение традиционного синхронного конвейера, но ведь и «бонус» в виде устойчивой работы в широком диапазоне условий эксплуатации и обретения свойства обнаружения константной неисправности («залипания» выхода или входа элемента в статическом состоянии) тоже чего-то ст'оит?

    4.
    > Можно ли выразить эту методологию своими словами, без ссылок на литератуту и
    > (особенно) википедию, для тех, кто знаком со стандартным подходом?

    ОТВЕТ:
    В «двух словах».
    Общая методология разработки СС схемы заключается в последовательном выполнении ряда этапов.
    Разработка комбинационных СС схем включает в себя следующие этапы (для «внутренних» функциональных СС схем, не требующих согласования интерфейса с синхронным окружением):
    1) разработка синхронного функционального аналога в базисе логических функций и/или простейших логических ячеек;
    2) выбор типа спейсера входных и выходных парафазных сигналов;
    3) разработка блока преобразования бифазного кода в парафазный, если источником входных сигналов является триггерное устройство, например, регистр;
    4) преобразование синхронного аналога функциональной «начинки» схемы в СС схему с помощью парафазного и/или бифазного кодирования входных, выходных и промежуточных сигналов;
    4.1) «дуализация» системы логических функций синхронного аналога — дополнение каждой логической функции ее инверсией;
    4.2) замена инверсных значений переменных парафазными сигналами;
    5) разработка индикаторной подсхемы.

    Разработка триггерных (последовательностных) СС схем включает в себя следующие этапы:
    1) разработка синхронного функционального аналога;
    2) преобразование синхронного аналога в СС вариант и согласование типа спейсера входных сигналов;
    2.1) «дуализация» системы логических функций синхронного аналога — дополнение каждой логической функции ее инверсией;
    2.2) замена инверсных значений переменных парафазными сигналами;
    3) выбор способа и типа начальной предустановки;
    4) разработка индикаторной подсхемы.

    Результатом такой разработки является функциональное HDL-описание СС схемы на (Verilog, VHDL), которое затем может быть покрыто элементами используемой библиотеки стандартных элементов программными средствами (логическим синтезатором, например, Design Compiler, Genus) или вручную ;).
    В настоящее время, к сожалению, нет готового САПР СС схем (точнее, есть для подкласса СС схем «NULL Convention Logic», имеющих самую большую избыточность среди вариантов реализации СС схем, — система BALSA), но работа в этом направлении ведется.

    В конце хотелось бы еще раз напомнить о потенциальных преимуществах СС схем (ради чего всё затевалось):
    а) отсутствие накладных аппаратных и энергетических расходов, связанных с реализацией «тактового дерева»;
    б) быстродействие, максимально возможное в текущих условиях эксплуатации;
    в) естественная устойчивость к параметрическим отказам, вызываемым изменением параметров ячеек из-за процессов старения и неблагоприятных воздействий окружающей среды;
    г) максимально возможная область эксплуатации (диапазон работоспособности), определяемая только физическим сохранением переключательных свойств активных ячеек базиса реализации, и, как следствие, возможность работать на пониженном питающем напряжении;
    д) естественная самопроверяемость и самодиагностируемость по отношению к множественным константным неисправностям;
    е) безопасность функционирования на основе бестестовой локализации неисправностей, т.е. прекращение работы в момент отказа ячейки, исключающее выдачу недостоверной информации, с одновременной локализацией места сбоя;
    ж) увеличение числа годных чипов за счет нечувствительности схемы к разбросу параметров;
    и) упрощенное тестирование: функциональные тесты одновременно являются и проверочными на неисправности;
    к) увеличенный срок службы за счёт нечувствительности к старению;
    л) простота стыковки СС схем между собой из-за отсутствия принудительной синхронизации, отсутствие аномального арбитража;
    м) высокая эффективность создания надёжных изделий;
    н) простота контроля и резервирования;
    о) отсутствие проблемы контроля схем контроля;
    п) существенно меньший объем аппаратных затрат (не менее, чем в 1,5 раза) при одном и том же коэффициенте покрытия неисправностей при реализации отказоустойчивого устройства.

    С наилучшими пожеланиями,
    Ю.Дьяченко
  • Ответ Л.П. Плеханова на замечания по книге «Основы самосинхронных электронных схем»
    0
    Комментарий Л.П.Плеханова

    1. Меня удивляют манеры на этом форуме: безапелляционность суждений при
    отсутствии/ограниченности знаний и понимания предмета.
    Споры приобретают характер перепирательств.
    Так в научных кругах не принято.
    Такие дискуссии вводят в заблуждение аудиторию, которая не очень в курсе, но
    интересуется.
    Если хотите обсуждать книгу, потрудитесь понять хотя бы идею.

    2. Одному из комментаторов понадобилось больше теории.
    Но, как сказано Оккамом, не придумывайте лишних сущностей, читайте
    теории Маллера и Варшавского, их достаточно для создания самосинхронных (СС)
    схем. Также читайте упомянутую комментатором превосходную книгу:
    Мараховский В. Б., Розенблюм Л. Я., Яковлев А. В.
    «Моделирование параллельных процессов. Сети Петри», СПб, 2014.
    Там и про самосинхронные схемы (именно этот термин) и про роль В.И.Варшавского.
    Это все событийный подход.

    3. У меня — другой подход, инженерный.
    Хотя все написано в книге, повторю еще раз кратко для заинтересованной
    аудитории.
    Упомянутые ранее свойства СС-схем:
    1) отсутсвие гонок,
    2) отказобезопасность
    есть следствие полумодулярности. Это не ново, об этом писал еще В.И.Варшавский.

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

    Таким образом, обеспечив полумодулярность, обеспечим эти два свойства схем.
    Именно эти свойства хотят получить пользователи от СС-схем, в этом уникальность
    таких схем.

    Теперь перевернем задачу. Если неким образом сразу обеспечить эти свойства, без
    событийности, то не надо майнить полумодулярность, не нужны ДП, ДИ, STG и Петри
    (при всем к ним уважении).
    Этот некий способ есть функциональных подход.
    Делаем иерархически, на каждом уровне собираем фрагмент и проверяем полученное.
    1) Собираем по В.И.Варшавскому: двухфазная работа, парафазное представление,
    индикация. Здесь настолько все отработано, что придумать нечего.
    2) А проверяем каждое из двух свойств по отдельности.
    Отсутсвие гонок — по межсоединениям элементов, т.е. по структуре. В подходе
    сформулированы для этого правила соединений. А инициаторы и континуаторы — это
    не сигналы. Это провода, соединения.
    Отказобезопасность:
    а) на самом нижнем уровне — прямой метод: делается один расчет функций
    без отказов, затем имитируется отказ каждого элемента и сравниваются резултаты
    с первым расчетом. Делается вывод о том, остановится ли схема при каждом
    отдельном отказе.
    б) на всех остальных более верхних уровнях — также межсоединения уже фрагментов
    и трансляция списков индикации внутренних переменных на выходы верхнего
    фрагмента. Это еще проще, чем на самом нижнем уровне.

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

    4. Теперь об элементах и библиотеках.
    Вот примеры элементов из промышленной библиотеки СС-элементов 65нм
    в Зеленограде:
    A2O211AI с функцией Y = ^((A0*A1+B)*C0*C1),
    O22A2O2I с функцией Y = ^((A0+A1)*(B0+B1)+C).

    5. Если Рецензент желает создать 4-разрядное АЛУ (полумодулярное/SI/
    самосинхронное), флаг ему в руки.
    Условия таковы:
    Минимальная конфигурация всех АЛУ:
    а) 2 операнда (здесь по 4 бита),
    б) операции:
    — сложеиние/вычитание,
    — сдвиги туда-сюда,
    — побитовые И, ИЛИ, НЕ.
    Для гарантии полумодулярности надо учесть все рабочие состояния и переходы
    (например от одной команды к другой) для всех сочетаний значений операндов,
    коих ровно 256.

    Л.П.Плеханов
  • Опять про пустые перечисления в C#
    0

    Да, вот мой вариант для того чтобы избегать двойного перечисления:


        class Buffer<T> : IDisposable, IEnumerable<T>
        {
            private readonly List<T> buf = new List<T>();
            private readonly IEnumerator<T> enumerator;
            private readonly IReadOnlyCollection<T> collection;
    
            public Buffer(IEnumerable<T> enumerable)
            {
                this.collection = enumerable as IReadOnlyCollection<T>;
                if (collection == null)
                {
                    this.enumerator = enumerable.GetEnumerator();
                }
            }
    
            public void Dispose() => enumerator?.Dispose();
    
            public IEnumerator<T> GetEnumerator() => collection == null
                ? new Enumerator(buf, enumerator)
                : collection.GetEnumerator();
    
            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    
            class Enumerator : IEnumerator<T>
            {
                private readonly List<T> buf;
                private readonly IEnumerator<T> enumerator;
                private int i = 0;
    
                public Enumerator(List<T> buf, IEnumerator<T> enumerator)
                {
                    this.buf = buf;
                    this.enumerator = enumerator;
                }
    
                public T Current => buf[i];
                object IEnumerator.Current => Current;
    
                public void Dispose() { }
    
                public bool MoveNext()
                {
                    if (++i < buf.Count) return true;
                    if (!enumerator.MoveNext()) return false;
    
                    buf.Add(enumerator.Current);
                    return true;
                }
    
                public void Reset()
                {
                    i = 0;
                }
            }
        }

    Это будет работать в любом случае, не только для пары Any() и Sum()


    Да, это тоже промежуточный буфер — но обычно он все-таки нужен...

  • [DotNetBook] Стек потока. Его редактирование и клонирование потока
    0
    На какую «эту» тему?
    Есть хороший сборник литературы по шарпу вот тут — ru.stackoverflow.com/a/416585/196257
  • Взаимодействие C# и C++ кроссплатформенно
    0
    Чтобы такого не происходило, нужно увеличить время жизни делегата, либо сохранив его как поле в объекте, либо каким-то иным образом, в зависимости от обстоятельств.

    Мне попадалась информация, что сохранение как поле в объекте не гарантирует что он(делегат) не будет перемещен в памяти.
    Я делал так:
    private GCHandle gch_ppp_output;
    
    internal void SetupCallbacksPPP(ppp_output_d ppp_output)
    {
        CleanUpPPP();
        gch_ppp_output = GCHandle.Alloc(ppp_output);
        var p_ppp_output = Marshal.GetFunctionPointerForDelegate(ppp_output);
        //здесь можно передать нативной функции значение p_ppp_output для callback
    }
    
    //не забываем освободить 
    internal void CleanUpPPP()
    {
        if (gch_ppp_output != null && gch_ppp_output.IsAllocated)
            gch_ppp_output.Free();
    }
    
  • Не путайте разработку ПО и программирование
    +11

    Да, термины меняются со временем.


    Меня учили, что программирование состоит из следующих этапов:


    1. Анализ предметной области.
    2. Построение модели предметной области.
    3. Уточнение задач, которые необходимо решить в рамкмх предметной области (постановкой исходных задач явно или неявно занимается пользоаатель).
    4. Построение алгоритма решения задач, включая алгоритм взаимодейсьвия пользователя с программой или программным компоексом.
    5. Разработка архитектуры программы или программного комплекса, реализующего алгоритм.
    6. Реализация алгоритма в соответствии с выбоанной архитектурой в виде кода на языке программирования.
    7. Исправление ошибок, допущенных на всех этапах.
    8. Сборка программы или программного комплекса.

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


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