Мне кажется, что в таком случае если выпадашка у QComboBox будет закрыта с отменой (клик мышки вне контрола или по ESC с клавиатуры), то текущим элементом станет тот, который был последним подсвечен, а пользователь обычно ожидает, что в таких ситуациях значение останется прежним.
Сталкивался, увы, вот здесь даже описывал. Печаль, что ссылка на гуглфорум из того комментария уже не ведёт никуда (точнее, хоть и ведёт на тот форум, но треда, похоже, уже нет).
Я когда-то заморачивался с доп.клавишами, пытался вторую клаву подключить, но при этом перебиндить у неё клавиши для команд, но в итоге понял, что я даже мультимедийные клавиши на первичной клавиатуре не использую — так и забил. Но вполне себе могу представить сценарии, когда такое может быть очень удобно. Вообще, физические кнопки — это круто. Вроде бы ещё раньше для этого использовали кассовые клавиатуры (и там нужно было немного поразбираться с настройкой), а потом появились специальные стрим-деки, уже заточенные под это всё из коробки.
Кстати, а нет ли каких-нибудь программ, к которым можно так подключить миди-клавиатуру и обучаться играть? Например, нотной грамоте — сыграть как написано. Или, например, тебе играют мини-мелодию, а ты на слух должен повторить, и программа, считывая миди-ивенты, говорит тебе, где ошибка (длительность, не та клавиша, не та клавиша в аккорде и т.д.), и даёт больше упражнений на это? Вот это было бы огонь, конечно.
С точки зрения теории полином на отрезке прекрасно аппроксимирует синус, т.к. синус бесконечно дифференцируем. Но я подозреваю, что высокая точность потянет высокие степени полинома (почему-то есть ощущение, что нужна степень не ниже пятой), с которыми уже на практике могут быть траблы с переполнением, накоплением ошибки и т.д. Плюс вычисление полинома в точке по схеме Горнера это n именно умножений, а в вышеописанном алгоритме, как я понял, обходятся сдвигами, которые дешевле.
С тем же успехом можно быть нейтивом и не знать локальные мемы в новой команде. Но естественный язык избыточен и в контексте, очень редко к тебе подойдёт незнакомый коллега, скажет "Это большой мотоцикл из тумана синих солнц" и не продолжит, а вопросы задавать нельзя. Поэтому все пробелы либо легко вытаскиваются по контексту, либо особо не стоят того, чтобы их вытаскивать. Мой английский на уровне "полгода в зелёной сове", я понял 100% смысла, если отбросить окраску. Меня больше пугают акценты носителей. Всё имхо.
Не обязательно, но это чуть повысит скрытность. С другой стороны, если домен-донор ноунейм с несколькими пользователями, а не гугл и не майкрософт, то и блокнуть для порядку его менее напряжно при подозрениях.
Не, насколько я понимаю, шифрованием в этой схеме занимается браузер (либо любое другое приложение), который ходит по httpS, а vless специально не перешифровывает шифрованное повторно, чтобы https over https нельзя было задетектить по соотношению числа нулей и единиц.
DNS leak — сервисы определения утечки детектят VPS. Пробовал всякое, но забороть так и не смог, если кто подскажет, буду благодарен.
Проблемы на некоторых провайдерах (обнаружил, когда был в другом регионе), тогда как напрямую через VPS всё работает — увы, разбираться тогда было некогда, просто ходил напрямую.
Почему-то пару раз не работал телеграм (ios) — уходил в бесконечное обновление каналов, тогда как напрямую через VPS работал. Возможно, что-то на стороне VPN или tg? Твиттер, например, работал при этом.
А затем около каждого switch (да и других операций, которые зависят от полного набора enum) приучить себя писать:
static_assert( LAST_InputFormat == 6, "InputFormat has a new value" );
прямо вот так, с магической шестёркой. Когда добавится новая константа в enum, код перестанет компилироваться, пока программист явно не пройдёт все такие места, не поправит их (или просто не окинет взглядом, сломалось что-то или нет) и явно не поменяет шестёрку на семёрку у ассерта.
P.S.: Написал LAST_InputFormat, а не просто LAST, потому что enum, а не enum class. Тот же самый код для enum class:
enum class InputFormat
{
InputFormatScalar,
InputFormatSpectralReflectance,
InputFormatSpectralIlluminance,
InputFormatSpectralReflectanceWithAlpha,
InputFormatSpectralIlluminanceWithAlpha,
InputFormatEntity,
LAST = InputFormatEntity
};
static_assert( static_cast<int>( InputFormat::LAST ) == 6, "InputFormat has a new value" );
Ещё мы просим написать на бумаге пару небольших функций, например "посчитать количество нулевых бит в переменной типа unsigned int". Это сразу очень много говорит о кандидате.
Вот если я на собеседовании (или в мире, где интернет вдруг исчез), то моим решением будет в цикле извлекать каждый бит через побитовое И по маске, сравнивать с нулём и ++n. Но также я помню, что «был какой-то там однострочник, трюк со степенью двойки, правда, не помню, какой» — и без гугления я его может и придумаю/вспомню, но на это уйдёт реально много времени, где-то день. Что это, на ваш взгляд, обо мне скажет? (Мне правда интересно.)
Хотел бы поделиться ещё тем, как сделать так, чтобы соединение от VPS до сайтов ходило через сторонний VPN.
Hidden text
Таким образом иногда удаётся обходить ограничения самих сайтов, которые понимают, что ваш VPS из компании нежелательной страны, хоть и физически находится в другой стране. Например, у меня при прочих равных через VPS напрямую тикток показывает замороженный русский вариант, а через такую схему — рабочий западный.
Т.е. общая схема будет такая:
От вас в стране с цензурой до заграничного VPS будет продолжать работать XRay с XTLS-Reality (или другой XRay вариант), чтобы скрывать сам факт обхода блокировок.
От вашего заграничного VPS трафик будет идти к оплаченному серверу VPN какой-нибудь компании, предоставляющей такие услуги. Он будет идти через обычный OpenVPN шифруясь, но не маскируясь (считаем, что на той территории факт наличия VPN не пытаются вычислять и срубать), таким образом, мы скрываем статичный IP уже нашего VPS, плюс получаем возможность ходить через разные страны. Наш VPS относительно именно VPN будет выступать просто клиентом.
Я буду считать, что у вас настроен VPS по этой статье, но, в принципе, сойдёт любой работающий XRay-конфиг.
Идём на сайт вашего VPN провайдера, логинимся, получаем от них ovpn-файл. Обычно такие файлики дают скачивать, если мы выберем опцию в стиле, что хотим настроить VPN-клиент на роутере, либо на линуксе. Вот, чисто как пример.
Нам потребуется один файлик с одной локацией, через которую будем выходить. Логично взять ту же страну/город, в которой находится ваш VPS, чтобы меньше терять на пинге. Потом можно будет заморочиться с переключением на другие страны, если захотите. Скачиваем нужный ovpn-файл. Если скачали на свою машину, на VPS можно перекинуть по SSH (с винды см. Передача файлов с Windows на Linux Ubuntu по SSH).
Далее все инструкции на VPS. Ставим OpenVPN:
apt update
apt install openvpn -y
Переименовываем ovpn-файл в client.conf и переносим его в папку /etc/openvpn/ Открываем полученный файл на редактирование:
nano /etc/openvpn/client.conf
Находим там строчку
auth-user-pass
и меняем её на
auth-user-pass /etc/openvpn/pass
Создаём файл
nano /etc/openvpn/pass
В нём записываем две строчки:
логин
пароль
Это те логин и пароль, с которыми вы подсоединяетесь к VPN. Защитим их уровнем доступа:
chmod 400 /etc/openvpn/pass
Дальше снова открываем на редактирование файл
nano /etc/openvpn/client.conf
и дописываем в нём в конце файла такие строчки:
# Писать максимум 50 повторяющихся сообщений в логи (чтобы их не засорять)
mute 50
# Не рулить маршрутизацией. ВПН захочет развернуться для всех соединений,
# но это совсем не то, что нам нужно, маршрутизацией мы будем рулить сами.
route-nopull
# Сохранять соединение и переподключаться, если оно прерывается
keepalive 10 60
# Скрипт, который будет выполняться для установленного соединения
# Там мы будем рулить маршрутизацией
up /etc/openvpn/custom.sh
Создаём теперь вышеупомянутый скрипт
nano /etc/openvpn/custom.sh
В нём:
#!/bin/sh
# Таблица 200 пойдёт через tun0 (т.е. через впн)
ip route add default dev tun0 table 200
# Удаляем и добавляем правило, что пакеты, маркированные
# числом 2, будут отброшены
ip rule delete fwmark 2 blackhole
ip rule add fwmark 2 blackhole
# Удаляем и добавляем правило, что пакеты, маркированные
# числом 2, будут отправлены в таблицу 200 (и пойдут через впн).
ip rule delete fwmark 2 table 200
ip rule add fwmark 2 table 200
# Применяем правила
ip route flush cache
Мы получим два правила, которые касаются пакетов, маркированных двойкой, при этом их порядок будет такой, что сначала пакет полетит на впн, а если не получится (впн будет выключен), то пакет не пойдёт никуда. Если отбрасывание не написать, то мы при отсутствии впн будем ходить напрямую с VPS.
Т.е. все исходящие из xray пакеты, которые летят напрямую к сайтам (freedom), будут средствами XRay помечаться как 2, роутингом все пакеты с меткой 2 будут заворачиваться в таблицу 200, а она будет лететь через VPN.
Теперь осталось только запустить клиент OpenVPN как демона:
nano /etc/default/openvpn
Раскаменчиваем # у строчки
AUTOSTART="all"
Дальше регаем демона:
systemctl enable openvpn@client.service
Перегружаем демоны:
systemctl daemon-reload
Стартуем OpenVPN:
service openvpn@client start
И перегружаем xray:
systemctl restart xray
Разумеется, XRay можно настроить и получше, создав себе несколько пользователей, часть из которых будет ходить через VPN (помечая пакеты), а часть напрямую с VPS.
Сам я не настоящий линукс-пользователь, если кто предложит, как это сделать получше, буду только рад.
Ориентировался на эти инструкции:
Как настроить OpenVPN Client на Ubuntu. С этой статьи можно начать, чтобы проверить, что ваше клиентское OpenVPN-соединение вообще ходит нормально (до демонизации, роутинга и связи с XRay).
Я согласен с посылом статьи, что типы-обёртки — это классно. Но про VerifiedEmailAddress, который наследует EmailAddress, я вообще не понял. Какого типа будет поле email у класса User-то?
Если VerifiedEmailAddress, то что если он ещё не Verified?
Если EmailAddress, то при использовании всё равно нужно
if( email is VerifiedEmailAddress )
что по сути то же самое, что и
if( email.IsVerified() )
Если два поля, то это вообще жесть, да и всё равно вылезает что-то типа
Мне кажется, что в таком случае если выпадашка у QComboBox будет закрыта с отменой (клик мышки вне контрола или по ESC с клавиатуры), то текущим элементом станет тот, который был последним подсвечен, а пользователь обычно ожидает, что в таких ситуациях значение останется прежним.
Сталкивался, увы, вот здесь даже описывал. Печаль, что ссылка на гуглфорум из того комментария уже не ведёт никуда (точнее, хоть и ведёт на тот форум, но треда, похоже, уже нет).
Я когда-то заморачивался с доп.клавишами, пытался вторую клаву подключить, но при этом перебиндить у неё клавиши для команд, но в итоге понял, что я даже мультимедийные клавиши на первичной клавиатуре не использую — так и забил. Но вполне себе могу представить сценарии, когда такое может быть очень удобно. Вообще, физические кнопки — это круто. Вроде бы ещё раньше для этого использовали кассовые клавиатуры (и там нужно было немного поразбираться с настройкой), а потом появились специальные стрим-деки, уже заточенные под это всё из коробки.
Кстати, а нет ли каких-нибудь программ, к которым можно так подключить миди-клавиатуру и обучаться играть? Например, нотной грамоте — сыграть как написано. Или, например, тебе играют мини-мелодию, а ты на слух должен повторить, и программа, считывая миди-ивенты, говорит тебе, где ошибка (длительность, не та клавиша, не та клавиша в аккорде и т.д.), и даёт больше упражнений на это? Вот это было бы огонь, конечно.
Правильно питайтесь, занимайтесь спортом и не бухайте. Кто бы мог подумать, лол. Добавлю: не пейте бензин.
По Волкову теории заговора позабористее были, конечно.
С точки зрения теории полином на отрезке прекрасно аппроксимирует синус, т.к. синус бесконечно дифференцируем. Но я подозреваю, что высокая точность потянет высокие степени полинома (почему-то есть ощущение, что нужна степень не ниже пятой), с которыми уже на практике могут быть траблы с переполнением, накоплением ошибки и т.д. Плюс вычисление полинома в точке по схеме Горнера это n именно умножений, а в вышеописанном алгоритме, как я понял, обходятся сдвигами, которые дешевле.
С тем же успехом можно быть нейтивом и не знать локальные мемы в новой команде. Но естественный язык избыточен и в контексте, очень редко к тебе подойдёт незнакомый коллега, скажет "Это большой мотоцикл из тумана синих солнц" и не продолжит, а вопросы задавать нельзя. Поэтому все пробелы либо легко вытаскиваются по контексту, либо особо не стоят того, чтобы их вытаскивать. Мой английский на уровне "полгода в зелёной сове", я понял 100% смысла, если отбросить окраску. Меня больше пугают акценты носителей. Всё имхо.
Именно. Причём высока вероятность, что потом стоимость и сложность резко возрастут.
А клей котам не вредит?
Не обязательно, но это чуть повысит скрытность. С другой стороны, если домен-донор ноунейм с несколькими пользователями, а не гугл и не майкрософт, то и блокнуть для порядку его менее напряжно при подозрениях.
Забавно, кстати, что порой это куда проще, чем разобраться, что в очередном UI чем является и как в этот JSON потом подставляется.
Не, насколько я понимаю, шифрованием в этой схеме занимается браузер (либо любое другое приложение), который ходит по httpS, а vless специально не перешифровывает шифрованное повторно, чтобы https over https нельзя было задетектить по соотношению числа нулей и единиц.
Чтобы переключаться (два альтернативных варианта). Можно забить.
UPD: у этого способа обнаружились такие проблемы:
DNS leak — сервисы определения утечки детектят VPS. Пробовал всякое, но забороть так и не смог, если кто подскажет, буду благодарен.
Проблемы на некоторых провайдерах (обнаружил, когда был в другом регионе), тогда как напрямую через VPS всё работает — увы, разбираться тогда было некогда, просто ходил напрямую.
Почему-то пару раз не работал телеграм (ios) — уходил в бесконечное обновление каналов, тогда как напрямую через VPS работал. Возможно, что-то на стороне VPN или tg? Твиттер, например, работал при этом.
По поводу статьи
https://pvs-studio.ru/ru/blog/posts/cpp/0391
и совета 35 из неё
хочу добавить практический совет, который очень мне помогал. Можно у enum определять последнее значение LAST:
А затем около каждого switch (да и других операций, которые зависят от полного набора enum) приучить себя писать:
прямо вот так, с магической шестёркой. Когда добавится новая константа в enum, код перестанет компилироваться, пока программист явно не пройдёт все такие места, не поправит их (или просто не окинет взглядом, сломалось что-то или нет) и явно не поменяет шестёрку на семёрку у ассерта.
P.S.: Написал LAST_InputFormat, а не просто LAST, потому что enum, а не enum class. Тот же самый код для enum class:
А разве во втором случае мы не получим
std::pair<const char*, int>
? Это ж как бы не то же самое.Там в условии:
С другой стороны, конечно, если int размером в байт, то можно и UB.
Вот если я на собеседовании (или в мире, где интернет вдруг исчез), то моим решением будет в цикле извлекать каждый бит через побитовое И по маске, сравнивать с нулём и ++n. Но также я помню, что «был какой-то там однострочник, трюк со степенью двойки, правда, не помню, какой» — и без гугления я его может и придумаю/вспомню, но на это уйдёт реально много времени, где-то день. Что это, на ваш взгляд, обо мне скажет? (Мне правда интересно.)
Автор, огромное спасибо за цикл статей!
Хотел бы поделиться ещё тем, как сделать так, чтобы соединение от VPS до сайтов ходило через сторонний VPN.
Hidden text
Таким образом иногда удаётся обходить ограничения самих сайтов, которые понимают, что ваш VPS из компании нежелательной страны, хоть и физически находится в другой стране. Например, у меня при прочих равных через VPS напрямую тикток показывает замороженный русский вариант, а через такую схему — рабочий западный.
Т.е. общая схема будет такая:
От вас в стране с цензурой до заграничного VPS будет продолжать работать XRay с XTLS-Reality (или другой XRay вариант), чтобы скрывать сам факт обхода блокировок.
От вашего заграничного VPS трафик будет идти к оплаченному серверу VPN какой-нибудь компании, предоставляющей такие услуги. Он будет идти через обычный OpenVPN шифруясь, но не маскируясь (считаем, что на той территории факт наличия VPN не пытаются вычислять и срубать), таким образом, мы скрываем статичный IP уже нашего VPS, плюс получаем возможность ходить через разные страны. Наш VPS относительно именно VPN будет выступать просто клиентом.
Я буду считать, что у вас настроен VPS по этой статье, но, в принципе, сойдёт любой работающий XRay-конфиг.
Идём на сайт вашего VPN провайдера, логинимся, получаем от них ovpn-файл. Обычно такие файлики дают скачивать, если мы выберем опцию в стиле, что хотим настроить VPN-клиент на роутере, либо на линуксе. Вот, чисто как пример.
Нам потребуется один файлик с одной локацией, через которую будем выходить. Логично взять ту же страну/город, в которой находится ваш VPS, чтобы меньше терять на пинге. Потом можно будет заморочиться с переключением на другие страны, если захотите. Скачиваем нужный ovpn-файл. Если скачали на свою машину, на VPS можно перекинуть по SSH (с винды см. Передача файлов с Windows на Linux Ubuntu по SSH).
Далее все инструкции на VPS.
Ставим OpenVPN:
Переименовываем ovpn-файл в client.conf и переносим его в папку /etc/openvpn/
Открываем полученный файл на редактирование:
Находим там строчку
и меняем её на
Создаём файл
В нём записываем две строчки:
Это те логин и пароль, с которыми вы подсоединяетесь к VPN. Защитим их уровнем доступа:
Дальше снова открываем на редактирование файл
и дописываем в нём в конце файла такие строчки:
Создаём теперь вышеупомянутый скрипт
В нём:
Мы получим два правила, которые касаются пакетов, маркированных двойкой, при этом их порядок будет такой, что сначала пакет полетит на впн, а если не получится (впн будет выключен), то пакет не пойдёт никуда. Если отбрасывание не написать, то мы при отсутствии впн будем ходить напрямую с VPS.
Даём скрипту права на выполнение:
Теперь залезаем в конфиг xray:
И у
outbounds
меняемfreedom
с такого:на такой:
Т.е. все исходящие из xray пакеты, которые летят напрямую к сайтам (freedom), будут средствами XRay помечаться как 2, роутингом все пакеты с меткой 2 будут заворачиваться в таблицу 200, а она будет лететь через VPN.
Теперь осталось только запустить клиент OpenVPN как демона:
Раскаменчиваем # у строчки
Дальше регаем демона:
Перегружаем демоны:
Стартуем OpenVPN:
И перегружаем xray:
Разумеется, XRay можно настроить и получше, создав себе несколько пользователей, часть из которых будет ходить через VPN (помечая пакеты), а часть напрямую с VPS.
Сам я не настоящий линукс-пользователь, если кто предложит, как это сделать получше, буду только рад.
Ориентировался на эти инструкции:
Как настроить OpenVPN Client на Ubuntu. С этой статьи можно начать, чтобы проверить, что ваше клиентское OpenVPN-соединение вообще ходит нормально (до демонизации, роутинга и связи с XRay).
OpenVPN на роутере для перенаправления только определённых соединений.
Autostart OpenVPN in systemd (Ubuntu).
XRay StreamSettingsObject
Я согласен с посылом статьи, что типы-обёртки — это классно. Но про
VerifiedEmailAddress
, который наследуетEmailAddress
, я вообще не понял. Какого типа будет полеemail
у классаUser
-то?Если
VerifiedEmailAddress
, то что если он ещё неVerified
?Если
EmailAddress
, то при использовании всё равно нужночто по сути то же самое, что и
Если два поля, то это вообще жесть, да и всё равно вылезает что-то типа