В интернете полным-полно создателей контента, и каждый хочет привлечь к себе внимание. Но, как ни странно, хороший учебный ресурс найти нелегко, а бесплатный – еще сложнее. Мы публикуем перевод материала, в котором автор собрал ссылки на самые авторитетные и полезные обучающие площадки.
Valery Prayd @valerypride
User
Больше чем Го
15 min
15KБросая в воду камешки, смотри на круги, ими образуемые;
иначе такое бросание будет пустою забавою.
Козьма Прутков "Плоды раздумья"
Эта игра — самый настоящий долгострой. Я начал работать над ней ещё в июне! Нельзя сказать, чтобы я каждый день надрывался, но крови она мне попортила немало. На сегодняшний день, это мой самый сложный проект в Axiom. По объёму (весьма нетривиального) кода, MarGo сопоставима, разве что, с Ритмомахией.
Что особенного в этой игре? Стоило ли из за неё так мучиться? Я расскажу, а вы сами судите.
иначе такое бросание будет пустою забавою.
Козьма Прутков "Плоды раздумья"
Эта игра — самый настоящий долгострой. Я начал работать над ней ещё в июне! Нельзя сказать, чтобы я каждый день надрывался, но крови она мне попортила немало. На сегодняшний день, это мой самый сложный проект в Axiom. По объёму (весьма нетривиального) кода, MarGo сопоставима, разве что, с Ритмомахией.
Что особенного в этой игре? Стоило ли из за неё так мучиться? Я расскажу, а вы сами судите.
+18
Использование монад в С++. Часть 1: монада списка
10 min
33KTutorial
Translation
Часть 1
Часть 2
Иногда программисты на С++ просят привести пример задачи, которая не может быть решена без использования монад. Начнём с того, что этот вопрос неверен сам по себе — это всё-равно, что спрашивать, существует ли задача, которая не может быть решена без циклов. Очевидно, если в вашем языке есть поддержка оператора goto, вы можете обойтись без использования операторов цикла. Что монады (и циклы) могут сделать для вас, это упростить ваш код и помочь лучше его структурировать. Как использование циклов превращает спагетти-код в нормальный, так и использование монад может превратить ваш код в императивном стиле в декларативный. Эта трансформация может помочь легче писать, понимать, поддерживать и расширять ваш код.
Ну и вот вам задачка, которая может попасться на собеседовании. Она не совсем тривиальна, возможно несколько подходов к решению и лучший из них не сразу очевиден — как-раз то, над чем стоит подумать.
Вам предлагается следующий пазл:
Каждая буква соответствует цифре от 0 до 9. Нужно написать программу, которая подберёт такие соответствия, чтобы написанная операция сложения была верной. Перед тем, как продолжить чтение статьи — подумайте минутку, как бы вы решили эту задачу?
Часть 2
Иногда программисты на С++ просят привести пример задачи, которая не может быть решена без использования монад. Начнём с того, что этот вопрос неверен сам по себе — это всё-равно, что спрашивать, существует ли задача, которая не может быть решена без циклов. Очевидно, если в вашем языке есть поддержка оператора goto, вы можете обойтись без использования операторов цикла. Что монады (и циклы) могут сделать для вас, это упростить ваш код и помочь лучше его структурировать. Как использование циклов превращает спагетти-код в нормальный, так и использование монад может превратить ваш код в императивном стиле в декларативный. Эта трансформация может помочь легче писать, понимать, поддерживать и расширять ваш код.
Ну и вот вам задачка, которая может попасться на собеседовании. Она не совсем тривиальна, возможно несколько подходов к решению и лучший из них не сразу очевиден — как-раз то, над чем стоит подумать.
Вам предлагается следующий пазл:
s e n d
+ m o r e
---------
m o n e y
Каждая буква соответствует цифре от 0 до 9. Нужно написать программу, которая подберёт такие соответствия, чтобы написанная операция сложения была верной. Перед тем, как продолжить чтение статьи — подумайте минутку, как бы вы решили эту задачу?
+37
Восстановление расфокусированных и смазанных изображений
10 min
223KВосстановление искаженных изображений является одной из наиболее интересных и важных проблем в задачах обработки изображений – как с теоретической, так и с практической точек зрения. Частными случаями являются размытие из-за неправильного фокуса и смаз – эти дефекты, с которым каждый из вас хорошо знаком, очень сложны в исправлении – именно они и выбраны темой статьи. С остальными искажениями (шум, неправильная экспозиция, дисторсия) человечество научилось эффективно бороться, соответствующие инструменты есть в каждом уважающем себя фоторедакторе.
Почему же для устранения смаза и расфокусировки практически ничего нету (unsharp mask не в счет) – может быть это в принципе невозможно? На самом деле возможно – соответствующий математический аппарат начал разрабатываться примерно 70 лет назад, но, как и для многих других алгоритмов обработки изображений, все это нашло широкое применение только в недавнее время. Вот, в качестве демонстрации вау-эффекта, пара картинок:
Я не стал использовать замученную Лену, а нашел свою фотку Венеции. Правое изображение честно получено из левого, причем без использования ухищрений типа 48-битного формата (в этом случае будет 100% восстановление исходного изображения) – слева самый обычный PNG, размытый искусственно. Результат впечатляет… но на практике не все так просто. Под катом подробный обзор теории и практические результаты.
Осторожно, много картинок в формате PNG!
Почему же для устранения смаза и расфокусировки практически ничего нету (unsharp mask не в счет) – может быть это в принципе невозможно? На самом деле возможно – соответствующий математический аппарат начал разрабатываться примерно 70 лет назад, но, как и для многих других алгоритмов обработки изображений, все это нашло широкое применение только в недавнее время. Вот, в качестве демонстрации вау-эффекта, пара картинок:
Я не стал использовать замученную Лену, а нашел свою фотку Венеции. Правое изображение честно получено из левого, причем без использования ухищрений типа 48-битного формата (в этом случае будет 100% восстановление исходного изображения) – слева самый обычный PNG, размытый искусственно. Результат впечатляет… но на практике не все так просто. Под катом подробный обзор теории и практические результаты.
Осторожно, много картинок в формате PNG!
+287
Гомоморфное шифрование
3 min
51KЧто это такое?
Полностью гомоморфное шифрование (Fully Homomorphic Encryption) очень долго было самым ярким открытием в молодой и бурно развивающейся области Computer Science — криптографии. Вкратце, такой тип шифрования позволяет делать произвольные вычисления на зашифрованных данных без их расшифровки. Например, гугл может осуществлять поиск по запросу не зная, что это за запрос, можно фильтровать спам, не читая писем, подсчитывать голоса, не вскрывая конверты с голосами, делать DNA тесты, не читая DNA и многое, многое другое.
То есть, человек/машина/сервер, производящий вычисления, делает механические операции с шифрами, исполняя свой алгоритм (поиск в базе данных, анализ на спам, и т.д.), но при этом не имеет никакого понятия о зашифрованной внутри информации. Только пользователь зашифровавший свои данные может расшифровать результат вычисления.
Здорово, правда? И это не из области фантастики — это то, что уже можно «теоретически» воплотить в жизнь.
+52
Lock-free структуры данных. Concurrent maps: деревья
8 min
23K Это последняя, на сегодняшний день, статья из цикла про внутреннее устройство конкурентных ассоциативных контейнеров. В предыдущих статьях рассматривались hash map, был построен алгоритм lock-free ordered list и контейнеры на его основе. За бортом остался один важный тип структур данных — деревья. Пришло время немного рассказать и о них.
Исследования, посвященные алгоритмам конкурентных деревьев, не требующих внешней синхронизации доступа к ним, начались довольно давно — в 70-х годах прошлого века, — и были инициированы развитием СУБД, поэтому касались в основном оптимизации страничных деревьев (B-tree и его модификации).
Развитие lock-free подхода в начале 2000-х не прошло мимо алгоритмов деревьев, но лишь недавно, в 2010-х годах, появилось множество действительно интересных работ по конкурентным деревьям. Алгоритмы деревьев довольно сложны, поэтому исследователям потребовалось время — порядка 10 лет — на их lock-free/non-blocking адаптацию. В данной статье мы рассмотрим самый простой случай — обычное бинарное дерево, даже не самобалансирующееся.
Исследования, посвященные алгоритмам конкурентных деревьев, не требующих внешней синхронизации доступа к ним, начались довольно давно — в 70-х годах прошлого века, — и были инициированы развитием СУБД, поэтому касались в основном оптимизации страничных деревьев (B-tree и его модификации).
Развитие lock-free подхода в начале 2000-х не прошло мимо алгоритмов деревьев, но лишь недавно, в 2010-х годах, появилось множество действительно интересных работ по конкурентным деревьям. Алгоритмы деревьев довольно сложны, поэтому исследователям потребовалось время — порядка 10 лет — на их lock-free/non-blocking адаптацию. В данной статье мы рассмотрим самый простой случай — обычное бинарное дерево, даже не самобалансирующееся.
+32
Задача о 64 монетах, двух заключённых и одной шахматной доске
6 min
154KTranslation
Примечание переводчика: я заменил оригинальные обозначения сторон монеты head/tail на аверс/реверс, чтобы не вносить путаницу русскоязычными орёл/решка. На иллюстрации выше слева аверс (head), справа реверс (tail).
Спасение невозможно?
Это одна из тех типичных загадок о заключённых, в которых вы приговорены к смерти и можете спастись, только если докажете свои умственные способности тюремщику. Вы и ваш друг были заключены в тюрьму. Ваш тюремщик предлагает вам испытание. Если вы его выполните, вы оба будете освобождены.
+109
Типы и функции
13 min
58KTranslation
Это третья статья в цикле «Теория категорий для программистов».
Категория типов и функций играет важную роль в программировании, так что давайте поговорим о том, что такое типы, и зачем они нам нужны.
В сообществе есть некоторое несогласие о преимуществах статической типизации против динамической и сильной типизации против слабой. Позвольте мне проиллюстрировать выбор типизации с помощью мысленного эксперимента. Представьте себе миллионы обезьян с клавиатурами, радостно жмущих случайные клавиши, которые пишут, компилируют и запускают программы.
Категория типов и функций играет важную роль в программировании, так что давайте поговорим о том, что такое типы, и зачем они нам нужны.
Кому нужны типы?
В сообществе есть некоторое несогласие о преимуществах статической типизации против динамической и сильной типизации против слабой. Позвольте мне проиллюстрировать выбор типизации с помощью мысленного эксперимента. Представьте себе миллионы обезьян с клавиатурами, радостно жмущих случайные клавиши, которые пишут, компилируют и запускают программы.
+36
Категории, большие и малые
8 min
36KTranslation
Это четвертая статья в цикле «Теория категорий для программистов».
Понять пользу категорий можно изучая различные примеры. Категории бывают всех форм и размеров и часто появляются в самых неожиданных местах. Мы начнем с самых простых.
Самая простая категория — без объектов и, как следствие, без морфизмов.
Понять пользу категорий можно изучая различные примеры. Категории бывают всех форм и размеров и часто появляются в самых неожиданных местах. Мы начнем с самых простых.
Без объектов
Самая простая категория — без объектов и, как следствие, без морфизмов.
+30
Как работают ленивые вычисления
10 min
44KTutorial
Translation
Маленькая Лямбда решила, что уборку в комнате можно отложить и на потом.
Ленивые вычисления — часто используемая методика при исполнении компьютером программ на Haskell. Они делают наш код проще и модульнее, но могут вызвать и замешательство, особенно когда речь заходит об использовании памяти, становясь для новичков распространённой ловушкой. Например, безобидно выглядящее выражение
В этом руководстве я хочу объяснить, как работают ленивые вычисления и что они означают для времени выполнения и объёма памяти, затрачиваемыми программами на Haskell. Я начну рассказ с основ редукции графов, а после перейду к обсуждению строгой левой свёртки — простейшего примера для понимания и ликвидации утечек памяти.
Тема ленивых вычислений рассматривалась во многих учебниках (например, в книге Саймона Томпсона «Haskell — The Craft of Functional Programming»), но информацию о них, кажется, всё ещё проблематично найти в сети. Надеюсь, моё руководство посодействует решению этой проблемы.
Ленивые вычисления — это компромисс. С одной стороны, они помогают нам сделать код более модульным. С другой стороны, бывает невозможно до конца разобраться, как происходит вычисление в конкретной программе — всегда существуют небольшие отличия между реальностью и тем, что вы о ней думаете. В конце статьи я дам рекомендации, как поступать в ситуациях такого рода. Итак, приступим!
Ленивые вычисления — часто используемая методика при исполнении компьютером программ на Haskell. Они делают наш код проще и модульнее, но могут вызвать и замешательство, особенно когда речь заходит об использовании памяти, становясь для новичков распространённой ловушкой. Например, безобидно выглядящее выражение
foldl (+) 0 [1..10^8]
потребует для своего вычисления гигабайты памяти.В этом руководстве я хочу объяснить, как работают ленивые вычисления и что они означают для времени выполнения и объёма памяти, затрачиваемыми программами на Haskell. Я начну рассказ с основ редукции графов, а после перейду к обсуждению строгой левой свёртки — простейшего примера для понимания и ликвидации утечек памяти.
Тема ленивых вычислений рассматривалась во многих учебниках (например, в книге Саймона Томпсона «Haskell — The Craft of Functional Programming»), но информацию о них, кажется, всё ещё проблематично найти в сети. Надеюсь, моё руководство посодействует решению этой проблемы.
Ленивые вычисления — это компромисс. С одной стороны, они помогают нам сделать код более модульным. С другой стороны, бывает невозможно до конца разобраться, как происходит вычисление в конкретной программе — всегда существуют небольшие отличия между реальностью и тем, что вы о ней думаете. В конце статьи я дам рекомендации, как поступать в ситуациях такого рода. Итак, приступим!
+47
Играем с генетическими алгоритмами
6 min
102KОдним субботним декабрьским вечером сидел я над книгой The Blind Watchmaker (Слепой Часовщик), как на глаза мне попался невероятно интересный эксперимент: возьмём любое предложение, например Шекспировскую строку: Methinks it is like a weasel и случайную строку такой же длины: wdltmnlt dtjbkwirzrezlmqco p и начнем вносить в неё случайные изменения. Через сколько поколений эта случайная строка превратится в Шекспировскую строку, если выживать будут лишь потомки более похожие на Шекспировскую?
Сегодня мы повторим этот эксперимент, но в уже совершенно другом масштабе.
Структура статьи:
Осторожно трафик!
Сегодня мы повторим этот эксперимент, но в уже совершенно другом масштабе.
Структура статьи:
- Что такое генетический алгоритм
- Почему это работает
- Формализуем задачу со случайной строкой
- Пример работы алгоритма
- Эксперименты с классикой
- Код и данные
- Выводы
Осторожно трафик!
+43
О решении неполного кубического уравнения
5 min
44KTutorial
Intro
Я публикую этот топик как обучающий. Собственно говоря, существенной новизны в материале нет, тема заезжена. Думаю, что интересным будет подход к решению задачи.
Помню, на первом курсе на занятиях по математическому анализу пришел в голову один интеграл. Преподаватель вызвал к доске, но прозвенел звонок. По дороге домой в автобусе сложился «скелет» решения кубического уравнения. Общая схема, конечно, не самая рациональная. Есть более эффективная — тригонометрическая формула Виета. Там сразу выписывается корень по виду уравнения, а, вообще, по объему вычислений все-таки лучше использовать численный метод Ньютона, поскольку степенные ряды для обратных тригонометрических функций сходятся медленно (по ним строятся вычисления таких функций в некоторых библиотеках). Вот что получилось.
+25
Ад визуализации 1.1 — Решения и заключение
5 min
14KTranslation
- Книга 1: Обзор
- Книга 2: Проблемы
- Книга 3: Решения
- Книга 4: Заключение
Теперь самое интересное! Здесь я представлю вам некоторые решения, которые я нашел во время своего исследования. Надеюсь, они дадут вам общее представление о том, как оптимизировать игровые ресурсы с точки зрения процесса визуализации.
+7
В мире математических парадоксов
6 min
113KДоброго времени суток, уважаемое хабрасообщество.
Сегодня я хотел бы затронуть такую увлекательную тему, как математические парадоксы. По данной теме на хабре уже было опубликовано несколько замечательных статей (1,2,3,4,5), но в математике интересные парадоксы этой выборкой далеко не исчерпываются.
Поэтому попробуем рассмотреть другие занимательные парадоксы (а некоторые и «не совсем» парадоксы), которые пока еще не получили здесь должного освещения.
+70
«Математика – один из видов искусства»: пост к столетию со дня рождения Мартина Гарднера
3 min
59KTutorial
Translation
Перевод поста Эда Пегга Младшего (Ed Pegg Jr) "Martin Gardner’s 100th Birthday"
Я думаю, содержание этого поста будет интересно всем, кто любит математику и ее красоту, всем, кто знаком с замечательными книгами и задачами Мартина Гарднера, а также будет полезно учителям, школьникам и студентам. Все ссылки в данном посте ведут на сайты Wolfram Demonstrations Project (коллекция бесплатных интерактивных демонстраций, созданных пользователями системы Mathematica на языке Wolfram Language с помощью технологии Computable Document Format (CDF), при этом для вас доступны исходные коды всех демонстраций, а значит, вы можете каждую из них скачать, изучить и изменить под себя) и Wolfram MathWorld (крупнейшая и самая авторитетная онлайн-энциклопедия по математике).
+72
Что такое принцип неопределенности Гейзенберга?
1 min
38KСогласно принципу неопределенности Гейзенберга, невозможно одновременно знать точное положение и точную скорость объекта. Но почему так? Потому что каждый объект во Вселенной ведет себя и как частица, и как волна. В видео Чед Орзэл объясняет эту сложную идею из квантовой физики.
+17
Мелочи мышления или статья о дендритных шипиках
12 min
50KНесколько месяцев назад был опубликован цикл статей под общим названием «Логика мышления». Оптимистично планировалось продолжить его через месяц-другой. Но жизнь внесла свои коррективы. Моделирование паттерно-волновой модели коры дало настолько интересные результаты, что пришлось на время отложить все остальное, в том числе и написание продолжения цикла для хабра.
Однако, не так давно я написал и выложил на препринт статью (http://arxiv.org/abs/1406.6901). В чем-то она может быть интересна тем, кто ранее заинтересовался волновой моделью. Напомню, что ключевой момент модели – это утверждение, что нейроны способны запоминать и узнавать не один единственный образ, описываемый весами его синапсов, а еще и огромное количество других отличных от этого образа сигналов. Конечно, такое усложнение нейрона идет в разрез со многими существующими теориями и требует более, чем серьезного обоснования. Ниже я, как раз, и попробую описать один из приведенных в статье аргументов в пользу моей модели.
+53
Эксперимент, который навсегда изменил наше представление о реальности
7 min
275KTranslation
Принцип неопределенности говорит, что мы не можем знать определённые свойства квантовой системы в один и тот же момент времени. Например, мы не можем одновременно узнать положение частицы и ее скорость. Но что это говорит нам о реальном мире? Если бы мы могли заглянуть за кулисы квантовой теории, обнаружили бы мы, что объекты действительно обладают определенным положением и скоростью? Или принцип неопределенности означает, что на фундаментальном уровне объекты просто не имеют четкой координаты и импульса одновременно. Другими словами, неполна ли наша теория или реальность «размыта» на самом деле?
+119
Логика мышления. Часть 11. Динамические нейронные сети. Ассоциативность
7 min
43KЭтот цикл статей описывает волновую модель мозга, серьезно отличающуюся от традиционных моделей. Настоятельно рекомендую тем, кто только присоединился, начинать чтение с первой части.
Наиболее просты для понимания и моделирования нейронные сети, в которых информация последовательно распространяется от слоя к слою. Подав сигнал на вход, можно так же последовательно рассчитать состояние каждого из слоев. Эти состояния можно трактовать как набор описаний входного сигнала. Пока не изменится входной сигнал, останется неизменным и его описание.
Более сложная ситуация возникает, если ввести в нейронную сеть обратные связи. Чтобы рассчитать состояние такой сети, уже недостаточно одного прохода. Как только мы изменим состояние сети в соответствии с входным сигналом, обратные связи изменят входную картину, что потребует нового пересчета состояния всей сети, и так далее.
Идеология рекуррентной сети зависит от того, как соотносится задержка обратной связи и интервал смены образов. Если задержка много меньше интервала смены, то нас, скорее всего, интересуют только конечные равновесные состояния, и промежуточные итерации стоит воспринимать, как исключительно расчетную процедуру. Если же они сопоставимы, то на первый план выходит именно динамика сети.
+31
Теория памяти человека, зачатки ИИ
3 min
39KТеория памяти человека, зачатки ИИ
Наверняка всем Вам очень хорошо известны такие моменты, когда нужно что-то вспомнить, но извлечь информацию из мозга становится большим пазлом.
Почему же такое происходит. Для начала немного теории работы нейрона, можно почитать тут или тут
Предположим, а может так оно и есть, все нейроны объединены в одни очень большой граф со сложной структурой. Данная структура сложна и не может работать хаотично, т.е. передаваемые импульсы передаются строго в определённом порядке, поэтому тут есть 2 варианта:
- Ребра графа имеют только положительные веса
- Ребра графа могут иметь, как положительные так и отрицательные веса
Рассматривая второй случай в реальной работе памяти человека, можно предположить, что такая ситуация возникает при провалах памяти человека, т.е. к нейрону содержащему ту информацию которая нам необходимо либо поступает недостаточно сигналов, для накопления и дальнейшей передачи, либо этих сигналов вообще нет. В случае с графами это можно представить, как узел у которого мало путей, либо они отрицательны, либо их вообще нет (рис 1).
Что же касается первого случая, когда все ребра имеют положительные веса, т.е. головной мозг человека не поврежден. Тогда почему же человек не может вспомнить моменты из своего детства? Ответ прост: “Любое тело стремится к покою”, так же и наша с вами нейронная сеть старается оптимизировать свою работу. (Владельцам навигаторов должно быть знакомо, что прокладка маршрута, как раз таки строится на принципах работы графа, нахождения кратчайшего пути и т.д.). Мозг человека более изощренная система и его оптимизация заключается в разрыве связей с малыми весами, и построении новых связей с более высокими. (рис. 2). Таким образом объяснятся многочисленные разрывы и новые соединения нейронов. Чем больше узел имеет связей, тем легче вспомнить необходимую информацию.
+7
Information
- Rating
- Does not participate
- Location
- Москва, Москва и Московская обл., Россия
- Date of birth
- Registered
- Activity