Настройка pritunl/openvpn на arm64 сервере в ScaleWay

Я уже давно сижу в интернете исключительно через свой самопальный vpn. Лет 6 назад это был digitalocean, vpn-сервер жил вместе с остальными сервисами и кочевал по разным провайдерам.

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

Такой машиной стал ramnode.com, уже отсутствующий на тариф на ~0.5 ядра, 256Mb оперативки и 80GB hdd диск. Цифры +-, т.к. такого тарифа у них уже давно нет. На этой машине я прожил вроде бы 3 (может и 4) года. Последние 2 раза она продлевалась по случайности автоплатежом 15$ за год, каждый раз я при этом сильно ругался, но раз уж на год продлилась, то чего бы не поюзать.

Основная проблема той машины была в ограничении трафика в 500Gb. Это достаточно мало, и выжрать их можно было в любой момент, таким образом до конца месяца оставшись без vpn. Скорость гуляла от 12 до 24 MBit/s

Читать далее

Используем кока-колу по назначению

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

Исходник

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

К сути эксперимента:

На фоне колы

Кружку залил доверха вместе с ложкой. Через 20 минут побежал проверять по ложке, но она по-прежнему была черная. Пришлось оставить все на утро. Утром меня ждало разочарование:

На следующее утро

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

Финалка

Сборка ЗИЛ-131

Сел за сборку ЗИЛ-131 почти сразу после полного окраса МиГ29-СМТ. Закончил только сейчас, на сборку ушло больше 1.5 лет…

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

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

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

Читать далее

Попробуйте выключить и включить

Недавно сидели на работе, вспоминали про выключить и включить. А ведь как-то раз и со мной такая история произошла. Я купил сервер на soyoustart.com, поставил на него какую-то debian-подобную систему.

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

Читать далее

Почему мне перестал нравиться Qt

Когда-то давным давно я полюбил Qt. Он был простой, с качественной документацией, наличием своей среды разработки. В нем были свои контейнеры QHash, QMap, QVector и после них, глядя на std, становилось сильно плохо.

Все изменилось в 2013-ом году, когда компиляторы gcc и clang начали полноценно поддерживать C++11. Этот факт прошел мимо меня, что и неудивительно. Все важные события нужно отслеживать самому.

Для понимания всей картины рекомендую посмотреть доклад от разработчика Qt: https://youtu.be/uZ68dX1-sVc?t=29m20s
Читать далее

Orange PI. Домашний сервер в действии

Несколько месяцев назад мне приехал Orange PI PC Plus. Прекрасный маленький компьютер с sd-картой вместо жесткого диска, пассивным охлаждением и просто морем разъемов. Только когда я его взял в руки до меня дошло, что у меня есть клавиатура и мышка, но нет монитора. Есть роутер, но я не могу к нему подключиться кабелем — длины не хватит, и снять роутер тоже нельзя — оптоволокно порвется.

плата + блок питания + sd-карта + доставка = ~2200р

Это конец / едем домой за монитором? Нет, это было бы слишком просто!

Читать далее

Пущинская новогодняя олимпиада 2018

Месяц назад мы провели очередную Пущинскую новогоднюю олимпиаду.

В этот раз мы были особо амбициозны, и ровно по этой причине мы получили кучу проблем. Задачи писало аж пять человек — я с Арсением, Леша Соловьев, Данила Сорокин и Татьяна Ивановна. Кроме того, Женя Баулин тусовался в нашем google doc, где он помогал исправлять грамматические и логические ошибки.

Сам google doc с задачами был создан более чем за 2 месяца до олимпиады, но задач в нем не было. Обычно мы с Арсением начинали с пары задач, потом кое-как состыковывались друг с другом, получали сюжет, определяли необходимую сложность и количество задач.

Не в этот раз.

Читать далее

Сборка BSA-Analytics под Windows 10

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

  1. 2 года назад все стабильно работало
  2. Под линуксом все и сейчас стабильно работает
  3. Под виртуалкой и под линуксом все работает
  4. Под чужой Windows 7 все работает
  5. Версия полугодовалой давности везде работает
  6. Никаких изменений за последние полгода, которые могли бы сказаться, не было. Тем не менее, все сломалось
  7. На рабочем компе Windows 8.1, которая затеяла массивное обновление самой себя некоторое время назад

Читать далее

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

Дано:
1) Весь Король и Шут, скачанный с рутрекера в формате *.m4a, с кодеком alac (apple lossless codec)
2) Skoda Octavia III, которая читает m4a, но не переносит проприетарные кодеки (как и я)

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

find . -iname "*.m4a" -execdir sh -c 'ffmpeg -i "$0" -acodec flac "$(basename "$0" .m4a)".flac' "{}"  \;
find . -iname "*.m4a" -execdir sh -c 'ffmpeg -i "$0" -acodec mp3 -b:a 320k "$(basename "$0" .m4a)".mp3' "{}"  \;

И финализация только после проверки, что все прошло удачно:

find . -iname "*.m4a" -execdir rm "{}" \;

Сага о скорости sscanf

В нашем проекте есть одно из мест при чтении, когда надо распарсить строчку с числами вида «{ 123, 234, 345, 456, 567 }». Там всегда стоял сишный код декодирования через scanf. Ну а потом там пришлось все переделывать, и я на автомате написал декодирование в Qt стиле. А потом решил проверить что же будет быстрее.

Итого, у нас 2 варианта:
1) Ищем каждую первую цифру из каждого из чисел, после чего натравливаем scanf()
2) Сплитим строчку по разделителю, после чего для каждой полученной строки исполняем QString().toInt()

Для проверки что же работает быстрее я написал следующий код:

#include <QCoreApplication>
#include <QtGlobal>

#include <QElapsedTimer>
#include <QString>
#include <QStringList>
#include <QDebug>

#include <stdio.h>

int main(int argc, char *argv[])
{
    QByteArray r;
    for (int i = 0; i < 1000000; i++) {
        float a;
        int b = rand();
        a = *reinterpret_cast<float*>(&b);
        r += QString::number(rand()).toUtf8() + '\0';
    }

    //------------------------------------------
    //------------------------------------------

    QElapsedTimer timer;
    timer.start();

    QList<QByteArray> l = r.split('\0');
    float res = 0;
    for (int i = 0; i < l.size(); i++) {
        res += l.at(i).toFloat();
    }

    qDebug() << res << timer.elapsed();

    //------------------------------------------

    timer.start();

    const char *data = r.data();
    int size = r.size() - 1;
    res = 0;
    float f;
    for (int i = 0; i < size; i++)
        if (data[i] == '\0') {
            sscanf(data + i + 1, "%f", &f);
            res += f;
        }

    qDebug() << res << timer.elapsed();

    return 0;
}

Дебаг сборка
Qt: 165мс на декодирование
Си: 171мс на декодирование

Релиз сборка
Qt: 144мс
Си: 153мс

Массив чисел можно генерить как из целых, так и из float — скорость от этого особо не изменится. Зато скорость знатно меняется, если в качестве разделителя использовать не \0, а, допустим, просто пробел.

В таком случае, если уменьшить количество чисел с 1000000 до 100000, скорости будут такими (релиз):
Qt: 18мс
Си: 963мс

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