Google Crashpad

Для того, чтобы собрать crashpad под Windows с DLL runtime (/MD /MDd), нужно создать в своём домашнем каталоге (c:/users/konst например) подкаталог .gyp и в него положить файл include.gypi со следующим содержимым:

{
  'target_defaults': {
    'configurations': {
      'Release': {
        'target_conditions': [
          ['OS=="win"', {
            'msvs_settings': {
               'VCCLCompilerTool': {
                  'RuntimeLibrary': '2',
                }, 
             },
          }],
        ],
      },
      'Debug': {
        'target_conditions': [
          ['OS=="win"', {
            'msvs_settings': {
               'VCCLCompilerTool': {
                   'RuntimeLibrary': '3',
                }, 
            },
          }],
        ],
      },
    },
  },
}

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

Motorola Droid Turbo XT1254 CDMA tuning

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

  1. Запускаем телефон в режиме BP Tools (из fastboot bootloader меню)
  2. Идём в Device Manager, выбираем устройство diag_mdm и ручками ставим драйвер Motorola QC Diag Port
  3. Запускаем DFS CDMA Tool (нужна старая версия, можно было скачать тут)
  4. Вводим SPC 000000 и переходим во вкладку Programming
  5. Находим вкладку Data и снимаем галку “Authentification require password encryption”.
  6. Ребутаемся, работает 3G (EVDO Rev.A)

ESP8266 и датчик движения с фольгой

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

В результате на базе ESP8266, датчика движения BISS0001, сенсора AM2302 (DHT-22) и релешки OMRON G3MB-202P (вообще можно обойтись мосфетом, но было интересно SSD реле потыкать) был сделан контроллер ленты, который попутно сливал информацию о погоде на кухне. Всё это было аккуратно собрано в одну 6см распределительную коробочку шнайдер из “новой линии”. Напишу отдельно о процессе создания такой штуки.

Теоретически схема работала отлично, на практике тоже, датчик включал свет, через 40 секунд после последнего срабатывания выключался, температура с влажностью сливались, кроме одного нюанса: иногда свет включался сам. Системность выяснить не удавалось, поэтому пришлось демонтировать плату управления, прогреть её, почистить от флюса (я ещё тот паяльщик), но это не помогло. Пришлось гуглить и оказалось, что датчик движения чувствителен к Wi-Fi радио ESP, иными словами, когда контроллер передаёт информацию, то он может вызвать ложно-позитивное срабатывание сенсора, что приводит к включению света, несмотря на отсутствие кого-либо на кухне. Ну что же, красивую упаковку пришлось чуть разобрать и датчик вынести наружу, чтобы отдалить от радио-антенны и уменьшить наводки.

Экран из фольги

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

Блок питания, контроллер и вынесенный датчик движения
Подсветка кухни в деле

uwsgi

Случайно обнаружилось, что в ini конфиге uwsgi важен порядок объявления параметров, поэтому если сначала объявить virtualenv, а потом указать подключение плагина python3, то будет попытка завестись с системным питоном.

PostgreSQL backup to Azure

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

В нашем случае действие происходит на базе Ubuntu 14, PostgreSQL 9.5 установлен локально.
Первым шагом нам необходимо установить сам pghoard и supervisor, т.к. systemd нет, а запускать демона с системой нужно.

Текущая версия pghoard 1.4 в pypi нам не подходит (в ней нету поддержки новых модулей azure-storage), поэтому инсталлировать её нужно из репозитория, а поскольку pghoard работает только с третьим питоном, то делаем это с помощью pip3
UPDATE:
предварительно нужно установить модули:

azure
azure-storage==0.33

и проапгрейдить requests до версии 2.10+
END UPDATE

pip3 install git+https://github.com/ohmu/pghoard
apt-get install supervisor

Для автозапуска демона создаём конфигурационный файл pghoard.conf с минимально необходимым контентом и кладём его в /etc/supervisor/conf.d/

[program:pghoard]
user = postgres  # Запускать нужно от имени postgres, иначе не удастся подключиться к СУБД
group = postgres
directory = /var/lib/pghoard
command = /usr/local/bin/pghoard /var/lib/pghoard/pghoard.json
autostart=true
autorestart=true
environment=HOME="/var/lib/postgresql"  # Должен быть HOME пользователя postgres (туда записывается пароль и потом оттуда считывается)

Создаём пользователя в postgresql для выполнения репликации:
psql -c "CREATE USER pghoard PASSWORD 'hoardpassword' REPLICATION"

И вносим в /etc/postgresql/9.5/main/pg_hba.conf запись, разрешающую выполнять репликацию:
host replication pghoard 127.0.0.1/32 md5

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

max_wal_senders = 2
wal_level = archive  # 'hot_standby' or 'logical' are also ok

Перезапускаем postgresql и настраиваем pghoard на работу с Azure:

{
        "backup_location": "/var/lib/pghoard",
        "backup_sites": {
                "mysite": {
                        "nodes": [
                        {
                                "host": "127.0.0.1",
                                "password": "hoardpassword",
                                "port": 5432,
                                "user": "pghoard"
                        }
                        ],
                        "object_storage": {
                                "storage_type": "azure",
                                "account_name": "<storage-account>",
                                "account_key": "<storage-account-key>",
                                "bucket_name": "<bucket-name>"
                        }
                }
        }
}

После этого выполняем service supervisor restart и наблюдаем, как бекапы заливаются в azure blob storage.

Home Automation Framework

ESP-12F

Умный дом, или как программисту (и не только) добавить автоматики в своё жильё. Начну делиться своим опытом начального внедрения Z-Wave, а потом и самодельных девайсов в квартире.

В настоящее время для создания умного дома есть огромное количество различных решений. Если вы любитель DIY, или хотите сэкономить, а может и то, и другое – рекомендую обратить внимание на микросхемы ESP8266, или Arduino + nRF24. На базе ESP можно построить систему используя существующую домашнюю сеть Wi-Fi, на базе nRF можно построить систему по своей беспроводной сети, тоже работающией 2.4 ГГц, но не Wi-Fi, зато с преимуществом в виде возможности ретрансляции сигнала, т.е. каждая единица сети (нода) может общаться не только с контроллером, но и с другими нодами. Фактически mesh-сеть.

ESP-12F
Это “ядро” умного устройства на базе ESP-12F (8266)

С экономической точки зрения ESP-12F стоит на алиэкспрессе 1.80USD за штуку, ардуино стоит 1.60USD, но к ней ещё надо дополнительно покупать трансмиттер NRF24L01+, который стоит порядка 0.9USD.

При этом у ардуины 16-32КБ памяти и слабенький 16MHz Atmel процессор, в то время, как у ESP до 4 мегабайт флеша, аппаратный Wi-Fi с шифрованием и довольно мощный 32 битный RISC процессор, работающий на 80MHz. Выливается это всё в то, что по факту в ESP можно, не сильно напрягаясь, прикрутить OTA обновления и накрутить много всякой автономной логики, например целый веб-сервер, с помощью которого управлять нодой (т.е. обходиться вообще без контроллера). Тут можно посмотреть в сторону проекта NodeMCU, ребята запилили в прошивку интерпретатор LUA с помощью которого можно накручивать весьма сложную логику прямо на устройстве, не задействуя центральный сервер – т.е. создавать автономные системы.

esp-nrf-arduino
nRF24 + Arduino Pro Mini на фоне ESP-12

Z-Wave

В случае же, если есть много денег, или неохота заморачиваться с паяльником, прошивками и разного рода экспериментами – можно посмотреть на Z-Wave:
это уже вполне mature, production решение. В наличии обилие устройств самого разного назначения – и выключатели, и реле, и термостаты с датчиками – бери и образумливай дом хоть сейчас. Стоимость, при этом, немаленькая. Самое простое реле будет стоить порядка 25-30 евро, а контроллер вообще под две сотни тянет.

z-wave promo

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

Чтобы всё это разнообразие взлетело, я использую в качестве контроллера Raspberry PI, к которой добавлена плата расширения RaZberry, позволяющая связываться с Z-Wave устройствами. Рядом с ней добавлена плата для связи с nRF24 устройствами, а связь с ESP осуществляется через локальную сеть.

До тех пор, пока я использовал только Z-Wave – в качестве контроллера мне хватало софта от RaZBerry, под названием Z-Way, но после того, как началась экспансия на DIY устройства – пришлось искать систему, которая сможет общаться со всем этим “зоопарком”. Мой выбор пал на Domoticz. Он умеет работать и с z-wave посредством OpenZWave, и с Arduino + nRF при помощи MySensors сборки для RPi, и с ESP через MQTT, который оказался настолько мощным и удобным протоколом, что появились даже мысли попробовать, когда-то адаптировать MySensors (или как-то написать свою прошивку) на работу через него.

OpenVPN DNS order

Иногда, при подключении к VPN оказывается, что тамошний DNS не резолвит местные имена. Это не потому что он плохой, а потому что винда странная (7). Есть два пункта, которые помогают этот вопрос урегулировать.
Для начала нужно в настройках сети поднять приоритет VPN сети повыше:

control panel -> network and sharing -> change adapter settings -> -n -> advanced settings
Make sure that your tap adapter is at the top of your connections list.

Перед подключением выполнить:
net stop dnscache

Должно помочь.
Можно пойти дальше и запихнуть net stop в батничек, который вызывать при подымании openvpn соединения.

espresso test failure

Если внезапно вы решили подключить espresso и начать писать тесты, а потом после очередных манипуляций вдруг тесты приложения перестали запускаться и начали бросать исключение NoClassDefFoundError YourActivity, то вполне вероятно, что может спасти совершенно нелогичное действие:
Добавить исключения суппорт либы в gradle для компиляции espresso (в моём случае espresso-contrib)

androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2') {
    exclude group: 'com.android.support'
    exclude module: 'support-v4'
}

Android x86 emulator и google maps/play services

Google и intel сделали крутую штуку – образы андроида для x86 atom, которые работают весьма шустро на x86 платформе, в отличие от тормозных armv7. Но счастье резко заканчивается, когда нужно делать приложение, использующее google apis (maps, play services) – x86 образы есть только для чистого андроида.

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

Continue reading “Android x86 emulator и google maps/play services”

Jenkins, MSBuild и Includes

Однажды оказалось, что Jenkins фейлит билды MSVS 2012 (которые выполняются посредством консольного msbuild), с сообщениями о том, что не найдены всякие заголовочные файлы (например al.h). Как известно, в студии начиная с 2010 “глобальные” настройки путей к инклюдам, либам и прочему перенесены в странное место – Property Manager->$Project|$Configuration -> Microsoft.Cpp.$Platform.user. Ну и ладно, казалось бы, зашли, прописали и всё хорошо. Студия компилит, в консоли msbuild тоже нормально всё делает… Вот только Jenkins запускает своего slave windows сборщика от системного пользователя, а настройки путей, они не глобальные, а per-user оказывается, поэтому он и не подхватывает эти пути.

Самым простым решением оказалось, как ни странно, создать каталог, скопировать туда “свой” файлик C:\Users\konst\AppData\Local\Microsoft\MSBuild\v4.0\Microsoft.Cpp.Win32.user.props и добавить в командную строку запуска /p:UserRootDir=d:\msbuild_home