Блог Дмитрия Сошникова

про технологии и человеческое счастье

Приглашаю всех желающих на #openbirthday 2016

Друзья!

Ещё один год моей жизни почти пролетел. С кем-то из друзей мы не успели повидаться, а с кем-то даже не успели познакомиться. Чтобы исправить эти недочёты – приглашаю всех, кто хочет повидаться или познакомиться, на очередной #openbirthday.

В этот раз встреча будет не очень долгой: с 14:00 до 16:30, в воскресенье, 27 марта, я буду ждать всех желающих в антикафе “Тайник”.

slide-1

В программе:

  • небольшая винная дегустация с приглашенным сомелье
  • 50-летний пуэр
  • немного закусок и беседы на технологические темы
  • cпециальный мастер-класс от @vickievalerie по рисованию котиков

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

Подробности – на сайте http://www.openbirthday.ru. До встречи!

Add a comment

Обманутые ожидания, Голливуд и счастье

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

Что очень часто делает нас несчастными? Рассмотрим пример. Идем мы на какой-нибудь фильм, который нам все друзья очень рекомендовали смотреть, потому что он волшебный и вообще прекрасный. Скажем, звёздные войны. Смотрим, и вдруг понимаем, что как-то не очень. В результате настроение плохое, весь день испорчен, с друзьями поссорились – у них ведь нет вкуса, что с ними дружить… Печаль.

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

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

А что мы видим в фильмах? По крайней мере в тех, которые в основном показывают в кинотеатрах. Там happy end. Там счастливые и красивые люди на экранах улыбаются, а если и сталкиваются с какими-то сложностями – то всё быстро как-то разрешается, и в конце главные герои обнимаются и уходят в закат, чтобы там жить долго и счастливо, пока смерть не разлучит их. Однако саму смерть, да и саму жизнь после happy end, уже не показывают, ну по крайней мере почти никогда.

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

А в жизни всё иногда получается не совсем так радужно. Мы болеем. Болеют наши близкие. Ребенок приносит из школы двойки и рваные учебники. А мы периодически оказываемся в позиции второстепенных героев. И получаются они самые – обманутые ожидания и постоянное несчастье, оттого, что наша жизнь не соответствует кем-то установленному и зафиксированному в голливудских фильмах шаблону счастья.

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

P.S. Как вы наверное заметили, это слегка необычный пост. Мне бы хотелось этим постом начать небольшую серию заметок о жизни – ведь размышлять о ней и делиться мыслями на мой взгляд не менее важно, чем говорить о технологиях. Вы согласны? Дайте мне знать, что вы думаете о такой идее, и про что хотели бы услышать.

P.P.S. Все упомянутые в заметке персонажи являются сугубо вымышленными. Любые совпадения случайны. Моя дочь @vickievalerie любит математику и никогда не получает по ней двойки.

Add a comment

Магия треугольника Серпинского в функциональном стиле

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

image

Алгоритм построения треугольника таков:

  • Задаем координаты трех вершин-аттракторов (x1,y1), (x2,y2) и (x3,y3)
  • Выбираем некоторую точку (x,y) внутри треугольника
  • Повторяем много раз:
    • Ставим точку с координатами (x,y)
    • Выбираем случайным образом одну из вершин (xi,yi)
    • Вычисляем координаты новой точки по формуле ((x+xi)/2,(y+yi)/2)

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

В соответствии с этим, мы реализуем функцию sierpinski, которая будет возвращать бесконечную последовательность координат точек треугольника:

let sierpinski (p1,p2,p3) =
   let rec sierpinski' pt =
      seq {
        let p = pick [p1;p2;p3]
        let pt' = mid pt p
        yield pt'
        yield! sierpinski' pt'
      }
   sierpinski' (mid3 p1 p2 p3)

В этом определении мы используем вспомогательную вложенную рекурсивную функцию sierpinski’, которая в качестве аргумента передает координаты текущей точки pt. Координаты вершин p1,p2,p3 в данном случае являются внешними по отношению к этой функции. Далее мы выбираем одну из вершин случайным образом, вычисляем координаты очередной точки, “возвращаем” (с помощью yield) эти координаты, и затем рекурсивно возвращаем бесконечный остаток списка, который получается из рекурсивного вызова. Затем чтобы сформировать результат мы вызываем sierpinsky’, передавая ему в качестве начальной точки среднюю точку, вычисленную из координат вершин.

Для вычисления средних точек мы определим следуюшие вспомогательные функции:

let mid (x1,y1) (x2,y2) = (x1+x2)/2,(y1+y2)/2
let mid3 (x1,y1) (x2,y2) (x3,y3) = (x1+x2+x3)/3,(y1+y2+y3)/2

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

let Rnd = new Random()
let pick (L:'t list) = L.[Rnd.Next(0,Seq.length L)]

В завершение остаётся лишь построить полученный треугольник. Для этого можем использовать стандартную библиотеку FSharp.Charting:

sierpinski ((0,0),(300,600),(600,0)) |> Seq.take 5000 |> Chart.FastPoint

Вот какой получился результат:

image

Весь исходный код можно найти здесь: http://fssnip.net/ta.

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

Add a comment