Про статическую типизацию и безопасный доступ к памяти
На этой неделе просто праздник на моей улице:
На этой неделе просто праздник на моей улице:
https://mail.gnome.org/archives/gtk-devel-list/2019-February/msg00000.html
Так и остаёмся с Г написанном на Г.
На днях наткнулся на кадра: https://github.com/modulexcite
Repositories 11.2k, Stars 9.8k
Зачем? И таких много.
Интересуют не либы, а идиоматическое решение задачи вида:
Rust:
enum Data {
Number(u32),
String(String),
}
let mut items = Vec::new();
items.push(Data::Number(5));
items.push(Data::String("text".to_string()));
for item in items {
match item {
Data::Number(n) => println!("Number {}", n),
Data::String(ref s) => println!("String {}", s),
}
}
C++:
std::vector<std::variant<int, std::string>> items;
items.push_back(5);
items.push_back("text");
for (const auto &item : items) {
if (const auto n = std::get_if<int>(&item)) {
std::cout << "Number " << *n << std::endl;
} else if (const auto &s = std::get_if<std::string>(&item)) {
std::cout << "String " << *s << std::endl;
}
}
Как это повторить на python и go?
То есть нужно заполнить вектор/список/массив объектами разных типов (желательно с гарантиями) и затем пробежаться по ним, забирая значение каждого типа.
Решил запустить у себя тест из этой темы, но получил:
x265 [info]: HEVC encoder version 2.8
x265 [info]: build info [Linux][GCC 7.3.0][64 bit][noasm] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: none!
При этом на арче:
x265 [info]: HEVC encoder version 2.9
x265 [info]: build info [Linux][GCC 8.2.1][64 bit] 8bit+10bit+12bit
x265 [info]: using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX
Что не так?
У media-libs/x265
нет CPU-флагов. У media-video/ffmpeg
всё включено. Флага asm
не нашёл.
В /etc/portage/make.conf
CFLAGS="-march=ivybridge -O2 -s"
CPU_FLAGS_X86="aes avx f16c mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3"
Написал плагин для Dolphin, который использует resvg вместо QtSvg для отрисовки превьюшек.
На скрине:
Для сравнения превьюшки с QtSvg: https://imgur.com/a/B7xdSHL / https://pic4a.ru/inUe/
PS: Скрин в жыпег, ибо обоина очень «шумная». В PNG аж 10МБ. Сама обоина
>>> Просмотр (3840x2160, 2707 Kb)
resvg — это библиотека для отрисовки SVG, прямыми аналогами которой являются librsvg и QtSvg. Но в отличие от них, resvg поддерживает отрисовку с помощью нескольких бэкендов (Qt и cairo) и обеспечивает более полную поддержку стандарта. Также resvg является модульным, что позволяет использовать лишь нужные функции.
Основные изменения:
marker
.baseline-shift
, letter-spacing
и word-spacing
.Результаты тестирования. Сравнительная таблица. Список нереализованных возможностей.
Так как marker
был успешно реализован, до полной поддержки static SVG осталось реализовать textPath
, Unicode BIDI (left-to-right, top-to-bottom, glyph orientation и т.д.) и несколько фильтров.
>>> GitHub
Если я правильно распарсил, то сейчас mesa
нужна для dev-qt/qtgui
(+egl) и x11-base/xorg-server
(+glamor).
Если я правильно понял, то это жёсткие зависимости:
dev-qt/qtwayland-5.11.1 (media-libs/mesa[egl])
kde-frameworks/kwayland-5.52.0 (media-libs/mesa[egl])
kde-plasma/kwin-5.14.3-r1 (media-libs/mesa[egl,gbm,gles2?,wayland])
Можно её безболезненно выпилить?
PS: есть какой-то утилита, которая бы показывала зависимости нормально, а не как equery d
?
Собственно имеем https-сервер с self-signed certificate, который блокирует все не подписанные запросы посредством SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT
. Проблема в том, что я не могу подключится из Qt к такому серверу. Со стандартными настройками openssl достаточно указать путь к сертификату
QSslSocket::addDefaultCaCertificates("key.pem");
Находил несколько решений, но они не работают и выглядят монструозно. Подозреваю что упускаю из вида какую-то мелочь.
Кто-то сталкивался с таким?
PS: Через curl тоже не получается, так что подозреваю что какой-то косяк с ключами или настройками openssl.
resvg — это библиотека для отрисовки SVG, прямыми аналогами которой являются librsvg и QtSvg. Но в отличие от них, resvg поддерживает отрисовку с помощью нескольких бэкендов (Qt и cairo) и обеспечивает более полную поддержку стандарта. Также resvg является модульным, что позволяет использовать лишь нужные функции.
( читать дальше... )
>>> Подробности
~> eix -I vala
[U] dev-libs/vala-common
Available versions: 0.36.13 ~0.36.14 0.36.15
Installed versions: 0.36.13(01:35:53 PM 05/18/2018)
Homepage: https://wiki.gnome.org/Projects/Vala
Description: Build infrastructure for packages that use Vala
~> equery d vala-common
* These packages depend on vala-common:
gnome-base/librsvg-2.40.18 (dev-libs/vala-common)
~> equery u gnome-base/librsvg
[ Legend : U - final flag setting for installation]
[ : I - package is installed with flag ]
[ Colors : set, unset ]
* Found these USE flags for gnome-base/librsvg-2.40.18:
U I
- - introspection : Add support for GObject based introspection
- - tools : Build svg viewer tool
- - vala : Enable bindings for dev-lang/vala
Понадобился wine, а текущий профиль:
default/linux/amd64/17.0/no-multilib
Поменял на:
default/linux/amd64/17.0
и получаю:
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgcc
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/libgcc_s.so.1 when searching for libgcc_s.so.1
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find libgcc_s.so.1
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-linux-gnu/7.3.0/../../../../x86_64-pc-linux-gnu/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status
* Failed to compile the ABI test. Broken host glibc?
Ничего толкового нагуглить не удалось.
Обновил либы KDE (5.46 -> 5.50) и цветовая схема в Kate (называется KDE) превратилась в дикий ужас.
Это только у меня так и как откатить обратно?
Собственно использую https://github.com/mpark/variant в C++14, single header версию.
Очень неудобно, что фактически все методы - глобальные:
mpark::get_if<State1>(&m_state)
// vs
m_state.get_if<State1>()
Вопрос в том, как добавить в эту либу get_if (и holds_alternative) как методы класса? Только для типов. Взятие по индексу не нужно.
Там внутри такой адок, что я боюсь вообще что-либо трогать. Типа:
template <
typename Arg,
typename Decayed = lib::decay_t<Arg>,
lib::enable_if_t<!std::is_same<Decayed, variant>::value, int> = 0,
lib::enable_if_t<!detail::is_in_place_index<Decayed>::value, int> = 0,
lib::enable_if_t<!detail::is_in_place_type<Decayed>::value, int> = 0,
std::size_t I = detail::best_match<Arg, Ts...>::value,
typename T = lib::type_pack_element_t<I, Ts...>,
lib::enable_if_t<std::is_constructible<T, Arg>::value, int> = 0>
inline constexpr variant(Arg &&arg) noexcept(
std::is_nothrow_constructible<T, Arg>::value)
: impl_(in_place_index_t<I>{}, lib::forward<Arg>(arg)) {}
Или проще тупо враппер сделать? Но там тоже тонну шаблонов придётся писать - не осилю.
Игнор - это прекрасно, но почти тыща сообщений за месяц - это ппц. Засрал весь лор.
Не хочу указывать begin/end, а просто контейнер, но не пойму как реализовать враппер, так как max_element возвращает итератор.
const std::vector<int> numbers = { 1, 2, 3 };
// сейчас
std::max_element(numbers.begin(), numbers.end());
// хочу
std::max_element(numbers);
// Откуда взять Iter?
template <typename Iter, typename Container, typename Predicate>
Iter max_element(const Container &c, Predicate p)
{
return std::max_element(std::begin(c), std::end(c), p);
}
PS: предикат обязателен. В примере я его опустил.
Рабочий пример на расте:
struct Data {
number: usize,
letter: char,
}
impl Data {
fn new(number: usize, letter: char) -> Self {
Data { number, letter }
}
}
fn main() {
let numbers = vec![
Data::new(1, 'a'),
Data::new(2, 'b'),
Data::new(3, 'c'),
];
println!("{:?}", numbers.iter().max_by_key(|v| v.number).map(|v| v.letter)); // Some('c')
}
Как это повторить в C++14?
PS: с tuple пример был бы проще, но для C++ это слишком сложно.
Картинка для тех, кто не в теме.
Проблема Mysql Workbench в том, что это огромный комбайн на жабке, а значит не нужен.
Нужно:
Желательно:
Нагуглил всякие генераторы, в том числе и поверх graphviz, но они все убогие.
Есть ли какие-то решения или нужно пилить самому?
После переустановки генту получаю:
~> virtualbox
/bin/sh: /usr/bin/virtualbox: Permission denied
Что ему не нравится?
Попробовал поменять права - теперь ругается что поменял права...
В гентувики и гугле ничего толкового не нашел.
Сабж.
Для nano недавно добавили - стало удобнее. Хочу и для kate. Может кто-то уже делал? Ничего не нагуглилось.
← назад | следующие → |