Hatred's Log Place

DON'T PANIC!

Feb 3, 2016 - 1 minute read - туризм

Про снегоступы

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

  • Гуляешь по парку? Пожалуйста - walking!
  • Чуть сложнее? Да на здоровье - hikking!
  • Уже несёшь дом за спиной? Всегда рады - backpacking!
  • Идёшь в лыжный поход? Нет проблем - randonnee skiing (или ski touring)!
  • Hillwalking, mountaineering, и так далее.

Под каждую нишу своё снаряжение, подготовленные тропы, гиды и так далее.

При чём тут снегоступы? Оказывается и для них есть свои названия:

  • Наш жаргонный “снегоступинг” - это snowshoeing,
  • а “снегоступер” - snowshoer.

В статье на Snowshoe|википедии про это есть. Уж не знаю, существуют ли подготовленные снегоступные трассы, но если ответ положительный - я не удивлюсь :)

Jan 31, 2016 - 1 minute read - туризм

Как дышать на холоде

Хорошая статья на тему (автор - полярник):

Правда не знал, что -20, даже при ветре, это экстремально холодно :)

По способам: всё правильно. К примеру, дыхание ртом, когда язык загибаешь к нёбу. Про этот способ несколько лет назад сказал мой друг Олег. С тех пор и пользуюсь. Балаклава с “намордником” тоже решает. Правда скулы нужно не забывать закрывать, а то легкие не застудишь, а ряху обморозишь.

Jan 31, 2016 - 4 minute read - туризм

Малый траверс Ботанического хребта и г.Острая по С-З гребню

Кто не понял - название шутка. Привет Спайдеру :wink:

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

  1. Время: 6:15
    1. в движении: 5:06
  2. Километраж: 16.2 км
  3. Средняя скорость: 3.17 км/час
  4. Общий набор высоты: 1076 м
  5. Общий сброс высоты: 939 м

К слову сказать - до Острой не дошёл, но об этом дальше.

Jan 29, 2016 - 4 minute read - programming c++ projects

Обновление Qt Creator

Пока LOG, Habrahabr и другие гудят по поводу смены лицензионной политики в части Qt (переход на LPGL3) и QtC (переход с LGPL2.1 на GPL3 /именно GPL/ с исключением для плагинов), у меня дошли руки обновить PPA: https://launchpad.net/~adrozdoff/+archive/ubuntu/qtcreator-git

Ну и несколько интересных (для меня) изменений, которые стали доступны в этом билде. Добро пожаловать под кат.

Jan 5, 2016 - 1 minute read - programming c++

C++11: несуразность std::thread

Пост-вопрос.

Может кто объяснить, почему в стандарт вошла настолько обрезанная версия реализации std::thread? Ведь предлагаемый интерфейс не предоставляет абсолютно никаких средств передачи параметров потоку в момент создания, к примеру, тот же размер стека, что крайне актуально на всяких RTOS. При этом Boost.Thread такую возможность предоставляют средствами [boost::thread::attributes](http://www.boost.org/doc/libs/1_60_0/doc/html/thread/thread_management.html#thread.thread_management.thread.attributes):

    template <class F>
    explicit thread(attributes& attrs, F f);
    
    template <class F>
    thread(attributes& attrs, F &&f);
    
    template <class F, class ...Args>
    explicit thread(attributes& attrs, F&& f, Args&&... args);

Средства хоть и лимитированные, но доступ к native_handle атрибута позволяют тюнить параметры на конкретной платформе. Но в стандартной библиотеке нет и их. Нипанимать. Explain. Explain.

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

Jan 3, 2016 - 7 minute read - programming embedded

OpenOCD, GDB и (сильно)удалённая отладка

Intro

Статью изначально опубликовал на Хабре: http://habrahabr.ru/post/274179/

Дано:

  1. устройство с ARM926E-JS (Cypress FX3) на борту;
  2. находится на другом континенте;
  3. подключено (JTAG+USB+COM) к Linux компу;
  4. на комп есть SSH доступ (и больше ничего, только SSH порт).

Проблема: устройство нужно отлаживать и писать под него код. И делать это, желательно, удобно.

Решение с использованием OpenOCD, GDB и Qt Creator, а так же описание пути к нему, под катом.

Jan 3, 2016 - 6 minute read - linux

ThinkPad T530, WiFi и DEAUTH_LEAVING

После экспериментов с роутером Zyxel Keenetic 4G II (прошил неофициальную прошивку серии V1 (V1.11.RU.NDMS), на родной серии V2 непредсказуемо работал multicast IPTV) заметил, что WiFi стал работать как-то нестабильно (затыки с сайтами, постоянный реконнект у мессенджеров). Временами, но стабильно, стал вылазить диалог с просьбой ввести пароль от точки. Будто бы порвалась связь и не получилось подключиться с какого-то количества попыток.

Размышляя, что менял (ну кроме самой прошивки), вспомнил, что я переключил WiFi с режима 11b/g на режим 11b/g/n (раньше прошивка читалки не могла цепляться, если AP в таком режиме, после прошивку исправили, а настройки так и остались). Действительно, когда я переключил роутер обратно в режим 11b/g, то всё стало на свои места, так что не прошивка виновата. Казалось бы - решение найдено, но такой путь - не наш метод (хотя… если ничто другое не помогает, то лучше синица в руках, чем журавль в небе).

Dec 7, 2015 - 1 minute read - linux programming

MinGW GCC 5 в Trusty

Сделал PPA, куда положил MinGW GCC 5: https://launchpad.net/~adrozdoff/+archive/ubuntu/mingw

Версия GCC на момент написания поста: 5.3.0. Сборка зависит от репозитория https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test/+packages (если надумаете собирать сами).

Краткие характеристики сборки:

  • Модель потоков: только posix (требуется libwinpthreads), т.к. позволяет использовать все возможности C++11/C++14. Если будет спрос на win32, то нужно только добавить одну строчку и чуть подкорректировать альтернативы (т.е. сборка поддерживает, просто выключил win32).
  • Обработка исключений: sjlj для win32 и seh для win64
  • Сборка для Win32 и Win64

Добавление репозитория: sudo apt-add-repository ppa:adrozdoff/mingw

Установка: sudo apt-get install gcc-5-mingw-w64 g++-5-mingw-w64

Компилятор с суффиксом -5, что бы не конфликтовать с тем, что распространяется вместе с Ubuntu/Mint.

В этом же репозитории планирую выкладывать сборки библиотек.

Dec 3, 2015 - 1 minute read - linux programming

Выбор дефолтного компилятора в Ubuntu/Mint/Debian

Создать альтернативы:

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 99
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5   20

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 99
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5   20

sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 99
sudo update-alternatives --set cc /usr/bin/gcc

sudo update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++ 99
sudo update-alternatives --set c++ /usr/bin/g++

После чего можно переключаться вручную через меню:

sudo update-alternatives --config gcc
sudo update-alternatives --config g++

или скриптом:

sudo update-alternatives --set gcc /usr/bin/gcc-5
sudo update-alternatives --set g++ /usr/bin/g++-5

или вернуть в автоматический режим:

sudo update-alternatives --auto gcc
sudo update-alternatives --auto g++

Снести альтернативы:

sudo update-alternatives --remove-all gcc 
sudo update-alternatives --remove-all g++

Или только указанную:

sudo update-alternatives --remove gcc /usr/bin/gcc-4.9
sudo update-alternatives --remove g++ /usr/bin/g++-4.9

В последнем случае, подберётся другая альтернатива (на основе приоритета) и выбор будет выставлен в auto. Если альтернатив нет, то будут почищены все симлинки.

На основе: http://askubuntu.com/questions/26498/choose-gcc-and-g-version

Nov 21, 2015 - 1 minute read - programming c++

Про использование ссылок и указателей в C++

Данная статья практически на 100% отражает и мой подход к использованию ссылок и указателей, рекомендую к ознакомлению:

http://eao197.blogspot.ru/2015/11/progthoughts-c.html

Тезисно:

  • void f(const T &p) ожидает реально существующий объект, но не изменяет его;
  • void f(T &p) ожидает реально существующий объект и изменяет его;
  • void f(const T *p) ожидает объект или nullptr, если объект существует, то не изменяет его;
  • void f(T *p) ожидает объект или nullptr, если объект существует, то изменяет его;
  • void f(unique_ptr<T> p) ожидает объект или nullptr; если объект существует, то забирает ответственность за его удаление;
  • void f(shared_ptr<T> p) ожидает объект или nullptr; если объект существует, то разделяет владение этим объектом (что дает право функции f() сохранить p у себя для дальнейшего использования или передать кому-то еще).

Nov 18, 2015 - 1 minute read -

FFmpeg loop input

Если нужно сделать повторный стриминг небольшого файла (или просто сделать большой файл из нескольких повторов маленького), то поможет такая команда:

ffmpeg -re -f lavfi -i "movie=filename=/some/path/input.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" -ar 44100 -f flv rtmp://some.server/app/live

Чуть подробнее:

  1. -re процессит входные фреймы так, как если бы это был live stream
  2. формат входного файла lavfi говорит, что входной файл, это не регулярный файл, устройство или сетевой ресурс, а описание графа фильтра (комплексного)
  3. соответственно аргументом -i становится описание графа фильтра: 1. movie - фильтр задаёт источник данных, а его параметр loop=N задаёт число повторов, 0 - бесконечное число раз, отличное от нуля - будет сделано именно такое число повторов. 2. setpts - предыдущий фильтр действует принципу KISS: попросили повторять файл - буду, но PTS будет оставаться без модификаций, соответсвенно муксеру это может (и даже, скорее всего, обязательно) показаться неприятным. Соответственно нам нужно пересчитать PTS на основе прошедших (N) кадров, фреймрейта (FRAME_RATE) и time-base входного PTS (TB, про time-base я уже писал)

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

Продублировал как ответы на вопросы на сайта Stack Exchange:

Nov 18, 2015 - 1 minute read - linux

Добавляем PGP ключ к Launchpad

Просто памятка:

  1. Генерируем ключ (gpg --gen-key).
  2. Экспортируем ключ (gpg -a --export <тут мыло или другой идентификатор ключа>, а подробнее тут: https://www.gnupg.org/gph/en/manual/x56.html).
  3. Идём на http://keyserver.ubuntu.com/ и добавляем в окно “Submitting a new OpenPGP Key” ключ экспортированный на прошлом шаге.
  4. Теперь получаем отпечаток (fingerprint) ключа (gpg --fingerprint)
  5. Идём на https://launchpad.net/~USERNAME/+editpgpkeys, проходим все круги ада шаги авторизации и на странице внизу находим “Import an OpenPGP key” и в поле ввода копируем свой отпечаток с предыдущего шага. Причём нажатие на кнопку Import Key может как-то странно реагировать, тогда как нажатие Enter в онке ввода отпечатка работает как надо.
  6. Ждём письма на почту.
  7. Расшифровываем файл из письма (gpg -d file.txt).
  8. Переходим по ссылке из файла.
  9. PROFIT.

Имеет смысл в ~/.profile или ~/.bashrc добавить строки:

# PPA
export DEBFULLNAME="Foo Bar"
export DEBEMAIL="foo_bar@gmail.com"

Одно но: полное имя и почта должны соответствовать идентификатору ключа GPG. Иначе - создавайте алиасы.