Search
Write a publication
Pull to refresh
27
0
Maksim @MuLLtiQ

Software engineer

Send message

О бедной рекурсии замолвите слово, или всё, что вы не знали и не хотите о ней знать

Reading time8 min
Views79K
Рекурсия: см. рекурсия.

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

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

— Как она сложена?
— Превосходно! Только рука немного торчит из чемодана.

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

  def fib(n):
    if n<0: raise Exception("fib(n) defined for n>=0")
    if n>1: return fib(n-1) + fib(n-2)
    return n

приходится городить всевозможные грязные хаки, начиная от:

  @memoized
  def fib(n):
    if n<0: raise Exception("fib(n) defined for n>=0")
    if n>1: return fib(n-1) + fib(n-2)
    return n

И заканчивая вообще:

  def fib(n):
    if n<0: raise Exception("fib(n) defined for n>=0")
    n0 = 0
    n1 = 1
    for k in range(n):
      n0, n1 = n1, n0+n1
    return n0

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

Линейная алгебра: пробный заезд

Reading time7 min
Views149K
Привет, Хабр!

Аналит, линейка, линал — эти слова ассоциируются скорее с фразой «сдать и забыть», а не с тем, для чего на самом деле нужен замечательный раздел математики под названием линейная алгебра. Давайте попробуем посмотреть на него с разных сторон и разберемся, что же в нем хорошего и почему он так полезен в приложениях.

Часто первое знакомство с линейной алгеброй выглядит как-то так:

image

Не очень вдохновляет, правда? Сразу возникает два вопроса: откуда это все взялось и зачем оно нужно.

Начнем с практики


Когда я занимался вычислительной гидродинамикой (CFD), один из коллег говорил: «Мы не решаем уравнения Навье-Стокса. Мы обращаем матрицы.» И действительно, линейная алгебра — «рабочая лошадка» вычислительной математики:


Читаем дальше...

Многопоточность в Rust

Reading time14 min
Views38K
Rust начинался как проект, решающий две трудные проблемы:

  • Как обеспечить безопасность (работы с памятью) в системном программировании?
  • Как сделать многопоточное программирование безболезненным?

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

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

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

С точки зрения многопоточности это означает, что вы можете пользоваться различными парадигмами (передача сообщений, разделяемое состояние, lock-free-структуры данных, чистое функциональное программирование), и Rust позволит избежать наиболее распространённых подводных камней.

Вот какие особенности у многопоточного программирования в Rust:
Читать дальше →

Dagaz: Пинки здравому смыслу (часть 5)

Reading time11 min
Views15K
imageПо обеим сторонам нашего плоского бытия
бесконечно глубоко и далеко
простирается сама жизнь.
 
         Чарлз Ховард Хинтон «Эпизод из жизни Флатландии»
 
 

— Надо было ходить пешкой на е-один-дельта-аш…
— Тогда летит четвертый конь.
— Пусть. Пешки выходят в пространство слонов…
— Какое пространство слонов? Где ты взял пространство слонов?! Ты же девятый ход неверно записал!

Многие наверняка помнят этот отрывок из незабвенного "Полдня" Аркадия и Бориса Стругацких. Люди «Полдня» почти такие же как мы, но умнее и лучше нас. Они покоряют космос и играют в четырёхмерные шахматы. Авторы "Звёздного пути" также не обошли тему настольных игр стороной, но, в их случае, Спок играет в шахматы в трёх измерениях:



Выход за привычные нам пределы двумерной шахматной доски символизирует интеллектуальную мощь людей будущего и, по замыслу авторов, делает игру более интересной. Так ли это? Что, на самом деле, могут дать настольным играм третье и последующие за ним измерения?
Читать дальше →

Весёлые картинки с конкурса на логотип и название национальной платёжной карты

Reading time2 min
Views24K
Банк России и Национальная система платёжных карт (НСПК) проводят конкурс на разработку логотипа и названия банковской карты, которая должна будет стать конкурентом Visa и Mastercard на территории России. Приём работ на сайте конкурса продлится до 30 апреля, а с 11 по 22 мая будет проведено голосование. Победителя объявят 28 мая, главный приз – 150000 рублей.

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

(Архив) 10 причин попробовать Матрешку

Reading time3 min
Views27K
image

1. Чистый JavaScript и HTML


Многие фреймворки пытаются починить веб, создавая собственный язык программирования. Идея Матрешки проста: с вебом всё в порядке. Вся логика, которую пишет программист, находится, как и должна, в JavaScript файлах, а HTML остаётся языком разметки гипертекста. Шутка об HTML программисте должна остаться шуткой.

2. Минимум сущностей


Матрешка не требует создания избыточных сущностей. Благодаря простому синтаксису привязок, связь между JavaScript и HTML может быть описана там же, где и логика. Программисту не требуется задумываться сразу о нескольких вещах, размышляя о балансе полномочий объектов. Вопрос где прописать обработчик: во “вьюхе” или в контроллере отпадает сам по себе. Хотя, никто не запрещает разделить данные и контроллер, разместив их в разных JS файлах.

3. Работай с данными, забудь о представлении


Попробовав популярный (но уступающий под натиском более современных продуктов) фреймворк Backbone, сталкиваешься с серьезным неудобством: объявляя данные, зависящие от UI и UI, зависящий от данных, вам, как правило, требуется создать два обработчика события. Один ловит изменения данных, второй ловит пользовательские действия. Проблема подкрепляется еще тем, что HTML элементы, как правило, совершенно идентичны в рамках приложения: input, select, кастомные виджеты из jQuery UI могут многократно встречаться на странице. Программисту, который реализует еще одну “единицу” приложения (например, форму), приходится пользоваться “копипастой”.

С Матрешкой всё намного проще. Вам нужно лишь однажды объявить привязку (в одном месте, а не в двух), затем работать с данными (как с обычными JavaScript объектами), забыв, что у нас вообще есть представление.
Читать дальше →

Exploring JavaScript Symbols. Использование символов

Reading time5 min
Views12K
Это вторая статья из серии про символы и их использование в JavaScript. Предыдущая часть: «Symbol — новый тип данных в JavaScript».

С появлением символов объект Object был расширен одним методом, который позволяет получить все символы объекта:

	var role = Symbol('role');
	var score = Symbol('score');
	var id = 100;
	var name = 'Moderator';

	var user = { id: id, name: name };

	user[role] = 'admin';
	user[score] = 50000;

	Object.getOwnPropertySymbols( user ); // [Symbol(role), Symbol(score)]

Наличие этого метода лишает нас возможности создавать по-настоящему приватные свойства.
Читать дальше →

Matreshka.js 2: От простого к простому

Reading time9 min
Views23K

image


Документация на русском
Github репозиторий


Всем привет! В этой статье я расскажу, как пользоваться Matreshka.js на трех несложных примерах. Мы рассмотрим базовые возможности фреймворка, познакомимся с тем, как работать с данными и разберем коллекции.


Пост является краткой компиляцией переводов из этого репозитория.


Hello World!

Дорогой веб-дизайнер, давай перестанем нарушать возможность скроллить

Reading time3 min
Views64K


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

Релиз Rust 1.0 Beta

Reading time2 min
Views18K
Сегодня мы рады представить релиз Rust 1.0 Beta! Бета-релиз является очень важным звеном на пути к финальному релизу 1.0. В частности, в бета-релизе все библиотеки и элементы языка, которые мы собирались сделать стабильными в 1.0, отмечены как стабильные. Поэтому по бета-релизу можно весьма точно представить, что вас будет ожидать в Rust 1.0.

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

Как вычисляется среднее время до отказа и вероятность безотказной работы?

Reading time4 min
Views131K
Понятиям MTTF (Mean Time To Failure — среднее время до отказа) и другим терминам теории надежности посвящено большое количество статей, в том числе на Хабре (см., например, тут). Вместе с тем, редкие публикации «для широкого круга читателей» затрагивают вопросы математической статистики, и уж тем более они не дают ответа на вопрос о принципах расчета надежности электронной аппаратуры по известным характеристикам ее составных элементов.

В последнее время мне довольно много приходится работать с расчетами надежности и рисков, и в этой статье я постараюсь восполнить этот пробел, отталкиваясь от своего предыдущего материала (из цикла о машинном обучении) о пуассоновском случайном процессе и подкрепляя текст вычислениями в Mathcad Express, повторить которые вы сможете скачав этот редактор (подробно о нем тут, обратите внимание, что нужна последняя версия 3.1, как и для цикла по machine learning). Сами маткадовские расчеты лежат здесь (вместе с XPS- копией).
Читать дальше →

Несмешная первоапрельская шутка от разработчиков Magic Lantern

Reading time4 min
Views79K
Magic Lantern (ML) — неофициальная прошивка для фотоаппаратов Canon, которая обеспечивает повышенную функциональность (например, dual-iso, стекинг по фокусу, raw-видео, тонкая настройка параметров съемки и многое другое). Прошивка устанавливается непосредственно на flash-карту, что позволяет безболезненно удалить ее или обновить простой заменой файлов.

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

Все описанные действия производились с использованием камеры Canon 650D со стоковой (1.01) прошивкой.

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

Быстрый поиск показал, что:
  • текущая прошивка фотоаппарата не поддерживает текущие сборки ML;
  • для модели 650D нет стабильной сборки, есть только ночные билды;
  • некоторые функции ML в 650D не работают/работают криво;
  • авторы предупреждают, что можно закирпичить фотоаппарат неверными действиями по прошивке.

После чего фотоаппарат был успешно перепрошит на последнюю официальную версию для Canon 650D 1.04. И строго по инструкции, со сбросом всех настроек и полным форматированием карты, был установлен последний ночной билд Magic Lantern (от 28 марта).
Читать дальше →

Генетический алгоритм — наглядная реализация

Reading time7 min
Views101K
Года четыре назад, в универе услышал о таком методе оптимизации, как генетический алгоритм. О нем везде сообщалось ровно два факта: он клёвый и он не работает. Вернее, работает, но медленно, ненадежно, и нигде его не стоит использовать. Зато он красиво может продемонстрировать механизмы эволюции. В этой статье я покажу красивый способ вживую посмотреть на процессы эволюции на примере работы этого простого метода. Нужно лишь немного математики, программирования и все это приправить воображением.

Кратко об алгоритме


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

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

Чем хороши свободные монады

Reading time10 min
Views19K
Предлагаю читателям «Хабрахабра» перевод статьи «Why free monads matter».

Интерпретаторы


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

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

Создание мультиплеерного 3D-шутера на Webgl без опыта и денег

Reading time9 min
Views36K
Это первая часть истории о том, как маленькая команда веб-разработчиков разработала мультиплеерный 3d-шутер без опыта в геймдеве, больших денег и штата сотрудников.

Дисклеймер: некоторые описанные в статье решения могут вызывать фейспалм.




2011 год. С чего все началось


В 2011 году мы были маленькой питерской веб-студией из 4 человек. Тимлид/сеошник, программист (вернее считал себя программистом), дизайнер и менеджер по продажам. На тот момент тимлид и программист занимались сайтами уже 3 года, но особых успехов на этом поприще не достигли. Хотя мы имели уже несколько постоянных клиентов на продвижении и обслуживании, но львиную долю дохода съедали налоги, аренда офиса и прочие расходы. Оставшихся копеек на четырех человек явно не хватало. Хроническое безденежье и отсутствие перспектив угнетали. Дизайнер уже навострил лыжи, да и остальные члены команды едва держались. Вот в такой обстановке и пришла в голову потрясающая по наивности мысль: «чего это мы все для всяких дядь делаем проекты, а давайте свое что-нибудь сделаем, например, игру браузерную и запилим её во вконтакте». Все, кроме дизайнера, восприняли идею с воодушевлением.
Читать дальше →

Backslant – шаблонизатор в стиле slim

Reading time3 min
Views6.5K
Захотелось мне сделать шаблонизатор, чтобы как slim, теги чтобы автоматом закрывались и прочее. Красиво же так:
html
  head
    title
        - yield "Плюшка!" + " Чашка чаю!"


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

А и еще можно кстати угореть так уж угореть — а пусть шаблоны через новый механизм импорта в python 3 тянутся. И если надо что-то от другого шаблона себе вставить, то тоже пусть также работает.

А еще, еще пусть каждый шаблон это генератор!

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

Топ-5 самых дурацких антивирусов. Записки хулигана

Reading time4 min
Views101K
Дисклеймер: всему сказанному ниже «верить нельзя не верить». Запятую поставьте сами.

На носу 1 апреля, а многие из вас все еще пользуются скучными и устаревшими антивирусами. А ведь если побродить по разным софт-каталогам и поискать чего-нибудь на слово антивирус, можно найти ну очень интересные вещи.
Читать дальше →

Ещё один Радио-86РК

Reading time2 min
Views15K
В далёком 1989-м году, когда мне было 15 лет, я, как и многие в те времена, спаял, популярный тогда компьютер – Радио-86РК.

В 1992-м году он выпал из поля моего зрения, но внезапно приятель провёл маленькое расследование и отыскал его. Сложно передать словами, насколько мне было приятно и интересно взглянуть на это своё детище. Многие нюансы уже стёрлись из памяти.

Схемотехнику этой модели, по-моему, не раз обозревали на Хабре, поэтому нет особого смысла повторяться. Мой пост о конструктивных особенностях именно этого изделия, собранного простым советским студентом техникума, поэтому дальше много фотографий.
Читать дальше →

Github вторые сутки держится против DDoS-атаки

Reading time2 min
Views18K
Github более 24 часов выдерживает непрерывную DDoS-атаку. О текущем состоянии периодически сообщают в твиттере @GithubStatus и на странице https://status.github.com/.

Сервис уже недоступен для части пользователей. Последнее сообщение в твиттере два часа назад.
Читать дальше →

Information

Rating
Does not participate
Date of birth
Registered
Activity