Русский
Русский
English
Статистика
Реклама

Перевод с английского

Перевод Почему я считаю Haskell хорошим выбором с точки зрения безопасности ПО?

31.05.2021 18:12:13 | Автор: admin


Команда Typeable понимает ценность безопасности. Мы любим Haskell, но стоит ли его выбирать, если ваша цель создание защищенного программного обеспечения? Хотелось бы сказать да, но как и для большинства эмпирических вопросов о разработке ПО, здесь просто нет объективного доказательства, подтверждающего, что Haskell или ещё какой-нибудьй язык программирования обеспечивает большую безопасность, чем любой другой. Нельзя сказать, что выбор языка в Typeable не имеет значения для безопасности, но какое именно значение он имеет, еще нужно подумать.


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


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


   Чисто техническая            Уязвимость, относящаяся        уязвимость                исключительно к предметной области                                                                                           Инструментарий Инструментарий  Нужно     должен исправить может помочь  подумать

На оси выше показан источник различных уязвимостей программного обеспечения. На крайнем правом конце мы видим ошибки, связанные исключительно с доменной областью, то есть ошибки, совершенно не зависящие от используемого инструментария. Примером такой ошибки являются контрольные вопросы, которые в начале 2000-х использовались многими веб-сервисами для восстановления паролей. Зачастую это были вопросы типа Девичья фамилия вашей матери?. Позднее, примерно в 2009-2010 годах, возникло такое явление, как социальные сети, и неожиданно девичья фамилия матери перешла в категорию общедоступной информации. Неважно, какую технологию вы используете для реализации такой схемы с контрольными вопросами. Эта схема все равно не работает.


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


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


В таких сервисах обычно есть соблазн записать файл пользователя непосредственно в файловую систему сервера. Однако под каким именем файла? Использовать непосредственно имя файла пользователя верный путь к катастрофе, так как оно может выглядеть как ../../../etc/nginx/nginx.conf, ../../../etc/passwd/ или любые другие файлы, к которым сервер имеет доступ, но не должен их изменять.


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


Использование шкалы


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


В идеале современный инструментарий должен практически полностью устранять чисто технические уязвимости. Например, большинство современных языков, таких как Haskell, C# и Java, по большей части обеспечивают защиту содержимого памяти и в целом предотвращают переполнение буфера, попытки дважды освободить одну и ту же ячейку, а также другие технические проблемы. Однако от правильного инструментария можно получить еще больше пользы. Например, легко представить себе систему, в которой имеется техническая возможность разделить абсолютный и относительный пути к файлу, что упрощает контроль атак с обходом каталога (path traversal), таких как загрузка пользователем файла поверх какого-нибудь важного конфигурационного файла системы.


Haskell нижняя часть шкалы


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


// From imaginary CSRF token protection:if ($tokenHash == $hashFromInternet->{'tokenHash'}) {  echo "200 OK - Request accepted", PHP_EOL;}else { echo "403 DENIED - Bad CSRF token", PHP_EOL;};

Видите, в чем здесь проблема? В большинстве динамических языков, таких как PHP, тип записи JSON определяется в процессе выполнения и зачастую основывается на структуре входных данных. Кроме того, в объектно-ориентированном программировании тип используется для выбора поведения с помощью динамической диспетчеризации, что фактически позволяет злоумышленнику выбирать, какой код будет исполнен. Наконец, в языке PHP равенство, выраженное через ==, зависит от типа вводимых данных, и в приведенном выше примере атакующий может полностью обойти защиту.


Аналогичная проблема возникла с Java (и другим языками, см. https://frohoff.github.io/appseccali-marshalling-pickles/). Java предложил исключительно удобный способ сериализации любого объекта на диск и восстановления этого объекта в исходной форме. Единственной досадной проблемой стало отсутствие способа сказать, какой объект вы ждете! Это позволяет злоумышленникам пересылать вам объекты, которые после десериализации в вашей программе превращаются во вредоносный код, сеющий разрушения и крадущий данные.


Это не значит, что вы не можете создать безопасный код на PHP или не можете получить такие же ошибки в Haskell, однако по своей природе Haskell не склонен к таким уязвимостям. Если переложить приведенный выше пример кода на Haskell, он будет выглядеть примерно так:


data Request = Request {csrfToken :: Token, ... other fields}doSomething :: Session -> Request -> Handler ()doSomething session request  | csrfToken session == csrfToken request = ... do something  | otherwise = throwM BadCsrfTokenError

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


Haskell середина шкалы


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


Прежде всего, в Haskell имеется возможность моделировать данные более точно по сравнению с такими языками, как как C, Javascript или даже Java. В основном это обусловлено удобством его синтаксиса и наличием типов-сумм. Точное моделирование данных имеет значение для безопасности, поскольку код домена в основном представляет собой модель некоторого реального явления. Чем меньше ее точность, тем больше возможностей имеют злоумышленники.


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


data SSN = Unknown | Redacted | SSN Text

А теперь сравним моделирование той же идеи с использованием строковых величин "", "<REDACTED>" и "191091C211A". Что произойдет, если пользователь введет "<REDACTED>" в поле ввода SSN? Может ли это в дальнейшем привести к проблеме? В Haskell об этом можно не беспокоиться.


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


storeFileUpload :: Path Abs File -> ByteString -> IO ()storeFileUpload path = ...

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


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


Haskell и ошибки домена


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


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


Однако это все догадки. Сообщество Haskell до сих пор достаточно мало, чтобы не быть объектом атак, а специалисты по Haskell в общем случае еще не так сильно озабочены проблемами безопасности, как разработчики на Javascript или Python.


Заключение


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

Подробнее..

Дружим Angular с Google

27.08.2020 18:04:37 | Автор: admin

Дружим Angular с Google


Google ненавидит SPA


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


Одностраничные приложения приятно отличаются динамичностью взаимодействия с пользователем и более сложным UX. Но как не прискорбно обычно пользовательский опыт приносится в жертву SEO оптимизации. Для сеошника сайт на angular это такая себе проблема поискаовикам трудно индексировать страницы с динамическим контентом.


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


site preview


Мы любим JS и Angular. Мы верим, что классный и удобный UX может быть построен с на этом стеке технологий, и мы можем решить все сопутствующие проблемы. В какой-то момент мы наткнулись на Angular Universal. Это модуль Angular для рендеринга на стороне сервера. Сначала нам показалось что вот оно решение, но радость была преждевременной и отсутствие больших проектов, с его применением, было доказательством этого. Шесть месяцев назад мы надеялись найти production ready решение, но поняли, что нет больших проектов, написанных на Universal.


В итоге, мы начали разрабатывать компоненты для интернет-магазина, используя обычный Angular 2, и ждали, когда Universal будет объединен с Angular Core. На данный момент слияния проектов еще не поизошло, и пока не ясно, когда это произойдет (или как итоговый вариант будет совместим с текущей реализацией), однако сам Universal уже перекочевал в github репозиторий Angular.


Не смотря на эти трудности, наша цель осталась неизменной создавать классные веб-приложения на Angular с серверным рендерингом для индексации поисковиками. В результате наша команда разработала более 20 универсальных компонентов для быстрой сборки интернет-магазина. Как в итоге это было достигнуто?


Что такое Angular Universal


Прежде всего, давайте обсудим, что такое Angular Universal. Когда мы запустим наше приложение на Angular 2 и откроем исходный код, увидим что-то вроде этого:


<!DOCTYPE html><html><head>  <meta charset="utf-8">  <title>Angular 2 app</title>  <!-- base url -->  <base href="http://personeltest.ru/aways/habr.com/"><body>  <app></app></body></html>

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

Для решения проблем c индексацией Angular Universal дает нам возможность выполнять рендеринг на стороне сервера. Наша страница будет создаваться на бэкэнд-сервере, написанном на Node.Js, .NET или другом языке, и браузер пользователя получит страницу со всеми привычными тегами в ней -заголовками, мета-тегами и контентом.


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


До этого момента все выглядит не плохо? Возможно, но дьявол скрыт в мелочах, как всегда.


Итак, мы хотим поделиться с вами подводными камнями, с которыми мы столкнулись на нашем пути.


Подводные камни Angular Universal


Не трогайте DOM


Когда мы начали тестировать компоненты нашего магазина с помощью Universal, нам пришлось потратить некоторое время, чтобы понять, почему наш сервер падает при запуске без вывода серверной страницы. Например, у нас есть компонент Session Flow component, который отслеживает активность пользователя во время сессии (перемещения пользователя, клики, рефферер, информация об устройстве пользователя и т.д.). После поиска информации в issues на GitHub мы поняли, что в Universal нет обертки над DOM.


DOM на сервере не существует.


Если вы склонируете этот Angular Universal стартер и откроете browser.module.ts вы увидите, что в массиве providers разработчики Universal предоставляют дваboolean значения:


providers: [    { provide: 'isBrowser', useValue: isBrowser },    { provide: 'isNode', useValue: isNode },    ...  ]

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


@Injectable()export class SessionFlow{    private reffererUrl : string;    constructor(@Inject('isBrowser') private isBrowser){        if(isBrowser){            this.reffererUrl = document.referrer;        }    }}

Universal автоматически добавляет false, если это сервер, и true, если браузер. Может быть, позже разработчики Universal пересмотрят эту реализацию и нам не придется беспокоиться об этом.


Если вы хотите активно взаимодействовать с элементами DOM, используйте сервисы Angular API, такие какElementRef, Renderer или ViewContainer.


Правильный роутинг


Поскольку сервер отражает наше приложение, у нас была проблема с роутингом.


Ваш роутинг на клиенте, написанный на Angular, должен соответствовать роутингу на сервере.


Поэтому не забудьте добавить тот же роутинг на сервере что и на клиенте. Например, у нас есть такие роуты на клиенте:


    [      { path: '', redirectTo: '/home', pathMatch: 'full' },      { path: 'products', component: ProductsComponent },      { path: 'product/:id', component: ProductComponent}    ]

Тогда нужно создать файл server.routes.ts с массивом роутов сервера. Корневой маршрут можно не добавлять:


export const routes: string[] = [  'products',  'product/:id'];

Наконец, добавьте роуты на сервер:


import { routes } from './server.routes';... other server configurationapp.get('/', ngApp);routes.forEach(route => {  app.get(`/${route}`, ngApp);  app.get(`/${route}/*`, ngApp);});

Пререндеринг стартовой страницы


Одной из наиболее важных особенностей Angular Universal является пререндеринг. Из исследования Kissmetrics 47% потребителей ожидают, что веб-страница загрузится за 2 секунды или даже менее. Для нас было очень важно отобразить страницу как можно быстрее. Таким образом, пререндеринг в Universal как раз про нашу задачу. Давайте подробнее рассмотрим, что это такое и как его использовать?


Когда пользователь открывает URL нашего магазина, Universal немедленно возвращает предварительно подготовленную HTML страничку с контентом, а уже затем затем начинает загружать все приложение в фоновом режиме. Как только приложение полностью загрузится, Universal подменяет изначальную страницу нашим приложением. Вы спросите, что будет, если пользователь начнет взаимодействовать со страницей до загрузки приложения? Не беспокойтесь, библиотека Preboot.js запишет все события, которые выполнит пользователь и после загрузки приложения выполнит их уже в приложении.


Чтобы включить пререндеринг, просто добавьте в конфигурацию сервера preboot: true:


res.render('index', {      req,      res,      preboot: true,      baseUrl: '/',      requestUrl: req.originalUrl,      originUrl: `http://localhost:${ app.get('port') }`    });  });

Добавление мета-тегов


В случае SEO-ориентированного сайта добавление мета-тегов очень важно. Например, у нас есть Product component, который представляет страницу определенного продукта. Он должен асинхронно получать данные о продуктах из базы данных и на основе этих данных добавлять мета-теги и другую специальную информацию для поискового робота.


Команда Angular Universal создала сервис angular2-meta, чтобы легко манипулировать мета-тегами. Вставьте мета-сервис в ваш компонент и несколько строк кода добавлят мета-теги в вашу страницу:


import { Meta, MetaDefinition } from './../../angular2-meta';@Component({  selector: 'main-page',  templateUrl: './main-page.component.html',  styleUrls: ['./main-page.component.scss']})export class MainPageComponent {  constructor(private metaService: Meta){    const name: MetaDefinition = {      name: 'application-name',      content: 'application-content'    };    metaService.addTags(name);  }}

В следующей версии Angular этот сервис будет перемещен в @angular/platform-server


Кэширование данных


Angular Universal запускает ваш XHR запрос дважды: один на сервере, а другой при загрузке приложения магазина.


Но зачем нам нужно запрашивать данные на сервере дважды? PatricJs создал пример, как сделать Http-запрос на сервере один раз и закэшировать полученные данные для клиента. Посмотреть исходный код примера можно здесь. Чтобы использовать его заинжекте Model service и вызовите метод get для выполнения http-вызовов с кешированием:


    public data;    constructor(public model: ModelService) {        this.universalInit();    }    universalInit() {        this.model.get('/data.json').subscribe(data => {        this.data = data;        });    }

Выводы


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

Подробнее..

Из песочницы Для чего на самом деле нужны стрелочные функции в JavaScript

21.11.2020 20:20:09 | Автор: admin
Привет, Хабр! Представляю вашему вниманию перевод статьи The real reason why JavaScript has arrow functions автора Martin Novk.


* фраза-мем из игры Skyrim

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

Это пример того же кода, написанного также и в традиционном стиле:

const arrowFunction = (arg1, arg2) => arg1 + arg 2;const traditionalFunction = function(arg1, arg2) {  return arg1 + arg2;};

Вы можете заметить, что код гораздо короче, когда написан с использованием стрелочной функции. Все, что написано до стрелки аргументы, после стрелки возвращаемый результат.
Если вам нужна функция, которая содержит несколько действий, вы можете записать её в такой форме:

const arrowFunction = (arg1, arg2) => {  const result = arg1 + arg2;  return result;};

Стрелочные функции также часто называют лямбда-функциями и они используются не только в JavaScript. Язык Python может послужить хорошим примером где также встречаются лямбда-функции.

В Python их синтаксис выглядит следующим образом:

lambdaFunction = lambda a, b : a + b

Упрощай


Использование стрелочных функций мотивирует вас упрощать код в соответствии с KISS принципом (Keep-it-simple-stupid) и принципом единственной ответственности (каждая функция отвечает только за одно конкретное действие).

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

Функции первого класса


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

document.querySelector('#myButton').addEventListner('click', function() {  alert('click happened');});

Здесь показана анонимная функция, переданная как аргумент в addEventListener. Данный метод часто применяется в Javascript для колбэков.

Пример возвращения функции другой представлен ниже:

const myFirstClassFunction = function(a) {  return function(b) {    return a + b;  };};myFirstClassFunction(1)(2); // => 3

Однако, со стрелочной функцией, все выглядит гораздо чище:

const myFirstClassArrow = a => b => a + b;myFirstClassArrow(1)(2); // => 3

Здесь все просто: то, что написано до последней стрелки аргументы, а после нее вычисление. По факту, мы работаем с несколькими функциями, а также мы можем использовать несколько вызовов fn(call1)(call2);

Частичное применение


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

const add = a => b => a + b;const increaseCounter = counter => add(1)(counter);increaseCounter(5); // => 6const pointFreeIncreaseCounter = add(1);pointFreeIncreaseCounter(5); // => 6

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

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

Функциональное программирование


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

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

Чистые функции полагаются только на входные данные и всегда возвращают какое-то значение. Они никогда не изменяют (мутируют) другие переменные и не зависят внешних данных, за пределами входных значений. Это приводит к ссылочной прозрачности, которое упрощает программирование.

И да, всегда есть возможность писать огромное количество кода, не изменяя ни одной переменной.

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

Стрелочные функции заключение


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

Реальный функциональный пример


Чтобы понять, что же скрывается в кроличьей норе, давайте взглянем на пример использования open-source библиотеки @7urtle/lambda

import {trim, upperCaseOf, lengthOf, lastLetterOf, includes, compose} from '@7urtle/lambda';const endsWithPunctuation = input =>  includes(lastLetterOf(input))('.?,!');const replacePunctuationWithExclamation = input =>  substr(lengthOf(input) - 1)(0)(input) + '!';const addExclamationMark = input =>  endsWithPunctuation(input)    ? replacePunctuationWithExclamation(input)    : input + '!';const shout = compose(addExclamationMark, upperCaseOf, trim);shout(" Don't forget to feed the turtle.");// => НЕ ЗАБУДЬ ПОКОРМИТЬ ЧЕРЕПАХУ!

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

JavaScript может быть сложным в его непоследовательности между использованием Си-подобного синтаксиса и особенностей функционального программирования. Чтобы помочь людям лучше разобраться и предоставить доступ к материалам для изучения, я разработал библиотеку @7urtle/lambda. Вы можете освоить функциональное программирование в своем ритме и сайт www.7urtle.com поможет вам изучить данную парадигму, предоставив вам все необходимые инструменты.
Подробнее..

Перевод Перенос процесса BPMN из IBM BPM в Camunda пошаговое руководство

21.07.2020 22:23:56 | Автор: admin
Привет, Хабр! Представляю вашему вниманию перевод статьи Migrating process BPMN from IBM BPM to Camunda Step-by-step Tutorial автора Joe Pappas.

Если вы думаете, что сможете экспортировать BPMN из IBM, что сможете открыть его в Camunda Modeler, вас может ждать сюрприз. Как было обнаружено, экспорт IBM BPMN не включает в себя информацию о диаграммах, которую такие инструменты, как Camunda Modeler, используют для отображения диаграммы. В этом руководстве мы рассмотрим два подхода, используя утилиты, разработанные нашей командой консультантов, чтобы помочь вам создать полную диаграмму, которую можно открыть и просмотреть не только в Camunda Modeler, но и в любом BPMN-совместимом инструменте проектирования.



Команда Camunda Consulting создала набор свободно доступных инструментов для миграции процессных потоков. Инструменты для миграции процессных потоков IBM можно найти здесь. Вы заметите, что в настоящее время есть два инструмента для IBM. Один это BPMN-конвертер, а другой Teamworks-файл, он же .twx конвертер. Сначала мы рассмотрим инструкцию по BPMN конвертеру, а затем перейдем к .twx конвертеру.


Руководство по конвертеру BPMN


Преобразователь BPMN можно найти здесь. Вы заметите, что это проект Maven, который можно открыть практически в любой интегрированной среде разработки. Eclipse и Intellij две из самых популярных IDE. Но сначала вам нужно будет клонировать или скачать репозиторий инструментов миграции это можно сделать здесь.


Для этого руководства мы будем использовать Eclipse в качестве нашей IDE.


  • После клонирования или загрузки Git-репозитория скопируйте содержимое репозитория экспортного конвертера инструментов IBM BPMN в свежее рабочее пространство. Если, например, ваш Git-репозиторий находится на C:\gitRepos, то конвертер IBM BPMN вы найдете на C:\gitRepos\migrate-to-camunda-tools\IBM\create diagram from exported BPMN.
  • Скопируйте всю папку в выбранную вами рабочую область.
  • Далее запускаем Eclipse и выбираем рабочую область, в которую только что скопировали содержимое. После запуска Eclipse перейдите к File > Import > General > Projects from Folder or Archive.
  • Нажмите на кнопку Next. В появившемся диалоговом окне нажмите на Directory (Каталог) и перейдите к папке, в которую вы только что скопировали содержимое вашей рабочей области. Ваш экран должен выглядеть примерно так (см. ниже).
  • Нажмите Finish.

Перенос процесса BPMN из IBM BPM в Camunda

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


Далее мы создадим конфигурацию Run, которая позволит вам запустить конвертер в Eclipse:


  • Щелкните правой кнопкой мыши по корневой папке проекта и выберите Run As > Run Configurations...
  • В появившемся диалоговом окне дважды щелкните по Java Application, чтобы создать новую конфигурацию. Название проекта уже заполнено в этом диалоговом окне. При желании вы можете дать этой конфигурации новое имя.
  • Далее необходимо выбрать основной класс. Нажмите кнопку Search, вы увидите, доступен только один класс BPMNDiagramGenerator. Выберите его и нажмите на кнопку OK.
  • Ваш экран должен выглядеть примерно так:

Перенос процесса BPMN из IBM BPM в Camunda

Теперь вам нужно предоставить два аргумента, первый это экспорт BPMN из IBM, а второй имя преобразованного файла. На всякий случай укажите путь и имена файлов в разделе Program arguments вкладки Arguments, заключенные в кавычки. Для начала будет предоставлен пример BPMN-файла. Для использования этого примера введите следующие данные для входного и выходного файлов:


./src/main/resources/SampleBPMNfromIBM.bpmn
./src/main/resources/Converted.bpmn


Ваш экран должен выглядеть примерно так:


Перенос процесса BPMN из IBM BPM в Camunda

Нажмите на Run. Должно открыться консольное окно, в котором вы увидите следующее:


BPMN diagram generated Diagram ./src/main/resources/SampleBPMNfromIBM.bpmn converted from IBM BPMN and can be found at ./src/main/resources/Converted.bpmn


Используя Camunda Modeler, откройте Converted.bpmn файл и среди вещей, которые вы заметите, будет 'swimlane', теперь 'pool' в Camunda BPMN, не совсем подходит как вы могли бы ожидать.


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


Вот пример процесса, созданного в Blueworks Live и экспортированного как BPMN:


Перенос процесса BPMN из IBM BPM в Camunda

И вот процесс в Camunda Modeler после того, как отсутствующая диаграмма была сгенерирована и пул был соответствующим образом скорректирован:


Перенос процесса BPMN из IBM BPM в Camunda

В следующем разделе мы рассмотрим другой инструмент, использующий другой формат экспорта IBM BPM, который сохранит точность исходной диаграммы.


Преобразование IBM BPM .twx файлов экспорта


Если требуется точность диаграмм и вы можете экспортировать свои процессы в формат .twx (также известный как Teamworks), то инструмент миграции .twx то, что нужно. Файл .twx это формат обмена проектами для IBM BPM, который содержит информацию о диаграммах в своих zipped xml файлах. xml-файлы, описывающие процессы, похожи на BPMN-файлы, но, скорее всего, не являются BPMN-файлами. Проект, с которым мы будем работать, действительно содержит пример xml файла, но мы рассмотрим, как вы можете извлечь нужные файлы из своего twx-файла.


Если вы уже клонировали/загрузили git-репозиторий, просто повторите шаги, описанные ранее, чтобы скопировать и открыть проект в рабочей области Eclipse. Вы даже можете использовать рабочую область, созданную ранее. Просто убедитесь, что инструмент .twx скопирован в отдельный каталог.


Далее мы создадим конфигурацию Run для образца, включенного в проект. Снова щелкните правой кнопкой мыши по корневой папке проекта и выберите команду Run As > Run Configurations.... Дважды щелкните по Java Applications среди вариантов, указанных в диалоговом окне. Если вы используете ту же рабочую область, что и раньше, убедитесь, что в качестве проекта было выбрано создание BPMN из TWX-экспорта. Выполните поиск основного класса, хотя в этот раз вы можете увидеть несколько вариантов. Убедитесь, что в качестве основного класса выбран BPMNGenFromTWX. Далее нам понадобится предоставить два аргумента для класса, один для входа и один для вывода, как и раньше.


./src/main/resources/TWXOriginal.xml ./src/main/resources/TWXConverted.bpmn


Нажмите на Run. Должно открыться консольное окно, в котором вы увидите следующее:


BPMN diagram generated Diagram ./src/main/resources/TWXOriginal.xml converted from IBM .twx export and can be found at ./src/main/resources/TWXConverted.bpmn


Папка ресурсов содержит PNG файл (PictureOfProcess.PNG) оригинального процесса в IBM и будет выглядеть следующим образом:


Перенос процесса BPMN из IBM BPM в Camunda

Используя Modeler, откройте TWXConverted.bpmn, и он должен выглядеть следующим образом:


Перенос процесса BPMN из IBM BPM в Camunda

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


Ваши собственные процессы в IBM BPM


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


После извлечения содержимого перейдите в корневую папку, а затем продолжите переход в папку /objects. Как вы увидите, она содержит ряд xml файлов, которые будут включать процессы вместе с потоками тренера. Обычно, процессы являются самыми большими файлами, и их имя начинается с "25", за которым следует длинная строка буквенно-цифровых символов. Откройте эти файлы-кандидаты в любимом текстовом редакторе. В самом начале файла вы увидите что-то вроде:


Перенос процесса BPMN из IBM BPM в Camunda

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


Создание jar-файла


Если вы хотите просто создать jar-файл любой из утилит, у вас есть несколько вариантов:


  • Один из них щелкнуть правой кнопкой мыши по файлу pom.xml и выбрать Run As > Maven install.
  • Другой вариант щелкнуть правой кнопкой мыши по корневой папке, выбрать Show in Local Terminal и выполнить следующую команду Maven: mvn clean package install.

В любом случае (или используя предпочитаемый вами метод) вы должны получить jar-файл в папке /target. Скопируйте эту jar куда угодно и введите следующую команду в терминале:


java -jar yourGeneratedJarFile.jar your input file your output file


Вот так! Пожалуйста, не стесняйтесь оставлять отзывы на форуме и смотрите этот Git-репозиторий на дополнительные конвертеры по мере их появления.

Подробнее..

Из песочницы Vulkan. Руководство разработчика

25.10.2020 22:04:29 | Автор: admin
Я работаю техническим переводчиком Ижевской IT-компании CG Tribe, которая предложила мне внести свой вклад в сообщество и начать публиковать переводы интересных статей и руководств.

Здесь я буду публиковать перевод руководства к Vulkan API. Ссылка на источник vulkan-tutorial.com. Поскольку переводом этого же руководства занимается еще один пользователь Хабра kiwhy (http://personeltest.ru/aways/habr.com/ru/users/kiwhy/), мы договорились
разделить уроки между собой. В своих публикациях я буду давать ссылки на главы, переведенные kiwhy.

Содержание
1. Вступление

2. Краткий обзор

3. Среда разработки

4. Отрисовка треугольника

  1. Подготовка к работе
  2. Отображение на экране
  3. Основы графического конвейера (pipeline)
  4. Отрисовка
  5. Повторное создание цепочки показа

5. Буферы вершин

  1. Описание
  2. Создание буфера вершин
  3. Staging буфер
  4. Буфер индексов

6. Uniform-буферы

  1. Дескриптор layout и буфера
  2. Дескриптор пула и sets

7. Текстурирование

  1. Изображения
  2. Image view и image sampler
  3. Комбинированный image sampler

8. Буфер глубины

9. Загрузка моделей

10. Создание мип-карт

11. Multisampling

FAQ

Политика конфиденциальности

1. Вступление


См. статью автора kiwhy habr.com/ru/post/462137

2. Краткий обзор


Предпосылки возникновения Vulkan

Как нарисовать треугольник?

  1. Шаг 1 Экземпляр (instance) и физические устройства
  2. Шаг 2 Логическое устройство и семейства очередей
  3. Шаг 3 Window surface и цепочки показа (swap chain)
  4. Шаг 4 Image views и фреймбуферы
  5. Шаг 5 Проходы рендера
  6. Шаг 6 Графический конвейер (pipeline)
  7. Шаг 7 Пул команд и буферы команд
  8. Шаг 8 Основной цикл
  9. Выводы

Концепты API

  1. Стандарт оформления кода
  2. Слои валидации

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

Предпосылки возникновения Vulkan


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

По мере развития архитектуры видеокарт в ней стало появляться все больше программируемых функций. Все новые функции необходимо было каким-то образом объединить с существующими API. Это привело к неидеальным абстракциям и множеству гипотез со стороны графического драйвера о том, как воплотить замысел программиста в современных графических архитектурах. Поэтому для повышения производительности в играх выпускается большое количество обновлений драйверов. Из-за сложности таких драйверов среди поставщиков часто возникают расхождения, например, в синтаксисе, принятом для шейдеров. Помимо этого, в последнее десятилетие также наблюдался приток мобильных устройств с мощным графическим оборудованием. Архитектуры этих мобильных GPU могут сильно отличаться в зависимости от требований по размерам и энергопотреблению. Одним из таких примеров является тайловый рендеринг, который может дать большую производительность за счет лучшего контроля над функционалом. Еще одним ограничением, связанным с возрастом API, является ограниченная поддержка многопоточности, что может привести к появлению узкого места со стороны ЦП.

Vulkan помогает решить эти проблемы, поскольку изначально создан для современных графических архитектур. Это снижает потери на стороне драйвера за счет того, что разработчики могут четко описать свои цели с помощью подробного API. Vulkan позволяет параллельно создавать и отсылать команды в нескольких потоках. Также снижаются расхождения компиляции шейдеров за счет перехода на стандартизованный формат байтового кода и использования одного компилятора. И наконец, Vulkan реализует главную возможность современных видеокарт, объединяя графические и вычислительные возможности в едином API.

Как нарисовать треугольник?


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

Шаг 1 Экземпляр (instance) и физические устройства

Работа с Vulkan начинается с настройки Vulkan API через VkInstance (экземпляр). Экземпляр создается с помощью описания вашей программы и всех расширений, которые вы хотите использовать. После создания экземпляра вы можете запросить, какое оборудование поддерживает Vulkan, и выбрать один или несколько VkPhysicalDevices для выполнения операций. Вы можете сделать запрос по таким параметрам, как размер VRAM и возможности устройств, чтобы выбрать желаемые устройства, если вы предпочитаете использовать специализированные видеокарты.

Шаг 2 Логическое устройство и семейства очередей

После того, как вы выберете подходящее hardware устройство для использования, вам необходимо создать VkDevice (логическое устройство), где вы более подробно опишете, какие возможности (VkPhysicalDeviceFeatures) будете использовать, например, рендеринг в несколько viewport-ов (multi viewport rendering) и 64-битные floats. Вам также необходимо установить, какие семейства очередей вы бы хотели использовать. Многие операции, совершаемые с помощью Vulkan, например, команды рисования и операции в памяти, выполняются асинхронно после отправки в VkQueue. Очереди выделяются из семейства очередей, где каждое семейство поддерживает определенный набор операций. Например, для операций с графикой, вычислительных операций и передачи данных памяти могут существовать отдельные семейства очередей. Кроме того их доступность может использоваться в качестве ключевого параметра при выборе физического устройства. Некоторые устройства с поддержкой Vulkan не предлагают никаких графических возможностей, однако, все современные видеокарты с поддержкой Vulkan, как правило, поддерживают все необходимые нам операции с очередями.

Шаг 3 Window surface и цепочки показа (swap chain)

Если вас интересует не только внеэкранный рендеринг, вам необходимо создать окно для отображения отрендеренных изображений. Окна можно создать с помощью API исходной платформы или библиотек, таких как GLFW и SDL. В руководстве мы будем использовать GLFW, подробнее о которой мы расскажем в следующей главе.

Нам необходимо еще два компонента, чтобы рендерить в окно приложения: window surface (VkSurfaceKHR) и цепочка показа (VkSwapchainKHR). Обратите внимание на постфикс KHR, который обозначает, что эти объекты являются частью расширения Vulkan. Vulkan API полностью независим от платформы, поэтому нам необходимо использовать стандартизованное расширение WSI (Window System Interface) для взаимодействия с менеджером окон. Surface это кроссплатформенная абстракция окон для визуализации, которая, как правило, создается с помощью ссылки на собственный дескриптор окна, например HWND в Windows. К счастью, библиотека GLFW имеет встроенную функцию для работы со специфичными деталями платформы.

Цепочка показа это набор целей рендеринга. Ее задача обеспечивать, чтобы изображение, которое рендерится в текущий момент, отличалось от отображаемого на экране. Это позволяет отслеживать, чтобы отображались только готовые изображения. Каждый раз, когда нам нужно создать кадр, мы должны сделать запрос, чтобы цепочка показа предоставила нам изображение для рендеринга. После того, как кадр создан, изображение возвращается в цепочку показа, чтобы в какой-то момент отобразиться на экране. Количество целей рендеринга и условий для отображения готовых изображений на экране зависит от текущего режима. Среди таких режимов можно выделить двойную буферизацию (vsync) и тройную буферизацию. Мы рассмотрим их в главе, посвященной созданию цепочки показа.

Некоторые платформы позволяют рендерить непосредственно на экран через расширения VK_KHR_display и VK_KHR_display_swapchain без взаимодействия с каким-либо менеджером окон. Это позволяет создать surface, которая представляет собой весь экран и может использоваться, например, для реализации вашего собственного менеджера окон.

Шаг 4 Image views и фреймбуферы

Чтобы рисовать в изображение (image), полученное из цепочки показа, мы должны обернуть его в VkImageView и VkFramebuffer. Image view ссылается на определенную часть используемого изображения, а фреймбуфер ссылается на image views, которые используются как буферы цвета, глубины и шаблонов (stencil). Поскольку в цепочке показа может быть множество разных изображений, мы заранее создадим image view и фреймбуфер для каждого из них и выберем необходимое изображение во время рисования.

Шаг 5 Проходы рендера

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

Шаг 6 Графический конвейер (pipeline)

Графический конвейер в Vulkan настраивается с помощью создания объекта VkPipeline. Он описывает конфигурируемое состояние видеокарты, например, размер viewport или операцию буфера глубины, а также программируемое состояние, используя объекты VkShaderModule. Объекты VkShaderModule создаются из байтового кода шейдера. Драйверу также необходимо указать, какие цели рендеринга будут использоваться в конвейере. Мы задаем их, ссылаясь на проход рендера.

Одна из наиболее отличительных особенностей Vulkan по сравнению с существующими API-интерфейсами заключается в том, что почти все системные настройки графического конвейера должны задаваться заранее. Это значит, что если вы хотите переключиться на другой шейдер или немного изменить vertex layout, вам необходимо полностью пересоздать графический конвейер. Поэтому вам придется заранее создать множество объектов VkPipeline для всех комбинаций, необходимых для операций рендеринга. Только некоторые базовые настройки, такие как размер viewport и цвет очистки, могут быть изменены динамически. Все состояния должны быть описаны явно. Так, например, не существует смешивания цветов (color blend state) по умолчанию.

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

Шаг 7 Пул команд и буферы команд

Как уже было сказано, многие операции в Vulkan, например операции рисования, должны быть отправлены в очередь. Прежде чем отправить операции, их необходимо записать в VkCommandBuffer. Буферы команд берутся из VkCommandPool, который связан с определенным семейством очередей. Чтобы нарисовать простой треугольник, нам нужно записать буфер команд со следующими операциями:

  • Начать проход рендера
  • Привязать графический конвейер
  • Нарисовать 3 вершины
  • Закончить проход рендера

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

Шаг 8 Основной цикл

После того, как мы отправили команды рисования в буфер команд, основной цикл кажется достаточно простым. Сначала мы получаем изображение из цепочки показа с помощью vkAcquireNextImageKHR. Затем мы можем выбрать соответствующий буфер команд для этого изображения и запустить его с помощью vkQueueSubmit. В конце, мы возвращаем изображение в цепочку показа для вывода на экран с помощью vkQueuePresentKHR.

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

Выводы

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

Подведем краткий итог. Для отрисовки первого треугольника нам необходимо:

  • Создать VkInstance
  • Выбрать поддерживаемую видеокарту (VkPhysicalDevice)
  • Создать VkDevice и VkQueue для рисования и отображения
  • Создать окно, window surface и цепочку показа
  • Обернуть изображения цепочки показа в VkImageView
  • Создать проход рендера, который определяет цели рендеринга и их использование
  • Создать фреймбуфер для прохода рендера
  • Настроить графический конвейер
  • Распределить и записать команды рисования в буфер для каждого изображения цепочки показа
  • Отрисовать кадры в полученные изображения, отправляя правильный буфер команд и возвращая изображения обратно в цепочку показа

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

Концепты API


В заключение к текущей главе будет приведен краткий обзор того, как структурируются Vulkan API на более низком уровне.

Стандарт оформления кода

Все функции, перечисления и структуры Vulkan обозначены под заголовком vulkan.h, который включен в Vulkan SDK, разработанный LunarG. Установка SDK будет рассмотрена в следующей главе.

Функции имеют префикс vk в нижнем регистре, перечисляемые типы (enum) и структуры имеют префикс Vk, а перечисляемые значения имеют префикс VK_. API активно использует структуры, чтобы предоставить параметры функциям. Например, создание объектов обычно происходит по следующей схеме:

image

Многие структуры в Vulkan требуют прямого указания типа структуры в члене sType. Член pNext может указывать на структуру расширения и в нашем руководстве всегда будет иметь тип nullptr. Функции, создающие или уничтожающие объект, будут иметь параметр VkAllocationCallbacks, который позволяет вам использовать собственный аллокатор памяти и который в руководстве также будет иметь тип nullptr.

Почти все функции возвращают VkResult, который является либо VK_SUCCESS, либо кодом ошибки. В спецификации указано, какие коды ошибок может возвратить каждая функция и что они обозначают.

Слои валидации

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

Поэтому Vulkan позволяет запускать расширенные проверки с помощью функции, известной как слои валидации. Слои валидации это фрагменты кода, которые могут быть вставлены между API и графическим драйвером для выполнения дополнительных проверок параметров функций и отслеживания проблем по управлению памятью. Это удобно тем, что вы можете запустить их во время разработки, а затем полностью отключить при запуске программы без дополнительных затрат. Любой пользователь может написать свои собственные слои валидации, но Vulkan SDK от LunarG предоставляет стандартный набор, который мы будем использовать в руководстве. Вам также необходимо зарегистрировать функцию обратного вызова для получения сообщений отладки от слоев.

Поскольку операции в Vulkan расписываются очень подробно, и слои валидации достаточно обширные, вам будет намного проще установить причину черного экрана по сравнению с OpenGL и Direct3D.

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

Перевод Что такое хорошо, что такое плохо будет ли совесть у искусственного интеллекта

10.10.2020 12:11:24 | Автор: admin

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

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

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

С этим запросом я начал искать книгу (или книги), которая объясняла бы, как у людей формировалась совесть. И дала бы подсказку, какие знания о мозге человека могут помочь в создании совестливого искусственного интеллекта.

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

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

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

Система обучения


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

Но как люди развили способность понимать, что правильно, а что нет? Чтобы ответить на этот вопрос, доктор Черчленд переносит нас в прошлое, когда появились наши первые теплокровные предки.

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

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

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

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

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

Кроме того, их выживание зависит друг от друга.

Развитие социального поведения



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

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

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


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

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

Человеческое социальное поведение




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

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

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

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

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

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

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

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

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

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

Искусственный интеллект и совесть


Источник: Depositphotos

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

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

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

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

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


Требуется ли физический опыт для развития совести в искусственном интеллекте?


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

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

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

Доктор также отметила, что мы до сих пор не знаем, как думает мозг.

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

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

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

Нужно ли нам воспроизводить тонкие физические различия мозга в ИИ?


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

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

Пока у нас не будет более глубокого понимания того, как работает мозг, на этот вопрос ответить будет трудно, сказал Черчленд. Мы знаем, что для того, чтобы получить сложный результат с помощью нейронной сети, в ней не обязательно должны быть такие биологические элементы, как митохондрии, рибосомы, белки и мембраны. Сколько еще в нем не должно быть? Мы не знаем. Без данных я просто очередной человек, высказывающий мнение. А у меня нет данных, которые бы сказали: вам нужно имитировать такие-то схемы в системе обучения с подкреплением, чтобы создать более человечную нейронную сеть.

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

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

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

Подробнее..

Самые популярные языки для локализации в 2021 году обзор от Alconost

24.02.2021 16:18:54 | Автор: admin
Какие языки выбрать для локализации сервиса, приложения или игры?Какие языки выбрать для локализации сервиса, приложения или игры?

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

Несколько слов о том, кто мы и почему из нашей статистики можно делать выводы. Мы в Alconost локализуем приложения, игры и веб-сервисы. Наши клиенты и крупные игроки IT-рынка, и небольшие команды, и инди-разработчики. С 2004 года мы помогли 2000 IT-компаний со всего мира вывести их продукты на новые рынки.

Клиенты регулярно спрашивают у нас: На какие языки посоветуете переводить? Ответим с опорой на факты. Мы проанализировали заказы за 2020 год и подготовили для вас статистику, инфографику и аналитику по языкам, которые выбирают наши клиенты.

Для этого обзора рассматривались заказы на перевод с английского языка, выполненные в отделе локализации Alconost.

Топ-12 языков для локализации с английского

В 2020-м клиенты переводили у нас с английского на 89 языков. Подчеркнём, что абсолютное большинство клиентов переводят у нас именно с английского, в то время как локализацию с других языков заказывают менее чем в 3% случаев.

Итак, давайте посмотрим, какие языки самые популярные при переводе сервисов, приложений и игр с английского.

Диаграмма 1. Самые популярные языки для локализации с английскогоДиаграмма 1. Самые популярные языки для локализации с английского

Диаграмма 1. Доля переводов на языки из топ-12 языков составляет 62,3% от общего объёма заказов на локализацию с английского.

Удивлены? Да, локализация даже на все 12 самых популярных языков будет отвечать потребностям лишь 2/3 потенциальной аудитории. Для охвата оставшейся трети понадобится локализация ещё на 70+ языков.

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

Лидеры рейтинга: классика FIGS и не только

Есть 4 языка, которые считаются классикой локализации. Это французский, итальянский, немецкий и испанский. Их даже обозначают аббревиатурой FIGS или, добавляя английский, EFIGS. Переводы с английского на эти языки возглавляют наш топ.

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

Посмотрите, как распределились доли по переводам с английского в лидирующей пятёрке: локализация на французский более 25%, а на три других классических языка в среднем по 19% на каждый.

Диаграмма 2. Пять самых популярных языков для локализации с английского: распределение долейДиаграмма 2. Пять самых популярных языков для локализации с английского: распределение долей

Диаграмма 2. Самые популярные языки для перевода с английского среди клиентов Alconost французский, итальянский, испанский и немецкий.

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

Выбор языка или выбор страны?

Интересный факт: бразильский португальский единственный язык в нашем топ-5, не совпадающий со страной происхождения. Так, французский может быть ещё и канадским; к слову, если вас интересует это направление вот наш обзор рынка и советы по локализации для Канады. У испанского несколько разновидностей: взять хотя бы аргентинский, колумбийский и мексиканский. И хотя мы переводим на все эти диалекты (а переводы на мексиканский испанский даже входят в наш топ-20), французский и испанский наши клиенты чаще всего заказывают именно для Европы, а португальский именно для Латинской Америки (Бразилия).

На наш взгляд, вот почему бразильский португальский популярен для локализации. Бразилия входит в топ-10 стран по величине экономики, в топ-3 по показателям загрузок в Google Play и App Store, а ещё в стране высокий уровень покупательной способности. Кстати, мы внимательно изучали рынок мобильных игр и приложений Бразилии; почитайте наш обзор.

Смотрим на Восток

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

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

Что до китайского, то локализация на его упрощённый вариант занимает в нашем рейтинге 8-е место, а переводы на традиционный китайский 13-е.

Диаграмма 3. Локализация с английского на китайский: нюансы Диаграмма 3. Локализация с английского на китайский: нюансы

Диаграмма 3. С английского на упрощённый китайский мы перевели почти в 2 раза больше заказов, чем на традиционный китайский.

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

Обратно на Восток через Нидерланды

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

К слову, любопытный факт о геймдев-индустрия Нидерландов: именно эта страна стала первой в Европе, сделавшей гейм-дизайн учебной дисциплиной.

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

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

А что за пределами топ-10?

Вторую десятку рейтинга открывают переводы с английского на польский язык. Количество заказов по этому языковому направлению совсем немного отстаёт от пары английский корейский.

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

Влияет ли общая численность говорящих на популярность языка для локализации?

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

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

Такую же тенденцию мы заметили и за пределами топа. Например, общее число говорящих на вьетнамском около 90 млн человек; индонезийский язык распространён в 2,2 раза больше, а хинди почти в 7 раз. Тем не менее, количество заказов по переводу с английского на каждый из этих языков было у нас в 2020-м почти одинаковым.

Продолжая анализировать азиатские страны, похожую картину увидим и с языками Малайзии и Таиланда. Локализация на тайский интересует наших клиентов почти вдвое чаще переводов на малайский и это несмотря на то, что на тайском говорит в 4 раза меньше людей на Земле, чем на малайском.

Что принимать во внимание при выборе языка для локализации?

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

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

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

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

На какой бы стадии выпуска продукта на новый рынок вы ни находились, обращайтесь за локализацией к нам в Alconost. Мы переводим сервисы, сайты, игры и приложения на 70+ языков.

Больше статистики по локальным рынкам

Как мы упоминали в начале, языки из топ-12 это только 2/3 локализаций. О менее популярных, но не менее интересных направлениях для локализации с английского мы решили рассказать в дополнительной подборке. Из неё можно можно узнать:

  • какой из языков Северной Европы был самым популярным среди наших клиентов в 2020-м, а какой заметно отставал от тройки лидеров;

  • какие языки Центральной Европы, помимо входящего в топ польского, были востребованы для локализации приложений, игр и сервисов с английского;

  • на какие языки Южной Европы стоит обратить внимание помимо испанского, итальянского и турецкого, входящих в топ-10;

  • как обстоят дела с локализацией на языки стран Ближнего Востока.

Посмотреть эту подборку можно в нашем блоге.

Обзоры рынков конкретных стран и рекомендации по локализации для них от Alconost

  1. Чехия и Словакия

  2. Финляндия

  3. Япония

  4. Арабский рынок

  5. Бразилия

  6. Япония, Корея, Китай

  7. Канада

Подробнее..

Перевод Руководство Google по стилю в C. Часть 2

25.08.2020 02:16:19 | Автор: admin
Часть 1. Вступление
Часть 2. Заголовочные файлы



Все мы при написании кода пользуемся правилами оформления кода. Иногда изобретаются свои правила, в других случаях используются готовые стайлгайды. Хотя все C++ программисты читают на английском легче, чем на родном, приятнее иметь руководство на последнем.
Эта статья является переводом части руководства Google по стилю в C++ на русский язык.
Исходная статья (fork на github), обновляемый перевод.

Заголовочные файлы


Желательно, чтобы каждый .cc файл исходного кода имел парный .h заголовочный файл. Также есть известные исключения из этого правила, такие как юниттесты или небольшие .cc файлы, содержащие только функцию main().

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

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

Независимые заголовочные файлы


Заголовочные файлы должны быть самодостаточными (в плане компиляции) и иметь расширение .h. Другие файлы (не заголовочные), предназначенные для включения в код, должны быть с расширением .inc и использоваться в паре с включающим кодом.

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

Предпочтительно размещать определения для шаблонов и inline-функций в одном файле с их декларациями. И эти определения должны быть включены (include) в каждый .cc файл, использующий их, иначе могут быть ошибки линковки на некоторых конфигурациях сборки. Если же декларации и определения находятся в разных файлах, включение одного должно подключать другой. Не выделяйте определения в отдельные заголовочные файлы (-inl.h). Раньше такая практика была очень популярна, сейчас это нежелательно.

Как исключение, если из шаблона создаются все доступные варианты шаблонных аргументов или если шаблон реализует функционал, используемый только одним классом тогда допустимо определять шаблон в одном (и только одном) .cc файле, в котором этот шаблон и используется.

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

Блокировка от повторного включения


Все заголовочные файлы должны быть с защитой от повторного включения посредством #define. Формат макроопределения должен быть:<PROJECT>_<PATH>_<FILE>_H_.

Для гарантии уникальности, используйте компоненты полного пути к файлу в дереве проекта. Например, файл foo/src/bar/baz.h в проекте foo может иметь следующую блокировку:

#ifndef FOO_BAR_BAZ_H_#define FOO_BAR_BAZ_H_...#endif  // FOO_BAR_BAZ_H_


Предварительное объявление


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

Определение
Предварительное объявление декларация класса, функции, шаблона без соответствующего определения.
За
  • Предварительной объявление может уменьшить время компиляции. Использование #include требует от компилятора сразу открывать (и обрабатывать) больше файлов.
  • Предварительное объявление позволит избежать ненужной перекомпиляции. Применение #include может привести к частой перекомпиляции из-за различных изменений в заголовочных файлах.

Против
  • Предварительное объявление может скрывать от перекомпиляции зависимости, которые изменились.
  • При изменении API, предварительное объявление может стать некорректным. Как результат, предварительное объявление функция или шаблонов может блокировать изменение API: замена типов параметров на похожий, добавление параметров по умолчанию в шаблон, перенос в новое пространство имён.
  • Предварительное объявление символов из std:: может вызвать неопределённое поведение.
  • Иногда тяжело понять, что лучше подходит: предварительное объявление или обычный #include. Однако, замена #include на предварительное объявление может (без предупреждений) поменять смысл кода:
          // b.h:      struct B {};      struct D : B {};      // good_user.cc:      #include "b.h"      void f(B*);      void f(void*);      void test(D* x) { f(x); }  // calls f(B*)      
    
    Если в коде заменить #include на предварительное объявление для структур B и D, то test() будет вызывать f(void*).
  • Предварительное объявление множества сущностей может быть чересчур объёмным, и может быть проще подключить заголовочный файл.
  • Структура кода, допускающая предварительное объявление (и, далее, использование указателей в качестве членов класса) может сделать код запутанным и медленным.

Вердикт
  • Старайтесь избегать предварительного объявления сущностей, объявленных в другом проекте.
  • Когда используйте функцию, объявленную в заголовочном файле, всегда #include этот файл.
  • Когда используйте шаблон класса, предпочтительно #include его заголовочный файл.

Также смотри правила включения в Имена и Порядок включения (include).

Встраиваемые (inline) функции


Определяйте функции как встраиваемые только когда они маленькие, например не более 10 строк.

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

За
Использование встраиваемых функций может генерировать более эффективный код, особенно когда функции маленькие. Используйте эту возможность для get/set функций, других коротких и критичных для производительности функций.

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

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

Ещё одно хорошее правило: обычно нет смысла делать встраиваемыми функции, в которых есть циклы или операции switch (кроме вырожденных случаев, когда цикл или другие операторы никогда не выполняются).

Важно понимать, что встраиваемая функция не обязательно будет скомпилирована в код именно так. Например, обычно виртуальные и рекурсивные функции компилируются со стандартным вызовом. Вообще, рекурсивные функции не должны объявляться встраиваемыми. Основная же причина делать встраиваемые виртуальные функции разместить определение (код) в самом определении класса (для документирования поведения или удобства чтения) часто используется для get/set функций.

Имена и Порядок включения (include)


Вставляйте заголовочные файлы в следующем порядке: парный файл (например, foo.h foo.cc), системные файлы C, стандартная библиотека C++, другие библиотеки, файлы вашего проекта.

Все заголовочные файлы проекта должны указываться относительно директории исходных файлов проекта без использования таких UNIX псевдонимов как . (текущая директория) или .. (родительская директория). Например, google-awesome-project/src/base/logging.h должен включаться так:

#include "base/logging.h"


Другой пример: если основная функция файлов dir/foo.cc иdir/foo_test.cc это реализация и тестирование кода, объявленного в dir2/foo2.h, то записывайте заголовочные файлы в следующем порядке:

  1. dir2/foo2.h.
  2. Пустая строка
  3. Системные заголовочные файлы C (точнее: файлы с включением угловыми скобками с расширением .h), например <unistd.h>, <stdlib.h>.
  4. Пустая строка
  5. Заголовочные файлы стандартной библиотеки C++ (без расширения в файлах), например <algorithm>, <cstddef>.
  6. Пустая строка
  7. Заголовочные .h файлы других библиотек.
  8. Файлы .h вашего проекта.


Отделяйте каждую (непустую) группу файлов пустой строкой.

Такой порядок файлов позволяет выявить ошибки, когда в парном заголовочном файле (dir2/foo2.h) пропущены необходимые заголовочные файлы (системные и др.) и сборка соответствующих файлов dir/foo.cc или dir/foo_test.cc завершится ошибкой. Как результат, ошибка сразу же появится у разработчика, работающего с этими файлами (а не у другой команды, которая только использует внешнюю библиотеку).

Обычно парные файлы dir/foo.cc и dir2/foo2.h находятся в одной директории (например, base/basictypes_test.cc и base/basictypes.h), хотя это не обязательно.

Учтите, что заголовочные файлы C, такие как stddef.h обычно взаимозаменяемы соответствующими файлами C++ (cstddef). Можно использовать любой вариант, но лучше следовать стилю существующего кода.

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

Следует включать все заголовочные файлы, которые объявляют требуемые вам типы, за исключением случаев предварительного объявления. Если ваш код использует типы из bar.h, не полагайтесь на то, что другой файл foo.h включает bar.h и вы можете ограничиться включением только foo.h: включайте явно bar.h (кроме случаев, когда явно указано (возможно, в документации), что foo.h также выдаст вам типы из bar.h).

Например, список заголовочных файлов в google-awesome-project/src/foo/internal/fooserver.cc может выглядеть так:

#include "foo/server/fooserver.h"#include <sys/types.h>#include <unistd.h>#include <string>#include <vector>#include "base/basictypes.h"#include "base/commandlineflags.h"#include "foo/server/bar.h"


Исключения:
Бывают случаи, когда требуется включение заголовочных файлов в зависимости от условий препроцессора (например, в зависимости от используемой ОС). Такое включение старайтесь делать как можно короче (локализованно) и размещать после других заголовочных файлов. Например:

#include "foo/public/fooserver.h"#include "base/port.h"  // For LANG_CXX11.#ifdef LANG_CXX11#include <initializer_list>#endif  // LANG_CXX11


Примечания:
Изображение взято из открытого источника.
Подробнее..

Перевод Руководство Google по стилю в C. Часть 4

14.12.2020 00:07:52 | Автор: admin
Часть 1. Вступление

Часть 4. Классы



Эта статья является переводом части руководства Google по стилю в C++ на русский язык.
Исходная статья (fork на github), обновляемый перевод.


Классы



Классы являются основным строительным блоком в C++. И, конечно же, используются они часто. В этой секции описаны основные правила и запреты, которым нужно следовать при использовании классов.

Код в конструкторе



Не вызывайте виртуальные методы в конструкторе. Избегайте инициализации, которая может завершиться ошибкой (а способа сигнализировать об ошибке не предусмотрено. Прим.: учтите, что Гугл не любит исключения).

Определение

Вообще в конструкторе можно выполнять любые инициализации (т.е. всю инициализацию сделать в конструкторе).

За

  • Не нужно беспокоиться об неинициализированном классе.
  • Объекты, которые полностью инициализируются в конструкторе, могут быть константными (const) и также их легче использовать в стандартных контейнерах и алгоритмах.


Против

  • Если в конструкторе вызываются виртуальные функции, то не вызываются реализации из производного класса. Даже если сейчас класс не имеет потомков, в будущем это может обернуться проблемой.
  • Нет простого способа проинформировать об ошибке без крэша программы (что не всегда допустимо) или выбрасывания исключений (которые запрещены).
  • Если возникла ошибка, то у нас есть частично (обычно неправильно) инициализированный объект. Очевидное действие: добавить механизм проверки состояния bool IsValid(). Однако про эту проверку легко забыть.
  • Вы не можете пользоваться адресом конструктора. Поэтому нет, например, простого способа передать выполнение конструктора в другой поток.


Вердикт

Конструкторы не должны вызывать виртуальные функции. В ряде случаев (если это позволительно) обработка ошибок конструирования возможна через завершение программы. В иных случаях рассмотрите паттерн Фабричный Метод или используйте Init() (подробнее здесь:TotW #42). Используйте Init() только в случае, если у объекта есть флаги состояния, разрешающие вызывать те или иные публичные функции (т.к. сложно полноценно работать с частично сконструированным объектом).

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



Не объявляейте неявные преобразования. Используйте ключевое слово explicit для операторов преобразования типа и конструкторов с одним аргументом.

Определение

Неявные преобразования позволяют объект одного типа (source type) использовать там, где ожидается другой тип (destinationtype), например передача аргумента типа int в функцию, ожидающую double.

Помимо неявных преобразований, задаваемых языком программирования, можно также определять свои пользовательские, добавляя соответствующие члены в объявление класса (как источника, так и получателя). Неявное преобразование на стороне источника объявляется как оператор + тип получателя (например, operator bool()). Неявное преобразование на стороне получателя реализуется конструктором, принимающим тип источника как единственный аргумент (помимо аргументов со значениями по умолчанию).

Ключевое слово explicit может применяться к конструктору или к оператору преобразования для явного указания, что функция может применяться только при явном соответствии типов (например, после операции приведения). Это применяется не только для неявного преобразования, но и для списков инициализации в C++11:

class Foo {  explicit Foo(int x, double y);  ...};void Func(Foo f);


Func({42, 3.14});  // Ошибка


Этот пример кода технически не является неявным преобразованием, но язык трактует это как будто подразумевается explicit.

За

  • Неявные преобразования могут сделать тип более удобным в использовании, не требуя явного указания типа в очевидных случаях.
  • Неявные преобразования могут быть упрощённой альтернативой для перегрузки, например когда одна функция с аргументом типа string_view применяется вместо отдельных версий для std::string и const char*.
  • Применение списка инициализации является компактным и понятным способом инициализации объектов.


Против

  • Неявные преобразования могут скрывать баги с несоответствием типов, когда получаемый тип не соответствует ожиданиям пользователя (если он вообще предополагал приведение типа).
  • Неявные преобразования могут усложнить чтение кода, особенно при наличии перегруженных функций: становится неясно, какой код действительно будет вызван.
  • Конструкторы с одним аргументом могут быть случайно использованы как неявное преобразование, даже если это не предполагалось.
  • Когда конструктор с одним аргументом не объявлен как explicit нельзя с уверенностью сказать: то ли это такое неявное преобразование, то ли автор забыл ключевое слово.
  • Не всегда понятно, какой тип должен обеспечить преобразование. А если оба, код становится двусмысленным.
  • Использование списка инициализации также может добавить проблем, если целевой тип задан неявно и, особенно, если сам список состоит только из одного элемента.


Вердикт

Операторы преобразования типа и конструкторы с одним аргументомдолжны объявляться с ключевым словом explicit. Есть и исключение: конструкторы копирования и перемещения могут объявляться без explicit, т.к. они не выполняют преобразование типов. Ещё неявные преобразования могут бытьнеобходимы в случае классов-обёрток для других типов (в этом случае обязательно запросите разрешение у вышестоящего руководства на возможность игнорирования этого важного правила).

Конструкторы, которые нельзя вызвать с одним аргументом, можно объявлять безexplicit. Конструкторы, принимающие единственный std::initializer_list также должны объявляться без explicit для поддержки инициализации копированием (например, MyType m = {1, 2};).

Копируемые и перемещаемые типы



Открытый интерфейс класса должен явно указывать на возможность копирования и/или перемещения, или наоборот всё запрещать. Поддерживайте копирование и/или перемещение, только если эти операции имеют смысл для вашего типа.

Определение

Перемещаемый тип тот, что может быть инициализирован или присвоен из временных значений.

Копируемый тип может быть инициализирован или присвоен из другого объекта того же типа (т.е. также, как и перемещаемый), с условием, что исходный объект остаётся неизменным.Например, std::unique_ptr<int> это перемещаемый, но не копируемый тип(т.к. значение исходного std::unique_ptr<int> объекта должно измениться при присвоении целевому объекту). int и std::string примерыперемещаемый типов, которые также можно копировать: для int операции перемещения и копирования одинаковые, для std::string операция перемещения требует меньше ресурсов, чем копирование.

Для пользовательских типов копирование задаётся конструктором копирования и оператором копирования.Перемещение задаётся либо конструктором перемещения с оператором перемещения, либо (если их нет)соответствующими функциями копирования.

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

За

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

Конструкторы копирования/перемещения и соответствующие операторы присваивания обычно легче определить, чем альтернативы наподобие Clone(), CopyFrom() или Swap(), т.к. компилятор может сгенерировать требуемые функции (неявно или посредством = default). Они (функции) легко объявляются и можно быть уверенным, что все члены класса будут скопированы. Конструкторы (копирования и перемещения) в целом более эффективны, т.к. не требуют выделения памяти, отдельной инициализации, дополнительных присвоений, хорошо оптимизируются (см. copy elision).

Операторы перемещения позволяют эффективно (и неявно) управлять ресурсами rvalue объектов. Иногда это упрощает кодирование.

Против

Некоторым типам не требуется быть копируемыми, и поддержка операций копирования может противоречить логике или привести к некорректной работе. Типы для синглтонов (Registerer), объекты для очистки (например, при выходе за область видимости) (Cleanup) или содержащие уникальные данные (Mutex) по своему смыслу являются некопируемыми. Также, операции копирования для базовых классов, имеющих наследников, могут могут привести к нарезке объекта object slicing. Операции копирования по умолчанию (или неаккуратно написаные) могут привести ошибкам, которые тяжело обнаружить.

Конструкторы копирования вызываются неявно и это легко упустить из виду (особенно для программистов, которые раньше писали на языках, где передача объектов производится по ссылке). Также можно снизить производительность, делая лишние копирования.

Вердикт

Открытый интерфейс каждого класса должен явно указывать, какие операции копирования и/или перемещения он поддерживает. Обычно это делается в секции public в виде явных деклараций нужных функций или объявлением их как delete.

В частности, копирумый класс должен явно объявлять операции копирования; только перемещаемый класс должен явно объявить операции перемещения; некопируемый/неперемещаемый класс должен явно запретить (= delete) операции копирования. Явная декларация или удаление всех четырёх функций копирования и перемещения также допустима, хотя это и не требуется. Если вы реализуете оператор копирования и/или перемещения, то необходимо также сделать соответствующий конструктор.

class Copyable { public:  Copyable(const Copyable& other) = default;  Copyable& operator=(const Copyable& other) = default;  // Неявное определение операций перемещения будет запрещено (т.к. объявлено копирование)};class MoveOnly { public:  MoveOnly(MoveOnly&& other);  MoveOnly& operator=(MoveOnly&& other);  // Неявно определённые операции копирования удаляются. Но (если хотите) можно это записать явно:  MoveOnly(const MoveOnly&) = delete;  MoveOnly& operator=(const MoveOnly&) = delete;};class NotCopyableOrMovable { public:  // Такое объявление запрещает и копирование и перемещение  NotCopyableOrMovable(const NotCopyableOrMovable&) = delete;  NotCopyableOrMovable& operator=(const NotCopyableOrMovable&)      = delete;  // Хотя операции перемещения запрещены (неявно), можно записать это явно:  NotCopyableOrMovable(NotCopyableOrMovable&&) = delete;  NotCopyableOrMovable& operator=(NotCopyableOrMovable&&)      = delete;};


Описываемые объявления или удаления функций можно опустить в очевидных случаях:

  • Если класс не содержит секции private (например, структура struct или класс-интерфейс), то копируемость и перемещаемость можно заявить через аналогичное свойство любого открытого члена.
  • Если базовый класс явно некопируемый и неперемещаемый, наследные классы будут такими же. Однако, если базовый класс не объявляет это операции, то этого будет недостаточно для прояснения свойств наследуемых классов.
  • Заметим, что если (например) конструктор копирования объявлен/удалён, то нужно и явно объявить/удалить оператор копирования (т.к. его статус неочевиден). Аналогично и для объявления/удаления оператора копирования. Аналогично и для операций перемещения.


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

Из-за риска слайсинга предпочтительным будет избегать открытых операторов копирования и перемещения для классов, которые планируется использовать в качестве базовых (и предпочтительно не наследоваться от класса с такими функциями). Если же необходимо сделать базовый класс копируемым, то сделайте открытую виртуальную функцию Clone() и защищённый (protected) конструктор копий с тем, чтобы производный класс мог их использовать для реализации операций копирования.

Структуры vs Классы



Используйте структуры (struct) только для пассивных объектов, хранящих данные. В других случаях используйте классы (class).

Ключевые слова struct и class практически идентичны в C++. Однако, у нас есть собственное понимание для каждого ключевого слова, поэтому используйте то, которое подходит по назначению и смыслу.

Структуры должны использоваться для пассивных объектов, только для переноса данных. Они могут иметь собственные константы, однако не должно быть никакой функциональности (за, возможно, исключением функций get/set). Все поля должны быть открытыми (public), доступны для прямого доступа и это более предпочтительно, чем использование функций get/set. Структуры не должны содержать инварианты (например, вычисленные значения), которые основаны на зависимости между различными полями структуры: возможность напрямую изменять поля может сделать инвариант невалидным. Методы не должны ограничивать использование структуры, но могут присваивать значения полям: т.е. как конструктор, деструктор или функции Initialize(), Reset().

Если требуется дополнительная функциональность в обработке данных или инварианты, то предпочтительно применение классов (class). Также, если сомневаетесь, что выбрать используйте классы.

В ряде случаев (шаблонные мета-функции, traits, некоторые функторы) для единообразия с STL допускается использование структур вместо классов.

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

Структуры vs пары (pair) и кортежи (tuple)



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

Хотя использование пар и кортежей позволяет не изобретать велосипед с собственным типом и сэкономит много времени при написании кода, поля с осмысленными именами (вместо .first, .second или std::get<X>) будут более понятны при чтении кода. И хотя C++14 для кортежей в дополнение к доступу по индексу добавляется доступ по типу (std::get<Type>, а тип должен быть уникальным), имя поля намного более информативно нежели тип.

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

Наследование



Часто композиция класса более подходяща, чем наследование. Когда используйте наследование, делайте его открытым (public).

Определение

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

За

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

Против

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

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

Вердикт

Любое наследование должно быть открытым (public). Если хочется сделать закрытое (private), то лучше добавить новый член с экземпляром базового класса.

Не злоупотребляйте наследованием реализации. Композиция классов часто более предпочтительна. Попытайтесь ограничить использование наследования семантикой Является: Bar можно наследовать от Foo, если можно сказать, что Bar Является Foo (т.е. там, где используется Foo, можно также использовать и Bar).

Защищёнными (protected) делайте лишь те функции, которые должны быть доступны для дочерних классов. Заметьте, что данные должны быть закрытыми (private).

Явно декларируйте переопределение виртуальных функций/деструктора с помошью спецификаторов: либо override, либо (если требуется) final. Не используйте спецификатор virtual при переопределении функций. Объяснение: функция или деструктор, помеченные override или final, но не являющиеся виртуальными просто не скомпилируются (что помогает обнаружить общие ошибки). Также спецификаторы работают как документация; а если спецификаторов нет, то программист будет вынужден проверить всю иерархию, чтобы уточнить виртуальность функции.

Множественное наследование допустимо, однако множественное наследование реализации не рекомендуется от слова совсем.

Перегрузка операторов



Перегружайте операторы в рамках разумного. Не используйте пользовательские литералы.

Определение

C++ позволяет пользовательскому коду переопределять встроенные операторы используя ключевое слово operator и пользовательский типа как один из параметров; также operator позволяет определять новые литералы, используя operator""; также можно создавать функции приведения типов, наподобие operator bool().

За

Использование перегрузки операторов для пользовательских типов (по аналогии со встроенными типами) может сделать код более сжатым и интуитивным. Перегружаемые операторы соответствуют определённым операциям (например, ==, <, = и <<) и если код следует логике применения этих операций, то пользовательские типы можно сделать понятнее и использовать при работе с внешними библиотеками, которые опираются на эти операции.

Пользовательские литералы очень эффективный способ для создания пользовательских объектов.

Против

  • Написать комплект операторов для класса (корректных, согласованных и логичных) это может потребовать известных усилий и, при недоработанном коде, это может обернуться труднопонимаемыми багами.
  • Излишняя перегрузка операторов может усложнить понимание кода, особенно если код не соответствует логике операции.
  • Все недостатки, связанные с перегрузкой функций, присущи и перегрузке операторов.
  • Перегрузка операторов обмануть других программистов, ожидающих простую и быструю встроенную операцию, а получающие нечто ресурсоёмкое.
  • Поиск мест вызова перегруженных операторов может быть нетривиальной задачей, и это явно сложнее обычного текстового поиска.
  • При ошибках в типах аргументов вы можете вместо сообщений об ошибке/предупреждении от компилятора (по которым легко найти проблему и исправить её), получить корректный вызов другого оператора. Например, код для foo < bar может сильно отличаться от кода для &foo < &bar; немного напутав в типах получим ошибочный вызов.
  • Перегрузка некоторых операторов является в принципе рискованным занятием. Перегрузка унарного & может привести к тому, что один и тот же код будет трактоваться по разному в зависимости от видимости декларации этой перегрузки. Перегрузка операторов &&, || и , (запятая) может поменять порядок (и правила) вычисления выражений.
  • Часто операторы определяются вне класса, и есть риск использования разных реализаций одного и того же оператора. Если оба определения будут слинкованы в один бинарный файл, можно получить неопределённое поведение и хитрые баги.
  • Пользовательские литералы (UDL) позволяют создавать новые синтаксические формы, незнакомые даже продвинутым C++ программистам. Например: Hello Worldsv как сокращение для std::string_view(Hello World). Исходная нотация может быть более понятной, хотя и не такой компактной.
  • Т.к. для UDL не указывается пространство имён, потребуется либо использовать using-директиву (которая запрещена) или using-декларацию (которая также запрещена (в заголовочных файлах), кроме случая когда импортируемые имена являются частью интерфейса, показываемого в заголовочном файле). Для таких заголовочных файлов лучше бы избегать суффикусов UDL, и желательно избегать зависимости между литералами, которые различны в заголовочном и исходном файле.


Вердикт

Определяйте перегруженные операторы только если их смысл очевиден, понятен, и соответствует общей логике. Например, используйте | в смысле операции ИЛИ; реализовывать же вместо этого логику канала (pipe) не очень хорошая идея.

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

Желательно определять неизменяющие значения бинарные операторы как внешние функции (не-члены). Если же бинарный оператор объявлен членом класса, неявное преобразование может применяться к правому аргументу, но не к левому. А это может слегка расстроить программистов, если (например) код a < b будет компилироваться, а b < a нет.

Не нужно пытаться обойти переопределение операторов. Если требуется сравнение (или присваивание и функция вывода), то лучше определить == (или = и <<) вместо своих функций Equals(), CopyFrom() и PrintTo(). И наоборот: не нужно переопределять оператор только потому, что внешние библиотеки ожидают этого. Например, если тип данных нельзя упорядочить и хочется хранить его в std::set, то лучше сделайте пользовательскую функцию сравнения и не пользуйтесь оператором <.

Не переопределяйте &&, ||, , (запятая) или унарный &. Не переопределяйте operator"", т.е. не стоит вводить собственные литералы. Не используйте ранее определённые литералы (включая стандартную библиотеку и не только).

Дополнительная информация:
Преобразование типов описано в секции неявные преобразования. Оператор = расписан в конструкторе копий. Тема перегрузки << для работы со стримами освещена в потоках/streams. Также можно ознакомиться с правилами из раздела перегрузка функций, которые также подходят и для операторов.

Доступ к членам класса



Данные класса делайте всегда закрытыми private, кроме констант. Это упрощает использование инвариантов путём добавления простейших (часто константных) функций доступа.

Допустимо объявлять данные класса как protected для использования в тестовых классах (например, при использовании Google Test) или других подобных случаях.

Порядок объявления



Располагайте похожие объявления в одном месте, выносите общие части наверх.

Определение класса обычно начинается с секции public:, далее идёт protected: и затем private:. Пустые секции не указывайте.

Внутри каждой секции группируйте вместе подобные декларации. Предпочтителен следующий порядок: типы (включая typedef, using, вложенные классы и структуры), константы, фабричные методы, конструкторы, операторы присваивания, деструкторы, остальные методы, члены данных.

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

Перевод 101 лучший и худший маневр бизнеса за последние 8 месяцев

28.12.2020 14:06:07 | Автор: admin


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

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

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

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

Март




  1. Facebook наносит сокрушительный удар по экономике Остина.

    В понедельник, второго марта, задолго до того как опасения по поводу коронавируса в США перешли от легкой тревоги к полной панике, Facebook объявляет, что не будет принимать участие в SXSW 34 ежегодном техно-музыкальном-кинофестивале, проходящем в Остине. В течение двух последующих дней Twitter, Amazon, Apple и TikTok принимают аналогичное решение и отказываются от участия. А свыше 40000 человек подписали петицию об отмене единственного и самого прибыльного мероприятия в Остине. Мэр Остина Стив Адлер всего за неделю до конференции окончательно подтверждает отмену, что приводит к потере 360 миллионов долларов потенциального дохода. Но стоит отметить, что возможно благодаря этому, Остин избежал звание первого эпицентра вспышки Covid-19.
  2. НБА прекращает сезон.

    Матч 11 марта между Юта Джаз и Оклахома-Сити Тандер оказывается отложен на полчаса буквально перед самым началом. Тест одного из игроков оказался положительным. В течение этих 30 минут, комиссар НБА Адам Сильвер отменяет не только эту игру, но и весь сезон, став первой крупной спортивной лигой США, которая приостановила игры из-за пандемии. В конечно итоге, матчи вернулись 30 июля, но с определенными ограничениями. Игроки, тренеры и весь персонал были изолированы на курорте Walt Disney World Resort, а игры плей-офф будут проводиться без болельщиков.
  3. Whole Foods отправил работников в отпуск.

    Whole Foods, которая принадлежит Amazon, откровенно страдала. В это время CEO Джон Макки порекомендовал сотрудникам продуктовой сети которые, по сути своей, стали героями нашего времени пожертвовать свой оплачиваемый отпуск тем коллегам, кто ухаживает за своими больными родственниками. Чуть позже в этом же месяце сотрудники компании устраивают забастовку, в форме массового больничного. Среди требований дополнительная оплата за работу в опасных условиях и другие льготы. Компания уступила и подняла зарплату на 2 доллара в час. Но забрала этот бонус в июне.
  4. Генеральный директор Adidas считает, что магазины должны оставаться открытыми как можно дольше.

    16 марта, когда в Сан-Франциско настоятельно рекомендуют всем остаться дома, генеральный директор Adidas Каспер Рорштед, согласно утечке внутренней корпоративной почты, говорит, что его магазины должны остаться открытыми как можно дольше. Это потребует мужества, настойчивости и сосредоточенности, сообщается в письме.
    На следующий день, видимо, приходит понимание, что одного мужества для борьбы с вирусом недостаточно и все магазины Adidas в США, Канаде и Европе оказываются закрытыми.
  5. Shopify спасает розницу.

    По мере того, как все большее количество розничных магазинов закрывается, бизнес понимает, что нужно как можно скорее начать продавать товары в сети.
    Для многих тысяч небольших продавцов настоящим спасением стала канадская платформа электронной коммерции Shopify. Она помогла перейти в цифру всего в несколько кликов.
    В течение года продажи Shopify стремительно растут. В третьем квартале 2020 года компании удалось удвоить свою выручку и утроить стоимость акций в середине марта.
  6. Dig Inn увольняют своих сотрудников текстовыми сообщениями.

    Расставаться с кем-либо с помощью переписок, прямо скажем, не очень хороший поступок. Тем более, если вы работодатель.
    С повсеместным локдауном, модная сеть ресторанов Dig Inn, расположенная в Бостоне, Нью-Йорке и Филадельфии, отправляет письмо сотне своих сотрудников (а это около 40% штата) с сообщением о том, что больше они в компании не работают.
    Просто для того, чтобы убедиться в получении смс компания звонила спустя 15 минут после отправки.
  7. Zoom становится нарицательным.

    Спустя пару недель после закрытия офисов, школ и всего бизнеса, стартап видеоконференций Zoom внезапно становится основным центром притяжения людей со всего мира.
    В марте около 200 миллионов человек ежедневно используют Zoom для встреч и видеоконференций. Около 90 тысяч школ в 20 странах мира проводят обучение через сервис и слово zoom становится нарицательным.
    В начале 2020 года компания прогнозировала годовой объем продаж менее одного миллиарда долларов. К сентябрю эту цифру увеличили, по меньшей мере, до 2,37 миллиардов, а рыночная капитализация выросла до невероятных 129 миллиардов долларов.
  8. Instacart начинает резко расти.

    По мере того, как миллионы американцев начинают избегать супермаркетов и пользоваться доставкой продуктов, компаниям приходится проводить колоссальный найм сотрудников, чтобы удовлетворить спрос.
    Instacart нанимает по 300 тысяч работников в месяц и в планах взять еще 250 000. Бизнес идет настолько хорошо, что генеральный директор Апурва Мета сообщает Bloomberg, что компания за несколько недель достигла своих целей по продажам до 2022 года.
    К октябрю компания более чем удвоила свою стоимость. С 7,9 миллиардов с начала года, до 17,7 миллиардов долларов.
  9. У ресторанов возникают проблемы с оплатой аренды.

    После первого шока от новостей о том, что все вокруг будет закрыто, компания по производству чизкейков и салатов Cheesecake factory становится первой корпоративной сетью, которая объявила о том, что перестанет платить арендную плату в своих почти 300 ресторанах.
    Вслед несколько крупных сетей делают аналогичное заявление.
  10. King Arthur Baking Company пытается догнать внезапно возросший спрос на муку.

    Домашняя выпечка становится настоящей идеей-фикс для всех запертых по домам. Беспрецедентный интерес к ней приводит к нехватке муки.
    Продажи у King Arthur Baking растут на 600% и все производство пришлось нарастить в три раза. Для этого пришлось перепрофилировать помещения, которые были зарезервированы для коммерческих пекарен, создавать рабочие смены и искать новых партнеров.
    В общем и целом удалось почти утроить свой ежемесячный выпуск муки.
  11. Yelp решает помочь ресторанам Без их ведома.

    Ряд владельцев ресторанов, зайдя в свои профили Yelp, с удивлением обнаружили, что от их имени началась краудфандинговая кампания на GoFundMe. Оказалось, что Yelp и GoFundMe самостоятельно создали страницы для помощи пострадавшим во время пандемии. Цель сбора составляла 1 миллион долларов.
    Но никто не озаботился получением разрешения ресторанов и акт благотворительности превратился в нечто негативное. Особенно учитывая, что с любого пожертвования GoFundMe забирает 15% комиссии.
    В конце концов Yelp пошла на встречу, и изменила схему на подписку.
  12. Everlane подрывает собственный имидж.

    Основной бренд одежды Сан-Франциско оказался в центре скандала, который устроили они сами. Все произошло по причине того, что компания приняла решение об увольнении большей части команды поддержки клиентов, прикрывая это повсеместной эпидемией.
    Но как выяснилось впоследствии, все уволенные сотрудники пытались организовать профсоюз, для того чтобы отстаивать свои права. А пандемия была лишь формальным предлогом.
  13. Amazon увольняет бунтовщиков и не может остановиться.

    С закрытием магазинов все начинают обращаться к Amazon за товарами первой необходимости. Такой рост спроса приводит к тому, что многим сотрудникам приходится работать в условиях аврала. И к концу марта по меньшей мере 19 складов и пунктов выдачи Amazon сообщили о случаях Covid-19. Все это привело к тому, что некоторые сотрудники работающие в Нью-Йорке вышли на акции протеста.
    Но тут Amazon совершает странный маневр и увольняет Криса Смоллса, который объединял вокруг себя людей. Вместе с ним уволили и других критикующих компанию.
    Но это было лишь начало. Один из вице-президентов Amazon ушел в отставку в знак протеста, а девять сенаторов США усомнились в честных мотивах компании.
    В результате, к октябрю Амазон заявляет, что было внедрено около 150 технологических изменений для защиты прав работников, и что всего 20000 работников из 1,37 миллиона заразились вирусом. Этим заявлением они обращают внимание на то, что уровень заражения на 42% ниже, чем у населения в целом.
    Но все это, судя по всему, совершенно не повлияло на экономический рост Amazon. К ноябрю рост акций оставил 74% в год, а рост продаж 34%.

    Апрель





  14. Hobby Lobby заявили, что они занимаются необходимым бизнесом.

    Сеть магазинов товаров для крафта и рукоделия вновь открывает свои точки, несмотря на то, что существует распоряжение на закрытие. Почему? Продажа ткани и необходимых для производства масок материалов позволяет бизнесу называется необходимым в условиях карантина.
    Многие компании вдохновившись этим примером поступают аналогичным образом, начиная продажу товаров первой необходимости. Это становится настоящей лазейкой для бизнеса.
    Однако, долго это продолжаться не могло. В течение нескольких дней правоохранительные органы нескольких штатов вынудили магазины Hobby Lobby закрыться.
  15. Производитель масок 3M оказывается под давлением.

    Пока американские больницы пытаются справиться с угрозой, президент Трамп оказывает давление на крупнейшего производителя масок N95, компанию 3M. Он даже ссылается на старый закон, времен Корейской войны все для того, чтобы вернуть экспортированные маски обратно в США.
    Но 3М заявляет, что в таком случае может произойти всё что угодно. Вплоть до того, что другие страны могут начать задерживать поставки основных товаров в США.
  16. Nike переключается на цифровые площадки.

    По мере того, как пандемия распространяется по США, генеральный директор Nike Джон Донахью делает заявление о том, что нужно перейти на интернет продажи, уделить больше внимания своему фитнес-приложению и обязательно учитывать, что после окончания пандемии часть спроса по прежнему останется цифровым.
    Спустя шесть месяцев можно заметить, что его план начинает приносить плоды: Nike объявила о прибыли в квартале в размере 10,2 миллиарда долларов, что составляет около 82% от объема до эпидемии.
  17. Отстраненный от должности соучредитель WeWork Адам Нейман подал в суд на Softbank.

    После того, как Softbank сообщил о том, что условия сделки не были выполнены и она не будет закрыта, один из основателей WeWork подал заявление в суд.
    По условиям договора, Softbank должен был заплатить около 5 миллиардов долларов, чтобы получить 70% стартапа. Доля Неймана от продажи его акций должна была составить около 1 миллиарда.
    Но в середине марта венчурный фонд заявил, что не все условия договора были выполнены, и сделка закрыта не будет.
  18. Dreamworks выпускает Trolls World Tour сразу же в цифровом формате.

    Компания Dreamworks решает обойтись без партнера в виде кинотеатров AMC и выпускает свой новый мультфильм напрямую в Amazon и iTunes. В результате им удалось заработать примерно столько же, сколько принесла предыдущая часть в прокате.
    В свою очередь AMC заявила, что может запретить все фильмы производства Universal Pictures (владелец Dreamworks). Но история разрешилась миром компании подписали договор, согласно которому сможет публиковать фильмы в цифре спустя три недели после премьерного показа в кинотеатре.
  19. Shake Shack получает и тут же возвращает государственные деньги.

    Когда федеральная программа по помощи малому бизнесу в США начала свою работу, помимо большого количества предприятий малого бизнеса, за дотацией пришли и крупные игроки. Один из них сеть бургерных Shake Shack, общей стоимостью в 3 миллиарда долларов. Компания взяла кредит на 10 миллионов долларов и сразу же столкнулась с публичным осуждением. Многие высказывали опасения, что такими темпами программа поддержки быстро иссякнет. Сама же Shake Shack сослалась на то, что условия были прописаны запутанно и непонятно.
    Но компания поступила благородно, и сразу же вернула все полученные деньги.
  20. Netflix становится популярнее.

    После премьеры Короля тигров и реалити-шоу Слепая любовь во время локдауна, Netflix объявляет, что количество подписчиков в первом квартале 2020 года выросло на 16 миллионов человек.
    А за первые девять месяцев 2020 года количество подписчиков будет больше, чем за весь 2019 год.
  21. DraftKings становится публичной компанией, несмотря на отсутствие спортивных состязаний.

    Несмотря на то, что спортивные мероприятия не проводятся, оператор ставок DraftKings работает в полную силу. Стартап из Бостона начинает размещаться на бирже Nasdaq на сумму 2,7 миллиарда долларов.
    В ожидании возвращения спортивных мероприятий Draftkings умудряется увеличивать свои доходы и стоимость акций, позволяя пользователям делать ставки на какие-то невероятные события, абсолютно не связанные со спортом. Например, на прогноз погоды или реалити-шоу.
  22. Google понимает, что Zoom уже не догнать.

    В течение многих лет Google боролась за то, чтобы ее инструменты видеоконференций стали популярными и повсеместными. Началось все с видеочатов Gmail в 2008 году и продолжилось в Google Hangouts в 2017. Не трудно представить, с какой завистью руководители Гугла смотрели на растущую популярность Zoom во время пандемии.
    И было принято решение сделать сервис видеоконференции Google Meet бесплатным (раньше он был доступен только в платной подписке G-suite).
    К маю Google объявляет, что с помощью их сервиса прошло около 3 миллиардов минут конференций и каждый день регистрируется по 3 миллиона новых пользователей.

    Май





  23. Boeing отказывается от государственной помощи, для того чтобы не отдавать долю в компании.

    Оказавшись перед выбором между принятием мер по спасению от пандемии в размере 17 миллиардов долларов (при определенных условиях) или попытаться спастись самостоятельно Boeing выбирает второй вариант. Все ради того, чтобы не отдавать долю в компании Федеральному казначейству США.
    Вместо этого они привлекают 25 миллиардов долларов в рамках масштабной продажи облигаций. Это приводит к тому, что долг компании становится в один уровень, например, с новозеландским.
    Но самостоятельность в решении проблем имеет и свою цену. Компания объявляет, что уволит около 10% своих сотрудников. А это около 14 000 рабочих мест.
    К концу октября перспективы становятся еще мрачнее. Генеральный директор Дэвид Калхун заявил, что Boeing ликвидирует почти 30000 рабочих мест к концу 2021 года.
  24. Airbnb начинает с увольнения сотрудников, а заканчивает размещением на бирже.

    Ситуация начинает выглядеть очень мрачной, когда Airbnb увольняет 1900 из своих 7500 сотрудников. И это даже после привлечения 1 миллиарда от частных акционерных компаний.
    Долгожданные планы по размещению на бирже откладываются все дальше. Более того, Airbnb начинает просить у своих клиентов донаты, чтобы остаться на плаву.
    Несколько месяцев спустя происходит что-то невероятное. После длительного времени изоляции люди хотят изменить обстановку, окружающую их и количество бронирований начинает расти.
    К августу планируется IPO и компания надеется привлечь 3 миллиарда долларов на бирже Nasdaq до конца года.
  25. Robinhood превращает скучающих миллениалов в трейдеров.

    Несмотря на катастрофическое падение S&P 500, простое и бесплатное в использовании приложение для торговли акциями Robinhood становится развлекательной платформой для дейтрейдеров. Новички теряют огромное количество денег и терпят убытки, но продолжают торговать, стимулируя эффект Робин Гуда. В мае стартап привлек 280 миллионов от венчурных инвесторов, а затем еще 660 миллионов в сентябре, повысив свою стоимость с 8,3 миллиардов до 11,7 миллиардов долларов. И все это менее чем за год.
  26. Илон Маск вновь открывает завод Tesla. Несмотря на запрет.

    Паника по поводу коронавируса это глупо, написал Илон Маск в своем твиттере в начале марта. На призывы остаться и работать дома, основатель Tesla отреагировал достаточно резко, назвав их фашистскими. Илон начинает угрожать перенести заводы Теслы из Калифорнии и объявляет о том, что завод все равно возобновит производство. Если кого-то нужно за это арестовать, то пусть это буду я пишет Маск в Твиттере.
    Но условия были приняты, и заводы продолжали работать.
  27. Twitter разрешает своим сотрудникам работать удаленно. Навсегда.

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

    До того как пандемия началась, стриминговый сервис потратил более полумиллиарда долларов на приобретение подкастинговых компаний Gimlet, Anchor и The Ringer.
    В мае они продолжают эту стратегию и, по сообщениям, тратят около 100 миллионов долларов на эксклюзивную сделку с Джо Роганом. Добавляя к этому миксу еще и Мишель Обаму.
    Все это привело к рекордному уровню в 144 миллиона платных подписчиков по всему миру, с учетом новых рынков, включая Россю. Она стала самой быстрорастущей страной для Spotify.
  29. Facebook объявляет о возможности постоянной работы на дому. А затем вкладывает огромные деньги в новые офисы.

    Facebook, который в течении многих лет культивировал офисно-ориентированную культуру, объявил, что они начинают строить новую связанную с работой из дома. Причем половина сотрудников, в конечном итоге, будет работать удаленно с понижением зарплаты, в зависимости от региона проживания.
    Спустя несколько месяцев, в сентябре, Facebook внезапно сообщает, что они приобретают новый крутой офис площадью 400 000 квадратных футов в Бельвью, Штат Вашингтон. И сразу же после огромное здание Farley в Нью-Йорке. Все 730 тысяч квадратных футов.
    Многие эксперты считают, что заявления Facebook о повсеместной удаленной работой были лишь элементов хитроумного плана, связанного с покупкой недвижимости.
  30. Dominos оказывается более приспособленным к пандемии, чем Starbucks или Sweetgreen.

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

    Июнь





  31. Ben & Jerry's Black Lives Matter.

    Пока множество компаний аккуратно высказываются в поддержку Black Lives Matter, производитель мороженого не пытается сгладить углы, и прямо высказывается о существующем господстве белых и о том, что с этим нужно бороться.Компания выражает возмущение убийством Джорджа Флойда и предлагает всей белой Америке признать свои привилегии.
    Не оставляя даже места двусмысленности, бренд требует от президента Трампа и Конгресса предпринять конкретные действия, включающие в себя создание целевой группы, которая могла бы разработать законодательство для прекращения расового насилия.
  32. Nascar запрещает флаг Конфедерации.

    Когда по всей стране вспыхивают протесты против расизма, Nascar запрещает приносить на свои гонки флаг Конфедерации. Ранее это было простой рекомендацией, которую принимали не все.
    Запрет произошел всего через два дня после того, как единственный чернокожий гонщик попросил убрать флаги в одном из интервью.
  33. Генеральный директор CrossFit уходит в отставку после обвинений в расизме.

    После того, как сотрудники CrossFit давят на генерального директора Грега Глассмана с просьбой выступить в поддержку движения Black Lives Matter, он делает обратное, заявляя что всё это бредово.
    Позже Грег признает, что совершил ошибку. Но не считает её расистской. Но ответная реакция была сильной и стремительной около тысячи тренажерных залов обещают отказаться от марки CrossFit, а Reebok и Rogue Fitness разрывают рекламные контракты, что обходится компании в миллионы долларов.
    В итоге, в конце июня Глассман уходит на пенсию и продает компанию предпринимателю Эрику Розе, владельцу тренажерного зала CrossFit в Боулдере.
  34. Компания Wing распадается.

    Компания Wing, воплотившая в себя все современные тренды предпринимательства, проходит через череду очень тяжелых событий.
    Коворкинг для девушек-боссов становится менее востребованным, по причине повсеместного закрытия предприятий из-за Covid 19. В это же время на первый план выходит напряженность, связанная с расовым вопросом. Новый проблемы появляются после массовых протестов связанных со смертью Флойда и все это становится последней каплей для многих сотрудников и они требуют смены руководства. После этого соучредитель Одри Гельман уходит с поста генерального директора, а компания переходит к работе в цифровом пространстве.
  35. Hertz пытается распродать свои акции.

    Hertz приближается к банкротству, но это не мешает компании по прокату автомобилей пытаться продать новые акции на сумму до 1 миллиарда долларов в июне.
    Обычно, во время начала процедуры банкротства, компания не может продавать свои акции. Это связано с тем, что именно кредиторы, а не акционеры, будут иметь повышенный приоритет по получению активов.
    Hertz не стесняясь заявляет, что акции будут бесполезны. Такая наглость шокирует многих, в том числе и комиссию по ценным бумагам, которая заинтересуется ситуацией и запретит продажу.
  36. Сервис видеооткрыток Cameo добивается большой известности.

    Чикагский стартап, в котором вы можете получить небольшую видео открытку от не самых популярных актеров, спортсменов и ютуберов. Да, сервис был популярен еще до пандемии, но после запрета на спортивные мероприятия и закрытия съемочных площадок, знаменитость выкручиваются как умеют и начинают продавать Zoom сессии. Всего за 275 долларов вы получите 15 минутный чат с певцом Марком Макгратом, а 30 минутный видеозвонок с Кевином О`Лири обойдется в 24 тысячи долларов.
  37. Hey и Epic столкнулись лбами с Apple и их App Store.

    Вскоре после того, как основатели Basecamp Джейсон Фрид и Дэвид Хайнемайер Ханссон запустили свой почтовый сервис Hey, Apple начала угрожать удалением его из своего каталога. Причина в том, что сервис является платным, но покупают его за пределами приложения, в результате чего Apple лишается своего 30% налога. После нескольких обновлений приложение, все же, остается в App Store.
    Но на этом история не закончилась. В октябре еще более крупный разработчик решает оспорить налог в магазине приложений. Epic Games, компания стоящая за дико популярной игрой Fortnite, реализует свою собственную платежную систему в приложении. Все для того чтобы обойти налогообложение Apple и Google.
    После этого игра пропадает из магазина App Store и Epic отвечает антимонопольным иском и пародийным видео. Федеральный суд постановил, что Apple не должна восстанавливать Fortnite в своем магазине приложений.
    Стороны готовятся к новому судебному разбирательству в 2021 году.
  38. Gap находит возможность заработать на масках.

    The Gap один из культовых ритейлеров Америки переживал очень тяжелые времена в начале пандемии, но впоследствии начал продавать маски для лица, и за счет этого значительно вырос.
    Все началось с продажи частным потребителям, а затем перешло в массовую продажу предприятиям. Это действие начинает приносить огромную прибыль. Компания продает маски на 130 миллионов долларов во втором квартале, что приводит к увеличения продаж на 13% за квартал. К концу сентября маски становятся бестселлером Gap.
    В дальнейшем ритейлер подписал 10 летний лицензионный контакт с Yeezy Канье Уэста. Хотя на данный момент никаких совместных работ выпущено не было.
  39. Компания Mirror выгодно продает себя.

    Компания, которая занималась продажей домашнего фитнес центра (в формате зеркала в полный рост с колонками и экраном) была куплена компанией Lululemon за 500 миллионов долларов в июне.

    Это событие примечательно тем, что это первое приобретение компании за 22 года существования. А известна она, в первую очередь тем, что продавала штаны для йоги.

    Июль


  40. Uber проигрывает сделку, но все равно выходит победителем.

    Поскольку спрос на такси во всем мире критически падает, а потребность в доставке вещей и еды только растет, Uber решает развивать это направление. Но сделка с GrubHub, которая должна была в этом помочь, разваливается. По некоторым сообщениям это произошло из за антимонопольным проблем.
    После этого Uber начинает судится с Postmates. Сделка стоимость 2,65 миллиардов долларов даёт Uber eats около 30% рынка доставки еды. Стоит отметить, что это направление бизнеса для Uber по прежнему убыточно.
  41. Microsoft пытается имитировать офисную жизнь.

    Спустя четыре месяца удаленной работы, сотрудники Microsoft, похоже, соскучились по офисным будням. Настолько, что компания объявила о новой функции в Microsoft Teams, под названием режим совместной работы. Она позволяет командам собираться в одном пространстве, пусть и виртуальном. Это может быть переговорка или конференц-зал.
  42. Goya Foods оказывается в центре огненного шторма.

    В первые дни пандемии консервы сметали с полок в качестве основного продукта питания. Одна из компаний, которая успела на этом заработать, стала Goya Foods, которая зафиксировала 400% рост продаж бобов и других консервированных продуктов в марте.
    Но ничто не бывает вечным. В июле генеральный директор Роберт Унануэ посещает мероприятие Rose Garden для поиска новых рынков и поставщиков. В своей речи он имел неосторожность высказаться позитивно о политике Трампа. Это привело к тому, что многие клиенты стали призывать к бойкоту продукции Goya Foods.
  43. Redskins соглашаются сменить название команды.

    Спустя сто лет после того как футбол прибыл в Вашингтон, Redskins решили изменить название своей команды. На что-то, что не является расистским, и с деньгами в качестве основного мотиватора. В июле 87 инвестиционных компаний и акционеров подтолкнули Nike, FedEx и PepsiCo прекратить спонсорство команды, если она не изменит своё название.
    Владелец команды Дэн Синдер, который как то сказал, что его команда никогда не сменит название, все же согласился на это под давлением общественности. Теперь он возглавляет Вашингтонскую футбольную команду, пока придумывается вариант получше.
    Тем временем, некоторые предприимчивые люди начинают торговать потенциальными именами, в надежде продать их команде.
  44. Диснейленд вновь открывается. В самый разгар пандемии во Флориде.

    Никто не ожидал, что огромный парк развлечений, который привлекает 2,9 миллиона посетителей по всему миру каждый месяц, вновь откроется в самый разгар пандемии. Но именно это Дисней делает во Флориде. И это во время того, как в штате фиксирует ежедневно по 15000 новых заражений.
    Однако, худшего не произошло. Несмотря на все опасения посещаемость была так низка, что нового эпицентра заражения не возникло.
    Но дела у компании продолжают идти плохо. Несмотря на то, что стриминговый сервис Disney+ набирает около 73 миллионов подписчиков парки продолжают приносить бешеные убытки. В связи с этим, в сентября Disney объявляет об увольнении 28000 из 100000 сотрудников связанных с парками и курортами.
  45. Facebook, Google, Intel и Qualcomm инвестируют миллиарды в едва известную индийскую телекоммуникационную компанию.

    После получения инвестиций в размере 5,7 миллиардов долларов от Facebook в апреле, jio Platforms, индийская телекоммуникационная компания, существующая на рынке всего 4 года, получает еще 4,5 миллиарда от Google в июне
    Наряду с другими инвестициями частных акционерных компаний, Jio удалось привлечь около 20 миллиардов долларов от внешних инвесторов всего за четыре месяца 2020 года.
    Откуда столько денег?
    Jio удалось построить огромную инфраструктуру 4G за счет долгового финансирования, в результате чего миллионы жителей Индии подключились к интернету по невероятно низким ставкам.
    Остается вопрос, что будет делать компания с этими 20 миллиардами? Вероятнее всего, расплатится со всеми долгами.
  46. Trader Joes не совершает ребрендинга.

    В июле, на фоне протестов против черного расизма по всей территории США, 17-летний школьник создает петицию с просьбой Trader Joes отказаться от стереотипных названий продуктов. Таких как димсам Trader Mings и сальса Trader Joses. Продуктовая сеть выступила с заявлением, в котором пообещала в скором времени изменить название и дизайн этикетки. Так же компания сказала, что начала работу над этим еще до петиции.
    Прошел месяц и Trader Joes сообщает, что никаких изменений не будет. Мы не принимаем решения на основании петиций, говорят в компании.
  47. Акции круизных компаний не тонут.

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

    Когда крупнейший в мире ритейлер объявляет, что потребует от покупателей обязательного ношения масок в более чем 5000 магазинах по всей Америке (а не только в тех штатах, где это обязательно по закону). И такое решение сразу вызывает цепную реакцию: Target, Home Depot, Whole Foods и Walgreens быстро следуют этому примеру и просят покупателей посещать магазины в масках.
    Чуть позже Walmart объясняет, что на самом деле это не было обязательным, а лишь носило рекомендательный характер.
  49. Билл Акман покоряет IPO.

    Билл Акман миллиардер, активист-инвестор и генеральный директор Pershing Square Capital запустил крупнейшее SPAC IPO и привлек 4 миллиарда долларов.
    К началу октября около 46% из 103 миллиардов привлеченных в ходе IPO в США были привлечены с помощью SPACs.
  50. Возвращение Kodak приводит к провалу и скандалу.

    Один из лидеров рынка прошлого вновь попытался переосмыслить себя и свой бизнес в июле, Дональд Трамп объявил, что компания выиграла первый в своем роде государственный контракт на сумму в 765 миллионов долларов и должна будет начать производство лекарств и фармацевтических препаратов.
    Но на фоне подозрительного роста акций, а затем резкого падения цены, у регулятора возникли сомнения в честности Kodak, что и привело к официальному расследованию.
    Генеральный директор Kodak Джим Континенца говорит, что компания будет двигаться вперед и ориентироваться на производство фармакологии, независимо от результатов проверки.

    Август


  51. BP объявляет о конце эры ископаемого топлива.

    Нефтяной гигант в начале августа объявляет о том, что будет сокращать добычу нефти на 40%, снижать выбросы углекислого газа на треть и увеличивать расходы на более экологичную энергию в десять раз. Это чуть более 5 миллиардов долларов к 2030 году.
    Это решение связано с далеко идущими планами компании. Пандемия разрушила нефтегазовую индустрию и BP делает стратегическую ставку на чистую энергию, чтобы быть в лидерах, когда она распространится повсеместно.
  52. Le Tote поглощает Lord & Taylor и это оказывается фатальной ошибкой.

    Венчурный стартап по аренде одежды Le Tote, основанный в 2012 году, был у всех на слуху, когда приобрел сеть домашних универмагов Lord & Taylor, компанию берущую своё начало аж в 1826 году. Сумма сделки составила 100 миллионов долларов.
    Сделка привлекала внимание тем, что молодая компания цифровой эпохи приобрела старожила розничной торговли и это должно было свидетельствовать о глубинных изменения в механизмах и принципах торговли.
    К сожалению, время для покупки было выбрано максимально неудачное. После того, как все магазины оказываются закрыты на карантин, то владение физическими площадями стало настоящей обузой.
    Компания подала заявление о банкротстве в августе, уточнив что le Tote и Lord & Taylor будут принимать разные заяви и будут разделены.
  53. Wayfair зарабатывает прибыль. Впервые за шесть лет.

    В феврале 18-летняя компания по продаже мебели в интернете, просила всех инвесторов проявить терпение. Она старалась сократить расходы и обещали начать приносить доход к 2021 году.
    Но пандемия изменила все.
    Когда весь мир перешел на электронную коммерцию и осознал необходимость обустроить домашнее пространство (в котором теперь приходится проводить все время), компания Wayfair внезапно получает прибыль в размере 274 миллионов долларов во втором квартале. Впервые с тех пор, как компания стала публичной в 2014 году.
    Многие эксперты сразу же заявили, что это только разовая прибыль, и на постоянную работу в плюс можно не рассчитывать. Но по мере того, как пандемия затягивается, успех Wayfair растет. В третьем квартале компания вновь получила прибыль в размере 173 миллионов долларов.
  54. Etsy превращает манию на маски в свою прибыль.

    После того как представители общественного здравоохранения начинают рекомендовать массовое ношение масок для предотвращения заражения и распространения вируса, огромное количество потребителей идут на интернет площадку Etsy.
    Во втором квартале число новых продавцов увеличилось на 100%, которые продали почти четверть из 29 миллиона масок.
    Но не масками едиными рост продаж других продуктов на площадке составил 93% в годовом исчислении.
  55. TJ Maxx принципиально отказывается от электронной коммерции.

    Во время всеобщей изоляции многие розничные продавцы стараются перейти в цифровое пространство и начать работать с доставкой, остаются те, кто сопротивляется всеобщему тренду. Например, компания TJX Corp (владелец TJ Maxx, Marshalls и HomeGoods).
    Они полагают, что клиенты хотят получить опыт охоты за сокровищами, и самостоятельно прийти в магазин за товаром. Потрогать его и ознакомиться с ним физически. Компания придерживалась этой теории, и, согласно статистике, поток посетителей в магазинах возвращается к уровню прошлого года.
    Причина, по мнению экспертов, в следующем покупатели стали меньше ездить по магазинам, но больше всего покупать. Если вы уже выбрались за покупками, вы захотите вернуться домой с чем-то особенным.
  56. Билл Гейтс и Serum Institute обещают вакцину всего за 3 доллара.

    Крупнейший в мире производитель вакцин Serum Institute, базирующийся в Индии, объявил, что будет продавать вакцину от Covid-19 всего за 3 доллара за дозу. Это касается Индии и других стран с низким и средним уровнем дохода.
    Все это стало возможно благодаря беспроцентному кредиту в размере 150 миллионов долларов от фонда Билла и Мелинды Гейтс.
  57. AMC впадает в отчаяние предлагаю 15-центовые билеты в кино.

    Владелец кинотеатров США, после пяти месяцев без посетителей и потерь в размере 2,2 миллиарда долларов за один квартал, понимает, что так дальше продолжаться не может.
    Они вновь открывают 100 из 600 с лишним кинотеатров в августе, одновременно запуская акцию с билетами по 15 центов. За такую цену можно посмотреть классические фильмы например, Назад в будущее.
    Но скидок и малого количества премьер оказывается недостаточно, чтобы вернуть зрителей в кино. В сентябре долгожданный релиз фильма Кристофера Нолана Довод собрал всего 9,5 миллионов долларов за первый уик-энд в США.
    В ноябре AMC объявила, что продает часть своих акций и привлекает 50 миллионов, чтобы избежать банкротства. На фоне этих событий, конкурент Regal снова закрывает свои кинотеатры в октябре. Компания считает, что держать их закрытыми окажется выгоднее, чем пытаться что-то придумать.
  58. KFC отказывается от своего слогана Finger Lickin` Good. Все из за вируса.

    Наряду с маркетологами в Corona Beer, сотрудники отдела рекламы в KFC сталкиваются с проблемой подачи материала в современных реалиях.
    В результате размышлений, компания решает отказаться от своего слогана Вкусно, аж пальчики оближешь. Слогана, который использовался с 50-х годов.
    Но в мире, в котором собственному здоровью и гигиене уделяется повышенное внимание, месту этому не нашло.
  59. Генеральный директор Salesforce обещает, что его компания не будет увольнять сотрудников в это тяжелое время А потом начинает чистку рядов.

    Генеральный директор Salesforce Марк Бениофф еще в марте пообещал, что его компания не будет проводить больших сокращений в течение 90 дней, в связи с повсеместным кризисом и пандемией.
    Но уже в августе (спустя 90 дней), когда акции компании выросли более чем на 60% за год, компания впервые зарабатывает 5 миллиардов долларов за квартал. И информирует своих сотрудников, что около 1000 из них должны подготовиться к потере работы.
  60. Через 100 дней после начала работы генеральный директор TikTok Кевин Майер уходит в отставку.

    После того как Кевина Майера, главу отдела потокового вещания Disney, не назначили на пост генерального директора, он уходит на аналогичную должность в TikTok, принадлежащий китайской технологической фирме Bytedance.
    Затем, в августе, после того как Дональд Трамп приказал передать управление TikTok на территории Америки в руки компании из США, Майер подаёт в отставку. Скорее всего, решив искать менее напряженную рабочую среду. Например, инвестиционную фирму.
  61. Леви Стросс, Patagonia и PayPal предлагают вводить оплачиваемый отпуск для участия в выборах.

    В то время, как в США переживает самый противоречивый политический сезон за последнее время, Леви Стросс, Patagonia и PayPal запустили кампанию, которая призвана упростить участие рабочих в избирательном процессе.
    Более 700 компаний от Walmart до Starbucks и Coca-Cola обещают предоставить своим работникам оплачиваемый отпуск для голосования.
    Другие компании (а это, например, Microsoft, Target и Old Navy) также поощряют участие своих сотрудников в политической жизни государства.
  62. Penzey`S Spices грабит свой собственный магазин.

    Билл Пензи, знаменитый противник Трампа и его политики, генеральный директор висконсинской компании по производству специей Penzey`s, публично высказался в поддержку протестов против расовой несправедливости, которые полыхают по всем Штатам.
    Многие клиенты не одобряют такой подход, и остаются в уверенности, что Билл будет петь совсем другую песню, когда его собственные магазины будут разграблены или разрушены.
    В ответ на это Пензи заявляет, что он сам разграбит свои магазины, сделав большие пожертвования в продовольственные фонды и организации, которые собирают деньги и ресурсы для поддержки протестов.

    Сентябрь



  63. Девять руководителей фармацевтических компаний решили закопать топор войны на время пандемии.

    Группа генеральных директоров девяти фармацевтических компаний отказалась от конкурирующих корпоративных интересов, публично пообещав, что они не будут поддаваться политическому или еще какому-либо давлению во время разработки и последующей продажи вакцины от Covid-19.
    Помимо того, что это разумная стратегия для помощи здравоохранению, эту ситуацию еще стоит рассматривать как публичный упрек президенту Трампу, который призвал ускорить выпуск вакцины.
  64. Peloton сбросил цены так, что в спортивные залы уже не вернется никто.

    Поскольку компании от Gold`s Gym до 24 hour Fitness подают заявления о банкротстве, Peloton который за лето показал рост продаж на 172% пытается охватить еще больше клиентов, на рынке домашнего фитнеса.
    Они снижают цены свой фирменный велотренажёр (с $2,245 до $1,895) и беговую дорожку (с $4,295 до $2,495) в надежде зацепить более широкий пласт аудитории.
  65. GM заключает странную сделку Nikola Motors.

    В сентябре General Motors объявляет о покупке 11% акций Nikola компании занимающейся запуском электрических и водородных грузовиков. Сумма сделки оценивается в 2 миллиарда долларов, что достаточно странно, ибо компания не приносила дохода.
    Многие эксперты сразу определили, что сделки выглядит как проявление неуверенности и неспособности GM уверенно опираться на свои собственные электромобили.
    Но свою репутацию General Motors восстанавливает очень яркой презентацией нового Hummer. Полностью электрического и современного.
  66. Обанкротившиеся бренды еще могут быть полезны.

    Словно стервятники, компании Simon Property Group (крупнейший владелец торгового центра в США) и Authentic Brands Group (компания по управлению брендами) создают совместное предприятие, которое готово поглотить обанкротившиеся бренды одежды.
    Одними из первых стали Brooks Brothers и Lucky Jeans, обанкротившиеся весной. SPARC (а так называется объединение, которое их скупает) приобретет оба осенью. Они присоединятся к Forever 21, который обанкротился еще до пандемии.
    Весь план заключается в том, что покупка бренда происходит через лицензионные сделки, но после всего, их можно очень прибыльно возродить.
  67. Долгосрочная фондовая биржа хочет бросить вызов Уолл-Стрит на ее собственном поле.

    LTSE доморощенная альтернатива Nasdaq и Нью-Йоркской фондовой бирже дебютирует в начале сентября. Основная задача проекта отвязать компании от краткосрочных эффектов фондового рынка и сосредоточиться на долгосрочные перспективы, при это оставляя возможность влиять на будущие показатели.
    Но долгожданный запуск оказался едва заметен на фоне активного рынка IPO и повсеместной мании SPAC.
  68. JPMorgan приказывает своим сотрудникам вернуться в офис А затем возвращает их домой.

    В сентябре JPMorgan приказала своим сотрудникам отдела продаж и торговли вернуться на работу в офис в штаб квартиру на Манхэттене.
    Спустя всего несколько недель банку придется начать отправлять людей вновь на удаленную работу. Все по причине того, что у некоторых будет обнаружен положительный тест на Covid-19.
  69. На платформе Amazon можно приобрести предметы роскоши.

    В течение многих лет Amazon пыталась привлечь на свою платформу элитные бренды класса люкс, и много лет им это не удавалось. Но в сентябре, после того как розничная торговля испытала настоящий шок, а покупки в интернете стали не просто нормой, а чем то обязательным, соглашение удалось достигнуть.
    Amazon запускает свои премиальные бутики, предоставляя своим 112 миллионам подписчиков Prime купить Oscar de la Renta, Roland Mouret, La Perla и другие знаковые дизайнерские бренды.
  70. Stripe дает своим сотрудникам бонус в 20000 долларов. Но сокращает зарплаты.

    После того, как началась повсеместная удаленная работа, многие работники IT отрасли поспешили сменить места проживания. Они уезжают из дорогих городов, таких как Нью-Йорк и Сан-Франциско в более дешевые места.
    Финтех компании Stripe предложила таким сотрудникам особые условия. Работник может единовременно получить щедрый бонус, взамен же его зарплата будет снижена до 10%. В зависимости от того, куда он переезжает.
  71. Apple переносит фитнес на удаленку.

    Во время закрытия тренажерных залов и повсеместного распространения устройств компании Peloton, Apple решает не упускать возможность заработать.
    В сентябре компания анонсирует Apple Fitness+. Виртуальную подписку, стоимостью 9,99 долларов в месяц. Выйдет она в конце года и будет предлагать специальные тренировки. Взаимодействие с пользователем будет происходить с помощью Apple Watch.
  72. Snowflake совершает три исторических события. За один IPO.

    Компания по хранению данных выходит на биржу в сентябре, и сходу становится самой ценной технологической компанией для IPO.
    Затем, еще один исторический момент в день открытия компания удваивает свою стоимость.
    Ну и третьим знаковым событием стало то, что Berkshire Hathaway, инвестиционная компания Уоррена Баффета вкладывает 800 миллионов долларов. И все это несмотря на историческую неприязнь Баффета к инвестированию в IPO в общем, и в тех сферу в частности.
  73. Krispy Kreme открывается на Таймс-сквер Потому что так надо.

    Решив не отставать от своего главного конкурента Dunkin` Krispy Kreme открывает свой новый магазин на Таймс-сквер в Нью-Йорке.
    И это было отличным решением. На торжественном открытии магазина покупатели стояли в 25-минутной очереди, чтобы посмотреть как пончики катаются по конвейерной ленте через водопады глазури.
  74. Рейс авиакомпании Qantas продается за 10 минут.

    Пока американские компании достигают самого низкого уровня пассажиропотока с 1950-х годов, австралийская авиакомпания Qantas пытается завлечь людей, которые готовы на все, лишь бы снова подняться в небо и начать путешествовать.
    После новостей о том, что некоторые азиатские компании смогли заработать на обзорных рейсах, Qantas решает провернуть похожий трюк, объявив семичасовой рейс в никуда. При стоимости билета от 600 до 2700 долларов, все оказываются выкуплены за 10 минут.
    Месяц спустя 134 пассажира отправляются в полет на малой высоте, осматривая живописную природу Австралии. В конце самолет приземлился в Сиднее. Там же, откуда взлетел.
  75. Walmart, Best Buy и Target повышают заработную плату в середине пандемии.

    В то время, как многие розничные продавцы становятся банкротами и уходят с рынка из-за падения спроса, самые крупные игроки лишь увеличивают свою прибыль. И на фоне этих событий повышают заработную плату.
  76. Microsoft покупает Bethesda за 7,5 миллиардов долларов.

    Всего через неделю после того, как сделка Microsoft по покупке TikTok сорвалась, Майки приходят к ZeniMax Media и приобретают Bethesda настоящих гигантов игровой индустрии, создавших последние части Doom, Fallout и The elder scrolls.
    Сумма сделке, в итоге, составила почти столько же, сколько Дисней потратил на покупку Star Wars и Marvel.
    Все ради развития своего игрового бренда Xbox.
  77. Walmart встречается лицом к лицу с Amazon на рынке электронной коммерции.

    В сентябре Walmart запускает специальную программу Walmart+. Стоимость членства составляет 98 долларов в год и предлагает бесплатную доставку товаров и скидки на топливо.
    Затем они делают ставку на публикацию рекламы и вирусного контента в TikTok, рассчитывая получить рост цифровой коммерции. Для компании, которая когда-то считалась сильно отстающей от своих цифровых конкурентов, результаты оказались ошеломительным: во втором квартале онлайн-продажи выросли на 97%, по сравнению с аналогичным периодом прошлого года.
  78. Echelon fitness, совместно с Amazon, запускает конкурента тренажеров Peloton. Правда, Amazon оказывается не в курсе.

    Стартап из Теннесси создает большой ажиотаж, объявляя о запуске Prime Bike стоимостью 500 долларов. Одной из основных тем анонса стало то, что в создании принимала участие компания Amazon. Такие новости моментально обрушили акции Peloton на 6%.
    Буквально спустя несколько часов Amazon выступает со своим заявлением она не имеет никакого отношения к велосипеду и Echelon нужно изменить имя продукта.
    Компания разработчик убрала пресс-релиз со своего сайта, но заявила, что продукт был создан исключительно для продажи на Amazon. Хотя многие заметили, что он имеет какое-то поразительно сходство с аналогичным велосипедом стоимостью 500 долларов, который продается на интернет-площадке Walmart с марта этого года.
  79. Brookfield тянет время до последнего.

    Лишь после того, как информация о рекордно низких арендных сборах (35% от ожидаемых) стала доступна в публичном поле, компания по работе с недвижимостью Brookfield Property Group объявляет, что в сентября продаст некоторое количество торговых объектов.
    Точное их количество не раскрывалось.
  80. Fred Perry обвиняют в расизме.

    Фирменное поло черно-желтого цвета легендарной компании Fred Perry становится неформальным символом ультра-правой организации Proud Boys. Все по той причине, что именно такую одежду носят члены этой группировки.
    На фоне подобных новостей Fred Perry объявило, что прекратит продавать поло такой расцветки в США и Канаде до тех пор, пока ассоциация с радикальными группировками не закончится.
  81. Ring строит беспилотник, который будет наблюдать за вашим домом.

    Компания Ring, принадлежащая Amazon, объявляет о планах начать продавать свою камеру наблюдения, встроенную в автономного дрона, который может свободно перемещаться по вашему дому.
    Ранее Ring оказалась втянута в скандал из-за своей связи с правоохранительными органами и несколькими случаями взлома камер. Например, случай взлома камеры в спальне восьмилетней девочки.
    Но несмотря на эти случаи, компания проводит уверенную рекламную кампанию. Они позиционируют устройство как специальную вещь для проверки того, закрыто ли окно, выключена ли плита и тому подобное.
    Но вопрос о том, что делать если устройство будет взломано остается открытым.
  82. Ocean Spray становятся очень известными. Все благодаря вирусному TikTok видео.

    После того, как тиктокер Nathan Apodaca снимает своё видео о том, как он на скейте едет на работу, попивая бутылочку Ocean Spray мир перестал быть прежним.
    Песня Dreams (Fleetwood Mac, 1977 год), которая использована в ролике моментально взлетает на вершину чартов, а продажи Ocean Spray начинают расти.
    Чтобы выразить благодарность тиктокеру за миллионы долларов бесплатной рекламы, генеральный директор Ocean записывает свой собственный ролик по мотивам и дарит автору красный пикап, полностью загруженный напитком.

    Октябрь





  83. Playboy собирается на биржу.

    В знаменательный год для SPAC, даже Playboy планирует выйти на биржу. Только на этот раз с помощью системы компании с пустым чеком, а не стандартным путем.
  84. Mcdonalds начинает сотрудничество с Трэвисом Скоттом.

    После того, как концерт Трэвиса в Fortnite привлек более 12 миллионов геймеров, Mcdonalds заключает с рэпером контракт, для продажи еды под его брендом.
    Это первая подобная акция с 1991 года. Тогда был запущен McJordan, совместном с майклом Джорданом.
  85. Slack и Cole Haan объединяются для производства мерча.

    Slack, судя по всему, не удалось так сильно разбогатеть, как Zoom, но они не отчаиваются. И предлагают людям кроссовки! Лимитированная серия обуви в сотрудничестве с Cole Haan, по цене в 120 долларов за пару.
    Стоит отметить, что выпуск обуви вызвал некоторое недоумение остается открытым вопрос кто является целевой аудиторией кроссовок Slack?
    Но возможно всё это было сделано лишь для того, чтобы привлечь к брендам дополнительное внимание.
  86. Dollar General расширяет свою зону влияния на пригороды.

    Дисконтная сеть объявляет о выходе за рамки продажи товаров за один доллар и решают привлечь новую аудиторию. Для этого они откроют 30 новых магазинов к концу 2021 года. Они будут работать под новым брендом Popshelf и продаваться в них будет все от аксессуаров для дома, до косметики. 95% товаров будут стоить менее 5 долларов.
  87. IKEA делает ставку на города.

    Не смотря на то, что большинство людей отказываются от жизни в городе, шведский магазин заявляет, что делает ставку именно на городских жителей. Для этого они откроют около 50 новых городских магазинов на 60% больше, чем в прошлом году.
  88. Рестораны отмеченные звездой Мишлен не будут готовить на вынос. Они позволят готовить вам самостоятельно.

    Компании по доставке готовых наборов еды уже собирались уходить с рынка, но ситуация, которая сложилась в этом году оказалась очень благоприятной для таких фирм.
    И глядя на успех подобного бизнеса, рестораны Eleven Madison Park и Alinea (удостоенные звезды Мишлен) начинают предлагать свои фирменные наборы еды для готовки дома. Всего за 895 долларов.
  89. Lyft и Uber объединяются для того, чтобы бороться с трудовым законодательством Калифорнии.

    В октябре калифорнийский суд предписывает Uber и Lyft перевести своих водителей из статуса независимых подрядчиков в наемных работников. Для соответствия новому трудовому законодательству штата.
    Но вместо этого вчерашние конкуренты объединяются вместе с другими компаниями и запускают свою кампанию, предлагая другой план. Они хотят создать исключение для своих работников, которые по прежнему останутся фрилансерами. Без минимальной заработной платы, больничного и прочих средств защиты труда. Но с другими льготами. Например, с нижним пределом зарплаты.
    На продвижение этой акции удается собраться более 200 миллионов долларов, которые расходуются на постоянный поток телевизионной рекламы, почтовые рассылки и электронные письма в поддержку этой меры.
    Кампания противников же собрала всего около 20 миллионов. Неудивительно, что интересы удается продавить и стоимость акций компаний начинает расти.
  90. The Nugget становится главным развлечением для детей в карантин.

    В октябре многие школы и детские площадки продолжают быть закрытыми, поэтому родителям постоянно приходится придумывать, как развлекать детей на карантине. На помощь приходит The Nugget. Компания выпускает специальную линейку детской мебели, которая частично является диваном, частично фортом.
    Спрос оказывается настолько высоким, что компании приходится создавать еженедельную лотерею в Facebook, чтобы распределить свои ограниченные запасы мебели на 2020 год.
    Как сообщается, в первую неделю, на 5000 кроватей-фортов претендовало около 100 тысяч человек.
  91. Трэвис Каланик вкладывает 130 миллионов долларов в сервисы доставки еды.

    По мере того, как традиционные рестораны продолжают страдать от блокировок и ограничений Covid-19, специальные компании специализирующиеся только на доставке начинают набирать обороты. Все благодаря экономии на аренде пространства и отсутствию необходимости содержать большой штат.
    Например, стартап CloudKitchens, который запускает один из основателей Uber Трэвис Каланик. Он вкладывает в него около 130 миллионов долларов, приобретая пустые помещения от бывших ресторанов, автомастерских и складов в двух десятках городов. После этого оснащает их всем необходимым для готовки и доставки еды.
  92. Quibi закрывается, обвиняя во всем пандемию.

    Если потоковое вещание стало настоящим спасением для Disney и Netflix, то для Quibi, сервису коротких видео, это стало последним гвоздем в крышку гроба. Даже несмотря на ошеломляющую поддержку в 2 миллиарда долларов от голливудских инвесторов.
    Сервис начал свою работу в апреле, но спустя месяц уже было понятно, что смартфон ориентированное приложение никому не интересно, и количество пользователей и партнеров не растет. Руководство винит в неудаче коронавирус и пандемию.
    Все изначальное финансирование было потрачено за шесть месяцев работы и компания закрылась в октябре.
  93. Expensify говорит своим сотрудникам голосовать за Байдена.

    За несколько недель до выборов президента США, генеральный директор по управлению расходами компании Expensify отправил электронное письмо с одобрение и рекомендацией голосовать за Джо Байдена.
    Но письмо получили не только сотрудники и корпоративные клиенты но и все сотрудники компаний клиентов. По примерным подсчетам это около 10 миллионов человек.
    Неудивительно, что многие остались не в восторге от того, что сторонняя компания пытается прочитать лекции о политике и повлиять на решение о голосовании.
  94. Tupperware становится популярной.

    В течении многих лет, компания по производству упаковки для пищевых продуктов старалась найти контакт с молодой и новой аудиторией. Но помог в этом только всплеск домашней кулинарии, благодаря которому возникла потребность в прочных и герметичных контейнерах для еды.
    В результате продажи Tupperware взлетели на 72% в третьем квартале 2020 года. Это самый высокий рост, который компания наблюдала за последние 20 лет. Это удалось благодаря прямым продажам через сеть.
  95. Dunkin Brands вновь становится частной компанией.

    После тяжелого начала пандемии, после которого удалось немного выправить положение благодаря онлайн заказам, Dunkin Brands объявляет, что снова станет частной компанией. Все благодаря сделке с Inspire Brands, частной акционерной фирмой. Сумма оценивается в 11,3 миллиарда долларов.
    Но в конечном итоге, вся сделка больше направлена на тех, кто её заключает, чем на тех, кто ест пончики.

    Ноябрь


  96. Walmart понимает, что люди настолько же эффективны как и роботы.

    В 2019 году розничный гигант планировал увеличить количество роботов задействованных в бизнесе. Они должны помогать чистить полы и отслеживать запасы в 4600 магазинах. По подсчетам компании, это должно было снизить затраты на рабочую силу.
    Затем, в ноябре, Walmart отказывается от своих планов и продолжает работать с людьми. Причина не связана с какими-либо этическими соображениями, а скорее с тем, что люди способны работать так же экономично и с той же эффективностью.
  97. Крупнейшее IPO в мире Ant Group оказывается заблокировано китайским правительством.

    Когда в августе финтех-гигант Ant Group от основателя Alibaba Джека Ма подал заявку на IPO, компания рассчитывала получить рекордные для мира 30 миллиардов долларов.
    Но в ноябре Ма и двух руководителей Ant Group внезапно вызывают на встречу с китайскими финансовыми регуляторами, и на следующий день IPO приостанавливается.
    В чем проблема?
    В своей октябрьской речи, Ма, помимо всего прочего, критиковал международные финансовые правила и сказал, что в Китае нет финансовой системы. Все это, как сообщается, отсылка к председателю КНР Си Цзиньпину, который лично поставил крест на сделке.
  98. Производителя ручек Sharpie обвиняют во вмешательстве в выборы.

    Шарпигейт становится одним из многих абсурдных ситуаций, которые возникают вокруг выборов президента США.
    Согласно слухам, которые очень активно циркулируют в социальных сетях, бюллетени, голос в которых был поставлен шариковой ручкой Sharpie, будут аннулированы. А специальный маркер в чернилах будет использоваться для доказательств фальсификаций.
    По этой причине многие пользователи Twitter оставляют тысячи негативных твитов под постами компании Sharpie. Более того, все это приводит к судебному разбирательству, к которому присоединяются избирательный штаб Трампа и Республиканский национальный кабинет чиновников Марикопа.
    Это приводит к тому, что глава департамента кибербезопасности публично призвал людей прекратить распространение необоснованных слухов против производителя шариковых ручек.
  99. PredictIt собирают ставки на то, кто станет следующим президентом.

    По мере того, как огромное количество ученых и политологов пытается предугадать результаты выборов, PredictIt фондовый рынок для политики, где трейдеры делают ставки на победителя делает свой прогноз. Они уверены, что Байден будет победителем, но с небольшим отрывом.
    Как показала практика, они оказались правы. Кстати, в 2016 году они точно так же угадали победу Трампа.
  100. Deutsche Bank предлагает ввести налог на работу из дома.

    Deutsche Bank очень портит свою репутацию всего одним предложением. А именно предлагает своим сотрудникам платить дополнительно 5% налогов за возможность работать из дома.
    Мотивируется это тем, что удаленные работники не вносят большого вклада в экономику, экономя на таких вещах как поездки на работу и обеды.
  101. Pfizer заявляет, что ее вакцина работает. И фондовый рынок моментально реагирует на это.

    С тех самых пор как стало ясно, что вакцина единственный реальный выход из пандемии, весь мир ждал новостей.
    И вот в ноябре появились первые из них Pfizer и BioNTech опубликовали предварительные данные своих испытаний вакцины. И по результатам она оказалась эффективна на 90%.
    Моментально акции авиакомпаний, круизных лайнеров, ресторанов и коммерческой недвижимости поползли в вверх.
    А акции популярных в пандемию компаний, таких как Zoom и Etsy начали падать. Подчас на двухзначные значения процентов.


Zadarma 2020 рост не смотря ни на что


В 2020 году мы помогали эффективно переводить тысячи компаний на удаленную работу. В первую очередь за счет главных продуктов АТС и CRM. Во время весеннего локдауна предлагали помощь пользователям в большинстве стран, а также экстренными темпами создали свой собственный сервис видеоконференций.
12 декабря сервис облачной телефонии Zadarma отметил свое 14-летие. Главные достижения:

  • Представили бесплатные видеоконференции;
  • Предложили распознавание голоса и речевую аналитику;
  • Новое API CRM, номеров, WebRTC-виджет для интеграций;
  • Еще более выгодные toll free номера в Украине, снизили стоимость входящих на 8800 в России;
  • Представили интеграцию с HubSpot, Freshdesk и МойСклад, обновили многие интеграции, в частности интеграции с Zoho, amoCRM, SalesForce;
  • Представили новые тарифные пакеты Америка и Мир, а также французскую версию сайта;
  • Обновили функционал бесплатной CRM, например, интегрировали видеоконфенеции;
  • Нарастили функционал приложений для Android и iOS.

Конечно, сейчас все мечтают о том, чтобы 2020 быстрее подошел к концу. Год изменится, но обстоятельства вокруг останутся прежними. Хочется пожелать в наступающем году объективно относиться к своим возможностям, ценить партнеров, клиентов, сотрудников, которые вместе с вами пережили это время, смотреть в будущее, не думая о магии чисел. Оставайтесь на связи в 2021!
Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru