Задать вопрос
  • Почему могут не подгружаться шрифты?

    @romaro Автор вопроса
    Вроде бы это когда мы объявляем шрифт для селектора. А у меня в самом правиле @font-face получилось, что объявлено не семейство Overpass Mono, а '"Overpass Mono", monospace'. То есть он наверное все, что до ; преобразовал в строку и посчитал это названием семейства.

    Затем, когда я сослался на Overpass Mono, браузер его просто не нашел, т.к. не было ссылок на загрузку шрифтов с таким семейством и применил второе по приоритету.
  • Почему Nginx не проксирует в Докере?

    @romaro Автор вопроса
    Со статикой вроде разобрался. Должно быть так:
    location /static/ {
      root /etc;
      autoindex off;
    }


    Видимо, отсутствие слеша в конце адреса указывало, что это не директория. Хотя в других моих локейшенах работало и без нее:
    # IMGProxy
    		# location /teaser {
    		# 	proxy_pass http://imgproxy:8080;
    		# }
  • Почему Nginx не проксирует в Докере?

    @romaro Автор вопроса
    Положил файл на хостовой машине:
    /home/romaro/gp/files/test.txt

    Создал диск (пробросил директории):
    - type: bind
            source: /home/romaro/gp/files
            target: /etc/static


    Настроил локейшн:
    location /static {
                root /etc;
            }


    Пробую получить доступ по адресу localhost/static/test.txt

    Тот же ответ 404:
    gp-nginx     | 10.0.2.2 - - [08/Jul/2022:07:50:34 +0000] "GET / HTTP/1.1" 404 146 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0"
    gp-nginx     | 10.0.2.2 - - [08/Jul/2022:07:50:41 +0000] "GET /static HTTP/1.1" 404 146 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0"
    gp-nginx     | 10.0.2.2 - - [08/Jul/2022:07:50:52 +0000] "GET /static/test.txt HTTP/1.1" 404 146 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0"


    Должно ведь работать?
  • Почему компилятор tsc не добавляет в импорты расширение .js?

    @romaro Автор вопроса
    HypeEditor, лень конечно) Я когда говорил про оверхед, имел в виду работу в рантайме, но если там уже транспилированный JS передается в ноду, по идее, не должно быть высоких накладных расходов.
  • Почему компилятор tsc не добавляет в импорты расширение .js?

    @romaro Автор вопроса
    Поправьте, если я не правильно вас понял :) ts-node это ведь среда исполнения тайпскрипта, то есть преобразование в JS-код происходит в рантайме. Вы предлагаете запускать сервер через прослойку в виде ts-node, т.е. вообще его не компилировать? Просто это должно привести к оверхеду. Или ts-node выполняет компиляцию всего проекта при запуске приложения и держат js-код в оперативной памяти? Как dev-server вебпака.
  • Почему компилятор tsc не добавляет в импорты расширение .js?

    @romaro Автор вопроса
    Дмитрий, я обновил tsc до версии 4.7 и вроде как там написано, что расширения он должен подставлять:
    This might feel a bit cumbersome at first, but TypeScript tooling like auto-imports and path completion will typically just do this for you.


    Но нет: https://github.com/oramor/tsc/blob/master/module-r...
  • Актуальна ли книга Макдональда по WPF 4.5?

    @romaro Автор вопроса
    А вы сами с этой книгой знакомы? Насколько она хороша в качестве фундамента по WPF или есть вариант получше? Понятно, что все детали лучше искать в справке, она у MS неплохая.
  • Почему PL/SQL не популярен?

    @romaro
    nevidimka110011, мой скромный совет: учите параллельно с Постгресом. Системы во многом похожи (если брать чистый сервер СУБД, без всей оракловой инфраструктуры), а разбираясь в отличиях лучше поймете внутреннее устройство. Те же уровни изоляции в документации (и замечательном учебном курсе PostgresPro на ютубе), по-моему, объясняются даже лучше, чем в "Оракл для профессионалов" Кайта.
  • Почему PL/SQL не популярен?

    @romaro
    nevidimka110011, для понимания порядка цен. В 2021 году больше 5 млн рублей за процессор + годовая техподдержка 62a4e5b44d631984412378.jpeg
  • Как называется такой паттерн обработки исключений?

    @romaro Автор вопроса
    Василий Банников, в C# исключением может быть только объект ошибки?
    Выглядит удобным, что JS допускает передать в catch-переменную "обычный" объект. Я так планирую обрабатывать инстансы класса Exception, которые создаются для "управляемых" ошибок, т.е. ошибок в рамках бизнес-логики (например, FormException, когда пользователь ввел некорректные данные и форма оказалась невалидной). Для них не нужно генерировать стек вызовов, поэтому наследование от Error кажется лишним.
  • Почему TS не видит геттеры?

    @romaro Автор вопроса
    Lynn «Кофеман», я немного переработал композицию и сделал через параметризацию абстрактного класса:

    abstract class AUri {}
    
    type ConstrUri = new() => AUri;
    
    class Uri extends AUri {
        get index() { return '/'}
    }
    
    abstract class AController<T> {
        public urls: T;
        constructor(c: T) {
            this.urls = c;
        }
    }
    
    class Controller extends AController<Uri> {
        constructor() {
            super(new Uri);
        }
    }
    
    const c = new Controller;
    console.log(c.urls.index);
  • Как типизировать сигнатуру фабрики, которая принимает базовые классы?

    @romaro Автор вопроса
    RAX7, благодарю! Если добавите в ответы, отмечу решением. Получилось так:
    abstract class PageServ {
        abstract templateName: string;
        abstract httpStatus: number;
        constructor() {
        }
    
        get template(): string {
            return this.templateName + '.html';
        }
    }
    
    const MainPageServ = class extends PageServ {
        public templateName: string;
        public httpStatus: number;
        constructor() {
            super();
            this.templateName = 'MainPage';
            this.httpStatus = 200;
        }
    }
    
    function fabric(Page: new () => PageServ) {
        const inst = new Page;
        console.log(inst.httpStatus);
    }
    
    fabric(MainPageServ);
  • Можно ли здесь отказаться от интерфейса?

    @romaro Автор вопроса
    Но здесь есть проблема: тайпскрипт не выдаст ошибки, если я забуду реализовать указанные поля в дочернем классе.


    Тут вроде разобрался: методы и поля, которые должны быть реализованы в дочерних классах, следует объявлять абстрактными:
    abstract class PageServ {
        abstract templateName: string;
        abstract httpStatus: number;
        constructor() {
        }
    
        get template(): string {
            return this.templateName + '.html';
        }
    }
  • Можно ли здесь отказаться от интерфейса?

    @romaro Автор вопроса
    Lynn «Кофеман», я создаю дочерние классы для хранения значений этих (и многих других) полей, которые относятся к объекту конкретной страницы. Мне кажется, что их объявление в абстрактном классе нарушает DRY, ведь я все равно получу доступ к этим полям при инстанцировании дочернего класса. Вообще, в данной архитектуре, абстрактный класс служит для реализации методов, а дочерние — для хранения состояний. Я уверен, что на этот счет есть паттерн ООН, но не могу его найти.

    Можно задекларировать поля в абстрактном классе и вроде бы это не даст возможности объявить их в дочернем без указания правильного типа:
    abstract class PageServ {
        declare public templateName: string;
        declare public httpStatus: number;
        constructor() {
        }
    
        get template(): string {
            return this.templateName + '.html';
        }
    }
    
    class MainPageServ extends PageServ{
        constructor() {
            super();
            this.templateName = 'MainPage';
            this.httpStatus = 200;
        }
    }
    
    const page = new MainPageServ;
    console.log(page.httpStatus);


    Но здесь есть проблема: тайпскрипт не выдаст ошибки, если я забуду реализовать указанные поля в дочернем классе.
  • Можно ли записать этот дженерик изящнее?

    @romaro Автор вопроса
    Alexandroppolus это невероятно остроумно и мне даже в голову не пришло, что выражение T[K] уже приводится к объектному типу! Если не затруднит, посмотрите, пожалуйста, другой мой вопрос: https://qna.habr.com/q/1162416
  • Windows Desktop это те же WinForms, только под .Net?

    @romaro Автор вопроса
    Борис Животное, доказать на примерах не могу, но, подозреваю, что платформа MAUI может просто не поддерживать какие-то методы, реализованные только для конкретной ОС. Ну, может быть, какой-то специфический контрол есть под винду (типа DataGridViewComboBoxColumn), а таблички на Андроиде этого не поддерживают через стандартное API. И тут вопрос, будут ли разработчики MAUI реализовывать этот контрол низкоуровневыми средствами. Как-то так мне это представляется. Опять же, с платформой только знакомлюсь, могу ошибаться.

    Впрочем, MAUI имеет мало общего с WinForms. Они оперируют более абстрактными элементами UI.
  • Windows Desktop это те же WinForms, только под .Net?

    @romaro Автор вопроса
    Борис Животное, мне кажется, что винформы — вот самый быстрый способ создания пользовательского GUI. Конечно, если не брать фреймворки, которые генерируют UI-формы по данным. Поправьте, если есть способ быстрее, который по числу контролов хотя бы не уступает вф...
  • Windows Desktop это те же WinForms, только под .Net?

    @romaro Автор вопроса
    Борис Животное, MAUI заточен на кросплатформенный UI. Условно, вам предоставляется класс кнопки, а MAUI уже определяет, какие системные API дергать для вызова этой кнопки на платформах Android, Windows или MacOS. То есть в духе джавовского принципа Write once, run anywhere (WORA) или React Native.

    Это ограничивает кастомизацию, но ускоряет разработку.
  • Windows Desktop это те же WinForms, только под .Net?

    @romaro Автор вопроса
    сергей кузьмин, ну суля по давности коммитов легаси живой...
  • Windows Desktop это те же WinForms, только под .Net?

    @romaro Автор вопроса
    Борис Животное, один и тот же неймспейс доступен по двум ссылкам.

    https://docs.microsoft.com/en-us/dotnet/api/system...
    https://docs.microsoft.com/en-us/dotnet/api/system...

    Как я понял, первые винформы заморожены, а вторые более-менее разрабатываются: https://github.com/dotnet/winforms