...

суббота, 17 ноября 2018 г.

NASA объявило о новом полете на Луну

Люди снова будут ходить по поверхности Луны – впервые с 1972 года. Национальное управление по аэронавтике и исследованию космического пространства США рассказало о планах новой пилотируемой миссии. Пока что супер-конкретные детали с датами не раскрываются, общий посыл просто «мы это сделаем».

Американский интернет рыдает от счастья. Но, неожиданно, среди экспертов нашлось много недовольных. Когда планы NASA были объявлены перед консультативной группой 15 ноября, советники разделились на две группы. С одной стороны – предложения по ускорению программы (иначе, не дай бог, Китай обгонит). С другой – рассказы о нереалистичности и затратности проекта, особенно в плане постройки перманентной станции Gateway на лунной орбите.

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

В рамках этой кампании предполагается постройка орбитальной станции Gateway – с модулями NASA и международных/коммерческих партнеров. Также будут разработаны спускаемые аппараты для доставки людей на поверхность спутника. Их тестирование на Луне планируется начать до 2024-го.

NASA также представила слайд того, чего ожидается достигнуть к 2028 году. В том числе – минимум 7 миссий к Луне, полностью построенная Gateway, ездящий ровер, 4 исследовательских миссии на лунной поверхности и 3 коммерческих полета. Спусковой модуль будет многоразовым. По словам Тома Креминса, план еще может измениться, всё зависит от денег. Но если бюджет NASA останется стабильным, «мы уверены, что сможем всё это сделать».


Комментарии советников разделились. Айлин Коллинз, бывший астронавт, первая женщина-командир Шаттла, говорит, что план «недостаточно амбициозен»:


2028 – это через целых 10 лет. Мне кажется, это слишком долго. Мы можем сделать это раньше.

Харрисон Шмитт, астронавт в составе экспедиции по последней высадке людей на Луну Аполлон-17, тоже остался не в восторге:


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

Участник миссии Аполлон-11, второй человек на Луне Базз Олдрин, высказался против орбитальной станции:


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

По словам Олдрина, ему больше нравится концепт Moon Direct, предложенный инженером Робертом Зубрином, известным своими книгами в поддержку марсианских миссий. По планам Зубрина, посадочные капсулы могут лететь от станции у орбиты Земли к лунной/марсианской поверхности, и потом обратно. Так, он посчитал еще в 1990-х, затраты энергии на постройку орбитальной станции будут гораздо ниже.


Вчерашний промо-ролик NASA, посмотрите, воодушевитесь

Майк Гриффин, бывший глава NASA, который сейчас руководит исследованиями и разработкой для Министерства обороны США, в собрании не участвовал. Но через несколько часов после этого на вопросы журналистов по поводу новой лунной миссии ответил:


Я думаю, 2028 – это очень поздно, это даже не стоит обсуждать. Это мое личное мнение. Такая дата не показывает миру, что Соединенные Штаты здесь в чём-то лидируют.

Чуть позже он добавил:


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

Пока что Китай не посылал людей дальше земной орбиты: его программа была сфокусирована на постройке своей космической станции к середине 2020-х. Но Майк Гриффин, вероятно, понимает, о чем говорит. Когда он был главой NASA, именно он в 2007 году объявлял, что американцы опять вернутся на спутник к 2020 году. Потом такие планы довольно быстро были отменены администрацией Обамы в 2010-м. Трамп тоже не показывает особенного интереса к космическим проектам страны. Общий консенсус среди экспертов – пока президент не будет так же увлечен идеей Марса или Луны, как когда-то Кеннеди, по-настоящему решительных прорывов ожидать не стоит.

Let's block ads! (Why?)

[Из песочницы] Уязвимость генератора псевдослучайных чисел в Bitcoin

Приватные Биткоин-ключи — это целочисленное значение от 1 до 115792089237316195423570985008687907852837564279074904382605163141518161494337 или в HEX 1 до 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141. В главной сети Биткоина существуют адреса начинающиеся на 1: compressed, uncompressed; адреса на 3: SigScript и обратно совместимые с SegWit, а так же нативные SegWit адреса начинающиеся на bc1. К тому же есть уже порядка семидесяти форков, имеющие другие префиксы, но те же корни что и основного Биткоина.

Биткоин-адреса рассчитываются криптографической функцией подписи ECDSA ( ) основанной на эллиптической кривой.
Итак, рассмотрим генерацию Биткоин-адреса из приватного ключа.

Закрытый ключ d — число
Открытый ключ Q — точка эллиптической кривой, равная dG,
где G — базовая точка кривой.

  • Для подписи выбирается случайное число k, в диапазоне [1, n-1].
  • Вычисляется точка кривой (x1,y1) = k*G
  • Вычисляется r = x1 mod N, где N — порядок кривой.
  • Вычисляется s = k-1(H(m)+rd) mod N, где k-1 — число, обратное по модулю N к k.
  • H(m) — хэш подписываемого сообщения.

image

Подписью является пара (r,s).

Переменная «k» рандомная и получается в алгоритме ECDSA из стандартных библиотек операционной системы.

Таким образом, во всей функции можно повлиять только на эту переменную. Что даёт два вектора атаки:

  1. заложенная уязвимость в псевдослучайное число
  2. и вселенское везение при котором случайное число выпадает дважды


Атака генератора псевдослучайных чисел


Первым эту проблему исследовал и опубликовал Nils Schneider в 28 января 2013 на своей личной странице. Но проблема сохранилась и более того, приобрела новый масштаб.

Программная атака на ГПСЧ подразделяется на три типа:
Прямая криптографическая атака основанная на анализе выходных данных алгоритма.

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

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

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

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

Каков масштаб угрозы для Биткоина?


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

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

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

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

Самая крупная утечка произошла летом 2015 года. JavaScript кошелька Blockchain.info несколько часов выдавал одно и тот же значение переменной «к». Что привело к краже порядка 200 Биткоинов!

Если убрать человеческий фактор программных уязвимостей, вероятность совпадения примерно 0,000296868 %. Совсем не много, но очень бы не хотелось стать таким “счастливчиком” и потерять свои деньги.

Как с этим бороться ?


Как мы описывали выше, данная уязвимость работает только при отправке платежей и генерации одинаковой переменной “К”, как минимум на двух транзакциях. Следовательно, если не создавать исходящих транзакций или свести их количество к минимуму, то и угрозы нет ни какой. Такая идея давно реализована в Биткоин протоколе BIP 32 (Hierarchical Deterministic Wallets, HD wallet) Иерархический Детерминированный Кошелек.

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

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

Ссылки:

[1] ECDSA — Application and Implementation Failures, Markus Schmid, UC SANTA BARBARA, CS 290G, FALL 2015.

[2] Nils Schneider: Recovering Bitcoin private keys using weak signatures from the blockchain, Blog entry, 28 January 2013.

[3] Private Key Recovery Combination Attacks

[4] Список уязвимых адресов и общий баланс

Let's block ads! (Why?)

[Перевод] Senior Engineer в поисках работы. Как я прошел 20 собеседований с HR и что я об этом думаю

Предисловие для читателей Хабра — статья поиске работы на рынке разработки в Украине (который в основном об аутсорсе на иностранных заказчиков) поэтому некоторые вещи могут показаться странными (LinkedIn, собеседования с заказчиками, обязательное требование разговорного английского, обсуждение зп в долларах) или нерелевантными для РФ. Тем не менее, статья имела большой успех на локальных ресурсах, и некоторые попросили меня перевести её на русский, каковой перевод я вам и представляю.

Этой статьей я бы хочу начать цикл рассказов о том, как я на протяжении нескольких месяцев проходил собеседования в примерно 20 разных компаниях на разные должности. Тут будут мои мысли о рынке труда, процессе найма, а так же несколько самых интересных историй. Цикл будет состоять из нескольких частей — HR собеседования, технические собеседования, финальные собеседования. Итак, первая часть.

Немного о себе. Программирую с школьного возраста, за деньги работают 10 с хвостиком лет. Работал админом, программистом, тимлидом, РМ-ом, линейным менеджером. Выполнял обязанности SRE/DevOps, архитекта, HR, офис-менеджера, эникейщика.

Работал в кровавом энтерпрайзе, в стартапе, в аустсорсе. В основном занимался формошлёпством и крудами, имел дело с Java и бэкендом. Последние несколько лет пересел на фуллстек микс из Java, Ruby/RoR, Python, Node.js.

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

Всего я прошел примерно 20 собеседований с рекрутерами: половина из них были из агенств и половина — штатные рекрутеры/HR компаний. Так что могу сказать что некоторая статистика у меня есть.

Предложения на LinkedIn


Как и любой человек, у которого есть хороший профиль на LinkedIn, я получаю множество предложений о работе буквально каждую неделю (а иногда и ежедневно). Я всегда отвечаю рекрутерам. Обычно это сводилось к «Спасибо, не интересно». Однако, время от время меня прорывало на длинные тирады о том, почему я не пойду работать в эту компанию или почему конкретно эта вакансия мне не подходит. Время шло и предложения становились все более интересными, поэтому мне пришло в голову отвечать положительно на абсолютно все предложения (даже нерелевантные), пытаться пройти собеседования до конца, а потом уже думать, что делать дальше. Єдинственным условием, которое я поставил был достаточно высокий уровень компенсации ($5k net), который автоматически бы отклонил всякие middle-вакансии.

Этап нулевой. Собеседования с рекрутером


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

1. Иметь подготовленное CV
2. Уметь быстро рассказать про свой опыт
3. Четко объяснить, почему вы ищете работу
4. Четко сформулировать что именно вы ищете
5. Сразу озвучить свои зарплатные ожидания
6. Сообщить когда вы можете начать работу если получите предложение
7. Быть готовым пройти тест на знание английского
8. Быть готовым к видеозвонку
9. Если для вас важен соцпакет, расположение офиса, или другие вещи — иметь под рукой чеклист который потом озвучить рекрутеру
10. Четко отвечать на вопрос: «Если у вас будет два предложения на руках, какое из двух выберете?»

Пройдемся по пунктам.

Резюме.


Статей о том, как правильно сделать CV, целая куча. Я советую иметь линк на PDF, чтобы не перебрасываться файлами в мессенджерах и по по почте, но еще лучше иметь CV в своем LinkedIn профиле. Можете посмотреть мой LinkedIn как пример. Я всегда отвечал рекрутерам «Вместо CV распечатайте мой профиль, там все есть» и всех это устраивало. Рекрутеры часто конвертируют CV во внутренние форматы, поэтому не стоит стараться за них — просто держите LinkedIn-профиль в хорошем состоянии.

Рассказ о себе


Заготовьте краткий рассказ о вашем опыте, чтобы рекрутер на задавал дурацкие вопросы: «А вы работали с AWS и Docker?». Быстро и коротко, например, «5 лет Java разработки, 2 года с AWS, есть знания DevOps и был тимлидом команды и 3-их людей». Желательно перечитать вакансию перед разговором чтобы сразу сказать: «Да, я подхожу потому что с этим и этим работал».

Мотивация


Нужно максимально коротко и ясно объяснить причину поиска работы (даже если это не очень соответствует действительности или вы не хотите раскрывать причины увольнения). Мой любимый вариант: «Закончился проект, другого хорошего сейчас нет, ищу новый». Это типичная ситуация для украинского аутсорса, поэтому она автоматически отсекает вопрос «Что вас не устраивает на текущем месте работы?» і другие подобные. Лично меня после такого ответа никто не расспрашивал о подробностях а это сокращало суммарное время общения. Стоит избегать ответов, которые могут вызвать дополнительные вопросы. Например, «Ищу работу потому что на проекте некомпетентное руководство». Следует говорить коротко и ясно: «Нет проектов, новые еще не запустились, смотрю новые возможности».

Что именно вы ищете


В зависимости от вакансии, куда вы подаетесь, желательно сказать именно то, что там написано, опять же, чтобы избежать дополнительных вопросов и дать рекрутеру понять что вы серьезно настроены. Плохой ответ: «Ищу высокую зарплату» (даже если это действительно так), — породит ненужные вопросы к вам. Хороший ответ: «Ищу проект, на котором я мог бы расширить и углубить свои знания и умения. Например я вижу что у вас требуется Java с которой я много работал и Machine Learning о котором я знаю, на с которым не имел возможности поработать на практике». Нужно дать понять рекрутеру что вы подходите под вакансию и она вам действительно интересна (даже если по факту это не так), опять же, чтобы сократить время на коммуникацию.

Зарплатные ожидания


Сразу называйте цифру, обязательно net, чтобы избежать недоразумений в будущем. Например, «от $4000 net». Негоциация зарплаты — отдельная тема. Добавлю лишь что мне не нужно було её обсуждать, потому что я точно знал, сколько стою. В вашем случае рекрутер может спрашивать «А на сколько вы можете опустить планку?» и т.д. На такое отвечайте: «Давайте мы пройдем тех. интервью а там будет видно».
На первых нескольких интервью я озвучил сумму, но не указал, это net или gross. Рекрутер меня переспросила, и я немножко растерялся, потому что изначально поставил высокую планку и не ожидал, что меня будут готовы нанять на эти деньги. Поэтому я ответил «Да мне все равно :)». Это дало рекрутеру повод для манипуляций. На следующих собеседованиях я всегда говорил сумму net чтобы ни у кого не возникало дополнительных вопросов.

Сколько времени нужно на переход


Рекрутеры всегда это спрашивают. Поэтому имейте ответ, желательно фиксированный, например «1 месяц», «2 недели» и так далее. Почему не стоит отвечать «2-4 недели», думаю, понятно. Еще одна ось для манипуляций, например, «Ну вы же говорили 2 недели, у нас вот проект стартует а теперь вы подводите». Отвечаете: «2 недели по контракту», — и все.

Английский язык


Про язык, думаю, понятно. Нужно иметь более-менее адекватный уровень разговорного и быть готовым в телефонном режиме ответить на один из вопросов: «Расскажите о своем последнем проекте», «Расскажите, что вы делаете в свободное время, какие у вас есть хобби», «Расскажите почему вы выбрали именно эту технологию» и так далее. Советую подготовить речь и потренироваться перед зеркалом или знакомыми. Вопросы могут быть разными, но эти три являются самыми популярными (первый так вообще лидирует со значительным отрывом). Сами рекрутеры при этом разговаривают на английском не очень хорошо. Дополнительным плюсом этого упражнения будет также и то, что у вас будут готовые ответы на аналогичные вопросы от представителей заказчика или зарубежных инженеров, с которыми вы будете иметь дело дальше.
Одна из рекрутеров решила выделиться и попросила меня ответить на вопрос «What was biggest failure in your life?». Вместо того, чтобы отвечать на такие дурацкие вопрос, я рассказал ей про фейл на работе. Если рекрутер переходит границы или вы чувствуете себя некомфортно, просто предложите рассказать о чем-нибудь другом.

Видеозвонок


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

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

Один из разговоров у меня был с VP of Engineering крутого израильского стартапа. Он использовал bluetooth гарнитуру, которая давала очень приглушенный и неразборчивый звук. Половину слов мне приходилось угадывать из контекста того, что удалось разобрать. Было очень сложно, ведь я не мог сказать ему: «Замените, пожалуйста, микрофон, вас не слышно», — однако я как-то справился.

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

Важные для вас условия


Если есть важные для вас критерии, обязательно следует о них сообщить. Для меня не важными были ни соцпакет (страховка и т.д.), ни расположение офиса, ни возможность удаленной работы, ни вообще что угодно другое, поэтому я так и говорил: «Вопросов нет, соцпакет неинтересен, давайте двигаться дальше». Для вас что-нибудь из вышеперечисленного может быть важным, поэтому говорите об этом. Не всегда рекрутер может ответить на такие вопросы, но хорошо, если вы сразу готовы сказать, что вас интересует, а не думать об этом.

Ответ на вопрос о двух стульях


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

Взяв во внимание все вышеперечисленное, первым моим ответом на приглашение рекрутера в LinkedIn было следующее:
1. Вакансия инетерсна
2. ЗП от $X000 net
3. English — Upper-Intermediate
4. CV скопипастите из LinkedIn-профиля
5. На переход нужен 1 месяц
6. Скайп — xxx. Набирайте, поговорим.

Далее мы плавно перемещались в скайп и договаривались о времени видеозвонка.

Если все прошло хорошо, вы составили впечатление адекватного человека, то дальше будет фирменное «Я передам информацию в компанию и мы договоримся о следующем этапе».

Ни разу для первого знакомства меня не приглашали в офис. Собеседования продолжались от 15 минут до 1 часа (на менеджерские должности). Думаю что сейчас знакомство в офисе — скорее исключение, нежели распространенная практика. Всего у меня было приблизительно 20 таких диалогов с HR и рекрутерами.

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


На самом деле рекрутеры не читают ваш LinkedIn-профиль и резюме


Или читают по диагонали. Нужно просто смириться с этим. Если у вас в профиле есть более одной технологии, то вам будут сыпаться предложения по каждой из них отдельно. У рекрутеров нет времени читать профили. Их основное оружие — проспамить максимальное количество кандидатов, а там, может быть, кто-нибудь отозвется и удастся его раскрутить.
Пишет мне рекрутер: «Вот есть вакансия тимлида, давай к нам работать». Я отвечаю положительно, созваниваемся, я рассказываю немного о себе, она — про вакансию. Ок, идем дальше. Переходим к техническому собеседованию, видеозвонок с разработчиками, и тут они мне говорят: «У нас вакансия фронтенд лида. Какой у вас опыт с фронтендом?». Я даже первую минуту рассказывал что-то о том что да, знаю JS, более-менее представляю себе как работает современный фронт. И тут они говорят «Ну, у нас тут чисто фронт. Как вы к этому относитесь?». Далее, естественно, я отвечаю: «Ребята, похоже тут маленькое недоразумение, счастливо».
Рекрутер даже не извинилась.

Часто рекрутеры говорят, что, мол, кандидаты не обновляют профиль в LinkedIn, поэтому они его не читают — всегда нужно уточнять детали в диалоге.

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

Игнорирование кандидатов


Да-да, это фирменное «Мы вам перезвоним». Несмотря на то, что найм кандидата — это прямая прибыль для рекрутера, часто они позволяют себе исчезать на несколько дней.

По моим наблюдениям, штатные рекрутеры компаний грешат этим значительно чаще, нежели рекрутеры из агенств. Только единственный раз я получил ответ на следующий день и она была от рекрутера из лидера рынка («лидером рынка» называется компания из ТОР5 самых больших компаний в Украине — Epam, Luxoft, SoftServe, GlobalLogic, Ciklum — прим. пер.).

Пишет мне рекрутер из компании. Мы в тот же день созваниваемся в скайпе и я прохожу нулевую проверку. Дальше она говорит: «Я перешлю ваше резюме заказчику, они дадут тестовое и дальше будет видно». Посл этого она исчезает на неделю. В конце следующей недели она пишет: «Ой, такая неделя была, просто завал, мне еще не ответили, и вообще, я завтра в отпуск на две недели. Ну, вы подождете?». Я отвечаю утвердительно: «Ок, давайте, хорошего отпуска».

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

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


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

Нерелевантные вопросы, или вопросы о технической экспертизе


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

Также рекрутеры могут спросить что-нибудь из технической части, например: «Был ли у вас опыт построения с нуля CI/CD?», хотя часто они не имеют представления о том, что это такое.

В одну из компаний искали инженера который сможем им построить процесс этого самого CI/CD і рекрутер меня спросила: «А чем отличается Delivery от Deployment?».

Нужно понимать что они — люди нетехнические и выяснить, какая цель их вопроса. Если они хотят убедиться, что вы подходите под требования вакансии — так и скажите: «Вот у вас тут написано, я с этим работал». Не нужно над ними шутить или агриться. Постарайтесь человеческим языком объяснить, что, например, «я не работал с Azure, но у вас меня есть опыт с AWS, а это очень похожие вещи. Поэтому покажите мое CV вашим технарям они уже пусть решают».

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

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

Где-то посредине — рекрутеры из агенств.

Наименее профессиональные — штатные рекрутеры из небольших и средних компаний.

Как правило, рекрутеры достаточно компетентны, чтобы выслать вам приглашение на почту вместе с ICS-вложением, чтобы оно автоматически было добавлено в календарь. Однако несколько раз мне не присылали формальное приглашение на почту (пришлось напоминать) и несколько раз высылали, но без вложения для календаря. А однажды выслали, но без уточнения, как попасть в офис и без номера телефона.
Я пришел вовремя и в этот миг понял, что у меня нет контактного телефона рекрутера, 3G в здании не работает а охрана знать не знает что у них есть компания с таким названием (это был БЦ). Перед турникетами я поймал каких-то ребят явно программистского вида и попросил их передать на ресепшн о том, что тут кандидат ожидает. Ребята с задачей по какой-то причине не справились, поэтому пришлось параллельно насесть на охрану. В конце-концов, они нашли у себя в каталоге нужный номер, перезвонили на ресепшн, получили подтверждение и пропустили меня. Это все стоило мне 10-и минутного опоздания.

О средствах связи


Обычно рекрутеры после первого контакта в почте или LinkedIn просят ваш скайп (или другой мессенджер). Из всех, с кем я имел дело, продолжил общение почтой только один рекрутер, несмотря на мое предложение перейти в скайп. Двое предложили телеграм. Будем считать, что дефолтным способом связи до сих пор остается скайп.

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

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

Этап первый. Собеседования с HR компании


Я разделяю этапы собеседований с рекрутером и HR компании, несмотря на то, что они часто объединяются в один, если на вас вышли напрямую из компании. Тут важны все предыдущие пункты, а так же:
1. Убедить HR, что вы соответствуете вакансии.
2. Показать заинтересованность в вакансии
3. Выдержать информационно-мотивационный спич о компании
4. Иметь подготовленные вопросы касательно вакансии и процесса прохождения всех этапов найма.

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

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

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

На одном из таких собеседований HR долго рассказывала о проектах, компании, сделала акцент на том, что у них есть собственные продукты которые приносят прибыль. Рассказала что у них гибкий график, иногда можно работать удаленно. А гвоздем программы были безлимитные оплачиваемые отпуска. Оставим за кадром вопрос, действительно ли это работает, но мне показалось, что, как минимум, компания, которая может себе это позволить, не экономит на сотрудниках. Мы попрощались и уже на следующий день эта HR мне пишет: «К сожалению, запрошенная вами ЗП выше наших вилок, поэтому не можем вам ничего предложить». Не знаю, правда это была или нет, однако мне это показалось довольно забавным, учитывая то, что ожидаемую ЗП она знала до того, как мы начали разговор.

HR всегда ожидают вопросов и напрягаются, если вы их не задаете. Поэтому держите под рукой тройку дефолтных вопросов, на какие они будут компетентны ответить. Хорошие вопросы, которые покажут вашу заинтересованность, например «Кто финансирует компанию?» (если это стартап), «Сколько людей в командах», «Есть ли планы запуска новых проектов или продуктов?», «На сколько вы выросли за последние Х месяцев?», и так далее. Конечно, вопросы зависят от типа компании и её деятельности. Тут так же важно дать понять, что вы планируете задержаться надолго, и ожидаете, что компания заинтересована в длительном сотрудничество и предоставляет карьерные возможности. HR это любят.

Этап первый с половиной. Интро от бизнес-людей


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

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

Именно таким было вышеупомянутое собеседование с представителями израильского стартапа. Это технологическая компания, которая делает продукты для разработчиков, поэтому я знал о них и ранее и знал об их конкурентах. После того, как мне долго рассказывали о продукте, я начал задавать вопросы вроде: «Вот я пользуюсь вашим конкурентом X, чем вы лучше?». Этим я дал возможности визави похвастаться своим продуктом, показал минимальное знание индустрии где они работают, высказал восхищение объемами данных которыми они оперируют, поинтересовался какой будет моя роль, какие у них есть департаменты и так далее. В результате рекрутер передал мне следующее впечатление от VP: «He’s the best candidate I’ve seen thus far». Я думаю, что мне хорошо помогло знание продукта и умение задать правильные вопросы.

Итак, не ленитесь изучить компанию, её продукты и конкурентов. Для собеседования с зарубежными заказчиками это 100% будет хорошим плюсом.
Одна из рекрутеров пригласила меня в серьезный американский стартап и сделала акцент на том, что они очень любят, когда кандидаты знают про их продукт и читали статьи их CTO. Далее она мне скинула ссылки на его выступления, статьи, слайды о продукте и так далее. Я немножко постебался, что, мол, это компания из разряда «работать в нашем банке — большая честь».
К сожалению, до технического собеседования я не дошел по другим причинам, о которых будет дальше.

Интерлюдия, или Не будьте мудаком


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

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

Рекрутер из агенства хочет нанять меня в тот самый серьёзный американский стартап. Первый этап прошел хорошо, дальше должно было быть техническое. Через несколько дней рекрутер пишет мне «Вы уже общались с этой компанией?», я отвечаю: «нет, не общался». Тут она говорит имя HR этой компании и передает от неё вопрос: «Что-то поменялось?». Я не понимаю в чем дело, ищу по LinkedIn диалог, нахожу его и смотрю что он ничем не закончился («привет-привет» и все). Передаю эту информацию рекрутеру: «Да, мы общались, но без продолжения», на что она мне присылает скриншот моего сообщения из диалога с HR в скайпе, где я написал, буквально «скалу не люблю фу мерзость», и спрашивает: «У вас что-то изменилось по предпочтениях в технологиях?» (вакансия была на Python/Scala разработчика). Тут я все вспоминаю, подымаю историю в скайпе, читаю весь диалог и потихоньку набираю красного цвета. Ну, вы поняли, сообщение про скалу было, наверное самым невинным из всего, что я написал.

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

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

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

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

Let's block ads! (Why?)

Go lintpack: менеджер компонуемых линтеров

lintpack — это утилита для сборки линтеров (статических анализаторов), которые написаны с использованием предоставляемого API. На основе него сейчас переписывается знакомый некоторым статический анализатор go-critic.

Сегодня мы подробнее разберём что такое lintpack с точки зрения пользователя.

go-critic начинался как экспериментальный проект, который являлся песочницей для прототипирования практически любых идей в области статического анализа для Go.

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

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

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

Резюмируя, вот проблемы, которые стояли на пути развития go-critic:


  • Груз сложности. Слишком много поддерживать, наличие бесхозного кода.
  • Низкий средний уровень качества. experimental означал как "почти готово к использованию", так и "лучше не запускать вообще".
  • Иногда трудно принимать решение включения проверки в go-critic, а отклонять их противоречит исходной философии проекта.
  • Разные люди видели go-critic по-разному. Большинству хотелось иметь его в виде CI линтера, который идёт в поставке с gometalinter.

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


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

А что если бы нам не нужно было хранить все проверки в одном репозитории?


go-critic состоит из двух основных компонентов:


  1. Реализация самих проверок.
  2. Программа, которая загружает проверяемые Go пакеты и запускает на них проверки.

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

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


Пакеты, которые реализованы с использованием lintpack как фреймворка, будем называть lintpack-совместимыми или lintpack-compatible пакетами.

Если бы сам go-critic был реализован на основе lintpack, все проверки можно было бы разделить на несколько репозиториев. Одним из вариантов разделения может быть следующий:


  1. Основной набор, куда попадают все стабильные и поддерживаемые проверки.
  2. contrib репозиторий, где лежит код, который либо слишком экспериментальный, либо не имеет меинтейнера.
  3. Что-то вроде go-police, где могут находится те самые настраиваемые под конкретный проект проверки.

Первый пункт имеет особо важное значение в связи с интеграцией go-critic в golangci-lint.

Если оставаться на уровне go-critic, то для пользователей практически ничего не изменилось. lintpack создаёт почти идентичный прежнему линтер, а golangci-lint инкапсулирует все различающиеся детали реализации.

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

Для начала, нужно установить сам lintpack:

# lintpack будет установлен в `$(go env GOPATH)/bin`.
go get -v github.com/go-lintpack/lintpack/...

Создадим линтер, используя тестовый пакет из lintpack:

lintpack build -o mylinter github.com/go-lintpack/lintpack/checkers

В набор входит panicNil, который находит в коде panic(nil) и просить выполнить замену на что-то различимое, поскольку в противном случае recover() не сможет подсказать, был ли вызван panic с nil аргументом, или паники не было вовсе.

Запускать линтер можно на отдельных файлах, аргументами типа ./... или пакетах (по их import пути).

./mylinter check bytes
$GOROOT/src/bytes/buffer_test.go:276:3: panicNil: panic(nil) calls are discouraged
# Далее делается предположение, что go-lintpack есть под вашим $GOPATH.
mylinter=$(pwd)/mylinter

cd $(go env GOPATH)/src/github.com/go-lintpack/lintpack/checkers/testdata

$mylinter check ./panicNil/
./panicNil/positive_tests.go:5:3: panicNil: panic(nil) calls are discouraged
./panicNil/positive_tests.go:9:3: panicNil: panic(interface{}(nil)) calls are discouraged

По умолчанию данная проверка также реагирует на panic(interface{}(nil)). Чтобы переопределить это поведение, нужно установить значение skipNilEfaceLit в true. Сделать это можно через командную строку:

$mylinter check -@panicNil.skipNilEfaceLit=true ./panicNil/
./panicNil/positive_tests.go:5:3: panicNil: panic(nil) calls are discouraged

usage для cmd/lintpack и генерируемого линтера

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

lintpack
not enough arguments, expected sub-command name

Supported sub-commands:
    build - build linter from made of lintpack-compatible packages
        $ lintpack build -help
        $ lintpack build -o gocritic github.com/go-critic/checkers
        $ lintpack build -linter.version=v1.0.0 .
    version - print lintpack version
        $ lintpack version

Предположим, мы назвали созданный линтер именем gocritic:

./gocritic
not enough arguments, expected sub-command name

Supported sub-commands:
    check - run linter over specified targets
        $ linter check -help
        $ linter check -disableTags=none strings bytes
        $ linter check -enableTags=diagnostic ./...
    version - print linter version
        $ linter version
    doc - get installed checkers documentation
        $ linter doc -help
        $ linter doc
        $ linter doc checkerName

Для некоторых подкоманд доступен флаг -help, который предоставляет дополнительную информацию (я вырезал некоторые слишком широкие строки):

./gocritic check -help
# Информация о всех доступных флагах.


Ответ на вопрос "как узнать о том самом параметре skipNilEfaceLit?" — read the fancy manual (RTFM)!

Вся документация об установленных проверках находится внутри mylinter. Доступна эта документация через подкоманду doc:

# Выводит список всех установленных проверок:
$mylinter doc
panicNil [diagnostic]

# Выводит детальную документацию по запрашиваемой проверке:
$mylinter doc panicNil
panicNil checker documentation
URL: github.com/go-lintpack/lintpack
Tags: [diagnostic]

Detects panic(nil) calls.

Such panic calls are hard to handle during recover.

Non-compliant code:
panic(nil)

Compliant code:
panic("something meaningful")

Checker parameters:
  -@panicNil.skipNilEfaceLit bool
        whether to ignore interface{}(nil) arguments (default false)

Подобно поддержке шаблонов в go list -f, вы можете передать строку шаблона, которая отвечает за формат вывода документации, что может быть полезным при составлении markdown документов.

Для упрощения поиска полезных наборов проверок есть централизованный список lintpack-совместимых пакетов: https://go-lintpack.github.io/.

Вот некоторые из списка:

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

Команда ниже создаёт линтер, который содержит все проверки из списка выше:

# Сначала нужно убедиться, что исходные коды всех проверок
# доступны для Go компилятора.
go get -v github.com/go-critic/go-critic/checkers
go get -v github.com/go-critic/checkers-contrib
go get -v github.com/Quasilyte/go-police

# build принимает список пакетов.
lintpack build \
  github.com/go-critic/go-critic/checkers \
  github.com/go-critic/checkers-contrib \
  github.com/Quasilyte/go-police

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

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

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

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


  1. Создаём linterPlugin.go:
package main

// Если требуется включить в плагин более одного набора проверок,
// просто добавьте требуемые import'ы.
import (
    _ "github.com/go-lintpack/lintpack/checkers"
)

  1. Собираем динамическую библиотеку:
go build -buildmode=plugin -o linterPlugin.so linterPlugin.go

  1. Запускаем линтер с параметром -pluginPath:
./linter check -pluginPath=linterPlugin.so bytes

Предупреждение: Поддержка динамических модулей реализована через пакет plugin, который не работает на Windows.

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


Пример с -verbose

Обратите внимание, что panicNil отображается в списке включенных проверок. Если мы уберём аргумент -pluginPath, это перестанет быть истиной.

./linter check -verbose -pluginPath=./linterPlugin.so bytes
    debug: appendCombine: disabled by tags (-disableTags)
    debug: boolExprSimplify: disabled by tags (-disableTags)
    debug: builtinShadow: disabled by tags (-disableTags)
    debug: commentedOutCode: disabled by tags (-disableTags)
    debug: deprecatedComment: disabled by tags (-disableTags)
    debug: docStub: disabled by tags (-disableTags)
    debug: emptyFallthrough: disabled by tags (-disableTags)
    debug: hugeParam: disabled by tags (-disableTags)
    debug: importShadow: disabled by tags (-disableTags)
    debug: indexAlloc: disabled by tags (-disableTags)
    debug: methodExprCall: disabled by tags (-disableTags)
    debug: nilValReturn: disabled by tags (-disableTags)
    debug: paramTypeCombine: disabled by tags (-disableTags)
    debug: rangeExprCopy: disabled by tags (-disableTags)
    debug: rangeValCopy: disabled by tags (-disableTags)
    debug: sloppyReassign: disabled by tags (-disableTags)
    debug: typeUnparen: disabled by tags (-disableTags)
    debug: unlabelStmt: disabled by tags (-disableTags)
    debug: wrapperFunc: disabled by tags (-disableTags)
    debug: appendAssign is enabled
    debug: assignOp is enabled
    debug: captLocal is enabled
    debug: caseOrder is enabled
    debug: defaultCaseOrder is enabled
    debug: dupArg is enabled
    debug: dupBranchBody is enabled
    debug: dupCase is enabled
    debug: dupSubExpr is enabled
    debug: elseif is enabled
    debug: flagDeref is enabled
    debug: ifElseChain is enabled
    debug: panicNil is enabled
    debug: regexpMust is enabled
    debug: singleCaseSwitch is enabled
    debug: sloppyLen is enabled
    debug: switchTrue is enabled
    debug: typeSwitchVar is enabled
    debug: underef is enabled
    debug: unlambda is enabled
    debug: unslice is enabled
# ... результат работы линтера.


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

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

lintpack упрощает создание новых линтеров, предоставляет фреймворк, делающий разные пакеты, реализованные на его основе, совместимыми в пределах одного исполняемого файла. Эти проверки (для golangci-lint) или исполняемый файл (для gometalinter) далее могут быть встроены в вышеупомянутые мета-линтеры.

Допустим, какая-то из lintpack-совместимых проверок является частью golangci-lint. Если существует какая-то проблема, связанная с удобством её использования — это может быть зоной ответственности golangci-lint, но если речь идёт об ошибке в реализации самой проверки, то это проблема авторов проверки, lintpack экосистемы.

Иными словами, эти проекты решают разные проблемы.

Процесс портирования go-critic на lintpack уже почти завершён. work-in-progress можно найти в репозитории go-critic/checkers. После завершения перехода, проверки будут перемещены в go-critic/go-critic/checkers.

# Установка go-critic до:
go get -v github.com/go-critic/go-critic/...

# Установка go-critic после:
lintpack -o gocritic github.com/go-critic/go-critic/checkers

Большого смысла использовать go-critic вне golangci-lint нет, а вот lintpack может позволить установить те проверки, которые не входят в набор go-critic. Например, это могут быть диагностики, написанные вами.

Как создавать свои lintpack-совместимые проверки вы узнаете в следующей статье.

Там же мы разберём какие преимущества вы получаете при реализации своего линтера на основе lintpack по сравнению с реализацией с чистого листа.

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

Let's block ads! (Why?)

Цена акций Nvidia упала на фоне обвала рынка криптовалют и снижения интереса к майнингу

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

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

«Криптовалютное похмелье»


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

«Похмелье после бурного роста криптовалют продлилось дольше, чем мы предполагали», – так ситуацию описал глава компании Жэнь-Сунь Хуан (Jensen Huang).

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

Не только Nvidia


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

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

Другие материалы по теме финансов и фондового рынка от ITI Capital:


Let's block ads! (Why?)

[Перевод] Собираем собственный аудио усилитель профессионального уровня не (очень) дорого

Получаем потрясающий стереозвук на основе платы 3e Audio Д-класса


Перевод статьи с сайта IEEE Spectrum, автор – Гленн Зорпет

Несколько лет назад я решил узнать, насколько дёшево можно сделать самому усилитель Д-класса аудиофильского качества. Тогда у меня получилось $523,43. Я смастерил достойный усилок, и статья на IEEE Spectrum всё ещё привлекает читателей и периодические вопросы о том, где можно достать запчасти.

Сожалею, но основные компоненты уже давно исчезли. Поэтому я направлял всех страждущих к наборам от Class D Audio, DIY Class D и Ghent Audio. И пару месяцев назад мне вдруг захотелось проверить, насколько лучше у меня получится сделать усилок сейчас, почти десять лет спустя. Часть мотивации возникла из-за ежегодных списков лучших стерео усилителей с сайта The Master Switch. В списке доминируют усилители стоимостью от $1000 (и десять из них стоят более $2000).
Модные аудио прибамбасы – моя слабость. Но давайте уже отложим в сторону чековую книжку и достанем паяльник. Если вы обладаете базовыми навыками пайки и работы с инструментами – сможете просверлить отверстия в алюминиевом листе? – вы может сделать высококачественное оборудование гораздо дешевле.

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

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

Разработка и создание усилителя Д-класса – предприятие, достойное похвалы. Если вы решите пойти таким путём, я отдаю вам честь и предлагаю начать с прекрасной статьи Цезаря Чирилы на сайте All About Circuits. Но если всё, что вы хотите – это максимальное соотношение качества к цене, лучшей стратегией будет тщательно выбрать модуль усилителя и другие компоненты из огромного количества готовых вариантов. Именно это я и сделал. Не стоит благодарности.

Усилитель состоит из двух базовых компонент: источник питания и схема. После пары недель исследований и оценок я остановился на схеме EAUMT-0050-2-A усилителя Д-класса от 3e Audio, компании из Шэньчжэня. Она основана на прекрасном чипе усилителя от Texas Instruments, TPA3250, хорошо показавшем себя в сравнении с усилителями Д-класса, собранными из отдельных компонентов.

TPA3250 может работать с динамиками на 8 Ом или 4 Ом, а его эффективность составляет 92%, согласно данным от TI. Он может принимать симметричные входные сигналы (часто используемые в музыкальных студиях и других профессиональных вариантах применения) или односторонние (обычно используемые в потребительских аппаратах).


Музыкальная композиция: усилитель (вверху) использует коннекторы XLR (слева на фото) для ввода сигнала, типичные для профессиональной аппаратуры. Внутри его главные части – это трансформатор от AnTek Products Corp. (второй сверху), плата выпрямителя от Xkitz Electronics (третья сверху) и модуль усилителя от 3e Audio (внизу) на основе Texas Instruments TPA3250.

Результаты тестов с сайта 3e утверждают, что их плата на основе TPA3250 имеет коэффициент нелинейных искажений + шум (THD+N) в 0,0025% на мощности в 20 Вт и нагрузке в 4 Ом для сигнала в 1 кГц. Это безумно мало. Для сравнения, усилитель Д-класса nova300 от Peachtree Audio стоимостью в $2199, объявленный сайтом The Master Switch «самым лучшим усилителем этого года» имеет показатель THD+N равный 0,005% при прочих равных.

Нужно отнестись к этому критически и понять, что услышать разницу между THD+N в 0,0025% и 0,005% невозможно. Суть в том, что звуковая система, состоящая из усилителя на основе платы 3e стоимостью в $49, вместе с хорошим ЦАП и предусилителем может выдавать звук, сравнимый с high-end усилителем.

В качестве источника питания рекомендую нерегулируемый предназначенный для аудио источник от Xkitz Electronics, модели XAPS-500W ($30). На него следует подать ток 22 В от 200 ВА трансформатора от AnTek Products Corp., модели AS-2222 ($32). Если вы предпочитаете импульсный стабилизатор напряжения вместо линейного, прекрасным выбором станет SMPS300RS от Connex Electronic ($65, вместе с трансформатором). Если хотите сэкономить, на AliExpress есть плата выпрямителя HPOO всего за $15. На другом конце шкалы есть модуль Eltim PS-UN63RQ за €119. Доставка его в США обойдётся в дополнительные €81, поэтому для жителей Америки это не вариант (по ссылке представлен полный список запчастей).

Закончив с усилителем, я подключил его к 30-летним трёхканальным колонкам от Panasonic, которые я часто использую для проверок. Раздавшийся из них звук оказался таким классным, что я был поражён. За всё время я слушал через эти колонки штук 15 различных усилителей, включая ламповые стоимостью вплоть до $1200. Ни у одного из них не было такой чёткости звука и такого точного, детального, и вместе с тем плавного воспроизведения, как у модуля от 3e вместе с источником питания от Xkitz. По моему опыту, найти идеальный баланс точности, плотности басов и общей теплоты звука может очень малое количество усилителей. И данному усилителю это удалось.

Общая стоимость составила $259,01. Чуть больше половины стоимости предыдущего усилителя, выдававшего при этом звук похуже, построенного мною десять лет назад. В эту сумму входит $37,50 за профессиональную покраску корпуса порошковой краской. И я не рекомендую пропускать этот шаг, если только вы не профессионал в покраске алюминия. Усилитель класса high-end должен и выглядеть соответственно. Но, возможно, об этом можно будет как-нибудь поспорить.

Let's block ads! (Why?)

Китайское искусственное солнце…

… засияло на днях в городе Хэфей.

«Может лучше про реактор» (с)

Ученые при помощи экспериментального сверхпроводящего ТОКАМАКа создали поистине космические температуры, необходимые для ядерного синтеза на Земле. Преодолена очередная серьезная ступень на пути к управляемому ядерному синтезу.

image

Экспериментальный сверхпроводящий ТОКАМАК Experimental Advanced Superconducting Tokamak (EAST), получивший прозвище «китайское искусственное солнце», в течение четырехмесячного эксперимента в этом году достиг температуры плазмы более 100 миллионов градусов — в несколько раз больше температуры ядра Солнца.

Эксперимент проводился командой EAST, учеными из Института физики плазмы при Академии наук Китая (CASHIPS) в сотрудничестве с китайскими и международными коллегами.
Успешный эксперимент EAST является важным шагом на пути создания Международного термоядерного экспериментального реактора (ITER). В разработке которого участвуют 35 стран, включая Россию, Китай и США.

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

Данные исследования внесли уникальный вклад в ITER, Китайский испытательный реактор (CFETR) и DEMO

В плане инженерного развития CFETR и DEMO в конце этого года будет запущен новый Национальный проект — Комплексный исследовательский центр.
EAST — это первый полностью сверхпроводящий токамак с некруглым поперечным сечением в мире. Он был спроектирован и построен Китаем с упором на ключевые научные проблемы, связанные с применением ядерного синтеза. С момента своего начала работы в 2006 году EAST стал полностью открытым испытательным центром, в котором мировое сообщество может проводить стационарные операции и связанные с ИТЭР физические исследования.

Одним из препятствий является поддержание синтеза более чем на несколько минут. Самая длинная зарегистрированная реакция была у ТОКАМАКа Tore Supra во Франции (также известной как WEST) в течение 6 минут и 30 секунд в 2003 году.

Текущий эксперимент показал результат в 100 секунд.

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

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

Реактор слияния вполне безопасен по сравнению с реактором деления, — говорит Song Yuntao профессор, заместитель директора EAST.

Я могу просто отключить электропитание и это абсолютно безопасно. Никакой ядерной катастрофы не будет».

Тяжелая плата…
Однако, подобные технологии чрезвычайно затратны.
15 000 долларов в день необходимы, чтобы только запустить систему, и это без учета заработной платы сотен специалистов, строительства зданий и тому подобного.

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

Стоимость проекта ничто по сравнению с прорывным результатом во всей истории человечества.

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

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

Ну, что ж. Пожелаем всем, кто приложил руку к сему творению, удачи!

По материалам зарубежных новостных агентств.

Let's block ads! (Why?)

[Перевод] Как создавали векторный аркадный автомат Atari Asteroids

image

Лучший бестселлер среди аркадных автоматов Atari всех времён под названием Asteroids в буквальном смысле изменил правила игры. Выпущенный в декабре 1979 года автомат стал причиной взрывного роста популярности Atari у публики. Эта игра одной левой уничтожила монополию Space Invaders в мире видеоигр.

Игра была создана разработчиком Atari Эдом Логгом (в список проектов которого входят Super Breakout, Video Pinball, Asteroids, Centipede, Millipede, Xybots, Gauntlet, Space Lords и Steel Talons), но историю её происхождения всё равно будет интересно изучить.

Думаю, что могу назвать себя отцом Asteroids. Эд Логг был матерью Asteroids, потому что он вынашивал игру в течение девяти месяцев и создал готовый продукт. Всё, что нужно было сделать мне — бросить семя.

Это слова Лайла Рейнса (босса Эда в то время). Рейнс размышлял о предыдущей игре, которая разрабатывалась внутри Atari. В ней два игрока пытались подстрелить друг друга (в стиле Computer Space), а между ними находился огромная скала. Игра была скучной, и все игроки хотели расстреливать скалу, но, конечно же, не могли. В результате игру «положили на полку».

В разговоре с Эдом Рейнс пытался описать свою идею: игру, в которой присутствует «выполнение» задания (как в Space Invaders и в предыдущей игре Логга Super Breakout), но на этот раз с камнями. Игрок должен расстреливать камни, они становятся всё меньше и наконец исчезают.

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


Верхняя часть автомата Asteroids

Вдохновлённый разговором Эд приступил к работе. Он продвигал идею разработки игры на векторном оборудовании. Пойдя против воли Рейнса, желавшего растровую игру, Эд представлял себе большую точность и разрешение на том же (в то время новом и новаторском) оборудовании, что использовалось и для разработки Lunar Lander. Он быстро вышел на след электронщика Atari Ховарда Делмана, который внимательно выслушал идею Эда. Вспомнив об ещё одной игре, пропавшую в безвестности, он достал векторную плату и подключил её. Игра называлась Cosmos, а позже Planet Grab. В ней двое игроков летали по экрану, пытаясь украсть друг у друга планеты. Но никому она не показалась интересной, поэтому её разработку прекратили. Как только Эд увидел этот прототип в работе, он понял, что это будет идеальной отправной точкой для игры Asteroids.

За пару дней Делман разработал базовый аппаратный комплект разработки, с которым мог работать Логг. На самом деле это была модифицированная плата Lunar Lander:


Оригинальная векторная печатная плата Lunar Lander, которую использовали для создания Asteroids. Обратите внимание на небольшую дочернюю плату слева, содержащую дополнительную память, которая необходима для запуска нового кода Asteroids. Синие провода-перемычки были добавлены для модификации оборудования, а плата-спутник, подключённая ниже, была собрана вручную для воспроизведения звуков игры. После завершения создания игры была разработана единая плата, включающая в себя всё оборудование. Фото Ховарда Делмана.

Ожидая, пока будет создан прототип оборудования, Логг для начала изложил базовые концепции игры на бумаге. Ниже показан первый документ по планированию Asteroids, написанный самим Логгом.

Удивительно, что готовая игра почти полностью совпадает с описанием в этом документе:



Источник: Museum of Play, Рочестер (штат Нью-Йорк)

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

Ещё один интересный документ процесса разработки можно посмотреть здесь.

Логг вспоминает, насколько напряжённым был процесс разработки:

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


Шрифт Asteroids. Дизайн придуман и вручную отрисован Эдом Логгом в этом документе 1979 года. (Из архива Эда Логга)

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


Фотография Эда Логга, примерно 1982 год

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


Оригинальный дизайн корабля из Asteroids, нарисованный вручную Эдом Логгом. Выше зачёркнут первоначальный вариант. (Из коллекции Эда Логга)

Сами камни заставляли игроков создавать в игре стратегии. Вся вселенная Asteroids располагается на единственном экране, но использованная механика сворачивания позволяла всем объектам, сдвинувшимся за край экрана, появляться на противоположной стороне и продолжать свой путь. Единственный способ справиться с астероидами — расстрелять их. Они не могли просто улететь с экрана. Так Логг обнаружил, что первые игроки (обычно коллеги-разработчики и инженеры с завода Atari) выработали различные способы борьбы с окружающим миром. Некоторые стреляли во всё, что могли, другие относились к летающим скалам более продуманно, или совершенно избегая их, или отстреливая их по одному за раз.


Первоначальные эскизы камней Эда Логга для Asteroids. (Из коллекции Эда Логга)

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

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

На сцене появляются летающие тарелки:

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

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


Забавно, что после того, как в журнальной статье были упомянуты названия двух летающих тарелок, под которыми они были известны внутри отдела Atari Coin-Op («Mr Bill» и «Sluggo»), в компанию Atari прислал письмо юрист, представляющий интересы телевизионного шоу «The Mr Bill Show»

Спустя годы Логг сказал, что он изменил бы в готовой игре два аспекта: кнопку «Гиперпространство» (Hyperspace) и поведение маленькой тарелки:

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

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


Работа над дизайном анимации взрыва корабля, забракованная идея корабля игрока и дизайн летающей тарелки. (Из коллекции Эда Логга)

Полевые испытания проводились на двух группах игроков, молодых и старых. Отзывы были очень положительными. Здесь можно прочитать отчёт о тестировании. (Из коллекции Эда Логга). Логг был вдохновлён:

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

Ещё одно подтверждение того, что игра станет успешной.

Оригинальная рекламная листовка для продажи Atari Asteroids

Производство началось в конце 1979 года. В интервью 1981 года маркетинговый аналитик Atari Мэри Такацуно поделилась интересной информацией о том, как была воспринята игра внутри компании.

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

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

Дети столпились вокруг вертикального автомата Asteroids, примерно 1980 год

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


Выпуск Coin Connection компании Atari за февраль 1980 года: это ежемесячная рассылка для владельцев и игровых залов и дистрибьюторов, рассказывающая об успехе Asteroids

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

Покойный директор по продажам Atari Дон Осборн заявил в 1980 году, что Asteroids на пике своей популярности зарабатывал за неделю 10 миллионов долларов на четвертаках — потрясающая статистика, если подумать.

Всего было выпущено три типа автоматов — вертикальный, «кабаре» и «столик для коктейлей».

Успех игры привёл к появлению неизбежного сиквела — Asteroids Deluxe. Сохранив механику оригинала, Deluxe ускорил игровой процесс и добавил новые функции — это оказался ещё один серьёзный хит Atari.


Продолжение Asteroids, Asteroids Deluxe, производилось на заводе Atari в Типперери, Ирландия (Фото Майка Дженга)

Наследие Логга в Atari продолжилось созданием Centipede и Gauntlet, которые тоже были популярными играми, но именно Asteroids «взлетел» по-настоящему. Необъяснимая способность Логга создавать точный баланс между риском и вознаграждением определила основную мантру Atari «Легко научиться, сложно стать мастером». Благодаря своему дару он получил в кулуарах Atari прозвище «золотой мальчик».


«Золотой мальчик» Эд Логг с золотым Asteroids, изготовленным в честь создания 50 тысяч автоматов. Считается, что сейчас эта машина стоит в офисе Midway/Warner Bros в Chicago.

Секретом успеха стала невероятное умение Логга идеально настраивать отдельные элементы игрового процесса. Его бывший коллега из Atari Games Марк Церни сказал в 2012 году следующее:

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


Грегг Сигэл

Сегодня Asteroids остаётся сердцем коллекции любого поклонника аркадных автоматов. У меня есть версия игры в формате «кабаре» (с комплектом, позволяющим играть в Asteroids, Asteroids Deluxe и Lunar Lander). Если вы хотите прочитать о выполненном мной процессе восстановления, то статья выложена здесь.

Let's block ads! (Why?)

[Перевод] Курс MIT «Безопасность компьютерных систем». Лекция 17: «Аутентификация пользователя», часть 3

Массачусетский Технологический институт. Курс лекций #6.858. «Безопасность компьютерных систем». Николай Зельдович, Джеймс Микенс. 2014 год


Computer Systems Security — это курс о разработке и внедрении защищенных компьютерных систем. Лекции охватывают модели угроз, атаки, которые ставят под угрозу безопасность, и методы обеспечения безопасности на основе последних научных работ. Темы включают в себя безопасность операционной системы (ОС), возможности, управление потоками информации, языковую безопасность, сетевые протоколы, аппаратную защиту и безопасность в веб-приложениях.

Лекция 1: «Вступление: модели угроз» Часть 1 / Часть 2 / Часть 3
Лекция 2: «Контроль хакерских атак» Часть 1 / Часть 2 / Часть 3
Лекция 3: «Переполнение буфера: эксплойты и защита» Часть 1 / Часть 2 / Часть 3
Лекция 4: «Разделение привилегий» Часть 1 / Часть 2 / Часть 3
Лекция 5: «Откуда берутся ошибки систем безопасности» Часть 1 / Часть 2
Лекция 6: «Возможности» Часть 1 / Часть 2 / Часть 3
Лекция 7: «Песочница Native Client» Часть 1 / Часть 2 / Часть 3
Лекция 8: «Модель сетевой безопасности» Часть 1 / Часть 2 / Часть 3
Лекция 9: «Безопасность Web-приложений» Часть 1 / Часть 2 / Часть 3
Лекция 10: «Символьное выполнение» Часть 1 / Часть 2 / Часть 3
Лекция 11: «Язык программирования Ur/Web» Часть 1 / Часть 2 / Часть 3
Лекция 12: «Сетевая безопасность» Часть 1 / Часть 2 / Часть 3
Лекция 13: «Сетевые протоколы» Часть 1 / Часть 2 / Часть 3
Лекция 14: «SSL и HTTPS» Часть 1 / Часть 2 / Часть 3
Лекция 15: «Медицинское программное обеспечение» Часть 1 / Часть 2 / Часть 3
Лекция 16: «Атаки через побочный канал» Часть 1 / Часть 2 / Часть 3
Лекция 17: «Аутентификация пользователя» Часть 1 / Часть 2 / Часть 3

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

Студент: чем обусловлены именно такие предельные значения энтропии, например, отпечатка пальца и сетчатки?

Профессор: я думаю, что эти значения обусловлены используемым оборудованием, «железом». Если у вас имеется сканер с большим разрешением сканирования, то эти показатели энтропии будут выше. Я думаю, что имеется некий минимальный гарантируемый предел распознавания индивидуальности, такой, как ДНК и подобное, и очевидно, что это не фундаментальные пределы энтропии.

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

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

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

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

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

Требование доступности выполняется условно, поэтому авторы указывают «условно да».

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

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

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

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

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

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

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

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

В отношении стойкости к фишингу авторы также говорят «нет». По отношению отсутствия доверия к третьей стороне указывается «да». Интерес представляет требование к сопротивлению утечке через другие сервисы – здесь они говорят «нет». Здесь практически та же причина, по которой этому требованию не соответствуют пароли, потому что ваши биометрические данные представляют собой статические токены. Поэтому если я использую свой отпечаток сетчатки для аутентификации на Amazon.com, и с него происходит утечка данных, то ваши данные можно будет использовать для персонификации на Facebook.

Итак, что означают два столбца с этими «да», «условно да» и «нет»? Один, всего лишь один из многих способов толкования этого, состоит в том, что мы можем просуммировать полученные результаты.

Давайте считать, что каждое «да» соответствует 1 баллу, каждое «нет» соответствует 0 баллов, а каждое условное «да» равно 0,5 балла. Вы должны понимать, что если подобная схема оценки если и не полностью случайна, то она всё-таки достаточно случайна.

Однако это довольно интересное упражнение для понимания того, о чём говориться в лекционной статье. Итак, подсчитаем результат для всех параметров таблицы. Мы увидим, что пароли набирают суммарную оценку 8 баллов, а биометрия – 6,5 балла. И что же означают эти 2 числа?

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

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

Итак, рассмотрев эту таблицу, можно сказать, что очень трудно утверждать, что какая-то схема аутентификации имеет подавляющие преимущества относительно другой. Поэтому стоит задуматься, как можно объединить несколько разных схем аутентификации. Авторы попробовали воплотить эту идею в схеме, которую назвали «многофакторной аутентификацией», Multi-factor authentication, или MFA. Её идея состоит в том, чтобы использовать углублённую защиту, то есть заставить пользователя применять два или более различных механизма аутентификации. Каждый из этих механизмов должен использовать разные процедуры, или условия. Подразумевается, что эти механизмы должны иметь разные способы проверки подлинности.

Например, один из этих механизмов одновременно должен использовать:

  • что-то, что вы знаете, например, пароль;
  • что-то, чем вы располагаете, например, сотовый телефон или смарт-карта;
  • что-то, чем вы являетесь, например, биометрический показатель.

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

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

AWS, безопасный облачный сервис «Амазон», также использует двухфакторную аутентификацию для своих служб, и вы проходите такую аутентификацию, чтобы, например, управлять своей виртуальной машиной и тому подобное. У них имеется также функция установки на телефон мобильного приложения, позволяющего ввод вашего пароля. Также они используют вещь, называемую custom security dongle, или электронный ключ безопасности пользователя, позволяющий вам произвести двухфакторную аутентификацию.

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

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

Профессор: вы правы, в этом смысле использование кредитных карт очень интересно, потому что кроме этих 4 цифр защита использует множество других схем предотвращения мошенничества, но с точки зрения машинного подсчёта комбинаций цифр это довольно интересно. Вы могли заметить, что если используете свою карту за рубежом, то после того, как вы вставили её в банкомат, вам могут позвонить из банка и спросить: «Это вы использовали сейчас свою карту?», и вы отвечаете: «да-да, это я её использовал» Так что с банкоматами обеспечить безопасность намного легче, чем когда вы используете свою карту на веб-сайтах или для покупок в интернет-магазинах.

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

Итак, каковы могут быть ответы на вопросы домашнего задания? Например, на вопрос, какие потенциальные факторы влияют на выбор схемы аутентификации в целой куче различных сценариев. Я имею ввиду, что на высоком уровне отсутствуют чёткие понятия, что данный способ аутентификации является верным или неверным. Нужно опираться на результат нашего сегодняшнего обсуждения и подходить к этому так: «в этом сценарии я больше подумаю о таком способе аутентификации, а в этом сценарии – о другом способе».

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

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

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

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

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

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

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

Таким образом, лекционная статья утверждает, что преимущества той или иной схемы аутентификации зависят от конкретных условий, в которых она может использоваться.
Интересной вещью, которая упоминается только в расширенной версии статьи, является CAP – ридер (CAP — Chip Authentication Program, или программа аутентификации чипа). Потому что сокращенная версия статьи заканчивается выводом, что не существует абсолютно никакой схемы аутентификации, которая бы четко проявила свои преимущества по сравнению с паролями.

Что же такое CAP – ридер? Коротко говоря, эта вещь защищает транзакции, проводимые с помощью кредитной карты. Она выглядит как маленький карманный калькулятор.

Вы вставляете в него свою карту и вводите свой PIN-код. Говоря абстрактно, он разработан специально для вашей MasterCard, и она ему доверяет, потому что никто не может обновить прошивку этого CAP – ридера и никто не может установить на него какую-то вредоносную программу типа клавиатурного перехватчика. Итак, вы вставляете свою карту в этот доверенный терминал, вводите PIN, и он выводит на экран 8-мизначный код. Этот код вы можете использовать, например, для веб-сервиса, для того, чтобы подтвердить, что именно вы являетесь владельцем конкретной кредитной карты. Это физический аспект использования механизма безопасности.

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

По отношению к выполнению требования масштабируемости для пользователя они пишут «нет», потому что вы должны иметь разные PIN-коды для разных карт, и, возможно, даже для разных CAP – ридеров.

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

В параметрах развёртываемости авторы отмечают «нет» по отношению к совместимости с сервером, потому что сервер не используют никаких специальных протоколов для совместной работы с этими ридерами. Это устройство характеризуется совместимостью с браузерами, здесь авторы указывают «да», потому что CAP-ридеры можно использовать, применив HTML или JavaScripts на конечной стадии аутентификации.

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

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

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

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

Таким образом, CAP-ридер в этой таблице с легкостью проходит требования безопасности. Так почему же люди до сих пор широко не используют эти CAP-ридеры на практике? Почему так происходит? Если посмотреть на бальную оценку, то эти ридеры получают оценку 10,5 баллов!

Дело в том, что в реальной жизни они не являются оптимальным балансом между требованиями безопасности и удобством применения. Люди не хотят носить CAP-ридеры с собой, они не хотят вникать во все эти протоколы, брать эти 8-мизначные величины и вводить их куда-то на веб-сайте. На практике оказывается, что удобство использования и развёртываемость часто оказываются важнее безопасности. Потому что разработчики заинтересованы в механизмах, которые бы не увеличивали стоимость пользования их сервисами, а клиенты не хотят испытывать никаких затруднений при использовании подобных вещей. Стоит заметить, что даже если пользователи свободны в выборе параметров схемы безопасности, они всё равно чаще выбирают короткие пароли, слабы вопросы и так далее.

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

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


Полная версия курса доступна здесь.

Спасибо, что остаётесь с нами. Вам нравятся наши статьи? Хотите видеть больше интересных материалов? Поддержите нас оформив заказ или порекомендовав знакомым, 30% скидка для пользователей Хабра на уникальный аналог entry-level серверов, который был придуман нами для Вас: Вся правда о VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps от $20 или как правильно делить сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40GB DDR4).

VPS (KVM) E5-2650 v4 (6 Cores) 10GB DDR4 240GB SSD 1Gbps до декабря бесплатно при оплате на срок от полугода, заказать можно тут.

Dell R730xd в 2 раза дешевле? Только у нас 2 х Intel Dodeca-Core Xeon E5-2650v4 128GB DDR4 6x480GB SSD 1Gbps 100 ТВ от $249 в Нидерландах и США! Читайте о том Как построить инфраструктуру корп. класса c применением серверов Dell R730xd Е5-2650 v4 стоимостью 9000 евро за копейки?

Let's block ads! (Why?)