Лечим Steam-версию Rocksmith 2014 от кабеля

Rocksmith2014Вкраце: Rocksmith 2014 это игра-тренажер, в которой роль игрового контроллера выполняет реальная гитара. Плюсы: собственно, сама игра офигенная. Минусы: чтобы гитару как-то в воткнуть в компьютер, производители настаивают на покупке их весьма недешевого кабеля. И то, что у меня уже есть внешняя звуковая карта, предназначенная специально для гитары, их не волнует, оригинальный кабель подавай!

Гугление находит некий патчер rocksmith2014_nocable_pbs by phobos777, и, о чудо, он даже работает, за исключением того, что Steam не в курсе про то, что ты в игре, потому что процесс игры запущен патчером а не стимом. А значит, никаких ачивок, скринкастов… или нет?

Читать далее

Рубрика: Разное, Решение проблем, Туториалы | Метки: , , , | 21 комментарий

Python: динамическая подмена класса

Юзкейс

Есть функция-фабрика, возвращающая объект класса A. Функция из сторонней либы, менять ее нельзя (либо вообще ее код закрыт). А нам очень нужно сделать класс B, наследованный от A, и перекрыть magic-метод, скажем __exit__.

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

Рубрика: На заметку, Программирование, Решение проблем | Метки: , | Добавить комментарий

Умножение матриц

Умножение матрицA x B = C

Это, наверное, самая важная операция над матрицами, детали которой, к сожалению, иногда выветриваются из головы. Вот шпаргалка в виде тезисов:

  • A_{m \times p} \times B_{p \times n} = C_{m \times n}
  • количество столбцов левой матрицы должно совпадать с количеством строк правой
  • результирующая матрица имеет то-же количество строк, что и в левой матрице, а столбцов- что и в правой
  • c_{i, j} = \sum_{1..p}^{r} a_{i, r} \cdot b_{r, j} каждый элемент результирующей матрицы- это скалярное произведение соответствующего вектора-строки левой матрицы и вектора-столбца правой
  • B \times A = (A \times B)^{T} Умножение матриц не коммутативно
  • матрица- это некая линейная трансформация (например, поворот или масштабирование)
  • умножение матрицы на вектор-столбец — это применение этой трансформации к вектору
  • умножение двух матриц дает новую матрицу- комбинацию двух трансформаций
  • при умножении на квадратную матрицу, ненулевые элементы которой располагаются только на главной диагонали, левую матрицу можно рассматривать как группу векторов-строк, элементы главной диагонали- как масштабирующие коэффициенты для осей векторов, а результирующая матрица- это группа масштабированных по осям векторов
  • I (или E) матрица идентичности (или единичная матрица) — матрица, главная диагональ которой заполнена единицами, а остальные элементы- нули. Умножение на такую матрицу дает исходную без изменений
  • A \times A^{-1} = I если умножить матрицу на обратную ей, то получим матрицу идентичности. Обратная матрица— это трансформация в обратную сторону.

PS: Спасибо, что читаете!
Ваши замечания и предложения оставляйте в комментариях.

Рубрика: На заметку | Добавить комментарий

Настройка радиомодуля APC220 в Ubuntu и Mac OS

APC220 + USB-TTL

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

Обычно, всё, что выдает гугл и яндекс по запросу «настройка APC220» это статьи, которые говорят «скачайте и запустите программу RF-Magic, вбейте нужные поля и нажмите Write». Только вот все эти статьи бесполезны для пользователей Mac и Linux — создатели этой утилиты даже и не думали, что кто-то, кроме юзеров винды, будет ее запускать.

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

Читать далее

Рубрика: DIY | Метки: , , , | 4 комментария

Калибровка компаса — Хардкор

Этот пост немного выбивается из общей тематики блога и будет интересен скорее интересующимся DIY и роботостроением, чем программистам, однако нам пригодится все: и навык программирования в области анализа данных, и математическая смекалка, и 3D-воображение 🙂
 

Небольшое интро

Очень часто перед создателями квадрокоптеров и прочих передвигающихся штук встает проблема- нужно определять ориентацию в пространстве. Крен, тангаж, рыскание — термины как раз из авиации. Так вот, для этого применяют следующие устройства: акселлерометр (измеряет линейное ускорение + гравитацию), гироскоп (измеряет скорость вращения вокруг 3-х осей) и, наконец, магнитометр, или по-простому компас, который измеряет напряженность и ориентацию магнитного поля. Писать на тему ориентации в пространстве можно (и нужно) много, однако сегодняшний топик- калибровка компаса на примере HMC5883L, самой популярной в среде DIY модели, который умеет по шине I2C (стандартной для большинства сенсоров) отдавать 3-х мерный вектор магнитного поля.

Проблемы

 

magnetometer point cloud animated

Облако точек с компаса (кликабельно, GIF)

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

Для кого-то это приемлемо, но не для нас! Только хардкор! Читать далее

Рубрика: DIY, Алгоритмы, Программирование | Метки: , , , , , , , | 21 комментарий

Манкипатчим поддержку decimal.Decimal в json

TypeError: Decimal('0.99') is not JSON serializable

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

  1. использовать simplejson
  2. создать свой энкодер, пронаследовавшись от стандартного, и передавать его в json.dumps в качестве одного из аргументов.
    Код

В общем, все здорово, но что делать с вызовами из всяких third-party либ и с тучей вызовов по всему проекту? Короче, пост про манкипатчинг 🙂
Читать далее

Рубрика: На заметку, Решение проблем | Метки: , | 1 комментарий

Загадка foo bar с ответом

>>> s = 'foo'
>>>…
>>> {s: 1, 'bar': 2}
{'bar': 1, 'bar': 2}

Что в пропущенной строчке?

ЗЫ: никакие built-in функции или объект строки заменять нельзя. Ответ под катом.
Читать далее

Рубрика: Разное | Метки: | Добавить комментарий

Рандом с учетом весов за O(1) — Walker’s alias method

Есть массив A[n] с весами. Нужно выбрать случайный элемент, но не равномерным рандомом, а в соответствии с этими весами. (В общем, это дискретное распределение вероятности)

Чем примечателен метод алиаса, так это константным временем выполнения O(1) Читать далее

Рубрика: Алгоритмы, Программирование, Разное | Метки: , , , | 2 комментария

Поворот в пространстве и кватернионы

Ориентация в пространстве

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

Теперь предлагаю провести небольшой мысленный эксперимент, вдумчиво ответив на следующий вопрос: «Какие потребуются параметры, для того, чтобы однозначно задать ориентацию в трёхмерном пространстве (референсная система координат задана)?»

Читать далее

Рубрика: Алгоритмы, Программирование | Метки: , | 16 комментариев

Python: defaultdict с заданной структурой

collections.defaultdict

defaultdict призван избавить ваш код от ужасных многострочных/длинных конструкций из if-else, has_key/in, обладающих, к тому же, дерьмовой производительностью, растущей из повторяющегося несколько раз поиска по словарю.

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

В общем, для ценителей компактности, консистентости и извращений нестандартных решений:

from copy import deepcopy
from functools import partial
from collections import defaultdict

data = defaultdict(partial(deepcopy, 
           {'flags': set(), 'settings': {}, 'name': None}
                   ))
Рубрика: На заметку | Метки: , | 1 комментарий