Сергей Лукьяненко. Всем выйти из сумрака! Всем выйти из сумрака Тьма снаружи - тьма внутри

Фото: Тимур Шарипкулов

Жарче солнца

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

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

Фото: Тимур Шарипкулов

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

Всем известны святочные гадания, но предшествовали им инсценировки свадьбы, «жениханье». От целомудренности они были, конечно, далеки: «бесовские плясания», «отрокам осквернение и девкам растление» упоминал еще Стоглав. В 1719 году ему вторила Киевская духовная консистория, чей указ требовал прекратить гуляния и «вкулачки» (кулачные бои): «Под час таких нечестивых зборов разние делаются ексцесса, яко то блудние грехи, девства растления, беззаконное детей прижитие». И именно отголоски древнего славления солнца оказались, пожалуй, самыми живучими: христианские праздники так и не смогли вытеснить их до конца, - поведал религиовед.

Думай о Мурманске

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

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

Фото: Николай Гурьянов (инфографика)

Если вы живете в регионе, где светлая часть суток нарастает медленнее, чем в других частях страны, можете утешить себя мыслями о Мурманске. В этом северном городе полярная ночь начинается 2 декабря, после чего мурамчане в течение 40 суток не видят даже краешка дневного светила. Подобная участь постигла и другие населенные пункты, расположенные за полярным кругом: Норильск, Воркуту, Апатиты, Североморск, Салехард и Нарьян-Мар и пр.

Географическое положение города влияет и на то, смогут ли отмеренные ему солнечные лучи добраться до места. Жители многих российских регионов недополучают солнце из-за циклонов, рассказала ведущий метеоролог Гидрометцентра России Марина Макарова. Этот атмосферный фронт приносит с собой облака и, соответственно, мглу. Если же в регионе устанавливается антициклон, погода становится малооблачной, но морозной. Поэтому зимой в Сибири с ее лютыми стужами ясных дней все-таки больше, чем в западной части страны, находящейся под влиянием Атлантики. Либо мороз и солнце, либо сносные температуры и пасмурная мгла - таков безжалостный ультиматум зимней погоды россиянам.

Тьма снаружи - тьма внутри

Хотя ночь вот-вот пойдет на убыль, по-настоящему насладиться светлыми деньками мы сможем еще не скоро. А значит, с хандрой и постоянной ленью надо что-то делать.

Депрессивные настроения и синдром хронической усталости - привычные спутники темных зимних дней, говорит врач-психотерапевт Олег Шалев.

Человек наиболее активен в светлое время суток. Если мы получаем меньше солнечной энергии, то начинаем больше спать, любая наша активность - физическая или умственная - снижается. Депрессивность характерна для жителей северных стран, для суровых условий жизни. Не только потому, что там труднее выживать, но и потому, что длительность светового дня меньше, - рассказал Олег Шалев.

Фото: Тимур Шарипкулов

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

Уменьшить негативное влияние тьмы на человека можно, налегая на продукты, богатые витаминами: фрукты, овощи, а также пищу, богатую белками и углеводами.

Даже острое и жареное, которое считается не самой полезной пищей, зимой поможет улучшить настроение и повысить жизненный тонус, - говорит Олег Шалев.

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

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

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

Четвертый и пятый варианты русскому человеку придутся особо по вкусу. Речь идет о бане и традиции русских застолий.

Фото: Александра Савельева

Как у нас раньше боролись с хандрой? Печки топили. Живой огонь, дрова - все это, во-первых, снижает влажность, во-вторых, подпитывает людей энергией. Обычная ванна баню не заменит: теплая вода человека расслабляет, снимает излишний потенциал. Вот холодный душ - да, стимулирует, бодрит. Но кому он зимой нужен? Поэтому надо просто запланировать себе раз в неделю поход в баню - не только для удовольствия, но и для здоровья. Также от зимней депрессии помогают русские застолья и праздники. Без Нового года, например, нам совсем тяжко было бы. Конечно, от долгих праздников устаем, но эмоциональная встряска все-таки нужна. Главное - не злоупотреблять и знать меру в еде и спиртном, - говорит Олег Шалев.

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

Лыжи, коньки… Надо ведь и внутренний огонь разжигать в себе, - смеется психотерапевт.

Роль соляриев, по мнению специалиста, в борьбе с осенне-зимней депрессией преувеличена. Загар действительно помогает вырабатывать витамины групп B, E, A. Но применять ультрафиолет из кабинки нужно дозированно.

Фото: Евгения Бикунова (инфографика)

«Спи, пока темно»

По утрам с трудом продираете глаза, хотя проспали положенные восемь часов, а то и больше? Виной тому все та же нехватка солнечного света, объяснил заведующий центром медицины сна клинического санатория «Барвиха» Роман Бузунов. Солнца зимой мало, световой день короткий, большую часть дня мы проводим в помещении. Когда утром выходим из дома, на улице еще темно, когда выходим с работы - там уже темно. Из-за этого в народе даже появилось выражение «офисная полярная ночь».

Солнечный свет - это главный регулятор режима сна-бодрствования. Когда естественный свет воздействует на сетчатку, в нас вырабатывается меньше мелатонина - гормона сна. В темноте мелатонин, наоборот, вырабатывается активнее. Именно поэтому летом, когда рано светает, мы просыпаемся легко и быстро, а зимой подолгу не можем встать с постели. Искусственное освещение компенсирует недостаток солнечного света не полностью, поэтому даже на протяжении дня некоторые жалуются на вялость и сонливость, - рассказал Бузунов.

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

В ряде случаев может помочь прием препаратов мелатонина, регулирующих цикл «сон-бодрствование». Однако их применение лучше согласовать с лечащим врачом, предостерегает Роман Бузунов.

А сейчас нужно обязательно дунуть, потому что если не дунуть, то ничего не получится.
-Цитаты великих

И здравствуйте!

Сегодня мы поговорим о неявном в языке Scala. Кто еще не догадался - речь пойдет об implicit преобразованиях, параметрах, классах и иже с ними.Все новички, особенно любители питона с зеновским Explicit is better than Implicit , обычно впадают в кататонический ступор при виде подкапотной магии, творящейся в Scala. Весь компилятор и принципы в целом охватить за одну статью удастся вряд ли, но ведь дорогу осилит идущий?

1. Неявные преобразования

А начнем мы с относительно простого раздела неявных преобразований. И жизненного примера.
Василий хочет себе автомобиль от производителя Рено. Вся семья долго копила деньги, но накопить всю сумму так и не смогли. Денег хватает разве что на новый ВАЗ. И тут резко хлоп! Рено покупает АвтоВАЗ. Вроде и производитель теперь нужный, да и денег хватает. Вот так вот неявно Вася теперь счастливый владелец иномарки.
Теперь попробуем это формализовать в виде кода:

Жизненный пример

case class Vasiliy(auto: Renault) { println("Vasiliy owns "+auto) } case class Renault(isRussian: Boolean = false) case class VAZ(isRussian: Boolean = true) object VAZ { implicit def vaz2renault(vaz: VAZ): Renault = Renault(vaz.isRussian) //вся магия здесь } object Family { def present = { Vasiliy(VAZ()) //подарим василию ВАЗ. Который внезапно Рено! } }


В результате выполнения Family.present мы увидим строку Vasiliy owns Renault(true) . Вот так Scala помогает обычным людям в этой непростой жизни!
Если привести более программисткий пример (что-то подобное использую у себя в проекте):

Безжизненный пример

case class PermissionsList(permissions: Set = Set("UL")); object PermissionsList { implicit def str2permissions(str: String) = PermissionsList(str.split(";").toSet) implicit def permissions2str(p: PermissionsList) = p.permissions.mkString(";") } //упрощенный case class User(login: String, permissions: PermissionsList) /* somewhere in a galaxy far far away */ User(login = "Vasiliy", permissions = "UL;AL") // только ловкость рук и ничего более


Приведенный код позволяет неявно приводить строки к объекту прав доступа и обратно. Это может быть удобно при работе в том же вебе, когда нам достаточно только склеить на клиенте нужную строку вида "UL;AL" и отправить ее на сервер, где она уже будет в нужный момент преобразована в наш объект.
И вот мы подошли к важному пункту . Когда и при каких условиях наш а тыква ВАЗ превратится в Рено, а строка в объект PermissionsList?

В подавляющем большинстве случаев вся магия Scala происходит в compile-time (язык-то строго типизирован). Местный компилятор - чрезвычайно умная и находчивая тварь. Как только мы пытаемся вызвать у инстанса класса VAZ метод exat(), который там и не существовал никогда, наш компилятор пускается во все тяжкие и варит мет ищет неявное преобразование VAZ"а во что-то, что умеет exat(). Иначе говоря, implicit def a2b(a: A): B .
Ищет он неявные преобразования:

  • В текущей области видимости (например, внутри текущего объекта)
  • В явных (import app.VAZ.vaz2renault)
  • или групповых импортах (import app.VAZ._)
  • В объекте-компаньоне преобразуемого
Кстати, помимо просто вызова несуществующего метода, компилятор попробует преобразовать объект в том случае, если мы попытаемся передать его в метод/функцию, которая требует параметр с другим типом данных. Это как раз из примера Василия и его семьи.

1.1 Implicit class

Начиная с версии 2.10 в Scala появились Implicit class"ы, которые позволяют удобно группировать расширения (довешивать методы) для любых существующих классов. Вот простенький пример:

Object MySimpleHelper { implicit class StringExtended(str: String) { def sayIt = println(str) def sayItLouderBitch = println(str.toUpperCase +"!!!") } }
Как видно из приведенных сырцов, мы имеем объявленный внутри объекта класс, который принимает единственный аргумент - строку. Эта строка дается нам на растерзание в методах класса. И терзается это дело элементарно:

Import MySimpleHelper._ "oh gosh" sayIt > oh gosh "oh gosh" sayItLouderBitch > OH GOSH!!!
Но и тут есть несколько ограничений, которые надо иметь ввиду:

  • Для implicit классов можно использовать только один явный аргумент конструктора, который, собственно и «расширяется» (про implicit параметры поговорим чуть позже)
  • Подобные классы могут быть объявлены только внутри объектов, трейтов, других классов
  • В области видимости объявления класса не могут существовать методы, свойства или объекты с тем же названием. Если у вас в, например, объекте есть свойство VAZ , то рядом не может сосуществовать implicit class VAZ
Ну а по факту, наш StringExtended будет преобразован компилятором в:

Class StringExtended(str: String) { def sayIt = println(str) def sayItLouderBitch = println(str.toUpperCase +"!!!") } implicit def String2StringExtended(str: String): StringExtended = new StringExtended(str)
Знакомо, не так ли?

2. Неявные параметры

Как-то слишком все просто и вы уже заскучали? Самое время небольшого хардкора! Пошевелим мозгами и залезем в исходники скалы:

Неприветливый код

/** * TraversableOnce.scala: minBy * Итак, имеем метод, который позволяет найти минимум в коллекции, причем минимум будем определять мы сами, используя для этого функцию, возвращающую объект типа B для каждого элемента A коллекции. Собственно, эти объекты B и сравниваются между собой, а возвращается тот A, чей B меньше всех. Как-то так. */ def minBy[B](f: A => B)(implicit cmp: Ordering[B]): A = { //если коллекция пустая - что нам сравнивать? if (isEmpty) throw new UnsupportedOperationException("empty.minBy") //объявим пустые переменные нужных типов var minF: B = null.asInstanceOf[B] var minElem: A = null.asInstanceOf[A] var first = true //переменная для первой итерации //поехали по коллекции for (elem <- self) { //передаем в функцию элемент A, получаем некое B val fx = f(elem) if (first || cmp.lt(fx, minF)) { //если это наше первое сравнение - минимальный элемент будет первым же. //или же cmp.lt вернет true в том случае, если f: B < текущего минимума minF: B minElem = elem minF = fx first = false } } minElem }


Повтыкали, вроде все понятно.
Стоп, секунду. Но ведь мы используем minBy примерно так: val cities = Seq(new City(population = 100000), new City(500000)) val smallCity = cities.minBy(city => city.population)
И никаких cmp: Ordering[B] (в данном случае B == Int) не передаем. Хотя вроде как код работает… Расслабься, парень. Это магия.
В импортированной области видимости, а конкретно в scala.math.Ordering существует

вот такой вот кусок кода

object Ordering extends LowPriorityOrderingImplicits { ... trait IntOrdering extends Ordering { def compare(x: Int, y: Int) = if (x < y) -1 else if (x == y) 0 else 1 } implicit object Int extends IntOrdering ... }


Обратим внимание на последнюю строку - существует неявный объект Int, который имеет в своем арсенале метод compare , имплементированный при наследовании Ordering трейтом IntOrdering . Собственно, этот объект и используется для сравнения, неявно передается в злополучный minBy .
Сильно упрощенный пример выглядит примерно так:

Приветливый код

implicit val myValue: Int = 5 object Jules { def doesHeLookLikeABitch(answer: String)(implicit times: Int) = { for(x <- 1 to times) println(answer) } } Jules.doesHeLookLikeABitch("WHAT?") >WHAT? >WHAT? >WHAT? >WHAT? >WHAT?


Конечно, никто не запрещает нам самим ручками передавать неявные параметры. Не, ну вдруг понадобится.
И снова, снова ограничения, куда же без них.
  • В области видимости вызова метода должен существовать объект/значение, помеченный как implicit, причем существовать может только один параметр для одного типа данных. Иначе компилятор не поймет, что же нужно передать в метод.
  • Как вариант, компилятор пошарится в объекте-компаньоне нашего implicit T , если таковой существует, и дернет оттуда implicit val x: T . Но это уже совсем тяжелые наркотики, как по мне.

3. View/Context Bounds

Если ваш мозг уже оплавился - отдохните и выпейте кофе, а может чего покрепче. Я собираюсь поговорить о последней на сегодня неочевидности.
Допустим, что наш Василий, который ездит на новом автомобиле (тот самый, что умеет exat()) стал успешным человеком, программистом короче. И вот пишет Василий на Scala, и захотелось ему ЕЩЕ БОЛЬШЕ САХАРА АРРГХ. Мартин подумал и сказал - Окей. И ввел типы и ограничения по ним. Те самые def f[T](a: T)
3.1 View Bounds
Это ограничение при объявлении типа говорит компилятору о том, что истина неявное преобразование где-то рядом.

Def f(a: A) = a.bMethod
Т.е. в доступой области видимости присутствует неявное преобразование из A в B . В принципе, можно представить запись в следующем виде:

Def f[A](a: A) (implicit a2b: A => B) = a.bMethod:
Близкий русскому человеку пример выглядит примерно так:

Class Car { def exat() = println("POEXALI") } class VAZ object VAZ { implicit def vaz2car(v: VAZ): Car = new Car() } def go(a: A) = a.exat() go(new VAZ()) > POEXALI
Замечательно! Жизнь стала прекрасной, волосы выросли обратно, жена вернулась, ну и что там далее по списку.
Но Василий напросился, и Мартина было уже не остановить… Так появилось

3.2 Context Bounds
Это ограничение было введено в Scala 2.8, и, в отличии от View Bounds, отвечает не за неявные преобразования , а за неявные параметры , то есть

Def f(a: A) = g(a) // где g принимает неявный параметр B[A]
Самым простым примером будет вот такая вот пара:

Def f(a: A, b: A) = if (implicitly].lt(a, b)) a else b vs def f[A](a: A, b: A)(implicit ord: Ordering[A]) = { import ord._ if (a < b) a else b }
Вообщем-то это отдаленный привет Хаскелю и его typeclass pattern"у.

Вместо послесловия

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

- Это был сумрак. Ты иной.
- Иной? Я что, не такой как все?
- Теперь нет.

Тимофей Кузнецов, 23-х лет отроду, начал свою жизнь в ничем не примечательном Геленджике. Со временем, как и многие, он перебрался «из провинции» в столицу, и закончил МГУ. Любил математику и играть в шахматы. В целом, ничего особенного. Однако он не такой как все.

«Не таким как все» Тимофея, молодого простого паренька, неуверенного в себе, которого в мире никто не знал, делало только одно слово. Trueteller. Оно же возводило его в ранг короля в покерном мире.

Этот ник знал каждый уважающий себя покерист. Его игра на высоким лимитах вызывала восхищение: она была дерзка и непредсказуема, он давал отпор всем известнейшим покеристам, а новые линии от Трутеллера вводили в ступор даже сильнейших мира сего. Невероятная способность забирать всё до копейки у профессионалов принесла Кузнецову еще одно прозвище – «Обнулитель». Он был игроком, которого знали все, но не видел никто. В конце мая 2015 года «Trueteller» вышел из сумрака.

Выход из сумрака оказался не таким взрывоопасным, как у Виктора Блома, который также разрывал хайлимиты и скрывал лицо за маской. Появление же нашего «Иного» вышло без фанфар, красной дорожки, букетов и бурных оваций. Хотя это и было громом среди ясного неба, но каким-то робким и детским.

З-здрастьте, - спотыкаясь и поправляя очки, неуверенно сказал 6-классник «Trueteller», который только вчера обнулил Тома Двана.

На фоне своего «папы» - Славы «Исполнителя» Карпова, который и представил Тимофея публике, сыночек смотрелся неловко и несуразно. Уверенности, одному из лучших кеш-игроков в мире, не добавляла и рядом сидящая девушка Тимофея Виктория Примак – 21-летняя модель из города Омск. Театральная постановка с тремя актёрами первого плана, хоть и вызвала аншлаг, но получила множество претензий от критиков по сценарию пьесы и плохой игре актеров. Психологи, которые утверждали, что мнение о человеке складывается в первые секунды, изучив видео-представление нервно махнули рукой и закурили.

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

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

Аргумент Исполнителя, что после участия Трутеллера на WSOP всё равно все бы узнали, что это он, как то выглядит слабеньким. Участие на WSOP никак не могло на это повлиять. Кузнецов и до этого принимал участие в популярных сериях, типа ЕРТ, и никто не знал, что это он. Даже известные комментаторы Илья Городецкий и Михаил Сёмин во время трансляции ЕРТ Барселоны , не зная, кто такой Кузнецов, обозвали его тайтовым игроком. Это прям как оскорбление для того Трутеллера, которого мы знали – любителя агрессивного стиля игры.

Выходит Исполнитель «немного лукавил» когда назвал причину. Ох уж этот манипулятор-психолог. Ему только дай повод, а там он уже сам историю придумает.

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

Многие задавали вопросы: где же та самоуверенность Трутеллера, где его легкая надмерность и снисходительность, где тот человек, который первым придумал лимпить с баттона на хайстейкс, где тот, кто первый заработал миллион за кап-столами в ПЛО, где тот король-лев, который стоит на верхушке покерной эволюционной цепи и обнуляет покер?

Большинство людей представляли «Иного»… по-иному. Звездой, мачо, крутым мЭном, подкуривающего сигары 100 долларовой купюрой. Одним лишь только взглядом он мог украсть блайнд у Айви. Он был кумиром. Начинающие покеристы мечтали достичь таких же высот и быть таким же классным, как Трутеллер. Однако после того, как туман рассеялся и мы увидели реального человека, детские мечты любителей сказок разрушились. Икона треснула, памятник разрушен. Самый известный и сильнейший кэш-регуляр оказался обычным, ничем не примечательным пареньком – таким же как и все. Только на пару миллионов богаче.