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. Остается только догадываться насколько эффективно можно использовать еще более быстрый инструмент — ассемблер.

«Программист, наверное»

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

Постучался, захожу:
— Здравствуйте, я работаю в Квант-программ. Эта бухгалтерия обслуживает эту фирму, верно?
— <какой-то невнятный ответ>
— Вы Анна да? Очень приятно познакомиться, вот 2 заявления на отпуск.
Мне мужчина в спину кидает:
— Программист, наверное
Я его спрашиваю, вы, мол, как так на глаз определяете?
На что он отвечает:
— Все люди как люди, бестолковые. И только программисты пытаются полностью выстроить логику поведения и начинают путаться, если что-то идет не по плану.

Ровно описание моего поведения во всех ситуациях.

Моя первая машина

Черная Skoda Octavia A7 1.4 DSG-7. 110000 км, 2013-ый год производства, 672 000р включая услуги подборщиков.

Я завтракаю в 6 утра в Шоколаднице. Не спрашивайте зачем

Старшая комплектация, биксенон, подогрев задних и передних сидений, двухзонный климат контроль, передние и задние парктроники, диски 18″ нештатные. 8.5 секунд до сотни, но это я еще не проверял. Динамика офигенная, педаль в пол нажимать страшно. Расход меньше 6 литров на сотню.

Но обо все по порядку.

Читать далее

Сгоревший диск

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

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

Короче, дождался вечера, перекачал к себе на диск по московскому интернету гигов 300-400 образов, и, уже утром, отправил в hetzner заявку с оглядкой на русский мануал. Спустя 10 минут мне ребутнули сервер с уже новым диском и я начал интересный процесс ребилда массива RAID-1.

Ребилд массива подходит к концу

Несмотря на все мои опасения ребилд завершился без особых проблем. Никаких провалов в скорости я не заметил. Исходная скорость была 140МБ/c, которая постепенно упала до 65МБ/c. Я так понимаю это из-за разной скорости чтения/записи в зависимости от расстояния до центра блинов в диске.

Новый сервер

Неожиданно для самого себя из-за идиотских блокировок телеграмма всплыла тема выбора провайдера для vpn сервера. Последние 3 года мой vpn находится в Нидерландах у провайдера ramnode — это 500Gb трафика, около 20 мбит практической скорости openvpn tcp.

Пока гулял по lowendbox, lowendtalk опять вспомнил всех провайдеров уже физических серверов, и тут я понял, что у моего провайдера основного сервера — hetzner на аукционе выставлена цена на мой же сервер аж на 5 евро дешевле. 5 евро — это цена какого-нибудь хорошего облачного сервера с возможностью переброса в другую локацию и без ограничения трафика, который у меня регулярно заканчивается. Короче, как я увидел это предложение, так сразу и купил.

Core i7-3770, 2x3TB hdd, 28.76 евро в месяц. Сеть стандартная — белый ipv4, подсеть ipv6, дополнительные адреса по 1 евро / месяц за штуку, при превышении 20TB исходящего трафика скорость режется с гигабита до 10 мегабит.

Переброс данных занял удивительно маленькое время. Я сделал актуальные бекапы всех 8 виртуалок, скопировал их на новый сервер и развернул там через qmrestore. Также пришлось скопировать несколько правил iptables. Также настроил zsh и перенес немножко данных с bsa. Даунтайм основной пачки сайтов составил около 20 минут — время на бекап главной виртуалки, ее передачу и восстановление. Параллельно как раз DNS обновлялся.

Короче, это было очень легко, система из виртуалок показала себя очень хорошо. Шлюзом в интернет служит одна из виртуалок, так что буквально пара правил iptables и перенос виртуалок — и все сервисы работоспособны. Раньше это выливалось в несколько дней и пачку проблем с ejudge / owncloud и т.п.

Это вряд ли конец, так как я уже почувствовал запах халявы — если к концу месяца у hetzner’a еще на пару евро дешевле станет, то я и еще один переезд устрою. На сдачу всегда можно взять какой-нибудь arm сервер от scaleway, vpn на них одно удовольствие настраивать.

uptime старого сервера

UPD: переехал тем же макаром еще раз, теперь за 25.8 евро тот же сервер, что и раньше был

Митинг за свободный интернет

А я вчера утром узнал про митинг за свободный интернет. И пошел на него. Вроде бы это был первый митинг, так что было очень интересно. Огромная толпа; рамки с металлоискателями; камазы, перекрывшие дорогу; полиция, стоящая каждые несколько метров.

Блестящая операторская работа

  1. Я очень боялся, что мне снесет крышу. Феномен стандартный, чем больше человек находится в группе, тем более они тупые. Крышу не снесло, голова была ясной, никакие вещи не орал, идиотам не хлопал. Вообще не хлопал, и раскачать мое состояние у выступающих не удалось
  2. Народу было очень много, я думал, что прийдет всего несколько сотен человек. СМИ говорят о семи тысячах, а я на глаз оценивать не умею
  3. В какой-то момент начались нехорошие движения. За лозунги «Мы не знаем что делать с презиндентом, но мы знаем что делать с царем!!!» надо сажать хотя бы на 15 суток. Нехрен тут
  4. В целом народу было 20-30 лет, были большей частью смешные плакаты.
    rm -rf roskomnadzor
  5. Я стоял в нескольких десятках метров от трибуны, и в какой-то момент я услышал, как толпа заорала. Потом какой-то голос начал бесноваться, и я его узнал — это был алексей навальный. На митинг я пришел только тщательно проверив что этого дегенерата там не будет, поэтому я тут же развернулся и пошел на выход. Идти в обратную сторону было тяжело, но народ был культурный — расступался и пропускал. По моим ощущениям таких как я было процентов 10, к сожалению оценить очень сложно. Но синхронные разговоры с моим продвижением назад про то что сюда пришли за интернет, а не за политику я слышал

Отток людей из-за прихода дегенерата

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

Лучшее в мире селфи. Толпа где-то в километре от меня, я поздно спохватился

Сегодня утром у меня была прострация 2.0, когда я прочитал описание митинга на континенталисте: от Юлии Витязевой, от Potap1956. Что тут сказать, «Это не придурки, это больные люди» (c) мистер Смит, Шматрица. Я давно перестал смотреть и читать политических блоггеров, потому что я соображаю лучше них и делаю внутреннюю аналитику лучше них. Единственное исключение — Анатолий Шарий, которого я практически не смотрю, потому что мне жалко времени, но которому я всецело доверяю, ибо у него идеальная репутация в моем понимании. Что в указанных статьях, что у них в комментариях происходит полная дичь. Люди не понимают чем плохи блокировки. Люди не понимают, что многомиллиардные убытки корпораций из-за роскомпозора будут оплачены из их кармана. Люди не понимают, что любой парень типа меня может поднять свой телеграм (vps + teamspeak) забесплатно менее чем за час. Я ничего не имею против тех, кто не разбирается. Но имею очень многое против тех, кто не разбирается, но толкает всем свое мнение. Не знаешь ситуацию — сиди и помалкивай. В противном случае ты ничем не отличаешься от главного мудака, который выступал вчера перед толпой.