Как стать автором
Обновить
4
0

Программист

Отправить сообщение

Спасибо, залип. Увлекательное чтиво, немного отзывается, хоть и не во всём соглашусь.

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

А клей котам не вредит?

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

Забавно, кстати, что порой это куда проще, чем разобраться, что в очередном UI чем является и как в этот JSON потом подставляется.

Не, насколько я понимаю, шифрованием в этой схеме занимается браузер (либо любое другое приложение), который ходит по httpS, а vless специально не перешифровывает шифрованное повторно, чтобы https over https нельзя было задетектить по соотношению числа нулей и единиц.

Чтобы переключаться (два альтернативных варианта). Можно забить.

UPD: у этого способа обнаружились такие проблемы:

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

  2. Проблемы на некоторых провайдерах (обнаружил, когда был в другом регионе), тогда как напрямую через VPS всё работает — увы, разбираться тогда было некогда, просто ходил напрямую.

  3. Почему-то пару раз не работал телеграм (ios) — уходил в бесконечное обновление каналов, тогда как напрямую через VPS работал. Возможно, что-то на стороне VPN или tg? Твиттер, например, работал при этом.

По поводу статьи
https://pvs-studio.ru/ru/blog/posts/cpp/0391
и совета 35 из неё

Добавляя в enum новую константу, не забываем поправить операторы switch

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

enum InputFormat
{
    InputFormatScalar,
    InputFormatSpectralReflectance,
    InputFormatSpectralIlluminance,
    InputFormatSpectralReflectanceWithAlpha,
    InputFormatSpectralIlluminanceWithAlpha,
    InputFormatEntity,
    LAST_InputFormat = InputFormatEntity
};

А затем около каждого 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" );
std::pair<std::string, int> user = {"M", 25}; // раньше
std::pair user = {"M", 25};                   // C++17

А разве во втором случае мы не получим std::pair<const char*, int>? Это ж как бы не то же самое.

Там в условии:

-100 <= num1, num2 <= 100

С другой стороны, конечно, если int размером в байт, то можно и UB.

Ещё мы просим написать на бумаге пару небольших функций, например "посчитать количество нулевых бит в переменной типа unsigned int". Это сразу очень много говорит о кандидате.

Вот если я на собеседовании (или в мире, где интернет вдруг исчез), то моим решением будет в цикле извлекать каждый бит через побитовое И по маске, сравнивать с нулём и ++n. Но также я помню, что «был какой-то там однострочник, трюк со степенью двойки, правда, не помню, какой» — и без гугления я его может и придумаю/вспомню, но на это уйдёт реально много времени, где-то день. Что это, на ваш взгляд, обо мне скажет? (Мне правда интересно.)

Автор, огромное спасибо за цикл статей!

Хотел бы поделиться ещё тем, как сделать так, чтобы соединение от VPS до сайтов ходило через сторонний VPN.

Hidden text

Таким образом иногда удаётся обходить ограничения самих сайтов, которые понимают, что ваш VPS из компании нежелательной страны, хоть и физически находится в другой стране. Например, у меня при прочих равных через VPS напрямую тикток показывает замороженный русский вариант, а через такую схему — рабочий западный.

Т.е. общая схема будет такая:

  1. От вас в стране с цензурой до заграничного VPS будет продолжать работать XRay с XTLS-Reality (или другой XRay вариант), чтобы скрывать сам факт обхода блокировок.

  2. От вашего заграничного 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.

Даём скрипту права на выполнение:

chmod +x /etc/openvpn/custom.sh

Теперь залезаем в конфиг xray:

nano /opt/xray/config.json

И у outbounds меняем freedom с такого:

{
	"protocol": "freedom",
	"tag": "direct"
},

на такой:

{
	"protocol": "freedom",
	"tag": "vpn",
	"streamSettings": {
		"sockopt": {
			"mark": 2
		}
	}
},

Т.е. все исходящие из 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.

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

Ориентировался на эти инструкции:

Я согласен с посылом статьи, что типы-обёртки — это классно. Но про VerifiedEmailAddress, который наследует EmailAddress, я вообще не понял. Какого типа будет поле email у класса User-то?

  • Если VerifiedEmailAddress, то что если он ещё не Verified?

  • Если EmailAddress, то при использовании всё равно нужно

if( email is VerifiedEmailAddress )

что по сути то же самое, что и

if( email.IsVerified() )
  • Если два поля, то это вообще жесть, да и всё равно вылезает что-то типа

if( verified_email != null )

И у демона (в xray.service) ещё нужно выставить в блоке [Service]

LogLevelMax=4

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

Отныне флешка навсегда будет установлена в свободном USB порту вашего компьютера, до тех пор, пока вы обновите старое железо!
Я ведь правильно понимаю, что эта флешка нужна будет только в момент загрузки? Ну т.е. после загрузки ОС её можно будет спокойно вытащить (до следующей перезагрузки)? Или же к ней в момент работы ОС будут происходить обращения?
Исключение нужно для исключительной ситуации. ИМХО исключительные ситуации имеет смысл оптимизировать тогда, когда оптимизированы все штатные.
Судя по всему, предложенное решение сочетает в себе минусы и от retval в стиле Си, и от плюсовых исключений: и (сравнительно) медленное, и может легко быть проигнорировано. Опять же, если исключение должно лететь уровней на пять вверх, весь код там превратится в лапшу из if'ов и переупаковывания Expected'ов.
С чего бы вдруг я захочу/меня заставят делать х2, если х2 платить мне не будут? Вот если будут, тогда ещё можно подумать.
Другой вариант – внешний по отношению к работе стимул. Мой любимый – ипотека [...]
Оба варианта – внешние. Ты их не выбирал, ожидания изменились сами, а развиваться пришлось тебе, причём – очень быстро.

А как я могу не выбрать ипотеку сам, но при этом её получить?
«Это была все вина Джерри, он был ответственен за большую часть проекта»
Эти интервьюеры натренированы и заточены на то, чтобы идентифицировать дрянных людей и уделяют этому особое внимание.

А если так оно и было? Может коллега Джерри реально косячил со своей частью кода. Или это был Джерри из бизнеса, который развернул требования на 180 градусов незадолго до концов срока. ИМХО ничем не лучше как брать всю вину на себя и рассказывать на собеседовании, как здорово ты всё портил, так и рассказывать, что всё было идеально и ни с какими проблемами не сталкивался.
Про представление перечислимого множества в виде полинома можно почитать Ю. В. Матиясевич, «Диофантовы множества». Там автор приводит конструктивное доказательство, алгоритм, как из математического выражения, описывающего перечислимое множество (язык Я5 в терминологии автора), можно получить полином, его описывающий (язык Я0). Я лично целиком весь этот путь не проделывал, но автор пишет
Такой „перевод" с Я5 на Я0 требует чисто механической, нетворческой работы и в принципе может быть поручен вычислительной машине.

И с виду написано оно очень понятно и здорово, не нужно быть на 100% в теме всех тонкостей.

Во всём этом для меня лично особенно круто то, что для доказательства неразрешимости 10 проблемы Гильберта был проложен мост из математики в информатику, чтобы свести проблему в итоге к проблеме остановки. А ещё, имхо, нам очень повезло, что автор разговаривает на одном с нами языке, т.к. мы можем свободно послушать его лекции об этом всём на ютубе в оригинале.

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность