Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как узнать в linux источник исходящего трафика?

Лучший ответ:
netstat -utopa - покажет локальный адрес (имя компьютера) того кто использует сеть НЕ в режиме реального времени.
Скрин

iftop - в режиме реального времени отображает локальный адрес (имя компьютера), какие сайты открыты, сколько данных получено и передано. Установить sudo apt install iftop. Чтобы мониторить только нужный сетевой интерфейс, узнайте название интерфейса через команду ifconfig. Затем введите sudo iftop -i название интерфейса. Наример sudo iftop -i wlk30
Скрин

nethogs - в режиме реального времени покажет какие программы используют сеть и сколько данных они получают или отправляют. Также покажет имя пользователя. Запускать команду надо обязательно через sudo nethogs Установить nethogs sudo apt-get install nethogs
Скрин


Худший ответ:
iptraf, потом ip ss (или netstat, по-стариковски)

Первый в гуе покажет, (в реальном времени), через какие порты валит трафик. Второй покажет соответствие между портами и процессами.
Вопрос: Регулярные выражения в php и js одинаковые?

Лучший ответ:
Похожие по базе, но различаются в деталях. Даже в рамках PHP в зависимости от версии разные диалекты регулярных выражений. Так, в PHP 7.3 сменили PCRE на PCRE2. Различия вкратце разобраны на SO https://stackoverflow.com/questions/70273084/regex...

Для большинства задач эти детали легко проверить в конструкторах регулярных выражений, например https://regex101.com/

Худший ответ:
Разные. Тут можете найти все отличия: https://gist.github.com/CMCDragonkai/6c933f4a7d713...
Вопрос: Какие отличие между значимыми и ссылочными типами? Зачем придумали такое разделение? Нельзя было придумать только либо значимые либо ссылочные?

Лучший ответ:
Все хранить в стеке невозможно для обычных программ.
Все хранить в куче реально (достаточно упаковывать все valued-переменные), но очень и очень не оптимально. Работа со стеком гораздо быстрее, для работы с ним есть  специализированные регистры процессора, а для того чтобы обратится к участку произвольной памяти компьютера даже на низком уровне надо сделать много операций. И очищается стек моментально, никаких сборщиков мусора не нужно.

Худший ответ:
ответ кроется в самой сущности. Сохранить переменную byte, int, double word или адресс - для этого понадобиться всего-то навсего байт, два байта, ну или столько, сколько на сегодня актуально - например 8 байтов (64 Bit). 
Это всегда более менее легко организовать. Например тот-же int array с его элементами. Они все чинно лежат друг за другом. Если идёт разговор о сложных структурах, начиная со string, то там уже проще сохранять и организовывать адресса для тех мест, где на самом деле лежат эти структуры. 

И всё - нет никакого злого умысла или тупости. Всё сделано для простоты организации всех этих вещей и легкости справлятся с такими задачами, как создавание переменных/обьектов, их видоизменения и удаления.

Так-же как и с Carbadge Collection. Тратить время на "точное" удаление обьектов из памяти во время работы программы  - свою программу не уважать. Но здесь распределение действий, а в вашем вопросе распределение мест.
Вопрос: Как спарсить подобный сайт?

Лучший ответ:
Как спарсить подобный сайт?Подобный чему?

Сайт может блокировать аккаунты на несколько часов, что и происходит примерно через 30 минут парсинга.Что за операции, что вам не хватает 30 минут?

Сначала пробовал работать через api сайта.Демонстрируйте код. 

Логинился в селениуме, получал заголовки и делал запросы на нужную мне информациюТак через api или селениум, вы определитесь.

Можно ли попытаться выдать селениум хром за сафари на iPhone, и есть ли вообще в этом смысл?Вы сами пишите что парсинг возможен только из под аккаунта и блочится аккаунт. Очевидно сайту все равно сколько устройств вы имитируете, если аккаунт один и тот же.

Худший ответ:
Заказчик сказал что все эти действия он проводит вручную через safari на iPhone в течении дня и не получает блокировки аккаунта (или получает но сильно реже).скорее всего сайт анализирует статистику действий пользователей, все нетипичные профили переносит в разряд - забанить если через пол часа не прекратит

если все остальные способы точно не являются причиной (разные ip и профили браузеров, там не только куки, слепком пользователя может являться наличие данных в кеше, или не полностью симулируется вызов api или к примеру совершается переход на страницу, на которую пользователь ну никак не смог бы перейти, кроме как вбить адрес или через отладочную консоль и т.п.) то будет грустно, поведенческий анализ самый 'надежный' в плане защиты от автоматизации и самый сложный в реализации.

Сначала нужно понять, в какой момент и по какой причине при ручной работе с сайтом происходит бан, без этого никуда, могу посоветовать собирать полную статистику своего поведения и делать множество попыток (посадить несколько человек на это дело и пусть они по разному работают с сайтом), затем, получив набор данных, искать кореляции, используя в качестве параметров - интервалы между операциями, разделив по группам (типам и действиям по сути самого сайта).

Существуют примеры, когда в качестве источника информации о поведении пользователя используются движения мыши, банально карту вероятности нахождения курсора, если есть тупые повторы действий добавив рандом, на ней будут красивые яркие дорожки, когда как пользователь более хаотичен
Вопрос: Будет ли большой std::vector быстрее, чем std::vectorstd::vector?

Лучший ответ:
Да. Потому что локальность памяти и меньше разыменовываний.

в vector<vector> это фактически указатель на массив указателей. Строки раскиданны по памяти как попало и при обращении к ячейке будет лишнее обращение к памяти, чтобы получить адрес строки.

Если же вы этот двумерный массив линеаризируете и будете сами вычислять индекс, то, во-первых, все будет локально и последовательное чтение массива по строкам будет очень дружественно кешу процессора, во-вторых, вместо двух сложений и двух обращений к памяти будет умножение, два сложения и одно чтение из памяти.  А умножить два числа будет всяко быстрее чтения из памяти.

Худший ответ:
Да, будет.
Вопрос: Какую технологию выбрать для работы с базой данных?

Лучший ответ:
Конкретный ответ на ваш вопрос в данной формулировке дать нельзя. Многое зависит от структуры БД, от сценариев работы с ней, интенсивности запросов, соотношения запросов на чтение к запросам на запись и т.д. и т.п. Вероятнее всего, это вопрос не к СУБД, а к архитектуре вашего приложения. В целом, у меня в одном из проектов запросы на чтение по индексу из таблицы с 23 миллиардами записей укладывались в десятки миллисекунд при стандартных настройках и не особо мощном сервере.

Худший ответ:
Попробуйте одну из TSDB, как указал Владимир Куц .

В частности, хранилище VictoriaMetrics. В качестве языка запросов применяется PromQL.
Возможность использования в качестве долговременного хранилища данных, подключенного к Prometheus и Grafana.
Что касается преимуществ по отношению с другими, то сходите по ссылке выше.
Вопрос: VK API: как на php, автоматически вытягивать версию api?

Лучший ответ:
версия api не просто так меняется. там могут измениться параметры как запроса так и ответа. вытягивание версии api твою программу за тебя не переделает под новое api.
p.s. просто вынеси версию в какой-нить .env и обновляйся вручную в одном месте со всеми тестами и проверками, что все работает правильно и ничего не упало.

Худший ответ:
обновления можно найти тут https://dev.vk.com/reference/versions , тебе нужно сохранять последнюю минорную версию api и проверять наличие страницы новой версии 
if (@get_headers("https://dev.vk.com/reference/version/5.{++$minorVersion}")) {
    // сохраняем новое значение $minorVersion
}
Вопрос: Как сделать чтобы только один из установленных браузеров ходил через vpn?

Лучший ответ:
Как-то так
По ссылке: нужно создать сетевой namespace, в него пихнуть vpn-адаптер и браузер, который надо, чтобы ходил в впн, а остальных оставить в default.

Худший ответ:
Я сделал проще. В firefox настройках прописал нужный прокси, остальные по умолчанию оставил.
Вопрос: Хочу узнать мнение программистов о моем первом проекте?

Лучший ответ:
Если бы мне показали такой проект в качестве портфолио, у меня бы сразу возникло несколько вопросов:
1) Зачем препроцессоры (sass и pug) в проекте если Вы не используете их возможности? Только ради другого синтаксиса?
2) Зачем в репозитории лежит вендорный код, особенно сжатый?
3) Почему в проекте нет линтера (например eslint) и как следствие нет единого стиля кода?
4) в git один единственный коммит? Вы правда все это выдали на одном дыхании?
5) Что делает эта регулярка? И почему именно эти символы вводить нельзя, а например 非常糟糕的符号 вполне можно?

Худший ответ:
Самое первое что бросается в глаза - не настроен .gitignore, т.к. есть sass и css. Это говорит о большем: нет понимания о какой либо структуре проекта, не различаете прод от дев версии, т.к. не настроен сборщик. 

Верстка - ужасно. Такое сегодня выдавать не стоит. 

Совет: изучите html/css -> sass/scss -> bem (качественная верстка начинается отсюда) -> js -> gulp
Вопрос: Есть ли готовые решения для контроля уровня CO2 в помещении?

Лучший ответ:
Есть штука под названием бризер

https://habr.com/ru/post/482352/
https://habr.com/ru/company/tion/blog/

И да, если что, обычный кондиционер нисколько не "проветривает", а просто гоняет воздух внутри помещения

Худший ответ:
Как люди жили до изобретения датчика CO2?
Вентиляцию надо нормальную сделать и все.
Тогда нет необходимости проветривать.
А CO2 измерять смысла нет.

Решил купить кондиционер, который бы сам проветривал помещение при превышении CO2, но с удивлением не обнаружил ничего подобного в магазинах. Решил купить миксер и с удивлением обнаружил что нет миксеров умеющих мыть посуду?
Какое вообще кондиционер может иметь отношение к проветриванию???
Проветривание это приток свежего воздуха.
А задача кондиционера это регулировка температуры путем охлаждения воздуха.
Вопрос: Как сделать сумму по столбцам VLOOKUP и ARRAYFORMULA?

Лучший ответ:
Пример в Таблице https://docs.google.com/spreadsheets/d/1e0VSaibZAp...

============= Обновлено 2022-08-03 ==========

Решение для бесконечных диапазонов

=ARRAYFORMULA(VLOOKUP(
  R5:R;
  QUERY(
    SPLIT(FLATTEN(A5:A & "|" & B5:D);"|");
    "select Col1, sum(Col2) group by Col1");
  2;
))



=============  ==========

Можно использовать формулу построчной суммы

={A4:A7\{"Сумма";INDEX(
  {TRANSPOSE(QUERY(
    {TRANSPOSE(B5:E7)};
    "select " & "sum(Col" & JOIN("), sum(Col"; SEQUENCE(1;ROWS(A5:A7);1;1)) & ")";
    0))}
  ;;2
)}}

К сожалению, она требует конечных диапазонов, но настройка несложная.


Только вычисления, без формирования заголовков результата, данные отсортированы как в исходнике

={INDEX(
  {TRANSPOSE(QUERY(
    {TRANSPOSE(B5:E7)};
    "select " & "sum(Col" & JOIN("), sum(Col"; SEQUENCE(1;ROWS(A5:A7);1;1)) & ")";
    0))}
  ;;2
)}


Худший ответ:
Исправь формулу в ячейке G5:
=ARRAYFORMULA(SUM(VLOOKUP(F5;$A$5:D;{2;3;4};0)))

Затем протягиваешь ячейку вниз чтобы скопировалась формула.
Вопрос: PHP скрипт, запущенный кроном, не может писать в файл, созданный PHP скриптом, запущенным из браузера. Как победить?

Лучший ответ:
Прописать команде крона того же юзера (скорее всего, www-data), что и у веб-сервера.

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

Нашелся такой костыль - оказывается в данной панели крон есть не только под юзерскими аккаунтами, но и под главным админским аккаунтом (рутом) и php скрипты, запущенные из этого крона, имеют все нужные права ко всем файлам и делают все, что надо.

Понятно, что это тоже "костыль", но лучше, чем ничего.
Вопрос: Ngixn как блокировать подобные запросы /?[a-z]{9}?

Лучший ответ:
/path?query
location работает только с /path, а GET параметры следует искать в $args.
Или $request_uri там URI запроса целиком (с аргументами)
if ($request_uri ~ "/\?[a-z]{9}") {
    return 403;
}

Худший ответ:
а это

https://stackoverflow.com/questions/59846238/guide...
Вопрос: Стоит ли закончить непрофильное образование для иммиграции как разработчик?

Лучший ответ:
Для эмиграции по blue card в некоторые страны достаточно опыт работы. Но бывает что высшее требуется, в том числе для получения просто вида на жительство. 
Вообщем высшее для нормальной эмиграции нужно.
И самый нормальный вариант получить это высшее за границей. Голову не придется ломать как визу получать так как студенту ВНЖ дают.
В Чехии были какие то нормальные варианты.

Худший ответ:
В приличной компании в Канаде обязательно спросят об образовании. Далее - наличие оного также идёт в плюс к дальнейшей иммиграции. Но:
Высшее образование, полученное в ex-Совке вызывает любопытство и смех.  Лучше не афишировать, тем более такую экзотику, как незаконченное (unfinished) образование мозгоправа. И потом термин "незаконченное" значит "поучилась пару-тройку месяцев и бросила/выгнали/надоело/кончились деньги" - содержит в себе негативный окрас. А нужен позитив!
Или есть ещё фишка, когда Зина едет в Англию на папины деньги чтобы изучать "историю развития моды в Конго в 60-х годах ХХ века" в течении пары-тройки лет, а потом всем звонит, что она изучала Историю в Английском Универе., так вот такая штука не пройдёт 100-пудово.
В крупных компаниях все вкусные места заняты + там бывает сложна внутренняя обстановка (я работал в Телекоме - ужас!), зато всем остальным фиолетово какой у вас диплом - они сразу видят специалиста: в фронтэнд разработке не смухлюешь )
Ещё есть противный нюанс - это возраст - чем моложе тем лучше, и супруг/га - лучше без. Всё остальное смотрят в Вашем LinkedIn - прямо сразу открывают. 
Удачи! + ничего нет невозможного
Вопрос: На какую вилку можно рассчитывать Java(Spring) разработчиком в Москве?

Лучший ответ:
Они не только на HH расплывчатые, но и в жизни. Даже в одной компании один спринговый мидл может получать 120, а другой 300. Что уж говорить о разных.

Худший ответ:
На то она и вилка чтобы быть расплывчатой.
Я ориентируюсь на канал @jvmjobs (в телеге).
Вопрос: Как исправить ошибку при отправки почты?

Лучший ответ:
В ошибке написано, что сервер получателя - проверяет каждого отправителя на вашем сервере. 
Причины:
* нет МХ записи с вашего домена
* порт 25 закрыт фаерволом
* отправитель  отсутствует при попытке инициировать envelope часть smtp на ваш сервер и отправить письмо отправителю.

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

Худший ответ:
проверить реквизиты
Вопрос: Как правильно сделать бекап всей системы Linux?

Лучший ответ:
Veeam Agent
https://www.veeam.com/ru/linux-backup-free.html
Для решения проблем с различным железом проще всего виртуализировать

Худший ответ:
Я пользуюсь fsarchiver. Есть также его GUI вариация, в том числе в виде LiveCD - qt-fsarchiver. Есть также неплохой клиент-серверный вариант - UrBackup
Вопрос: Теги в карточке товара?

Лучший ответ:
На поиск влияют, но если не ошибаюсь, если гугл такое заметит, то сайту долго не жить в поисковике (поисковый спам)

Худший ответ:
Конечно влияют не просто же так их там разместили
Вопрос: Возможно ли измененить дефолтную конфигурацию Mikrotik на свою?

Лучший ответ:
Специально для этого придумали Branding package - пакет, похожий на остальные компоненты RouterOS, не удаляющийся при обычном ресете и включаящий в себя в том числе и дефолтный конфиг
https://help.mikrotik.com/docs/display/ROS/Branding

Худший ответ:
Попробуй чере 

/system default-configuration script
Вопрос: Javascript: Нужно ли использовать; в конце строк?

Лучший ответ:
В целом, определяется стайлгайдом, который вы используете.
Но есть случаи, когда ставить обязательно, например, если на следующей строке деструктуризация массива.
foo = bar + baz
[bat] = biz

Худший ответ:
Нет, совсем не обязательно. Некоторые ставят, чтобы не отучится от этой привычки, ведь например в том же PHP она обязательна.
Вопрос: Из 16 Гб ОЗУ 7, что делать?

Лучший ответ:
Народ, не надо тупить. Встроенная графика, память берется из оперативки. Соответственно 8 гиг откушено на потребности видюхи.

Худший ответ:
Ставить линукс с i3
Вопрос: Как верстаются подобные векторные изображения?

Лучший ответ:
Я так понимаю это фигма. Сохраните именно видимую часть в svg и вставьте через before как фон, и добавьте pointer-events: none;

Худший ответ:
Никак. Векторные изображения, остаются векторными изображениями.
Вопрос: Как можно упростить этот java код?

Лучший ответ:
Не использовать в продакшене.  ̶Е̶с̶т̶ь̶ ̶ш̶а̶н̶с̶ ̶ч̶т̶о̶ ̶в̶а̶с̶ ̶п̶о̶б̶ь̶ю̶т̶.̶

public class Main {
    public static void main(String[] args) throws Exception {
        String inputFile = "", outputFile = "";
        String res = Files.lines(Paths.get(inputFile))
                .map(line -> new int[]{
                        Integer.parseInt(line.split(" ")[0]),
                        Integer.parseInt(line.split(" ")[1])}
                ).reduce((identity, accumulator) -> new int[]{
                        identity[0] + accumulator[0],
                        identity[1] + accumulator[1]
                }).map(resArr -> {
                    if (resArr[0] > resArr[1]) return "1";
                    if (resArr[0] < resArr[1]) return "2";
                    return "DRAW";
                }).get();

        PrintWriter printWriter = new PrintWriter(outputFile);
        printWriter.write(res);
        printWriter.close();
    }
}

Худший ответ:
Добрый день. А можно ли узнать вашу конечную цель? Что вы пытаетесь реализовать? 
Код действительно можно сократить, а то и лучше улучшить восприятие.
1) создайте 2 метода, первый из которых будет читать файл, а второй писать в файл. Можно воспользоваться возможностями класса Files из Java 8
2) 
String match1 = sc.nextLine();
        String match2 = sc.nextLine();
        String match3 = sc.nextLine();
        String match4 = sc.nextLine();
        
        String scMatch1[] = match1.split(" ");
        String scMatch2[] = match2.split(" ");
        String scMatch3[] = match3.split(" ");
        String scMatch4[] = match4.split(" ");

        int a1 = Integer.parseInt(scMatch1[0]);
        int a2 = Integer.parseInt(scMatch2[0]);
        int a3 = Integer.parseInt(scMatch3[0]);
        int a4 = Integer.parseInt(scMatch4[0]);

        int b1 = Integer.parseInt(scMatch1[1]);
        int b2 = Integer.parseInt(scMatch2[1]);
        int b3 = Integer.parseInt(scMatch3[1]);
        int b4 = Integer.parseInt(scMatch4[1]);
тут происходит что-то странное. Скорее всего тут есть ошибка.
Вы сперва читаете строку, затем разделяете ее пробелом в массив строк, но потом почему-то присваиваете a1, а2. а3. а4 одно и то же число.
int a1 = Integer.parseInt(scMatch1[0]);
        int a2 = Integer.parseInt(scMatch2[0]);
        int a3 = Integer.parseInt(scMatch3[0]);
        int a4 = Integer.parseInt(scMatch4[0]);
скорее всего должно быть так:
int a1 = Integer.parseInt(scMatch1[0]);
        int a2 = Integer.parseInt(scMatch2[1]);
        int a3 = Integer.parseInt(scMatch3[2]);
        int a4 = Integer.parseInt(scMatch4[3]);
Такая же ситуация с перемеными b1, b2, b3, b4.
А что если человек введет не 4 элемента через пробел, а 5 и более? Или наоборот менее 4-х элементов?

Подобные выражения a1+a2+a3+a4 > b1+b2+b3+b4 с точки зрения clean code можно вынести в отдельную переменную типа boolean.
Например, boolean isSumAGreaterThanSumB = a1+a2+a3+a4 > b1+b2+b3+b4;
Ну а далее if (isSumAGreaterThanSumB ) { ... }
Вопрос: Какой язык выбрать для автоматизированного тестирования?

Лучший ответ:
На самом деле совет выбирать тот язык, на котором пишет команда - ни разу себя не оправдал. Тестировщики все равно не получают никакой помощи от разработчиков и вынуждены делать все сами.

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

Худший ответ:
Дайтие пожалуйста толковый ответ, 
Учи несколько инструментов. И JS и python, и java все они отлично подходят для "тестировки".
Вопрос: Какие книги по C++ актуальны на 21 год для обучения с нуля?

Лучший ответ:
Для начала берите любую книгу для начинающих. Лафоре подойдет. Берите издание по свежее. Есть и другие книги подобного рода, конечно. 
Страуструп тяжел и не годится для старта.
Саттер, Мейерс больше для продвинутых. 
C++ Templates для старта точно не нужен.
Так же не плохо было бы начать что-то читать по алгоритмам.

Сейчас проблема с изучением С++ в том, что с 2011 года начали регулярно появляться новые стандарты, в них появляются фишки, которых раньше не было, некоторые из них очень полезные. Толстые учебники не успевают переписываться под актуальные стандарты. Но это не большая беда. 
Базовым сейчас является стандарт С++11 (или С++14 - это дополнение к С++11), его применяют уже многие. Более поздние (17, 20) применяются реже, так что можно не гнаться за тем, чтобы в книге они были освещены. Базовые понятия в С++ в целом мало изменились с древних времен. Но кое-что добавилось.
Кстати, проблема с поддержкой новых стандартов актуальна не только для книг, но и для компиляторов языка.
После освоения базы и начала практической деятельности сможете дальше продвигаться в изучении языка, ориентируясь на свои реальные потребности.
Главное в изучении - больше практики - не зацикливайтесь на книгах. В начале старайтесь делать задания из книг. Когда более-менее освоитесь, переходите к своим задачам/интересам.

Худший ответ:
https://ravesli.com/ -
https://www.youtube.com/watch?v=kRcbYLK3OnQ&list=P...
Это не книги, но вполне хороший материал
Вопрос: Как производить переиндексацию в таблице SQLite?

Лучший ответ:
Во-первых, индексация - это не то, что вы описали. Во-вторых, смысл идентификаторов как раз в том, чтобы они никогда не менялись.

Худший ответ:
В ответах все правильно сказали, но не дали собственно решения, вот оно:
заведи поле num, в котором будет размещаться порядковый номер записи, при запросе записей делай group by num

при каких то модификациях порядка (удаление или например вставка в середину порядка записи) делай номер с половинкой (например вставить запись между 3 и 4, то num пусть будет 3.5) и обновляй порядок
update table set
num = ROW_NUMBER () OVER ( ORDER BY num ) RowNum
...

кстати вместо половинчатых номеров можно сначала сдвинуть все номера больше нужного (например вставить 3-им, добавляешь условие where num>3 а потом вставлять.
Вопрос: Как сменить пароль на СУБД не прерывая работу приложения-клиента?

Лучший ответ:
На хосте1 одной командой (sed -i) меняется пароль в файле настроек, и через точку-с-запятой (;) второй командой (sql-client-tool <cmd.sql) отправляются инструкции SQL-серверу на смену пароля. Время выполнения - микродоли секунды, моргнуть не успеете.

Худший ответ:
надо смотреть  где и как ваша конкретна субд хранит настройки доступа и можно ли их менять не перезапуская сервер. 

в mysql, postgre ничего не надо перезапускать - поменял пароль и сделал flush privileges.
Вопрос: Как разрешить доступ клиенту на OpenVPN server на Windows?

Лучший ответ:
включить NAT
но лучше поднять это на линукс серваке

Худший ответ:
В настройках внешней сети на вкладке Доступ нужно разрешить подключение
Вопрос: Какие русские платежные системы принимают платежи с Америки и ЕС?

Лучший ответ:
Никакие. Так как ограничение на платежи установлено самими платежными системами - VISA и MC. Никакой сервис не может принимать платежи, если их не позволяет сама платежная система

Худший ответ:
Да, у фрилансеров наступили тяжелые времена :) Куда ни кинь - придется идти в ненавистный офис :DDD