Водоплавающая ступень

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

С первых моментов закрутки стало ясно, что дело пахнет керосином. Зрители сразу заметно оживились. Первая оформившаяся мысль была: “Ух ты! Смотри как она может”. Следующая за ней: “Интересно, когда рванет?” При посадке ступень сначала целится в океан - мимо посадочной площадки. Как раз на случай если, что пойдет не так. Так что особых переживаний, что она кому-то на голову упадет не было. Просто было интересно чем все закончится.

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

Еще одно видео:

P.S. Dragon без приключений вышел на запланированную орбиту.

Как выглядит запуск с орбиты

Впечатляющее видео - покадровая съемка, показывающая как выглядел запуск Прогресса MC-10 с борта МКС:

Волшебство Питона

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

Непонятно как все это счастье держать в одной куче. Неужели все живут за счет 100% покрытия тестами? Не верю. Или все на PyCharm сидят?

Расскажу про очередной прикол Питона. Итак есть простой код:

def init(factories):
    """Convert a list of factorie into a list of objects.""" 
    return [factory() for factory in factories]

def cleanup(objects):
    """Clean up objects in the reversed order of their creation."""
    for obj in reversed(objects):
        obj.cleanup()

init() берет список фабрик и отдает список объектов, созданных фабриками. cleanup() чистит созданные объекты в порядке, противоположном порядку создания. Нам требуется написать тест, который проверяет, что методы cleanup() вызываются в правильном порядке:

from itertools import permutations
import mock

def test_cleanup():
    """Verify cleanup() order."""
    # Try all permitations of initialization order. 
    for init_order in permutations(range(3)):
        cleanup_order = []

        def factory(index):
            def cleanup():
                """Record the clean up order."""
                cleanup_order.append(index)

            def create():
                """Return a mock implementing cleanup()."""
                obj = mock.Mock
                obj.cleanup = mock.Mock(side_effect=cleanup)
                return obj

            return create

        # Create objects in the desired order.
        objects = init([factory(index) for index in init_order])

        cleanup(objects)

        # Verify that the object were cleaned up in the reveresed
        # order of their creation.
        assert cleanup_order == list(reversed(init_order))

Разберу логику по кускам. Тест перебирает все возможные кобинации порядка создания объектов:

for init_order in permutations(range(3)):

Декоратор factory() возвращает фабрику create(), которая в свою учередь создает объект с методом cleanup(). Для создания объекта на коленке используется Mock. Релизация cleanup() запоминает порядок вызова в cleanup_order.

init() создает объекты в заданном порядке, cleanup() - чистит:

objects = init([factory(index) for index in init_order])

cleanup(objects)

Наконец, в самом конце мы проверяем, что порядок очистки противоположен порядку создания:

assert cleanup_order == list(reversed(init_order))

Все просто, не так ли? Запускаем тест и получаем облом:

>               assert cleanup_order == list(reversed(init_order))
E     assert [2, 2, 2] == [2, 1, 0]
E       At index 1 diff: 2 != 1
E       Use -v to get the full diff


rabbit_test.py:41: AssertionError 

Заядлые питонщики давно раскусили, в чем проблема. А вы сможете найти ошибку не заглядывая в ответ?

Read On →

Марс: Внутри SpaceX

National Geographic начал показывать второй сезон сериала Марс и вместе с первым эпизодом выложил серию про SpaceX. Такого количества знакомых лиц в документальном фильме я еще не видел. Я там тоже засветился в 42:56. :)

Красиво снято. Рекомендую посмотреть.

Read On →

Ну-ка, еще разок

Питоний пакет retrying - универсальная заплатка для кода, который может поломаться из-за внешних причин. Например, socket.connect() может закончится ошибкой из-за непредвиденной ситуации в сети. Заворачиваем вызов в @retry и бац! Все работает.

@retry
def create_connection(address):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    return socket.connect(address)

Однако бездумное применение @retry, как нетрудно догадаться, приводит проблемам. Самый известный пример - вложенные @retry. @retry(stop_max_attempt_number=3) вложенный в другой @retry(stop_max_attempt_number=3) дает 9 повторов. Три уровня вложенности - 27 повторов.

Один раз использование @retry привело к тому, что IT заблокировало мою учетную запись. Банальная история - был некий скрипт, который при запуске спрашивал логин и пароль для авторизации. В один прекрасный день некто (не будем показывать пальцем, хотя это был Слонёнок) усовершенствовал скрип, завернув сетевой вызов в @retry. Отличная идея, за исключением того, что ошибка авторизации приводила к повторному запросу с тем же неправильным именем и паролем. После определенного числа попыток контроллер домена решил, что кто-то пытается подобрать пароль к учетной записи и заблокировал её.

Мораль истории - знайте свои ошибки в лицо и используйте параметр retry_on_exception.

Read On →

Тридцатиметровый телескоп

Верховный суд Гавайев разрешил постройку Тридцатиметрового телескопа на вершине горы Мауна-Кеа. Решение о постройке телескопа вызвало протесты среди защитников природы и сторонников традиционного гавайского образа жизни, которые считают гору Мауна-Кеа священной. В 2015 году Верховный суд Гавайев отменил уже готовое разрешение на постройку телескопа, из-за нарушений прав коренных гавайцев, а именно - спор не был рассмотрен в суде перед выдачей разрешения на постройку. Орган, ответственный за выдачу разрешения (The Board of Land and Natural Resources), подсуетился и организовал слушание. И вот теперь Верховный суд дал добро на постройку.

Отдельные части решения Верховного суда читаются как сказка (извиняйте за корявый перевод):

Некоторые коренные гавайцы, включая некоторых аппелянтов, считают гору Мауна-Кеа, возвышающуюся на 13796 футов над уровнем моря, предком, нине живущим членом семьи и прародителем гавайцев, рожденным от Wākea (небесного отца) и Papa (матери Земли). Они полагают, что вершина Мауна-Кеа, также известная как Kūkahauʻula (скопление puʻu или шлаковых конусов), является wahi pana (легендарным местом) и wao akua (местом, где живут боги), сферой исконных akua (богов, богинь, божеств), принимающих земную форму в виде puʻu, воды озера Waiau, и других значительных элементов ландшафта. Считается, что вершина Мауна-Кеа касается неба уникальным и важным способом, - как piko (пупок) через который устанавливается связь с предками или как piko hoʻokahi (единый пупок), который устанавливает духовную и генеалогическую связь, и обеспечивает права на живительную энергию всего того, чем являются Гавайи. Большое количество святилищ на Мауна-Кеа указывает на традицию паломничества: “прогулка вверх и назад во времени к космологическим началам” чтобы поклонится виду богини Poliʻahu и другим akua, таким как Kūkahau, Līlīnoe и Waiau.

Some Native Hawaiians, including some of the appellants, consider Mauna Kea, which rises to an elevation of 13,796 feet above sea level, to be an ancestor, a living family member and progenitor of Hawaiians, born of Wākea (Sky Father) and Papa (Earth Mother). They consider the Mauna Kea summit area, also known as Kūkahauʻula (cluster of puʻu or cinder cones), to be a wahi pana (storied place) and wao akua (the place where gods reside), the realm of ancestral akua (gods, goddesses, deities) believed to take earthly form as the puʻu, the waters of Lake Waiau, and other significant landscape features. The summit of Mauna Kea is thought to touch the sky in an unique and important way, as a piko (navel) by which connections to the ancestors are made known to them, or as the piko hoʻokahi (the single navel), which ensures spiritual and genealogical connections, and the rights to the regenerative powers of all that is Hawaiʻi. The large number of shrines on Mauna Kea indicate that there was a pattern of pilgrimage, “a walk upward and backward in time to cosmological origins,” to worship the snow goddess Poliʻahu and other akua such as Kūkahau, Līlīnoe, and Waiau.

Во как!

Read On →

Восход Земли

Композитное изображение Земли, восходящей над горизонтом Луны:

Изображение полученно из серии снимков, сделанных 12 октября 2015 года, с борта лунного орбитального зонда. В момент съемки аппарат находился на высоте 134 километров над кратером Комптон, расположенном на обратной стороне Луны (51.8°N, 124.1°E).

Статья, посвященная этому снимку, объясняет процесс съемки и ссылается на полноразмерное изображение.

Read On →

Palm Springs

Одна из характерных черт жизни в Штатах - это то, что все значительные события планируются на месяцы и годы вперед. В начале учебного года детям (а на самом деле - их родителям) выдается календарь расписанный на год вперед: каникулы, выходные, разные обязательные и не очень школьные мероприятия вроде Back to School Day также известный как “гоните ваши денежки”. Поездка в отпуск запланированная на полтора года вперед - норма. Записывать ребенка на Junior Lifeguard Program на следующее лето нужно в январе. Пропустил момент - жди следующего года.

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

Read On →

Айда все на Луну

Ну что, BFR тихой сапой приближается к реальности. Пройденные этапы:

  • Основательно прожгли прототип двигателя.
  • Застолбили палатку с запчастями в порту Long Beach.
  • Предварительно просчитали посадку с правильной моделью атмосферы (что как мы знаем по опыту KSP is a big deal. Там, помнится, после очередного обновления модель атмосферы поменялась - половина ракет перестала нормально летать. Столько криков было…)
  • Обозначили предварительные цели - сразу к Марсу лететь сложно, а вот оттестироваться как следует вокруг Земли и Луны - сам бог велел.
  • Ну и самое главное - увеличился счет в банке. Т.е. деньги на дальнейшее движение есть.

Read On →

Отпуск. Окончание

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

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

Этот ящик, конечно, вис от жары постоянно. Но с другой стороны с его помощью я познакомился с Turbo Vision - культовой библиотекой для создания интерактивного интерфейса под DOS. Помнится я даже пытался добавить поддержку графики - в режиме 320x200 и 256 цветов конечно. Все шло довольно неплохо, пока я не наткнулся на код оптимальной отрисовки перекрывающихся окон. В этот момент я понял, что столько страниц ассемблерного кода я не потяну.

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

Read On →