• В чем минусы событийно ориентированного подхода?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Не претендую на правду. Просто несколько мыслей.

    В чем минусы событийно ориентированного подхода?
    Насколько я понимаю, Алан Кей (тот кто придумал термин Объекто-ориентированный) старался придерживаться именно этого подхода. т.е. кто-то отправляет сообщение, а объекты в системе на него реагируют, каждый по-своему.
    По сути у нас есть message bus, в который добавляется сообщение, а объекты системы слушают этот самый message bus.

    Мысль первая. Наследие.

    Когда мы говорим о наследии Алана Кея - надо просто глянуть что он создал практически.
    А создал он язык Smalltalk. Поэтому логично изучать минусы событийного подхода на
    примере софта который написан с использованием Smalltalk. Кто из коллег в топике
    знает примеры такого софта? Я - к сожалению не знаю.

    По ссылкам википедии https://en.wikipedia.org/wiki/Smalltalk можно видеть в категории
    influenced мы просто видим что Smalltalk
    влиял на Java, Go, Swift. Но я здесь не согласен потому что мы не можем измерить глубину
    этого влияния. Это все равно что сказать что Сталин влиял на Черчилля. Как влиял? На 10%?
    Или более чем половину? Сложно. Насчет Java я тут сказал-бы что сомнительно. ООП? Может быть.
    Акторы? Нет. В Java изначально нет акторов. Они существуют позже в виде фреймворков но
    языком не поддерживаются.

    По поводу MessageBus. Если брать технологию акторов которая используется в Erlang.
    то там скорее не message bus а очереди сообщений между потоками-акторами.
    Если про Smalltalk сказать нечего то про Erlang я могу сказать что на нем написаны
    две единицы софта такие как RabbitMq (очень надежная и неубиваемая система MQ).
    Может не супер-производительная. И CouchDb которая выделяется своей
    устойчивостью ко всяким сетевым сбоям. Реклама говорит что Кауч работает
    практически при мигающей сети, при обрывах и т.п. лучше чем аналогичый TCP-IP совт.

    Мысль вторая. Что Кей говорил про ООП.

    У меня есть цитатник. Я туда собираю некоторые слова на лытни. И иногда слова Кнута, Дейкстры
    и прочих it-академиков. Вот из цитатника Кея:

    I made up the term "object-oriented," and I can tell you
    I did not have C++ in mind.

    Что в этой прямой речи можно понять. Что господин Кей открещивается от современного ООП.
    А фактически все современное ООП зеркалит то что есть в С++. Здесь вы можете со мной спорить
    о первенстве (я не буду спорить я не знаю). Но абсолютно очевиден факт что мир пошел по пути
    жесткой синхронщины в 80х. И пока все еще идет. Будут ли примитивные типы int/double обьектами
    не суть важно. Тут важно что Кей постулирует среду в которой двигаются сообщения. Как сеть в миниатюре.
    А классическое ООП С++ - лишает нас этой среды и заменяет ее вызовом метода. Никакого сообщения
    в С++ нет и быть не может потому что сообщение НЕ существует в отрыве от основного потока который
    инициировал вычисления. Умрет поток - развалится весь стек и параметры и все. В противоположность
    в языке Erlang поток (процесс) приёмник может дохнуть много раз но стек сохраняет свою живучесть
    просто повторяя вычисления заново. И здесь мне кажется и идет развилка путей.

    И здесь как-раз мы может говорить о недостатках. Очевидно что у нас появляется лаг приемки-передачи
    сообщения. У нас появляются мягкие гарантии времени обработки. И многое другое.

    Интересно почему в 80х Алан Кей проигрывал. Я думаю что победил прагматизм. В те далекие 80-е
    комьютеры были еще слабыми. Частота мерялась сотнями килогерц и мегагерцами. И в расчетах
    каждый такт был важен. И красивые и академические языки такие как Lisp, Prolog, Smalltalk
    просто проигрывали языку С в силу оверинжинеринга. А поскольку С++ был вначале действительно
    ООП-надстройкой над С - то он предлагал и ООП-подход и скорость портабельного ассемблера.
    И хотя я лично не люблю С++ (я считаю его перегруженным техническими долгами прошлого)
    я признаю что бизнес выбирая С++ выбирал просто скорость вычислений. Академизм и красивые
    доказательства правоты программ были тогда не нужны. Нужно чтоб банковское приложение
    быстро считало кредиты и выдавало зарплаты и пенсии.

    Сегодня, когда мы нежемся в сладкой неге мощных процессоров и даже (!) облаков - мы можем
    себе позволить любого уровня парадигмы и абстракции. Цена 1 абстракции стала настолько дешево
    стоить что нам дешевле в банках запускать Java/Net приложения и на ходу фиксить ошибки
    чем долго разрабатывать на С++ и иметь неопредленнное поведение и тяжелый анализ
    в случае падения. Даже такой уродец как Python взлетел как язык интеграции а не разработки.

    Мысль третья. Нестандартные и асинхронные архитектуры реализованные в железе.

    Недавно смотрел анонс нового процессора от Чака Мура (это тот самый Мур который создал закон имени себя).
    Мне кажется это пример той самой асинхронной клетки о которой мечтал Алан Кей.

    Мысль четвертая. На кого похож Алан Кей?

    Не знаю как вам. :) А мне он уж очень напоминает Боливара Траска из Люди Икс Дни Минувшего будущего.

    Мысль 5. Что делает Алан Кей на фото?

    Бренчит на музыкальных инструментах. Наверное блюз. Блюз потерянных архитектур :)
    Ответ написан
    Комментировать
  • Почему метод дженерик типа в го существенно медленнее нативного?

    hugga
    @hugga Автор вопроса
    Из обсуждения https://github.com/golang/go/issues/50182 видно что проблема с производительностью generics не новая.
    При запуске бенчмарков с флагами получается ожидаемое мной ± равное время выполнения ф-ций:
    go test -bench=. -count=2 -gcflags=all=-d=unified

    BenchmarkNativeFunc-4            2029149               600.5 ns/op
    BenchmarkNativeFunc-4            2018277               591.7 ns/op
    BenchmarkNativeMethod-4          1962086               592.0 ns/op
    BenchmarkNativeMethod-4          2024234               603.9 ns/op
    BenchmarkGenericFunc-4           1985313               573.4 ns/op
    BenchmarkGenericFunc-4           2053454               585.1 ns/op
    BenchmarkGenericMethod-4         2067790               591.3 ns/op
    BenchmarkGenericMethod-4         2054346               612.2 ns/op

    что форсирует применение при компиляции stenciling (трафарет по отдельным типам) вместо словарного подхода реализации дженериков (текущая реализация).
    Остаётся ждать оптимизаций в обновлениях языка
    Ответ написан
    Комментировать
  • Как оптимизировать запрос при конвертации dav в mp4?

    nidalee
    @nidalee
    ffmpeg -y -i input-file.dav -codec copy output-file.mp4
    Ответ написан
    Комментировать
  • Мой exe файл некорректно передаётся, что делать?

    Vindicar
    @Vindicar
    RTFM!
    что значит "текстовый файл передаётся нормально"? Ты первые 2048 байт при приёме выбрасываешь же.
    Ответ написан
    2 комментария
  • Как правильно откоментировать этот код?

    # import xml.etree.ElementTree as XmlElementTree
    # import httplib2
    # import uuid
    # # импорт нативных библиотек 
    # from config import ** *
    # # импорт конфига
    # 
    # ** *_HOST = '***'
    # ** *_PATH = '/***_xml'
    # CHUNK_SIZE = 1024 ** 2
    # 
    # 
    # # ?
    # 
    # def speech_to_text(filename=None, bytes=None, request_id=uuid.uuid4().hex, topic='notes', lang='ru-RU',
    #                    key=** * _API_KEY):
    #     if filename:
    #         with open(filename, 'br') as file:
    #             bytes = file.read()
    #     if not bytes:
    #         raise Exception('Neither file name nor bytes provided.')
    # 
    #     bytes = convert_to_pcm16b16000r(in_bytes=bytes)
    # 
    #     url = ** *_PATH + '?uuid=%s&key=%s&topic=%s&lang=%s' % (
    #         request_id,
    #         key,
    #         topic,
    #         lang
    #     )
    #     # метод обработки файла
    # 
    #     chunks = read_chunks(CHUNK_SIZE, bytes)
    # 
    #     connection = httplib2.HTTPConnectionWithTimeout(***_HOST)
    #     # подключение к страницы для передачи заголовка
    #     connection.connect()
    #     connection.putrequest('POST', url)
    #     connection.putheader('Transfer-Encoding', 'chunked')
    #     connection.putheader('Content-Type', 'audio/x-pcm;bit=16;rate=16000')
    #     connection.endheaders()
    # 
    #     for chunk in chunks:
    #         connection.send(('%s\r\n' % hex(len(chunk))[2:]).encode())
    #         connection.send(chunk)
    #         connection.send('\r\n'.encode())
    # 
    #     connection.send('0\r\n\r\n'.encode())
    #     response = connection.getresponse()
    #     # отправка и получение ответа
    # 
    #     if response.code == 200:
    #         response_text = response.read()
    #         xml = XmlElementTree.fromstring(response_text)
    #         # ?
    #         if int(xml.attrib['success']) == 1:
    #             max_confidence = - float("inf")
    #             text = ''
    # 
    #             for child in xml:
    #                 if float(child.attrib['confidence']) > max_confidence:
    #                     text = child.text
    #                     max_confidence = float(child.attrib['confidence'])
    # 
    #             if max_confidence != - float("inf"):
    #                 return text
    #             else:
    # 
    #                 raise SpeechException('No text found.\n\nResponse:\n%s' % (response_text))
    #         else:
    #             raise SpeechException('No text found.\n\nResponse:\n%s' % (response_text))
    #     else:
    #         raise SpeechException('Unknown error.\nCode: %s\n\n%s' % (response.code, response.read()))
    # 
    # 
    # сlass
    # SpeechException(Exception):
    #     pass
    Ответ написан
    1 комментарий
  • Поччему в JSON ответе API Django отдаются строки, а не float?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    В DRF по умолчанию тип Decimal сериализуется в строку. Отключить можно настройкой COERCE_DECIMAL_TO_STRING.
    Ответ написан
    2 комментария
  • На ваш взгляд, есть ли смысл программисту делать интернет магазин самому?

    DevMan
    @DevMan
    самому имеет смысл только в целях обучения/прокачивания скилов.

    крупные магазины - самописы, которые постоянно пилит группа людей.
    Ответ написан
    2 комментария
  • На ваш взгляд, есть ли смысл программисту делать интернет магазин самому?

    Adamos
    @Adamos
    Программист, никогда не собиравший магазинов на CMS, не способен написать магазин. Просто потому, что не знает и не высосет из пальца всей проблематики, которую решают интернет-магазины. Для него каждый нюанс их работы будет сюрпризом, а для создаваемой им системы - костылем. Результат заведомо плачевен.
    Ответ написан
    2 комментария
  • Есть ли символ, обозначающий "any"?

    Adamos
    @Adamos
    Можно написать name LIKE '%'
    Только тут важно не забыть поставить рядом канделябр и вытянуть руки.
    Ответ написан
    4 комментария
  • С чего начать изучение ML?

    @dmshar
    Я уж было обрадовался, что подобные вопросы перестали задаваться. Уже недели как две или даже три. Ан нет. Обязательно кто-то ленивый, да найдется, кому лень (или не умеет? А такое сегодня бывает???) задать вопрос Гуугл самому или хотя-бы пролистать пару страниц этого-же форума. А зачем, пусть за него это делают другие. Ну да, на это же уходит много времени еще и самому принимать решение надо.
    С чего начать изучать машинное обучение?
    С чего начать обучение машинному обучению / deep learning / data mining?
    С чего начать изучать глубокое обучение?
    С чего начать изучение искусственного интеллекта?
    Machine Learning и Big Data за три дня?
    Как стать data scientist?
    Дорожная карта математических дисциплин для машинн...
    План обучения для специалиста по Data Science
    Машинное обучение, что нужно знать в математике?
    Литература или какие-нибудь курсы математики для машинного обучения?
    Как разобраться в области машинного обучения?
    Какие есть книги по нейронным сетям и ИИ?
    Путь data science. Как будет правильнее?
    Какие темы в математике необходимо знать, чтобы начать изучать машинное обучение?
    Обучение Data Science?
    Я хочу изучать AI и машинное обучение. С чего мне ...
    Ответ написан
    Комментировать
  • Смысл и предназначение обычного бинарного дерева? Какова погрешность измерение времени программы при помощи Stopwatch'ера?

    zagayevskiy
    @zagayevskiy
    Android developer at Yandex
    Бинарные деревья это обычно деревья поиска. Просто бинарные деревья, по-моему, не используются. Единственное, что на ум приходит, это hash tree(Merkle tree) в криптографии. В общем, правила будут такие, какие задашь в имплементации.
    Вопросы, ну например, что такое высота дерева? (Здесь и далее за дерево считай BST). Каково асимптотическое поведение основных операций над деревом? Как их улучшить? Что такое сбалансированное дерево? Какие реализации сбалансированных деревьев поиска ты знаешь? Какие из них используются в стандартной библиотеке твоего основного языка?
    Можно придумать пачку вопросов про обход: как обойти дерево по слоям(в ширину)? В глубину? Как проверить, что бинарное дерево является деревом поиска?
    Ну и потом можно спросить, какие небинарные деревья ты знаешь?
    Ответ написан
    Комментировать
  • Обязательно ли использовать асинхронные функции с asyncio?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вся эта асинхронщина нужна для одной единственной цели - не ждать, пока другие процессы работают.
    Если вы можете обойтись без асинхронного кода и вам не мешают блокировки на время доступа к БД, то зачем вам вообще asyncio и aiohttp? Используйте тогда flask и запускайте gunicorn'ом много одинаковых процессов с вашим приложением и работайте в них синхронно.

    Если вы в асинхронном коде сделаете блокирующий вызов к БД и будете ждать пока она ответит, то вы в этом месте убиваете всё полезное, что даёт вам асинхронщина, но оставляете все неудобства, ведь асинхронный код сложнее синхронного, его труднее писать, труднее отлаживать, труднее тестировать, труднее читать.
    Ответ написан
    Комментировать
  • На каком языке сейчас чаще всего программируют микроконтроллеры?

    @0x131315
    Тут чистая экономика.
    Контроллеры ставят в основном в массовые устройства.
    Это значит что каждый сэкономленный доллар - это десятки, а то и сотни миллионов прибыли на ровном месте.
    Подобные суммы с лихвой покрывают время программистов, поэтому им ставят задачу уложить функционал на самый дешёвый контроллер, который ещё хоть как-то способен потянуть этот функционал.
    Отсюда - высокая степень оптимизации кода при работе с контроллерами.
    Нужно максимально использовать все особенности конкретного контроллера - программисты много работают с даташитом.
    Язык должен позволить максимально полно использовать систему команд конкретного контроллера, и гибко управлять регистрами и памятью контроллера.
    Поэтому в ходу в основном ассемблер - с ним можно писать максимально компактный код.
    Но функционал зачастую достаточно большой, чтобы его целиком писать на ассемблере.
    Поэтому, в целях экономии времени, пишут на Си, с использованием библиотек, а самые ответственные места реализуют с помощью ассемблерных вставок.
    Благодаря этому удается реализовать почти все преимущества и ассемблера и Си: быстрая и достаточно полно контролируемая разработка, с достаточно компактным и быстрым кодом.

    С симками ситуация иная - там важно было реализовать кроссплатформенный код. Поэтому используют java, не смотря на ресурсы.

    В более мощных контроллерах в ходу уже не конкретный язык, а целые ОС. В основном в прошивках просто зашивают Линукс, а отдельные части по управлению контроллером реализуют на Си как драйвера.

    Там, где важна производительность, вообще не пользуются программным кодом, а переходят на железную логику - плисы. Это в основном оборудование для обработки сигналов, в т.ч. всевозможные радиомодули, модемы, видеооборудование, и т.п.

    Так что все зависит от здравого смысла и стоимости.
    Просто так везде пихать java - немного глупо.
    Ответ написан
    Комментировать
  • Существует ли противоположность фильтру Блума?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    тю, ну конечно: список, какой-нибудь особенный

    ограничите время поиска - и вот Вам ложноотрицательные срабатывания ))
    Ответ написан
    Комментировать
  • Как получить все элементы очереди RabbitMQ?

    inoise
    @inoise
    Solution Architect, AWS Certified, Serverless
    Нельзя получить "все сообщения из очереди". Получаете их по очереди без ack, записываете в базу, потом делаете ack. Можно посмотреть в сторону метода basic.consume.

    А вообще вы же с очередью работаете. Не надо делать батч из очереди. Это противоестественно. Особенно учитывая что размер очереди изначально не известен
    Ответ написан
    Комментировать
  • Питон при запуске скрипта пишет: vk.messages.send( ^ IndentationError: expected an indented block - ,в чем проблема?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Если перевести через гугл транслате, получится - "ожидал блок с отступом".

    За такие вопросы нужно руки отрывать, и в баню! Интересно, сколько таких вопросов модеры удаляют за день?
    Ответ написан
    1 комментарий
  • Как посчитать эффективность разработки?

    Adamos
    @Adamos
    Эффективность бизнеса в целом можно увеличить, уволив на хрен менеджера, который высасывает из пальца KPI для программистов.
    Ответ написан
    1 комментарий
  • Python выдаёт ошибку: SyntaxError: invalid syntax что делать?

    mmmaaak
    @mmmaaak
    Изучать синтаксис питона
    Ответ написан
    Комментировать
  • Зачем использовать готовые решения?

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

    Нужно писать своё, чтобы учиться (как вы описываете в вопросе). И чтобы понимать как работают готовые решения и почему именно так.

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

    1. Экономия времени. Достаточно написать и после интегрировать в свои проекты...
    "Достаточно написать" обычно для велосипедов измеряется годами, с учётом всё новых и новых требований и найденных багов.

    2. Правильное решение. Соглашусь, но если практиковать свои навыки, разве у вас не получится также?
    Опять же - речь про годы практики.
    Ответ написан
    Комментировать
  • Частичное внедрение VueJS в Django приложение, как быть с аутентификацией?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    Ответ написан
    Комментировать