• Как заполнить оставшуюся ширину элементом ввода, но без обёртки?

    @makaleks Автор вопроса
    IvanU7n, Казалось, что flex не умеет в fit-content и фиксированные длины, по-настоящему 'гнущийся' (flex) интерфейс здесь был совсем не к месту
    Написано
  • Как заполнить оставшуюся ширину элементом ввода, но без обёртки?

    @makaleks Автор вопроса
    IvanU7n, Нет, просто нужна была фиксированная ширина для всего, кроме . Да, это поведение действительно табличное: всё пространство, но не больше доступного. float был попыткой, он не решает задачу. После комментария увидел, что flex поддерживает fit-content, и, насколько вижу, решает задачу, спасибо!
    Написано
  • Какие есть проекты по извлечению разметки из специальных комментариев?

    @makaleks Автор вопроса
    pfg21, пока не сотворить, а взять готовую префикс-(или ещё какую 'визуально-отделимо-')ориентированную разметку и препроцессор. На первый взгляд, это вопрос договорённости и regex
    Написано
  • Какие есть проекты по извлечению разметки из специальных комментариев?

    @makaleks Автор вопроса
    Алексей Уколов, у меня rust/c/c++, но кажется история не зависит от языка. Скажем, то, что в rustdoc можно примеры кода делать частью юнит-тестов - точно встречалось где-то ещё, просто не помню где. Это не история про работу с AST. От ЯП как бы требуется только поддержка однострочных комментариев, а поддержка ЯП со стороны тулзы вроде doxygen - уже чуть другое.
    Написано
  • Являются ли новые фичи libreoffice 'стандартными'?

    @makaleks Автор вопроса
    явно написано, какие фичи работают в OOXML, а какие в ODT

    Нет, вопрос не в разнице форматов msoffice и libreoffice, а в разнице oasis odt и libreoffice odt
    Что-то - как расширение стандарта odt.

    Не смог найти, где перечисляется, что libreoffice привносит в odt в качестве отсебятины. Где можно посмотреть?
    Написано
  • Какая обёртка позволяет разыменовывать без неопределённого поведения?

    @makaleks Автор вопроса
    Нет, это надо не забывать проверять, и многословно будет
    unique_ptr же существует по той же причине
    Просто обёртка над указателем или optional с проверкой на nullptr или noopt соответственно, неужели до сих пор этого нет?
  • Являются ли новые фичи libreoffice 'стандартными'?

    @makaleks Автор вопроса
    загнал бы перечисления под ссылку вместо квадратных скобок, но почему-то тостерqna сокращает текст и ставит многоточие, и тут я понял, что потерял описание форматирования: если есть под рукой, сбросьте тут же в комментах
  • Как выполнить сортировку слиянием списков несравнимых элементов?

    @makaleks Автор вопроса
    Всё так, всё понятно. Спасибо!

    Объяснение сортировки в своё время проще зашло хабровское, ни в коем случае не Вам в укор, лишь для тех, кто дойдёт до этого коммента в поисках
  • Как определить ближайших соседей прямоугольника с заданной стороны на поле с пропусками, без полного перебора?

    @makaleks Автор вопроса
    mayton2019, по-моему он несъедобен

    но вот

    pub type SinglePrecision = f32;
    pub type DoublePrecision = f64;
    
    #[derive(Debug, Clone, Copy)]
    pub struct Size2D {
        pub width:  SinglePrecision,
        pub height: SinglePrecision,
    }
    // coordinates are assumed to start from top-left corner
    #[derive(Debug, Clone, Copy)]
    pub struct Position2D {
        pub top:  SinglePrecision,
        pub left: SinglePrecision,
    }
    #[derive(Debug, Clone, Copy)]
    struct Segment2D {
        // {y2,x2} >= {y1,x1}
        p1: Position2D,
        p2: Position2D,
    }
    impl Segment2D {
        fn new (p1: Position2D, p2: Position2D) -> Self {
            let mut array = [p1, p2];
            array.sort_by(
                |p1, p2|
                p1.top.partial_cmp(&p2.top).unwrap()
                    .then(p1.left.partial_cmp(&p2.left).unwrap())
                );
            Self {p1: array[0], p2: array[1]}
        }
    }
    #[derive(Debug, Clone, Copy)]
    pub struct BoundingRect2D {
        pub size:     Size2D,
        pub position: Position2D,
    }
    impl BoundingRect2D {
        fn from_size_at_0 (size: Size2D) -> Self {
            Self {size, position: Position2D {top: 0., left: 0.}}
        }
        fn height (&self) -> SinglePrecision {
            self.size.height
        }
        fn left (&self) -> SinglePrecision {
            self.position.left
        }
        fn right (&self) -> SinglePrecision {
            self.position.left + self.size.width
        }
        fn top (&self) -> SinglePrecision {
            self.position.top
        }
        fn bottom (&self) -> SinglePrecision {
            self.position.top + self.size.height
        }
        fn left_top (&self) -> Position2D {
            Position2D{top: self.top(), left: self.left()}
        }
        fn right_top (&self) -> Position2D {
            Position2D{top: self.top(), left: self.right()}
        }
        fn left_bottom (&self) -> Position2D {
            Position2D{top: self.bottom(), left: self.left()}
        }
        fn right_bottom (&self) -> Position2D {
            Position2D{top: self.bottom(), left: self.right()}
        }
        fn does_x_intersect_with (&self, left: SinglePrecision, right: SinglePrecision) -> bool {
            // !((a.max < b.min) || (b.max < a.min))
            !((right <= self.left()) || (self.right() <= left))
        }
    }
    
    trait MyAverage1
    {
        type Output;
        fn my_average (self) -> Self::Output;
    }
    trait MyAverage2
    {
        type Output;
        fn my_average (self) -> Self::Output;
    }
    impl<T> MyAverage1 for T
    where T: Iterator<Item=SinglePrecision>
    {
        type Output = DoublePrecision;
        fn my_average (self) -> Self::Output {
            let (mut total, mut count) = (DoublePrecision::from(0u8), DoublePrecision::from(0u8));
            for v in self {
                total += DoublePrecision::from(v);
                count += DoublePrecision::from(1u8);
            }
            total / count
        }
    }
    impl<T> MyAverage2 for T
    where T: Iterator<Item=(SinglePrecision, SinglePrecision)>
    {
        type Output = (DoublePrecision, DoublePrecision);
        fn my_average (self) -> Self::Output {
            let (mut total, mut count) = ((DoublePrecision::from(0u8), DoublePrecision::from(0u8)), DoublePrecision::from(0u8));
            for v in self {
                total.0 += DoublePrecision::from(v.0);
                total.1 += DoublePrecision::from(v.1);
                count += DoublePrecision::from(1u8);
            }
            (total.0 / count, total.1 / count)
        }
    }
    
    fn gen_initial_size_for_undefined<It: Iterator<Item=Option<Size2D>>> (sizes_opt_it: It, minimal_rect_size: Size2D) -> Size2D
    {
        let (avg_width, avg_height)
            = sizes_opt_it
              .filter_map(
                  |size_opt|
                   size_opt.map(|size| (size.width, size.height))
                  )
              .my_average();
        let middle_or
            = |middle: DoublePrecision, minimal: SinglePrecision|
              if middle < minimal.into() {minimal} else {middle as SinglePrecision};
        Size2D {
            width:  middle_or(avg_width, minimal_rect_size.width),
            height: middle_or(avg_height, minimal_rect_size.height),
        }
    }
    
    fn get_min_and_premin_for<T: PartialOrd + Copy, It: Iterator<Item=T>> (mut it: It) -> Option<((usize, T), Option<(usize, T)>)> {
        let mut min_idx_and_value = match it.next() {
                                        None    => return None,
                                        Some(v) => (0, v),
                                    };
        let mut pre_min_idx_and_value = None;
    
        let mut it = it.enumerate().map(|(idx, v)| (1 + idx, v));
        while let Some((i, v)) =  it.next() {
            if v < min_idx_and_value.1 {
                pre_min_idx_and_value = Some(min_idx_and_value);
                min_idx_and_value = (i, v);
            }
        }
    
        Some((min_idx_and_value, pre_min_idx_and_value))
    }
    
    struct Step {
        value:         DoublePrecision,
        sourse:        *const InteractableBoundingRect2D,
        relative_size: SinglePrecision,
    }
    
    struct InteractableBoundingRect2D {
        bounding_rect: BoundingRect2D,
        top_steps:     Vec<Step>,
        bottom_steps:  Vec<Step>,
        left_steps:    Vec<Step>,
        right_steps:   Vec<Step>,
    }
    
    fn make_bounding_rects_interactable (rects: Vec<BoundingRect2D>) -> Vec<InteractableBoundingRect2D> {
        rects.into_iter().map(
            |bounding_rect|
            InteractableBoundingRect2D {
                bounding_rect,
                top_steps: Vec::new(),
                bottom_steps: Vec::new(),
                left_steps: Vec::new(),
                right_steps: Vec::new()
                }
            ).collect()
    }
    
    #[derive(Debug, Clone, Copy)]
    enum Direction {
        Top,
        Bottom,
        Left,
        Right,
    }
    impl Direction {
        fn into_reverse (self) -> Self {
            match self {
                Self::Top    => Self::Bottom,
                Self::Bottom => Self::Top,
                Self::Left   => Self::Right,
                Self::Right  => Self::Left,
            }
        }
    }
    #[derive(Debug, Clone, Copy, Default)]
    struct Segment1D {
        // p2 >= p1
        p1: SinglePrecision,
        p2: SinglePrecision,
    }
    impl Segment1D {
        fn new (p1: SinglePrecision, p2: SinglePrecision) -> Self {
            let mut array = [p1, p2];
            array.sort_by(|p1, p2| p1.partial_cmp(p2).unwrap());
            Self {p1: array[0], p2: array[1]}
        }
        fn from_bounding_rect_side (br: BoundingRect2D, direction: Direction) -> Self {
            match direction {
                Direction::Top | Direction::Bottom => Self {p1: br.left(), p2: br.right()},
                Direction::Left | Direction::Right => Self {p1: br.top(), p2: br.bottom()},
            }
        }
        fn from_bounding_rect_side_reverse (br: BoundingRect2D, direction: Direction) -> Self {
            Self::from_bounding_rect_side(br, direction.into_reverse())
        }
        fn does_intersect_with (&self, other: Self) -> bool {
            // !((a.max < b.min) || (b.max < a.min))
            !((self.p2 <= other.p1) || (other.p2 <= self.p1))
        }
    }
    
    struct Segment1DSideCollection {
        from:              SinglePrecision,
        to:                SinglePrecision,
        used_rect_idx_acc: Vec<(usize, Segment1D)>,
        direction:         Direction,
    }
    impl Segment1DSideCollection {
        fn new_empty () -> Self {
            Self {from: 0., to: 0., used_rect_idx_acc: Vec::new(), direction: Direction::Top}
        }
        fn reset (&mut self, from: SinglePrecision, to: SinglePrecision, direction: Direction) {
            self.used_rect_idx_acc.clear();
            (self.from, self.to, self.direction) = (from, to, direction);
        }
        fn get_new_part_opt (&self, next_segment: Segment1D) -> Option<Segment1D> {
            self.used_rect_idx_acc.iter().position(|(_, existing)| existing.does_intersect_with(next_segment)).is_some()
        }
        fn try_next_down<It: Iterator<Item=(usize, Segment1D)>> (&mut self, it: It) -> Option<It> {
            while let Some((usize, segment)) = it.next() {
            }
            None
        }
    
        fn try_next<Map: Fn(&BoundingRect2D)->SinglePrecision, Filter: Fn(&BoundingRect2D,&Self)->bool> (&mut self, for_segment: Segment2D, next_i: usize, rects: &Vec<InteractableBoundingRect2D>) -> Option<usize> {
        }
        fn is_next_reasonable (&mut self, next_i: usize, rects: &mut Vec<InteractableBoundingRect2D>, direction: Direction) {
        }
        fn get_rects_new (&mut self, from_idx: usize, rects: &mut Vec<InteractableBoundingRect2D>, direction: Direction) -> Vec<&mut InteractableBoundingRect2D> {
            self.reinit(rects[from_idx].bounding_rect, direction);
            let mut result = Vec::new();
            result
        }
        fn get_rects_left (&mut self, from_idx: usize, rects: &mut Vec<InteractableBoundingRect2D>) -> Vec<&mut InteractableBoundingRect2D> {
            self.get_rects_new(from_idx, rects, Direction::Top)
        }
    }
    
    fn get_rects_left (from_idx: usize, rects: &mut Vec<InteractableBoundingRect2D>) -> Vec<&mut InteractableBoundingRect2D> {
    }
    fn get_rects_right (from_idx: usize, rects: &mut Vec<InteractableBoundingRect2D>) -> Vec<&mut InteractableBoundingRect2D> {
    }
    fn get_rects_top (from_idx: usize, rects: &mut Vec<InteractableBoundingRect2D>) -> Vec<&mut InteractableBoundingRect2D> {
    }
    fn get_rects_bottom (from_idx: usize, rects: &mut Vec<InteractableBoundingRect2D>) -> Vec<&mut InteractableBoundingRect2D> {
    }


    что-то не хочет подсвечивать явно указанный язык
  • Как средствами CSS обеспечить замощение, задавая лишь высоту и ширину элементов, без привязки к layout?

    @makaleks Автор вопроса
    Ankhena, в случае dense надо обеспечить дискретный grid-template, а masonry то ли располагает лишь вертикально, то ли присваивает элементам абсолютные координаты, верно? Дикретную сетку с мелким шагом я рассматривал, пока кажется неоправданным адаптировать grid-template под каждую пропорцию экрана из-за того, что иначе вертикльный шаг не будет равен горизонтальному
  • Какой есть оптимальный алгоритм загрузки ассоциированного файла?

    @makaleks Автор вопроса
    Антон Шаманов, а ещё прерывание сервера входит в хотелку №2 оригинальной постановки
  • Какой есть оптимальный алгоритм загрузки ассоциированного файла?

    @makaleks Автор вопроса
    Антон Шаманов, на то он и домашний, что прорабатывается, а не
    просто-сделай-в-срок-что-хочет-пм
    613073e1ae4c8724602407.jpeg
  • Какой есть оптимальный алгоритм загрузки ассоциированного файла?

    @makaleks Автор вопроса
    Спасибо за вариант. Я пока надеюсь устроить транзакционность на месте, без нагрузки "потом", без других агентов
  • Какой есть оптимальный алгоритм загрузки ассоциированного файла?

    @makaleks Автор вопроса
    Ресурс, как я понимаю, грузится долго, текст быстро. Если прервать работу сервера (это далеко не 24x7 история), останутся мусорные ресурсы. А открывать и парсить каждый файл текста (или каждый список, а ведь согласованность этого списка тоже могла поломаться) плюс проверять каждый ресурс я очень не хочу
  • Как изменять область видимости символов в CMake или Visual Studio?

    @makaleks Автор вопроса
    Но ведь можно стандартную библиотеку слинковать статически, то есть всё-таки уложиться в один бинарник, нет? Идея ведь в минимуме необходимого на выходе сборки.
    Спасибо за предложение. Но в случае DLL разве нужно заботиться об уникальности, если можно использовать LoadLibrary/dlopen? Подгрузка в рантайме позволяет переключаться на только что размещённый плагин без перезапуска программы.
  • Какая библиотека для работы с xlsx действительно поддерживает 'перенос по словам'?

    @makaleks Автор вопроса
    Да, у меня именно задача предварительного наполнения xlsx-файла из базы данных. Форматирование нужно, потому что это тоже однообразный процесс, который следует автоматизировать. Дело не в том, что нужной фичи нет - доки заявляют о поддержке, а xslxwriter даже скриншот нужного результата имеет. Вопрос, в каком пакете данная фича де-юре соответствует де-факто и с чем связано настолько сильное несоответствие выходных файлов.
  • Как в Windows определить, чем занято дисковое пространство?

    @makaleks Автор вопроса
    Сергей, Ага, только у меня однажды при такой вот переустановке активация windows слетела. Тогда я и перешёл окончательно на linux
  • Как в Windows определить, чем занято дисковое пространство?

    @makaleks Автор вопроса
    Ноут использовался 'как есть' с момента приобретения - из под администратора
  • Как в Windows определить, чем занято дисковое пространство?

    @makaleks Автор вопроса
    Moskus, я намеренно в вопросе ни слова не говорил о заразе. А ещё я упомянул, что обновления отключены.