Квест от ЕРАМ: пять задач с собеседований по .NET

До того, как прийти в ЕРАМ, я побывал примерно на 20 собеседованиях в питерских IT-компаниях, и во многих давали задачи. Я синтезировал свой опыт и придумал пять задач, которые похожи на те, что дают на онлайн-тестированиях и очных собеседованиях.
19-20 мая в Питере прошла конференция DotNext, где мы предложили участникам пройти квест, который и состоял из этих задач. Отвечая правильно на задачу, участник получал следующую.

С первыми тремя могут справиться джуниоры, им часто задают подобные вопросы на собеседованиях. Четвертую можно задать кому угодно, но я бы рассчитывал на специалистов уровня middle: далеко не все джуниоры разбираются в возрастаниях сложности алгоритмов.
С пятой задачей справились единицы. Ее сложность – не в том, чтобы вычислить, что будет в селекте (с этим как раз справились многие), а в том, чтобы найти следующее число в последовательности, а для этого требуются хорошие математические знания. Мне кажется, математическая база очень важна для программиста.

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

Итак, начнем.

1) Какой результат выведет на консоль данная программа?

    class Program     {         static void Main(string[] args)         {             var numbers = new int[] { 7, 2, 5, 5, 7, 6, 7 };             var result = numbers.Sum() + numbers.Skip(2).Take(3).Sum();             var y = numbers.GroupBy(x => x).Select(x =>             {                 result += x.Key;                 return x.Key;             });              Console.WriteLine(result);         }     } 

Ответ

56. Учитываем особенности LINQ. Двоичное представление: 111000.

Комментарий

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

2) Какой результат выведет на консоль данная программа?

    class Program     {         private static string GetNumber(int input)         {             try             {                 throw new Exception(input.ToString());             }             catch (Exception e)             {                 throw new Exception((int.Parse(e.Message) + 3).ToString());             }             finally             {                 throw new Exception((++input).ToString());             }              return (input += 4).ToString();         }          static void Main(string[] args)         {             string result;             try             {                 result = GetNumber(1);             }             catch (Exception e)             {                 result = e.Message;             }              Console.WriteLine(int.Parse(result) * 100);         }     } 

Ответ

200. Учитываем специфику finally. Двоичное представление: 11001000.

Комментарий

Сам сталкивался с подобным вопросом на собеседовании. Если говорить об участниках квеста, правильно смогли ответить около 70%. Они оставляли отзывы и предложения, среди которых – уменьшить количество лишнего кода. Мы это обсудили и пришли к выводу, что все-таки лучше уменьшать читаемость кода для искусственного введения в заблуждение.

3) Какой результат выведет на консоль данная программа?

    class MagicValue     {         public int Left { get; set; }         public int Right { get; set; }          public MagicValue(int left, int right)         {             Left = left;             Right = right;         }          public static void Apply(MagicValue magicValue)         {             magicValue.Left += 3;             magicValue.Right += 4;             magicValue = new MagicValue(5, 6);         }          public static void ApplyRef(ref MagicValue magicValue)         {             magicValue.Left += 7;             magicValue.Right += 8;             magicValue = new MagicValue(9, 10);         }     }      class Program     {         static void Main(string[] args)         {             var magicValue = new MagicValue(1, 2);             MagicValue.ApplyRef(ref magicValue);             MagicValue.Apply(magicValue);              Console.WriteLine(magicValue.Left * magicValue.Right);         }     } 

Ответ

168. Учитываем особенности ref. Двоичное представление: 10101000.

Комментарий

Это очень популярный вопрос на собеседованиях. Я сам решал подобную задачу, наверное, на каждом втором. На эту тему можно почитать вот тут. Кстати, только 45% участников квеста смогли найти правильное решение. Зачастую ошибки были не в понимании принципа работы ref, а в математике.

4) Даны 9 функций. Каждой функции соответствует номер от 1 до 9. Расположите функции в порядке возрастания сложности, после чего подставьте 9 номеров отсортированных функций последовательно в формулу _ _ _ — _ _ _ + _ _ _ = «?». Напишите, чему равно «?».
1. $log⁡(log(N))$
2. $N^{2/9}$
3. $log(N)$
4. $N$
5. $3^N$
6. $900^{10000000}$
7. $N!$
8. $N^3$
9. $N*log(N)$

Ответ

1221. Двоичное представление: 10011000101.
Решение:
6. $900^{10000000}$
1. $log⁡(log(N))$
3. $log(N)$
2. $N^{2/9}$
4. $N$
9. $N*log(N)$
8. $N^3$
5. $3^N$
7. $N!$
6 1 3 — 2 4 9 + 8 5 7 = 1221

Комментарий

Такая задача реже встречается на собеседованиях, но это – хороший старт для тех, кто изучает сложности алгоритмов. Есть много ресурсов с формулами, и найти их просто. Кроме того, задачу можно решить «подстановкой» на бумаге. На собеседовании могут задать вопрос, связанный со сложностью некоторых алгоритмов, и здорово, когда ответ подкреплен общими знаниями. Если говорить о квесте, с задачей справились только 30% участников.

5) Пусть таблица carTable содержит следующие значения:

id model price
1 Nissan 1000
2 BMW 2000
3 Toyota 1000
4 Renault 2000
5 Peugeot 1000
6 Opel 2000

Результатом представленного ниже SQL запроса будет 2 значения — <1> и <2>.

;WITH someTable AS (SELECT 1 val UNION ALL SELECT val + 1 FROM someTable WHERE val BETWEEN 1 AND 3) SELECT carTable.price / SUM(CASE WHEN carTable.price = 1000 THEN 1 ELSE 2 END) / 250 AS result FROM someTable INNER JOIN carTable ON carTable.id = someTable.val GROUP BY carTable.price ORDER BY carTable.price ASC 

<1> и <2> — это первые числа последовательности <1>, <2>, 6, 34, 270, <?>.
Найдите следующее число последовательности.

Ответ

2698. Двоичное представление: 101010001010.
Решение:
Результатом запроса будут числа 2 и 2 (BETWEEN даст выборку 1,2,3,4. Join сработает на первые 4 записи, GROUP BY их сгруппирует, SELECT вычислится как $1000 / (1 + 1) / 250 = 2$, $2000 / (2 + 2) / 250 = 2$. Последовательность вычисляется как $x_{n+1}=x_{n}*2*n - 2$, где $n$ – число уже полученных элементов.
Т.е.:
$2*2*1 - 2 = 2$
$2*2*2 - 2 = 6$
$6*2*3 - 2 = 34$
$34*2*4 - 2 = 270$
$270*2*5 - 2 = 2698$

Комментарий

Это, безусловно, самая сложная задача. С ней справились только 15% участников квеста.

Заключение

Спасибо всем, кто решал задачи, а особенно тем, кто смог дойти до конца! Было интересно читать ваши отзывы и комментарии. А те, кто внимательно читал условия и давал ответы в двоичной форме – вдвойне молодцы!
Фото взято из архива конференции DotNext.
ссылка на оригинал статьи https://habrahabr.ru/post/329998/

Простой туториал React Router v4

image

Автор @pshrmnОригинальная статьяВремя чтения: 10 минут

React Router v4 — это переработанный вариант популярного React дополнения. Зависимые от платформы конфигурации роутов из прошлой версии были удалены и теперь всё является простыми компонентами.

Этот туториал покрывает всё что вам нужно для создания веб-сайтов с React Router. Мы будем создавать сайт для локальной спортивной команды.

Хочешь посмотреть демку?

Установка

React Router v4 был разбит на 3 пакета:

react-router

router-dom

react-router-native

react-router предоставляет базовые функции и компоненты для работы в двух окружениях(Браузере и react-native)

Мы будем создавать сайт который будет отображаться в браузере, поэтому нам следует использовать react-router-dom. react-router-dom экспортирует из react-router все функции поэтому нам нужно установить только react-router-dom.

npm install --save react-router-dom

Router

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

Обычно предпочтительнее использовать BrowserRouter, но если ваш сайт расположен на статическом сервере(от перев. как github pages), то использовать HashRouter это хорошее решение проблемы.
Наш проект предполагает использование бекенда поэтому мы будем использовать BrowserRouter.

История — History

Каждый Router создает объект history который хранит путь к текущему location[1] и перерисовывает интерфейс сайта когда происходят какие то изменения пути.

Остальные функции предоставляемые в React Router полагаются на доступность объекта history через context, поэтому они должны рендериться внутри компонента Router.

Заметка: Компоненты React Router не имеющие в качестве предка компонент Router не будут работать, так как не будет доступен context.

Рендеринг Router

Компонент Router ожидает только один элемент в качестве дочернего. Что бы работать в рамках этого условия, удобно создать компонент <App/> который рендерить всё ваше приложение(это так же важно для серверного рендеринга).

import { BrowserRouter } from 'react-router-dom';  ReactDOM.render((   <BrowserRouter>     <App />   </BrowserRouter> ), document.getElementById('root')) 

App компонент

Наше приложение начинается с <App/> компонента который мы разделим на две части. <Header/> который будет содержать навигационные ссылки и <Main/> который будет содержать контент роутов.

// Этот компонент будет отрендерен с помощью нашего <Router> const App = () => (   <div>     <Header />     <Main />   </div> ) 

Routes

<Route/> компонент это главный строительный блок React Router’а. В том случае если вам нужно рендерить элемент в зависимости от pathname URL’ов, то следует использовать компонент <Route/>

Path — путь

<Route /> принимает path в виде prop который описывает определенный путь и сопоставляется с location.pathname. 

<Route path='/roster'/>

В примере выше <Route/> сопоставляет location.pathname который начинается с /roster[2]. Когда текущий location.pathname сопоставляется положительно с prop path то компонент будет отрендерен, а если мы не можем их сопоставить, то Route ничего не рендерит[3].

 <Route path='/roster'/> // Когда location.pathname это '/', prop path не совпадает // Когда location.pathname это '/roster' или '/roster/2', prop path совпадает // Если установлен exact prop. Совпадает только строгое сравнение '/roster', но не // '/roster/2' <Route exact path='/roster'/> 

Заметка: Когда речь идет о пути React Router думает только о пути без домена. Это значит, что в адресе:

http://www.example.com/my-projects/one?extra=false

React Router будет видеть только /my-projects/one

Сопоставление пути

npm пакет path-to-regexp компилирует prop path в регулярное выражение и сопоставляет его против location.pathname. Строки path имеют более сложные опции форматирования чем объясняются здесь. Вы можете почитать документацию.

Когда пути сопоставляются создается объект match который содержит свойства:

  • url — сопоставляемая часть текущего location.pathname
  • path — путь в компоненте Route
  • isExact — path в Route === location.pathname
  • params — объект содержит значения из path которые возвращает модуль path-to-regexp

Заметка: Можете поиграться с тестером роутов и посмотреть как создается объект match.

Заметка: path в Route должен быть абсолютным[4].

Создание наших роутов

Компонент Route может быть в любом месте в роутере, но иногда нужно определять, что рендерить в одно и тоже место. В таком случае следует использовать компонент группирования Route’ов — <Switch/>. <Switch/> итеративно проходит по дочерним компонентам и рендерит только первый который подходит под location.pathname.

У нашего веб-сайта пути которые мы хотим сопоставлять такие:

  • / — Главная страница
  • /roster — Страница команд
  • /roster/:number — Страница профиля игрока по номеру
  • /schedule — Расписание игр команды

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

<Switch>   <Route exact path='/' component={Home}/>   {/* Оба /roster и /roster/:number начинаются с /roster */}   <Route path='/roster' component={Roster}/>   <Route path='/schedule' component={Schedule}/> </Switch> 

Что делает рендер компонента Route?

У Route есть 3 props’a которые описывают каким образом выполнить рендер сопоставляя prop path с location.pathname и только один из prop должен быть представлен в Route:

  • component — React компонент. Когда роут удовлетворяется сопоставление в path, то он возвращает переданный component (используя функцию React.createElement).
  • render — функция которая должна вернуть элемент React. Будет вызвана когда удовлетворится сопоставление в path. Render довольно похож на component, но используется для inline рендеринга и подстановки необходимых для элемента props[5].
  • children — в отличие от предыдущих двух props children будет всегда отображаться независимо от того сопоставляется ли path или нет.

<Route path='/page' component={Page} /> const extraProps = { color: 'red' } <Route path='/page' render={(props) => (   <Page {...props} data={extraProps}/> )}/> <Route path='/page' children={(props) => (   props.match     ? <Page {...props}/>     : <EmptyPage {...props}/> )}/> 

В типичных ситуациях следует использовать component или render. Children prop может быть использован, но лучше ничего не делать если path не совпадает с location.pathname.

Элементу отрендеренному Route будет передано несколько props. match — объект сопоставления path с location.pathname, location объект[6] и history объект(созданный аим роутом)[7].

Main

Сейчас мы опишем основную структуру роутера. Нам просто нужно отобразить наши маршруты. Для нашего приложения мы будем использовать компонент <Switch/> и компонент <Route/> внутри нашего компонента <Main/> который поместит сгенерированный HTML удовлетворяющий сопоставлению path внутри.

<Main/> DOM узла(node)

import { Switch, Route } from 'react-router-dom' const Main = () => (   <main>     <Switch>       <Route exact path='/' component={Home}/>       <Route path='/roster' component={Roster}/>       <Route path='/schedule' component={Schedule}/>     </Switch>   </main> ) 

Заметка: Route для главной страницы содержит prop exact, благодаря которому пути сравниваются строго.

Унаследованные роуты

Профиль игрока /roster/:number не включен в <Switch/>. Вместо этого он будет рендериться компонентом <Roster/> который рендериться всякий раз когда путь начинается с /roster.

В компоненте Roster мы создадим компоненты для двух путей:

  • /roster — с prop exact
  • /roster/:number — этот route использует параметр пути, который будет отловлен после /roster

const Roster = () => (   <Switch>     <Route exact path='/roster' component={FullRoster}/>     <Route path='/roster/:number' component={Player}/>   </Switch> ) 

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

К примеру <Roster/> может быть отрендерен с заголовком который будет отображаться во всех роутах которые начинаются с /roster.

const Roster = () => (   <div>     <h2>This is a roster page!</h2>     <Switch>       <Route exact path='/roster' component={FullRoster}/>       <Route path='/roster/:number' component={Player}/>     </Switch>   </div> ) 

Параметры в path

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

:number часть строки в /roster/:number означает, что часть path после /roster/ будет получена в виде переменной и сохраниться в match.params.number. К примеру путь /roster/6 сгенерирует следующий объект с параметрами:

{ number: '6' // Любое переданное значение интерпретируется как строка}

Компонент <Player/> будет использовать props.match.params для получения нужной информации которую следует отрендерить.

// API возращает информацию об игроке в виде объекта import PlayerAPI from './PlayerAPI' const Player = (props) => {   const player = PlayerAPI.get(     parseInt(props.match.params.number, 10)   )   if (!player) {     return <div>Sorry, but the player was not found</div>   }   return (     <div>       <h1>{player.name} (#{player.number})</h1>       <h2>{player.position}</h2>     </div> ) 

Заметка: Вы можете больше изучить о параметрах в путях в пакете path-to-regexp

Наряду с компонентом <Player/> наш веб-сайт использует и другие как <FullRoster/>, <Schedule/> и <Home/>.

const FullRoster = () => (   <div>     <ul>       {         PlayerAPI.all().map(p => (           <li key={p.number}>             <Link to={`/roster/${p.number}`}>{p.name}</Link>           </li>         ))       }     </ul>   </div> ) const Schedule = () => (   <div>     <ul>       <li>6/5 @ Спартак</li>       <li>6/8 vs Зенит</li>       <li>6/14 @ Рубин</li>     </ul>   </div> ) const Home = () => (   <div>     <h1>Добро пожаловать на наш сайт!</h1>   </div> ) 

Ссылки

Последний штрих, наш сайт нуждается в навигации между страницами. Если мы создадим обычные ссылки то страница будет перезагружаться. React Router решает эту проблему компонентом <Link/> который предотвращает перезагрузку. Когда мы кликаем на <Link/> он обновляет URL и React Router рендерит нужный компонент без обновления страницы.

import { Link } from 'react-router-dom' const Header = () => (   <header>     <nav>       <ul>         <li><Link to='/'>Home</Link></li>         <li><Link to='/roster'>Roster</Link></li>         <li><Link to='/schedule'>Schedule</Link></li>       </ul>     </nav>   </header> ) 

<Link/> использует prop to для описания URL куда следует перейти. Prop to может быть строкой или location объектом (который состоит из pathname, search, hash, state свойств). Если это строка то она конвертируется в location объект.

<Link to={{ pathname: '/roster/7' }}>Player #7</Link> 

Заметка: Пути в компонентах <Link/> должны быть абсолютными[4].

Работающий пример

Весь код нашего веб сайта доступен по этому адресу на codepen.

Route готов!

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

Мы использовали самые основные компоненты которые вам понадобятся при создании собственных веб приложений (<BrowserRouter.>, <Route.>, and <Link.>), но есть еще несколько компонентов и props которые здесь не рассмотрены. К счастью у React Router есть прекрасная документация где вы можете найти более подробное объяснение компонентов и props. Так же в документации предоставляются работающие примеры с исходным кодом.

Пояснения

[1] — Объект location описывает разные части URL’a

// стандартный location  { pathname: '/', search: '', hash: '', key: 'abc123' state: {} }

[2] — Вы можете использовать компонент <Route/> без path. Это полезно для передачи методов и переменных которые храняться в context.

[3] — Если вы используете prop children то route будет отрендерен даже есть path и location.pathname не совпадают.

[4] — Сейчас ведется работа над относительными путями в <Route/> и <Link/>. Относительные <Link/> более сложные чем могут показаться, они должны быть разрешены используя свой родительский объект match, а не текущий URL.

[5] — Это stateless компонент. Внутри есть большая разница между render и component. Component использует React.createElement для создания компонента, в то время как render используется как функция. Если бы вы определили inline функцию и передали через нее props то это было бы намного медленнее чем с использованием функции render.

<Route path='/one' component={One}/> // React.createElement(props.component) <Route path='/two' render={() => <Two />}/> // props.render()

[6] — Компоненты <Route/> и <Switch/> могут оба использовать prop location. Это позволяет сопоставлять их с path, который фактически отличается от текущего URL’а.

[7] — Так же передают staticContext, но он полезен только при рендере на сервере.
ссылка на оригинал статьи https://habrahabr.ru/post/329996/

Российские власти находятся в одном шаге от внедрения блокчейна

image

В марте премьер-министр Дмитрий Медведев предлагал Минэкономразвитию и Минсвязи подумать, как с помощью технологии блочных цепей победить бюрократию, а в середине мая призвал обсудить правовое регулирование блокчейна. По прогнозу консалтинговой компании Accenture, в 2018–2024 блокчейн будет распространяться на множество типов активов, а к 2025 году эта технология станет массовой и неотъемлемой частью мирового капитала, пишут «Ведомости».

Большую известность технология получила благодаря своей связи с криптовалютой биткоин. Однако теперь и без биткоина ей хорошо живется.

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

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

Юрий Мазуров, замруководителя коммерческой дирекции интегратора «Астерос» дополняет список таким широким направлением, как защита юридических прав.

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

Внедрение

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

Одно из таких программных решений – Ethereum, популярная во всем мире блокчейн-платформа. Применяется она и в собственном сервисе Microsoft Azure Blockchain as a Service (BaaS), где можно в один клик развернуть блокчейн-инфраструктуру, разъясняет Мазуров. BaaS использует несколько блокчейн-решений: Ethereum, Chain Core, Corda, Nxt, Lisk, Waves, перечисляет он.

У IBM есть решение Blockchain for Hyperledger Fabric, которое сейчас тестируют ряд банков и компаний, сообщил «Ведомостям» представитель американской корпорации. По его словам, оно не требует существенной доработки под заказчика.

Ранее ЦБ вместе с крупнейшими банками запустил платформу мастерчейн, которая позволяет проводить онлайн-платежи, оперативно подтверждать актуальность данных о клиенте или сделке, а также быстро создавать финансовые сервисы. Эта платформа построена на Ethereum и российской криптографии, объясняет Архипов из Ассоциации развития финансовых технологий.

Не одно «но»

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

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

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

Если в банке стандартный денежный перевод – изменение цифр на двух счетах, то в системе блокчейн – это вычисление сложной математической функции, отмечает руководитель лаборатории больших данных Фонда развития интернет-инициатив (ФРИИ) Анатолий Орлов.

Стандартные платежные системы пропускают до 45 000 транзакций в секунду, а блокчейн не может похвастаться такими скоростями: он способен не более чем на 3–4 транзакции в секунду, говорит директор по технологическому развитию ФРИИ Сергей Алимбеков.

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

Применение блокчейна в России потребует корректировки Федерального закона «О персональных данных».

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

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

На Западе интерес властей к блокчейн намного сильнее и возник значительно раньше. В октябре 2015 года правительство Великобритании объявило, что выделит 10 миллионов фунтов стерлингов на исследование потенциальных возможностей распределенного реестра. А затем Банк Англии выступил с инициативой создания дорожной карты по модернизации финансовой инфраструктуры страны с возможным использованием технологий распределенных реестров.
ссылка на оригинал статьи https://geektimes.ru/post/289713/

Сотрудник Amazon устроил социальный эксперимент: пользователи Twitch управляют его капиталами на бирже

Онлайн-трансляции нравятся многим. Кто-то смотрит способы прохождения любимых игр, кому-то по душе чей-либо перфоманс, ну а кто-то сам устраивает трансляции на Twitch в надежде заработать или просто получить свой кусочек славы. На самом деле, интересных проектов на сервисах трансляции видео достаточно много. Одним из наиболее интересных можно назвать "StockStream", это социально-финансовый эксперимент, устроенный инженером Amazon.

В основе этого эксперимента — схожий проект, стартовавший в 2014 году. Тогда более, чем миллион пользователей Twitch управляли главным героем игры о покемонах на Nintendo Game Boy. Сейчас этот эксперимент повторяется, только замысел немного иной. Вместо игры на видеоконсоли используется игра на бирже. На кону — $50 000 инженера Amazon, который все это и затеял. По словам автора проекта, эти 50 тысяч — его сбережения. Играет на бирже этими средствами несколько десятков тысяч человек, как профессионалов, так и начинающих «биржевиков».

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


Pokemon, которым управляли миллионы пользователей три года назад

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

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

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

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

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

Разработчик говорит, что ранее он переживал по поводу троллей, которые могли бы при желании нарушить рабочий процесс. Но сомнения и переживания оказались напрасными. А сейчас все идет хорошо. Роберт говорит, что пользователи купили ему самых разных акций, так что у него сейчас сбалансированный пакет, куда входят ценные бумаги AMD, Tesla и Apple.

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

Правда, в эксперименте важную роль играет сумма на счету, с которого осуществляются операции по приобретению ценных бумаг. По правилам FINRA, если общая сумма опустится ниже уровня в $25 000, то торги придется прекратить. И если шаги, предложенные пользователями Twitch, окажутся неудачными, то ниже указанного уровня можно опуститься очень быстро.
ссылка на оригинал статьи https://geektimes.ru/post/289711/

BI.ZONE объявляет выборы президента CTFzone

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

Компания BI.ZONE объявляет о проведении выборов президента CTFzone. Выборы будут максимально свободными и независимыми – никаких партий и звезд политической арены, только Вы и Ваш кандидат. Командам предлагается сыграть роль избирательного штаба и помочь своему кандидату одержать победу.

Первый онлайн-этап выборов, Праймериз, стартует 24.06.2017 в 09:00 UTC и продлится 36 часов. Формат – Jeopardy, 5 категорий. В следующий этап пройдут только 10 кандидатов.

Второй этап соревнования, Президентские выборы, будет проходить в очном формате 16-17 ноября в рамках конференции ZERONIGHTS 2017.

Борьба 10 избирательных штабов-команд на этом этапе будет намного более агрессивной – Attack/Defence формат предполагает защиту сервера своего штаба и атаку серверов избирательных штабов соперников. Тяжелая битва полностью оправдывается – команда-победитель не только сможет объявить своего кандидата Президентом CTFzone, но и получит $10 000. Команды, которые заняли 2 и 3 место, получат $5000 и $3000 соответственно.

Президентские выборы чрезвычайно важны для CTFzone, поэтому наша компания покроет расходы на проживание и дорогу для команд, прошедших во второй тур (важно – состав команды не должен превышать 5 человек). Ввиду значимости мероприятия мы просим команды соблюдать правила – за нарушения могут дисквалифицировать. Строго запрещено:
− Атаковать инфраструктуру организаторов;
− Генерировать большой объем трафика (DDoS);
− Проводить атаки на компьютеры жюри;
− Обмениваться флагами с другими участниками.

Регистрация команд откроется 9 июня на портале ctf.bi.zone. Следите за обновлениями в блоге BI.ZONE на Хабре и в Твиттере.

Всем удачи на выборах!

Make CTF great again.
ссылка на оригинал статьи https://habrahabr.ru/post/329994/