LINUX.ORG.RU

Сообщения xB3JMJou

 

Бесшовный wifi/mesh для дома из 4х роутеров :)

Добрый день!

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

Схема квартиры.

Смотрел в сторону MikroTik, но провайдер в случае чего не будет заниматься отладкой плюс смущает отсутствие веб морды с простой менюшкой, да и не особо хочется постоянно сидеть что-то крутить, а решения вроде TP-Link Deco не устраивают из-за специфики моих хотелок.

В идеале хотелось бы иметь уже поддержку WiFi-6 (802.11ax).

Что думаете касаемо расположения железа? Как я понимаю благодаря mesh роутеры не должны будут забивать друг друга. Прошу поделиться опытом как лучше всего организовать такую фигню?

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

Ещё нагуглил что для того чтобы была единая WiFi сеть (внешне) - необходимо просто на каждом роутере установить одинаковый SSID и пароль, но я не уверен что это самый оптимальный способ, будут ли устройства оперативно отрубаться от роутера из комнаты 1 и подключаться к роутеру на кухне (допустим)? В общем больше всего меня смущает что из-за большого количества роутеров они будут друг друга перебивать (правда мне никто так и не смог нормально объяснить что это значит), а меньше делать их не хочется, т.к. в каждой комнате требуется хорошее покрытие плюс где-то нужно проводное соединение, в связи с этим ищу способ как их можно адекватно «подружить». Может быть есть вариант накатить OpenWRT на новые роутеры?

Всё оборудование планирую покупать, поэтому можно считать что всё это будет совместимо между собой (один вендор/модель).

Извиняюсь за кашу в голове, по работе вообще не связан с этой темой, вот сижу разбираюсь.

 , , , ,

xB3JMJou
()

xcb получить список вкладок браузера/закрыть определённую

Если кратко что хочу сделать:

  1. есть список регексов, по которым я проверяю можно ли просматривать контент или нет (сильно примитивно, но ладно, сейчас не суть)
  2. раз в n секунд проверяю активное окно (class, title)
  3. если попал под регекс - закрываю вкладку

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

На текущий момент удаётся только закрыть окно целиком, а хотелось бы закрывать именно child окно (конкретную вкладку).

В доках ничего не нашел, мб что-то есть в ewmh? На сколько это возможно в X/X11?

Касаемо того что это легко обходится и тп просьба не писать - это всё очевидно, я пилю прогу просто для себя по фану.

 , ,

xB3JMJou
()

x11 кодировка

Решил написать пет проект, time tracker, просто по фану.

Столкнулся с проблемой кодировки, раньше как-то удавалось обходить.

Проблема заключается в том что в консоли я вижу «кракозябры», подскажите какие изменения я могу внести в код, чтобы кирилица заработала?

Вот пример вывода программы:

konsole
        cmake-build-debug : att : 14s
        cmake-build-debug : zsh : 3s
        home : zsh : 3s


spotify
        Curtis Waters - Stunnin' : 9s
        Joji - Daylight : 8s
        Kino - Ðвезда по имени СолнÑе : 1s
        Kino - ÐаÑка ÑигаÑÐµÑ : 5s
        Kino - ХоÑÑ Ð¿ÐµÑемен : 5s


#include <X11/Xlib.h>
#include <X11/Xmu/WinUtil.h>

#include <iostream>
#include <chrono>
#include <thread>
#include <set>


struct ApplicationInfo
{
	struct TabInfo
	{
		friend bool operator<(const TabInfo& lhs, const TabInfo& rhs)
		{
			return lhs.m_title < rhs.m_title;
		}

		std::string m_title;
		std::chrono::seconds m_total = std::chrono::seconds{0};
	};


	static std::chrono::seconds GetTotal(const ApplicationInfo& windowInfo)
	{
		std::chrono::seconds total = std::chrono::seconds{0};
		for (const auto& tab : windowInfo.m_tabs)
		{
			total += tab.m_total;
		}
		return total;
	}


	friend bool operator<(const ApplicationInfo& lhs, const ApplicationInfo& rhs)
	{
		return lhs.m_name < rhs.m_name;
	}


	std::string m_name;
	std::set<TabInfo> m_tabs;
};


Display* open_display()
{
	return XOpenDisplay(nullptr);
}


std::optional<Window> get_focus_window(Display* pDisplay)
{
	int revert_to = 0;
	Window window;
	XGetInputFocus(pDisplay, &window, &revert_to);
	return window;
}


std::optional<Window> get_top_window(Display* pDisplay, Window start)
{
	Window current = start;
	Window parent = start;
	Window root = None;
	Window* pChildren;
	unsigned int nChildren;
	Status s;

	while (parent != root)
	{
		current = parent;
		s = XQueryTree(pDisplay, current, &root, &parent, &pChildren, &nChildren);

		if (s)
		{
			XFree(pChildren);
		}
	}

	return current;
}


std::optional<Window> get_named_window(Display* pDisplay, Window start)
{
	Window window;
	window = XmuClientWindow(pDisplay, start);
	return window;
}


std::optional<std::string> get_window_name(Display* pDisplay, Window window)
{
	XTextProperty prop;

	auto status = XGetWMName(pDisplay, window, &prop); // see man
	int count = 0, result;
	char** list = nullptr;

	Xutf8TextPropertyToTextList(pDisplay, &prop, &list, &count);
	return list[0];
}


std::optional<std::string> get_window_application(Display* d, Window w)
{
	auto x = XAllocClassHint();
	auto status = XGetClassHint(d, w, x);
	return x->res_name;
}


std::pair<std::string, std::string> get_window_info(Display* d, Window w)
{
	return {*get_window_application(d, w), *get_window_name(d, w)};
}


std::optional<std::pair<std::string, std::string>> get_active_window_info()
{
	auto pDisplay = open_display();

	auto window = get_focus_window(pDisplay);

	window = get_top_window(pDisplay, *window);
	window = get_named_window(pDisplay, *window);

	return get_window_info(pDisplay, *window);
}


int main()
{
	setlocale(LC_ALL, "");
	std::set<ApplicationInfo> applications;

	ApplicationInfo previous;

	auto find_window = [](const std::string& application_name)
	{
		return [&app_name = application_name](const ApplicationInfo& w) -> bool
		{
			return w.m_name == app_name;
		};
	};

#pragma clang diagnostic push
#pragma ide diagnostic ignored "EndlessLoop"
	while (true)
	{
		auto window_info = get_active_window_info();

		if (window_info)
		{
			auto it = std::find_if(
					std::begin(applications)
					, std::end(applications)
					, find_window(window_info->first));

			if (it == applications.end())
			{
				ApplicationInfo info;
				info.m_name = window_info->first;
				info.m_tabs.emplace(ApplicationInfo::TabInfo{window_info->second});

				applications.emplace(info);
			}
			else
			{
				auto itTab = std::find_if(
						std::begin(it->m_tabs)
						, std::end(it->m_tabs)
						, [&title = window_info->second](const ApplicationInfo::TabInfo& tabInfo)
						{
							return tabInfo.m_title == title;
						});

				if (itTab == it->m_tabs.end())
				{
					it._M_const_cast()->m_tabs.emplace(ApplicationInfo::TabInfo{window_info->second, std::chrono::seconds{1}});
				}
				else
				{
					itTab._M_const_cast()->m_total += std::chrono::seconds{1};
				}
			}
		}

		std::system("clear");

		for (const auto& application : applications)
		{
			std::cout
					<< "\n"
					<< application.m_name;
			for (const auto& tab : application.m_tabs)
			{
				std::cout << "\n\t" << tab.m_title << " : " << tab.m_total.count() << "s";
			}

			std::cout << "\n\n";
		}

		std::this_thread::sleep_for(std::chrono::seconds{1});
	}
#pragma clang diagnostic pop

	return EXIT_SUCCESS;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(att)

set(CMAKE_CXX_STANDARD 20)

find_package(X11 REQUIRED)


set(INCLUDE_DIRECTORIES
        ${X11_Xmu_INCLUDE_PATH}
        ${X11_INCLUDE_DIR}
        )


set(LIBRARIES
        ${X11_Xmu_LIB}
        ${X11_LIBRARIES}
        )

add_executable(att main.cpp)

target_include_directories(att PRIVATE ${INCLUDE_DIRECTORIES})
target_link_libraries(att ${LIBRARIES})

UPD Причём для Brave всё работает нормально:

total time spent: 0 minutes
brave-browser : 29s
        Input/output with files - C++ Tutorials - Brave : 4s
        SQLite Documentation - Brave : 3s
        c++ 20 write to file - Поиск в Google - Brave : 14s
        nomeata/arbtt: arbtt, the automatic rule-based time-tracker - Brave : 2s
        тест тест тест - Поиск в Google - Brave : 6s


konsole : 22s
        cmake-build-debug : att : 15s
        cmake-build-debug : tail : 7s
        cmake-build-debug : zsh : 0s

 , ,

xB3JMJou
()

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