• Видеолекции: unix way

    • Tutorial

    Карантин – чудесное время, чтобы чему-нибудь научиться. Однако, как вы понимаете, чтобы кто-то чему-то научился, кто-то должен учить. Если у вас есть презентация, с которой вы хотите выступить перед миллионной аудиторией, снискав мировую славу, то эта статья – для вас. Здесь будет пошаговая инструкция, как из презентации сделать видеоролик.

    Путь записи «звуковых комментариев» в PowerPoint и экспорта презентации в видео мы отметаем, как тривиальный и не дающий десятой доли тех возможностей, какие нужны для по-настоящему классного ролика.

    Для начала определимся, какие кадры нам понадобятся:

    1. Собственно слайды с закадровым голосом
    2. Смена слайдов
    3. Цитаты-перебивки из популярных фильмов
    4. Несколько кадров с физиономией лектора и любимым котом (опционально)

    Итак
    • +12
    • 2,6k
    • 5
  • Статически безопасная динамическая типизация à la Python

      Привет, Хабр.


      На днях в одном моём хобби-проекте возникла задача написания хранилища метрик.


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


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

      Читать дальше →
      • +23
      • 3,5k
      • 9
    • Обобщение задачи Брокара

      История


      Гильберт в 1900 году на II Международном конгрессе математиков в Париже отметил практическую важность теории чисел. Решение абстрактных задач часто приводило к появлению нового математического аппарата. Ярким примером служит Великая Теорема Ферма, в ходе доказательства которой в конце XX-ого века были исследованы мероморфные функции, применяющиеся современными инженерами-конструкторами на авто- и авиазаводах, а также IT-специалистами в рамках имитационного моделирования. Задачи о "красивых числах" — простых близнецах и совершенных числах, считавшиеся в Древней Греции практически бесполезными, теперь обеспечивают современную криптографию устойчивыми алгоритмами генерации ключей.


      В 1913 году Рамануджан популяризирует неопределённое уравнение:

      $n!+1=m^2 (1)$


      Ранее оно фигурировало в работах Анри Брокара. Как утверждают историки, два математика занялись изучением указанного уравнения независимо друг от друга. Очевидно, факториал растёт быстрее квадрата, поэтому первые решения можно быстро получить перебором значений n.
      Читать дальше →
      • +18
      • 5,5k
      • 8
    • Основы современного искусственного интеллекта: как он работает, и уничтожит ли наше общество уже в этом году?

      • Перевод

      Сегодняшний ИИ технически «слабый» – однако он сложный и может значительно повлиять на общество



      Не нужно быть Киром Дулли, чтобы знать, насколько пугающим может стать хорошо соображающий искусственный интеллект [американский актёр, исполнявший роль астронавта Дэйва Боумена в фильме «Космическая одиссея 2001 года» / прим. перев.]

      ИИ, или искусственный интеллект, сейчас одна из самых важных областей знания. Решаются «нерешаемые» задачи, инвестируются миллиарды долларов, а Microsoft даже нанимает Коммона, чтобы он рассказал нам поэтическим штилем, какая это замечательная штука – ИИ. Вот ведь.
      Читать дальше →
    • «Топологическая» сортировка графа с циклами

      Полное название статьи должно было звучать как «Устойчивая „топологическая“ сортировка графа с циклами за O(|V| + |e| log |e|) по времени и O(|V|) по памяти без рекурсии», но мне сказали, что это перебор.
      Читать дальше →
    • Julia: типы, мультиметоды и арифметика над полиномами

        В этой публикации речь пойдёт об основной, на мой взгляд, отличительной особенности языка Julia — представлении функций в виде методов с множественной диспетчеризацией. Это позволяет повысить производительность вычислений, не снижая читаемости кода и не портя абстрагируемость, с одной стороны, и позволяет работать с математическими понятиями в более привычной нотации, с другой. Для примера рассмотрен вопрос единообразной (с точки зрения линейных операций) работы с полиномами в представлении списка коэффициентов и с интерполяционными полиномами.
        Читать дальше →
      • Отсеиваем простые из миллиарда чисел быстрее, чем в Википедии

          (Источник рисунка )

          Общеизвестно, что Решето Эратосфена (РЭ) один из древнейших алгоритмов, появившийся задолго до изобретения компьютеров. Поэтому можно подумать, что за века этот алгоритм изучен вдоль и поперек и добавить к нему ничего невозможно. Если посмотреть Википедию – там море ссылок на авторитетные источники, в которых запросто утонуть. Поэтому удивился, когда на днях случайно обнаружил, что вариант, который в Википедии преподносится как оптимальный, можно заметно оптимизировать.
          Читать дальше →
        • Введение в Python

            В данной статье мы затронем основы Python. Мы все ближе и ближе к цели, в общем, скоро приступим к работе с основными библиотеками для Data Science и будем использовать TensorFlow (для написания и развертывания нейросетей, тобишь Deep Learning).

            Установка


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

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

            Пробельные символы


            Во многих языках программирования для разграничения блоков кода используются
            фигурные скобки. В Python используются отступы:

            # пример отступов во вложенных циклах for
            for i in [ 1, 2, 3, 4, 5] :
            print (i) # первая строка в блоке for i
            for j in (1, 2, З, 4, 5 ] :
            print ( j ) # первая строка в блоке for j
            print (i + j) # последняя строка в блоке for j
            print (i) # последняя строка в блоке for i
            print ( "циклы закончились ")
            Читать дальше →
          • Создание надёжного и проверяемого ИИ: соответствие спецификациям, надёжное обучение и формальная верификация

            • Перевод
            Ошибки и ПО шли рука об руку с самого начала эпохи программирования компьютеров. Со временем разработчики выработали набор практик по тестированию и отладке программ до их развёртывания, однако эти практики уже не подходят к современным системам с глубоким обучением. Сегодня основной практикой в области машинного обучения можно назвать тренировку на определённом наборе данных с последующей проверкой на другом наборе. Таким способом можно подсчитать среднюю эффективность работы моделей, однако важно также гарантировать надёжность, то есть приемлемую эффективность в худшем случае. В данной статье мы опишем три подхода для точного определения и устранения ошибок в обученных прогнозирующих моделях: состязательное тестирование [adversarial testing], устойчивое обучение [robust learning] и формальную верификацию [formal verification].

            Системы с МО по определению не устойчивы. Даже системы, выигрывающие у человека в определённой области, могут не справиться с решением простых задач при внесении малозаметных различий. К примеру, рассмотрим проблему внесения возмущений в изображения: нейросеть, способную классифицировать изображения лучше людей, легко заставить поверить в то, что ленивец – это гоночный автомобиль, добавив небольшую долю тщательно рассчитанного шума в изображение.
            Читать дальше →
            • +10
            • 2,7k
            • 1
          • Хватит спорить про функциональное программирование и ООП

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

              Статьи на тему «ФП лучше» или «ООП лучше» напоминают дебаты, что же лучше для обеда, вилка или ложка. Традиционно джуны начинали с ложки, но кто-то очень авторитетный однажды поведал, что ест только мясо и использует вилку, поэтому зародилась новая мода — есть вилкой. Ей едят и каши, и супы, и даже умудряются лакать смузи. Интернет завален статьями, какие мы молодцы, что научились есть смузи вилкой и преодолели все грабли. Это и смешно и грустно, с одной стороны, даёт конкурентное преимущество бывалым ребятам, которые показывают сверхрезультаты просто игнорируя этот хайп, с другой, приходится переучивать коллег и сотрудников, вычищая из их головы нанесённый ветром мусор. В этой статье я постараюсь рассказать своё видение, которое не претендует на абсолютную истину, но очень хорошо работает на практике
              Читать дальше →
            • Лабиринты: классификация, генерирование, поиск решений

              • Перевод

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

              Классификация лабиринтов


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



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

                Вычислительный кластер Google Compute Engine за 121 день на 25 виртуальных машинах рассчитал наибольшее количество цифр в числе пи, установив новый мировой рекорд: 31,4 триллиона знаков после запятой. Это первый раз, когда для расчёта числа пи такой величины использовалось общедоступное облачное программное обеспечение.

                Рекорд будет записан на имя Эммы Харуки Ивао (Emma Haruka Iwao) из подразделения высокопроизводительных вычислений в Google. Именно она использовала инфраструктуру Google Cloud для вычислений. Предыдущий мировой рекорд был установлен Питером Трубом в 2016 году, он рассчитал число до 22,4 триллиона цифр на специально сделанном сервере, который тоже спонсировал работодатель.
                Читать дальше →
              • Дефекты лайков

                  Вместо эпиграфа.

                  Больше всего лайков собирают «котики». Можно ли это считать признаком эпидемии токсоплазмоза?


                  image

                  В 1636 году, некий француз, Пьер де Ферма, по образованию и профессии юрист, написал трактат «Введение к теории плоских и пространственных мест», где изложил то, что сейчас называется аналитической геометрией. Его работа никого не заинтересовала и он, выражаясь на современном сленге, был отправлен в «игнор», что задержало развитие математики на 70 лет, пока работами Ферма не заинтересовался Эйлер.

                  С 1856 по 1863 год австрийский монах Грегор Иоганн Мендель проводил опыты на горохе в монастырском саду и открыл основные законы современной генетики, известные нам как «Законы Менделя».

                  8 марта 1865 года Мендель опубликовал результаты своих опытов. Но работа не вызвала интереса у профессионалов. Менделя тоже отправили в «игнор».

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

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

                  Читать дальше →
                • Устранение рекурсии в Python

                  Привет, Хабр! Представляю вашему вниманию перевод статьи "Removing a recursion in Python, part 1" автора Эрика Липперта (Eric Lippert).


                  На протяжении последних 20 лет я восхищался простоте и возможностям Python, хотя на самом деле никогда не работал с ним и не изучал подробно.


                  В последнее время я присмотрелся к нему поближе — и он оказался действительно приятным языком.


                  Недавний вопрос на StackOverflow заставил меня задуматься, как преобразовать рекурсивный алгоритм в итеративный, и оказалось, что Python довольно подходящий язык для этого.
                  Проблема с которой столкнулся автор вопроса заключалась в следующем:

                  Читать дальше →
                • Что такое логическое программирование и зачем оно нам нужно


                    У того, кто в детстве не писал на Прологе — нет сердца, а у того, кто пишет на нём сегодня — нет мозгов. (оригинал)

                    Если вас всегда терзали мучительные сомнения — что за фигня это Логическое Программирование (ЛП) и вообще зачем оно нужно? То это статья для вас.


                    Можно по-разному разделить языки программирования на группы (часто их называют парадигмами программирования), например, вот так:


                    • структурное: программа разбивается на блоки — подпрограммы (изолированные друг от друга), а основными элементами управления являются последовательность команд, ветвление и цикл.
                    • объектно-ориентированное: задача моделируется в виде объектов, которые отправляют друг другу сообщения. Объекты обладают свойствами и методами. Абстракция. Инкапсуляция. Полиморфизм. Ну в общем, все в курсе.
                    • функциональное: базовым элементом является функция и сама задача моделируется в виде функции, а, точнее, чаще всего в виде их композиции, если f(.) и g(.) — это функции, то f(g(.)) — это их композиция.
                    • логическое: вот тут, как правило, начинается феерия — если про первые три написаны сотни статей, книг, обзоров, презентаций и учебников, то здесь мы в лучшем случае видим что-то про Prolog и разработки времён Pink Floyd и Procol Harum (ну хоть с музыкой им тогда повезло) и на этом история заканчивается.

                    Вот эту оплошность я и собираюсь сегодня исправить.


                    Важнейший тезис этой статьи:


                    Логическое программирование != Prolog.

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


                    Структура статьи:


                    • Что такое Пролог и почему он вам скорее всего не нужен
                    • Зачем оно надо, или краткое введение в Answer Set Programming
                    • Решаем задачи на ASP
                    • Комбинаторная оптимизация
                    • Вероятностное ЛП: ProbLog
                    • ЛП на классической логике FO(.) и IDP
                    • Sketched Answer Set Programming
                    • Экспериментальный анализ
                    • Тестирование и корректность программ
                    • Заключение
                    Читать дальше →
                  • Цена композиции в Javascript-мире

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

                      В.Кандинский - Композиция X
                      Василий Кандинский — «Композиция X»
                      Читать дальше →
                    • Модели памяти, лежащие в основе языков программирования

                      • Перевод
                      Предлагаем вашему вниманию перевод статьи, посвящённой рассмотрению используемых в программировании моделей памяти.

                      Сегодня в программировании доминируют шесть основных моделей памяти (не путать с моделями памяти Intel 8086). Три из них проистекают из трех исторически наиболее важных языков программирования 1950-х годов — COBOL, LISP и FORTRAN, а остальные связаны с тремя исторически важными системами хранения данных: магнитная лента, иерархическая файловая система в Unix-стиле и реляционная база данных.

                      Эти модели на гораздо более глубоком уровне, чем синтаксис или даже система типов, определяют, что наши языки программирования могут или не могут делать. Давайте подробно рассмотрим эти модели, а затем обсудим некоторые возможные альтернативы и причины, почему они могут быть интересны.
                      Читать дальше →
                    • Микроядро seL4. Формальная верификация программ в реальном мире

                      • Перевод
                      Научная статья опубликована в журнале Communications of the ACM, октябрь 2018, том 61, номер 10, стр. 68−77, doi: 10.1145/3230627

                      В феврале 2017 года со взлётной площадки «Боинга» в Аризоне поднялся вертолёт с обычным заданием: облёт ближайших холмов. Он летел полностью автономно. Согласно требованиям по технике безопасности Федерального управления авиации США, пилот не прикасался к органам управления. Это был не первый автономный полёт AH-6, которого в компании называют Беспилотной Птичкой (Unmanned Little Bird, ULB). Он так летает уже много лет. Однако на этот раз посреди полёта вертолёт подвергся кибератаке. Бортовой компьютер атаковало вредоносное программное обеспечение видеокамеры, а также вирус, доставленный через заражённую флэшку, которую вставили во время техобслуживания. Атака поставила под угрозу некоторые подсистемы, но не смогла повлиять на безопасную эксплуатацию воздушного судна.
                      Читать дальше →
                    • 256 строчек голого C++: пишем трассировщик лучей с нуля за несколько часов

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

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

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

                      Итак, сегодня я покажу, как отрисовывать подобные картинки:


                      Читать дальше →