LINUX.ORG.RU

Сообщения elonmusk

 

Продам сервер

Приветствую.

Технические характеристики:

  • 16 GB RAM (можно добавить, есть много слотов)
  • 1 TB Disk
  • Intel(R) Xeon(R) CPU E5-2407 0 @ 2.20GHz
  • Спеки: specs

Сервер полностью в рабочем состоянии, использовался 3 года, за это время поломок не было.

Фото:

  • Внешний вид: 1, 2, 3
  • Некоторые показатели здоровья: 4

Стоимость: 75 000 ₽, возможен разумный торг, доставка в ваш город за ваш счёт.

Можете спрашивать о вещи, на вопросы отвечу. Связаться лично можно в тг: tg

 ,

elonmusk
()

Помогите найти ошибку в настройке сети

Как у меня настроена сеть:

  • К роутеру подключаюсь через wifi. Это ОС-хост.
  • В virtualbox стоит ОС-гость, в ней сеть настроена как мост до интерфейса в ОС-хосте.

Проблема в ОС-госте. Первый запрос на любой адрес из интернета, например на google.com, выполняется очень долго (засекал: 1 минуту 3 секунды), а потом уже быстро (менее секунды). Спустя некоторое время опять долго (6 секунд, 58 секунд).

Сеть настроена с помощью systemd-networkd и systemd-resolved. Единственный конфиг, который я написал:

# /etc/systemd/network/network.network
[Match]
Name=enp0s3

[Network]
Address=10.0.0.20/24
Gateway=10.0.0.1
DNS=8.8.8.8
DNS=8.8.4.4

В логах systemd-networkd ничего интересного, а в systemd-resolved кое-что есть:

Это всё что было в логах до очередного долгого запроса:

Jul 5 14:01:59: Using degraded feature set (UDP+EDNS0+DO) for DNS server 8.8.8.8.
Jul 5 14:02:04: Using degraded feature set (UDP+EDNS0+DO) for DNS server 8.8.4.4.
Jul 5 14:02:30: Using degraded feature set (TLS+EDNS0) for DNS server 8.8.8.8.
Jul 5 14:02:30: Server 8.8.8.8 does not support DNSSEC, downgrading to non-DNSSEC mode.
Jul 5 14:14:03: Grace period over, resuming full feature set (UDP+EDNS0+DO+LARGE) for DNS server 8.8.8.8.
Jul 5 14:14:08: Using degraded feature set (TLS+EDNS0) for DNS server 8.8.4.4.
Jul 5 14:14:08: Server 8.8.4.4 does not support DNSSEC, downgrading to non-DNSSEC mode.

Потом я выполняю запрос на google.com, жду 58 секунд, смотрю в логи и вижу новые записи:

Jul 5 14:22:10: Grace period over, resuming full feature set (UDP+EDNS0+DO+LARGE) for DNS server 8.8.4.4.
Jul 5 14:22:36: Using degraded feature set (UDP+EDNS0+DO) for DNS server 8.8.8.8.
Jul 5 14:22:42: Using degraded feature set (UDP+EDNS0+DO) for DNS server 8.8.4.4.
Jul 5 14:23:08: Using degraded feature set (TLS+EDNS0) for DNS server 8.8.8.8.

Если посчитать время между первой и последней записью, то получится ровно 58 секунд.

Значит, у меня есть ошибки в настройке DNS или резолвера. Помогите решить проблему.

 ,

elonmusk
()

Почему в XFCE и i3 эти глюки есть, а в GNOME нет?

На экране при скроллинге браузера появляются следующие глюки: видео на google drive (если на видео шакалы, его можно скачать, тогда будет видно чётко) и скриншот

Похоже на какие-то задержки в отрисовке.

Самый интересный вопрос — почему это есть только в XFCE и i3, а в GNOME всё нормально? В GNOME также используются иксы, не вейланд.

Ядро, иксы, весь софт — всё из арча.

Видеокарта — какая-то AMD или ATI. Дрова никакие не ставил, ничего не настраивал.

Это чисто спортивный интерес. [s]Интересует то, что, похоже, GNOME — топ, а XFCE и i3 (только их тестил) — УГ.[/s]

Ответы: 1 2

 , , , ,

elonmusk
()

Возврат ошибки с контекстом в C

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

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

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

Есть, например, функция, которая работает с файлами. Попробуем в случае ошибки завершить работу программы:

void
kill_running_instance
        (char *pid_file)
{
        FILE *f = fopen(pid_file, "r");
        if (f == NULL) {
                fprintf(stderr, "can not open file for reading: %s: %s\n", pid_file, strerror(errno));
                exit(1);
        }
        ....
}

Проблема в том, что так мы не сможем вызвать код очистки. Попробуем исправить функцию:

void
kill_running_instance
        (bool *ok, char *pid_file)
{
        // reset error
        *ok = true;

        FILE *f = fopen(pid_file, "r");

        // indicate error
        if (f == NULL) {
                *ok = false;
                return;
        }

        ....
}

Так мы сможем извне узнать — функция нормально выполнила свою работу или что-то пошло неправильно.

Здесь появляется главная проблема. Как узнать что конкретно пошло неправильно? Хотя бы для того чтобы записать ошибку в лог и в консоль:

bool *ok;
if (kill_running_instance(&ok, pid_file), !ok) {
        // how can we find out what went wrong?
}

Это произошла ошибка открытия файла или ошибка чтения? Узнать это невозможно.

Небольшая заметка: посмотреть в errno не получится. Эта переменная используется для уточнения ошибки, а не полного описания ошибки. Например, strerror(errno) скажет Permission denied, а как извне узнать к чему это ошибка относится — всё ещё неизвестно.

Чтобы решить эту проблему, я придумал возвращать не bool *ok, а сообщение об ошибке и тип ошибки. Выглядит вот так:

void
kill_running_instance
        (struct error *e, char *pid_file)
{
        FILE *f = fopen(pid_file, "r");
        if (f == NULL) {
                ERROR_SET(e, SYSTEM, "can not open file for reading: %s: %s", pid_file, strerror(errno));
                return;
        }
        ....
}

....

struct error e;
INIT_ERROR(&e);
if (kill_running_instance(&e, pid_file), e.type != UNSET) {
        print_error(&e);
        deinit_error(&e);
        goto cleanup;
}

Контекст ошибки нам известен извне. Мы можем вывести её в консоль, в лог, отправить по почте, etc. Конечная цель выполнена!

Кстати, благодаря макросам известны имя файла и номер линии где был вызван ERROR_SET.

error определён так:

enum error_type {
        UNSET,

        /*
                Standard library function fails
        */
        SYSTEM,
};

struct error {
        enum error_type type;
        char *msg;
        char *filename;
        size_t line;
        bool is_set;
};

INIT_ERROR присваивает структуре дефолтные значения.

ERROR_SET раскрывает функцию, которая присваивает ошибке тип, сообщение, имя файла и номер линии где возникла ошибка. Стринги копируются, всё норм.

Теперь, собственно, вопросы.

  1. Много ли Open Source проектов, где работа с ошибками организована похожим образом? Буду благодарен, если покажете.

  2. Если в Open Source проектах с ошибками работают по-другому, значит, логично, они считают свой способ лучше моего. Можете показать как по-другому работают с ошибками и объяснить почему эти способы лучше моего?

  3. Буду благодарен, если подскажите какие есть риски и недостатки в моём методе работы с ошибками.

Заранее спасибо.

 

elonmusk
()

Какой программы под Linux вам не хватает?

Хочется найти полезные идеи для создания ПО.

Какого ПО на Linux нет и, по вашему мнению, появление такого ПО будет полезно многим людям?

Если кто-то знает свежие проекты, которые создают нечто подобное, буду благодарен, если дадите наводку.

Также буду благодарен, если скажете «хочу в $ПО_нейм иметь фичу $Х».

С другой стороны, ответы «хочу порт Photoshop» не считаются интересными. Графические редакторы уже имеются под Linux, проблема в изучении нового инструмента и числе отсутствующих фич.

 , ,

elonmusk
()

Подскажите как писать код на C

У меня есть несколько проблем, из-за которых я не знаю как можно создать свой проект.

  • Как мне использовать key-value структуру данных? В других языках используется библиотека (Java) или встроенная реализация (Go). А что используют в проектах, написанных на C?
  • Как в проектах на C узнают длину массива, переданного как аргумент? Я знаю, что массивы передаются как указатели, а указать длину данных за указателем - невозможно. Нужно всегда передавать длину как аргумент? Я также понимаю, что можно создавать свои структуры, состоящие из указателя и длины, но как это грамотно сделать, чтобы потом не запутаться в типах и бойлерплейте? Возможно, есть нормальная практика, которой все следуют?
  • Единственный способ иметь в структуре несколько массивов - использовать указатели. Значит, память нужно выделять и очищать вручную. Значит, для работы с такими структурами нужно иметь функции-обёртки. Так все делают для создания нескольких массивов в структуре?

 , ,

elonmusk
()

Объясните как работать с Docker

Я прочитал статьи про то зачем нужен докер, как на нём разворачивать простейшие приложения, но всё ещё не понимаю как я могу его использовать в своём проекте.

Мой стэк — Node.js/Express/TypeScript, MongoDB, RabbitMQ, nginx. Я бы вручную установил ОС, весь стэк, конфигурацию, и общую папку (чтобы не копировать файлы). При необходимости эмулировать продакшн — создал бы ещё один контейнер. Если бы у меня была macOS, то я бы использовал VirtualBox.

Но я до сих пор не понял что мне делать в Docker. Конкретно:

  • Ой. Мой список вопросов закончился :)

Отвеченные вопросы:

  • Мой главный вопрос — что мне вообще делать с вашим докером? Работать как с виртуалкой?
    • Ответ: 1
  • Мне нужно все этапы установки, которые я выполнял при ручном создании контейнера, перенести в Dockerfile/docker-compose?
  • Зачем нужен DockerHub, если можно выбрать ОС и самому установить нужный софт?
    • Ответ: нужно понимать в чём смысл докера, тогда эти вопросы отпадают. Во многих гайдах упускают тот момент, что вы не должны создать единый образ, который содержит всё, а должны все процессы поместить в отдельные контейнеры. Например, приложение на Node.js и сервер MongoDB должны быть в разных контейнерах. В Docker это называется сервисами
  • Я в некоторых Dockerfile видел apt-install — разве это уже не означает, что образ не иммутабелен? Ведь изменится версия библиотеки в репах — изменится и в твоём образе, разве нет?
    • Ответ: 1
  • Я вижу как в очередном Dockerfile пишут FROM php:alpine-666 и чуть ниже RUN apt-install .... Это значит, что используемый образ из DockerHub — Ubuntu-based?
    • Ответ: образы в DockerHub действительно базируются на какой-то ОС. Причём не всегда очевидно на какой.

Спасибо!

 ,

elonmusk
()

Как правильно сделать роутинг без фреймворков в TS?

Я дошёл до этапа, когда у меня есть название контроллера и метода в переменной. Мне нужно используя эти переменные вызвать нужный метод

Контроллеры и методы представлены в следующем виде:

// базровый класс для всех контроллеров
class Controller {}

class Global extends Controller {

    // метод
    doStart(): object {
        return {
            status: 'ok',
            message: 'я работаю, всё ок',
        };
    }
}

Теперь нужно имея переменные controller: string и method: string вызвать нужный мне метод. Я затрудняюсь как. Кто знает — подскажите, пожалуйста :)

[hr]

Я пробовал сохранять методы в key-value массиве, чтобы метод можно было получить по строке. Вот так:

class Global extends Controller {
    _allow_method_list = {
        doStart: this.doStart,
    };
}

Этот это не подходит, потому что в этих методах почему-то нельзя использовать this, а это существенно и вообще знак что я что-то делаю не так.

 , ,

elonmusk
()

Вещественные числа в Go

Вопрос относится к коду. Я написал функцию на Go и на C для вычисления расстояния в метрах между двумя точками. Но на разных языках функция выдаёт разный результат.

Вот код функции на Go:

const earthRadiusM = 6371000

func calculate_distance(lon1, lat1, lon2, lat2 float64) float64 {
	lon_delta := lon2 - lon1

	// convert degrees to radians
	lat1_radians      := lat1 * math.Pi / 180.0
	lat2_radians      := lat2 * math.Pi / 180.0
	lon_delta_radians := lon_delta * math.Pi / 180.0

	return earthRadiusM * math.Acos(math.Sin(lat1_radians) * math.Sin(lat2_radians) + math.Cos(lat1_radians) * math.Cos(lat2_radians) * math.Cos(lon_delta_radians))
}

И на C:

const int EARTH_RADIUS_M = 6371000;

double
calculate_distance
(double lon1, double lat1, double lon2, double lat2)
{
	double lon_delta = lon2 - lon1;

	// convert to radians
	double lat1_radians      = lat1 * M_PI / 180.0;
	double lat2_radians      = lat2 * M_PI / 180.0;
	double lon_delta_radians = lon_delta * M_PI / 180.0;

	return EARTH_RADIUS_M * acos(
		sin(lat1_radians) * sin(lat2_radians) +
		cos(lat1_radians) * cos(lat2_radians) * cos(lon_delta_radians)
	);
}

Вот результат, который они выдают для точек 55.099879, 51.76003 и 55.100524, 51.764685:

$ go run calculate_distance.go 
519.5123039447425
519.5123039447425
$ gcc -lm calculate_distance.c
$ ./a.out 
519.512286164
519.512286164

Почему результат настолько разный? Запускал на x86_64 64-bit. Я проверил на других языках — результат такой же как в C, отличия начинаются после 8 цифры после запятой:

$ php calculate_distance.php 
519.51228616389
519.51228616389
$ node calculate_distance.js 
519.5122861638861
519.5122861638861

Ответ: 1

Полный исходный код: go, c, php, js

 ,

elonmusk
()

bash: отловить ошибку в subshell

Приветствую

Я хочу отлавливать ошибки через trap. Использую следующий код:

( читать дальше... )

 

elonmusk
()

У меня в GNOME не работают настойки языка

Приветствую

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

Проблема в том, что я указал в настройках гнома русский язык, но всё равно остался английский.

Только в календаре на верхней панельке дни недели и месяцы стали отображаться на русском.

Если открыть терминал, то LANG и LC_* заданы значения ru_RU.UTF-8. Но если из под этого же терминала запустить nautilus, то всё будет отображаться на английском.

Я уверен что чего-то не знаю, т.к. даже хромиум не локализирован.

Кто подскажет как можно поставить русский язык отдельному пользователю - буду благодарен :)

Конфиги:

# /etc/locale.gen
en_US.UTF-8 UTF-8
ru_RU.UTF-8 UTF-8
# /etc/locale.conf
LANG=en_US.UTF-8

locale-gen сделан.

 , ,

elonmusk
()

RSS подписка на новые темы