Дворак или как жизнь в боль превратить

Добрый утро, дорогие хабражители.

Два года назад меня захватило желание что-то поменять, решил перейти на Дворак для программистов.
Переделал клавиатуру, наклеил модный наклейки с Ebay. И…
Боль

Первые пару месяцев были адом. Зато потом по True-историям должно было произойти чудо.
Писал код, тренировался на клавиатурном тренажере, матерился. Когда дело доходило до сочетаний клавиш(СК) — еще сильнее матерился!
Банально, чтобы скопировать + вставить, нужно две руки, т.к. пальцы не дотягиваются. Мало того, не во всех программах СК работали правильно: где-то оставались старые от QWERTY, а где-то нет. Например: Adobe illustrator и Adobe Photoshop.Дворак для программистов

Прошло пол года, скорость написания латиницы выросла, но когда дело доходило до написания латиницы + кирилицы + сочетания клавиш, то начинался мат.
Да и клавиши на Numpad не совпадали, т.е в. Двораке одно расположение, а в русской раскладке другое.
image
Про СК клавиш в Vim вообще молчу, пришлось от него отказаться…

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

Эти мелкие косяки добивали, причем сильно!
Переставил бинды клавиш на numpad, СК в IDE и редакторе — потратил уйму времени, но легче не стало. Львиная доля программ всё равно путала и мешала работать. Потревоженные после перестановки клавиши начали немного шататься — возможно, потому что ноутбук из бюджетной серии.

Время шло, лучше не становилось.
Постепенно, отвык от почти всех сочетаний клавиш и начал чаще пользоваться мышкой (!).

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

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

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

ссылка на оригинал статьи http://habrahabr.ru/post/224753/

Идеи и возможности разработки электроники в России

Иногда мне приходят в голову интересные идеи о том, разработкой какого устройства можно было бы заняться, если бы нашёлся заказчик и потребитель. Иногда — это примерно раз в час. Эти идеи не дают мне спать, не дают работать. Я прикладываю нечеловеческие усилия, чтобы остаться в рамках задач, по которым заключены контракты. Я использовал разные способы, чтобы отвлечься от этих идей: рассказывал их самому большому критику из тех, что я знаю; заставлял себя детально просчитывать стоимость реализации каждой новой идеи, клал под подушку старые MCS51-ые…, но ничего не помогает.

И вот я хочу опробовать очередной способ: рассказать о своих идеях и мыслях на Хабре.

Привет Хабр!

Теперь мы можем намного больше!

Хорошая новость! Теперь мы можем в России производить печатные платы 5-го класса точности. Почему это так важно? Потому что, если вы хотите сделать что-то новое, интересное и современное, то без 5-го класса точности вам никак не обойтись. Почти любая BGA-микросхема требует платы 5-го класса точности. Сотовые телефоны, планшеты, SSD-диски, электронные читалки — все эти устройства содержат, например, микросхемы массового хранения данных (Mass Storage). Сейчас на рынке имеются два типа микросхем этого назначения — NAND и eMMC. NAND очень сложен в применении и даже опасен в случае плохо написанного обслуживающего софта, зато eMMC — это просто SD-карта в BGA корпусе. Т.ч. NAND’ы сейчас можно увидеть разве что в дешевых китайских планшетах и видеорегистраторах.

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

Оперативная память — оно нам надо?

Действительно, а зачем нам оперативная память? Почему бы не хранить все данные (в том числе и запущенные процессы) в энергонезависимой памяти? Как было бы удобно: пропало питание — процессор остановился, появилось питание — процессор продолжил исполнять задачи дальше с той самой инструкции, на которой остановился. Мгновенный Hibernate/Wakeup! Сколько бы проблем сразу исчезло. Например, журналирование файловых систем во многих задачах стало бы просто не нужным!

Конечно же нас останавливает скорость работы всех доступных методов энергонезависимого хранения данных. Однако есть хорошая новость: уже более десяти лет разрабатывается магниторезистивная память. Скорость и количество циклов перезаписи — как у оперативной, независимость от внешнего питания — как у NVM. Не так давно в продаже появились образцы этой памяти, позволяющие собрать массив в 8–16 МБайт. Это даёт возможность уже сейчас развернуть в этой памяти Линукс и начать работу над его адаптацией к новым условиям, чтобы к тому моменту, когда магниторезистивная память в цене сравняется с обычной оперативной, быть на коне и при оружии. И уже сейчас можно начать применять эту технологию в тех задачах, где не требуется графический интерфейс (например, роутер с вечноживущим Linux’ом на борту смотрится очень даже неплохо).

Ruby в каждый чип

«Уже пол-шестого утра… Ты знаешь, где сейчас твой указатель стека?»
Автор неизвестен (обнаружено на Хабре)

«Писать на C или C++ — это как работать с бензопилой без какой-либо защиты.»
Bob Gray. Писатель.

Как много времени тратят embedded-программисты на разработку кода на старом, неудобном и опасном Си. Но… опять хорошая новость! Matz выпустил mruby, который практически не имеет внешних зависимостей, написан на Си и легко встраивается куда угодно. Один японский фанат представил доклад на Ruby Conf 2012, в котором описал свой опыт встраивания интерпретатора этого замечательного языка программирования в среду с 1 МиБ памяти кода и 128 КиБ памяти данных! Процессоры с такими характеристиками стоят жалкие $3-$4 (при серийном производстве). При этом скорость и безопасность разработки увеличиваются в разы. Можно даже строить некое подобие операционных систем, т.к. Руби не имеет указателей и задача контроля доступа там решается сама собой (на уровне языка программирования!).

Многие считают, что Embedded и интерпретируемые высокоуровневые языки программирования — взаимоисключающие понятия. Но это не так! В качестве примера могу привести случай из собственной жизни. Мы разрабатывали умную «флешку». Помимо функций хранения данных устройство имело специальную логику, реализуемую заказчиком. Стек USB и его профиль — Mass Storage — реализовывали сами. Перед сдачей мы много раз проверяли скорости чтения и записи, и оптимизировали процессы. В итоге добились 14 МиБ/сек на чтение raw-данных и 10-ти — на запись. Для тех, кто не очень ориентируется, скажу, что это почти предел того, что можно реализовать на USB 2.0 Highspeed не применяя ASIC. Когда проект был сдан и заказчик начал разрабатывать свою логику для устройства, выяснилось, что скорость шифрования (это было СЗИ) очень низкая. Мы долго пытались выяснить в чем же дело, пока не обнаружили, что забыли выкрутить частоту процессора на максимум: он работал на частоте 60 МГц, вместо положенных 180-ти и это не сказывалось на скоростях чтения/записи. Почему это происходит? Да потому, что 95% кода стандартной прошивки для грамотно спроектированного исполнительного устройства — это как правило администраторские работы: настройка регистров, выдача команд на старт процедур, обработка ошибок и т.д. Все поточные операции должны выполнять (в идеале) специализированные модули. Процессор не должен заниматься неинтеллектуальной работой — он должен организовывать процесс, а «забивать гвозди» должен неинтеллектуальный модуль, который ничего не умеет кроме своей специальной работы, но выполняет эту работу с максимальной скоростью и, что самое главное, параллельно всем другим процессам в чипе! Так вот производительность этих-то организационных процессов — некритичный параметр. Если даже они вдруг станут выполняться в 10 раз медленнее, на общей скорости работы устройства это вряд ли скажется. Но именно эта организационная деятельность является самым сложнопроектируемым узлом, именно на неё уходит большая часть кода. Так почему же не быть этому коду интерпретируемым ради ускорения разработки и заботы о нервах разработчика?

Мы сейчас как раз проводим исследования в данной области и, если по комментариям поймём, что это интересно не нам одним — опубликуем результаты. Встраиваем mruby мы в NXP LPC18xx.

Швейцарская флешка системного администратора

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

  • Конфигурируемое количество LUN’ов. LUN’ы — это логические разделы устройства на уровне Mass Storage драйвера. Для конечного пользователя LUN’ы выглядят как самостоятельные физические диски. Например, несколько LUN’ов обычно имеют кард-ридеры: по одному LUN’у на слот. Для каждого LUN’а можно предусмотреть задание типа носителя: обычный жесткий диск, CD, removable/non removable и т.д. Для каждого диска можно предусмотреть задание режима доступа: RW/R. Это всё удобно, например, когда какая-то старая программа хочет работать только при вставленном CD с нужным серийным номером. Вы можете разбить нашу швейцарскую флешку на два LUN’а: один — под этот CD, второй — обычный извлекаемый носитель.
  • RAID режимы. На устройстве можно разместить не одну, а несколько микросхем памяти и реализовать RAID0/1 режимы. Причём можно сделать так, что один LUN будет RAID0, второй — RAID1, третий — обычная «флешка», а четвертый — вообще CD…
  • Нестандартные интерфейсы. Иногда системному администратору приходится брать в руки… USB-Floppy. А почему бы не брать ему в руки флешку, которая умеет маскироваться под дискету?
  • Программируемые кнопки и дисплей. Было бы удобно иметь несколько профилей работы и иметь возможность быстро переключаться между ними. Для этого можно предусмотреть несколько кнопок на корпусе и дисплей для отображения текущего профиля. В добавок кнопки можно сделать полностью программируемыми: например, назначить на одну из комбинаций кнопок полное уничтожение данных на устройстве. Ну вы поняли о применении в какой области я говорю..
  • USB 3.0 и >100 МиБ/сек на чтение. Не столько уже особенность, сколько просто требование времени.
  • Работа в качестве открывашки пивных пробок. А что, разве системному администратору не нужна такая функция?

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

Видеорегистратор высокой четкости

Вам нравится качество картинки вашего автомобильного видео регистратора? Мне — нет. Я видел много видеорегистраторов (в том числе и изнутри) и все они обладают одним существенным недостатком: из-за применения алгоритмов сжатия с потерями при определенных условиях (в сумерки или при тряске) на экране невозможно рассмотреть даже номер автомобиля, находящегося в 10–15 метрах. А ведь это одно из важнейших назначений видеорегистратора: записать номер автомобиля или лицо/приметы человека, участвовавшего в ДТ или ином происшествии. Почему так происходит?

Дело в том, что видеорегистраторам приходится писать данные на медленные sd-карты и потому так сильно сжимать видеопоток, что часто уже не важно, на сколько у вас «мегапикселей» камера, какой у неё угол обзора и т.д. Видно только общий ход событий, но совершенно не видно деталей. Зато вы можете хранить на карте 8 часов ваших поездок с дома на работу и с работы домой… А почему бы не отказаться от длительности записи в пользу качества? Почему бы не писать в оперативную память?

Возьмем 8 ГиБ оперативной памяти. Какой продолжительности видео разрешением 720×480 можно записать в оперативную память такого объема? 3 байта на пиксель x 720×480 x 25 кадров в секунду = 26 МиБ/сек. Более 5 минут кристально чистой картинки. Вы часто встречали ДТП, история развития которого начиналась ранее, чем за 3 минуты, а развитие которого занимало бы более чем 1 минуту? А уже после того, как ДТП произошло, можно снимать ещё, например, минуту, а потом перенести все на eMMC или SD-карту.

Что интересно — именно такой видеорегистратор вполне можно быстро разработать в России. Дело в том, что самая сложная часть всех видеорегистраторов — это аппаратные кодеки видео. Кодеки эти проприетарные и требуют покупки лицензии; с каждого проданного устройства вы должны платить отчисления, но даже не в этом самая большая трудность. Самая большая трудность заключается в том, что с разработчиками, не предоставившими гарантии миллионных тиражей своей продукции, просто не будут связываться…

Заключение

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

Так и не придумал, в какие хабы добавить свой пост. Был бы хаб «Разработка железа» — добавил бы туда, «Программирование микроконтроллеров» — несколько не то (хотя аудитория почти та, что надо), «DIY или сделай сам» — совсем не то. Буду благодарен подсказке.

______________________

Текст подготовлен в Хабра Редакторе от © SoftCoder.ru

ссылка на оригинал статьи http://habrahabr.ru/post/224749/

Thunderargs: практика использования. Часть 1

Недавно я писал пост про то, как был придуман и написан thunderargs. Сегодня я раccкажу о том, как его можно применять.

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

OPERATION = {'+': lambda x, y: x+y,              '-': lambda x, y: x-y,              '*': lambda x, y: x*y,              '/': lambda x, y: x/y,              '^': lambda x, y: pow(x,y)}  @Endpoint def calculate(x:Arg(int), y:Arg(int),                        op:Arg(str, default='+', expander=OPERATION)):     return str(op(x,y)) 

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


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

Кстати, можете забрать весь код, приведённый в примерах, отсюда. Вам нужен файлик flask-example.

Поехали

Шаг 0: синтаксис аннотаций, или избавляемся от эффекта магии

Подробнее про синтаксис аннотаций можно почитать здесь.

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

def foo(a: expression, b: expression):     ... 

После этого мы можем получить доступ к описанию аргументов через поле __annotations__ функции foo:

>>> def foo(a: "bar", b: 5+3): 	pass  >>> foo.__annotations__ {'b': 8, 'a': 'bar'} 

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

Шаг 0.5: установка

Я таки залил эту штуковину в PyPI по просьбе какого-то чувака, так что можете смело ставить её через pip. Единственная поправка: некоторые особенности, которых мы коснёмся в мануале, есть только в альфа-версии, так что советую использовать --pre:

sudo pip install thunderargs --pre 

И не забудьте поставить flask! По идее, он не обязателен для работы самого thunderargs, но в текущем мануале мы будем его пользовать.

Шаг 1: элементарное приведение типов

Самый простой вариант использования thunderargs — приведение типов. У Flask есть такая малоприятная особенность: он не имеет никаких средств для предварительной обработки аргументов, и их приходится обрабатывать прямо в теле функций-эндпоинтов.

Предположим, что мы хотим написать простую пагинацию. У нас будет два параметра: offset и limit.

Всё, что для этого нужно — указать тип данных, к которому данные аргументы должны быть приведены:

from random import randrange  from thunderargs.flask import Flask  app = Flask()  # Just a random sequence elements = list(map(lambda x: randrange(1000000), range(100)))  @app.route('/step1') def step1(offset: Arg(int), limit: Arg(int)):     return str(elements[offset:offset+limit])  if __name__ == '__main__':     app.run(debug=True) 

Прошу заметить, что здесь и далее я использую не классический Flask, а версию с заменённой функцией route, которую импортирую из thunderargs.flask.

Итак, мы смогли запихнуть приведение типов в аннотации, и теперь нам больше не придётся делать дурацкие операции типа таких:

    offset = int(request.args.get('offset'))     limit = int(request.args.get('limit')) 

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

Шаг 2: значение по умолчанию

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

Значения по умолчанию, на мой взгляд, задаются весьма интуитивно:

@app.route('/step2') def step2(offset: Arg(int, default=0),           limit: Arg(int, default=20)):     return str(elements[offset:offset+limit]) 

Останавливаться на этом подробнее пока не будем. Кроме, пожалуй, одного факта: дефолтное значение должно являться инстансом указанного класса. В нашем случае, например, [0,2,5] в качестве дефолтного значения не прокатит.

Шаг 3: обязательный аргумент
@app.route('/step3') def step3(username: Arg(required=True)):     return "Hello, {}!".format(username) 

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

А если вы не дадите серверу нужный ему аргумент, то получите ошибку thunderargs.errors.ArgumentRequired.

Шаг 4: множественный аргумент

Тут всё тоже достаточно очевидно. Кроме, возможно, того, что в качестве параметра в нашу функцию придёт map object, не список.

@app.route('/step4') def step4(username: Arg(required=True, multiple=True)):     return "Hello, {}!".format(" and ".join(", ".join(username).rsplit(', ', 1))) 

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

?username=John&username=Adam&username=Lucas 

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

Шаг 5: валидаторы

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

from thunderargs.validfarm import val_gt, val_lt  @app.route('/step5') def step5(offset: Arg(int, default=0, validators=[val_gt(-1), val_lt(len(elements))]),                                                   val_lt(len(elements))]),           limit: Arg(int, default=20, validators=[val_lt(21)])):     return str(elements[offset:offset+limit]) 

Валидаторы создаются на ферме фабрик под названием validfarm. Там сейчас только примитивнейшие варианты, вроде len_gt, val_neq и так далее, но в дальнейшем, думаю, список будет пополняться.

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

def step5(offset: Arg(int, default=0, validators=[lambda x: x >= 0 and                                                             x < len(elements)]),           limit: Arg(int, default=20, validators=[val_lt(21)])):     ... 

Или даже так:

def less_than_21(x):     return x < 21  @app.route('/step5_5') def step5_5(offset: Arg(int, default=0, validators=[lambda x: x >= 0 and                                                             x < len(elements)]),           limit: Arg(int, default=20, validators=[less_than_21])):     ... 

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

Шаг 6: разворачиваем аргументы

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

Для демонстрации снова приведу функцию, которую уже упомянул в начале. Думаю, на этот раз тут всё будет понятнее.

OPERATION = {'+': lambda x, y: x+y,              '-': lambda x, y: x-y,              '*': lambda x, y: x*y,              '^': lambda x, y: pow(x,y)}  @app.route('/step6') def step6(x:Arg(int), y:Arg(int),           op:Arg(str, default='+', expander=OPERATION)):     return str(op(x,y)) 

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

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

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

Внемануальные замечания

Python 2 или вариант для ископаемых

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

@annotate(username=Arg()) def foo(username):     ... 

В теории должно работать, хотя на практике не тестил.

Мелкие заметки по фласку

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

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

В теории, взаимодействие с другими модулями фласка сломаться не должно. Но практика покажет.

Можно использовать одновременно и path variables, и параметры из аннотаций. Они не конфликтуют между собой, если какой-нибудь из параметров не является одновременно и тем, и другим.

Мелкие заметки по не-фласку

Следует помнить, что thunderargs прекрасно работает и без фласка. Для этого вам нужно использовать на функциях декоратор Endpoint из thunderargs.Endpoint.

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

Не забывайте, что вы легче лёгкого можете создать своих потомков от Arg. IntArg, StringArg, BoolArg и так далее. Такая оптимизация может существенно уменьшить количество символов в декларации функции и повысить читабельность кода.

Мы работаем над этим

Большая часть кода была написана по-пьяни. Некоторая — в очень сонном состоянии. Код нуждается в оптимизации, но уже кое-как работает. Разработка и обкатка продолжается, так что если вы вдруг решите помочь — присоединяйтесь. Пойдёт любая помощь, а особенно — тестинг. Я, как в старом анекдоте про чукчу, не читатель, а писатель. Пока что.

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

Кстати, к большому моему сожалению май инглиш из нот соу гуд эс ай нид ту транслэйт зис текст, так что если кто-нибудь этим займётся — буду очень благодарен 🙂

ссылка на оригинал статьи http://habrahabr.ru/post/224705/

Обучение со сверх-человеческой скоростью

Хотите научиться играть на музыкальном инструменте? Или может танцевать? Легко! Носимые компьютеры могут помочь вам в этом, воздействуя непосредственно на мышечную память.

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

«У меня есть перчатка, которая может научить вас играть на фортепьяно», — говорит мне Чад Старнер, когда я позвонил ему поговорить о будущем носимых вычислительных устройств. На данный момент, он профессор в Техническом Институте штата Джорджия, а также технический руководитель Google Glass. Его знакомство со сферой носимых гаджетов началось еще в годы студенчества в MIT в девяностые.
«Пока мы с вами говорили, вы бы уже могли выучить „О, Благодать“ (Amazing Grace) », — добавляет он в конце нашего разговора.
«Правда? — не верю ему я, — пока мы говорим?»
«Конечно», — говорит он и приглашает меня в Атланту, чтобы я мог убедиться лично.

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

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

Раз в минуту, в продолжении следующих двух часов, моторчики в моей перчатке оживают и я пытаюсь разобрать последовательность: вжжж… средний палец… вжжж… безымянный… вжжж… вжжж… оу… вжжж… ух… вжжж… вжжж… вот черт! «Невозможно», — записываю я свой блокнот.

Наконец, Старнер подводит меня к фортепьяно. Он играет первую часть мелодии — 15 нот, которым перчатка должна была меня научить. Я узнаю мелодию — это «Ода радости», Бетховена. Я снимаю перчатку.

«Начинайте отсюда», — говорит Старнер, ударяя пальцем первую клавишу. Я кладу пальцы на клавиши… Средний палец… средний… безымянный… «Не знаю», — говорю я сконфуженно.

«А вы не думайте об этом», — говорит Старнер.

И я начинаю сначала: Средний… средний… безымянный… мизинец… мизинец… безымянный… средний… указательный… «Это сумасшествие!» — говорю я, продолжая, тем не менее, играть. Я заканчиваю первую часть, вторую и начинаю играть третью.

«Погодите! — прерывает меня Старнер, — вы когда нибудь играли эту мелодию?»

«Никогда», — отвечаю ему я. И это правда, никогда не брал уроки игры на фортепьяно. Он растеряно исследует перчатку и обнаруживает, что она была запрограммирована «провибрировать» все четыре части — 61 ноту, вместо 15-ти, как он думал. Он объясняет, что обычно студенты обучают одной части за раз.

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

«Вы ведь просто знаете, что должны делать, не так ли?» — замечает Сейм. Она недавно научилась играть «Оду Радости» нося перчатку во время подготовки заявления для нового гранта под исследования. «Как будто смотришь на чужую руку», — подшучивает надо мной она.

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

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

Он также вспоминает сцену из Матрицы, где Нео и Тринити садятся в вертолет и на вопрос Нео о том умеет ли Тринити его пелотировать, она отвечает: «Еще нет…» И через секунду, ее веки дрожат, пока знания «закачиваются» в ее голову.

«Ну этого-то вы не можете», — говорю я.

Старнер вздыхает: «Пока нет.»

PS. Привет Хабр! Это мой первый перевод. Просто очень интересной показалась статья и подумалось, что быть может еще кто-то сочтет ее таковой. Буду рад конструктивной критике в сообщениях или в комментариях. Всем удачно провести остаток пятницы.

ссылка на оригинал статьи http://habrahabr.ru/post/224737/