Ранее в сериале:
Ранее в сериале:
Привет. Меня зовут Саша, я CTO в INET Studio. В своей работе я сделал следующее наблюдение: с прошлого года на ИТ-рынке России компании все чаще отказываются от инноваций ради инноваций, делая ставку на практичность – чтобы остаться на плаву в турбулентных условиях. Сегодня хочу разобрать, почему так произошло и чего ожидать в будущем в наших техстеках.
Утренняя работа над второй частью статьи началось не с запаха кофе, а с запаха нафталина, толстым слоем покрывающего микропроцессоры эпохи конца 1970-х годов. В этой знаменитой плеяде такие имена, как Zilog Z80, Motorola 68000, Intel 8086. Все они были выпущены с разницей буквально года два-три, и вполне могут считаться ровесниками.
В первой части мы:
посмотрим, как работать с памятью и регистрами 8086
узнаем, как написать простую программу на ассемблере прямо в отладчике
изучим работу механизма прерываний и сделаем демонстрационный пример
Статья рассчитана на тех, кто имеет начальный опыт программирования, но хочет понять основы низкоуровневого программирования и многозадачности.
Примеры в бинарном виде доступны по ссылке https://github.com/galilov/habr/blob/main/asm-8086-galilov.zip.
Никаких особых медицинских диагнозов мне не ставили, но мои умственные способности крайне ограниченны. Даже те задачи на Leetcode, которые попроще, вызывают у меня затруднения. Когда я читаю о самом обычном алгоритме консенсуса, у меня кипит мозг. У меня плохо получается отслеживать сложные зависимости в кодовой базе. Я не способен освоить модные языки вроде Rust (пытался, но по правде сказать, для меня это чересчур). Я терпеть не могу микросервисы и современный фронтенд: там слишком много движущихся частей, и уследить за всеми я не в состоянии.
Как же я выхожу из положения?
Читать полностью »
Сначала оказалось, что простые эвристики не работают. Ну вот совсем. То есть тупой чат-бот, который умеет распознавать с десяток жёстких тематик или показывать клавиатуру вроде «Нажмите 1, чтобы узнать свой баланс», несильно экономит время контакт-центру. Люди как не читали инструкции, так и не читают, а при виде такого сразу стремятся выйти на живого оператора.
То есть бот должен быть реально полезным. Таким, чтобы пользователь чувствовал, что диалог с ним — это не конкурс «обойти железного идиота», а что-то всё же даёт.
Здесь ждут следующие грабли: предположим, вы собрали всю базу диалогов контакт-центра с 2002 года. Разметили её и даже обучили на ней бота. Дальше произойдёт следующее:
Речь идёт про то, что если обучать базу на всех диалогах без исключения так, как это подразумевает философия полной автоматизации, то очень быстро база начнёт забиваться откровенным мусором, снижающим точность классификации. Про это вендоры вам не скажут, но нужно либо постоянно что-то подкручивать, либо чистить выборку для обучения, либо обучать не на всех диалогах, которые закончились каким-то удовлетворительным ответом. Иначе очень быстро у вас перепутаются ответы для кредитных и дебетовых карт, например, потому, что клиенты либо путают их в своих стартовых запросах тоже, либо вообще не видят между ними разницы.
Ниже я хочу рассказать про те не совсем очевидные вещи в поддержке чат-бота, которые могут очень сильно уронить качество его работы. Ну или не дать до этого качества дорасти вообще, если архитектура не совсем правильная.
Читать полностью »
Did he ever return? No, he never returned,
And his fate is still unlearned,
He may ride forever ‘neath the streets of Boston,
He’s the man who never returned.“Charlie on the M.T.A.”, 1949
Одна из удобных возможностей современных языков программирования – вложенные функции:
def bubble(arr, comp):
def swap(i, j):
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
flag = True
while flag:
flag = False
for i in range(len(arr) - 1):
if comp(arr[i], arr[i+1]) > 0:
swap(i, i+1)
flag = True
Сама эта возможность не нова: она была уже в Алголе (1958) и многим знакома из Паскаля (1970). В компиляции вложенных функций нет ничего сложного: например, в стековом кадре внутренней функции может храниться указатель на стековый кадр внешней функции, чтобы внутренняя функция могла обращаться к параметрам и локальным переменным внешней. Кто-то может вспомнить, что инструкции enter и leave, появившиеся в 80186 (1982), реализуют именно такую поддержку вложенных функций (хотя я не встречал ни один компилятор, который бы её задействовал).
Сложности начинаются, если язык позволяет передать внутреннюю функцию наружу внешней:
def by_field(name):
def comp(x, y):
return x[name] – y[name]
return comp
bubble(my_records, by_field("year"))
Как внутренняя функция сможет обращаться к параметрам и локальным переменным внешней после того, как возврат из внешней функции уничтожил её стековый кадр? Каким-то образом внутренняя функция должна «захватить» используемые переменные вместе с собой; функция вместе с захваченными извне переменными называется «замыканием». Паскаль такое уже не поддерживает; Читать полностью »
Всем привет. На связи Омельницкий Сергей. Не так давно я вел стрим по реактивному программированию, где рассказывал про асинхронность в JavaScript. Сегодня я бы хотел законспектировать этот материал.

Но перед тем как начать основной материал нам нужно сделать вводную. Итак, давайте начнем с определений: что такое стек и очередь?
Стек — это коллекция, элементы которой получают по принципу «последний вошел, первый вышел» LIFO
Очередь — это коллекция, элементы которой получают по принципу («первый вошел, первый вышел» FIFO
Окей, продолжим.

JavaScript — это однопоточный язык программирования. Это значит, что он имеется только один поток выполнения и один стек, в который помещаются функции в очередь на выполнение. Следовательно в один момент времени JavaScript может выполнить только одну операцию, другие операции при этом будут ждать своей очереди в стеке, пока их не вызовут.