Дубликаты не найдены

+310

Есть еще категория особо одарённых людей которые вместо правки ошибки, любят делать ниже по коду на нее патч.

И стоит ошибку исправить как начинается какой то писец.

раскрыть ветку 49
+303

69 мелких ошибок в коде.

Исправляем 1 ошибку.

99 мелких ошибок в коде.

раскрыть ветку 33
+86
раскрыть ветку 6
+181

Он что, одну ошибку перевернул?

раскрыть ветку 14
+54

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

раскрыть ветку 8
+17
скорей 3 не очень важных до и 87 критичных после
0
Значит была не ошибка, а фича.
+80
на полном серьезе, я не могла сделать сортировку таблицы по кнопке, и я сделала так, что по ее нажатию таблица удаляется и генерится заново с нужной сортировкой(
Или, когда делала бота для телеги, он подсасывал данные из таблицы эксель, из одной ячейки, которая каждый раз должна была выбрать рандомное значение из других ячеек. Я просто заставила бота добавлять и удалять левую строку, что бы значение обновлялось (в экселе, что бы рандомайзер работал нужно куда-то тыкать или что-то делать вообще). Стыдно, но работает же!
раскрыть ветку 5
+78
Иллюстрация к комментарию
+7
Workbook.Sheets(1).Range.Calculate
раскрыть ветку 2
-3
F9
+20
Иллюстрация к комментарию
раскрыть ветку 4
+21

однако Доктор стену всё-таки пробил

раскрыть ветку 2
+6

Хорошая фраза. С глубоким смыслом.

Ладно, пойду на работу

+6

Поцелуй мой стальной зад 0011101111000!

+5

Это называется exception-driven development ;) За такое надо линейкой по пальцам.

+4
100 ошибок есть в твоём коде, пришел ты и исправил одну...
342 ошибки есть в твоём коде...
+1
За такое надо отлучать от компьютера
+36
Между прочим это правильный совет, на момент написания кода ты ещё не знаешь где у тебя ошибки, но лучше когда они сосредоточены в общих функциях / классах, чем разбросаны по коду. Например, работал у нас один паренёк, его задача была прикручивать флешовый гуй, который поступал к нему от дизайнера, в итоге чувак на все игровые окошки наплодил порядка 50 классов, причём 1 класс = 1 окошко, почти все эти классы были похожи друг на друга, но отличались в какой нибудь мелкой детальке (т.е. чувак видел что у него есть небольшое отличие в поведении и он просто копипастил целиком класс и делал это маленькое отличие). Разумеется вылезли баги, вот он один баг чинить мог месяцами, поскольку он постоянно всплывал в разных окошках, куда его руки не дотянулись. А потом появилась необходимость добавить один общий функционал всем окошкам системы ну и вы догадываетесь во что это вылилось. Короче его уволили, а мы с товарищем за полторы недели все это перелопатили и переписали.
раскрыть ветку 7
+24
но лучше когда они сосредоточены в общих функциях / классах, чем разбросаны по коду

Один из базовых принципов тестирования ПО - "кластеризация проблем", в общем-то.


А ваш чувак не мог в абстракции (и, как следствие, првильный ООП), видимо, от слова "совсем".


Многие "смешные вещи" оголяют недостаток фундаментальных знаний современных "погромистов на реакте".

раскрыть ветку 4
+9
Он вообще странный тип был, он люто надрачивал на design patterns, но совершенно не мог в построение абстракций, разделение ответственности и во многие базовые алгоритмы. Я был в ахуе, когда меня начальник попросил за него сделать какую-то гуёвую задачку связанную с банальным поиском в глубину, потому что этот чел больше суток не мог срастить как пишется поиск в глубину. Там очень много приколов было, большая их часть на самом деле связана с плохим начальством (в том плане, что оно было глухо к советам подчинённых)
раскрыть ветку 3
+3
Code review для слабаков
раскрыть ветку 1
+7

у нас команда была 3 программиста, 2 дизайнера, и очень короткий срок выполнения) мой товарищ его ревьювил по мере возможностей, но переделывать некогда было

+55

У меня была одна проблема, и я написал программу чтобы решить её. И теперь у меня одна проблема, 28 ошибок и 10 предупреждений.

раскрыть ветку 13
+46

В оригинале было иначе :))

Иллюстрация к комментарию
раскрыть ветку 9
+30

Здесь стоит добавить, что английское слово "problem" переводится на наше как "задача". А вот наше "проблема" по-английски будет "issue"

раскрыть ветку 6
+4

Слышал еще вариант - у меня была проблема. Решил использовать регулярные выражения. Теперь у меня 2 проблемы.

раскрыть ветку 1
+20
С появлением компьютеров люди получили возможность решать проблемы, которых до появления компьютеров не было.
+1

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

раскрыть ветку 1
0
Да, только не факт, что нет ошибки в тесте)
+15

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

раскрыть ветку 14
+8

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

раскрыть ветку 6
+2

Да проблема в специфике самого объекта, что он с ошибкой вываливается, хотя мог бы null возвращать.

Вариантов нет, он создаётся, в обработчике задаю значение переменной. Но если вдруг event создания не отработал (сложная архитектура, всякое бывает), то всё.

раскрыть ветку 5
+2

try-catch выручает.

раскрыть ветку 4
0

Угу. Так и заворачивают ошибку в функцию.

0
Да без него вообще мало чего пишется)
раскрыть ветку 2
+2
А какие-то геттеры для этого не предназначены у класса? Которые это умеют корректно обрабатывать? Или вы в геттере и делали затычку?
раскрыть ветку 1
0

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

+20

Зачем создавать функцию, если можно найти аналог на Хабе?

раскрыть ветку 16
+57
Иллюстрация к комментарию
раскрыть ветку 15
+32

StackOverflow driven development

раскрыть ветку 14
+11
В 10 классе училка по информатике попросила решить задачку на бейсике (1997 год), сколько счастливых билетов в 999999 билетах. Сделал путем перебора и сравнения разрядов а+b+c=d+e+f.
делалось не быстро, но считало. Сейчас ни разу не программер, но чувствую, что сделал тогда не правильно.
раскрыть ветку 2
0
Можно было перебрать половину вариантов. И результат умножить на 2.
0

a + b + c <= 27 если это цифры. Самый быстрый способ - завести массив на 27 элементов и в i-м элементе хранить количество найденных троек с заданной суммой. Потом сложить квадраты всех элементов (каждая тройка с конкретной суммой образует счастливый билет с каждой тройкой с такой же суммой). Ну или если совсем хорошо подумать, можно вывести формулу которая будет вообще за O(1) считать

+1

Лучше сделать 1 функцию и налажать, чем написать тоже самое методом copy->paste и мучиться исправляя каждое.

0

Это жестоко.

0
Возможно имеется ввиду функция обработки ошибки
0

Это называется "автоматизированное регрессионное тестирование".

0

Лучше сразу класс.

0

Такого качественного объяснения принципа Don't Repeat Yourself я еще не видел.

-4

Зачем постить сюда такие бояны то? Я понимаю, что плюсцов хочется, но вы просто загаживаете такими постами ресурс. Причем, что те, кто постит, что те кто плюсует

-10

код этой функции для python3, сорри, при залитии на гитхаб возникает эта ошибка, поэтому выкладываю исходник здесь

class Exception42(Exception):
    pass
def func42():
    raise Exception42('Compatible programmer not found')
func42()
раскрыть ветку 3
+2

Зачем?

ещё комментарии
ещё комментарии
Похожие посты
7803

Пельмень на Госуслугах

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

Вроде, нигде его имя официально не афишируется, поэтому решил поделиться.

Пельмень на Госуслугах Госуслуги, Факты, Наблюдение, Код, Разработка, Пельмени, Длиннопост
Пельмень на Госуслугах Госуслуги, Факты, Наблюдение, Код, Разработка, Пельмени, Длиннопост

А это ресурсы из Android-приложения:

Пельмень на Госуслугах Госуслуги, Факты, Наблюдение, Код, Разработка, Пельмени, Длиннопост
Показать полностью 1
321

Лучшее в информационной безопасности

Лучшее в информационной безопасности Разработка, Персональные данные, Информационная безопасность, Профессиональный юмор

НЕ ПЕРСОНАЛЬНЫЕ ДАННЫЕ:

1. НЕ ПОЛЬЗОВАТЕЛИ

2. НЕ ПАРОЛИ

3. НЕ ПЛАТЕЖНЫЕ ДАННЫЕ


— О да, улучшение безопасности — следующий шаг в наших планах.


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

1145

Шлюз дезинфекции от вируса. Снимаем корону

Привет Pikabu! Давненько не виделись!


Мы разработали быстровозводимый шлюз дезинфекции, который может помочь в войне с вирусом. Внутри поста картинки и описание. Я знаю, что на Pikabu не только диванные, но и настоящие специалисты во многих областях. Пока не доделали прототип позакидывайте критикой и советами - публикации на других сайтах нам уже очень помогли. Погнали!

Шлюз дезинфекции от вируса. Снимаем корону Tabula Sense, Коронавирус, Дизайн, Шлюз, Разработка, Совет, Видео, Длиннопост

Прежде всего специально нарезал  короткое видео о том, как подобные конструкции работают в других странах, в РФ пока ни одной не видел:

В нашем варианте это конструкция из металлокаркаса, обтянутая банером на люверсах. Каркас сборно / разборный, т.е. всю эту штуку можно перемещать, а потом разобрать и сложить до следующего апокалипсиса. Длина 3 метра, высота 2,4 метра:

Шлюз дезинфекции от вируса. Снимаем корону Tabula Sense, Коронавирус, Дизайн, Шлюз, Разработка, Совет, Видео, Длиннопост

Внутри шлюза проложен трубопровод высокого давления с туманообразующими форсунками. Распыляется раствор гипохлорита натрия, концентрация согласно ПДК по ГОСТ 11086-76. Туман хорошо проникает во все складки одежды и продолжает убивать микробы и вирусы даже спустя некоторое время после выхода из шлюза.

Шлюз дезинфекции от вируса. Снимаем корону Tabula Sense, Коронавирус, Дизайн, Шлюз, Разработка, Совет, Видео, Длиннопост

Уже много было возражений по этому поводу от комментаторов на других сайтах, поэтому сразу отвечу:

- 100% вирусов за это время не убьёт, но значительно снизит их количество

- Людей не потравит, так как концентрация очень низкая, точную дозировку вычисляем и будем согласовывать с санэпидемстанциями, сертифицировать

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

- Во всех других странах используют именно гипохлорит натрия или кальция


Если вы эпидемиолог, химик или сотрудник санэпидемстанции прошу дать совет или комментарий по этому пункту, он нам нехимикам пока даётся сложнее всего.

Шлюз дезинфекции от вируса. Снимаем корону Tabula Sense, Коронавирус, Дизайн, Шлюз, Разработка, Совет, Видео, Длиннопост

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

Шлюз дезинфекции от вируса. Снимаем корону Tabula Sense, Коронавирус, Дизайн, Шлюз, Разработка, Совет, Видео, Длиннопост

Сбоку от шлюза пластиковая цистерна на 500 литров. При расходе жижи в 1,5 л / мин, с учётом установленного датчика движения должно хватать примерно на 8 часов.

Шлюз дезинфекции от вируса. Снимаем корону Tabula Sense, Коронавирус, Дизайн, Шлюз, Разработка, Совет, Видео, Длиннопост

Внутри RGB-светодиоды для подсветки в тёмное время суток и индикации статуса: зелёный - можно заходить, жёлтый - идёт обработка, красный - пора выходить.


Мы открыли на них предзаказ, пока есть обращения из Казахстана, Армении, Эмиратов. Из РФ тоже, но сильно меньше. Можем подключить все знакомые рекламные производства в Москве и уже через две недели массово устанавливать шлюзы по всему городу, отправлять в регионы. Гипермаркеты, поликлиники, дома престарелых и т.д.


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


Здесь запостился, чтобы собрать больше инфы, советов, ссылок и так далее. Прошу не отказать.

UPD: К посту есть вопросы #comment_165523341

Показать полностью 5
207

Какую плитку ни в коем случае нельзя смачивать перед укладкой, а какую можно и даже нужно?

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


В КАКИХ СЛУЧАЯХ Я СМАЧИВАЮ ПЛИТКУ И ЗАЧЕМ Я ЭТО ДЕЛАЮ?

Если кафельная плитка слишком сильно впитывает влагу.

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


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


Бывает такое, хоть и редко, когда сам кафель имеет относительно высокую влажность (лежал во влажном помещении, например) — в этом случае увлажнение будет лишним.


Зачем?
1. Экспериментальным методом проверял на адгезию спустя неделю плитку, уложенную без смачивания и со смачиванием. Второй вариант при всех равных держался крепче. В этом меня поддержал один из экспертов в этом вопросе:


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

2. Советовался с технологами от производителя плиточного клея, они подтвердили выводы, к которым я пришёл.

3. За счёт лёгкого увлажнения при работе с плиткой остаётся больше времени на её корректировку. Если плитка сухая то клей схватывается значительно быстрее, чем указано на упаковке.

ВАЖНО
Речь не идёт о том, чтобы опустить плитку в ведро и напитать её так, что из неё самой будет вода сочиться — конечно же нет). Речь идет о том, чтобы слегка напитать её водой 3–4 раза проведя по ней влажной губкой или тряпкой. Чтобы на выходе получилась слегка увлажнённая поверхность, а не лужи воды.

Смачиваю плитку я с помощью губки непосредственно пред нанесением плиточного клея:

Какую плитку ни в коем случае нельзя смачивать перед укладкой, а какую можно и даже нужно? Плиточники, Строительство и ремонт, Строительство, Укладка плитки, Технологии, Ошибка, Совет, Правила, Длиннопост

КОГДА ПЛИТКУ НЕ СМАЧИВАЮ?Когда укладываю керамогранит. Он вообще не впитывает влагу. И его смачивание только ухудшит адгезию клея с плиткой.

Важно ещё помнить:

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


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

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


Всем удачи!)


ОБ АВТОРЕ
Специализация: Укладка плитки и мозаики
Личный блог и Контакты для связи

Показать полностью 1
838

Правила

Правила Программирование, Ошибка, Баг, Джинн, Исполнение желаний, Профессиональный юмор

— Итак, есть три правила: нельзя желать кому-то смерти, нельзя желать влюбить кого-то в себя и нельзя желать воскресить умершего человека

— Я хочу, чтобы я больше никогда не допускал ошибок в моём коде

— Итак, есть четыре правила...

2065

Сэр, это ваш код?

Сэр, это ваш код? Программирование, Код, Профессиональный юмор, IT юмор, Перевод, Картинка с текстом

— Извините, сэр, это ваш код?

— Да!

— Вы — тот, кто написал его?

— Да!

— Это значит, вы должны знать, как он работает?

— Звучит разумно.

— И как же он работает?

— Без понятия

1676

Главные ошибки при ремонте, часть 2.

Под предыдущим постом https://pikabu.ru/story/_5880636 в комментариях было много разговоров про электрику, поэтому поделюсь еще парой мыслей про размещение розеток


6) Нарисуйте план кухни заранее.

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

Например появления розеток над варочными поверхностями:

Главные ошибки при ремонте, часть 2. Ремонт, Строительство, Совет, Дом, Ошибка, Личный опыт, Квартира, Длиннопост

Тут мы видим феерическую ситуацию, когда плита будет плавить провода.


Важно: розеток много не бывает. Вообще идеальные стены на кухне должны сплошь состоять из розеток. Но так как идеал недостижим, важно идти по принципу: розеток как можно больше.

Например, дернув из интернета первый попавшийся план кухни, я бы разместил на нем розетки так:

Главные ошибки при ремонте, часть 2. Ремонт, Строительство, Совет, Дом, Ошибка, Личный опыт, Квартира, Длиннопост

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

По розеткам на  варочную, духовку и посудомойку самое важное - разместить их правильно.

Главные ошибки при ремонте, часть 2. Ремонт, Строительство, Совет, Дом, Ошибка, Личный опыт, Квартира, Длиннопост

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


И еще: не забудьте установить розетку под вытяжку. Штробить по готовой отделке неохота никому.


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

Хотя как говорил один преподаватель из медунивера: "В квартире не должно быть трех вещей: ковра в коридоре, библиотеки в туалете и телевизора на кухне". Но это уже совсем другая история...


7) Люстра на кухне.

Хотите повесить над столом - подумайте, где будет стол и какого он будет размера. Глупо получится, если после установки люстры появится решение передвинуть стол навсегда к стене, и люстра всю жизнь провисит над головой, а не над столом.


8) Немного о электрике в санузлах.

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

Решите, где будет стоять стиралка - розетку туда. Если планируется сушилка - тоже.

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

Розетка возле умывальника - вещь необходимая, сделайте ее.

Главные ошибки при ремонте, часть 2. Ремонт, Строительство, Совет, Дом, Ошибка, Личный опыт, Квартира, Длиннопост

Но всегда помните про электробезопасность:

Главные ошибки при ремонте, часть 2. Ремонт, Строительство, Совет, Дом, Ошибка, Личный опыт, Квартира, Длиннопост
Показать полностью 3
236

Шахматы и искусственный интеллект. Победа брутфорса и трагедия отечественных шахматных программ

Всем привет!

Дорогие мои подписчики, хочу перед Вами извиниться (а заодно прорекламировать одно мероприятие): постов про машинное обучение не будет где-то месяц - сейчас начинается весьма интересное соревнование по искусственному интеллекту: Russian AI cup. Всем-всем рекомендую в нём поучаствовать. Я буду в нём биться однозначно, поэтому - придётся позаниматься его задачей (программирование ботов для RTS). Как закончится - обязательно запилю пару постов или сюда, или в программирование.


А пока, раз намечается такое мероприятие, немного поведаю об искусственном интеллекте в шахматах. Тем более, в магистратуре писал реферат по истории математики- немного адаптирую его части для поста.

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

Содержание:

1. Введение

2. Минимакс

3. Альфа-Бета отсечение

4. Эвристики

5. Ботвинник - история его шахматного программирования

6. Почему же провалились попытки Ботвинника? Моё мнение.

7. Список литературы.

1. Введение

Шахматы и искусственный интеллект. Победа брутфорса и трагедия отечественных шахматных программ Искусственный интеллект, История, Шахматы, Ошибка, Исследования, Наука, Разработка, Длиннопост, Михаил Ботвинник

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

По-настоящему искусственным интеллектом для игры в шахматы заинтересовались лишь в середине 20 века. Как написал кто-то из великих:" Шахматы - дрозофила для искусственного интеллекта". И вот в 1951 вышла работа Шеннона, посвящённая вопросам шахматного программирования. В ней он затрагивал вопросы поиска лучшего хода и им было выдвинуто два тезиса, полностью противоположные друг другу:


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


2. Существует  «умный» перебор, который целенаправленно согласно некоторому алгоритму искал бы лучший ход.


Говоря вкратце, второй подход подразумевает знание некоторого супер-алгоритма, которому не надо всё перебирать. Сам Шеннон верил только в первый подход. А вот наш главный программист в шахматах верил исключительно во второй вариант и именно он загубил наше шахматное программирование.

2. Минимакс

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

Шахматы и искусственный интеллект. Победа брутфорса и трагедия отечественных шахматных программ Искусственный интеллект, История, Шахматы, Ошибка, Исследования, Наука, Разработка, Длиннопост, Михаил Ботвинник

Дано:

- Предположим, что у нас есть два игрока. Кружочек и квадратик.

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


Допустим, что необходимо нам оценить некоторую позицию и найти план выигрыша в ней. Для это представим всевозможные варианты продолжения игры из заданной позиции. Затем при помощи нашей функции оценим самые последние позиции в наших расчётах (на рисунке это позиции на 4 уровне). А теперь немного порассуждаем. Очевидно, что мы с соперником на каждом своём ходе будем стремиться выбрать наилучшее развитие событий для себя и чем лучше позиция для меня, то тем хуже она для соперника и наоборот. Тогда, при своём ходе мы будем выбирать позицию с наибольшим значением функции, а соперник с наименьшим.


А теперь, после оценки узловых (самых нижних позиций) начнём восходить по дереву и приписывать оценки узлам по правилу: на уровне, когда ход мой- выбираем наибольшую оценку у потомков, а когда ход противника то с наименьшим. Когда будут оценены все вершины, то легко можно будет точно сказать, какое решение стоит нам принять. В чём же профит у алгоритма?


Profit. Он только один. Алгоритм  корректен - он всегда вернёт наилучшее решение, если мы можем построить дерево для всей партии.


Недостатки:

1. Сколько там всего шахматных позиций - 10^120? Ну-ну, успехов.

2. Функция оценки. Как нам запрограммировать функцию оценки позиции?

3. Допустим, мы строим дерево не для всей игры. А хотя бы ходов на 10. Сколько нам надо будет перебрать позиций? Всё равно как-то многовато.


И тут нам на помощь приходит Альфа-Бета отсечение и эвристики.

3. Альфа-Бета отсечение

Шахматы и искусственный интеллект. Победа брутфорса и трагедия отечественных шахматных программ Искусственный интеллект, История, Шахматы, Ошибка, Исследования, Наука, Разработка, Длиннопост, Михаил Ботвинник

Основная его идея в том, что ряд позиций можно не рассматривать. Ну а смысл рассматривать альтернативы, если мы гарантированно побеждаем в одном варианте? Зачем нам дальше осуществлять перебор? Рассмотрим чуть подробнее...


Здесь тёмным цветом обозначены не просматриваемые варианты. По-прежнему действуем так же, как и при минимаксном обходе дерева. Только теперь будем динамически обновлять минимаксные оценки, как только это становится возможным. Когда узлу на третьем уровне слева будет выставлена оценка 4, нам не имеет смысла просматривать оставшуюся вершину в последнем уровне т.к. текущая минимаксная оценка на третьем уровне ниже, чем её альтернатива. Поэтому, всё равно соперник выберет её. Поэтому, мы пока продолжаем выставлять минимаксные оценки и обходим дальнейшие узлы дерева. Процедура, по которой мы не стали даже рассматривать узел на нижнем уровне в левом поддереве и имеющим оценку 5, называется бета-отсечением. Аналогичное отсечение происходит в центральном поддереве с узлом, который имел бы оценку 9.


Рассмотрим теперь правое поддерево. Предположим, что мы уже получили минимаксную оценку 5 для узла в первом уровне. Не имеет смысла идти дальше по оставшемуся поддереву потому, что минимаксная оценка не сможет уже возрасти, а текущее её значение не превышает максимальной минимаксной оценки по уровню.


Доказывается, что альфа-бета отсечение позволяет сократить количество вариантов в самом удачном случае до 2n^(m/2)-1,  где n-количество уровней в дереве, а m количество узлов на каждом уровне.


Данный алгоритм Аллен Ньюэлл и Герберт Саймон, использовавшие то, что Джо Маккарти назвал «аппроксимацией» в 1958 году, написали, что альфа-бета отсечение «кажется, изобреталось неоднократно». Артур Самуэль, Ричардс, Харт, Левин, Эдвардс независимо предлагали ранние версии этого алгоритма. Маккарти также выдвигал подобные идеи на Дартмутском семинаре в 1956 году, а затем, в 1961 году, предложил для исследования группе своих студентов в MIT, включая Алана Котока.


Александр Брудно, наш советский математик, независимо открыл алгоритм и, что самое важное, доказал его, опубликовав работу в 1963 году. В 1975 году Дональд Кнут и Рональд У. Мур усовершенствовали алгоритм добавив «бета» отсечения.

В списке литературы дам ссылку на псевдокод алгоритма и список эвристик.

4. Эвристики.

Смысл эвристик - подсказать компьютеру на основе жизненных наблюдений, что это позиция хороша/плоха, пора прекратить расчёт, оптимизировать перебор. Для этой цели были созданы следующие эвристики:



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


Эвристика убийцы. Идея состоит в том, что хороший ход в одной части дерева является также хорошим и в другой его части на той же самой глубине. для этой цели на каждом уровне мы храним один или два хода-убийцы, которые рассматриваются прежде, чем другие ходы. Успешное отсечение ходом не-убийцы записывает этот ход поверх одного из шагов убийцы для этого уровня. Как пример: почти всегда убить вражеского ферзя хорошо и мы должны рассмотреть его взятие в первую очередь.


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


Эвристика истории - другой метод усовершенствования для упорядочения ходов. В таблице, индексированной по статистике полей с которых совершаются ходы и полей, на которые совершаются ходы, хранится статистика хороших ходов отсечения. Эта таблица используется при упорядочивании ходов (вместе с другой информацией типа выигрыша/потерь при взятии).


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

5. Трагедия отечественных шахматных программ

Шахматы и искусственный интеллект. Победа брутфорса и трагедия отечественных шахматных программ Искусственный интеллект, История, Шахматы, Ошибка, Исследования, Наука, Разработка, Длиннопост, Михаил Ботвинник

Михаил Моисеевич Ботвинник. Патриарх отечественных шахмат. Благодаря ему наши шахматисты АБСОЛЮТНО ДОМИНИРОВАЛИ с 1937 до конца века. Весьма неплохой учёный в области технических наук. Трёхкратный чемпион мира и неплохой программист. Однако, по иронии судьбы именно он и загубил отечественные шахматные программы.


Я не буду расписывать все его шахматные заслуги - это прекрасно сделал Гарри Каспаров в своём монументальном труде "Мои великие предшественники".


Проиграв Петросяну в 1963 году, Михаил Моисеевич решил заняться своей идеей фикс: создать робота-шахматиста. Сначала основная работа велась над тем, как формализовать шахматную задачу и алгоритм поиска принятия решения. Когда первые шаги были сделаны в 1964 году, Михаил Моисеевич решил приступать к разработке алгоритма. Однако, здесь разработка программы существенно застопорилась:


Во-первых, математики (Д. Юдин, М. Шура-Бура, М.Келдыш) отнеслись с существенным скептицизмом к его формализации алгоритма.


Во-вторых, учёные из ИТЭФа разрабатывали свою шахматную программу «КАИССА» и у них не было времени, чтобы работать вместе с Михаилом Моисеевичем над его проектом.


В 1965 году Ботвинник рассказывает о своих шахматных идеях Шеннону и Заде, на торжественном приёме в Москве. Его идеи явно заинтересовали последних, и они даже предложили своё название некоторым терминам. После этого Ботвинник несколько доработал рукопись и снова попробовал её опубликовать. Несмотря на отрицательный отзыв доцента математики Арамоновича, Владимир Симагин, гроссмейстер и редактор бюллетеня ЦШК, решил опубликовать статью Ботвинника в порядке обсуждения. Публикация вышла в свет в 1966 году 13 мая и вызвала серьёзный диспут среди учёных-математиков. Причём, большинство осуждало публикацию.


Причиной осуждения была техническая сложность вычисления основной идеи Ботвинника- вычисление «траекторий» (термин Ботвинника) фигур. Однако, Михаилу Моисеевичу удалось решить и эту проблему, причём всего за две недели. Поэтому, он написал уже новую статью, где рассказывал о поиске траекторий. Эту статью он показал академику Криницкому. Последний после многочасового разговора, корректировки статьи с математической точки зрения, дал положительный отзыв. Воодушевлённые последними событиями, Ботвинник решил не выпускать статью, а напечатать книгу. Академик Островитянов без задержек и проволочек опубликовал книгу «Алгоритм игры в шахматы» в редакции научно-популярной литературы в 1968. Более того, данной работой заинтересовались и в США. Данная работа была переведена на английский язык и опубликована в 1971 году. В этом же году Ботвинник выступает с семинаром в Доме Учёных. Академик Е.Геллер, выступавший инициатором приглашения Ботвинника на семинар, предлагает напечать блок-схему алгоритма игры. Этот препринт увидел свет в 1972 году.


Как результат всех публикаций и трудов, всё-таки было принято решение на государственном уровне (приказы Госплана, Госэнерго, комитет по науке и технике) начать работу над шахматной программой по трудам Ботвинника. В августе 1972 года началась непосредственная разработка программы. В помощь Ботвиннику были выделены два программиста. Первый программист, разбиравшийся в шахматах начал разработку дебютной и эндшпильной баз, а второй программировал понятие траектории. В 1974 году и появились первые трудности - оказалось, что понятие «зоны», одно из ключевых в работе Ботвинника, плохо программируется и с прикладной точки зрения оказалось сомнительным. Пока Ботвинник занимался электротехникой и уделял не всё время шахматной программе, разработка застопорилась окончательно. Поэтому, Ботвинник решил все время посвятить себя шахматной программе. К тому же, в декабре 1974 года Ботвинник получает ещё двух программистов, являющихся ещё и неплохими шахматистами. Дальнейшие два года проходят в разработке баз для миттельшпиля и в 1976 году альфа-версия программы наконец была завершена. Программа была завершена и названа «Пионер».


В декабре 1976 года начался эксперимент, целью которого было проверить, сумеет ли решить «Пионер» знаменитый этюд Рети. И первое испытание закончилось неудачно. Дерево вариантов расползалось без позиционной оценки и баз эндшпиля. Тогда было принято решение: запрограммировать правило квадрата и добавить базы эндшпиля. В январе 1976 года за 74 минуты «Пионер» всё ж справился с задачей. Затем «Пионеру» при дополнительно запрограммированных правилах всё же удалось решить и один этюд Ботвинника, составленный в 1926 году. Затем последовала попытка решить этюд Надареишвили, решение которого в основном варианте требовало 20 полуходов. Путём проб и ошибок в отключении различных модулей, библиотек, перепрограммировании старых и разработке новых правил, «Пионер» всё же сумел решить и его.


Как вы видите, Ботвинник нарушал одно из правил. Он не разрабатывал алгоритм, а подгонял под свои идеи, плодя всевозможные костыли. Я уверен, что Ботвинник понимал, что его путь сомнителен, но гордость... Ладно, я малость отвлёкся.


Затем в этом же году Ботвинник продемонстрировал свою программу (а именно принципы её работы. Сам «Пионер» не участвовал в чемпионате мира) миру на чемпионате по компьютерным шахматам в Канаде. Большим удовольствием для него служил тот факт, что победитель чемпионата «Чесс 4.6» не смог решить этюд Надареишвили. Ботвинник же был окрылён успехом и по возвращению в СССР решил, что корень всех проблем «Пионера» в слабом компьютере и более быстродействующий компьютер сумеет существенно усилить его работу.


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


Дальнейшая доработка программы привела к удивительному результату - оказалось, что можно использовать «Пионера» и для проведения расчёта затрат ремонтных работ. Версия «Пионер 2.1» была посвящена как раз этому применению. На этой версии программы как раз защитились аспиранты-программисты, работавшие с Ботвинником в 1984 году. Более того, некоторые идеи, положенные в реализацию «Пионера» были успешно внедрены в программы для разработки госплана в 1986 году («Пионер 4.6»). Но в шахматном отношении дела у программы обстояли плохо: программа никуда не прогрессировала, несмотря на работу Ботвинника, который придумал новый вид абстракции цепочки, заменившие зону.


Уже сильно начал давать о себе знать и возраст(сильно за 80) - Михаил Моисеевич стал значительно хуже видеть и общее самочувствие его ухудшалось. В скором времени произошёл развал СССР и идеи Ботвинника оказались совсем невостребованным: экономика перестала быть плановой, а шахматные программы из-за резкого усиления компьютеров стали вполне успешно играть по более простому алгоритмическому методу альфа-бета отсечения. Ботвинник скончался 5 мая 1995 года в Москве...

6. Почему же провалился "Пионер"

Шахматы и искусственный интеллект. Победа брутфорса и трагедия отечественных шахматных программ Искусственный интеллект, История, Шахматы, Ошибка, Исследования, Наука, Разработка, Длиннопост, Михаил Ботвинник

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


-Явная подгонка программы под результат. В машинном обучении такая ситуация называется переобучением. То есть, алгоритм может решить конкретные тестовые задачи, но в целом не обладает хорошей обобщающей способностью. Группа Ботвинника явно подгоняла работу программы под результат.


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


- Успешное развитие брутфорсных программ и явное отсутствие программ, которые хотя бы частично повторяли идеи Ботвинника. Действительно, немного сомнительно, что кругом одни студенты и профаны, а лишь ты д'Артаньян


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


- Отсутствие шахматного прогресса «Пионера». Ну да. Разрабатываем шахматную программу, которая не играет в шахматы, зато решает экономические задачи. Обыденное дело.


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


Доказательством последнего может служить, что Ботвинник в своих работах «Аналитических и критических работах» в 4 томе, вышедшем где-то за 7-8 лет до его смерти, пишет, что половина программистов не оправдала надежд. Это очень важный момент - люди, которых он мог уволить (и обязательно уволил бы, если бы дело было в них), когда с ними работал, его устраивали.


Как вывод, Ботвинник фактически загубил отечественные шахматные программы: ведь шла разработка «Каиссы» и Ботвинник мог вполне настроить ей позиционные оценки, как это сделал американский гроссмейстер Бенджамин с группой коллег для Deep Blue, а эти оценки могли бы помочь ей сделать неплохой качественный рывок вперёд и это могло бы сделать многое для развития советских шахматных программ. Более того, учитывая, что Ботвинник был величайшим шахматистом и прекрасно разбирался в программировании, если бы он взялся за стандартные методы программирования, то аналог сильнейшей программы Rybka мог бы появиться если не в Советском Союзе, то точно в России и намного раньше Rybka.

Список литературы:

Про идеи Ботвинника я писал, исходя из его работ:

1. М.М.Ботвинник. Аналитические и критические работы. Статьи, воспоминания»// Физкультура и спорт.1987г. 528 стр.

2. М.М.Ботвинник. О кибернетической цели игры.// Физкультура и спорт. 1955г. 120 стр.

3. М.М.Ботвинник. О решении неточных переборных задач.// Советское радио. 1979г. 145 стр.


Про алгоритмы:

4. Н. Нильсон. Искусственный интеллект//М.:Мир.1973г.273 стр. -

Классика. Для общего развития рекомендую. Идеи для Риверси/Шашек/Шахмат в принципе работают.


5. Про эвристики( в виде бонуса псевдокод альфа бета отсечения)


Кто интересуется противостоянием компьютеров и человека в 90ых и начале нулевых, очень рекомендую книжку:

Д.Бронштейн, С.Воронков. Давид против Голиафа// Москва, «Риппол классик», 2002 г. 560 стр.

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

Показать полностью 4
141

Ошибки в коде WannaCry помогают бесплатно восстановить файлы

Исходный код вымогательского ПО WannaCry оказался довольно низкого качества.

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


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


В случае, если файлы расположены в «важных» папках («Рабочий стол» или «Мои документы»), WannaCry перезаписывает оригинальные файлы и восстановить их будет невозможно (разве что заплатить выкуп). «Неважные» файлы отправляются во временную папку %TEMP%\%d.WNCRYT и просто удаляются с диска без перезаписи. В таком случае их можно восстановить с помощью специальных программ.

«Мы уже наблюдали это раньше - разработчики вымогательского ПО часто допускают грубые ошибки, позволяющие исследователям в области кибербезопасности успешно восстановить файлы. WannaCry - по крайней мере первый и наиболее распространенный представитель данного семейства - как раз такое вредоносное ПО», - отметил эксперт «ЛК» Антон Иванов.

Напомним, о масштабной кампании с использованием вымогательского ПО WannaCry стало известно 12 мая нынешнего года. За несколько дней вредонос инфицировал более 400 тыс. компьютеров в свыше 150 странах мира. Как сообщалось ранее, наибольшее число атак пришлось на Россию, однако по данным компании Kryptos Logic, лидером по числу случаев заражения стал Китай, тогда как РФ оказалась на третьем месте после США.

http://www.securitylab.ru/news/486528.php?utm_referrer=https...
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: