template <class T>
concept Printable = requires(T x) {
std::cout << x;
};
struct Class {
template<Printable Text>
Class& operator<<(const Text& text) {
cout << text << endl;
return *this;
}
template<uint8_t i>
struct Id {
constexpr static uint8_t id = i;
using SpecialPrint = void;
// какие-то элементы класса с методами
};
. . . . .
template <class T>
concept SpecialPrintable = requires {
typename T::SpecialPrint;
};
struct Class {
template<class Text>
Class& operator<<(const Text& text) {
cout << text << endl;
return *this;
}
template <SpecialPrintable Special>
Class& operator<<(const Special& text) {
specialPrint(text);
return *this;
}
template<uint8_t i>
void specialPrint(const Id<i>& text) {
cout << (int)i << endl;
}
};
template<uint8_t i>
struct Id {
constexpr static uint8_t id = i;
using SpecialPrint = void;
// какие-то элементы класса с методами
};
. . . . .
template<class T, class Dummy = void>
struct IsSpecPrintable { static constexpr bool value = false; };
template<class T>
struct IsSpecPrintable<T, typename T::SpecialPrint> { static constexpr bool value = true; };
struct Class {
template <class T>
Class& operator<<(const T& text)
{
if constexpr (IsSpecPrintable<T>::value) {
specialPrint(text);
} else {
normalPrint(text);
}
return *this;
}
template<class Text>
void normalPrint(const Text& text) {
cout << text << endl;
}
template<uint8_t i>
void specialPrint(const Id<i>& text) {
cout << (int)i << endl;
}
};
int size;
scanf("%d", &size);
int *list = malloc(sizeof(int) * size);
for(int i = 0; i < size; i++)
scanf("%d", &list[i]);
list[size++] = n;
в какой-то момент приведёт к segfaul, потому что list, очевидно, фиксированного размера, а работа предполагается с массивом переменной длины. Почитайте про malloc/realloc
Я бы не стал устанавливать GoodbyeDPI на серьёзную машину, на которой множество конфиденциальных данных, особенно на рабочий компьютер/ноутбук с доступом в корпоративную сеть. Причин несколько:
Я не профессиональный программист вообще и на C в частности;
- Код использует UB и математику с указателями, потому что в C иначе не получается — куча пространства для ошибок;
- Программа не проходила аудита кода даже моими глазами;
- Драйвер WinDivert не проходил аудита кода и периодически вызывает несовместимости с другими драйверами с BSOD'ами (даже если ошибка не непосредственно в WinDivert).
- Программа была написана по приколу, чтобы потренироваться в фильтрации пакетов на Windows. Я не пользуюсь Windows чёртову дюжину лет. Иными словами, я очень нерегулярно сам использую GoodbyeDPI.
Что может произойти?
- В программе найдут уязвимость, связанную с обработкой данных в пакете, с переполнением буфера, с возможностью эксплуатации на стороне сервера ⇒ вам прогрузят код с привилегиями SYSTEM, украдут все данные и заразят компьютер.
- В драйвере WinDivert найдут аналогичную уязвимость ⇒ вам прогрузят код с привилегиями ядра, украдут все данные и заразят компьютер потенциально так, что антивирусы не обнаружат заражение.
Это всё применимо к совершенно любой программе в целом, но к GoodbyeDPI в этом плане стоит относиться особенно настороженно, т.к. и сама программа, и драйвер запущены с максимальными привилегиями, а код и того, и другого написан любителями.
До сих пор периодически пишут об ошибках запуска на необновленных Windows 7 c MS17-010, на таких системах потенциальные проблемы от GoodbyeDPI вообще не имеют никакого значения — вас куда быстрее проэксплуатируют через другой десяток уязвимостей :D
this.$set \ Vue.set
при добавлении нового ключа.const templates = reactive(keyBy(templatesArr, 'id'))
for (let templateId in templates) {
const devices = devicesArr.filter(device => device.templateId === templateId)
Vue.set(templates[templateId], 'devices', devices);
Vue.set(templates[templateId], 'settings', {});
}
// либо просто так:
const templates = keyBy(templatesArr, 'id');
for (let templateId in templates) {
const devices = devicesArr.filter(device => device.templateId === templateId)
Object.assign(templates[templateId], { devices }, {settings: {}})
}
reactive(templates);
reactive
, вместо него был Vue.observable
. Но может добавили, хз, лень смотреть.:) cofe = int(input('Сколько вы хотите кофе?: '))
flor = int(input('Введите на каком вы этаже:'))
if cofe in [1, 2, 3] and flor >= 100:
он оценивает первое условие как False и не переходит ко второму. Почему строка $arr[] = 'si$te.com'; определяется как доменное имя?
- $reg = '#[a-z0-9]+[_-]?[a-z0-9]+\.[a-z]{2,}#';
+ $reg = '#^(?:[a-z0-9][a-z0-9-_]*\.)+(?:[a-z]{2,}|xn--[a-z0-9]{4,})$#i';
interface CSS {
[k: string]: {
[k: string]: string | number
}
}
const css = {
default: {
color: '#676767',
border: '1px solid',
border_color: '#C4C4C4',
border_radius: '110px',
padding: '16px 21px',
}
} satisfies CSS;