...

суббота, 2 января 2021 г.

Ещё один способ использования python в браузере (и не только)

Предыстория

Весной 2020 года я впервые попробовал себя в разработке сайтов бэкенд я писал на питоне а на фронте пришлось использовать js и он вызвал у меня отторжение(тут надо уточнить, что я не считаю js ужасным языком, просто он мне не понравился). Не долго думая я начал писать транслятор с питона в явускрипт(а если бы погуглил то нашел бы это и это). об этом трансляторе и пойдет речь.

Отличия от других трансляторов

В процессе разработки я читал о явескрипт и не много о других языках (ruby, lua, php) и заметил что в них много общего, например наличие условных конструкций, функций, переменных и тд. И тогда я подумал почему бы не добавить возможность трансляции не только в js но и другие языки.

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

def bin_op(left, right, op):
    return f"({left}{op}{right})"

а для lisp он будет выглядеть так:

def bin_op(left, right, op):
    return f"({op} {left} {right})"

А так же также отличительной чертой является возможность добавления макросов например целочисленное деление в js:

signs = {"//": lambda l, r: f"Math.floor({l}/{r})"}

Кому это нужно

Одним из вариантов использования проекта является написание скриптов в играх, так как питон довольно тяжелый для встроенного языка то можно использовать трансляцию в lua.

Так же можно использовать его как линтер для python с исправлением ошибок в именах функций.

Ну и для поддержки проектов с языками вызывающими у вас отторжение(как у меня js или pascal) ну или просто устаревшие языки.

Важно

В некоторых местах статьи можно подумать, что считаю некоторые языки какими-то не такими. Я рассматриваю языки как две части: его синтаксис(тут python для меня почти идеал) и как платформу.

Все говорят, что язык это инструмент и нужно уметь пользоваться разными, то есть молотком отвертку не заменишь. Так вот молоток и отвертка - это платформы, а их ручка это синтаксис.

Лучше всего это видно на примере java. Java(jvm) - это распространённая, быстрая платформа, а синтаксис и языки для нее разные: Kotlin, Java, Clojure и многие другие.

Что поддерживается

На момент написания статьи добавлен только один язык js, так же я пробовал транслировать в go, но только на уровне hello world и делал код робота катающегося по линии на ардуино(c++).

А так же пока не сделана документация.

Поддерживаются блоки if...elif...else, while, for(C подобный и for each), возможность писать с аннотациями типов. Так же поддерживаются макросы. В общем пока можно писать программы уровня олимпиадного программирования.

Планы на будущее

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

И еще хотелось бы web интерфейс как на этой картинке:

P.S.

Это вторая попытка написания статьи.

Поддержите проект звездочкой на гитхаб

Присоединяйтесь к телеграм каналу

Let's block ads! (Why?)

Systemd для продолжающих. Part 1 — Запуск юнитов по временным событиям

Всем привет! В последнее время я вплотную занимаюсь исследованием возможностей systemd и решил поделиться результатом исследований с сообществом, в виде небольшого (или большого, как пойдёт ;-) цикла статей. Итак первым (уже нет) номером нашей программы будет запуск юнитов по различным событиям происходящим во время работы ОС. В качестве исследовательской платформы будет выступать Manjaro Linux c systemd v247.2. И... да. Некоторые события, вынудили меня написать внеочередную статью, которая «взлетела на вершину хит-парада», а опрос показал, что тема актуальна и вызывает интерес, так что погнали!

Пролог

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

pacman -Ql $(pacman -Qsq systemd|xargs)|egrep '^systemd\s|^systemd-sysvcompat\s'|egrep "man/man[1|5|8]/[[:print:]]*\.gz"|wc -l
278

И это только маны описывающие конфиги, пользовательские и администраторские утилиты systemd. Если же не ограничивать поиск практической частью, то цифра будет ещё более «устрашающей»:

pacman -Ql $(pacman -Qsq systemd|xargs)|egrep '^systemd\s|^systemd-sysvcompat\s'|wc -l
1852

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

Disclamer: Хоть в официальной документации и манах почти не используется такое понятие как триггеры (хотя и используется «triggered by»), но все те штуки которые описаны в этой и следующей статье, по сути, именно ими и являются. Это сущности которые срабатывают по каким-либо событиям, поэтому не удивляйтесь, если я, авторским произволом, буду использовать этот термин.

Часть первая, очевидная. Таймеры.

Все мы знаем старый, добрый cron, во всех его проявлениях. Созданный ещё в 80-х, он, в том или ином виде, дожил до нашего времени облачных сервисов. Так-же мы все знаем его ограничения. Например одной строчкой невозможно заставить крон запускать произвольный бинарник/скрипт раз в полтора часа, начная с часа ночи, приходится описывать такое событие двумя строчками. Что-бы обойти ограничения классического крона, в systemd были придуманы такие триггеры как таймеры (юниты с окончанием *.timer) умеющие запускать произвольные сервисы или группы сервисов (*.target) периодически; по наступлении какого-либо времени; по выходу системы из спящего режима; по календарному событию (наподобие того как это делает другой ветеран Unix утилит, команда at), а так-же по другим событиям, не связанными, напрямую, со временем.

Для начала… что запускаем. Возьмём, для примера, таймер man-db.timer из комплекта поставки одноимённого пакета:

$ cat /usr/lib/systemd/system/man-db.timer
[Unit]
Description=Daily man-db regeneration
Documentation=man:mandb(8)

[Timer]
OnCalendar=daily
AccuracySec=12h
Persistent=true

[Install]
WantedBy=timers.target

Простой, коротенький таймер. Но в чём-же дело, почему не указано что мы запускаем? Всё нормально! По умолчанию, если в секции [Timer] отсутствует параметр Unit=, с указанием запускаемого юнита, systemd будет искать одноимённый *.service юнит. Проверяем!

$ cat /usr/lib/systemd/system/man-db.service
[Unit]
Description=Daily man-db regeneration
Documentation=man:mandb(8)
ConditionACPower=true

[Service]
Type=oneshot
# Recover from deletion, per FHS.
ExecStart=+/usr/bin/install -d -o root -g root -m 0755 /var/cache/man
# Expunge old catman pages which have not been read in a week.
ExecStart=/usr/bin/find /var/cache/man -type f -name *.gz -atime +6 -delete
# Regenerate man database.
ExecStart=/usr/bin/mandb --quiet
User=root
Nice=19
IOSchedulingClass=idle
IOSchedulingPriority=7

Да, вот он сервис который ежедневно пересоздаёт базу данных страниц руководства. Сервис стартует начиная с 00:00 (OnCalendar=daily) , с точностью 12 часов (AccuracySec=12h), то-есть он может сработать в любой момент между полуночью и полднем, в зависимости от загрузки системы:

$ systemctl status man-db.timer 
● man-db.timer - Daily man-db regeneration
     Loaded: loaded (/usr/lib/systemd/system/man-db.timer; disabled; vendor preset: disabled)
     Active: active (waiting) since Thu 2020-12-31 23:18:59 MSK; 1 day 19h ago
    Trigger: Sun 2021-01-03 00:00:00 MSK; 5h 30min left
   Triggers: ● man-db.service
       Docs: man:mandb(8)

дек 31 23:18:59 dell-lnx systemd[1]: Started Daily man-db regeneration.

Минимальная точность у параметра AccuracySec= — 1us! Чем больше этот параметр, тем меньше нагрузка на систему. Если параметр отсутствует, то по умолчанию (указано в /etc/systemd/system.conf: DefaultTimerAccuracySec=) он равен одной минуте. Ладно, это всё лирика, давайте быстренько пробежимся по другим возможным параметрам секции [Timer], а на сладкое оставим параметры задания времени в OnCalendar= и других «временнЫх» параметрах.

Монотонные таймеры, для периодических событий

  • OnBootSec= Таймер сработает через указанное время после старта системы.

  • OnStartupSec= Для системных таймеров действие аналогично предыдущему, для пользовательских таймеров, это время после первого логина пользователя в систему.

  • OnActiveSec= Один из параметров для периодического запуска. Через какое время, после реального времени срабатывания таймера, запускать юнит.

  • OnUnitActiveSec= Триггер будет ориентироваться на время последнего запуска целевого юнита.

  • OnUnitInactiveSec= Триггер будет ориентироваться на последнее время завершения работы целевого юнита. Хорошо для долгоиграющих сервисов. Бэкапы и вот это вот всё. Все эти таймеры можно комбинировать между собой и с таймером OnCalendar=.

Прочие параметры

  • RandomizedDelaySec= Этакий рандомный джиттер. Перед срабатыванием добавляется случайный таймаут от нуля, до заданного значения. По умолчанию -- отключено.

  • OnClockChange=, OnTimezoneChange= Булевые параметры, определяющие будет-ли таймер реагировать на перевод системных часов или смену временной зоны. По умолчанию, оба параметра, false.

  • Persistent= Записывать-ли на диск состояние таймера сразу после запуска юнита. Актуально для параметра OnCalendar=. По умолчанию — false.

  • WakeSystem= Ещё один логический параметр. Действует на монотонные таймеры. По умолчанию отключён. Логика следующая. При отключённом параметре все монотонные таймеры запоминают своё состояние, перед уходом системы в спящий режим и встают на паузу. После выхода системы из спящего режима, отсчёт продолжается с того момента с которого система «ушла в спячку». Если-же параметр поставить в true, то таймеры продолжают работать и в спящем режиме (должно поддерживаться и железом) и по наступлении события выводят систему из спячки и запускают юнит.

  • RemainAfterElapse= Последняя крутилка, по умолчанию true Смысл этого параметра примерно следующий, После срабатывания таймера он остаётся загруженным, но если поставить false, то после срабатывания таймер выгружается и перестаёт отслеживать время. Хорошо для одноразовых юнитов (Transient Units) о которых мы поговорим в одной из следующих статей. Или для таймеров которые должны сработать один раз, как это делают задания старой, доброй at.

Таймстампы, диапазоны, тестирование, примеры

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

[Unit]
Description=Test timer

[Timer]
OnCalendar=01:00
OnActiveSec=1.5h

Ну это слишком просто. Например мы хотим что-б наш юнит запускался каждую пятницу 13-е… OnCalendar=Fri *-*-13 12:00:00 Полный формат календарной формы выглядит так: Mon 2025-12-01 00:00:00.000000 Europe/Moscow Поэтому мы можем запускать таймер по времени другого часового пояса (по умолчанию текущий) Например хотим что-б таймер прислал нам уведомление, что Камчатка уже отпраздновала Новый год: OnCalendar=yearly Asia/Kamchatka Нормализованная форма будет выглядеть так(эти строчки указывают на одно и то-же время):
OnCalendar=*-01-01 00:00:00 Asia/Kamchatka Алиасы (и их эквиваленты в нормализованной форме) могут быть такими:

                       minutely → *-*-* *:*:00
                         hourly → *-*-* *:00:00
                          daily → *-*-* 00:00:00
                        monthly → *-*-01 00:00:00
                         weekly → Mon *-*-* 00:00:00
                         yearly → *-01-01 00:00:00
                      quarterly → *-01,04,07,10-01 00:00:00                                                      
                   semiannually → *-01,07-01 00:00:00

Примеры валидных таймстампов:

таймстамп с @ — epoch time
        Fri 2012-11-23 11:12:13 → Fri 2012-11-23 11:12:13
            2012-11-23 11:12:13 → Fri 2012-11-23 11:12:13
        2012-11-23 11:12:13 UTC → Fri 2012-11-23 19:12:13
                     2012-11-23 → Fri 2012-11-23 00:00:00
                       12-11-23 → Fri 2012-11-23 00:00:00
                       11:12:13 → Fri 2012-11-23 11:12:13
                          11:12 → Fri 2012-11-23 11:12:00
                            now → Fri 2012-11-23 18:15:22
                          today → Fri 2012-11-23 00:00:00
                      today UTC → Fri 2012-11-23 16:00:00
                      yesterday → Fri 2012-11-22 00:00:00
                       tomorrow → Fri 2012-11-24 00:00:00
      tomorrow Pacific/Auckland → Thu 2012-11-23 19:00:00
                       +3h30min → Fri 2012-11-23 21:45:22
                            -5s → Fri 2012-11-23 18:15:17
                      11min ago → Fri 2012-11-23 18:04:22
                    @1395716396 → Tue 2014-03-25 03:59:56

Здесь представлены таймстампы как для OnCalendar=, так и для монотонных таймеров.

Перечисления и диапазоны:

Боольшой список примеров
      Sat,Thu,Mon..Wed,Sat..Sun → Mon..Thu,Sat,Sun *-*-* 00:00:00
          Mon,Sun 12-*-* 2,1:23 → Mon,Sun 2012-*-* 01,02:23:00
                        Wed *-1 → Wed *-*-01 00:00:00
               Wed..Wed,Wed *-1 → Wed *-*-01 00:00:00
                     Wed, 17:48 → Wed *-*-* 17:48:00
    Wed..Sat,Tue 12-10-15 1:2:3 → Tue..Sat 2012-10-15 01:02:03
                    *-*-7 0:0:0 → *-*-07 00:00:00
                          10-15 → *-10-15 00:00:00
            monday *-12-* 17:00 → Mon *-12-* 17:00:00
      Mon,Fri *-*-3,1,2 *:30:45 → Mon,Fri *-*-01,02,03 *:30:45
           12,14,13,12:20,10,30 → *-*-* 12,13,14:10,20,30:00
                12..14:10,20,30 → *-*-* 12..14:10,20,30:00
      mon,fri *-1/2-1,3 *:30:45 → Mon,Fri *-01/2-01,03 *:30:45
                 03-05 08:05:40 → *-03-05 08:05:40
                       08:05:40 → *-*-* 08:05:40
                          05:40 → *-*-* 05:40:00
         Sat,Sun 12-05 08:05:40 → Sat,Sun *-12-05 08:05:40
               Sat,Sun 08:05:40 → Sat,Sun *-*-* 08:05:40
               2003-03-05 05:40 → 2003-03-05 05:40:00
     05:40:23.4200004/3.1700005 → *-*-* 05:40:23.420000/3.170001
                 2003-02..04-05 → 2003-02..04-05 00:00:00
           2003-03-05 05:40 UTC → 2003-03-05 05:40:00 UTC
                     2003-03-05 → 2003-03-05 00:00:00
                          03-05 → *-03-05 00:00:00
                         hourly → *-*-* *:00:00
                          daily → *-*-* 00:00:00
                      daily UTC → *-*-* 00:00:00 UTC
                        monthly → *-*-01 00:00:00
                         weekly → Mon *-*-* 00:00:00
        weekly Pacific/Auckland → Mon *-*-* 00:00:00 Pacific/Auckland
                         yearly → *-01-01 00:00:00
                       annually → *-01-01 00:00:00
                          *:2/3 → *-*-* *:02/3:00

Да. Микро и наносекунды тоже поддерживаются, а ещё очень удобная функция конца месяца и счётчик:

  • *-*~01 — Первый день с конца каждого месяца (он-же последний день месяца).

  • *-05~05 — 27-e мая каждого года (31-5).

  • Mon *-12~07/1 — Последний понедельник декабря.

  • Mon *-12-01/3 — Третий понедельник декабря.

Проверять таймстампы на валидность можно при помощи утилиты systemd-analyze:

$ systemd-analyze calendar 'Mon *-12-01/1'
  Original form: Mon *-12-01/1              
Normalized form: Mon *-12-01/1 00:00:00     
    Next elapse: Mon 2021-12-06 00:00:00 MSK
       (in UTC): Sun 2021-12-05 21:00:00 UTC
       From now: 11 months 2 days left

$ systemd-analyze timespan 1.5h
Original: 1.5h      
      μs: 5400000000
   Human: 1h 30min

$ systemd-analyze timestamp 01:00:30.9999
  Original form: 01:00:30.9999              
Normalized form: Sat 2021-01-02 01:00:30 MSK
       (in UTC): Fri 2021-01-01 22:00:30 UTC
   UNIX seconds: @1609538430.999900         
       From now: 18h ago 

Вот так, в принципе, всё просто, логично и красиво. И разумеется напочитать:

man systemd.timer
man systemd.time
man systemd-system.conf
man systemd-analyze
man tzselect

Список статей серии

  1. Почему хабражители предпочитают велосипеды, вместо готовых решений? Или о systemd, part 0

  2. Systemd для продолжающих. Part 1 — Запуск юнитов по временным событиям

Let's block ads! (Why?)

[Перевод] Заброшенный сайд-проект, который превратился в бизнес с доходом в 200 млн долларов в год

20-летний путь Бена Честната, основателя MailChimp


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

После увольнения в 2000 году Бен Честнат занялся тем, что знал лучше всего, — разработкой веб-сайтов. За эти годы он создал около двух тысяч рекламных баннеров для своего бывшего работодателя, газеты Cox. Он точно знал, как создавать интерактивные объекты в Интернете.
И я подумал… Что ж, это наш шанс открыть компанию. Мой деловой партнёр и я просто нашли клиентов. Мы пошли стучаться в двери по коридору от нашего офиса. И у нас появились оплачиваемые проекты. Мы получили проекты на 13 000 и 32 000$. Даже до получения лицензии на бизнес.

К сожалению, для управления студией веб-дизайна ваше умение говорить по телефону куда важнее вашего мастерства в дизайне. Студии часто привлекают самый причудливый бизнес, где мнения клиентов заменяют реальные ключевые показатели эффективности, а успокаивающий голос может быть важнее движения продукта. Естественно, группа интровертов и внимательных дизайнеров под названием Rocket Science Group не смогла добиться успеха в среде, где внешность важнее сущности.



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

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

Родился Сhimp


В Rocket Science Group творческие умы уставали от многократного внедрения одной и той же функции на веб-сайты своих клиентов: инструмента для создания списков рассылки. Описанная работа была повторяющейся и созрела для творческой автоматизации. Чтобы избавиться от бремени, команда разработала универсальное решение с самообслуживанием и взимала с клиентов по 1 центу за каждое отправленное письмо.
Вместо того чтобы игнорировать проблему, Бен и Дэн определили это как возможность помочь своим клиентам решить её. Они взяли код из созданного ими неудавшегося продукта цифровой поздравительной открытки и настроили его, чтобы в 2001 году запустить MailChimp для клиентской базы своей веб-студии.

Слух распространялся медленно. Старые клиенты, которые больше не работали с Rocket Science Group, всё ещё использовали инструмент электронной почты. Владельцы малого бизнеса, которые никогда не были клиентами агентства, начали обращаться с запросами. В то время как Бен был сосредоточен на том, чтобы обеспечить студию, его инструмент электронной почты тихо вырастил своих собственных маленьких последователей.

Суммы по-прежнему были незначительными. Когда вы гонитесь за проектами веб-дизайна на 30 000$, несколько счетов на 50$ не требуют особого внимания. По иронии судьбы, именно всё более неэффективная задача выставления этих небольших счетов побудила Бена ввести модель ежемесячной подписки и создать функциональность, связанную с кредитной картой для MailChimp, что фактически породило один из первых продуктов SaaS.

Как фоновый инструмент, используемый внутри компании, без вложений превращается в гигантского промышленного гиганта стоимостью 4,2 млрд. долларов? Расскажем коротко — используя партизанские приемы:

  1. Полувирусная модель freemium — основная причина успеха Chimp, она способствовала его росту со 100 тыс. до 1 млн. пользователей всего за год. В то время было новшеством предоставить пользователям бесплатный доступ ко всей вашей платформе. Взрывной успех модели freemium был двояким: во-первых, каждое «бесплатное» электронное письмо содержало в сносках логотип MailChimp, создавая полувирусный цикл органических переходов; поскольку пользователям приходилось платить только после того, как они набирали определённое количество писем в своём списке, получение вашего первого платного плана MailChimp действовало как обряд, на который вы должны были «заработать» свой путь.
  2. Нишевые социальные платформы. Изначально компания называлась Code. Blog. Tweet. Repeat просто потому, что эта маркетинговая стратегия работала. В 2007 году Twitter был гораздо менее загружен, и MailChimp получил большую известность в сети. Точно так же они купили рекламу, которую будут воспроизводить в начале каждого нового эпизода криминального подкаста под названием Serial. Сегодня подкаст стал хитом — он был первым, достигшим 5 млн. загрузок в истории подкастов, но покупка рекламы на нём была хипстерской вещью в то время, а следовательно, недорогой.
  3. Создатель маркетинговых кампаний. В 2014 году диктор одного из рекламных подкастов случайно неправильно произнёс MailChimp как MailKimp. Рекламу транслировали миллиону пользователей, но, по сути, компания решила превратить этот казус в целую маркетинговую кампанию. Вскоре появятся целые бренды MailShrimp, FailChips, VeilHymn и множество других спин-оффов Bumblesnuff-Crimpysnitch-esque были запущены вместе с удивительно креативными кампаниями. Странно? Вроде. Смешно? Просто посмотрите пародию на интервью с художником VeilHymn.
  4. The Chimp! Теории, стоящие за брендингом в качестве универсального продукта, часто бывают глупыми, но шимпанзе определённо сработали у Бена. Еще будучи веб-дизайнером, он узнал, что добавление обезьяны к любому маркетинговому дизайну повышает его эффективность. За прошедшие годы Chimp стал чемпионом бренда, отправляя глупые комментарии пользователям при входе в систему, отключив их в режиме «вечеринки» в настройках. Серьёзно, сколько ещё почтовых платформ вы сможете назвать?

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

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

Бен: «Контент, который мы выпускаем, похож на… Второй шанс в жизни… Как узнать, когда нужно держаться, а когда сдаться… С такой борьбой [малые] предприниматели сталкиваются постоянно. [… ] Мы хотим помочь им выбраться из кухни».

Это звучит банально, но секрет успеха Бена заключается в том, что он был честен с самим собой, зная о своих сильных и слабых сторонах. Когда отец Бена купил ему компьютер, Бен не учился программированию — он научился рисовать в программе, для запуска которой требовалось 5 дискет. На самом деле в детстве он хотел стать карикатуристом. MailChimp — невероятное достижение инженерной мысли? Возможно. Но его сущность — креативность, и этого, по-видимому, достаточно, чтобы построить технологическую компанию на миллиарды.

Заткнись и возьми наши деньги!


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

Главная причина, по которой Бен мог сделать это, заключается в том, что MailChimp с самого первого дня был приносящим доход программным обеспечением. Цены на продукт менялись на протяжении многих лет (за электронную почту — > ежемесячную подписку — > freemium), но, в отличие от таких продуктов, как WhatsApp, у него была очень чёткая модель дохода, не предполагавшая продажи данных пользователей. Кроме того, крайне важно учитывать, что MailChimp был побочным продуктом управляемой Беном студии, через которую MailChimp финансировался изначально.

Бен: «Для нас это время было интересным. Это были первые дни SaaS, никто по-настоящему не решал проблемы с помощью подхода SaaS или для малого бизнеса. Так что у нас была хорошая возможность пойти на это в одиночку. И мы всегда просто зарабатывали кучу денег, потому что мы были единственными, кто был готов заниматься электронной почтой (очень непривлекательным бизнесом) для малого бизнеса, который тоже не очень привлекателен».

Непохоже, что Бен был против того, чтобы брать деньги инвестора. Но мир всё ещё восстанавливался после того, как лопнули доткомы, а венчурные компании не жаждали бросаться деньгами в интернет-компании. Многие опасались модели SaaS freemium, которая была новой в то время. Большинство инвесторов, с которыми встречался Бен, утверждали, что MailChimp должна нацелиться на предприятия, потому что там большие деньги, а не на малый бизнес.

Инвесторы не могли проверить доходность. Зачем обслуживать сильно фрагментированную, эмоциональную, малобюджетную аудиторию малого бизнеса, когда 30% выйдут из бизнеса через 2 года, а 50% — в ближайшие 5 лет? Исходя из личного опыта Бен понимал, что, даже когда сольные проекты терпят неудачу, они сохраняют свои списки рассылки и большинство из них начинают что-то новое в будущем. Таким образом, MailChimp не обязательно теряет клиента, даже если он временно уходит из бизнеса.

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

Бен: «Я в этом бизнесе уже 19 лет. Так что у меня были волны конкурентов, которые брали деньги инвесторов, и я прошёл через стадии, когда говорил: «Господи, сейчас они меня убьют». Финансирование становится всё больше и больше… и, кажется, ничего не происходит. Мы просто держим прицельный фокус [...] и всё в порядке».

Мог бы MailChimp расти ещё быстрее, если бы у проекта были деньги VC? Возможно. Но, скорее всего, и корпоративные инвесторы постепенно отщепили бы культуру творчества и инноваций MailChimp, что и сделало компанию особенной.

7 интересных фактов о Бене Честнате и MailChimp


  1. Для Бена смесь запахов сигаретного дыма и лака для волос — это запах бизнеса. Его мама устроила парикмахерскую на их кухне, и именно так Бен в детстве познакомился с предпринимательством.
  2. При приёме на работу Бен ищет «скромных преподавателей», которые «настолько хороши, что просят критики». Ему нужны люди, которые достаточно уверены в своих силах, чтобы у них не было проблем с оспариванием их взглядов или с простым объяснением сложных понятий. Бен говорит, что, если человек не может рассказать что-то до глупости просто, он не подходит для MailChimp.
  3. Первый нанятый Беном человек и (предположительно технический) соучредитель Дэн Курциус на собеседовании солгал, что знает, как писать код. После того как он получил работу, он собрал прототип MailChimp, используя книги «HTML для чайников». Дэн так старался, что фактически создал (или украл) чистый функциональный код, который поразил Бена. Только через 10 лет соучредитель рассказал Бену о своей импровизации.
  4. Бен подтвердил, что отклонил предложение о приобретении MailChimp за миллиард долларов от неуказанной компании. В свою защиту он говорит, что «миллиард долларов не намного больше, чем несколько сотен миллионов».
  5. Держащийся в тени соучредитель Дэн Курциус регулярно и анонимно посещает предприятия малого бизнеса, использующие MailChimp, — от студий йоги до складов. Таким образом, компания получает бесценную обратную связь, например, так компания узнала о факте, что многие компании используют MailChimp как CRM, а не как инструмент электронной почты. Это действительно немного странно, когда на мероприятиях MailChimp крупнейшие критики позже узнают, что они разговаривали с соучредителем.
  6. Одна из любимых книг Бена — «Человек в поисках смысла» Виктора Франкла.  Франкл — психиатр, переживший концентрационный лагерь во время Холокоста. В книге он документирует, как заключённые находят смысл и цель даже в самых бесчеловечных условиях.
  7. Девиз Бена: люби то, что делаешь, а не традиционное делай то, что любишь. Он говорит«Со временем все страсти угаснут, если вы превратите их в профессию, и единственный способ сохранить чувство цели — научиться любить ремесло, в котором вы хорошо разбираетесь».

Ребята, никто не придёт


В качестве эпилога я бы хотел оставить тебе одну из моих любимых цитат Бена Честнета:
Когда тучи сгущаются и становится тяжело — что часто бывает, когда ты предприниматель, — я вспоминаю кое-что, что я понял, когда вырос в Апсоне, в Джорджии. Это то, что я сказал друзьям, когда мы заблудились, бродили по лесу. Я сказал: «Ребята, никто не придёт». [Бен смеётся] Это звучит не очень позитивно или как-то так, простите, но это то, что вы должны понять: никто не придёт! Всё зависит от нас! Когда ты предприниматель, никто не придёт тебе на помощь. Тебе решать, что нужно делать, чтобы выбраться из этого бардака. Но если ты выберешься из него, к тебе присоединится много людей. [...] Я постоянно говорю это себе.
image

Другие профессии и курсы
ПРОФЕССИИ


КУРСЫ

Let's block ads! (Why?)

Учебные материалы для школы программирования. Часть 1

Наш век запомнится мне, как время стартапов. От школьника-активиста, до жителя Кремниевой долины - все делают своих единорогов. Как поняли - так и делают. Я тоже не прошла мимо тренда на безграничные возможности самореализации, и запустила школу программирования для детей Step to Science. Время жизни этого проекта было наполнено открытиями, борьбы со страхами, маленькими и большими победами, ошибками и много чем еще. Весной 2020 года команда столкнулась с сами знаете с чем, и, немного порефлексировав, я приняла решение закрыть проект.

За годы работы школы, был найден оптимальный алгоритм обучения ребят занимательной науке разработки игр на Unity 3D. Мы перебрали много тем, которые смогли захватить интерес школьников от 10 до 16 лет, опробовали десятки способов передачи информации, тренировки навыков и оценки заложенных знаний. Эта кропотливая работа принесла нам отличные результаты, в виде комплексной программы по созданию компьютерных игр на Unity 3D, и учебных успехов, которые достигали наши ребята!

Этими результатами и успехами мне хочется поделиться с широкой аудиторией. Если вы ведете кружок программирования или робототехники, а может, вы родитель, ищущий ответ на вопрос "чем увлечь подростка?" - я предлагаю вам воспользоваться материалами школы абсолютно безвозмездно, то есть, даром!

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

Spoiler

Справка для моих коллег - педагогов:

Unity3D – это популярный движок разработки 3D-игр и интерактивных приложений для различных платформ и устройств. ПО обладает понятным и удобным интерфейсом; большим количеством мощных вспомогательных средств, связанных с проектированием и дизайном; современным уровнем трехмерной графики и спецэффектов.

Образовательные цели

· Знакомство с работой движка и языком программирования C#; 

· Освоение на практике основных принципов и технологий создания современных трехмерных компьютерных игр; 

· Формирование навыков моделирования объектов, создания персонажей и анимации, навыков работы с текстурами и освещением, проектированием ландшафта, работы со звуком, спецэффектами; 

Образовательные задачи

· Создать портфолио проектов ученика; 

· Получить практические навыки профессионального разработчика игровых приложений; 

· Прохождение полного цикла знакомства с профессией game development. 

Количество детей в группе: 7-10 человек. 

Возраст детей: 10-16 лет. 

Форма и режим занятий: занятия проходят в практической форме, 2 раза в неделю по 2 академических часа с 10 минутным перерывом. 

Минимальные технические требования к ПК: OS Windows 7 SP1+, 8, 10, только 64-разрядные версии; ЦП поддержка набора инструкций SSE2; видеокарта с поддержкой DX10 (версия шейдеров 4.0).

Общая продолжительность программы: 2 модуля по 48 часов каждый.

Знакомство с Unity 3D мы начнем с легкой в разработке и веселой игры "Spaceship". Этот проект мы всегда делали на первом пробном занятии, т.к. благодаря простоте, ученик быстро получает желаемый результат, укрепляется в вере в свои силы, получает массу положительных эмоций и в глазах зажигается тот самый, желаемый родителями, интерес к новым знаниям!

Итак, поехали!

Spaceship

В данном занятии рассмотрено создание простого космического симулятора.


Занятие является пробным и рассчитано 1.5 - 2 часа времени.


Версия Unity 3D – от 5.5 и выше. На компьютеры учеников должен быть скопирован файл «Spaceship_template» (если ссылка сломалась - пишите в Telegram @Evgeniya_Koroleva).

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

Порядок выполнения.

Откроем юнити и создадим новый 3D проект, нажав на кнопку “New”. Дадим проекту имя и нажмём “Create project”.

Откроется окно редактора. На данном этапе стоит рассказать ученикам о назначении основных вкладок и окон. В рамках данного занятия, рассматриваем только самые основные, представленные на скриншоте.

Также, особо стоит отметить режим игры, который вызывается кнопкой «Play». В режиме игры мы тестируем то, что у нас получилось и экспериментируем с параметрами. В данном режиме нельзя сохранять изменения на карте, а те изменения, которые были сделаны при нажатой кнопке «Play», автоматически отменятся при выходе из режима игры в режим редактирования.

Чтобы выйти из режима игры, ещё раз нажмём на «Play».

Стоит проследить, чтобы все ученики вышли из режима игры перед началом работы. Первое, с чего стоит начать проект — это импортировать все необходимые для занятия ресурсы. Необходимо свернуть редактор и открыть двойным кликом приложенный ассет «Spaceship_template». Импортируем его полностью, нажав на клавишу «Import».

Заменим стандартный скайбокс на скайбокс «Млечный путь». Для этого необходимо вызвать окно освещения.

В данном окне надо найти поле Skybox Material и нажать на кнопку выбора материала.

В появившемся окне выбрать двойным кликом материал MilkyWay.

Окно «Lighting» можно закрыть.


Чтобы небо отображалось в окне «Scene» редактора, должна быть нажата кнопка показа неба и атмосферных эффектов (выделено красным) , а в выпадающем списке должна стоять галочка напротив пункта «Skybox» (выделено синим).

Космическому симулятору необходимы точки, смотря на которые мы бы понимали, что объект двигается. Для этого проекта такой точкой является космический корабль SF_Corvette-F3.
Найдём его в ресурсах и выложим на сцену.

Скорее всего, камера окажется внутри корабля и в окне «Game» корабль будет виден наизнанку. Выберем инструмент «Move tool» (выделен красным) и выдвинем камеру наверх.

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


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

Следующим этапом будет расположение игрока перед камерой. Выложим модель игрока на сцену и с помощью инструмента «Move tool» установим его перед камерой, чтобы игрок был в поле её зрения.

Чтобы камера лучше видела игрока, можно развернуть её с помощью инструмента «Rotate tool».

Настало время добавить кораблю способность двигаться. На данном этапе стоит рассказать ученикам о том, что всё поведение объектов полностью зависит от компонентов, которые находятся на этом объекте. Допустим, объект SpaceFighter содержит компонент Transform, который задаёт объекту его положение в пространстве. Чтобы корабль мог летать, необходимо добавить ему компонент физики. Выделим SpaceFighter и нажмём в панели настроек кнопку «Add Component», в появившемся выпадающем списке выберем Physics->Rigidbody.

Если сейчас мы нажмём на «Play», то мы увидим, что корабль падает.

Чтобы этого не происходило, нам необходимо отключить гравитацию. Для этого достаточно у компонента Rigidbody убрать галочку Use Gravity.

В самой нижней строке мы видим сообщение об ошибке. Это сообщение говорит нам о том, что требуется сделать пересчёт физической модели столкновения для объекта. Для этого откроем объект SpaceFighter, нажав на стрелочку рядом с ним и найдём объект Default. По умолчанию на данном объекте находится компонент Mesh Collider. Выставим на компоненте галочку Convex и увидим реальную физическую модель столкновений для данного объекта.

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

Теперь заставим наш объект двигаться. Для этого в объект SpaceFighter, рядом с Rigidbody, добавим ещё один компонент — Constant Force (выделено красным).

Данный компонент добавляет силу, которая будет двигать наш корабль. Чтобы объект полетел вперёд, выставим ему в отмеченном синим цветом поле значение в районе 100.

Нажав на «Play», мы можем видеть, как корабль улетает вдаль.

Теперь, прикрепим камеру к игроку. Для этого достаточно объект Main Camera перетянуть мышью на объект SpaceFighter.

Должно быть так

Теперь камера находится внутри нашего космического корабля и поэтому двигается вместе с ним.

Далее, необходимо добавить управление нашему игроку. Для этого в папке CustomResources/Scripts найдём скрипт Player_Battleship и перекинем его на игрока.

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

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

Теперь наш корабль, напротив, стал довольно медленно поворачиваться. Настроим управление корабля:

Теперь можно заметить ещё одну странность — корабль игрока проходит сквозь корабль SF_Corvette-F3. Чтобы этого избежать, необходимо на корабль SF_Corvette-F3 добавить компонент Mesh Collider.


Обратите внимание, что галочку Convex ставить нет необходимости. Данная опция нужна лишь для движущихся объектов, а этот корабль неподвижен.

Осталось немного — добавить фоновую музыку и звуки полёта.


Возьмём звук \Absolute Space & Sci-Fi Vol.1 - Sample Pack - Voltz Supreme\Preperation - 70 bpm\Variations\Preperation - No Snare or Vox.mp3 из папки проекта и просто перекинем на любой объект, допустим, на космический корабль SF_Corvette-F3.

В этом случае автоматически добавится компонент AudioSource, в котором можно будет настроить звук, например, убавить громкость (выделено синим). Рекомендуемый уровень громкости — 0.3.

Чтобы добавить звук полёта, возьмем звук Standard Assets\Vehicles\Aircraft\Audio\FlightWind.wav
и перетянем его на игрока. В настройках поставим галочку Loop (выделено синим) — это закольцует звук и он будет проигрываться постоянно. Скрипт Player_Battleship автоматически найдёт этот звук и будет управлять его громкостью в зависимости от скорости игрока.

Если учащиеся справилась с заданием раньше срока, можно добавить немного динамики нашему проекту. Для этого закинем на объект Main Camera скрипт Player_Camera и настроим в соответствии со скриншотом.

Также можно добавить следы на краях крыла: внутри объекта SpaceFighter есть две точки — trail и trail_1.
Добавим на них компонент Trail Renderer и протестируем - должны получиться яркие розовые линии.

Чтобы это исправить, в компоненте Trail Renderer найдём массив Materials, раскроем его, найдём поле Element0 и нажмём на кнопку выбора- кружок с правой стороны поля.

Выберем белый материал, допустим, этот:

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

В конце можно добавить простой прицел, создав объект типа Image и настроив его:

В поле Sprite компонента Image нажмём на кружок выбора и выберем текстуру прицела.

Выберем прицел.

В компоненте Image нажмём на появившуюся там кнопку Set Native Size (выделено красным). Дополнительно, можно выбрать цвет прицела, нажав на поле Color (выделено синим).

В конце занятия можно выполнить команду Build And Run, которая соберёт проект в виде уже готовой игры для компьютера, который ребята могут забрать домой, чтобы показать друзьям.
При этом появится диалоговое окно, где необходимо будет выбрать расположение и имя игры.

После данного действия будут созданы файл *.exe, папка *_GameData и UnityPlayer.dll, где * - выбранное имя. Файл UnityPlayer.dll в зависимости от версии может и не создаваться. Для работы готовой игры на другом компьютере все сгенерированные в ходе данного действия файлы и папки должны находиться в одной директории.

На этом мы завершаем первое занятие-знакомство с Unity 3D.

Следующие проекты - в следующих постах на habr. До скорых встреч!


P.S.: за помощь в подготовке проектов, невероятный преподавательский талант и незабываемый черный юмор, спасибо Александру Борисову!

Let's block ads! (Why?)

Вышла версия 1.0 библиотеки для управления секс-игрушками Buttplug

После 3,5 лет разработки компания Nonpolynomial обновила открытую библиотеку для секс-игрушек до версии 1.0. Библиотека управляет вибрацией с клавиатур, геймпадов и шлемов виртуальной реальности, а также синхронизирует импульсы с фильмами через плагины для VLC и Kodi.

С версии 1.0 реализацию для C# и JavaScript приостановили и сделали упор на развитие общей библиотеки. Она использует для работы FFI — механизма для использования подпрограмм, написанных на другом языке программирования. С ним разработчики Nonpolynomial смогли начать разработку библиотеки для Python, C++, Java/Kotlin и Unreal Engine.

Библиотека Buttplug унифицирует управление интимными девайсами и упрощает взаимодействие через протоколы USB, Bluetooth и последовательные порты. Вместо настройки алгоритмов каждого девайса отдельно, библиотека использует команды вида — «вибрация/вращение со скоростью x».

В 2017 году Кайл Макулис основал компанию Nonpolynomial и сделал упор при разработке Buttplug на удобство пользователей. Другие библиотеки — Chai3D и H3D — созданы для работы с любыми вибрационными модулями, а VRPN библиотека — менеджер интерфейсов HID. Разработчик Buttplug пытается объединить оба подхода в своём продукте.

Согласно списку на сайте, Buttplug поддерживает 447 интимных девайсов.

Библиотеку уже использовали для создания видеоплеера с поддержкой управления секс-игрушек, VR игры и клавиатурного тренажёра.

Let's block ads! (Why?)

Курс биткоина впервые превысил $30 тысяч

Источник фото с коллажа: РИА Новости / Алексей Витвицкий.

2 января 2021 года курс биткоина впервые превысил $30 тыс. Стоимость криптовалюты в течение 2020 года увеличилась в четыре раза. В декабре прошлого года прирост цены биткоина составил 50%.

Курс биткоина по данным CoinDesk на 15.30 мск.

В начале 2020 года биткоин стоил $7 тыс. 17 марта произошло его падение до $5 тыс. Далее до середины октября курс биткоина рос постепенно с небольшими спадами. 16 октября был достигнут уровень $11.5 тыс.

Под конец прошлого года у ведущей криптовалюты начался интенсивный рост. Это происходило благодаря притоку большого количества как новых инвесторов, так и появлению дополнительного интереса к торгам у институциональных инвесторов, среди которых Skybridge Capital (потратил $25 млн в декабре на покупку криптовалюты), MassMutual ($100 млн в декабре) и Guggenheim Investments (фонд уже потратил на покупку биткоин до 10% из своих $5 млрд). Причем инвестиционный директор Guggenheim Investments Скотт Майнерд считает, что биткоин «чрезвычайно недооценен» при текущих уровнях цен, так как должен стоить около $400 тыс. Другие эксперты предсказывают, что курс может быстро дойти до $100 тыс., при максимальном потолке в новом году — $300 тыс.

Некоторые эксперты считают, что в 2021 году курс биткоина ожидает корректировка. Это произойдет в том случае, если мировая экономика начнет восстанавливаться. Генеральный директор Binance Чанпэн Чжао другого мнения. Он рассказал CoinDesk, что большинство инвесторов ожидают продолжения роста биткоина в 2021 году. По мнению Чжао, долгосрочные экономические последствия пандемии неизвестны, мир все еще находится в эпицентре серьезных экономических потрясений и исторической нестабильности, поэтому биткоин и другая криптовалюта продолжат свой рост.

Текущая рыночная капитализация биткойна составляет около $550 млрд, что больше капитализации Visa. У одной из крупнейших в мире платежных систем этот параметр составляет около $485 млрд.

По данным CoinDesk, курс биткоина выше $29 тыс. в период 31 декабря-1 января был ожидаемой ситуацией на рынке. В связи с приближением конца года некоторые управляющие инвестфондами решили докупить криптовалюту, чтобы в следующем году они могли похвастаться тем, что они достаточно умны и смогли войти в 2021 год с хорошим портфелем. На Уолл-стрит это называется «украшением витрины». Например, гонконгская GreenPro Capital решила в конце года потратить на криптовалюту $100 млн.

CoinDesk пояснила, что сейчас ФРС США, наряду с центральными банками других стран, продолжает процесс печатания больших объемов денег, пытаясь предотвратить наихудшие экономические последствия пандемии. Такие действия рассматриваются многими инвесторами как потенциальные катализаторы инфляции, поэтому многие фонды, компании, трейдеры и розничные инвесторы вкладываются в биткоин, чтобы сохранить или увеличить свои капиталы.

2020 год вошел в историю криптовалюты как период созревания биткойна в качестве макроактива. В этом году известные публичные компании, например, MicroStrategy, диверсифицировали свои денежные резервы в криптовалюту. Аналитики JPMorgan опасаются, что в 2021 году рост интереса к биткойну может даже понизить стоимость золота.


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

16 декабря прошлого года цена биткоина впервые преодолела $20 тыс.

26 декабря 2020 года курс биткоина впервые превысил $25 тыс.

Let's block ads! (Why?)

[Перевод] Rust 1.49.0: aarch64 и улучшения во фреймворке тестирования

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

Если вы установили предыдущую версию Rust средствами rustup, то для обновления до версии 1.49.0 вам достаточно выполнить следующую команду:

rustup update stable

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


Что вошло в стабильную версию 1.49.0

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


64-bit ARM Linux перешёл в Tier 1

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


  • Tier 3 — технически, платформы поддерживаются компилятором, но мы не проверяли собирается ли на них код или проходят ли тесты, и мы не предоставляем каких-либо бинарных артефактов, как часть наших релизов.
  • Платформы из Tier 2 гарантированно собираются, но мы не запускаем для них тесты: предоставляемые артефакты могут быть не рабочими или быть с багами.
  • Для платформ из Tier 1 предоставляются наибольшие гарантии и мы запускаем все тесты для этих платформ для каждого изменения, влитого в компилятор. Также мы предоставляем для них собранные артефакты.

Начиная с Rust 1.49.0 платформа aarch64-unknown-linux-gnu передвигается на уровень поддержки Tier 1, предоставляя наши наибольшие гарантии для пользователей Linux, запущенных на 64-bit ARM системах! Мы ожидаем, что данное изменение принесёт пользу для всех: от встраиваемых систем до обычных компьютеров и серверов.

Это важный этап для нашего проекта, поскольку это первая не-x86 платформа, получившая Tier 1 поддержку: мы надеемся, этот шаг откроет путь для большего количества платформ, которые смогу достичь нашего высшего уровня поддержки.

Обратим внимание, что Android не затрагивается данным изменением, так как он представлен другой платформой, находящейся в Tier 2.


64-bit ARM macOS и Windows переходят в Tier 2

В Rust 1.49.0 ещё две платформы достигли Tier 2:


  • Платформа aarch64-apple-darwin предоставляет поддержку Rust на системах Apple M1.
  • aarch64-pc-windows-msvc предоставляет поддержку Rust на 64-bit ARM устройствах, работающих под Windows.

Теперь разработчики могут установить обе эти платформы при помощи rustup! Команда Rust не запускает тесты для данных платформ, так что они могут содержать баги или быть нестабильными.


Фреймворк для тестирования захватывает вывод из потоков

Встроенный в Rust фреймворк для тестирования довольно минималистичен, но это не значит, что его нельзя улучшить! Представьте, что тест выглядит примерно так:

#[test]
fn thready_pass() {
    println!("fee");
    std::thread::spawn(|| {
        println!("fie");
        println!("foe");
    })
    .join()
    .unwrap();
    println!("fum");
}

Вот как выглядел запуск этого теста до Rust 1.49.0:

❯ cargo +1.48.0 test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.38s
     Running target\debug\deps\threadtest-02f42ffd9836cae5.exe

running 1 test
fie
foe
test thready_pass ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests threadtest

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

Вы можете заметить, что вывод из потоков напечатался и смешался с выводом самого фреймворка. Было бы неплохо, если бы каждый println! работал также, как тот, что напечатал "fum"? Что ж, таково поведение в Rust 1.49.0:

❯ cargo test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.52s
     Running target\debug\deps\threadtest-40aabfaa345584be.exe

running 1 test
test thready_pass ... ok

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests threadtest

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

Но не расстраивайтесь, если тест упадёт, вы увидите всё, что он хотел вывести. Добавив в конец теста panic!, вы можете увидеть примерно такую ошибку:

❯ cargo test
   Compiling threadtest v0.1.0 (C:\threadtest)
    Finished test [unoptimized + debuginfo] target(s) in 0.52s
     Running target\debug\deps\threadtest-40aabfaa345584be.exe

running 1 test
test thready_pass ... FAILED

failures:

---- thready_pass stdout ----
fee
fie
foe
fum
thread 'thready_pass' panicked at 'explicit panic', src\lib.rs:11:5

В частности, средство запуска тестов обеспечивает захват вывода и сохраняет его в случае сбоя теста.


Изменения в стандартной библиотеке

В Rust 1.49.0 были стабилизированы следующие 3 функции:


И ещё две функции стали const:


Смотрите подробные примечания к выпуску для более детальной информации.


Другие изменения

Синтаксис, пакетный менеджер Cargo и анализатор Clippy также претерпели некоторые изменения.


Участники 1.49.0

Множество людей собрались вместе, чтобы создать Rust 1.49.0. Мы не смогли бы сделать это без всех вас. Спасибо!


От переводчиков

С любыми вопросами по языку Rust вам смогут помочь в русскоязычном Телеграм-чате или же в аналогичном чате для новичковых вопросов. Если у вас есть вопросы по переводам или хотите помогать с ними, то обращайтесь в чат переводчиков.
Так же можете поддержать нас на OpenCollective.

Данную статью совместными усилиями перевели andreevlex, funkill, ozkriff, blandger и fan-tom.

Let's block ads! (Why?)

Xiaomi лишили прав на товарный знак Mi Pad из-за жалобы Apple

Палата по патентным спорам удовлетворила жалобу компании Apple по товарному знаку «Mi Pad», принадлежавшего компании Xiaomi. По заявлению Apple, знак «Mi Pad» похож на уже существующие товарные знаки компании и вводит пользователей в заблуждение.

В своём заявлении компания Apple указала, что регистрируемый товарный знак «Mi Pad» похож на однотипные продукты и услуги под товарными знаками «iPad», «iPad Smart Case», «iPad». «iPad Pro», «iPad Mini» и «iPad Air».

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

Федеральная служба по интеллектуальной собственности согласилась с возражениями Apple и отменила регистрацию на Xiaomi товарного знака «Mi Pad».

По итогам проведённого анализа специалисты палаты по патентным спорам подтвердили возможное возникновение заблуждений из-за фонетических сходств между новым товарным знаком и линейкой продуктов компании Apple.

Сотрудники Роспатента также отметили усиление сходства из-за использования латинского алфавита в товарных знаках и «наличия у соответствующих словосочетания и слов близких составов соответствующих определённых букв латинского алфавита («Mi Pad» – «iPad»)».

Отличия в названиях товарных знаков признали второстепенными при восприятии их покупателями.

Правовая охрана товарного знака «Mi Pad» в России не предоставляется. Планшеты Xiaomi пока остались в продаже в сети магазинов «Связной».

Европейское патентное бюро удовлетворила похожую жалобу Apple на товарный знак Xiaomi в 2017 году. Тогда европейский суд постановил, что Xiaomi не может зарегистрировать товарный знак «Mi Pad» на территории Европы.

Let's block ads! (Why?)

Электромеханический арифмометр ВК-2

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

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

Арифмометр выпускался с 1951 по начало 1970-х. Данная модель выпущена в 1974 г., одна из последних. Сделан по образу и подобию шведской модели фирмы FACIT, которая выпускалась с 1939 года. Вес 11 кг.

В верхнем левом окошке отображается счетчик результата. В верхнем правом – счетчик оборотов. В нижнем – цифры, набранные на установочном барабане. Сдвоенная рукоятка слева от машины сбрасывает счетчики результата и оборотов соответственно.

Назначение рычажков и клавиш.

Клавиша с цифрой 0 служит для сброса. При ее нажатии установочный барабан обнуляется, сдвигается в крайнее правое положение и готов ко вводу нового числа.

Клавиши со стрелочками служат для ручного сдвига барабана на разряд влево, вправо и в крайнее левое положение (для операции деления). Эти клавиши аналогичны по назначению таким же у арифмометров «Феликс» и ВК-1.

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

Клавиша «х» ведет себя почти как клавиша «+», за исключением того, что после одного оборота автоматического обнуления не происходит и барабан может вращаться до тех пор пока клавиша держится нажатой. Это необходимо для операции умножения, далее рассмотрим подробнее почему это нужно.

Клавиша «÷» служит одновременно для вычитания и для деления. В автоматическом режиме запускается деление, в ручном – вычитание.

Большой рычажок внизу имеет 3 положения левое, среднее и правое и отвечает за автоматический сдвиг барабана. Если рычажок в правом положении, барабан автоматически сдвигается вправо (необходимо для операции деления), если в левом – сдвигается влево (необходимо для операции умножения), если в среднем – стоит на месте (при операциях сложения и вычитания).

Маленький рычажок под клавишей сброса (с надписью «СТОП») служит для прерывания работы если из-за неправильно выставленных рычажках машина зациклилась или делит на ноль. Также этот рычажок отвечает за автоматическое обнуление барабана после однократного нажатия на клавиши «х» или «÷».

Электромеханические кишочки машины. Как видно, внутри одни железки и нет ни единого полупроводника. Машина приводится в действие асинхронным электродвигателем.

Чтобы сложить два числа, рычажок внизу ставим в среднее положение. Обнуляем счетчики результата и оборотов. Набираем на установочном барабане первое слагаемое, нажимаем «+», набираем второе слагаемое, снова нажимаем «+». В счетчике результатов отобразится их сумма. Как видим, это происходит быстро и просто.

Кому-то может показаться это немного непривычным из-за отсутствия кнопки «=», но так было на всех машинах того времени. Более того, даже первые электронные калькуляторы повторяли приемы работы как на механических арифмометрах и на них тоже отсутствовала клавиша «=» (например, калькулятор Б3-24).

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

Вычитание производится аналогичным образом, только после ввода вычитаемого необходимо нажать не «+», а «÷».

Сложнее производится умножение. Оно, как было написано выше, полуавтоматическое. Это значит, что требуется внимание оператора. Обнуляем счетчики результата и оборотов. Рычажок внизу ставим в левое положение, на установочном барабане набираем первый множитель. Затем нажимаем и удерживаем клавишу «х» до тех пор пока в первом разряде счетчика оборотов не нащелкается такое число, сколько единиц во втором множителе. После отпускания клавиши барабан автоматически переместится на один разряд влево. Снова нажимаем и удерживаем клавишу «х» до тех пор пока во втором разряде счетчика оборотов не нащелкается количество десятков во втором множителе. Аналогичным образом пробегаем по всем разрядам второго множителя.

Это, наверное, может показаться сложным и непонятным, но на самом деле это я описываю процесс долго и нудно, если понять математический смысл операции, то на практике это происходит легко и быстро! А математический смысл операции умножения простой – он аналогичен умножению в столбик, которое все проходили в школе. Сначала мы умножаем первый множитель на количество единиц во втором, потом на количество десятков, потом сотен, и т. д. А промежуточные множители записываем со сдвигом на один разряд и потом суммируем. Машина делает то же самое. Именно для этого барабан и сдвигается каждый раз на один разряд. При умножении дробных чисел все происходит аналогично, но необходимо правильно расставить «запятые». Они подвижные и в круглом окошке у каждой запятой виднеется циферка на линейке. Так вот, у произведения запятая должна стоять на таком месте, чтобы ее цифра была суммой цифр запятых множителей.

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

В отличие от умножения, деление на машине полностью автоматическое. Обнуляем счетчики результата и оборотов. Рычажок внизу ставим в правое положение, на установочном барабане набираем делимое. Если мы хотим получить максимум значащих разрядов после запятой, делимое надо записать в левую часть счетчика результата. Затем набираем на барабане делитель и тоже смещаем влево. Далее нажимаем кнопку «÷» и остальное машина сделает сама! Машина последовательно пробежится по всем разрядам и остановится. В счетчике результата мы увидим частное от деления. Да, тут тоже нужно правильно расставить «запятые». Запятая у частного должна стоять на цифре, равной цифре делимого минус цифры делителя.

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

Небольшое видео с демонстрацией работы.

Что происходит на видео: вычисляем (758,36 + 44,20 - 356,99) * 125,74 / 14,01.

Сбрасываем счетчики, обнуляем барабан. Вводим число 758,36, прибавляем к нему 44,20, получаем промежуточный результат 802,56. Затем вычитаем из него 356,99 (промежуточный результат 445,57). Результат заново набираем на барабане, сбрасываем счетчики и умножаем его на 125,74 в полуавтоматическом режиме. Корректируем результат, получаем 56025,9718. Это число заново набираем на барабане, переносим в левую часть и делим на 14,01. Получаем окончательный результат 3998,9987.

Вопросы и замечания прошу писать в комментариях.

Let's block ads! (Why?)