Pull to refresh
24
0
Вячеслав @DunkanVS

User

Send message

История зрения или миф о «нечленимой сложности»

Reading time12 min
Views46K
Факты не перестают существовать
оттого, что ими пренебрегают.

Олдос Хаксли

Попытаюсь развеять «миф о нечленимой сложности» на примере глаза. Его часто любят приводить в пример креационисты.

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

Я далёк от биологии, но ответ на этот вопрос могу попробовать дать, поскольку это не так сложно, как кажется, и потому, что «ничто в биологии не имеет смысла, кроме как в свете эволюции», как сказал Ф.Г. Добржанский. Только с этой позиции «необъяснимое», на первый взгляд, биологическое явление становится простым и логичным.

Вопреки мнению многих людей, наши организмы — далеко не идеал совершенства, они имеют множество недостатков. У нашего вида, например, сложное строение ступни (хотя мы давно не живём на деревьях), от которого мы получаем кучу травм; икота, доставшаяся нам от наших предков — рыб и амфибий, возвратный гортанный нерв, огибающий дугу аорты и возвращающийся назад (у жирафа он достигает длины 4 метров вместо нескольких сантиметров — я бы выгнал такого конструктора). У мужчин семенные канатики также делают петлю, огибая мочеточники. Ну и много других забавных вещей.

Отрывок из книги «Самое грандиозное шоу на Земле»
Глаз позвоночного в своем лучшем случае, скажем у ястреба или человека, это превосходный точный инструмент, способный на чудеса высокого разрешения, конкурирующий с лучшими приборами от Цейсса и Никона. Будь это не так, Цейсс и Никон напрасно бы тратили время, производя фотографии высокого разрешения для наших глаз. С другой стороны, Германн фон Гельмгольц, великий германский ученый 19 века (вы можете назвать его физиком, но его вклад в биологию и психологию еще больше), сказал о глазе:

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

Одна из причин, по которым глаз кажется лучше, чем его оценил физик Гельмгольц, в том, что позже мозг выполняет удивительную работу по улучшению изображения, как ультра-сложный автоматический фотошоп. Что касается оптики, человеческий глаз достигает качества Цейсса/Никона только в фовеальной области — центральной части сетчатки, которую мы используем для чтения. Когда мы сканируем сцену, мы передвигаем фовеальную область в разные части изображения, видя каждую в максимальной четкости и деталях, и мозговой «фотошоп» обманывает нас, заставляя думать, что мы видим всю сцену в одном и том же качестве детализации. Высококачественные Цейссы и Никоны между тем на самом деле отражают всю сцену с почти одинаковой четкостью.

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

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

Но теперь представьте, что я скажу вам, что фотоэлементы глаза направлены назад, в обратную сторону от сцены, на которую смотрят. «Провода» соединяющие светочувствительные клетки с мозгом идут через всю поверхность сетчатки, так что световые лучи должны пройти через ковер собравшихся проводков перед тем, как попасть на светочувствительные клетки. Это неразумно, но все и того хуже. Одно из последствий того, что светочувствительные клетки направлены назад — то, что провода, передающие данные от них, должны как-то пройти через сетчатку назад к мозгу. В глазу позвоночного они собираются к особому отверстию в сетчатке, где ныряют сквозь нее. Отверстие, заполненное нервами, называется слепым пятном, поскольку оно не видит, но «пятно» — это слишком мягко сказано, поскольку оно весьма велико, скорее, как слепая область, что тем не менее не является слишком большим неудобством для нас благодаря «автоматическому фотошопу» мозга. И снова, верните его [инструмент] назад, он не просто плохо спроектирован, это дизайн полного идиота.

Или нет? Будь это так, глаз бы ужасно видел, но это не так. Он, в действительности, очень хорош. Он хорош потому, что естественный отбор, как чистильщик работая над бесчисленным множеством мелких деталей, прошелся после большой исходной ошибки установки сетчатки задом наперед и спас высококачественный точный инструмент. Это напоминает мне сагу о телескопе Хаббла. Вы помните, он был запущен в 1990 году и, обнаружилось, что он имеет крупный дефект. Из-за незамеченной ошибки в калибровке аппарата, когда его полировали на земле, основное зеркало хотя и немного, но [функционально-] значимо отклонялось от нужной формы. Дефект обнаружился после того, как телескоп был запущен на орбиту. Решение было смело и изобретательно. Астронавты, доставленные на телескоп, успешно смонтировали на нем нечто вроде очков. После этого телескоп заработал очень хорошо, и три последующих сервисных миссии обеспечили дальнейшее улучшение. Я хочу сказать, что даже крупный дефект конструкции, грубая ошибка может быть скорректирована последующей починкой, искусность и тонкость которой при соответствующих обстоятельствах совершенно компенсируют исходную ошибку. В эволюции в основном крупные мутации, даже если они могут привести к улучшению в правильном направлении, почти всегда требуют много дальнейших поправок, операций по зачистке множеством мелких мутаций, возникающих позднее и получающих преимущество при отборе, поскольку сглаживают острые кромки, оставленные исходной крупной мутацией. Вот почему люди и ястребы видят так хорошо, несмотря на грубую ошибку в их исходной конструкции. Снова Гельмгольц:

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

Каждый организм — и результат и, одновременно, жертва своей собственной истории. На каждом шаге эволюции отбор обеспечивает решение актуальных задач, без учёта перспективы. Заглядывать в будущие перспективы развития в эволюции просто некому (кроме «Создателей» из сказок, нарушающих принцип причинности – один из основных постулатов науки). Главный механизм эволюции — преимущественное выживание и оставление потомства существами, более приспособленными к тому образу жизни, который они ведут в данный момент, в той динамично изменяющейся среде, которая их окружает. Конечно, выживание, помноженное на отрезки времени, слабо понимаемые неискушённым разумом. В каждый следующий момент приспособления, которые были достигнуты на предыдущем этапе, могут оказаться морально безнадёжно устаревшими и стать «ископаемыми» генами.
Исследовать
Total votes 64: ↑62 and ↓2+60
Comments351

Готовим ASP.NET 5, выпуск №6: Continuous Deployment с Visual Studio Team Services — полное руководство

Reading time8 min
Views12K
Вслед за замечательными анонсами с конференции Connect 2015 мы продолжаем знакомить вас со сценариями использования новых технологий и сервисов для организации непрерывной разработки и тестирования ваших приложений.

Недавно мы рассказывали о реализации непрерывных процессов разработки и тестирования с помощью Visual Studio Team Services (ранее Visual Studio Online). В статье подробно описывается как на базе репозиториев Git в Visual Studio Team Services организовать процесс разработки на базе Scrum и с помощью интеграции с Visual Studio обеспечить непрерывные процесс тестирования и разработки кода (Continuous Integration & Testing).


В этой статье мы рассмотрим следующий шаг в построении полного цикла DevOps – обеспечение непрерывного развертывания (Continuous Deployment) с помощью новых возможностей настраиваемых шаблонов сборки и публикации проектов в Visual Studio Team Services. Мы будем использовать проект на базе ASP.NET 5 и увидим как для таких проектов обеспечить полный цикл от редактирования кода до автоматической сборки и развертывания в облаке Azure (может быть любым местом).
Читать дальше →
Total votes 15: ↑13 and ↓2+11
Comments2

Защищенное TLS-соединение с использованием Boost.Asio и OpenSSL под Windows

Reading time10 min
Views53K

Введение


Однажды мне потребовалось создать защищенный канал связи между своим сервером и своим приложением. Я помнил, что в документации к Boost Asio упоминалось, что он может работать с защищенными соединениями, используя OpenSSL. Я начал искать информацию по этой теме, но, увы, мало что нашел, тем более под Windows. Так что теперь, разобравшись с этим вопросом, я решил написать эту инструкцию, чтобы другим людям было проще разобраться.
Читать дальше →
Total votes 13: ↑10 and ↓3+7
Comments8

Старый друг лучше новых двух. Генератор ландшафтов. Часть 1

Reading time8 min
Views11K


Данная статья зародилась в моей голове, после того, как нам выдали курсач по мультимедийным технологиям в универе. «Универ… пф-ф-ф...» — так подумает мой читатель. Да только иногда здесь бывают дельные вещи. Вот, почему.

В курсаче предполагается создание виртуального ландшафта в старенькой программе VistaPro. В силу того, что раньше я ни с чем подобным не работал, я не могу сказать, насколько она функциональная. Но её большой плюс заключается в том, что она крайне проста в использовании (а другие террагены подчас довольно нетривиальны, что может вызвать некоторые трудности. Час же работы может не гарантировать успеха, в отличие от моего антиквариата), а освоить её от и до: разобрать весь функционал можно меньше чем за день не зная до этого ровным счётом ничего о ней. Небольшим, но всё-таки плюсом является совсем малый вес (~3 МБ). Разумеется, сейчас есть много подобных террагенов, которые обгоняют по функциональности VistaPro.

Читать дальше →
Total votes 38: ↑21 and ↓17+4
Comments13

Application Lifecycle в приложениях Windows 8.1 и UWP

Reading time7 min
Views13K

В приложениях Windows Store жизненный цикл довольно похож на картинку. Он довольно простой и содержит всего 3 состояния: NotRunning – Running – Suspended

Для себя я мысленно отождествляю его с «Не копать – Копать – Перекур». Опытные работяги знают, что с перекура к работе можно уже не вернуться. Опытные разработчики сохраняют состояние приложения при событии Suspending и возвращают его впоследствии в исходное состояние при возобновлении работы приложения.

В приложениях Windows UWP (Windows 10) все точно так же, но появились новые фичи.
Читать дальше →
Total votes 27: ↑23 and ↓4+19
Comments0

Реализация Server Push для Nancy

Reading time8 min
Views9.7K
В этой статье я хочу рассказать о своей реализации паттерна под названием Long Polling для фреймворка Nancy. Коду моего модуля уже более четырёх лет, в течение которых он успешно работал в ряде проектов на ASP .Net MVC. На этой неделе я решил оформить его в виде модуля Nancy и выложить на гитхаб для всеобщего блага, поскольку аналогичного решения найти мне не удалось.

С помощью моего модуля буквально за минуту и парой простых действий можно получить надёжный канал обратной связи от сервера к браузеру. Хотите узнать подробности?
Добро пожаловать под кат!
Total votes 17: ↑12 and ↓5+7
Comments5

Создание динамически изменяемого ландшафта для RTS на Unity3D

Reading time21 min
Views35K
Давным-давно я имел радость играть в замечательнейшую RTS под названием «Периметр: Геометрия Воины» от отечественного разработчика K-D Labs. Это игра о том, как огромные летающие города под названием «Фреймы» бороздят просторы «Спанджа» — цепи соединенных между собой миров. Сюжет достаточно странный и абстрактный, но гораздо более интересной и инновационной составляющей игры была одна из ее технических особенностей, а не сюжет. В отличие от большинства RTS, где сражения происходят на статической местности, в «Периметре», одной из ключевых игровых механик был терраформинг. У игрока были средства манипулировать ландшафтом с целью возведения на нем своих сооружений а также целый арсенал боевых единиц, способных этот ландшафт превратить в потрескавшийся, поплывший и изрыгающий раскаленные камни/противных насекомых ужас.

Как известно, мир RTS нынче переживает некоторый упадок. Инди-разработчики слишком заняты тем, что клепают ретро-платформеры и rouge-like игры зубодробительной сложности, и поэтому, переиграв в «Периметр» некоторое время назад я решил, что должен и сам попробовать реализовать что-то подобное — идея была интересной и с технической и с геймплейной точек зрения. Обладая некоторым практическим опытом в разработке игр (ранее я совершал попытки сделать кое-что на XNA), я подумал, что чтобы добиться хоть какого-то успеха в одиночку мне придется воспользоваться чем нибудь более высокоуровневым и простым. Выбор мой пал на Unity 3D, чья пятая версия только-только вышла из под пресса.

Вооруженный вагоном энтузиазма, вдохновением от только что пройденного «Периметра» и просмотренной серией видеотуториалов по Unity, я начал делать наброски и знакомиться с инструментарием, который мне предложил Unity Editor.
Читать дальше →
Total votes 26: ↑23 and ↓3+20
Comments5

Microsoft добавит поддержку компилятора Clang в ноябрьском обновлении Visual Studio 2015

Reading time2 min
Views22K


Microsoft добавит поддержку компилятора Clang в ноябрськом обновлении Visual Studio 2015 — об этом было заявлено на конференции CPPCon 2015, проходящей сейчас в городе Белвью, США.

Clang это компилятор кода на С, С++ и Objective-C, который в связке с LLVM позволяет собирать программы под различные платформы. Visual Studio 2015 уже поддерживает Clang для разработки Android и iOS-приложений. При разработке под Android можно выбирать между GCC и Clang, а для iOS приходится использовать внешний Mac в качестве билд-сервера.

Планируемое обновление принесёт поддержку Clang на качественно новом уровне — теперь им можно будет собирать обычные Windows-приложения.
Читать дальше →
Total votes 29: ↑26 and ↓3+23
Comments17

TemplateEngine.Docx — OpenSource .NET шаблонизатор docx документов

Reading time7 min
Views48K


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

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

Для начала — немного вводных.

Что нам было нужно от шаблонизатора


  • Шаблон создается в Word и сразу видно, на что будет похож результирующий документ, шаблон без лишнего мусора.
  • Результирующий документ после скачивания содержит все необходимые данные, не подтягивая их с внешних источников.
  • Возможность заполнять списки, таблицы, и иногда еще и таблицы с вложенными в них списками.
  • Шаблон можно доверить секретарю клиента, чтобы он мог сменить логотип, реквизиты компании, или как-либо еще подкорректировать оформление. И все это уже после сдачи проекта, не модифицируя наш код.
Читать дальше →
Total votes 31: ↑31 and ↓0+31
Comments21

Портируем C#/XAML приложение Windows 8.1 на UWP

Reading time10 min
Views12K

Если ваше приложение Windows 8 или 8.1 небольшое, то вы можете создать новый проект универсального приложения UWP и перенести в него код XAML и C#. Если же приложение содержит достаточный объем кода, то есть другие варианты.

Для того чтобы портировать WinRT C#/XAML приложение Windows 8.x на Windows UWP необходимо изменить манифест и файл проекта. Способа сделать это из среды Visual Studio пока что нет, но можно воспользоваться скриптом, который совершит некоторые автоматические операции, взяв на себя большую часть работы.
Читать дальше →
Total votes 12: ↑9 and ↓3+6
Comments0

Практическое использование Desired State Configuration для Windows Server 2012 R2

Reading time14 min
Views22K


Администраторам Linux: это статья о “Puppet” для Windows, и уже есть бета-версия DSC для Linux.
Для тех, кто в теме: не будет ничего о новинках PowerShell 5.0, только о том, что доступно из “коробки” Windows Server 2012 R2.


Преамбула


В 2013 году с выходом Windows Server 2012 R2 компания Microsoft сообщила о появлении Powershell Desired State Configuration (DSC).

К этому моменту я более или менее представлял, что делают подобные системы для Linux (например, уже упомянутый Puppet). Поэтому, предложенные возможности мне показались недостаточными для полной автоматической настройки системы. И только недавние сообщения о готовящемся Powershell 5.0 и о новых возможностях DSC побудили меня снова обратить внимание на эту технологию.

Чтобы разобраться, я выдумал задачку попроще:

  • Пусть, есть некий клиент, который хочет самостоятельно установить разработанное нами ASP.NET приложение на своем сервере. Кроме IIS, нам нужен MS SQL Server, а также требуется сделать некоторые настройки операционной системы и установить какие-нибудь важные утилиты.

Можно ли вместо инструкции по установке и настройке выдать некий конфигурационный скрипт, который сделает все что требуется на только что установленном Windows Server 2012 R2?

Для лучшего понимания этой статьи, наверное, предварительно стоит прочесть описание в блоге Microsoft — http://habrahabr.ru/company/microsoft/blog/253497/.
Подробнее о результатах эксперимента...
Total votes 11: ↑10 and ↓1+9
Comments4

Простой алгоритм определения пересечения двух отрезков

Reading time4 min
Views226K
Введение

В былые времена я увлекался компьютерной графикой, как 2х так и 3х мерной, в том числе математическими визуализациями. Что называется just for fun, будучи студентом, написал программу визуализирующую N-мерные фигуры, вращающиеся в любых измерениях, хотя практически меня хватило только на определение точек для 4-D гиперкуба. Но это только присказка. Любовь к геометрии осталась у меня с тех пор и по сей день, и я до сих пор люблю решать интересные задачи интересными способами.
Одна из таких задач попалась мне в 2010 году. Сама задача достаточно тривиальна: необходимо найти, пересекаются ли два 2-D отрезка, и если пересекаются — найти точку их пересечения. Более интересно решение, которое, я считаю, получилось достаточно элегантным, и которое я хочу предложить на суд читателя. На оригинальность алгоритма не претендую (хотя и хотелось бы), но в сети подобных решений я найти не смог.
Читать дальше →
Total votes 22: ↑15 and ↓7+8
Comments34

Еще один алгоритм определения пересечения двух отрезков

Reading time4 min
Views29K
Недавно была публикация «Простой алгоритм определения пересечения двух отрезков». Я решил попробовать решить задачу пересечения двух отрезков немного по-другому, более геометрически.
Читать дальше →
Total votes 28: ↑17 and ↓11+6
Comments19

Прикручиваем мультимедиа-клавиши в Яндекс.Радио

Reading time3 min
Views20K
Не так давно открыл я для себя сервис Яндекс.Радио, и вполне успешно им пользуюсь. Но вот чего не хватает: возможности включить следующий трек или поставить на паузу, не переключаясь на вкладку.

Мое решение под катом.
Читать дальше →
Total votes 14: ↑14 and ↓0+14
Comments11

.NET Native – что это означает для разработчиков под универсальную Windows-платформу (UWP)?

Reading time7 min
Views46K
В Windows 10 универсальные Windows-приложения на управляемых языках (C#, VB) проходят в магазине процедуру компиляции в машинный код с использованием .NET Native. В данной статье мы предлагаем вам познакомиться подробнее с тем, как это работает и как это влияет на процесс разработки приложений. Ниже вы найдете видео-интервью с представителем команды разработки .NET Native и перевод соответствующей статьи.




Что такое .NET Native?


.NET Native – это технология предварительной компиляции, используемая при создании универсальных Windows-приложений в Visual Studio 2015. Инструменты .NET Native компилируются ваши IL-библиотеки с управляемым кодом в нативные библиотеки. Каждое управляемое (C# или VB) универсальное Windows-приложение использует данную технологию. Приложения автоматически компилируются в нативный код прежде, чем они попадут на конечное устройство. Если вы хотите погрузиться глубже в то, как это работает, рекомендуем статью “Компиляция приложений с помощью машинного кода .NET”.
Читать дальше →
Total votes 22: ↑20 and ↓2+18
Comments14

Новый профилировщик памяти в Visual Studio 2015

Reading time3 min
Views29K
Долгие годы С++ программисты, пишущие под Linux язвительно пеняли разработчикам на С++ под Windows отсутствием в Visual Studio нормального профилировщика памяти. Вот в Линуксе, дескать, есть Valgrind, который решает все проблемы, а в студии что: расставляй какие-то макросы, анализируй какие-то логи — мрак. Клевета! Хотя и правда. Вернее, это было правдой до выхода Visual Studio 2015, в которой наконец-то (ура 3 раза!) присутствует нормальный профилировщик памяти, позволяющий ловить утечки памяти с закрытыми глазами, одной левой и даже не просыпаясь!

В этой статье мы посмотрим, что он умеет и как им пользоваться.


Читать дальше →
Total votes 49: ↑43 and ↓6+37
Comments13

Windows 10 по 10. Выпуск #1. Как повысить заметность и частоту установок

Reading time10 min
Views22K
Приветствуем в первой статье из серии Windows 10 по 10. Мы начнем серию с того, откуда начинается ваше взаимодействие с пользователями — с магазина Windows Store.



Чтобы убедиться, что ваши приложения находятся и запускаются пользователями Windows 10, рекомендуем проделать три упражнения прямо сейчас:
  1. Обновить описание в магазине для повышения шансов приложения быть установленным.
  2. Начать отслеживать использование приложения с помощь Visual Studio Application Insights и новых отчетов об использовании.
  3. Научиться использовать новые возможности магазина для отслеживания успешности проводимых кампаний.

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

Читать дальше →
Total votes 22: ↑15 and ↓7+8
Comments9

Использование потенциальных полей в сценарии стратегии реального времени

Reading time8 min
Views41K
Реализация поведения юнитов в RTS играх может стать серьезной проблемой. Компьютер, зачастую, контролирует огромное количество юнитов, в том числе и принадлежащих игроку, которые должны передвигаться в большом динамическом мире, попутно избегая столкновения друг с другом, выискивая врагов, защищая собственные базы и координируя атаки для истребления противника. Стратегии реального времени работают в реальном времени, что делает довольно сложным слежение за планированием действий и навигацией.

Этот урок описывает метод планирования течения игры и навигации юнитов, который использует многоагентные потенциальные поля. Он основан на работах под номерами [1, 2, 3]. (Смотри в конце статьи ссылки на используемые материалы)



Читать дальше →
Total votes 57: ↑56 and ↓1+55
Comments17

По-настоящему адаптивные письма. Часть первая

Reading time6 min
Views22K
Написание данного поста навеяно недавней поистине шикарной работой, Niсole Merlin. Во многом ее методика верстки схожа с моей и мне радостно от того, что это направление развивается теперь и на западе. Чем же этот способ так хорош? Все очень просто. Не нужно объяснять как важно адаптировать под мобильные платформы сверстанные письма для того, чтобы они были прочтены. Читать простыни на телефоне мало кто будет. Что же все это время делал западный разработчик? Он верстал табличной версткой с элементами блочности, затем причесывал этот код медиазапросами для поддержки мобильников. Чем этот подход ущербен? А тем, что ни на андроиде, ни на яблоке медиазапросы не поддерживаются следующими почтовыми клиентами: Gmail, Yandex, Mail.ru. По большому счету западные коллеги могли бы и наплевать на яндекс с мейлом, но вот Gmail как ни крути первый среди почтовиков.



Для Nicole Merlin это стало очевидно и она разработала свою методику, которая основывается на резиновой верстке с минимальным использованием медиазапросов(progressive enhancement) и это работает! Но немного не так как хотелось бы нам в России. Вся резиновость автора держится на inline-block элементах и оперированием max-width. Но вот беда-то, наши ребята из яндекса и мейла max-width не поддерживают. Сначала я расскажу об отличиях моего подхода от приемов Nicole, а затем плавно перейду к своим мыслям и примерам кода, которые стоит использовать при подготовке писем.
Читать дальше →
Total votes 14: ↑11 and ↓3+8
Comments8

Information

Rating
Does not participate
Location
Тула, Тульская обл., Россия
Date of birth
Registered
Activity